From 2644d1ee18168195dcb3cc80cc13ba9b9630ea76 Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Thu, 5 Dec 2013 18:05:13 +0100 Subject: [PATCH] =?UTF-8?q?imported=20L=C3=B6ve=20GLES=20branch=20(changes?= =?UTF-8?q?et=201ba9037e558b)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jni/love/CMakeLists.txt | 1203 ++ jni/love/changes.txt | 673 + jni/love/extra/nsis/game.ico | Bin 0 -> 33093 bytes jni/love/extra/nsis/left.bmp | Bin 0 -> 154544 bytes jni/love/extra/nsis/love.ico | Bin 0 -> 35492 bytes jni/love/extra/nsis/love.nsi | 120 + jni/love/extra/nsis/top.bmp | Bin 0 -> 25364 bytes jni/love/extra/reshax/res/knoll1.png | Bin 0 -> 3416 bytes jni/love/extra/reshax/res/planet.png | Bin 0 -> 7711 bytes jni/love/extra/reshax/res/star1.png | Bin 0 -> 385 bytes jni/love/extra/resources/Vera.ttf | Bin 0 -> 65932 bytes jni/love/extra/resources/b64.lua | 12 + jni/love/extra/resources/heart.png | Bin 0 -> 1537 bytes jni/love/extra/resources/pig.png | Bin 0 -> 7144 bytes jni/love/license.txt | 879 ++ jni/love/platform/macosx/Info-Framework.plist | 28 + jni/love/platform/macosx/OSX.h | 47 + jni/love/platform/macosx/OSX.mm | 75 + jni/love/platform/macosx/dmg/DS_Store | Bin 0 -> 15364 bytes jni/love/platform/macosx/dmg/VolumeIcon.icns | Bin 0 -> 39493 bytes .../platform/macosx/dmg/backgroundImage.tiff | Bin 0 -> 565288 bytes jni/love/platform/macosx/icons/Love.icns | Bin 0 -> 174816 bytes .../platform/macosx/icons/LoveDocument.icns | Bin 0 -> 133318 bytes jni/love/platform/macosx/love-Info.plist | 87 + .../love-framework.xcodeproj/project.pbxproj | 2493 ++++ .../macosx/love.xcodeproj/TemplateIcon.icns | Bin 0 -> 52318 bytes .../macosx/love.xcodeproj/default.pbxuser | 1052 ++ .../macosx/love.xcodeproj/project.pbxproj | 427 + jni/love/platform/msvc2010/liblove.vcxproj | 847 ++ .../platform/msvc2010/liblove.vcxproj.filters | 1796 +++ jni/love/platform/msvc2010/love.ico | Bin 0 -> 35492 bytes jni/love/platform/msvc2010/love.rc | Bin 0 -> 3468 bytes jni/love/platform/msvc2010/love.sln | 47 + jni/love/platform/msvc2010/love.vcxproj | 273 + .../platform/msvc2010/love.vcxproj.filters | 9 + jni/love/platform/unix/Makefile.am | 24 + .../platform/unix/application-x-love-game.svg | 1024 ++ jni/love/platform/unix/automagic | 64 + jni/love/platform/unix/configure.ac | 104 + jni/love/platform/unix/debian/changelog | 5 + jni/love/platform/unix/debian/compat | 1 + jni/love/platform/unix/debian/control | 58 + jni/love/platform/unix/debian/copyright | 20 + jni/love/platform/unix/debian/docs | 2 + jni/love/platform/unix/debian/liblove.install | 1 + jni/love/platform/unix/debian/love.install | 1 + jni/love/platform/unix/debian/love.manpages | 1 + jni/love/platform/unix/debian/rules | 16 + jni/love/platform/unix/debian/source/format | 1 + jni/love/platform/unix/exclude | 5 + jni/love/platform/unix/gen-makefile | 48 + jni/love/platform/unix/love.1 | 26 + jni/love/platform/unix/love.desktop.in | 10 + jni/love/platform/unix/love.svg | 1030 ++ jni/love/platform/unix/love.xml | 7 + jni/love/platform/unix/postinst | 5 + jni/love/platform/unix/postrm | 4 + jni/love/readme.md | 70 + jni/love/src/common/Data.h | 58 + jni/love/src/common/EnumMap.h | 100 + jni/love/src/common/Exception.cpp | 63 + jni/love/src/common/Exception.h | 67 + jni/love/src/common/Matrix.cpp | 212 + jni/love/src/common/Matrix.h | 173 + jni/love/src/common/Memoizer.cpp | 45 + jni/love/src/common/Memoizer.h | 46 + jni/love/src/common/Module.cpp | 124 + jni/love/src/common/Module.h | 79 + jni/love/src/common/Object.cpp | 52 + jni/love/src/common/Object.h | 102 + jni/love/src/common/Reference.cpp | 84 + jni/love/src/common/Reference.h | 88 + jni/love/src/common/StringMap.h | 168 + jni/love/src/common/Variant.cpp | 255 + jni/love/src/common/Variant.h | 83 + jni/love/src/common/Vector.cpp | 26 + jni/love/src/common/Vector.h | 325 + jni/love/src/common/b64.cpp | 80 + jni/love/src/common/b64.h | 41 + jni/love/src/common/config.h | 91 + jni/love/src/common/delay.cpp | 33 + jni/love/src/common/delay.h | 31 + jni/love/src/common/int.h | 65 + jni/love/src/common/math.h | 94 + jni/love/src/common/runtime.cpp | 757 ++ jni/love/src/common/runtime.h | 494 + jni/love/src/common/types.h | 202 + jni/love/src/common/utf8.cpp | 61 + jni/love/src/common/utf8.h | 48 + jni/love/src/common/version.h | 37 + jni/love/src/common/wrap_Data.cpp | 66 + jni/love/src/common/wrap_Data.h | 39 + jni/love/src/libraries/Box2D/Box2D.h | 68 + .../Box2D/Collision/Shapes/b2ChainShape.cpp | 190 + .../Box2D/Collision/Shapes/b2ChainShape.h | 102 + .../Box2D/Collision/Shapes/b2CircleShape.cpp | 99 + .../Box2D/Collision/Shapes/b2CircleShape.h | 91 + .../Box2D/Collision/Shapes/b2EdgeShape.cpp | 138 + .../Box2D/Collision/Shapes/b2EdgeShape.h | 74 + .../Box2D/Collision/Shapes/b2PolygonShape.cpp | 459 + .../Box2D/Collision/Shapes/b2PolygonShape.h | 101 + .../Box2D/Collision/Shapes/b2Shape.h | 101 + .../Box2D/Collision/b2BroadPhase.cpp | 120 + .../libraries/Box2D/Collision/b2BroadPhase.h | 257 + .../Box2D/Collision/b2CollideCircle.cpp | 154 + .../Box2D/Collision/b2CollideEdge.cpp | 698 + .../Box2D/Collision/b2CollidePolygon.cpp | 239 + .../libraries/Box2D/Collision/b2Collision.cpp | 252 + .../libraries/Box2D/Collision/b2Collision.h | 277 + .../libraries/Box2D/Collision/b2Distance.cpp | 603 + .../libraries/Box2D/Collision/b2Distance.h | 141 + .../Box2D/Collision/b2DynamicTree.cpp | 778 ++ .../libraries/Box2D/Collision/b2DynamicTree.h | 289 + .../Box2D/Collision/b2TimeOfImpact.cpp | 486 + .../Box2D/Collision/b2TimeOfImpact.h | 58 + .../Box2D/Common/b2BlockAllocator.cpp | 215 + .../libraries/Box2D/Common/b2BlockAllocator.h | 62 + .../src/libraries/Box2D/Common/b2Draw.cpp | 44 + jni/love/src/libraries/Box2D/Common/b2Draw.h | 86 + .../libraries/Box2D/Common/b2GrowableStack.h | 85 + .../src/libraries/Box2D/Common/b2Math.cpp | 94 + jni/love/src/libraries/Box2D/Common/b2Math.h | 721 + .../src/libraries/Box2D/Common/b2Settings.cpp | 52 + .../src/libraries/Box2D/Common/b2Settings.h | 154 + .../Box2D/Common/b2StackAllocator.cpp | 83 + .../libraries/Box2D/Common/b2StackAllocator.h | 60 + .../src/libraries/Box2D/Common/b2Timer.cpp | 101 + jni/love/src/libraries/Box2D/Common/b2Timer.h | 50 + .../Contacts/b2ChainAndCircleContact.cpp | 53 + .../Contacts/b2ChainAndCircleContact.h | 39 + .../Contacts/b2ChainAndPolygonContact.cpp | 53 + .../Contacts/b2ChainAndPolygonContact.h | 39 + .../Dynamics/Contacts/b2CircleContact.cpp | 52 + .../Box2D/Dynamics/Contacts/b2CircleContact.h | 39 + .../Box2D/Dynamics/Contacts/b2Contact.cpp | 247 + .../Box2D/Dynamics/Contacts/b2Contact.h | 349 + .../Dynamics/Contacts/b2ContactSolver.cpp | 833 ++ .../Box2D/Dynamics/Contacts/b2ContactSolver.h | 95 + .../Contacts/b2EdgeAndCircleContact.cpp | 49 + .../Contacts/b2EdgeAndCircleContact.h | 39 + .../Contacts/b2EdgeAndPolygonContact.cpp | 49 + .../Contacts/b2EdgeAndPolygonContact.h | 39 + .../Contacts/b2PolygonAndCircleContact.cpp | 49 + .../Contacts/b2PolygonAndCircleContact.h | 38 + .../Dynamics/Contacts/b2PolygonContact.cpp | 52 + .../Dynamics/Contacts/b2PolygonContact.h | 39 + .../Box2D/Dynamics/Joints/b2DistanceJoint.cpp | 260 + .../Box2D/Dynamics/Joints/b2DistanceJoint.h | 169 + .../Box2D/Dynamics/Joints/b2FrictionJoint.cpp | 251 + .../Box2D/Dynamics/Joints/b2FrictionJoint.h | 119 + .../Box2D/Dynamics/Joints/b2GearJoint.cpp | 419 + .../Box2D/Dynamics/Joints/b2GearJoint.h | 125 + .../Box2D/Dynamics/Joints/b2Joint.cpp | 211 + .../libraries/Box2D/Dynamics/Joints/b2Joint.h | 226 + .../Box2D/Dynamics/Joints/b2MotorJoint.cpp | 304 + .../Box2D/Dynamics/Joints/b2MotorJoint.h | 133 + .../Box2D/Dynamics/Joints/b2MouseJoint.cpp | 222 + .../Box2D/Dynamics/Joints/b2MouseJoint.h | 129 + .../Dynamics/Joints/b2PrismaticJoint.cpp | 626 + .../Box2D/Dynamics/Joints/b2PrismaticJoint.h | 196 + .../Box2D/Dynamics/Joints/b2PulleyJoint.cpp | 348 + .../Box2D/Dynamics/Joints/b2PulleyJoint.h | 152 + .../Box2D/Dynamics/Joints/b2RevoluteJoint.cpp | 502 + .../Box2D/Dynamics/Joints/b2RevoluteJoint.h | 204 + .../Box2D/Dynamics/Joints/b2RopeJoint.cpp | 241 + .../Box2D/Dynamics/Joints/b2RopeJoint.h | 114 + .../Box2D/Dynamics/Joints/b2WeldJoint.cpp | 328 + .../Box2D/Dynamics/Joints/b2WeldJoint.h | 126 + .../Box2D/Dynamics/Joints/b2WheelJoint.cpp | 419 + .../Box2D/Dynamics/Joints/b2WheelJoint.h | 211 + .../src/libraries/Box2D/Dynamics/b2Body.cpp | 549 + .../src/libraries/Box2D/Dynamics/b2Body.h | 860 ++ .../Box2D/Dynamics/b2ContactManager.cpp | 296 + .../Box2D/Dynamics/b2ContactManager.h | 52 + .../libraries/Box2D/Dynamics/b2Fixture.cpp | 303 + .../src/libraries/Box2D/Dynamics/b2Fixture.h | 345 + .../src/libraries/Box2D/Dynamics/b2Island.cpp | 539 + .../src/libraries/Box2D/Dynamics/b2Island.h | 93 + .../src/libraries/Box2D/Dynamics/b2TimeStep.h | 70 + .../src/libraries/Box2D/Dynamics/b2World.cpp | 1339 ++ .../src/libraries/Box2D/Dynamics/b2World.h | 354 + .../Box2D/Dynamics/b2WorldCallbacks.cpp | 36 + .../Box2D/Dynamics/b2WorldCallbacks.h | 155 + jni/love/src/libraries/Box2D/README.MODIFIED | 1 + jni/love/src/libraries/Box2D/Rope/b2Rope.cpp | 259 + jni/love/src/libraries/Box2D/Rope/b2Rope.h | 115 + jni/love/src/libraries/Wuff/wuff.c | 203 + jni/love/src/libraries/Wuff/wuff.h | 274 + jni/love/src/libraries/Wuff/wuff_config.h | 50 + jni/love/src/libraries/Wuff/wuff_convert.c | 827 ++ jni/love/src/libraries/Wuff/wuff_convert.h | 48 + jni/love/src/libraries/Wuff/wuff_internal.c | 540 + jni/love/src/libraries/Wuff/wuff_internal.h | 171 + jni/love/src/libraries/Wuff/wuff_memory.c | 17 + jni/love/src/libraries/ddsparse/ddsinfo.h | 235 + jni/love/src/libraries/ddsparse/ddsparse.cpp | 356 + jni/love/src/libraries/ddsparse/ddsparse.h | 137 + jni/love/src/libraries/enet/enet.cpp | 756 ++ jni/love/src/libraries/enet/libenet/ChangeLog | 159 + jni/love/src/libraries/enet/libenet/LICENSE | 7 + jni/love/src/libraries/enet/libenet/README | 15 + .../src/libraries/enet/libenet/callbacks.c | 53 + .../src/libraries/enet/libenet/compress.c | 654 + jni/love/src/libraries/enet/libenet/host.c | 490 + .../enet/libenet/include/enet/callbacks.h | 27 + .../enet/libenet/include/enet/enet.h | 587 + .../enet/libenet/include/enet/list.h | 43 + .../enet/libenet/include/enet/protocol.h | 199 + .../enet/libenet/include/enet/time.h | 18 + .../enet/libenet/include/enet/types.h | 13 + .../enet/libenet/include/enet/unix.h | 47 + .../enet/libenet/include/enet/utility.h | 12 + .../enet/libenet/include/enet/win32.h | 58 + jni/love/src/libraries/enet/libenet/list.c | 75 + jni/love/src/libraries/enet/libenet/packet.c | 165 + jni/love/src/libraries/enet/libenet/peer.c | 989 ++ .../src/libraries/enet/libenet/protocol.c | 1925 +++ jni/love/src/libraries/enet/libenet/unix.c | 548 + jni/love/src/libraries/enet/libenet/win32.c | 410 + jni/love/src/libraries/enet/lua-enet.h | 26 + jni/love/src/libraries/glad/glad.cpp | 8153 +++++++++++ jni/love/src/libraries/glad/glad.hpp | 11142 ++++++++++++++++ jni/love/src/libraries/glad/gladfuncs.hpp | 2986 +++++ .../luasocket/libluasocket/auxiliar.c | 149 + .../luasocket/libluasocket/auxiliar.h | 48 + .../libraries/luasocket/libluasocket/buffer.c | 268 + .../libraries/luasocket/libluasocket/buffer.h | 47 + .../libraries/luasocket/libluasocket/except.c | 99 + .../libraries/luasocket/libluasocket/except.h | 35 + .../libraries/luasocket/libluasocket/ftp.lua | 281 + .../luasocket/libluasocket/ftp.lua.h | 468 + .../libraries/luasocket/libluasocket/http.lua | 350 + .../luasocket/libluasocket/http.lua.h | 621 + .../libraries/luasocket/libluasocket/inet.c | 281 + .../libraries/luasocket/libluasocket/inet.h | 42 + .../src/libraries/luasocket/libluasocket/io.c | 32 + .../src/libraries/luasocket/libluasocket/io.h | 67 + .../luasocket/libluasocket/ltn12.lua | 292 + .../luasocket/libluasocket/ltn12.lua.h | 420 + .../libraries/luasocket/libluasocket/lua.h | 12 + .../luasocket/libluasocket/luasocket.c | 118 + .../luasocket/libluasocket/luasocket.h | 32 + .../libraries/luasocket/libluasocket/mime.c | 711 + .../libraries/luasocket/libluasocket/mime.h | 31 + .../libraries/luasocket/libluasocket/mime.lua | 87 + .../luasocket/libluasocket/mime.lua.h | 133 + .../luasocket/libluasocket/options.c | 149 + .../luasocket/libluasocket/options.h | 39 + .../libraries/luasocket/libluasocket/pre.lua | 1 + .../libraries/luasocket/libluasocket/select.c | 200 + .../libraries/luasocket/libluasocket/select.h | 17 + .../libraries/luasocket/libluasocket/smtp.lua | 251 + .../luasocket/libluasocket/smtp.lua.h | 410 + .../libraries/luasocket/libluasocket/socket.h | 76 + .../luasocket/libluasocket/socket.lua | 133 + .../luasocket/libluasocket/socket.lua.h | 215 + .../libraries/luasocket/libluasocket/tcp.c | 339 + .../libraries/luasocket/libluasocket/tcp.h | 36 + .../luasocket/libluasocket/timeout.c | 207 + .../luasocket/libluasocket/timeout.h | 30 + .../libraries/luasocket/libluasocket/tp.lua | 123 + .../libraries/luasocket/libluasocket/tp.lua.h | 192 + .../libraries/luasocket/libluasocket/udp.c | 336 + .../libraries/luasocket/libluasocket/udp.h | 33 + .../libraries/luasocket/libluasocket/unix.c | 356 + .../libraries/luasocket/libluasocket/unix.h | 28 + .../libraries/luasocket/libluasocket/url.lua | 297 + .../luasocket/libluasocket/url.lua.h | 538 + .../luasocket/libluasocket/usocket.c | 370 + .../luasocket/libluasocket/usocket.h | 40 + .../luasocket/libluasocket/wsocket.c | 401 + .../luasocket/libluasocket/wsocket.h | 21 + .../src/libraries/luasocket/luasocket.cpp | 121 + jni/love/src/libraries/luasocket/luasocket.h | 49 + .../libraries/noise1234/simplexnoise1234.cpp | 470 + .../libraries/noise1234/simplexnoise1234.h | 60 + jni/love/src/libraries/utf8/utf8.h | 34 + jni/love/src/libraries/utf8/utf8/checked.h | 327 + jni/love/src/libraries/utf8/utf8/core.h | 329 + jni/love/src/libraries/utf8/utf8/unchecked.h | 228 + jni/love/src/love.cpp | 230 + jni/love/src/modules/audio/Audio.cpp | 52 + jni/love/src/modules/audio/Audio.h | 239 + jni/love/src/modules/audio/Source.cpp | 74 + jni/love/src/modules/audio/Source.h | 127 + jni/love/src/modules/audio/null/Audio.cpp | 169 + jni/love/src/modules/audio/null/Audio.h | 89 + jni/love/src/modules/audio/null/Source.cpp | 234 + jni/love/src/modules/audio/null/Source.h | 103 + jni/love/src/modules/audio/openal/Audio.cpp | 328 + jni/love/src/modules/audio/openal/Audio.h | 142 + jni/love/src/modules/audio/openal/Pool.cpp | 293 + jni/love/src/modules/audio/openal/Pool.h | 124 + jni/love/src/modules/audio/openal/Source.cpp | 766 ++ jni/love/src/modules/audio/openal/Source.h | 171 + jni/love/src/modules/audio/wrap_Audio.cpp | 351 + jni/love/src/modules/audio/wrap_Audio.h | 61 + jni/love/src/modules/audio/wrap_Source.cpp | 385 + jni/love/src/modules/audio/wrap_Source.h | 72 + jni/love/src/modules/event/Event.cpp | 122 + jni/love/src/modules/event/Event.h | 76 + jni/love/src/modules/event/sdl/Event.cpp | 639 + jni/love/src/modules/event/sdl/Event.h | 89 + jni/love/src/modules/event/sdl/wrap_Event.cpp | 143 + jni/love/src/modules/event/sdl/wrap_Event.h | 48 + jni/love/src/modules/filesystem/File.cpp | 72 + jni/love/src/modules/filesystem/File.h | 222 + jni/love/src/modules/filesystem/FileData.cpp | 91 + jni/love/src/modules/filesystem/FileData.h | 84 + .../src/modules/filesystem/physfs/File.cpp | 342 + jni/love/src/modules/filesystem/physfs/File.h | 95 + .../modules/filesystem/physfs/Filesystem.cpp | 609 + .../modules/filesystem/physfs/Filesystem.h | 315 + .../modules/filesystem/physfs/wrap_File.cpp | 328 + .../src/modules/filesystem/physfs/wrap_File.h | 60 + .../filesystem/physfs/wrap_FileData.cpp | 71 + .../modules/filesystem/physfs/wrap_FileData.h | 45 + .../filesystem/physfs/wrap_Filesystem.cpp | 617 + .../filesystem/physfs/wrap_Filesystem.h | 76 + jni/love/src/modules/font/Font.h | 57 + jni/love/src/modules/font/GlyphData.cpp | 178 + jni/love/src/modules/font/GlyphData.h | 158 + jni/love/src/modules/font/ImageRasterizer.cpp | 166 + jni/love/src/modules/font/ImageRasterizer.h | 82 + jni/love/src/modules/font/Rasterizer.cpp | 99 + jni/love/src/modules/font/Rasterizer.h | 117 + jni/love/src/modules/font/freetype/Font.cpp | 111 + jni/love/src/modules/font/freetype/Font.h | 76 + .../font/freetype/TrueTypeRasterizer.cpp | 121 + .../font/freetype/TrueTypeRasterizer.h | 70 + .../src/modules/font/freetype/wrap_Font.cpp | 125 + .../src/modules/font/freetype/wrap_Font.h | 43 + jni/love/src/modules/font/wrap_GlyphData.cpp | 143 + jni/love/src/modules/font/wrap_GlyphData.h | 50 + jni/love/src/modules/font/wrap_Rasterizer.cpp | 145 + jni/love/src/modules/font/wrap_Rasterizer.h | 47 + jni/love/src/modules/graphics/Color.h | 109 + jni/love/src/modules/graphics/DrawQable.h | 65 + jni/love/src/modules/graphics/Drawable.cpp | 33 + jni/love/src/modules/graphics/Drawable.h | 64 + jni/love/src/modules/graphics/Graphics.cpp | 173 + jni/love/src/modules/graphics/Graphics.h | 185 + jni/love/src/modules/graphics/Image.cpp | 96 + jni/love/src/modules/graphics/Image.h | 95 + jni/love/src/modules/graphics/Quad.cpp | 83 + jni/love/src/modules/graphics/Quad.h | 67 + jni/love/src/modules/graphics/Volatile.cpp | 69 + jni/love/src/modules/graphics/Volatile.h | 93 + .../src/modules/graphics/opengl/Canvas.cpp | 813 ++ jni/love/src/modules/graphics/opengl/Canvas.h | 155 + jni/love/src/modules/graphics/opengl/Font.cpp | 593 + jni/love/src/modules/graphics/opengl/Font.h | 219 + .../src/modules/graphics/opengl/Graphics.cpp | 1097 ++ .../src/modules/graphics/opengl/Graphics.h | 479 + .../src/modules/graphics/opengl/Image.cpp | 648 + jni/love/src/modules/graphics/opengl/Image.h | 220 + jni/love/src/modules/graphics/opengl/Mesh.cpp | 330 + jni/love/src/modules/graphics/opengl/Mesh.h | 175 + .../src/modules/graphics/opengl/OpenGL.cpp | 645 + jni/love/src/modules/graphics/opengl/OpenGL.h | 311 + .../graphics/opengl/ParticleSystem.cpp | 942 ++ .../modules/graphics/opengl/ParticleSystem.h | 632 + .../src/modules/graphics/opengl/Polyline.cpp | 383 + .../src/modules/graphics/opengl/Polyline.h | 168 + .../src/modules/graphics/opengl/Shader.cpp | 803 ++ jni/love/src/modules/graphics/opengl/Shader.h | 252 + .../modules/graphics/opengl/SpriteBatch.cpp | 358 + .../src/modules/graphics/opengl/SpriteBatch.h | 156 + .../modules/graphics/opengl/VertexBuffer.cpp | 468 + .../modules/graphics/opengl/VertexBuffer.h | 519 + .../modules/graphics/opengl/wrap_Canvas.cpp | 245 + .../src/modules/graphics/opengl/wrap_Canvas.h | 55 + .../src/modules/graphics/opengl/wrap_Font.cpp | 186 + .../src/modules/graphics/opengl/wrap_Font.h | 53 + .../modules/graphics/opengl/wrap_Graphics.cpp | 1459 ++ .../modules/graphics/opengl/wrap_Graphics.h | 118 + .../modules/graphics/opengl/wrap_Image.cpp | 229 + .../src/modules/graphics/opengl/wrap_Image.h | 54 + .../src/modules/graphics/opengl/wrap_Mesh.cpp | 327 + .../src/modules/graphics/opengl/wrap_Mesh.h | 57 + .../graphics/opengl/wrap_ParticleSystem.cpp | 669 + .../graphics/opengl/wrap_ParticleSystem.h | 95 + .../src/modules/graphics/opengl/wrap_Quad.cpp | 83 + .../src/modules/graphics/opengl/wrap_Quad.h | 44 + .../modules/graphics/opengl/wrap_Shader.cpp | 383 + .../src/modules/graphics/opengl/wrap_Shader.h | 48 + .../graphics/opengl/wrap_SpriteBatch.cpp | 244 + .../graphics/opengl/wrap_SpriteBatch.h | 56 + jni/love/src/modules/image/CompressedData.cpp | 118 + jni/love/src/modules/image/CompressedData.h | 133 + jni/love/src/modules/image/Image.h | 96 + jni/love/src/modules/image/ImageData.cpp | 190 + jni/love/src/modules/image/ImageData.h | 161 + .../modules/image/magpie/CompressedData.cpp | 89 + .../src/modules/image/magpie/CompressedData.h | 54 + .../src/modules/image/magpie/DevilHandler.cpp | 232 + .../src/modules/image/magpie/DevilHandler.h | 59 + .../src/modules/image/magpie/FormatHandler.h | 94 + jni/love/src/modules/image/magpie/Image.cpp | 77 + jni/love/src/modules/image/magpie/Image.h | 63 + .../src/modules/image/magpie/ImageData.cpp | 141 + jni/love/src/modules/image/magpie/ImageData.h | 61 + .../src/modules/image/magpie/ddsHandler.cpp | 137 + .../src/modules/image/magpie/ddsHandler.h | 80 + .../src/modules/image/wrap_CompressedData.cpp | 117 + .../src/modules/image/wrap_CompressedData.h | 44 + jni/love/src/modules/image/wrap_Image.cpp | 133 + jni/love/src/modules/image/wrap_Image.h | 42 + jni/love/src/modules/image/wrap_ImageData.cpp | 292 + jni/love/src/modules/image/wrap_ImageData.h | 47 + jni/love/src/modules/joystick/Joystick.cpp | 141 + jni/love/src/modules/joystick/Joystick.h | 200 + .../src/modules/joystick/JoystickModule.h | 93 + .../src/modules/joystick/sdl/Joystick.cpp | 522 + jni/love/src/modules/joystick/sdl/Joystick.h | 135 + .../modules/joystick/sdl/JoystickModule.cpp | 467 + .../src/modules/joystick/sdl/JoystickModule.h | 83 + .../modules/joystick/sdl/wrap_Joystick.cpp | 263 + .../src/modules/joystick/sdl/wrap_Joystick.h | 60 + .../joystick/sdl/wrap_JoystickModule.cpp | 216 + .../joystick/sdl/wrap_JoystickModule.h | 46 + jni/love/src/modules/keyboard/Keyboard.cpp | 238 + jni/love/src/modules/keyboard/Keyboard.h | 281 + .../src/modules/keyboard/sdl/Keyboard.cpp | 284 + jni/love/src/modules/keyboard/sdl/Keyboard.h | 70 + .../src/modules/keyboard/wrap_Keyboard.cpp | 108 + jni/love/src/modules/keyboard/wrap_Keyboard.h | 42 + jni/love/src/modules/love/love.cpp | 214 + jni/love/src/modules/love/love.h | 44 + jni/love/src/modules/math/BezierCurve.cpp | 188 + jni/love/src/modules/math/BezierCurve.h | 124 + jni/love/src/modules/math/MathModule.cpp | 197 + jni/love/src/modules/math/MathModule.h | 180 + jni/love/src/modules/math/RandomGenerator.cpp | 87 + jni/love/src/modules/math/RandomGenerator.h | 152 + .../src/modules/math/wrap_BezierCurve.cpp | 189 + jni/love/src/modules/math/wrap_BezierCurve.h | 50 + jni/love/src/modules/math/wrap_Math.cpp | 316 + jni/love/src/modules/math/wrap_Math.h | 48 + .../src/modules/math/wrap_RandomGenerator.cpp | 150 + .../src/modules/math/wrap_RandomGenerator.h | 48 + jni/love/src/modules/mouse/Cursor.cpp | 79 + jni/love/src/modules/mouse/Cursor.h | 100 + jni/love/src/modules/mouse/Mouse.cpp | 52 + jni/love/src/modules/mouse/Mouse.h | 87 + jni/love/src/modules/mouse/sdl/Cursor.cpp | 122 + jni/love/src/modules/mouse/sdl/Cursor.h | 64 + jni/love/src/modules/mouse/sdl/Mouse.cpp | 181 + jni/love/src/modules/mouse/sdl/Mouse.h | 80 + jni/love/src/modules/mouse/wrap_Cursor.cpp | 68 + jni/love/src/modules/mouse/wrap_Cursor.h | 41 + jni/love/src/modules/mouse/wrap_Mouse.cpp | 233 + jni/love/src/modules/mouse/wrap_Mouse.h | 54 + jni/love/src/modules/physics/Body.cpp | 52 + jni/love/src/modules/physics/Body.h | 60 + jni/love/src/modules/physics/Joint.cpp | 60 + jni/love/src/modules/physics/Joint.h | 69 + jni/love/src/modules/physics/Shape.cpp | 53 + jni/love/src/modules/physics/Shape.h | 61 + jni/love/src/modules/physics/box2d/Body.cpp | 474 + jni/love/src/modules/physics/box2d/Body.h | 417 + .../src/modules/physics/box2d/ChainShape.cpp | 117 + .../src/modules/physics/box2d/ChainShape.h | 106 + .../src/modules/physics/box2d/CircleShape.cpp | 58 + .../src/modules/physics/box2d/CircleShape.h | 70 + .../src/modules/physics/box2d/Contact.cpp | 147 + jni/love/src/modules/physics/box2d/Contact.h | 161 + .../modules/physics/box2d/DistanceJoint.cpp | 82 + .../src/modules/physics/box2d/DistanceJoint.h | 90 + .../src/modules/physics/box2d/EdgeShape.cpp | 61 + .../src/modules/physics/box2d/EdgeShape.h | 63 + .../src/modules/physics/box2d/Fixture.cpp | 325 + jni/love/src/modules/physics/box2d/Fixture.h | 225 + .../modules/physics/box2d/FrictionJoint.cpp | 75 + .../src/modules/physics/box2d/FrictionJoint.h | 78 + .../src/modules/physics/box2d/GearJoint.cpp | 65 + .../src/modules/physics/box2d/GearJoint.h | 76 + jni/love/src/modules/physics/box2d/Joint.cpp | 156 + jni/love/src/modules/physics/box2d/Joint.h | 137 + .../src/modules/physics/box2d/MotorJoint.cpp | 115 + .../src/modules/physics/box2d/MotorJoint.h | 85 + .../src/modules/physics/box2d/MouseJoint.cpp | 96 + .../src/modules/physics/box2d/MouseJoint.h | 108 + .../src/modules/physics/box2d/Physics.cpp | 325 + jni/love/src/modules/physics/box2d/Physics.h | 357 + .../modules/physics/box2d/PolygonShape.cpp | 68 + .../src/modules/physics/box2d/PolygonShape.h | 71 + .../modules/physics/box2d/PrismaticJoint.cpp | 144 + .../modules/physics/box2d/PrismaticJoint.h | 147 + .../src/modules/physics/box2d/PulleyJoint.cpp | 77 + .../src/modules/physics/box2d/PulleyJoint.h | 81 + .../modules/physics/box2d/RevoluteJoint.cpp | 140 + .../src/modules/physics/box2d/RevoluteJoint.h | 147 + .../src/modules/physics/box2d/RopeJoint.cpp | 65 + .../src/modules/physics/box2d/RopeJoint.h | 63 + jni/love/src/modules/physics/box2d/Shape.cpp | 155 + jni/love/src/modules/physics/box2d/Shape.h | 82 + .../src/modules/physics/box2d/WeldJoint.cpp | 74 + .../src/modules/physics/box2d/WeldJoint.h | 80 + .../src/modules/physics/box2d/WheelJoint.cpp | 119 + .../src/modules/physics/box2d/WheelJoint.h | 127 + jni/love/src/modules/physics/box2d/World.cpp | 567 + jni/love/src/modules/physics/box2d/World.h | 292 + .../src/modules/physics/box2d/wrap_Body.cpp | 605 + .../src/modules/physics/box2d/wrap_Body.h | 94 + .../modules/physics/box2d/wrap_ChainShape.cpp | 134 + .../modules/physics/box2d/wrap_ChainShape.h | 52 + .../physics/box2d/wrap_CircleShape.cpp | 72 + .../modules/physics/box2d/wrap_CircleShape.h | 45 + .../modules/physics/box2d/wrap_Contact.cpp | 167 + .../src/modules/physics/box2d/wrap_Contact.h | 56 + .../physics/box2d/wrap_DistanceJoint.cpp | 108 + .../physics/box2d/wrap_DistanceJoint.h | 49 + .../modules/physics/box2d/wrap_EdgeShape.cpp | 63 + .../modules/physics/box2d/wrap_EdgeShape.h | 44 + .../modules/physics/box2d/wrap_Fixture.cpp | 304 + .../src/modules/physics/box2d/wrap_Fixture.h | 69 + .../physics/box2d/wrap_FrictionJoint.cpp | 92 + .../physics/box2d/wrap_FrictionJoint.h | 47 + .../modules/physics/box2d/wrap_GearJoint.cpp | 75 + .../modules/physics/box2d/wrap_GearJoint.h | 45 + .../src/modules/physics/box2d/wrap_Joint.cpp | 103 + .../src/modules/physics/box2d/wrap_Joint.h | 48 + .../modules/physics/box2d/wrap_MotorJoint.cpp | 143 + .../modules/physics/box2d/wrap_MotorJoint.h | 53 + .../modules/physics/box2d/wrap_MouseJoint.cpp | 126 + .../modules/physics/box2d/wrap_MouseJoint.h | 51 + .../modules/physics/box2d/wrap_Physics.cpp | 489 + .../src/modules/physics/box2d/wrap_Physics.h | 63 + .../physics/box2d/wrap_PolygonShape.cpp | 71 + .../modules/physics/box2d/wrap_PolygonShape.h | 45 + .../physics/box2d/wrap_PrismaticJoint.cpp | 203 + .../physics/box2d/wrap_PrismaticJoint.h | 60 + .../physics/box2d/wrap_PulleyJoint.cpp | 89 + .../modules/physics/box2d/wrap_PulleyJoint.h | 47 + .../physics/box2d/wrap_RevoluteJoint.cpp | 203 + .../physics/box2d/wrap_RevoluteJoint.h | 60 + .../modules/physics/box2d/wrap_RopeJoint.cpp | 65 + .../modules/physics/box2d/wrap_RopeJoint.h | 44 + .../src/modules/physics/box2d/wrap_Shape.cpp | 117 + .../src/modules/physics/box2d/wrap_Shape.h | 52 + .../modules/physics/box2d/wrap_WeldJoint.cpp | 91 + .../modules/physics/box2d/wrap_WeldJoint.h | 49 + .../modules/physics/box2d/wrap_WheelJoint.cpp | 167 + .../modules/physics/box2d/wrap_WheelJoint.h | 56 + .../src/modules/physics/box2d/wrap_World.cpp | 219 + .../src/modules/physics/box2d/wrap_World.h | 64 + jni/love/src/modules/sound/Decoder.h | 142 + jni/love/src/modules/sound/Sound.cpp | 44 + jni/love/src/modules/sound/Sound.h | 83 + jni/love/src/modules/sound/SoundData.cpp | 222 + jni/love/src/modules/sound/SoundData.h | 73 + .../src/modules/sound/lullaby/Decoder.cpp | 75 + jni/love/src/modules/sound/lullaby/Decoder.h | 79 + .../src/modules/sound/lullaby/FLACDecoder.cpp | 186 + .../src/modules/sound/lullaby/FLACDecoder.h | 76 + .../src/modules/sound/lullaby/GmeDecoder.cpp | 149 + .../src/modules/sound/lullaby/GmeDecoder.h | 72 + .../modules/sound/lullaby/ModPlugDecoder.cpp | 147 + .../modules/sound/lullaby/ModPlugDecoder.h | 65 + .../modules/sound/lullaby/Mpg123Decoder.cpp | 234 + .../src/modules/sound/lullaby/Mpg123Decoder.h | 78 + jni/love/src/modules/sound/lullaby/Sound.cpp | 92 + jni/love/src/modules/sound/lullaby/Sound.h | 70 + .../modules/sound/lullaby/VorbisDecoder.cpp | 258 + .../src/modules/sound/lullaby/VorbisDecoder.h | 78 + .../src/modules/sound/lullaby/WaveDecoder.cpp | 194 + .../src/modules/sound/lullaby/WaveDecoder.h | 75 + jni/love/src/modules/sound/wrap_Decoder.cpp | 68 + jni/love/src/modules/sound/wrap_Decoder.h | 42 + jni/love/src/modules/sound/wrap_Sound.cpp | 119 + jni/love/src/modules/sound/wrap_Sound.h | 42 + jni/love/src/modules/sound/wrap_SoundData.cpp | 112 + jni/love/src/modules/sound/wrap_SoundData.h | 46 + jni/love/src/modules/system/System.cpp | 63 + jni/love/src/modules/system/System.h | 101 + jni/love/src/modules/system/sdl/System.cpp | 91 + jni/love/src/modules/system/sdl/System.h | 66 + jni/love/src/modules/system/wrap_System.cpp | 112 + jni/love/src/modules/system/wrap_System.h | 43 + jni/love/src/modules/thread/Channel.cpp | 234 + jni/love/src/modules/thread/Channel.h | 75 + jni/love/src/modules/thread/LuaThread.cpp | 128 + jni/love/src/modules/thread/LuaThread.h | 62 + jni/love/src/modules/thread/Thread.h | 47 + jni/love/src/modules/thread/ThreadModule.cpp | 50 + jni/love/src/modules/thread/ThreadModule.h | 58 + jni/love/src/modules/thread/sdl/Thread.cpp | 88 + jni/love/src/modules/thread/sdl/Thread.h | 62 + jni/love/src/modules/thread/sdl/threads.cpp | 100 + jni/love/src/modules/thread/sdl/threads.h | 71 + jni/love/src/modules/thread/threads.cpp | 103 + jni/love/src/modules/thread/threads.h | 98 + jni/love/src/modules/thread/wrap_Channel.cpp | 135 + jni/love/src/modules/thread/wrap_Channel.h | 44 + .../src/modules/thread/wrap_LuaThread.cpp | 98 + jni/love/src/modules/thread/wrap_LuaThread.h | 43 + .../src/modules/thread/wrap_ThreadModule.cpp | 110 + .../src/modules/thread/wrap_ThreadModule.h | 41 + jni/love/src/modules/timer/Timer.h | 85 + jni/love/src/modules/timer/sdl/Timer.cpp | 179 + jni/love/src/modules/timer/sdl/Timer.h | 92 + jni/love/src/modules/timer/wrap_Timer.cpp | 104 + jni/love/src/modules/timer/wrap_Timer.h | 43 + jni/love/src/modules/window/Window.cpp | 100 + jni/love/src/modules/window/Window.h | 160 + jni/love/src/modules/window/sdl/Window.cpp | 621 + jni/love/src/modules/window/sdl/Window.h | 126 + jni/love/src/modules/window/wrap_Window.cpp | 341 + jni/love/src/modules/window/wrap_Window.h | 55 + jni/love/src/scripts/auto.lua | 116 + jni/love/src/scripts/boot.lua | 1615 +++ jni/love/src/scripts/boot.lua.h | 5344 ++++++++ jni/love/src/scripts/graphics.lua | 1530 +++ jni/love/src/scripts/graphics.lua.h | 6706 ++++++++++ 615 files changed, 150300 insertions(+) create mode 100644 jni/love/CMakeLists.txt create mode 100644 jni/love/changes.txt create mode 100644 jni/love/extra/nsis/game.ico create mode 100644 jni/love/extra/nsis/left.bmp create mode 100644 jni/love/extra/nsis/love.ico create mode 100644 jni/love/extra/nsis/love.nsi create mode 100644 jni/love/extra/nsis/top.bmp create mode 100644 jni/love/extra/reshax/res/knoll1.png create mode 100644 jni/love/extra/reshax/res/planet.png create mode 100644 jni/love/extra/reshax/res/star1.png create mode 100644 jni/love/extra/resources/Vera.ttf create mode 100644 jni/love/extra/resources/b64.lua create mode 100644 jni/love/extra/resources/heart.png create mode 100644 jni/love/extra/resources/pig.png create mode 100644 jni/love/license.txt create mode 100644 jni/love/platform/macosx/Info-Framework.plist create mode 100644 jni/love/platform/macosx/OSX.h create mode 100644 jni/love/platform/macosx/OSX.mm create mode 100644 jni/love/platform/macosx/dmg/DS_Store create mode 100644 jni/love/platform/macosx/dmg/VolumeIcon.icns create mode 100644 jni/love/platform/macosx/dmg/backgroundImage.tiff create mode 100644 jni/love/platform/macosx/icons/Love.icns create mode 100644 jni/love/platform/macosx/icons/LoveDocument.icns create mode 100644 jni/love/platform/macosx/love-Info.plist create mode 100644 jni/love/platform/macosx/love-framework.xcodeproj/project.pbxproj create mode 100644 jni/love/platform/macosx/love.xcodeproj/TemplateIcon.icns create mode 100644 jni/love/platform/macosx/love.xcodeproj/default.pbxuser create mode 100644 jni/love/platform/macosx/love.xcodeproj/project.pbxproj create mode 100644 jni/love/platform/msvc2010/liblove.vcxproj create mode 100644 jni/love/platform/msvc2010/liblove.vcxproj.filters create mode 100644 jni/love/platform/msvc2010/love.ico create mode 100644 jni/love/platform/msvc2010/love.rc create mode 100644 jni/love/platform/msvc2010/love.sln create mode 100644 jni/love/platform/msvc2010/love.vcxproj create mode 100644 jni/love/platform/msvc2010/love.vcxproj.filters create mode 100644 jni/love/platform/unix/Makefile.am create mode 100644 jni/love/platform/unix/application-x-love-game.svg create mode 100755 jni/love/platform/unix/automagic create mode 100644 jni/love/platform/unix/configure.ac create mode 100644 jni/love/platform/unix/debian/changelog create mode 100644 jni/love/platform/unix/debian/compat create mode 100644 jni/love/platform/unix/debian/control create mode 100644 jni/love/platform/unix/debian/copyright create mode 100644 jni/love/platform/unix/debian/docs create mode 100644 jni/love/platform/unix/debian/liblove.install create mode 100644 jni/love/platform/unix/debian/love.install create mode 100644 jni/love/platform/unix/debian/love.manpages create mode 100755 jni/love/platform/unix/debian/rules create mode 100644 jni/love/platform/unix/debian/source/format create mode 100644 jni/love/platform/unix/exclude create mode 100644 jni/love/platform/unix/gen-makefile create mode 100644 jni/love/platform/unix/love.1 create mode 100644 jni/love/platform/unix/love.desktop.in create mode 100644 jni/love/platform/unix/love.svg create mode 100644 jni/love/platform/unix/love.xml create mode 100755 jni/love/platform/unix/postinst create mode 100755 jni/love/platform/unix/postrm create mode 100644 jni/love/readme.md create mode 100644 jni/love/src/common/Data.h create mode 100644 jni/love/src/common/EnumMap.h create mode 100644 jni/love/src/common/Exception.cpp create mode 100644 jni/love/src/common/Exception.h create mode 100644 jni/love/src/common/Matrix.cpp create mode 100644 jni/love/src/common/Matrix.h create mode 100644 jni/love/src/common/Memoizer.cpp create mode 100644 jni/love/src/common/Memoizer.h create mode 100644 jni/love/src/common/Module.cpp create mode 100644 jni/love/src/common/Module.h create mode 100644 jni/love/src/common/Object.cpp create mode 100644 jni/love/src/common/Object.h create mode 100644 jni/love/src/common/Reference.cpp create mode 100644 jni/love/src/common/Reference.h create mode 100644 jni/love/src/common/StringMap.h create mode 100644 jni/love/src/common/Variant.cpp create mode 100644 jni/love/src/common/Variant.h create mode 100644 jni/love/src/common/Vector.cpp create mode 100644 jni/love/src/common/Vector.h create mode 100644 jni/love/src/common/b64.cpp create mode 100644 jni/love/src/common/b64.h create mode 100644 jni/love/src/common/config.h create mode 100644 jni/love/src/common/delay.cpp create mode 100644 jni/love/src/common/delay.h create mode 100644 jni/love/src/common/int.h create mode 100644 jni/love/src/common/math.h create mode 100644 jni/love/src/common/runtime.cpp create mode 100644 jni/love/src/common/runtime.h create mode 100644 jni/love/src/common/types.h create mode 100644 jni/love/src/common/utf8.cpp create mode 100644 jni/love/src/common/utf8.h create mode 100644 jni/love/src/common/version.h create mode 100644 jni/love/src/common/wrap_Data.cpp create mode 100644 jni/love/src/common/wrap_Data.h create mode 100755 jni/love/src/libraries/Box2D/Box2D.h create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2ChainShape.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2ChainShape.h create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2CircleShape.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2CircleShape.h create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.h create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.h create mode 100755 jni/love/src/libraries/Box2D/Collision/Shapes/b2Shape.h create mode 100755 jni/love/src/libraries/Box2D/Collision/b2BroadPhase.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/b2BroadPhase.h create mode 100755 jni/love/src/libraries/Box2D/Collision/b2CollideCircle.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/b2CollideEdge.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/b2CollidePolygon.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/b2Collision.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/b2Collision.h create mode 100755 jni/love/src/libraries/Box2D/Collision/b2Distance.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/b2Distance.h create mode 100755 jni/love/src/libraries/Box2D/Collision/b2DynamicTree.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/b2DynamicTree.h create mode 100755 jni/love/src/libraries/Box2D/Collision/b2TimeOfImpact.cpp create mode 100755 jni/love/src/libraries/Box2D/Collision/b2TimeOfImpact.h create mode 100755 jni/love/src/libraries/Box2D/Common/b2BlockAllocator.cpp create mode 100755 jni/love/src/libraries/Box2D/Common/b2BlockAllocator.h create mode 100755 jni/love/src/libraries/Box2D/Common/b2Draw.cpp create mode 100755 jni/love/src/libraries/Box2D/Common/b2Draw.h create mode 100755 jni/love/src/libraries/Box2D/Common/b2GrowableStack.h create mode 100755 jni/love/src/libraries/Box2D/Common/b2Math.cpp create mode 100755 jni/love/src/libraries/Box2D/Common/b2Math.h create mode 100755 jni/love/src/libraries/Box2D/Common/b2Settings.cpp create mode 100755 jni/love/src/libraries/Box2D/Common/b2Settings.h create mode 100755 jni/love/src/libraries/Box2D/Common/b2StackAllocator.cpp create mode 100755 jni/love/src/libraries/Box2D/Common/b2StackAllocator.h create mode 100755 jni/love/src/libraries/Box2D/Common/b2Timer.cpp create mode 100755 jni/love/src/libraries/Box2D/Common/b2Timer.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2Contact.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2Contact.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2Joint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2Joint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2Body.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2Body.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2ContactManager.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2ContactManager.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2Fixture.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2Fixture.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2Island.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2Island.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2TimeStep.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2World.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2World.h create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2WorldCallbacks.cpp create mode 100755 jni/love/src/libraries/Box2D/Dynamics/b2WorldCallbacks.h create mode 100644 jni/love/src/libraries/Box2D/README.MODIFIED create mode 100755 jni/love/src/libraries/Box2D/Rope/b2Rope.cpp create mode 100755 jni/love/src/libraries/Box2D/Rope/b2Rope.h create mode 100644 jni/love/src/libraries/Wuff/wuff.c create mode 100644 jni/love/src/libraries/Wuff/wuff.h create mode 100644 jni/love/src/libraries/Wuff/wuff_config.h create mode 100644 jni/love/src/libraries/Wuff/wuff_convert.c create mode 100644 jni/love/src/libraries/Wuff/wuff_convert.h create mode 100644 jni/love/src/libraries/Wuff/wuff_internal.c create mode 100644 jni/love/src/libraries/Wuff/wuff_internal.h create mode 100644 jni/love/src/libraries/Wuff/wuff_memory.c create mode 100644 jni/love/src/libraries/ddsparse/ddsinfo.h create mode 100644 jni/love/src/libraries/ddsparse/ddsparse.cpp create mode 100644 jni/love/src/libraries/ddsparse/ddsparse.h create mode 100644 jni/love/src/libraries/enet/enet.cpp create mode 100644 jni/love/src/libraries/enet/libenet/ChangeLog create mode 100644 jni/love/src/libraries/enet/libenet/LICENSE create mode 100644 jni/love/src/libraries/enet/libenet/README create mode 100644 jni/love/src/libraries/enet/libenet/callbacks.c create mode 100644 jni/love/src/libraries/enet/libenet/compress.c create mode 100644 jni/love/src/libraries/enet/libenet/host.c create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/callbacks.h create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/enet.h create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/list.h create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/protocol.h create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/time.h create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/types.h create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/unix.h create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/utility.h create mode 100644 jni/love/src/libraries/enet/libenet/include/enet/win32.h create mode 100644 jni/love/src/libraries/enet/libenet/list.c create mode 100644 jni/love/src/libraries/enet/libenet/packet.c create mode 100644 jni/love/src/libraries/enet/libenet/peer.c create mode 100644 jni/love/src/libraries/enet/libenet/protocol.c create mode 100644 jni/love/src/libraries/enet/libenet/unix.c create mode 100644 jni/love/src/libraries/enet/libenet/win32.c create mode 100644 jni/love/src/libraries/enet/lua-enet.h create mode 100644 jni/love/src/libraries/glad/glad.cpp create mode 100644 jni/love/src/libraries/glad/glad.hpp create mode 100644 jni/love/src/libraries/glad/gladfuncs.hpp create mode 100644 jni/love/src/libraries/luasocket/libluasocket/auxiliar.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/auxiliar.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/buffer.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/buffer.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/except.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/except.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/ftp.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/ftp.lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/http.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/http.lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/inet.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/inet.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/io.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/io.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/ltn12.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/ltn12.lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/luasocket.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/luasocket.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/mime.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/mime.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/mime.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/mime.lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/options.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/options.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/pre.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/select.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/select.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/smtp.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/smtp.lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/socket.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/socket.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/socket.lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/tcp.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/tcp.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/timeout.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/timeout.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/tp.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/tp.lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/udp.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/udp.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/unix.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/unix.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/url.lua create mode 100644 jni/love/src/libraries/luasocket/libluasocket/url.lua.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/usocket.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/usocket.h create mode 100644 jni/love/src/libraries/luasocket/libluasocket/wsocket.c create mode 100644 jni/love/src/libraries/luasocket/libluasocket/wsocket.h create mode 100644 jni/love/src/libraries/luasocket/luasocket.cpp create mode 100644 jni/love/src/libraries/luasocket/luasocket.h create mode 100644 jni/love/src/libraries/noise1234/simplexnoise1234.cpp create mode 100644 jni/love/src/libraries/noise1234/simplexnoise1234.h create mode 100644 jni/love/src/libraries/utf8/utf8.h create mode 100644 jni/love/src/libraries/utf8/utf8/checked.h create mode 100644 jni/love/src/libraries/utf8/utf8/core.h create mode 100644 jni/love/src/libraries/utf8/utf8/unchecked.h create mode 100644 jni/love/src/love.cpp create mode 100644 jni/love/src/modules/audio/Audio.cpp create mode 100644 jni/love/src/modules/audio/Audio.h create mode 100644 jni/love/src/modules/audio/Source.cpp create mode 100644 jni/love/src/modules/audio/Source.h create mode 100644 jni/love/src/modules/audio/null/Audio.cpp create mode 100644 jni/love/src/modules/audio/null/Audio.h create mode 100644 jni/love/src/modules/audio/null/Source.cpp create mode 100644 jni/love/src/modules/audio/null/Source.h create mode 100644 jni/love/src/modules/audio/openal/Audio.cpp create mode 100644 jni/love/src/modules/audio/openal/Audio.h create mode 100644 jni/love/src/modules/audio/openal/Pool.cpp create mode 100644 jni/love/src/modules/audio/openal/Pool.h create mode 100644 jni/love/src/modules/audio/openal/Source.cpp create mode 100644 jni/love/src/modules/audio/openal/Source.h create mode 100644 jni/love/src/modules/audio/wrap_Audio.cpp create mode 100644 jni/love/src/modules/audio/wrap_Audio.h create mode 100644 jni/love/src/modules/audio/wrap_Source.cpp create mode 100644 jni/love/src/modules/audio/wrap_Source.h create mode 100644 jni/love/src/modules/event/Event.cpp create mode 100644 jni/love/src/modules/event/Event.h create mode 100644 jni/love/src/modules/event/sdl/Event.cpp create mode 100644 jni/love/src/modules/event/sdl/Event.h create mode 100644 jni/love/src/modules/event/sdl/wrap_Event.cpp create mode 100644 jni/love/src/modules/event/sdl/wrap_Event.h create mode 100644 jni/love/src/modules/filesystem/File.cpp create mode 100644 jni/love/src/modules/filesystem/File.h create mode 100644 jni/love/src/modules/filesystem/FileData.cpp create mode 100644 jni/love/src/modules/filesystem/FileData.h create mode 100644 jni/love/src/modules/filesystem/physfs/File.cpp create mode 100644 jni/love/src/modules/filesystem/physfs/File.h create mode 100644 jni/love/src/modules/filesystem/physfs/Filesystem.cpp create mode 100644 jni/love/src/modules/filesystem/physfs/Filesystem.h create mode 100644 jni/love/src/modules/filesystem/physfs/wrap_File.cpp create mode 100644 jni/love/src/modules/filesystem/physfs/wrap_File.h create mode 100644 jni/love/src/modules/filesystem/physfs/wrap_FileData.cpp create mode 100644 jni/love/src/modules/filesystem/physfs/wrap_FileData.h create mode 100644 jni/love/src/modules/filesystem/physfs/wrap_Filesystem.cpp create mode 100644 jni/love/src/modules/filesystem/physfs/wrap_Filesystem.h create mode 100644 jni/love/src/modules/font/Font.h create mode 100644 jni/love/src/modules/font/GlyphData.cpp create mode 100644 jni/love/src/modules/font/GlyphData.h create mode 100644 jni/love/src/modules/font/ImageRasterizer.cpp create mode 100644 jni/love/src/modules/font/ImageRasterizer.h create mode 100644 jni/love/src/modules/font/Rasterizer.cpp create mode 100644 jni/love/src/modules/font/Rasterizer.h create mode 100644 jni/love/src/modules/font/freetype/Font.cpp create mode 100644 jni/love/src/modules/font/freetype/Font.h create mode 100644 jni/love/src/modules/font/freetype/TrueTypeRasterizer.cpp create mode 100644 jni/love/src/modules/font/freetype/TrueTypeRasterizer.h create mode 100644 jni/love/src/modules/font/freetype/wrap_Font.cpp create mode 100644 jni/love/src/modules/font/freetype/wrap_Font.h create mode 100644 jni/love/src/modules/font/wrap_GlyphData.cpp create mode 100644 jni/love/src/modules/font/wrap_GlyphData.h create mode 100644 jni/love/src/modules/font/wrap_Rasterizer.cpp create mode 100644 jni/love/src/modules/font/wrap_Rasterizer.h create mode 100644 jni/love/src/modules/graphics/Color.h create mode 100644 jni/love/src/modules/graphics/DrawQable.h create mode 100644 jni/love/src/modules/graphics/Drawable.cpp create mode 100644 jni/love/src/modules/graphics/Drawable.h create mode 100644 jni/love/src/modules/graphics/Graphics.cpp create mode 100644 jni/love/src/modules/graphics/Graphics.h create mode 100644 jni/love/src/modules/graphics/Image.cpp create mode 100644 jni/love/src/modules/graphics/Image.h create mode 100644 jni/love/src/modules/graphics/Quad.cpp create mode 100644 jni/love/src/modules/graphics/Quad.h create mode 100644 jni/love/src/modules/graphics/Volatile.cpp create mode 100644 jni/love/src/modules/graphics/Volatile.h create mode 100644 jni/love/src/modules/graphics/opengl/Canvas.cpp create mode 100644 jni/love/src/modules/graphics/opengl/Canvas.h create mode 100644 jni/love/src/modules/graphics/opengl/Font.cpp create mode 100644 jni/love/src/modules/graphics/opengl/Font.h create mode 100644 jni/love/src/modules/graphics/opengl/Graphics.cpp create mode 100644 jni/love/src/modules/graphics/opengl/Graphics.h create mode 100644 jni/love/src/modules/graphics/opengl/Image.cpp create mode 100644 jni/love/src/modules/graphics/opengl/Image.h create mode 100644 jni/love/src/modules/graphics/opengl/Mesh.cpp create mode 100644 jni/love/src/modules/graphics/opengl/Mesh.h create mode 100644 jni/love/src/modules/graphics/opengl/OpenGL.cpp create mode 100644 jni/love/src/modules/graphics/opengl/OpenGL.h create mode 100644 jni/love/src/modules/graphics/opengl/ParticleSystem.cpp create mode 100644 jni/love/src/modules/graphics/opengl/ParticleSystem.h create mode 100644 jni/love/src/modules/graphics/opengl/Polyline.cpp create mode 100644 jni/love/src/modules/graphics/opengl/Polyline.h create mode 100644 jni/love/src/modules/graphics/opengl/Shader.cpp create mode 100644 jni/love/src/modules/graphics/opengl/Shader.h create mode 100644 jni/love/src/modules/graphics/opengl/SpriteBatch.cpp create mode 100644 jni/love/src/modules/graphics/opengl/SpriteBatch.h create mode 100644 jni/love/src/modules/graphics/opengl/VertexBuffer.cpp create mode 100644 jni/love/src/modules/graphics/opengl/VertexBuffer.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Canvas.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Canvas.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Font.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Font.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Graphics.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Graphics.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Image.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Image.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Mesh.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Mesh.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Quad.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Quad.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Shader.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_Shader.h create mode 100644 jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.cpp create mode 100644 jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.h create mode 100644 jni/love/src/modules/image/CompressedData.cpp create mode 100644 jni/love/src/modules/image/CompressedData.h create mode 100644 jni/love/src/modules/image/Image.h create mode 100644 jni/love/src/modules/image/ImageData.cpp create mode 100644 jni/love/src/modules/image/ImageData.h create mode 100644 jni/love/src/modules/image/magpie/CompressedData.cpp create mode 100644 jni/love/src/modules/image/magpie/CompressedData.h create mode 100644 jni/love/src/modules/image/magpie/DevilHandler.cpp create mode 100644 jni/love/src/modules/image/magpie/DevilHandler.h create mode 100644 jni/love/src/modules/image/magpie/FormatHandler.h create mode 100644 jni/love/src/modules/image/magpie/Image.cpp create mode 100644 jni/love/src/modules/image/magpie/Image.h create mode 100644 jni/love/src/modules/image/magpie/ImageData.cpp create mode 100644 jni/love/src/modules/image/magpie/ImageData.h create mode 100644 jni/love/src/modules/image/magpie/ddsHandler.cpp create mode 100644 jni/love/src/modules/image/magpie/ddsHandler.h create mode 100644 jni/love/src/modules/image/wrap_CompressedData.cpp create mode 100644 jni/love/src/modules/image/wrap_CompressedData.h create mode 100644 jni/love/src/modules/image/wrap_Image.cpp create mode 100644 jni/love/src/modules/image/wrap_Image.h create mode 100644 jni/love/src/modules/image/wrap_ImageData.cpp create mode 100644 jni/love/src/modules/image/wrap_ImageData.h create mode 100644 jni/love/src/modules/joystick/Joystick.cpp create mode 100644 jni/love/src/modules/joystick/Joystick.h create mode 100644 jni/love/src/modules/joystick/JoystickModule.h create mode 100644 jni/love/src/modules/joystick/sdl/Joystick.cpp create mode 100644 jni/love/src/modules/joystick/sdl/Joystick.h create mode 100644 jni/love/src/modules/joystick/sdl/JoystickModule.cpp create mode 100644 jni/love/src/modules/joystick/sdl/JoystickModule.h create mode 100644 jni/love/src/modules/joystick/sdl/wrap_Joystick.cpp create mode 100644 jni/love/src/modules/joystick/sdl/wrap_Joystick.h create mode 100644 jni/love/src/modules/joystick/sdl/wrap_JoystickModule.cpp create mode 100644 jni/love/src/modules/joystick/sdl/wrap_JoystickModule.h create mode 100644 jni/love/src/modules/keyboard/Keyboard.cpp create mode 100644 jni/love/src/modules/keyboard/Keyboard.h create mode 100644 jni/love/src/modules/keyboard/sdl/Keyboard.cpp create mode 100644 jni/love/src/modules/keyboard/sdl/Keyboard.h create mode 100644 jni/love/src/modules/keyboard/wrap_Keyboard.cpp create mode 100644 jni/love/src/modules/keyboard/wrap_Keyboard.h create mode 100644 jni/love/src/modules/love/love.cpp create mode 100644 jni/love/src/modules/love/love.h create mode 100644 jni/love/src/modules/math/BezierCurve.cpp create mode 100644 jni/love/src/modules/math/BezierCurve.h create mode 100644 jni/love/src/modules/math/MathModule.cpp create mode 100644 jni/love/src/modules/math/MathModule.h create mode 100644 jni/love/src/modules/math/RandomGenerator.cpp create mode 100644 jni/love/src/modules/math/RandomGenerator.h create mode 100644 jni/love/src/modules/math/wrap_BezierCurve.cpp create mode 100644 jni/love/src/modules/math/wrap_BezierCurve.h create mode 100644 jni/love/src/modules/math/wrap_Math.cpp create mode 100644 jni/love/src/modules/math/wrap_Math.h create mode 100644 jni/love/src/modules/math/wrap_RandomGenerator.cpp create mode 100644 jni/love/src/modules/math/wrap_RandomGenerator.h create mode 100644 jni/love/src/modules/mouse/Cursor.cpp create mode 100644 jni/love/src/modules/mouse/Cursor.h create mode 100644 jni/love/src/modules/mouse/Mouse.cpp create mode 100644 jni/love/src/modules/mouse/Mouse.h create mode 100644 jni/love/src/modules/mouse/sdl/Cursor.cpp create mode 100644 jni/love/src/modules/mouse/sdl/Cursor.h create mode 100644 jni/love/src/modules/mouse/sdl/Mouse.cpp create mode 100644 jni/love/src/modules/mouse/sdl/Mouse.h create mode 100644 jni/love/src/modules/mouse/wrap_Cursor.cpp create mode 100644 jni/love/src/modules/mouse/wrap_Cursor.h create mode 100644 jni/love/src/modules/mouse/wrap_Mouse.cpp create mode 100644 jni/love/src/modules/mouse/wrap_Mouse.h create mode 100644 jni/love/src/modules/physics/Body.cpp create mode 100644 jni/love/src/modules/physics/Body.h create mode 100644 jni/love/src/modules/physics/Joint.cpp create mode 100644 jni/love/src/modules/physics/Joint.h create mode 100644 jni/love/src/modules/physics/Shape.cpp create mode 100644 jni/love/src/modules/physics/Shape.h create mode 100644 jni/love/src/modules/physics/box2d/Body.cpp create mode 100644 jni/love/src/modules/physics/box2d/Body.h create mode 100644 jni/love/src/modules/physics/box2d/ChainShape.cpp create mode 100644 jni/love/src/modules/physics/box2d/ChainShape.h create mode 100644 jni/love/src/modules/physics/box2d/CircleShape.cpp create mode 100644 jni/love/src/modules/physics/box2d/CircleShape.h create mode 100644 jni/love/src/modules/physics/box2d/Contact.cpp create mode 100644 jni/love/src/modules/physics/box2d/Contact.h create mode 100644 jni/love/src/modules/physics/box2d/DistanceJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/DistanceJoint.h create mode 100644 jni/love/src/modules/physics/box2d/EdgeShape.cpp create mode 100644 jni/love/src/modules/physics/box2d/EdgeShape.h create mode 100644 jni/love/src/modules/physics/box2d/Fixture.cpp create mode 100644 jni/love/src/modules/physics/box2d/Fixture.h create mode 100644 jni/love/src/modules/physics/box2d/FrictionJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/FrictionJoint.h create mode 100644 jni/love/src/modules/physics/box2d/GearJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/GearJoint.h create mode 100644 jni/love/src/modules/physics/box2d/Joint.cpp create mode 100644 jni/love/src/modules/physics/box2d/Joint.h create mode 100644 jni/love/src/modules/physics/box2d/MotorJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/MotorJoint.h create mode 100644 jni/love/src/modules/physics/box2d/MouseJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/MouseJoint.h create mode 100644 jni/love/src/modules/physics/box2d/Physics.cpp create mode 100644 jni/love/src/modules/physics/box2d/Physics.h create mode 100644 jni/love/src/modules/physics/box2d/PolygonShape.cpp create mode 100644 jni/love/src/modules/physics/box2d/PolygonShape.h create mode 100644 jni/love/src/modules/physics/box2d/PrismaticJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/PrismaticJoint.h create mode 100644 jni/love/src/modules/physics/box2d/PulleyJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/PulleyJoint.h create mode 100644 jni/love/src/modules/physics/box2d/RevoluteJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/RevoluteJoint.h create mode 100644 jni/love/src/modules/physics/box2d/RopeJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/RopeJoint.h create mode 100644 jni/love/src/modules/physics/box2d/Shape.cpp create mode 100644 jni/love/src/modules/physics/box2d/Shape.h create mode 100644 jni/love/src/modules/physics/box2d/WeldJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/WeldJoint.h create mode 100644 jni/love/src/modules/physics/box2d/WheelJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/WheelJoint.h create mode 100644 jni/love/src/modules/physics/box2d/World.cpp create mode 100644 jni/love/src/modules/physics/box2d/World.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_Body.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_Body.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_ChainShape.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_ChainShape.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_CircleShape.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_CircleShape.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_Contact.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_Contact.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_DistanceJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_DistanceJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_EdgeShape.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_EdgeShape.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_Fixture.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_Fixture.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_FrictionJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_FrictionJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_GearJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_GearJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_Joint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_Joint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_MotorJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_MotorJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_MouseJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_MouseJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_Physics.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_Physics.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_PolygonShape.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_PolygonShape.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_PulleyJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_PulleyJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_RopeJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_RopeJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_Shape.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_Shape.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_WeldJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_WeldJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_WheelJoint.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_WheelJoint.h create mode 100644 jni/love/src/modules/physics/box2d/wrap_World.cpp create mode 100644 jni/love/src/modules/physics/box2d/wrap_World.h create mode 100644 jni/love/src/modules/sound/Decoder.h create mode 100644 jni/love/src/modules/sound/Sound.cpp create mode 100644 jni/love/src/modules/sound/Sound.h create mode 100644 jni/love/src/modules/sound/SoundData.cpp create mode 100644 jni/love/src/modules/sound/SoundData.h create mode 100644 jni/love/src/modules/sound/lullaby/Decoder.cpp create mode 100644 jni/love/src/modules/sound/lullaby/Decoder.h create mode 100644 jni/love/src/modules/sound/lullaby/FLACDecoder.cpp create mode 100644 jni/love/src/modules/sound/lullaby/FLACDecoder.h create mode 100644 jni/love/src/modules/sound/lullaby/GmeDecoder.cpp create mode 100644 jni/love/src/modules/sound/lullaby/GmeDecoder.h create mode 100644 jni/love/src/modules/sound/lullaby/ModPlugDecoder.cpp create mode 100644 jni/love/src/modules/sound/lullaby/ModPlugDecoder.h create mode 100644 jni/love/src/modules/sound/lullaby/Mpg123Decoder.cpp create mode 100644 jni/love/src/modules/sound/lullaby/Mpg123Decoder.h create mode 100644 jni/love/src/modules/sound/lullaby/Sound.cpp create mode 100644 jni/love/src/modules/sound/lullaby/Sound.h create mode 100644 jni/love/src/modules/sound/lullaby/VorbisDecoder.cpp create mode 100644 jni/love/src/modules/sound/lullaby/VorbisDecoder.h create mode 100644 jni/love/src/modules/sound/lullaby/WaveDecoder.cpp create mode 100644 jni/love/src/modules/sound/lullaby/WaveDecoder.h create mode 100644 jni/love/src/modules/sound/wrap_Decoder.cpp create mode 100644 jni/love/src/modules/sound/wrap_Decoder.h create mode 100644 jni/love/src/modules/sound/wrap_Sound.cpp create mode 100644 jni/love/src/modules/sound/wrap_Sound.h create mode 100644 jni/love/src/modules/sound/wrap_SoundData.cpp create mode 100644 jni/love/src/modules/sound/wrap_SoundData.h create mode 100644 jni/love/src/modules/system/System.cpp create mode 100644 jni/love/src/modules/system/System.h create mode 100644 jni/love/src/modules/system/sdl/System.cpp create mode 100644 jni/love/src/modules/system/sdl/System.h create mode 100644 jni/love/src/modules/system/wrap_System.cpp create mode 100644 jni/love/src/modules/system/wrap_System.h create mode 100644 jni/love/src/modules/thread/Channel.cpp create mode 100644 jni/love/src/modules/thread/Channel.h create mode 100644 jni/love/src/modules/thread/LuaThread.cpp create mode 100644 jni/love/src/modules/thread/LuaThread.h create mode 100644 jni/love/src/modules/thread/Thread.h create mode 100644 jni/love/src/modules/thread/ThreadModule.cpp create mode 100644 jni/love/src/modules/thread/ThreadModule.h create mode 100644 jni/love/src/modules/thread/sdl/Thread.cpp create mode 100644 jni/love/src/modules/thread/sdl/Thread.h create mode 100644 jni/love/src/modules/thread/sdl/threads.cpp create mode 100644 jni/love/src/modules/thread/sdl/threads.h create mode 100644 jni/love/src/modules/thread/threads.cpp create mode 100644 jni/love/src/modules/thread/threads.h create mode 100644 jni/love/src/modules/thread/wrap_Channel.cpp create mode 100644 jni/love/src/modules/thread/wrap_Channel.h create mode 100644 jni/love/src/modules/thread/wrap_LuaThread.cpp create mode 100644 jni/love/src/modules/thread/wrap_LuaThread.h create mode 100644 jni/love/src/modules/thread/wrap_ThreadModule.cpp create mode 100644 jni/love/src/modules/thread/wrap_ThreadModule.h create mode 100644 jni/love/src/modules/timer/Timer.h create mode 100644 jni/love/src/modules/timer/sdl/Timer.cpp create mode 100644 jni/love/src/modules/timer/sdl/Timer.h create mode 100644 jni/love/src/modules/timer/wrap_Timer.cpp create mode 100644 jni/love/src/modules/timer/wrap_Timer.h create mode 100644 jni/love/src/modules/window/Window.cpp create mode 100644 jni/love/src/modules/window/Window.h create mode 100644 jni/love/src/modules/window/sdl/Window.cpp create mode 100644 jni/love/src/modules/window/sdl/Window.h create mode 100644 jni/love/src/modules/window/wrap_Window.cpp create mode 100644 jni/love/src/modules/window/wrap_Window.h create mode 100644 jni/love/src/scripts/auto.lua create mode 100644 jni/love/src/scripts/boot.lua create mode 100644 jni/love/src/scripts/boot.lua.h create mode 100644 jni/love/src/scripts/graphics.lua create mode 100644 jni/love/src/scripts/graphics.lua.h diff --git a/jni/love/CMakeLists.txt b/jni/love/CMakeLists.txt new file mode 100644 index 00000000..c2522270 --- /dev/null +++ b/jni/love/CMakeLists.txt @@ -0,0 +1,1203 @@ +# +# Copyright (c) 2006-2013 LOVE Development Team +# +# 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. +# + +if(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR}) + # Protip: run cmake like this: cmake -G "" -H. -Bbuild + message(FATAL_ERROR "Prevented in-tree build.") +endif() + +cmake_minimum_required(VERSION 2.8) + +project(love) + +if(NOT MEGA) + message(FATAL_ERROR " +It is currently only possible to build with megasource on Windows. +Please see http://bitbucket.org/rude/megasource +") +endif() + +set(LOVE_EXE_NAME love) +set(LOVE_LIB_NAME liblove) + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(LOVE_X64 TRUE) + set(LOVE_TARGET_PLATFORM x64) +else() + set(LOVE_X86 TRUE) + set(LOVE_TARGET_PLATFORM x86) +endif() + +message(STATUS "Target platform: ${LOVE_TARGET_PLATFORM}") + +find_package(OpenGL) + +# +# common +# + +set(LOVE_SRC_COMMON + src/common/b64.cpp + src/common/b64.h + src/common/config.h + src/common/Data.h + src/common/delay.cpp + src/common/delay.h + src/common/EnumMap.h + src/common/Exception.cpp + src/common/Exception.h + src/common/int.h + src/common/math.h + src/common/Matrix.cpp + src/common/Matrix.h + src/common/Memoizer.cpp + src/common/Memoizer.h + src/common/Module.cpp + src/common/Module.h + src/common/Object.cpp + src/common/Object.h + src/common/Reference.cpp + src/common/Reference.h + src/common/runtime.cpp + src/common/runtime.h + src/common/StringMap.h + src/common/types.h + src/common/utf8.cpp + src/common/utf8.h + src/common/Variant.cpp + src/common/Variant.h + #src/common/Vector.cpp # Vector.cpp is empty. + src/common/Vector.h + src/common/version.h + src/common/wrap_Data.cpp + src/common/wrap_Data.h +) + +source_group("common" FILES ${LOVE_SRC_COMMON}) + +# +# love.audio +# + +set(LOVE_SRC_MODULE_AUDIO_ROOT + src/modules/audio/Audio.cpp + src/modules/audio/Audio.h + src/modules/audio/Source.cpp + src/modules/audio/Source.h + src/modules/audio/wrap_Audio.cpp + src/modules/audio/wrap_Audio.h + src/modules/audio/wrap_Source.cpp + src/modules/audio/wrap_Source.h +) + +set(LOVE_SRC_MODULE_AUDIO_NULL + src/modules/audio/null/Audio.cpp + src/modules/audio/null/Audio.h + src/modules/audio/null/Source.cpp + src/modules/audio/null/Source.h +) + +set(LOVE_SRC_MODULE_AUDIO_OPENAL + src/modules/audio/openal/Audio.cpp + src/modules/audio/openal/Audio.h + src/modules/audio/openal/Pool.cpp + src/modules/audio/openal/Pool.h + src/modules/audio/openal/Source.cpp + src/modules/audio/openal/Source.h +) + +set(LOVE_SRC_MODULE_AUDIO + ${LOVE_SRC_MODULE_AUDIO_ROOT} + ${LOVE_SRC_MODULE_AUDIO_NULL} + ${LOVE_SRC_MODULE_AUDIO_OPENAL} +) + +source_group("modules\\audio" FILES ${LOVE_SRC_MODULE_AUDIO_ROOT}) +source_group("modules\\audio\\null" FILES ${LOVE_SRC_MODULE_AUDIO_NULL}) +source_group("modules\\audio\\openal" FILES ${LOVE_SRC_MODULE_AUDIO_OPENAL}) + +# +# love.event +# + +set(LOVE_SRC_MODULE_EVENT_ROOT + src/modules/event/Event.cpp + src/modules/event/Event.h +) + +set(LOVE_SRC_MODULE_EVENT_SDL + src/modules/event/sdl/Event.cpp + src/modules/event/sdl/Event.h + src/modules/event/sdl/wrap_Event.cpp + src/modules/event/sdl/wrap_Event.h +) + +set(LOVE_SRC_MODULE_EVENT + ${LOVE_SRC_MODULE_EVENT_ROOT} + ${LOVE_SRC_MODULE_EVENT_SDL} +) + +source_group("modules\\event" FILES ${LOVE_SRC_MODULE_EVENT_ROOT}) +source_group("modules\\event\\sdl" FILES ${LOVE_SRC_MODULE_EVENT_SDL}) + +# +# love.filesystem +# + +set(LOVE_SRC_MODULE_FILESYSTEM_ROOT + src/modules/filesystem/File.cpp + src/modules/filesystem/File.h + src/modules/filesystem/FileData.cpp + src/modules/filesystem/FileData.h +) + +set(LOVE_SRC_MODULE_FILESYSTEM_PHYSFS + src/modules/filesystem/physfs/File.cpp + src/modules/filesystem/physfs/File.h + src/modules/filesystem/physfs/Filesystem.cpp + src/modules/filesystem/physfs/Filesystem.h + src/modules/filesystem/physfs/wrap_File.cpp + src/modules/filesystem/physfs/wrap_File.h + src/modules/filesystem/physfs/wrap_FileData.cpp + src/modules/filesystem/physfs/wrap_FileData.h + src/modules/filesystem/physfs/wrap_Filesystem.cpp + src/modules/filesystem/physfs/wrap_Filesystem.h +) + +set(LOVE_SRC_MODULE_FILESYSTEM + ${LOVE_SRC_MODULE_FILESYSTEM_ROOT} + ${LOVE_SRC_MODULE_FILESYSTEM_PHYSFS} +) + +source_group("modules\\filesystem" FILES ${LOVE_SRC_MODULE_FILESYSTEM_ROOT}) +source_group("modules\\filesystem\\physfs" FILES ${LOVE_SRC_MODULE_FILESYSTEM_PHYSFS}) + +# +# love.font +# + +set(LOVE_SRC_MODULE_FONT_ROOT + src/modules/font/Font.h + src/modules/font/GlyphData.cpp + src/modules/font/GlyphData.h + src/modules/font/ImageRasterizer.cpp + src/modules/font/ImageRasterizer.h + src/modules/font/Rasterizer.cpp + src/modules/font/Rasterizer.h + src/modules/font/wrap_GlyphData.cpp + src/modules/font/wrap_GlyphData.h + src/modules/font/wrap_Rasterizer.cpp + src/modules/font/wrap_Rasterizer.h +) + +set(LOVE_SRC_MODULE_FONT_FREETYPE + src/modules/font/freetype/Font.cpp + src/modules/font/freetype/Font.h + src/modules/font/freetype/TrueTypeRasterizer.cpp + src/modules/font/freetype/TrueTypeRasterizer.h + src/modules/font/freetype/wrap_Font.cpp + src/modules/font/freetype/wrap_Font.h +) + +set(LOVE_SRC_MODULE_FONT + ${LOVE_SRC_MODULE_FONT_ROOT} + ${LOVE_SRC_MODULE_FONT_FREETYPE} +) + +source_group("modules\\font" FILES ${LOVE_SRC_MODULE_FONT_ROOT}) +source_group("modules\\font\\freetype" FILES ${LOVE_SRC_MODULE_FONT_FREETYPE}) + +# +# love.graphics +# + +set(LOVE_SRC_MODULE_GRAPHICS_ROOT + src/modules/graphics/Color.h + src/modules/graphics/Drawable.cpp + src/modules/graphics/Drawable.h + src/modules/graphics/DrawQable.h + src/modules/graphics/Graphics.cpp + src/modules/graphics/Graphics.h + src/modules/graphics/Image.cpp + src/modules/graphics/Image.h + src/modules/graphics/Quad.cpp + src/modules/graphics/Quad.h + src/modules/graphics/Volatile.cpp + src/modules/graphics/Volatile.h +) + +set(LOVE_SRC_MODULE_GRAPHICS_OPENGL + src/modules/graphics/opengl/Canvas.cpp + src/modules/graphics/opengl/Canvas.h + src/modules/graphics/opengl/Font.cpp + src/modules/graphics/opengl/Font.h + src/modules/graphics/opengl/GLee.c + src/modules/graphics/opengl/GLee.h + src/modules/graphics/opengl/Graphics.cpp + src/modules/graphics/opengl/Graphics.h + src/modules/graphics/opengl/Image.cpp + src/modules/graphics/opengl/Image.h + src/modules/graphics/opengl/Mesh.cpp + src/modules/graphics/opengl/Mesh.h + src/modules/graphics/opengl/OpenGL.cpp + src/modules/graphics/opengl/OpenGL.h + src/modules/graphics/opengl/ParticleSystem.cpp + src/modules/graphics/opengl/ParticleSystem.h + src/modules/graphics/opengl/Polyline.cpp + src/modules/graphics/opengl/Polyline.h + src/modules/graphics/opengl/Shader.cpp + src/modules/graphics/opengl/Shader.h + src/modules/graphics/opengl/SpriteBatch.cpp + src/modules/graphics/opengl/SpriteBatch.h + src/modules/graphics/opengl/VertexBuffer.cpp + src/modules/graphics/opengl/VertexBuffer.h + src/modules/graphics/opengl/wrap_Canvas.cpp + src/modules/graphics/opengl/wrap_Canvas.h + src/modules/graphics/opengl/wrap_Font.cpp + src/modules/graphics/opengl/wrap_Font.h + src/modules/graphics/opengl/wrap_Graphics.cpp + src/modules/graphics/opengl/wrap_Graphics.h + src/modules/graphics/opengl/wrap_Image.cpp + src/modules/graphics/opengl/wrap_Image.h + src/modules/graphics/opengl/wrap_Mesh.cpp + src/modules/graphics/opengl/wrap_Mesh.h + src/modules/graphics/opengl/wrap_ParticleSystem.cpp + src/modules/graphics/opengl/wrap_ParticleSystem.h + src/modules/graphics/opengl/wrap_Quad.cpp + src/modules/graphics/opengl/wrap_Quad.h + src/modules/graphics/opengl/wrap_Shader.cpp + src/modules/graphics/opengl/wrap_Shader.h + src/modules/graphics/opengl/wrap_SpriteBatch.cpp + src/modules/graphics/opengl/wrap_SpriteBatch.h +) + +set(LOVE_SRC_MODULE_GRAPHICS + ${LOVE_SRC_MODULE_GRAPHICS_ROOT} + ${LOVE_SRC_MODULE_GRAPHICS_OPENGL} +) + +source_group("modules\\graphics" FILES ${LOVE_SRC_MODULE_GRAPHICS_ROOT}) +source_group("modules\\graphics\\opengl" FILES ${LOVE_SRC_MODULE_GRAPHICS_OPENGL}) + +# +# love.image +# + +set(LOVE_SRC_MODULE_IMAGE_ROOT + src/modules/image/CompressedData.cpp + src/modules/image/CompressedData.h + src/modules/image/Image.h + src/modules/image/ImageData.cpp + src/modules/image/ImageData.h + src/modules/image/wrap_CompressedData.cpp + src/modules/image/wrap_CompressedData.h + src/modules/image/wrap_Image.cpp + src/modules/image/wrap_Image.h + src/modules/image/wrap_ImageData.cpp + src/modules/image/wrap_ImageData.h +) + +set(LOVE_SRC_MODULE_IMAGE_MAGPIE + src/modules/image/magpie/CompressedData.cpp + src/modules/image/magpie/CompressedData.h + src/modules/image/magpie/ddsHandler.cpp + src/modules/image/magpie/ddsHandler.h + src/modules/image/magpie/DevilHandler.cpp + src/modules/image/magpie/DevilHandler.h + src/modules/image/magpie/FormatHandler.h + src/modules/image/magpie/Image.cpp + src/modules/image/magpie/Image.h + src/modules/image/magpie/ImageData.cpp + src/modules/image/magpie/ImageData.h +) + +set(LOVE_SRC_MODULE_IMAGE + ${LOVE_SRC_MODULE_IMAGE_ROOT} + ${LOVE_SRC_MODULE_IMAGE_MAGPIE} +) + +source_group("modules\\image" FILES ${LOVE_SRC_MODULE_IMAGE_ROOT}) +source_group("modules\\image\\magpie" FILES ${LOVE_SRC_MODULE_IMAGE_MAGPIE}) + +# +# love.joystick +# + +set(LOVE_SRC_MODULE_JOYSTICK_ROOT + src/modules/joystick/Joystick.cpp + src/modules/joystick/Joystick.h + src/modules/joystick/JoystickModule.h +) + +set(LOVE_SRC_MODULE_JOYSTICK_SDL + src/modules/joystick/sdl/Joystick.cpp + src/modules/joystick/sdl/Joystick.h + src/modules/joystick/sdl/JoystickModule.cpp + src/modules/joystick/sdl/JoystickModule.h + src/modules/joystick/sdl/wrap_Joystick.cpp + src/modules/joystick/sdl/wrap_Joystick.h + src/modules/joystick/sdl/wrap_JoystickModule.cpp + src/modules/joystick/sdl/wrap_JoystickModule.h +) + +set(LOVE_SRC_MODULE_JOYSTICK + ${LOVE_SRC_MODULE_JOYSTICK_ROOT} + ${LOVE_SRC_MODULE_JOYSTICK_SDL} +) + +source_group("modules\\joystick" FILES ${LOVE_SRC_MODULE_JOYSTICK_ROOT}) +source_group("modules\\joystick\\sdl" FILES ${LOVE_SRC_MODULE_JOYSTICK_SDL}) + +# +# love.keyboard +# + +set(LOVE_SRC_MODULE_KEYBOARD_ROOT + src/modules/keyboard/Keyboard.cpp + src/modules/keyboard/Keyboard.h + src/modules/keyboard/wrap_Keyboard.cpp + src/modules/keyboard/wrap_Keyboard.h +) + +set(LOVE_SRC_MODULE_KEYBOARD_SDL + src/modules/keyboard/sdl/Keyboard.cpp + src/modules/keyboard/sdl/Keyboard.h +) + +set(LOVE_SRC_MODULE_KEYBOARD + ${LOVE_SRC_MODULE_KEYBOARD_ROOT} + ${LOVE_SRC_MODULE_KEYBOARD_SDL} +) + +source_group("modules\\keyboard" FILES ${LOVE_SRC_MODULE_KEYBOARD_ROOT}) +source_group("modules\\keyboard\\sdl" FILES ${LOVE_SRC_MODULE_KEYBOARD_SDL}) + +# +# love.math +# + +set(LOVE_SRC_MODULE_MATH + src/modules/math/BezierCurve.cpp + src/modules/math/BezierCurve.h + src/modules/math/MathModule.cpp + src/modules/math/MathModule.h + src/modules/math/RandomGenerator.cpp + src/modules/math/RandomGenerator.h + src/modules/math/wrap_BezierCurve.cpp + src/modules/math/wrap_BezierCurve.h + src/modules/math/wrap_Math.cpp + src/modules/math/wrap_Math.h + src/modules/math/wrap_RandomGenerator.cpp + src/modules/math/wrap_RandomGenerator.h +) + +source_group("modules\\math" FILES ${LOVE_SRC_MODULE_MATH}) + +# +# love (module) +# +set(LOVE_SRC_MODULE_LOVE + src/modules/love/love.cpp + src/modules/love/love.h +) + +source_group("modules\\love" FILES ${LOVE_SRC_MODULE_LOVE}) + +# +# love.mouse +# + +set(LOVE_SRC_MODULE_MOUSE_ROOT + src/modules/mouse/Cursor.cpp + src/modules/mouse/Cursor.h + src/modules/mouse/Mouse.cpp + src/modules/mouse/Mouse.h + src/modules/mouse/wrap_Cursor.cpp + src/modules/mouse/wrap_Cursor.h + src/modules/mouse/wrap_Mouse.cpp + src/modules/mouse/wrap_Mouse.h +) + +set(LOVE_SRC_MODULE_MOUSE_SDL + src/modules/mouse/sdl/Cursor.cpp + src/modules/mouse/sdl/Cursor.h + src/modules/mouse/sdl/Mouse.cpp + src/modules/mouse/sdl/Mouse.h +) + +set(LOVE_SRC_MODULE_MOUSE + ${LOVE_SRC_MODULE_MOUSE_ROOT} + ${LOVE_SRC_MODULE_MOUSE_SDL} +) + +source_group("modules\\mouse" FILES ${LOVE_SRC_MODULE_MOUSE_ROOT}) +source_group("modules\\mouse\\sdl" FILES ${LOVE_SRC_MODULE_MOUSE_SDL}) + +# +# love.physics +# + +set(LOVE_SRC_MODULE_PHYSICS_ROOT + src/modules/physics/Body.cpp + src/modules/physics/Body.h + src/modules/physics/Joint.cpp + src/modules/physics/Joint.h + src/modules/physics/Shape.cpp + src/modules/physics/Shape.h +) + +set(LOVE_SRC_MODULE_PHYSICS_BOX2D + src/modules/physics/box2d/Body.cpp + src/modules/physics/box2d/Body.h + src/modules/physics/box2d/ChainShape.cpp + src/modules/physics/box2d/ChainShape.h + src/modules/physics/box2d/CircleShape.cpp + src/modules/physics/box2d/CircleShape.h + src/modules/physics/box2d/Contact.cpp + src/modules/physics/box2d/Contact.h + src/modules/physics/box2d/DistanceJoint.cpp + src/modules/physics/box2d/DistanceJoint.h + src/modules/physics/box2d/EdgeShape.cpp + src/modules/physics/box2d/EdgeShape.h + src/modules/physics/box2d/Fixture.cpp + src/modules/physics/box2d/Fixture.h + src/modules/physics/box2d/FrictionJoint.cpp + src/modules/physics/box2d/FrictionJoint.h + src/modules/physics/box2d/GearJoint.cpp + src/modules/physics/box2d/GearJoint.h + src/modules/physics/box2d/Joint.cpp + src/modules/physics/box2d/Joint.h + src/modules/physics/box2d/MotorJoint.cpp + src/modules/physics/box2d/MotorJoint.h + src/modules/physics/box2d/MouseJoint.cpp + src/modules/physics/box2d/MouseJoint.h + src/modules/physics/box2d/Physics.cpp + src/modules/physics/box2d/Physics.h + src/modules/physics/box2d/PolygonShape.cpp + src/modules/physics/box2d/PolygonShape.h + src/modules/physics/box2d/PrismaticJoint.cpp + src/modules/physics/box2d/PrismaticJoint.h + src/modules/physics/box2d/PulleyJoint.cpp + src/modules/physics/box2d/PulleyJoint.h + src/modules/physics/box2d/RevoluteJoint.cpp + src/modules/physics/box2d/RevoluteJoint.h + src/modules/physics/box2d/RopeJoint.cpp + src/modules/physics/box2d/RopeJoint.h + src/modules/physics/box2d/Shape.cpp + src/modules/physics/box2d/Shape.h + src/modules/physics/box2d/WeldJoint.cpp + src/modules/physics/box2d/WeldJoint.h + src/modules/physics/box2d/WheelJoint.cpp + src/modules/physics/box2d/WheelJoint.h + src/modules/physics/box2d/World.cpp + src/modules/physics/box2d/World.h + src/modules/physics/box2d/wrap_Body.cpp + src/modules/physics/box2d/wrap_Body.h + src/modules/physics/box2d/wrap_ChainShape.cpp + src/modules/physics/box2d/wrap_ChainShape.h + src/modules/physics/box2d/wrap_CircleShape.cpp + src/modules/physics/box2d/wrap_CircleShape.h + src/modules/physics/box2d/wrap_Contact.cpp + src/modules/physics/box2d/wrap_Contact.h + src/modules/physics/box2d/wrap_DistanceJoint.cpp + src/modules/physics/box2d/wrap_DistanceJoint.h + src/modules/physics/box2d/wrap_EdgeShape.cpp + src/modules/physics/box2d/wrap_EdgeShape.h + src/modules/physics/box2d/wrap_Fixture.cpp + src/modules/physics/box2d/wrap_Fixture.h + src/modules/physics/box2d/wrap_FrictionJoint.cpp + src/modules/physics/box2d/wrap_FrictionJoint.h + src/modules/physics/box2d/wrap_GearJoint.cpp + src/modules/physics/box2d/wrap_GearJoint.h + src/modules/physics/box2d/wrap_Joint.cpp + src/modules/physics/box2d/wrap_Joint.h + src/modules/physics/box2d/wrap_MotorJoint.cpp + src/modules/physics/box2d/wrap_MotorJoint.h + src/modules/physics/box2d/wrap_MouseJoint.cpp + src/modules/physics/box2d/wrap_MouseJoint.h + src/modules/physics/box2d/wrap_Physics.cpp + src/modules/physics/box2d/wrap_Physics.h + src/modules/physics/box2d/wrap_PolygonShape.cpp + src/modules/physics/box2d/wrap_PolygonShape.h + src/modules/physics/box2d/wrap_PrismaticJoint.cpp + src/modules/physics/box2d/wrap_PrismaticJoint.h + src/modules/physics/box2d/wrap_PulleyJoint.cpp + src/modules/physics/box2d/wrap_PulleyJoint.h + src/modules/physics/box2d/wrap_RevoluteJoint.cpp + src/modules/physics/box2d/wrap_RevoluteJoint.h + src/modules/physics/box2d/wrap_RopeJoint.cpp + src/modules/physics/box2d/wrap_RopeJoint.h + src/modules/physics/box2d/wrap_Shape.cpp + src/modules/physics/box2d/wrap_Shape.h + src/modules/physics/box2d/wrap_WeldJoint.cpp + src/modules/physics/box2d/wrap_WeldJoint.h + src/modules/physics/box2d/wrap_WheelJoint.cpp + src/modules/physics/box2d/wrap_WheelJoint.h + src/modules/physics/box2d/wrap_World.cpp + src/modules/physics/box2d/wrap_World.h +) + +set(LOVE_SRC_MODULE_PHYSICS + ${LOVE_SRC_MODULE_PHYSICS_ROOT} + ${LOVE_SRC_MODULE_PHYSICS_BOX2D} +) + +source_group("modules\\physics" FILES ${LOVE_SRC_MODULE_PHYSICS_ROOT}) +source_group("modules\\physics\\box2d" FILES ${LOVE_SRC_MODULE_PHYSICS_BOX2D}) + +# +# love.sound +# + +set(LOVE_SRC_MODULE_SOUND_ROOT + src/modules/sound/Decoder.h + src/modules/sound/Sound.cpp + src/modules/sound/Sound.h + src/modules/sound/SoundData.cpp + src/modules/sound/SoundData.h + src/modules/sound/wrap_Decoder.cpp + src/modules/sound/wrap_Decoder.h + src/modules/sound/wrap_Sound.cpp + src/modules/sound/wrap_Sound.h + src/modules/sound/wrap_SoundData.cpp + src/modules/sound/wrap_SoundData.h +) + +set(LOVE_SRC_MODULE_SOUND_LULLABY + src/modules/sound/lullaby/Decoder.cpp + src/modules/sound/lullaby/Decoder.h + src/modules/sound/lullaby/FLACDecoder.cpp + src/modules/sound/lullaby/FLACDecoder.h + src/modules/sound/lullaby/GmeDecoder.cpp + src/modules/sound/lullaby/GmeDecoder.h + src/modules/sound/lullaby/ModPlugDecoder.cpp + src/modules/sound/lullaby/ModPlugDecoder.h + src/modules/sound/lullaby/Mpg123Decoder.cpp + src/modules/sound/lullaby/Mpg123Decoder.h + src/modules/sound/lullaby/Sound.cpp + src/modules/sound/lullaby/Sound.h + src/modules/sound/lullaby/VorbisDecoder.cpp + src/modules/sound/lullaby/VorbisDecoder.h + src/modules/sound/lullaby/WaveDecoder.cpp + src/modules/sound/lullaby/WaveDecoder.h +) + +set(LOVE_SRC_MODULE_SOUND + ${LOVE_SRC_MODULE_SOUND_ROOT} + ${LOVE_SRC_MODULE_SOUND_LULLABY} +) + +source_group("modules\\sound" FILES ${LOVE_SRC_MODULE_SOUND_ROOT}) +source_group("modules\\sound\\lullaby" FILES ${LOVE_SRC_MODULE_SOUND_LULLABY}) + +# +# love.system +# + +set(LOVE_SRC_MODULE_SYSTEM_ROOT + src/modules/system/System.cpp + src/modules/system/System.h + src/modules/system/wrap_System.cpp + src/modules/system/wrap_System.h +) + +set(LOVE_SRC_MODULE_SYSTEM_SDL + src/modules/system/sdl/System.cpp + src/modules/system/sdl/System.h +) + +set(LOVE_SRC_MODULE_SYSTEM + ${LOVE_SRC_MODULE_SYSTEM_ROOT} + ${LOVE_SRC_MODULE_SYSTEM_SDL} +) + +source_group("modules\\system" FILES ${LOVE_SRC_MODULE_SYSTEM_ROOT}) +source_group("modules\\system\\sdl" FILES ${LOVE_SRC_MODULE_SYSTEM_SDL}) + +# +# love.thread +# + +set(LOVE_SRC_MODULE_THREAD_ROOT + src/modules/thread/Channel.cpp + src/modules/thread/Channel.h + src/modules/thread/LuaThread.cpp + src/modules/thread/LuaThread.h + src/modules/thread/Thread.h + src/modules/thread/ThreadModule.cpp + src/modules/thread/ThreadModule.h + src/modules/thread/threads.cpp + src/modules/thread/threads.h + src/modules/thread/wrap_Channel.cpp + src/modules/thread/wrap_Channel.h + src/modules/thread/wrap_LuaThread.cpp + src/modules/thread/wrap_LuaThread.h + src/modules/thread/wrap_ThreadModule.cpp + src/modules/thread/wrap_ThreadModule.h +) + +set(LOVE_SRC_MODULE_THREAD_SDL + src/modules/thread/sdl/Thread.cpp + src/modules/thread/sdl/Thread.h + src/modules/thread/sdl/threads.cpp + src/modules/thread/sdl/threads.h +) + +set(LOVE_SRC_MODULE_THREAD + ${LOVE_SRC_MODULE_THREAD_ROOT} + ${LOVE_SRC_MODULE_THREAD_SDL} +) + +source_group("modules\\thread" FILES ${LOVE_SRC_MODULE_THREAD_ROOT}) +source_group("modules\\thread\\sdl" FILES ${LOVE_SRC_MODULE_THREAD_SDL}) + +# +# love.timer +# + +set(LOVE_SRC_MODULE_TIMER_ROOT + src/modules/timer/Timer.h + src/modules/timer/wrap_Timer.cpp + src/modules/timer/wrap_Timer.h +) + +set(LOVE_SRC_MODULE_TIMER_SDL + src/modules/timer/sdl/Timer.cpp + src/modules/timer/sdl/Timer.h +) + +set(LOVE_SRC_MODULE_TIMER + ${LOVE_SRC_MODULE_TIMER_ROOT} + ${LOVE_SRC_MODULE_TIMER_SDL} +) + +source_group("modules\\timer" FILES ${LOVE_SRC_MODULE_TIMER_ROOT}) +source_group("modules\\timer\\sdl" FILES ${LOVE_SRC_MODULE_TIMER_SDL}) + +# +# love.window +# + +set(LOVE_SRC_MODULE_WINDOW_ROOT + src/modules/window/Window.cpp + src/modules/window/Window.h + src/modules/window/wrap_Window.cpp + src/modules/window/wrap_Window.h +) + +set(LOVE_SRC_MODULE_WINDOW_SDL + src/modules/window/sdl/Window.cpp + src/modules/window/sdl/Window.h +) + +set(LOVE_SRC_MODULE_WINDOW + ${LOVE_SRC_MODULE_WINDOW_ROOT} + ${LOVE_SRC_MODULE_WINDOW_SDL} +) + +source_group("modules\\window" FILES ${LOVE_SRC_MODULE_WINDOW_ROOT}) +source_group("modules\\window\\sdl" FILES ${LOVE_SRC_MODULE_WINDOW_SDL}) + +################################### +# Third-party libraries +################################### + +# +# Box2D +# + +set(LOVE_SRC_3P_BOX2D_ROOT + src/libraries/Box2D/Box2D.h +) + +set(LOVE_SRC_3P_BOX2D_COLLISION + src/libraries/Box2D/Collision/b2BroadPhase.cpp + src/libraries/Box2D/Collision/b2BroadPhase.h + src/libraries/Box2D/Collision/b2CollideCircle.cpp + src/libraries/Box2D/Collision/b2CollideEdge.cpp + src/libraries/Box2D/Collision/b2CollidePolygon.cpp + src/libraries/Box2D/Collision/b2Collision.cpp + src/libraries/Box2D/Collision/b2Collision.h + src/libraries/Box2D/Collision/b2Distance.cpp + src/libraries/Box2D/Collision/b2Distance.h + src/libraries/Box2D/Collision/b2DynamicTree.cpp + src/libraries/Box2D/Collision/b2DynamicTree.h + src/libraries/Box2D/Collision/b2TimeOfImpact.cpp + src/libraries/Box2D/Collision/b2TimeOfImpact.h +) + +set(LOVE_SRC_3P_BOX2D_COLLISION_SHAPES + src/libraries/Box2D/Collision/Shapes/b2ChainShape.cpp + src/libraries/Box2D/Collision/Shapes/b2ChainShape.h + src/libraries/Box2D/Collision/Shapes/b2CircleShape.cpp + src/libraries/Box2D/Collision/Shapes/b2CircleShape.h + src/libraries/Box2D/Collision/Shapes/b2EdgeShape.cpp + src/libraries/Box2D/Collision/Shapes/b2EdgeShape.h + src/libraries/Box2D/Collision/Shapes/b2PolygonShape.cpp + src/libraries/Box2D/Collision/Shapes/b2PolygonShape.h + src/libraries/Box2D/Collision/Shapes/b2Shape.h +) + +set(LOVE_SRC_3P_BOX2D_COMMON + src/libraries/Box2D/Common/b2BlockAllocator.cpp + src/libraries/Box2D/Common/b2BlockAllocator.h + src/libraries/Box2D/Common/b2Draw.cpp + src/libraries/Box2D/Common/b2Draw.h + src/libraries/Box2D/Common/b2GrowableStack.h + src/libraries/Box2D/Common/b2Math.cpp + src/libraries/Box2D/Common/b2Math.h + src/libraries/Box2D/Common/b2Settings.cpp + src/libraries/Box2D/Common/b2Settings.h + src/libraries/Box2D/Common/b2StackAllocator.cpp + src/libraries/Box2D/Common/b2StackAllocator.h + src/libraries/Box2D/Common/b2Timer.cpp + src/libraries/Box2D/Common/b2Timer.h +) + +set(LOVE_SRC_3P_BOX2D_DYNAMICS + src/libraries/Box2D/Dynamics/b2Body.cpp + src/libraries/Box2D/Dynamics/b2Body.h + src/libraries/Box2D/Dynamics/b2ContactManager.cpp + src/libraries/Box2D/Dynamics/b2ContactManager.h + src/libraries/Box2D/Dynamics/b2Fixture.cpp + src/libraries/Box2D/Dynamics/b2Fixture.h + src/libraries/Box2D/Dynamics/b2Island.cpp + src/libraries/Box2D/Dynamics/b2Island.h + src/libraries/Box2D/Dynamics/b2TimeStep.h + src/libraries/Box2D/Dynamics/b2World.cpp + src/libraries/Box2D/Dynamics/b2World.h + src/libraries/Box2D/Dynamics/b2WorldCallbacks.cpp + src/libraries/Box2D/Dynamics/b2WorldCallbacks.h +) + +set(LOVE_SRC_3P_BOX2D_DYNAMICS_CONTACTS + src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp + src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h + src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp + src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h + src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.cpp + src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.h + src/libraries/Box2D/Dynamics/Contacts/b2Contact.cpp + src/libraries/Box2D/Dynamics/Contacts/b2Contact.h + src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.cpp + src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.h + src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp + src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h + src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp + src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h + src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp + src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h + src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.cpp + src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.h +) + +set(LOVE_SRC_3P_BOX2D_DYNAMICS_JOINTS + src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.h + src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.h + src/libraries/Box2D/Dynamics/Joints/b2GearJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2GearJoint.h + src/libraries/Box2D/Dynamics/Joints/b2Joint.cpp + src/libraries/Box2D/Dynamics/Joints/b2Joint.h + src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.h + src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.h + src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.h + src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.h + src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.h + src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.h + src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.h + src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.cpp + src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.h +) + +set(LOVE_SRC_3P_BOX2D_ROPE + src/libraries/Box2D/Rope/b2Rope.cpp + src/libraries/Box2D/Rope/b2Rope.h +) + +set(LOVE_SRC_3P_BOX2D + ${LOVE_SRC_3P_BOX2D_ROOT} + ${LOVE_SRC_3P_BOX2D_COLLISION} + ${LOVE_SRC_3P_BOX2D_COLLISION_SHAPES} + ${LOVE_SRC_3P_BOX2D_COMMON} + ${LOVE_SRC_3P_BOX2D_DYNAMICS} + ${LOVE_SRC_3P_BOX2D_DYNAMICS_CONTACTS} + ${LOVE_SRC_3P_BOX2D_DYNAMICS_JOINTS} + ${LOVE_SRC_3P_BOX2D_ROPE} +) + +add_library(love_3p_box2d ${LOVE_SRC_3P_BOX2D}) + +# +# ddsparse +# + +set(LOVE_SRC_3P_DDSPARSE + src/libraries/ddsparse/ddsinfo.h + src/libraries/ddsparse/ddsparse.cpp + src/libraries/ddsparse/ddsparse.h +) + +add_library(love_3p_ddsparse ${LOVE_SRC_3P_DDSPARSE}) + +# +# enet +# + +set(LOVE_SRC_3P_ENET_ROOT + src/libraries/enet/enet.cpp + src/libraries/enet/lua-enet.h +) + +set(LOVE_SRC_3P_ENET_LIBENET + src/libraries/enet/libenet/callbacks.c + src/libraries/enet/libenet/compress.c + src/libraries/enet/libenet/host.c + src/libraries/enet/libenet/list.c + src/libraries/enet/libenet/packet.c + src/libraries/enet/libenet/peer.c + src/libraries/enet/libenet/protocol.c + src/libraries/enet/libenet/unix.c + src/libraries/enet/libenet/win32.c +) + +set(LOVE_SRC_3P_ENET_LIBENET_INCLUDE_ENET + src/libraries/enet/libenet/include/enet/enet.h + src/libraries/enet/libenet/include/enet/list.h + src/libraries/enet/libenet/include/enet/protocol.h + src/libraries/enet/libenet/include/enet/time.h + src/libraries/enet/libenet/include/enet/types.h + src/libraries/enet/libenet/include/enet/unix.h + src/libraries/enet/libenet/include/enet/utility.h + src/libraries/enet/libenet/include/enet/win32.h +) + +set(LOVE_SRC_3P_ENET + ${LOVE_SRC_3P_ENET_ROOT} + ${LOVE_SRC_3P_ENET_LIBENET} + ${LOVE_SRC_3P_ENET_LIBENET_INCLUDE_ENET} +) + +add_library(love_3p_enet ${LOVE_SRC_3P_ENET}) +target_link_libraries(love_3p_enet ${MEGA_LUA51}) +target_include_directories(love_3p_enet PUBLIC src/libraries/enet/libenet/include) + +# +# luasocket +# + +set(LOVE_SRC_3P_LUASOCKET_ROOT + src/libraries/luasocket/luasocket.cpp + src/libraries/luasocket/luasocket.h +) + +set(LOVE_SRC_3P_LUASOCKET_LIBLUASOCKET + src/libraries/luasocket/libluasocket/auxiliar.c + src/libraries/luasocket/libluasocket/auxiliar.h + src/libraries/luasocket/libluasocket/buffer.c + src/libraries/luasocket/libluasocket/buffer.h + src/libraries/luasocket/libluasocket/except.c + src/libraries/luasocket/libluasocket/except.h + src/libraries/luasocket/libluasocket/ftp.lua.h + src/libraries/luasocket/libluasocket/http.lua.h + src/libraries/luasocket/libluasocket/inet.c + src/libraries/luasocket/libluasocket/inet.h + src/libraries/luasocket/libluasocket/io.c + src/libraries/luasocket/libluasocket/io.h + src/libraries/luasocket/libluasocket/ltn12.lua.h + src/libraries/luasocket/libluasocket/lua.h + src/libraries/luasocket/libluasocket/luasocket.c + src/libraries/luasocket/libluasocket/luasocket.h + src/libraries/luasocket/libluasocket/mime.c + src/libraries/luasocket/libluasocket/mime.h + src/libraries/luasocket/libluasocket/mime.lua.h + src/libraries/luasocket/libluasocket/options.c + src/libraries/luasocket/libluasocket/options.h + src/libraries/luasocket/libluasocket/select.c + src/libraries/luasocket/libluasocket/select.h + src/libraries/luasocket/libluasocket/smtp.lua.h + src/libraries/luasocket/libluasocket/socket.h + src/libraries/luasocket/libluasocket/socket.lua.h + src/libraries/luasocket/libluasocket/tcp.c + src/libraries/luasocket/libluasocket/tcp.h + src/libraries/luasocket/libluasocket/timeout.c + src/libraries/luasocket/libluasocket/timeout.h + src/libraries/luasocket/libluasocket/tp.lua.h + src/libraries/luasocket/libluasocket/udp.c + src/libraries/luasocket/libluasocket/udp.h + src/libraries/luasocket/libluasocket/url.lua.h +) + +if(MSVC) + set(LOVE_SRC_3P_LUASOCKET_LIBLUASOCKET + ${LOVE_SRC_3P_LUASOCKET_LIBLUASOCKET} + src/libraries/luasocket/libluasocket/wsocket.c + src/libraries/luasocket/libluasocket/wsocket.h + ) +endif() + +set(LOVE_SRC_3P_LUASOCKET + ${LOVE_SRC_3P_LUASOCKET_ROOT} + ${LOVE_SRC_3P_LUASOCKET_LIBLUASOCKET} +) + +add_library(love_3p_luasocket ${LOVE_SRC_3P_LUASOCKET}) +target_link_libraries(love_3p_luasocket ${MEGA_LUA51}) + +# +# noise1234 +# + +set(LOVE_SRC_3P_NOISE1234 + src/libraries/noise1234/simplexnoise1234.cpp + src/libraries/noise1234/simplexnoise1234.h +) + +add_library(love_3p_noise1234 ${LOVE_SRC_3P_NOISE1234}) + +# +# utf8 +# + +set(LOVE_SRC_3P_UTF8_ROOT src/libraries/utf8/utf8.h) + +set(LOVE_SRC_3P_UTF8_UTF8 + src/libraries/utf8/utf8/checked.h + src/libraries/utf8/utf8/core.h + src/libraries/utf8/utf8/unchecked.h +) + +set(LOVE_SRC_3P_UTF8 + ${LOVE_SRC_3P_UTF8_ROOT} + ${LOVE_SRC_3P_UTF8_UTF8} +) + +# This library is all headers ... so there is no need to +# add_library() here. + +# +# Wuff +# + +set(LOVE_SRC_3P_WUFF + src/libraries/Wuff/wuff.c + src/libraries/Wuff/wuff.h + src/libraries/Wuff/wuff_config.h + src/libraries/Wuff/wuff_convert.c + src/libraries/Wuff/wuff_convert.h + src/libraries/Wuff/wuff_internal.c + src/libraries/Wuff/wuff_internal.h + src/libraries/Wuff/wuff_memory.c +) + +add_library(love_3p_wuff ${LOVE_SRC_3P_WUFF}) + +set(LOVE_3P + love_3p_box2d + love_3p_ddsparse + love_3p_enet + love_3p_luasocket + love_3p_noise1234 + love_3p_wuff +) + +disable_warnings(love_3p_box2d love_3p_enet love_3p_luasocket) + +# +# liblove +# +set(LOVE_LIB_SRC + ${LOVE_SRC_COMMON} + # Modules + ${LOVE_SRC_MODULE_AUDIO} + ${LOVE_SRC_MODULE_EVENT} + ${LOVE_SRC_MODULE_FILESYSTEM} + ${LOVE_SRC_MODULE_FONT} + ${LOVE_SRC_MODULE_GRAPHICS} + ${LOVE_SRC_MODULE_IMAGE} + ${LOVE_SRC_MODULE_JOYSTICK} + ${LOVE_SRC_MODULE_KEYBOARD} + ${LOVE_SRC_MODULE_LOVE} + ${LOVE_SRC_MODULE_MATH} + ${LOVE_SRC_MODULE_MOUSE} + ${LOVE_SRC_MODULE_PHYSICS} + ${LOVE_SRC_MODULE_SOUND} + ${LOVE_SRC_MODULE_SYSTEM} + ${LOVE_SRC_MODULE_THREAD} + ${LOVE_SRC_MODULE_TIMER} + ${LOVE_SRC_MODULE_WINDOW} +) + +include_directories( + src + src/libraries + src/modules +) + +# SDL2 links with some DirectX libraries, and we apparently also +# pull those libraries in for linkage because we link with SDL2. +link_directories(${SDL_LINK_DIR}) + +set(LOVE_LINK_LIBRARIES + ${OPENGL_gl_LIBRARY} + ${MEGA_3P} +) + +set(LOVE_RC) + +if(MSVC) + set(LOVE_LINK_LIBRARIES ${LOVE_LINK_LIBRARIES} + ws2_32.lib + winmm.lib + ) + + set(LOVE_RC + platform/msvc2010/love.rc + platform/msvc2010/love.ico + ) +endif() + +add_library(${LOVE_LIB_NAME} SHARED ${LOVE_LIB_SRC} ${LOVE_RC}) +target_link_libraries(liblove ${LOVE_LINK_LIBRARIES} ${LOVE_3P}) + +if(MSVC) + set_target_properties(${LOVE_LIB_NAME} PROPERTIES RELEASE_OUTPUT_NAME "love") + set_target_properties(${LOVE_LIB_NAME} PROPERTIES DEBUG_OUTPUT_NAME "love") +endif() + +# +# love (executable) +# +add_executable(${LOVE_EXE_NAME} WIN32 src/love.cpp ${LOVE_RC}) +target_link_libraries(love liblove) + +# Add post build steps to move the DLLs next to the binary. Otherwise +# running/debugging the binary will not work from inside VS. +add_move_dll(love ${MEGA_MPEG123}) +add_move_dll(love ${MEGA_SDL2}) +add_move_dll(love ${MEGA_OPENAL}) +add_move_dll(love ${MEGA_DEVIL}) +add_move_dll(love ${MEGA_LUA51}) + +################################### +# Version +################################### + +# Extract version.h contents. +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/src/common/version.h LOVE_VERSION_FILE_CONTENTS) + +# Extract one of LOVE_VERSION_MAJOR/MINOR/REV. +function(match_version ARG_STRING OUT_VAR) + string(REGEX MATCH "VERSION_${ARG_STRING} = ([0-9]+);" TMP_VER "${LOVE_VERSION_FILE_CONTENTS}") + string(REGEX MATCH "[0-9]+" TMP_VER "${TMP_VER}") + set(${OUT_VAR} ${TMP_VER} PARENT_SCOPE) +endfunction() + +match_version("MAJOR" LOVE_VERSION_MAJOR) +match_version("MINOR" LOVE_VERSION_MINOR) +match_version("REV" LOVE_VERSION_REV) + +set(LOVE_VERSION_STR "${LOVE_VERSION_MAJOR}.${LOVE_VERSION_MINOR}.${LOVE_VERSION_REV}") + +message(STATUS "Version: ${LOVE_VERSION_STR}") + +################################### +# CPack +################################### +install(TARGETS love ${LOVE_LIB_NAME} RUNTIME DESTINATION .) + +# Dynamic runtime libs. +if(MEGA_MSVC_DLLS) + foreach(DLL ${MEGA_MSVC_DLLS}) + get_filename_component(DLL_NAME ${DLL} NAME) + message(STATUS "Runtime DLL: ${DLL_NAME}") + endforeach() + install(FILES ${MEGA_MSVC_DLLS} DESTINATION .) +endif() + +# Copy a text file from CMAKE_CURRENT_SOURCE_DIR to CMAKE_CURRENT_BINARY_DIR. +# On Windows, this function will convert line endings to CR,LF. +function(copy_text_file ARG_FILE_IN ARG_FILE_OUT) + file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_FILE_IN} TMP_TXT_CONTENTS) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${ARG_FILE_OUT} ${TMP_TXT_CONTENTS}) +endfunction() + +# Text files. +copy_text_file(readme.md readme.txt) +copy_text_file(license.txt license.txt) +copy_text_file(changes.txt changes.txt) + +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/changes.txt + ${CMAKE_CURRENT_BINARY_DIR}/license.txt + ${CMAKE_CURRENT_BINARY_DIR}/readme.txt + DESTINATION .) + +set(CPACK_GENERATOR ZIP NSIS) +set(CPACK_PACKAGE_NAME "love") +set(CPACK_PACKAGE_VENDOR "love2d.org") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LOVE -- It's awesome") +set(CPACK_PACKAGE_VERSION "${LOVE_VERSION_STR}") +set(CPACK_PACKAGE_VERSION_MAJOR "${LOVE_VERSION_MAJOR}") +set(CPACK_PACKAGE_VERSION_MINOR "${LOVE_VERSION_MINOR}") +set(CPACK_PACKAGE_VERSION_PATCH "${LOVE_VERSION_REV}") +set(CPACK_PACKAGE_INSTALL_DIRECTORY "LOVE") +set(CPACK_PACKAGE_EXECUTABLES "love;LOVE") +set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/readme.md") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/license.txt") + +set(CPACK_NSIS_EXECUTABLES_DIRECTORY .) +set(CPACK_NSIS_PACKAGE_NAME "LÖVE") +set(CPACK_NSIS_DISPLAY_NAME "LÖVE ${LOVE_VERSION_STR}") +set(CPACK_NSIS_MODIFY_PATH OFF) + +if(LOVE_X64) + set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") +else() + set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES") +endif() + +set(CPACK_NSIS_MENU_LINKS "http://love2d.org/wiki" "Documentation") + +# Some bug somewhere in NSIS requires "\\\\" somewhere in the path, +# according to The Internet. (And sure enough, it does not work +# without it). +set(NSIS_LEFT_BMP "${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis\\\\left.bmp") +set(NSIS_TOP_BMP "${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis\\\\top.bmp") +set(NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis\\\\love.ico") +set(NSIS_MUI_UNICON "${CMAKE_CURRENT_SOURCE_DIR}/extra/nsis\\\\love.ico") + +set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE " + !define MUI_WELCOMEPAGE_TITLE \\\"LÖVE ${LOVE_VERSION_STR} Setup\\\" + !define MUI_WELCOMEFINISHPAGE_BITMAP \\\"${NSIS_LEFT_BMP}\\\" + !define MUI_HEADERIMAGE_BITMAP \\\"${NSIS_TOP_BMP}\\\" + !define MUI_ICON \\\"${NSIS_MUI_ICON}\\\" + !define MUI_UNICON \\\"${NSIS_MUI_UNICON}\\\" +") + +include(CPack) diff --git a/jni/love/changes.txt b/jni/love/changes.txt new file mode 100644 index 00000000..0efd25e8 --- /dev/null +++ b/jni/love/changes.txt @@ -0,0 +1,673 @@ +LOVE 0.9.0 [Baby Inspector] +--------------------------- + + Released: N/A + + * Added better multiplayer networking support via ENet. + * Added --fused command line argument, to simulate fusing. + * Added liblove. + * Added the ability to have exit values. + * Added exit value of 1 in case of error by default. + * Added basic support for the file:// uri scheme. + * Added love.filesystem.isFused. + * Added love.filesystem.getIdentity. + * Added love.filesystem.append. + * Added love.filesystem.getSize. + * Added love.filesystem.mount and love.filesystem.unmount. + * Added optional file search order parameter to love.filesystem.setIdentity. + * Added File:isOpen and File:getMode. + * Added Fie:setBuffer, File:getBuffer, and File:flush. + * Added textinput event for unicode text input. + * Added love.keyboard.setTextInput and love.keyboard.hasTextInput. + * Added previously internal Rasterizer and GlyphData object methods. + * Added support for UTF-8 ImageFonts. + * Added Font:getAscent/getDescent/getBaseline. + * Added Font:setFilter/getFilter. + * Added Font:hasGlyphs. + * Added angle, scale, and shear parameters to love.graphics.printf. + * Added HDR canvas support. + * Added mipmapping support (has isSupported test). + * Added vertex shader support. + * Added boolean support to Shader:send. + * Added Canvas:getPixel. + * Added blend mode "replace". + * Added line join modes. + * Added Mesh objects, allowing for arbitrary textured polygons. + * Added multiple render target support to love.graphics.setCanvas. + * Added love.graphics.setColorMask. + * Added love.graphics.origin. + * Added love.graphics.getRendererInfo. + * Added love.graphics.getMaxImageSize. + * Added SpriteBatch:getCount and SpriteBatch:getBufferSize. + * Added SpriteBatch:getColor. + * Added ParticleSystem:emit. + * Added ParticleSystem:setInsertMode and ParticleSystem:getInsertMode. + * Added many ParticleSystem getter methods. + * Added DXT compressed texture support via love.image.newCompressedData. + * Added love.image.isCompressed and Image:isCompressed. + * Added Image/Canvas/ImageData:getDimensions. + * Added anisotropic filtering support for Images, Canvases, and Fonts. + * Added Image:refresh. + * Added Image:getData. + * Added SoundData:getDuration and SoundData:getSampleCount. + * Added Source:isPlaying. + * Added Source:setRelative and Source:isRelative. + * Added Source:setCone and Source:getCone. + * Added Source:getChannels. + * Added new Channels API for love.thread. + * Added limited table support to Channel:push. + * Added Thread:getError. + * Added Thread:isRunning. + * Added threaderror event. + * Added love.math module. + * Added a platform-independent (good) random implementation to love.math. + * Added RandomGenerator objects. + * Added BezierCurve objects. + * Added love.math.triangulate and love.math.isConvex. + * Added love.math.noise. + * Added love.timer.getAverageDelta. + * Added Data:getString. + * Added Contact:getChildren. + * Added love.system module. + * Added love.system.getClipboardText and love.system.setClipboardText. + * Added love.system.getOS and love.system.getProcessorCount. + * Added love.window module. + * Added love.window.isVisible. + * Added flags to love.window.setMode. + * Added monitor choosing support to love.window.setMode. + * Added support for resizable, borderless, and non-centered windows. + * Added support for "fullscreen-desktop" mode. + * Added window resize and visible events. + * Added love.window.getDimensions. + * Added love.window.getIcon. + * Added t.window.icon to love.conf. + * Added love.mousefocus and love.window.hasMouseFocus. + * Added custom hardware cursors via love.mouse.newCursor. + * Added love.mouse.setX/setY. + * Added Joystick objects. + * Added love.joystick.getJoystick. + * Added joystick connect and disconnect events. + * Added joystickaxis and joystickhat events. + * Added unified Gamepad API for joysticks which have a similar layout to the Xbox controller. + * Added joystick vibration support, works with most common gamepads. + * OPTIONAL: Added support for Game Music Emu. + + * Fixed fused mode in OS X. + * Fixed printing to the console in Windows before love.load is called. + * Fixed the default love.run to not include the time taken by love.load in the first frame's dt. + * Fixed the error screen not always appearing until the next input event. + * Fixed love.event.clear. + * Fixed love.mouse.setPosition when called in love.load. + * Fixed scaling in several love.physics functions. + * Fixed Box2D exception in World:update. + * Fixed many uncaught Box2D / love.physics exceptions for Bodies and Joints. + * Fixed ChainShape:getPoints running out of Lua stack space and crashing. + * Fixed File:read reading past end of file. + * Fixed love.filesystem.setIdentity not removing read access from old directories. + * Fixed possible memory leak in utf-8 decoder. + * Fixed spacing for the last character in an ImageFont. + * Fixed line wrapping in love.graphics.printf. + * Fixed love.graphics.printf to error if the wrap limit is negative. + * Fixed love.graphics.print truncating strings with embedded zeros. + * Fixed crashes with font drawing on some ATI cards. + * Fixed artifacts when drawing lines at huge scale. + * Fixed Fonts and Canvases ignoring default image filter. + * Fixed scissor boxes when a canvas is set after love.graphics.setScissor is called. + * Fixed love.graphics.getLineWidth returning incorrect values. + * Fixed love.graphics.getColor on some Windows systems. + * Fixed alpha blend mode. + * Fixed multiplicative blend mode. + * Fixed love.graphics.getPointStyle. + * Fixed line numbers in shader errors. + * Fixed Shader:send with Images and Canvases failing sometimes. + * Fixed Shader:send to keep a reference to sent Images and Canvases. + * Fixed crash when binding SpriteBatches multiple times. + * Fixed SpriteBatches with more than 16,384 sprites. + * Fixed particle draw order for ParticleSystems. + * Fixed ParticleSystem:setSizes resetting the size variation. + * Fixed the graphics viewport not matching the window size when using an unsupported fullscreen mode. + * Fixed getMode and friends returning wrong values when using desktop size. + * Fixed keyrepeat settings being lost after (indirect) setMode. + * Fixed the icon being reset after setMode. + * Fixed memory leak in the mp3 decoder. + * Fixed sound issues with some versions of OpenAL soft, by enabling direct channels. + * Fixed 'random' hangs in audio. + * Fixed love.sound.newDecoder not accepting FileData. + * Fixed case (in)sensitivity of sound file extension parsing. + * Fixed looping support in tracker music formats. + * Fixed skipping/looping issues when playing streaming audio Sources. + * Fixed race condition in Source:play. + * Fixed WAVE sound playback. + + * Moved love's startup to modules/love. + * Moved window-related functions from love.graphics to love.window. + + * Renamed love's boot script to 'love.boot', which can be required. + * Renamed love.filesystem.mkdir to love.filesystem.createDirectory. + * Renamed love.filesystem.enumerate to love.filesystem.getDirectoryItems. + * Renamed World:setAllowSleeping to World:setSleepingAllowed. + * Renamed ChainShape:setPrevVertex to ChainShape:setPreviousVertex. + * Renamed Joint:enableMotor to Joint:setMotorEnabled. + * Renamed Joint:enableLimit and Joint:isLimitEnabled to Joint:setLimitsEnabled and Joint:hasLimitsEnabled. + * Renamed t.screen to t.window in love.conf. + * Renamed love.graphics.setCaption to love.window.setTitle. + * Renamed PixelEffect to Shader (but now with vertex shaders). + * Renamed love.graphics.setDefaultImageFilter to love.graphics.setDefaultFilter. + * Renamed ParticleSystem:setSprite to ParticleSystem:setImage. + * Renamed ParticleSystem:setGravity to ParticleSystem:setLinearAcceleration. + * Renamed ParticleSystem:setLifetime/setParticleLife to setEmitter/ParticleLifetime. + * Renamed ParticleSystem:count and all getNum* functions to get*Count. + * Renamed Source:setDistance to Source:setAttenuationDistances. + * Renamed SoundData:getBits and Decoder:getBits to SoundData:getBitDepth and Decoder:getBitDepth. + * Renamed love.mouse.setGrab to love.mouse.setGrabbed. + + * Removed release mode. + * Removed love.keyboard.getKeyRepeat (see love.keyboard.hasKeyRepeat). + * Removed the unicode argument from love.keypressed (see love.textinput). + * Removed love.graphics.drawTest. + * Removed love.graphics.quad/triangle. + * Removed love.graphics.setColorMode. + * Removed love.graphics.newStencil. + * Removed love.graphics.setLine/setPoint. + * Removed love.graphics.drawq (functionality is merged into love.graphics.draw). + * Removed SpriteBatch:addq/setq (functionality is merged into SpriteBatch:add/set). + * Removed Quad:flip. + * Removed ParticleSystem:isFull/isEmpty. + * Removed ParticleSystem:getX/getY. + * Removed love.graphics.checkMode. + * Removed love.joystick.open and friends. + * Removed love.joystick module functions which operated on individual joysticks (see Joystick objects). + * Removed joystick ball support. + * Removed thread names. + * Removed old thread messaging API (see Channels). + * Removed love.timer.getMicroTime. + + * Updated functions which return love objects to re-use the Lua-side object instead of always recreating it. + * Updated the windows console, it now tries to re-use an active one first. + * Updated error handling, error handlers now get resolved when the error occurs. + * Updated order of sleep/present in love.run (now draws, *then* sleeps). + * Updated love.filesystem to try to create the appdata directory if it doesn't exist yet. + * Updated the default filesystem identity to omit file extension. + * Updated love.filesystem.newFile to optionally open the file. + * Updated most love.filesystem functions to return nil, error on internal failure. + * Updated love.keyboard.setKeyRepeat to take a boolean argument instead of numbers. + * Updated love.keypressed's second argument to be a boolean indicating key repeat. + * Updated keyboard key constants for some more modern keyboard keys. + * Updated window code to use adaptive vsync when available, if vsync is enabled. + * updated love.graphics.print's x and y arguments to default to 0. + * Updated the setFilter and setWrap methods, the second argument is now optional. + * Updated Font and ParticleSystem rendering code, now more performant. + * Updated SpriteBatch code, now more performant when adding/setting and (un)binding. + * Updated Canvas code to support more systems. + * Updated Canvas:getImageData and love.graphics.newScreenshot to be more efficient. + * Updated love.graphics.newScreenshot to create a fully opaque image by default. + * Updated error messages when sending bad values to Shaders. + * Updated love.graphics.newParticleSystem to have a default buffer size of 1000. + * Updated ImageData:setPixel to accept a table and default to 255 alpha. + * Updated ImageData:mapPixel, is now more efficient and accepts optional x,y,w,h arguments. + * Updated love.image memory handling, improves errors and thread-safety. + * Updated all love object constructors to optionally accept FileData if they accept a filename. + * Updated allocation for SoundData, it's more efficient and less wasteful. + * Updated SoundData:set/getSample to error for invalid samples. + * Updated Source:set* functions to default z to 0. + * Updated Source:seek to error for negative offsets. + * Updated Thread:start to accept arguments which get passed to the thread. + * Updated love.timer.getFPS to be microsecond-accurate. + * Updated love.timer.getTime to be microsecond-accurate and monotonic. + * Updated Box2D to version 2.3.0. + +LOVE 0.8.0 [Rubber Piggy] +------------------------- + + Released: 2012-04-02 + + * Added release error screen. + * Added alpha to love.graphics.setBackgroundColor. + * Added Canvas:clear(r, g, b, a). + * Added Canvas support to love.graphics.drawq. + * Added Canvas:getWidth and Canvas:getHeight. + * Added love.graphics.arc. + * Added seek and tell to Source objects. + * Added color interpolation to ParticleSystem. + * Added automatic PO2 padding for systems not supporting the OpenGL extension. + * Added UTF-8 support for fonts. + * Added Box2D error handling for some commonly failing functions. + * Added ability for fused release games to have their write dir in appdata. + * Added shear transformation to drawing functions. + * Added origin to font printing. + * Added love.graphics.getMode. + * Added per-sprite colors on SpriteBatches. + * Added PixelEffects. + * Added love.graphics.isSupported. + * Added love.graphics.getCanvas. + * Added love.event.quit. + * Added stencil masks. + * Added alternative SpriteBatch provider, it should work everywhere now. + * Added a loader for binary modules. + * Added Thread:getKeys. + * Added option of fractions for Quads. + * Added PNG, JPEG and GIF support to ImageData:encode. + * Added 64-bit support for Mac OS X. + * Added premultiplied blending mode. + * Added functions to set/get default image filter modes. + * Added SpriteBatch:set. + * Added new events system, with support for custom events and long event names. + * Added sound attenuation by distance. + * Added SpriteBatch:getImage. + * Added combine color mode. + * Added automatic random seeding to love.run. + * Added support for the subtract BlendMode on older graphics cards. + * Added love._os field, which contains the OS the game is running on. + + * Fixed wrapping for single words. + * Fixed tracebacks not showing filenames. + * Fixed love.graphics.push/pop capable of causing overflows/underflows. + * Fixed setScissor on Canvases. + * Fixed several issues with audio, e.g. clicks and pops in mp3s. + * Fixed crashes when bodies were destroyed during collisions. + * Fixed bound SpriteBatches corrupting when drawing. + * Fixed thread-safety issues with ImageData. + * Fixed memory leaks in audio sources. + * Fixed thread's set (previously send) accidentally changing the type. + * Fixed SoundData allocating the wrong number of samples. + * Fixed SpriteBatch support on Intel cards. + * Fixed love.filesystem.lines() leaking. + * Fixed most leaking on unclosed File objects. + * Fixed crashes when operating on non-existent files. + * Fixed a bug where empty files on windows would never reach eof. + * Fixed crash when SoundData runs out of memory. + * Fixed ordering of loaders, love should have priority over lua. + * Fixed several miscellaneous memory leaks. + * Fixed a few cases where strings with \0 in them would not be stored correctly. + * Fixed love's startup time being in the first dt. + * Fixed internal string conversions, they are faster now. + * Fixed (bad) performance of ImageData:paste. + * Fixed love.graphics.toggleFullscreen not maintaining graphics state. + + * Renamed SpriteBatch's lock/unlock to bind/unbind. + * Renamed Framebuffer to Canvas. + * Renamed love.thread.send/receive to set/get. + * Renamed love.graphics.setRenderTarget to setCanvas. + + * Removed canvas auto-clearing. + * Removed EncodedImageData. + * Removed old syntax for require (with extension). + * Removed love.graphics.setFont([file], [size]). + * Removed Thread:kill. + + * Updated love.joystick to be 1-indexed. + * Updated Sources to update more cleanly and control more intuitively. + * Updated font engine. + * Updated line drawing to a custom system. + * Updated love.timer.sleep to use seconds, like the rest of love. + * Updated love.timer to be more accurate. + * Updated love.graphics.circle to have max(10, r) as default for segments. + * Updated ImageData:encode to write to files directly. + * Updated version compatibility system to actually do something. + * Updated love.run's order, events are checked just before update. + * Updated Box2D to version 2.2.1. + +LOVE 0.7.2 [Game Slave] +----------------------- + + Released: 2011-05-04 + + * Added Framebuffer:get/setWrap. + * Added love.event.clear. + * Added support for any number of arguments to love.keyboard.isDown, love.mouse.isDown and love.joystick.isDown. + * Added SpriteBatch:setImage(). + + * Fixed fused games not working. + * Fixed ParticleSystem:setSize ignoring the variation argument. + * Fixed some file-opening exceptions not being caught. + * Fixed files loaded by libmodplug being too loud. + * Fixed paths with periods in them not working. + * Fixed love.graphics.getBlendMode not detecting subtractive and multiplicative blend modes. + * Fixed crash when there was no memory available for newImageData(w, h). + + * Updated PhysicsFS version to 2.0.2 on Windows + * Updated OpenAL Soft version to 1.13 on Windows + * Updated libmodplug version to 0.8.8.1 on Windows + * Updated FreeType version to 2.4.4 on Windows + * Updated libmpg123 version to 1.13.2 on Windows + * Windows binary no longer depends on VC2005 runtime. + * Windows binary no longer depends on SSE2 support. + +LOVE 0.7.1 [Game Slave] +----------------------- + + Released: 2011-02-14 + + * Added source:isPaused() + * Added error when initial window can't be created. + * Added framebuffer filter modes. + * Added love.filesystem.getLastModified. + * Added filter modes for ImageFonts. + * Added dead key support by using "unknown" key with correct unicode value. + * Added 0 width and height in love.conf. (for current desktop resolution) + * Added alpha support when encoding TGA images. + + * Fixed a lot of bugs regarding zero characters in threads. + * Fixed handling of a directory named "love" in current directory. + * Fixed a few unhandled errors in setScissor. + * Fixed a bug where old physics callbacks were never dereferenced. + * Fixed loss of mouse visibility settings on setMode. + * Fixed creation of a framebuffer unbinding current framebuffer. + * Fixed several race conditions in love.thread. + * Fixed 'love .', so it won't use lovedir/. as save dir. + * Fixed setLineHeight. + * Fixed extended ascii and ImageFonts. + * Fixed printf's line wrapping. + * Fixed crash when playing sounds. + * Fixed playback of mp3s with arbitrary sample rates. + * Fixed handling of negative indices in love.joystick. + * Fixed toggleFullscreen. + * Fixed unexpected behaviour with hash tables to love.graphics.line. + * Fixed mouse coordinates being capped after setMode. + * Fixed setFont's error handling on a non-existant file. + * Fixed issue where Windows builds would hard crash on Lua errors + + * Removed custom sample rates for Decoders. + +LOVE 0.7.0 [Game Slave] +----------------------- + + Released: 2010-12-05 + + * Added love.thread. + * Added love.font. + * Added love.graphics.Framebuffer. + * Added Source:play, Source:pause, etc. + * Added Source:isStatic(). + * Added get/setPosition, get/setVelocity, and get/setDirection to Source. + * Added get/setGroupIndex to CircleShape and PolygonShape. + * Added Font:getWrap. + * Added identity field to love.conf. + * Added love.quit callback. + * Added love.focus callback. + * Added extra meter parameter to love.physics.newWorld. + * Added love.graphics.setIcon. + * Added way to make the window desktop resolution. + * Added subtractive and multiplicative blend modes. + * Added body:getAllowSleeping. + * Added shape:getBody. + * Added love.filesystem.FileData for public usage. + * Added base64 support for love.filesystem.FileData. + * Added table support for love.graphics.setColor and love.graphics.setBackgroundColor. + * Added love.graphics.hasFocus(). + * Added ?/init.lua to the loader. + + * Fixed the debug module not being an upvalue of the error handlers. (you can now override debug) + * Fixed some cases when love.audio.pause and friends, were acting on everything, not just the passed Source. + * Fixed setFixedRotation enabling other flags. + * Fixed a bug in the loader (for require). + * Fixed ParticleSystem::setSprite not retaining the new image. + * Fixed setMode removing images settings (wrapping, filters). + * Fixed shape:getBody, it's now exposed for LÖVE usage. + * Fixed DistanceJoint:getType() returning "circle" - it now returns "distance". + * Fixed SpriteBatches being unaffected by setColor + * Fixed the audio bug. + * Fixed invalid FSAA values crashing LÖVE. + * Fixed a bunch of compiler warnings. + * Fixed OS X not properly using UTIs for .love files. + * Fixed the modplug decoder not properly handeling files that fail to load. + * Fixed a memory leak in setFont. + * Fixed bug where errors in threads wouldn't get picked up by demand. + * Fixed part of the bug with newlines when scaling text (rotating still messes up the lines). + * Fixed the bug where newImageFont would try to created ImageData out of ImageData. + * Fixed error handler not resetting the blend mode. + + * Changed fonts, they're now po2 safe. + * Changed the traceback in the error screen. + * Changed font origin to top-left. + * Changed linux save dir location to obey to Freedesktop.org's XDG specs. (~/.local/share/love by default.) + + * Removed font functions from love.graphics. + * Removed love.physics.newWorld(w, h). Use love.physics.newWorld(x1, y1, x2, y2) instead. + +LOVE 0.6.2 [Jiggly Juice] +------------------------- + + Released: 2010-03-06 + + * Fixed a bug causing ImageFonts to cut off some pixels. + * Fixed a bug where filled rectangles were too small. + * Fixed a bug in Image:setFilter where it would switch the parameters. + * Fixed a bug in ImageRasterizer where it wasn't using the data. + * Image filter and wrap modes now use string constants as well. + * Fixed double-transform bug in SpriteBatch. + * Errors are reported on stdout again. + * Another fix for the icons on ubuntu. + +LOVE 0.6.1 [Jiggly Juice] +------------------------- + + Released: 2010-02-07 + + * Added Shape:setGroupIndex and getGroupIndex. + * Added Body:setFixedRotation and Body:getFixedRotation. + * Added Body:setInertia. + * Added CircleShape:getLocalCenter and CircleShape:getWorldCenter. + * Added icons and file associations for the debs. + * Added the demos folder to the Mac OS X DMG. + * It's now possible to run a .love from Resources in Mac OS X, thanks to Steve Johnson. + * Fixed a bug with multiple Sources on the same Music. + * Fixed a bug so the mouse doesn't get crippled when the keyboard is disabled. + * Fixed a bug where love.graphics.rectangle drew a too large rectangle. + * Fixed a bug where memory wouldn't be released correctly. + * Fixed epic physics typo (getRestituion->getRestitution). + * Fixed crash on opening non-existent image. + * The error screen redraws when an event occurs. + * The default love.run() now gracefully handles disabled modules. + * The debian packages should now successfully include icons, file associations, etc, and should give the correct architecture. + * Added support for drawing polylines to love.graphics.line - the syntax is the same as love.graphics.polygon. + * Removed Music and Sound. There are now only sources. + * Improved the stability of love.audio/love.sound. + +LOVE 0.6.0 [Jiggly Juice] +------------------------- + + Released: 2009-12-24 + + * Lost track of 0.6.0 changes a long while ago. Don't trust the list below. + + * Added love.graphics.print()/printf(). + * Added unicode-translated parameter to love.keypressed(). + * Added love.event. + * Added love.filesystem.setIdentity(). + * Added OpenAL dependency. + + * Fixed love.fileystem problems with internal \0 in strings. + * Fixed love.filesystem.mkdir/remove not working when write directory not set. + * Fixed position of Window. + + * Changed parameter order of draws(). + * Changed origin for images to top-left. + * Changed love.filesystem.open to accept mode (removed from love.filesystem.newFile). + * Changed love.filesystem.read() which now returns two parameters (data, length). + * Changed love.filesystem.write() which now takes up to four parameters (file, data, length, mode). + * Changed default color mode to "modulate". + * Changed name of love.color_normal to "replace". + * Changed name of love.blend_normal to "alpha". + * Changed the conf file format. + + * Removed Color object. + * Removed Animation. + * Removed several constants. + * Removed love.graphics.draw() for strings. + * Removed love.system. + * Removed SWIG. + * Removed boost. + * Removed SDL_mixer. + + +LOVE 0.5.0 [Salted Nuts] +------------------------ + + Released: 2009-01-02 + + * Added love.joystick. + * Added network support via LuaSocket. + * Added support for loading of appended .love-file. + + * Added love.filesystem.lines(). + * Added a loader function to enable use of normal require(). + * Added love.filesystem.load(). + * Added love.filesystem.getSaveDirectory() + * Added love.filesystem.getWorkingDirectory() + + * Added optional explicit destruction of Box2D objects. + * Added shape:testSegment(). + * Added love.graphics.screenshot() (.bmp only). + * Added default size (12) to font-related functions. + * Added love.graphics.setFont( filename, size ) + * Added love.graphics.setLineStippe and related functions. + * Added love.graphics.setPointSize and related functions. + + * Changed love.filesystem.read() to accept file name. + * Changed love.filesystem.write() to accept file name. + * Changed love.graphics.triangle() to accept CCW and CW ordering. + + * Fixed love.graphics.read adding bogus characters at the end of string. + * Fixed epic swigfusion bug. + * Fixed love.graphics.getFont so it returns nil if no font is present. + * Fixed bug where love.graphics.getBlendMode() always returns blend_normal. + * Fixed bug which caused error screen to be scissored (when enabled). + * Fixed Body:setAngle to accept degrees like everything else. + + * Cleaned up love::File and love_physfs. + * Cleaned up love::Reference so it stores its reference in _G. + +LOVE 0.4.0 [Taco Beam] +---------------------- + + Released: 2008-08-29 + + * Added love.physics. (YES!) + * Added love.audio.setMode(). + * Added love.audio.setChannels(). + * Added love.graphics.polygon(). + * Added love.graphics.setScissor() and love.graphics.getScissor() to handle scissoring the graphical area. + * Fixed missing constants related to image optimization. + * Fixed memory leak related to love::File (thanks amnesiasoft!). + + +LOVE 0.3.2 [Lemony Fresh] +------------------------- + + Released: 2008-07-04 + + * Added love.graphics.rectangle() + * Added love.graphics.setLineWidth() + * Added love.graphics.setLineStyle() + * Added love.graphics.getLineWidth() + * Added love.graphics.getLineStyle() + * Added love.mouse.getPosition() + * Added love.audio_loop + * Added love.timer.getTime() + * Changed love.graphics.quad() to accept CCW and CW ordering. + * Fixed default color mode bug. + * Fixed line width being applied unnecessarily. + * Fixed line width bug related to fullscreen toggle. + * Fixed music not looping. + +LOVE 0.3.1 [Space Meat] +----------------------- + + Released: 2008-06-21 + + * Fixed segfault related to graphics. + * Fixed wait-forever bug related to audio. + * Fixed error reporting not working across modules. + * Fixed bug where games with a trailing "/" would not start. + * Fixed bug which caused love.timer.sleep to delay for (way) too long. + +LOVE 0.3.0 [Mutant Vermin] +-------------------------- + + Released: 2008-06-17 + + * Added ParticleSystem. + * Added visual error reporting. + * Added love.system for game control needs. + * Added input grabbing. + * Added functions in love.graphics for display management. + * Added love.graphics.point(). + * Added functions in love.graphics for getting current color, font, etc. + * Added love.filesystem.enumerate() for getting folder contents. + * Added functions for setting the window caption. + * Added version checking. An error occurs if the game is incompatible. + * Fixed print() :) + * Removed all keyboard shortcuts. + * Save folders are now created only if required. + * On Windows, the new save location is %APPDATA%\LOVE\game + +LOVE 0.2.1 [Impending Doom] +--------------------------- + + Released: 2008-03-29 + + * Added many functions in love.filesystem. + * Added a dedicated save-folder for each game. + * Added timer.sleep. + * Added line heights to font objects. + * Added love.graphics.getWidth/getHeight. + * Added scaling and rotation for text. + * Added variable spacing to ImageFont. + * Added support for variable line quality when drawing primitives. + * Added several functions for drawing sections of images. (love.graphics.draws) + * Added image optimization function and padding function. + * Added love.graphics.getWidth/Height. + + * Split devices up into actual SWIG-modules. This means that: + - Functions are used like this: love.graphics.draw, not love.graphics:draw + - love.objects is no more. Objects are created by an appropriate device. + * How you draw primitives has been altered. + * draw(string, x, y, wrap, align) has become drawf(string, x, y, wrap, align) + + * Changed getFps to getFPS. + * Escape is no more ... enter: Alt+F4. + * love.filesystem.include has been renamed to love.filesystem.require. + * ImageFonts now consider the spacing as well as the glyph size. + * Fixed a massive ImageFont bug which resulted in float-positioning failure. + * Fixed a bug when loading fonts where the specified size doesn't represent the true size of the font. + + * Updated DevIL to version 1.6.8-rc2 (Windows) + * Updated FreeType to freetype-2.3.5-1 (Windows) + * Updated Lua to 5.1.3 (Windows) + * Updated SDL to 1.2.13 (Windows) + * Removed boost::filesystem. + +LOVE 0.2.0 [Mini-Moose] +----------------------- + + Released: 2008-02-06 + + * Added ImageFont + * Added Animation + * Added text formatting functions + * Added setCenter for Image and Animation. + * Added methods for rendering of scaled/rotated sprites. + * Added the drawing of basic shapes. + * Added default font and embedded resources. + * Added Ctrl+R for reload. + * Added blending and color modes. + * Fixed memory usage of Graphics. + * Fixed a bug where the set text color would change the color of any images rendered. + * Fixed CWD bug. + * Fixed titlebar. Game title is now displayed. + + +LOVE 0.1.1 [Santa-Power] +------------------------ + + Initial release! + Released: 2008-01-13 + + * Image loading and rendering. + * Sound loading and playing. + * Font loading and rendering. + * Lua-scriptable games. + * Config files. + * Stuff is loadable from archive files. + * Keyboard, mouse, display, timer, etc. (Basic devices). diff --git a/jni/love/extra/nsis/game.ico b/jni/love/extra/nsis/game.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a01034389ec9455d80de832e137438bcd1ed79e GIT binary patch literal 33093 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 lB>v_)b(^)RGlzo9NF7D*+AYV136O{~zCrhkF13 literal 0 HcmV?d00001 diff --git a/jni/love/extra/nsis/love.ico b/jni/love/extra/nsis/love.ico new file mode 100644 index 0000000000000000000000000000000000000000..73403aedbeb599dc19f7df618793c7363da488eb GIT binary patch literal 35492 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 V=w+!1g!}-RQ#F`}h(&&u{eL{pkDLGi literal 0 HcmV?d00001 diff --git a/jni/love/extra/nsis/love.nsi b/jni/love/extra/nsis/love.nsi new file mode 100644 index 00000000..aa75fd6e --- /dev/null +++ b/jni/love/extra/nsis/love.nsi @@ -0,0 +1,120 @@ +!include "MUI2.nsh" # Modern look, plxz + +Name "LOVE" + +OutFile ${LOVEEXE} + +InstallDir $PROGRAMFILES\LOVE +InstallDirRegKey HKCU "Software\LOVE" "" + +# Graphics +!define MUI_ICON "${LOVEICODIR}\love.ico" +!define MUI_UNICON "${LOVEICODIR}\love.ico" +!define MUI_ABORTWARNING +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP "${LOVEICODIR}\top.bmp" # optional +!define MUI_WELCOMEFINISHPAGE_BITMAP "${LOVEICODIR}\left.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${LOVEICODIR}\left.bmp" + +!define MUI_WELCOMEPAGE_TITLE "LÖVE Setup" +!define MUI_WELCOMEPAGE_TEXT "This will install LÖVE, the unquestionably awesome Lua game framework." + +# Pages +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "${LOVELICDIR}\license.txt" +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES + +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES + +# Languages +!insertmacro MUI_LANGUAGE "English" + +# Main Program +Section "LOVE" MainProg + + SectionIn RO + SetOutPath $INSTDIR + File "${LOVEBINDIR}\love.exe" + File "${LOVEBINDIR}\DevIL.dll" + File "${LOVEBINDIR}\SDL.dll" + File "${LOVEBINDIR}\OpenAL32.dll" + File "${LOVEBINDIR}\libmpg123.dll" + File "${LOVEBINDIR}\gme.dll" + # File "${LOVEBINDIR}\lua51.dll" + File "${LOVEICODIR}\love.ico" + File "${LOVEICODIR}\game.ico" + + # Uninstaller + WriteUninstaller $INSTDIR\Uninstall.exe + + # Add new start menu items + CreateDirectory "$SMPROGRAMS\LOVE" + CreateShortCut "$SMPROGRAMS\LOVE\LOVE.lnk" "$INSTDIR\love.exe" + CreateShortCut "$SMPROGRAMS\LOVE\Uninstall.lnk" "$INSTDIR\Uninstall.exe" + WriteINIStr "$SMPROGRAMS\LOVE\Documentation.url" "InternetShortcut" "URL" "http://love2d.org/wiki/" + + # Desktop + CreateShortCut "$DESKTOP\LOVE.lnk" "$INSTDIR\love.exe" "" + + # Registry + WriteRegStr HKCU "Software\LOVE" "" $INSTDIR + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LOVE" "DisplayName" "LOVE (remove only)" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\LOVE" "UninstallString" "$INSTDIR\Uninstall.exe" + + # love file association + WriteRegStr HKCR ".love" "" "LOVE" + WriteRegStr HKCR "LOVE" "" "LOVE Game File" + WriteRegStr HKCR "LOVE\DefaultIcon" "" "$INSTDIR\game.ico" + WriteRegStr HKCR "LOVE\shell" "" "open" + WriteRegStr HKCR "LOVE\shell\open" "" "Open in LOVE" + WriteRegStr HKCR "LOVE\shell\open\command" "" "$INSTDIR\love.exe $\"%1$\"" + # Refresh shell icons + System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' + +SectionEnd + +# Descriptions +LangString DESC_MainProg ${LANG_ENGLISH} "Main program." + +# Assign language strings to sections +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${MainProg} $(DESC_MainProg) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +# Uninstall +Section "Uninstall" + Delete $INSTDIR\"DevIL.dll" + Delete $INSTDIR\"SDL.dll" + Delete $INSTDIR\"love.exe" + Delete $INSTDIR\"OpenAL32.dll" + Delete $INSTDIR\"libmpg123.dll" + Delete $INSTDIR\"gme.dll" + # Delete $INSTDIR\"lua51.dll" + Delete $INSTDIR\"game.ico" + Delete $INSTDIR\"love.ico" + RMDir $INSTDIR + + # Start menu + Delete "$SMPROGRAMS\LOVE\LOVE.lnk" + Delete "$SMPROGRAMS\LOVE\Uninstall.lnk" + Delete "$SMPROGRAMS\LOVE\Documentation.url" + RMDir "$SMPROGRAMS\LOVE" + + # Desktop + Delete "$DESKTOP\LOVE.lnk" + + # Uninstall keys + DeleteRegKey /ifempty HKCU "Software\LOVE" + DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\LOVE" + + # love file association + DeleteRegKey HKCR "LOVE" + DeleteRegKey HKCR ".love" + # Refresh shell icons + System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' + +SectionEnd diff --git a/jni/love/extra/nsis/top.bmp b/jni/love/extra/nsis/top.bmp new file mode 100644 index 0000000000000000000000000000000000000000..99d179aed82e67584991cbdd9fe55ad0ff653586 GIT binary patch literal 25364 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 x$>!+nCfuzunkc+ literal 0 HcmV?d00001 diff --git a/jni/love/extra/reshax/res/knoll1.png b/jni/love/extra/reshax/res/knoll1.png new file mode 100644 index 0000000000000000000000000000000000000000..4a14e38a42b45153650699ce85023e87a3aa1285 GIT binary patch literal 3416 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 literal 0 HcmV?d00001 diff --git a/jni/love/extra/reshax/res/planet.png b/jni/love/extra/reshax/res/planet.png new file mode 100644 index 0000000000000000000000000000000000000000..5fac9612b0171bc2ad10104e810b0b955570d8a9 GIT binary patch literal 7711 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 literal 0 HcmV?d00001 diff --git a/jni/love/extra/reshax/res/star1.png b/jni/love/extra/reshax/res/star1.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b880840e41d74658d9b133b184eb9a644c46fd GIT binary patch literal 385 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

B-* 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 literal 0 HcmV?d00001 diff --git a/jni/love/license.txt b/jni/love/license.txt new file mode 100644 index 00000000..74ca232c --- /dev/null +++ b/jni/love/license.txt @@ -0,0 +1,879 @@ +Copyright (c) 2006-2013 LOVE Development Team + +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. + + + +------- + +LÖVE also uses the following LGPL libraries: + + - libmpg123 + Website: http://www.mpg123.de/ + Source download: http://sourceforge.net/projects/mpg123/files/latest/download + - OpenAL + Website: http://connect.creativelabs.com/openal/default.aspx + Source download: http://connect.creativelabs.com/openal/Downloads/openal-soft-1.13.tbz2 + - DevIL + Website: http://openil.sourceforge.net/ + Source download: http://downloads.sourceforge.net/openil/DevIL-1.7.8.tar.gz + +Following are the LGPL and GPL license texts: + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/jni/love/platform/macosx/Info-Framework.plist b/jni/love/platform/macosx/Info-Framework.plist new file mode 100644 index 00000000..2bdfccf9 --- /dev/null +++ b/jni/love/platform/macosx/Info-Framework.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + love2d.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + LÖVE + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.9.0 + CFBundleSignature + LoVe + CFBundleVersion + 0.9.0 + NSPrincipalClass + + + diff --git a/jni/love/platform/macosx/OSX.h b/jni/love/platform/macosx/OSX.h new file mode 100644 index 00000000..95847462 --- /dev/null +++ b/jni/love/platform/macosx/OSX.h @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_OSX_H +#define LOVE_OSX_H + +#include + +namespace love +{ +namespace osx +{ + +/** + * Returns the filepath of the first detected love file in the Resources folder + * in love.app. + * Returns an empty string if no love file is found. + **/ +std::string getLoveInResources(); + +/** + * Checks for drop-file events. Returns the filepath if an event occurred, or + * an empty string otherwise. + **/ +std::string checkDropEvents(); + +} // osx +} // love + +#endif // LOVE_OSX_H diff --git a/jni/love/platform/macosx/OSX.mm b/jni/love/platform/macosx/OSX.mm new file mode 100644 index 00000000..9e63b262 --- /dev/null +++ b/jni/love/platform/macosx/OSX.mm @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +#import "OSX.h" +#import + +#include + +namespace love +{ +namespace osx +{ + +std::string getLoveInResources() +{ + std::string path; + + @autoreleasepool + { + // check to see if there are any .love files in Resources - props to stevejohnson/diordna + NSArray *lovePaths = [[NSBundle mainBundle] pathsForResourcesOfType:@"love" inDirectory:nil]; + if ([lovePaths count] > 0) + { + NSString *firstLovePath = [lovePaths objectAtIndex:0]; + path = std::string([firstLovePath UTF8String]); + } + } + + return path; +} + +std::string checkDropEvents() +{ + std::string dropstr; + SDL_Event event; + + bool initvideo = SDL_WasInit(SDL_INIT_VIDEO) != 0; + if (!initvideo) + SDL_InitSubSystem(SDL_INIT_VIDEO); + + SDL_PumpEvents(); + if (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_DROPFILE, SDL_DROPFILE) > 0) + { + if (event.type == SDL_DROPFILE) + { + dropstr = std::string(event.drop.file); + SDL_free(event.drop.file); + } + } + + if (!initvideo) + SDL_QuitSubSystem(SDL_INIT_VIDEO); + + return dropstr; +} + +} // osx +} // love diff --git a/jni/love/platform/macosx/dmg/DS_Store b/jni/love/platform/macosx/dmg/DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e9df1d6f0e0682788955df597b94c1730eac1b26 GIT binary patch literal 15364 zcmeHMO>7%Q6n<-OQ-}Q6Nu1J_LKh-RN+a8i(g+2l8n>m5h~z**ny4*d?Oog3u6L~6 zjoq}QSO_EzT&TEk0*M0$4i#r4s8rMzi394PLP)452oe_#<$#0~-kVuFe@&r)!r#1T z<~_f8Z|2Rn^JZr@0H9>%jQs!_07S45kF{fU2cmW=>nIdxdXOvV4=jgL`*_~Zth1F0 ziGV~vA|Mfv2uK9}83^Dzn<&yIxU3}t5&?-o69L*EG%Uo^0j~?rw+^iM6#%)4YECG} zNI_F3NQcs_!%)y%mc#LA|f7y`wW4>+0@__inp?`;MIt?ArCvw3TPhgmuoGjrHX8{F$Ol zfFEKub2IiFYU9h=(Xw7NpSCUCoA%AKzVPZ^Zs%Ulo5qXFs>%7v>OQ#5QP(t`6GhiD zvW0?Y`qL}qnUjc6ZPYi*qfUX%#=5JPS<6;@i#gtu>3Ya#bl26LqM4aLW$QW9&N><9 z`>Z@0i*jF_(YR}pAMbafqUSBA*q0tB-~jp#{wRcOSLjQUu*P?VI`;b15z(-&zIM9h zt7H3M3mLBkB;i|y!a9$;DU_Yq->rrPr3FAo@V07bgK%Q>(z|y0#1p9R3gm+*(<2YT z4hnf>8EyW6f_OUNafm|>bjZUQD1r+N=D@+_G74qX7QuuB_+UW+|Dw>2vm1kKI092} z1iGO&dFOt6Aex+F_FUQYl4IE~-XP54%4-xi);Nonac@3fGD)$Ht~~SI9>fvCx4-X? z+N^3OjB+ti);-_Eq_{UypBtM*9B&$C)in(7jKHx~ThmKRSvoAl^m9no#!;aTA|K6gr^=#_{(&KA#fmx*^F2O42|{8YtNqC@BWw%9R5_ z4=721UW~Pk))1Ax^d12~bCt(JO|dVHyD?Eyh{Rx$_LbJwzVwV}L!9=)ARL2PjB5ej zg!kbRd<@s&8(4&&l&wmSvP*e1{IeQT+tdzqo4Q-=SNE#>)Rekk9Ta_pXnhjx7OYXL zPog9?H(zXoKvzrDRII!&HbQ!>;NrePYw2z|dG+$cpZ#??35(d@=QJ|WZ|CII%cVFP z@|A@04wPxme^*X+t;tCZzuez@RxWDq{n@Mx|M1q=h~$+&nw5y9IB>+n7!8(p!;268 z@^8;dzB&?B&$oSiAqK~UHrx~Lus^RlSfC>j_YgU?q1URz#s*d!95;UVdt&vu4sK&; z{gf-T^B`@(w~LAU90PB)rD9_%Wmm`2l9fgtS+PIrP=U&7dpL(S*Rga4J)p7S^Q|NrI%BuA16NCY+=0YyDLaX5p+Htuz6BcQJr8kU!^5RqM7 zaPEQ?nUJ2oZ_y9Djzd4ms7nziLOC7qy5Oim+Wdb8$os#%|MMlw*Pp1w=Lr5K>3?wl uUomkhN(3YV5&?;TL_i`S5s(N-1SA3y0f~S_Kq4R!kO)WwBm)021bziliuvFG literal 0 HcmV?d00001 diff --git a/jni/love/platform/macosx/dmg/VolumeIcon.icns b/jni/love/platform/macosx/dmg/VolumeIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..7303779b9f223fddd81c91448a769bd9dfc1d3d6 GIT binary patch literal 39493 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

+w%xt^eJsp^wPQ z;oontp8sg9bx$U&p7kV|_`~&V>-nGgzz<$pm51*ZBPaGgwQk<}!*KroFZrtw{A3ZY z7XIfC9a`V2S1+A9`oXK5-~VWX_3*}&T{sSK#T(R`wf&Fj4 z!u$KLpW5Isulu0`m`)Ep^&ih}d;XcwQ&!jKt`&lfO1}ZR^EEbEsA_*8X84Np`)xt9?diH|0!f95}f0K*<4PEb_IsgCw literal 0 HcmV?d00001 diff --git a/jni/love/platform/macosx/dmg/backgroundImage.tiff b/jni/love/platform/macosx/dmg/backgroundImage.tiff new file mode 100644 index 0000000000000000000000000000000000000000..66c84377099f8c51a533b74a3ff823fdaeb9dce0 GIT binary patch literal 565288 zcmeEP2S5}#7aodY!R~qLS+L(JD!ti7Q7pf`>nQ>vN>Pfv-JPdr?^y7}-h1!8AqXM@ zA}AsPV#5X~iu~VhG{%|TVHcL>trzCrWRjPcm*mUKOJ=rfSFRz)amBbw+-FW3lm`AJ z7cI&EG~P)rU+9sbHKjD3X;jkCBJq;M8b!a*nxM;leq) zeX$n9G^%n%NbwrgG=8CUU5#oCpI^VwlClgrT)AqX^fip6bVbk|HBU>VYSs(%;J;2u z`4{K7=KE*aO5&@`0DWh+^Vf3yKF#*zbU048Bggga4So`RNd7DF2`L+t{rdkl4(`Jp z^}3IA_j30f={`o!x|gwDKW8@w_wk;bk%57wm4Stov7w%kft9g|m5~M4yw!v;cJ`wk zz4V4VIyt+wsGWT3Tx~sPhZeQ_nRYekI>y>@q;tnf9*(^x{jazEq|x@44z*jgEYW;| z)dbfuu8v-IdJ|k-+&rx&w5V+-DcK6NB)VyBJ!ulJ(Jg8dk@|P-u4nD;;izZQ#IUiw zfw7sMiCGgPb2D=z1AV=&?rwTEj>Gi~Eg_kKxt@`cm5BjF)%)_VcFPi=ntM2muAKzrWaT9kBr>2IMmX=KojG7u5HAafYo)g`?>?SmJ^Q=Rd zeC5;5(bL|;d5o7cik9%T8}9Dy)uMK7NkQ}DT^!whI>yCOsvs)2R8zei$9^9xkxf!n7w481&6|FqzHueFbDV;3{=V=p)t4tR(SWtP z>lhD5PfxT+OT#ZY*tl-OTUUri9Y-#i*xBL`*Ufn#L9nnvu zxxbdp#_`h=rAyS`-FbqeOH1P~CGz9>`MSHZ^oMSs@Cr3}@F*VaS zGBwAa1^z7cjm(Vnjm%B(hd2upeN$rt{278qyoIs8k)@fwv4Nq!v7rV2EcH!|@Mmm< zIPftyz#r0@OYTka9Dl|p#zxJI+Zwkwx3RV~Zf|PRzO4yv&G66Armcxl8*@vW_FvTW zon&9cCf$}ng|A~rIv|+%tk7bD-53f>-+=`l2(bc@R$bj4oJUM-XXoYEQUcM94J;ZP z8}|MR(Txm@tRxN0OUY-NoIb7bZnV2@3I} zn5s%2Nr!*`cFwMjZc^ZqV!g~KGII|2mQxD)-*Pff_&LApzQ$%2W+wV329{<9(kq6H zxuFrc8cAcw)fn-nh9r%Nz9g5q^orqyp@SG)5o2OuY9PI0Xo1GS!WBc&+!zB@az%Pv zEhSeAq{LNHmNAB{eUA<1iLAxUFtAxUFtDNSQ(D5WLbET!BmEhQydN_kpJ zBr!5DG}8x!=mU22&GgOnE%Yt*p&CO&eM2LCLt}kI6MaAm5*eE71Akzl7y*?4O28{q zKo^h)AO-Ac*4DDEsZDzWV~h6IMn=Xq#s)@h+nX3!w=pp?vbL~kYyG7Ieb-{D?&S{l z6mQ0Od$>rAAP4)VjxLVqlwO|b=7!(fCl2;jBiub)?Yvq#ON-VjP_^w^8Y~4J) z?A+`fZQHf<_I7r#GBIi2&IS{uskNn9yY_~LZQJ4A(AwP4z@)8(p&4o`$S2y&WIBYg z4P(D4wf4VOlNy@2LVRn2Twza`stZv{xoUN()uogMluE4bU21hHr2(Z9t9zGPT}o*{ zsl@8urB;_x8c-^+x_7D7rIZGgO04c(YIP~40i_bFdzV^WN@+l;#OmIqR+my5P%5#y zcd6B-lm?VatnOWEbt$C*r4p-qms(v)X+WvO>fWVRmr@!~DzUnEsnw;F29!#y?pFY_;mkkTL8L~M1*fr;VM~uJ|7hH=G_RY*@X9#u(v=1~(AbuW3xBF^#{)NbC3>_Z&Bd z<1%Ib(|RI#Eb~!jPM%3MBVjG=B+@%+8);M`k?QOB8jxzpKpHnsqu~4_eOJ<_B>ha% zTZ>2~EhdeT^kT$mwkCgH#zzgra?&^ZN$#qWTdg6uke({JTz68r;%TtORHMc)5Y1|(X+2h7f(FY_^zBH(r1V+k3Svhjcq%Iw~mvCyZ4yy zqKdkEIOC%Rj&9zr$fMi7mxMcB>qZ>zOWApQxp#1MbHsbtjt+?6dQTkV_$6@(l2{TW zd1CA8q=*0IcKx;R{$B6){UzUb_@Z2i^1qMi>gnY8T})9s7q8xSPT$3qws%B6#|d7x zo*jF4?J^v%1xpwf`x^aS;^HISJtnnrad!HusWPPU9lu5+r;dZ;2s>{VFObE@IeK`> zNZ$8r^!Le24tJ8iQp+f}9O2)#1ATxj-2dF&B)Tr{zP<*$;0I9>c{w0b3_$q1|{r6pZ>ku;qo1y^nYE)un^#~(VR#zT&a z09|e{SDDkuyqo!uE8EG&)<*Kl5zLGoF-yGQbfs@!54G-!6fe2b(mT#!28ZmKQQS;U zw^*@a#f#|{FRojzWQmgHek!A@Tjr3SB+97OO`5Ks%+`f zWh<60UAm&=Qo16^Qce*DndiB3#ZaB~S{k)E&2k!A&T@ zv40p9t+-^vfwpz({?zlraAOmXKSQi_>MiZ{D)zO#r)i~)2mh+yZdq@K_7^vKnf-jb z&m+e-hh|<1^^SXM(_s1LzYnjteCP4IEk~||#i#TgF>aR6)}vR$6H?7P^m7_Nd*!xc z*CGSkXBnNlTOhhrcx1V8J5?E1Y>JgC}Q--l8O=uF7ym}Wn6c7tjC{At$Y1s z?`iV7UQvkvI`vI2-i8pHes*Zz$IQ#|5fwqc1P#84ka>^O)smK3j%&qf+SWZ*&9v_7 z0T(WgbM@&Rpr!9P;_4y$-JTC;B=i|lE7)^Q=&6jU|12)Dg0o#8(Y46H!1JemsZ)P( zwbbEU;@#A$bM{>B8+E4S#+YtlmS}Qg>%2i@{5Pzwyt0x{<@+OA ze0(;3M^faFBL{qp-_7stS>bfMKV3$Z`E)<>!-T%Ai&gZh^LhM@$YUE*(o$CTHyRjd zJSgMm&VETt?b9t@thY*Y)kjZLpsH%)FMa&2^&({tet-drlvoFeKD((Te5& z>wGt%y;0ZH|jxX_U&d^GJ z>A$QP9~OP~aQd6E9#`IP+_ND2BBd&Pf@y_v)c{G3lnd!_PIGzjprYNdp`M zUG01wj=Z|L!so=z$e{;!o@x62T*C7q<2z0~RLuQy<<{jx+BtKs_b*Lb`DV?|l)XOD zH`-S`GQj@e4N4DtJ*IQ(QtgtGYChbvvT=)n`+JZ5@~M&Akp+>zx5(sfHrBCE(fi+! zqsMC9oG^OSwY2nM)t~RX*C^)Twi79LGr7>|CcaNoJA~^8ZX2+!w3%tIqbm>G^z?N& zxo7X>sV}y<1qWWw*KEUm+a!}p^Vj}ici7_YGnc3l&l}jgrnG1_HEr_H zOwM(ahjC^9Kh~wT>iqF`CU?5Mje#Y%YF2cE2@x-^ea;Bq^z$yOfSuPp2hGQ*ndx8D zTx(xyCf6}I@!Uh7X-&hb3R= zD%xZFyj!_=%TOc4bY5$nphdyjM z@pp%=u4yr|!soe+{kc+7-3|#EHRGobNk+x|>TC_M_wydsZ)w7Dv%9M%E?DW>Dz;(N z^KO=zoXzppcWP8^-r;lnu=q@_)B8EM7B*T`ER#DmJ@b~P?eTcq1)hO@Z@>MtxLZc2 z=rK`Mx{SP(6mG&rgxObXXM1GjfTy!Fxu&59{kD8A)x|2@%iL;ZCBw+}CxV>+Iu`15 z*LPg#spmnS2dAxka>lDm!;^a&d%Ik7Jf2!MF)rS8@Al)R_8f9tXdmeo^J<05q{D%3 zo1=XmhmAAuy5D@5Tb*$WPQREs%<@T?*j`qO@H6;&GgucuMZ6Pd;E)0|D4)pe>iGZ+L9A# zAmUoJRbfJ?p2vn6~f0{7i0czt?BC z#F}16?RoS5%|+e|Gda_NKMeS*e8-AyLeqE6eWo*Jr1rm|nj_3!LfAe}Csa)6 zVP<^i;OeP*3ocEF^B%M+VEoil3%lKU>-X2fCXQvUj~z2?&)Sb?HXS-=InX)!R&qJ3 zKg&eN_a1Arx#evC!xJ3GwCa)Y*v>x1Wv}nD1$XpKqU=2TCtMhFKfS}WC3`)q|DKpW zs7lh=ece7>*!-y%4RHB0<5mI?`L@e}7Z3iJ6FPL!YB$?s6Arf4E?z5Y zaAI}fuDg4J`IAOTk@cL~{+fQK&g?$NW39WpOq$wZo{jIAYQcl&ts64=uRq2oba>gW zS^7VB51(Aq-fi5Yma&h+bZrt2N2P8vJ%8@qpvh*WK-NjQ@wkvhM&dnWn zwg;W7W?c03BDd6~ZyK~7@zbKN+w9kAt-CoePWw-rh)Sz^*_JfXalf~&oI~2a#x=$_ z+nTX*cjvCXC= z&4|fMe!tq>b+Yx$zjTJQiH=FP-LZ8|qn~bH4Zm<{pk9L;Q+oV7rN^yl$tAAG#V*+y zyK;N-mCNzf8XnkVVRH1AQDkX<7q<~HL3?hxA4@X-@KdYdAs4P%tXg6JOR23}XC;rX zS1QBmSV|@DGCg8bjyY|uuB(^k*&%Ui&Bv2}I^3WcHzZ|c+KOU5>hIb-{bVMW84`8n z$%&(*ZHiv_m}&yZY4v%@=pHHVEiS$Lpu2tAi(%*9q<0-s^zpGqMhOS2wKT#~8% z4f|h~HT`hz-QauE_CD;lXKO(4oBLXy?wv86Hh=Ko=?M)Tr@4;QN$wTx6R*3?(#_Us zeyy55ddADQSbGdw=Inh)N-W(n$g)#!^Li&5_BpitT8|RVmPW5=7-DCCf6<`T-dEFp z{#mDbZSSbh9tRr!vNU?mL6`O2E0%L~i0Pc<>g7Ag{^*%YZ#yJUdn0{1yUoVQPlI}{ zDCO_gX@yJtZ`}a_JNlw-x8L3Oce7r;rKQinu2Q059|=5IcIvq$ClTi|L*EVYcWaCK znHt<96bfAFF=+8INqx4UjK&gKoX6KYQPN}3(k%m(O9avHBttc&om$U&zI$A=(R)VL zSrVMlWrx$U8dht=I{Q59bPZ_fM~hI)V9X?WYMvqz1`$Le%C z?7K92_KC*+J@?dqe5}^XHUU9bF76(%V%Y9xPs~@I`rPE`$F={=sXyaz6;A)jJ=Eln zkJGo0usF8)p>I_av&ffPafc83Om|E9d3sR4XKvn=WBf<2uJbu^XK?!AB>S>IFCB9& z<3rEj2{nC;R?hFR?ZvWNFFSiAwx8brmv>f2%xda1!$i>INaxf=;mvK5Z(JEMq>gXH zzqX~k1`>yE`1PXk2P1pGnT|WpJbhqP!_@xs=v!``It6dCdLBK><R8((&8_jh7cr|2eONd?>iXELMMu=V+95sU z!={=q4{8l7x99nDNVDN@pO3|NhBnn47`MUj-J0Zh(*aYDglinQFynRo1`jLVJ+XU$ z;m4W(jBeL4rQcFlf44r7D;B;jb!2m@PPg-y_&>y>Y37QFFUmCxn=*=u^P%7wpQR;*OXx3HWdOW`$T!9UNfqIJVY?m^R5H)7>zo zO>fa-*H+V`)z)qQ-|w!AyJ`mv`nWO8{KK_O?*61quI=UfMzh0%?+wt7^j*AIvi5X)H={=MsLP96JsR*+SSB~PPo(dl zOm5@D$T1m-7N0u}I`(THW|x&r6Fw>5fTxmB~$Wvp(oH(s$D6doh)Kb>c@a-PTO| zGWAqhht_-GAt;G%($Kz+o|F`IYzQ>RwE<{3D_B&Jpjes&_tTelL0a z8ScbY+p%>QKeDwtJ}TnW2iJ_pep9ouT|NdaJd_^PF|5bg&sDd-=yEoA;`+yv z+)T8JUQc~Leb-IJ!lN)kw zdE*9C>%4B1IMZk4#bf@TOPriKbi>l2%{L$Eo}qhS+TrOPuC9(c6Z+Aw!`rx+b7|8b zX7qXF{F}ja%bNQhU-SELVrnb%7@c=F9yJ&}yyc>h&|7|inOvJQy`CIMUAwM+nNYvJ z=HovFzt7~}w~tL~SZ&>hb5Ra4u$7C4z_yH@5|hz6{=?bn8TB)Cmwt$^=ejvVcbC)K zZYe`Dx!$LX*X!_TdSIF4MK^4#Pw|_u?ZbS(r^cUm>+LILYhQi#%8c8Kx;1!EGo!rU zvq)IclKSFQIQdGzyg&t?k_2P^r4DqMiv5T{tyCxi+u5Ml)lCMMc zA23i)CkT$t;_$=5rDabYi5WZOQYuJ)~`>Q7Q0S+_#+H;@mgFTaW!Ft;OHshOg$hV}Em8<$K@a>aIuM zoXK%VgPHnNlJpnm+qBM(_Dv)TrT?-_KvT*mnDUxP%A=n)(`!eZwR)0XZIAC6dVA=3 zO1@~Q*O=dlvz?IXSeS@z{YUMW;TX{ zge3hMM1{?txr#%ZaAkula#}9}IqeE1IjzC#@I-^QTbJT}0U{jNuVy0Y_n`4ydj0OA zxd^wKp3c$@0M5E+Z#{c&k8vc4w&Z_BuuEA6yEIj}8eARjSFSN<#F=x=xYk^It`pad z>&*?|e#idJNbJ~naO1ft+#lR5ZXUOoTfwd2{J72B4sI`ZkUPem<}Pqoxd84K7sf?# z54m{m8TX1y7+SUbCTvv&4rq)G&gGQ);y|tK{G%zO!J}UGtCryLc63^C9PUojkPSathKsn z4b&Q;<)JlAYp#}$)<&(pS|_!xX@zP%)OxP^> zXwjmTiZ&=}UbJJ;0Yyg@om_N&(SM8XD|)_YNYS{WDLOhjRdgEZw9x6MW2fV#GfQW+ z&TgG^I=6M=b>0^%S*&I;qhdD21{QNG_GdAlVmphSEq1$DVzH0K%NDO!+^TrD;ts_p z7GG3+bMceKgNw%(|5&12i3TNFl;~YzREa-ItSYg$#FY}!CEk`SS+aIX%aT1xI+vVL za#hLwC9ju^E%`yWylz8XYu&-R-nt8Qx9OhOjnsWxs#K}^rCOI7Sjwx^!csd*T`KjU z)cevEN;fHOTiT)Y^wPeikCwh&`em8oW$Kk_Q|9+Flgjv%IaDUN%=5Cv%hoSzUDmGb zw6eZsPn3-)n^LYqIm2?@%DI-CUv6hP|8h^t>y)owzI}Oz@-xeCDu1bbTm`KPbt+g_ zu&?k}h0PVNREV!wv|@vbwiQQJoL6yA#h{9>ek%Wy$xnTMn(&kFPiKC5SV^l={Yti# zTq-T9bg)u*rSzYx|J>$h$Dil?y!YqZKc`jxrE=@aj+N(D-d8!Sa(WfLD($O`uCk=c zu`2hgYFBMowMW(QRo7L$QuX;S6@O{=i~TQie>wQey=t1(8dmFBZF03u)dH)fRIgFJ zL-jG$S69DO{dtW_HCopgRbzRLvo(@xR;bysrgP2ZHP6+2s`ry#8$B1jReG28Ue&5r zt79$iS{rHw)%sYwLG3=Z|E#^Q_We2~>R8knQD=Fbi*;Vrty#Bg-6?f<)xB4*cs+}H zBkQfKcdcGp{RZ{>)t_DeSp6prDmSogFsZ?=2GPHk`nA=sV}ITF>z&_<{$}yp=->YR z?N&q0hNcZiHuP;6+(@&LStI90|27KIFM{uSy6JD!k7%shxJ~16jdwMUZBnU8mnMHU zIo9N5)4ELuHeJ&6TGP)4rUotsn+>82%Nuqw{L}EH;TxldM)pR&Mt6)$;hUb*jgK3@ zHfdzyXtK`au4x6+uBNk1FPdhUnVWf-?KMj>uWLTce64weMMaD57V|BxTNbfwYdPKW zwB-jYGb=BvgI3AS8aEr=Y-h74%^Ng#Y`(d9T#MQ*>{@JS@vx;{%V90ow|v;DRx7(! z8(TeUU8l7}>#eO5+x*sMRGZyxUbZ!8>(TZ|+caw{>#5e~+iA7y&~9$Kp!Vh4_i4YT z{R5lYHcmFXY+iLR?J&8+`Hn?8cJ8>OV}xyWTYK9bwy!#wcbeMia%bJny*jVy{HROA zE*@P@cGc|Ksq3&A7n?Y6Aj{q7CAkL`Y{N6{YLd-(Q9=xNwK)bR*FN5TF7_?ccW~bwebf52>$kMu!~RYCPwgKtpy~kU0mldG z4D35_>%f#j?FX$G6hGK>@T|e%LmCX3FvS1&s=vGZer9Nyp>{(L4J$IN->{v-KG}7% z+h~_E+;;fd;jiqi?N{1Ab7<|b+#$)ah2v7k#1SnVSY8$Rvg^g7dLPLH3_VaE19O8hbUkDGrQ{JHeccYpQ! z>*UPpGiS_<`@6&6yJnT1DOYRUGc<(5ub8n>+LvZKrOmd{=OZpF|Q{yru? zek)6?^j`UJRhL!ASJz#=c=e|>BiDraw)Ne&w%Xb`Yt#O9`1kg@*6a5ARrj0cm%iS4 z{oM^6HXPkpf1}T)qMOETO4!_Y^R+D&TXt-%x^>>xjBRe)9&Ycs{qhd;9Xobb+qr0$ z<}UADNxKK{zO|>_p5uEP@7=Jk(!P27x&7YzpB@-?ApBtGgBK539NK%h-r==JDjb=6 zRO9HxqpyyQJofPTfa4)2I-R(9vf0Tar<$DFcDmMS-!ng*S#-9<*_mfE&rLd)a(>MD z=NFtV#9bVEG3rwPOLs2!xEyq)^OfsYZLVIr*5=x|>n*OI_P6psal_)qu>iAxqk*P@ zM{b(lJQ8FUbTrsJ`1mc$TPH)Bhn&6L>h^`ucA;1A*xm^U`(Ic{c%SgQ5rZQh-gUV9 zB+@1F^}TWTK1R)mE)qTWe%bpz52`)b81q}qzK3QH&&0Ni4Sdw=QB<6L+_T4?k3YrF zOemG$lUOrx#}lI`r;}`wZap3JH2&F`XCI%>dQtAh+Lyn+Je=G*Iq+5gSMjesUT40U z|F+88ZSPFpT}3mw1@mt2p&z(Ol%+Pq&bsh)Y zB4v|V*C7U*rQOP4$DMZ(=AV1SJ3{6k`?|Z|?f?CInfX~Yl-7k12k$%s2lxH=aO-pB zF_b_VLWdXbCx6WN{QO<|j^Lz6$?tImO%o6TRiV*PuavQP1_V*BJS0fWbZ#_KzQ;9BC+W~r=@2=X{2c$yh!6c z6~7ICl7fu5%1lP|JZN(``;;^s>N4TTeYWk`G=#qUG=(HX2Zp*3s6wdr*j!!zy-iz< zG#UF;LHcCmOLjy+UCIrZ@*#A(eURT*MtBox~%;U+xu>mfZK?j zcPYGMBtCtYjxh+>B;%1{J^-9{en1L(De04d0-1woYtR$68}sN50f~ga$Q6Sc^01=@ z!ic0NkKVrjM6-Yc0Fw?$LKrLvXus-~&1#7@paEJb5EKLHTn2~$2!J6ZftHqEe(ZHf z0;j+bS_+Q<+VDygx&3X9|C2Y8mID7xfr$WigzoD?MS$IIdqi8G;7-0FE3d@QJ{=2T zhHi~OT`ZOaHd}hL-=?r$>+fJv22V5%E3V?Vd40tLJ-YK?|)O3|Jz9WXA$c3uohp-e#F7LeZHYap;s400eg%N#Vd@R0=>*{97H29Pcd>_yLk zafP9WaSa?JSRoVJS$HSIaObV3hr*tNhHXr{E5;7N1h7Is2Y>PiBLV<&CFT`P2~%Xv zwfO!U!@LeglMXDrqBGxnno38#JOYL>00Fi)WzL%Jyj+lZ!TGr9#~+N`70Fszyiv)! zg+&cRx`)(&hg75>itR+7&?Krr?0l#T>m51^P{BX|a4>!;=I{!Vc}pOIVBo?FaVsuA zw%-xaVtJ5EYzM0Ub0!v&4BirkWRMNB0B{})6B5Xx09O5!V-NP+env5zVtbarPUv z_cpJ+NG;eaCTLWOwlC$wBhb*uMP_sM5vC7X93>zmn}*Qn14xX3wG7b=S&l6@|A^em zyRrjWO{-P|0BR9nC*X`U2n2Oms~eI4(s`~J9-gzeU_!ASd{|o@@!$qXC#4`4ubME_ zsQ@G~n*g>PI_IvCB+`Wd1*7*w0%mP}W!UY#H{1bIk>GhCnnESk`%UKG7_v3uNW^ot z_rlnQ(M$R^_>)H%FJus5d|^;vjqv-{Z~{$#oqQ;-C&OHM_u&&=t<$1eVq-ueT~ok# zBP$4T(;YI?p{F>}e0dP6fEf@&n^a1O75$|S9ICDpUzaT;J%;(X!}puayPkfngNEd6 zf}63gVe7`fdN1rq00j4a_l9fOlbv73sfhR@y9f4mgPk@iG{~!hiJY2N^5Q>=;URc6>@pt==yxxmju%bhN z45jXV-+76tohefc61g$(30o+ShJ*x8=bn4Sx@EA0=cVM`Dh}_>mIYzX0#w3V1%$L( zcJtapiQj#bdBIqGE3hOhk(y0H9`_ehBBr)MF3GDxShS z_Q3~k4ue}})|puBo?vPKu(Q~1we%*iy|qs;u$_f>A~`DPeds>64Ag!$(p}N+2*j8t zF?1H79UDY8{A?I{$Vm4Z;HN@^;_!gTK)@q9@YRG0H9*`c;trX{v#vFg+RX5Zv)E2x z7BPsYkPATOK{~w!V&f@I$s_QH)(dbgl9HDZw`5b*Xj>`Q;2dI-qHjvH3} zOD;U3*dipb(iDd&vVny@49kZM4ea5>9x*ddJ`|T9PXUZ8ug1gWi}g6F0OaiG8v>Cq#&HWsN6|c2 z48cjPbWjAa7t=wOrN~SG6|rIu-4;Qx9ak)@AOi^i1o*Lm=dj+Lc1a`zL<7Sum)?YZ zF0|VL?5$UP!FIqqTA5BsEtdy3_{Sgi{6A-7S?v0;{cLDQbQ@A%YPXZ_D!j6LM#w_^ zY)b8(psiUy8*O61`?y1L_nt5);Af))Urpqm2B;aY{}o+{tuBOg7GOylg8WV7cz7^7 zh%*60%mTD(kVKxj&KAwmW(xz+hohdRvM5SuEJcABqjpCE+kx;vFp*P;tFI-<1SJ|t zupK5eYvR)J0)WDP-=Yh0&p<*XcsXDIdmoJ6D*$SkmsrEXYeX4R0-W)Pjv9Fc2IjKM zkEygW2@EJ?$0WEh;0fUm=Geysp38)Eij#B~0K2zPsZ8eLkudw|UIVsJDX@dEUKxxw zqVNv=OgkO}Cp=uZINk$yI$g7hPvW=@l>lIcz!mvbD}|oLz2e8&qhbRn#ffR5EnYI zU8a@JVyTdp2kZcCJVMCQ8Yd2UQbEwdB1B?L=K7<5V&u|p!xAt8abgW{K@L5#eNRX? zoiDaC2oEIilU>qM_@%_i-FJE0sen@)2}4+SBN0Ff+a4y(p*zoL>Au$!CLOs?5NX)9 zFI$0>A#72Jjl;RYjyoYu3mv#A3}?cDtHf~)z$B+bDKH8NcI)|Y_;aQF zv5*8PJ>}>F)?BCX4#OKR7d&#?caO}!n1bQF!b$|I7)(9QmVLu^0`f565wIJgKko+5 zT&I#lt1$J2N?>EqRfvg;E75sj^s`|D1^pijJ#zjN6(PrCWEvr~YvCy-J8X!v3Q?A3 z{cN;%fxuJ_Y^Q!Uc1RK$dr!FvXlmwE1JrZ}6pH|<@DZSxx?f}x#NST%3$v3L)-wZ< z6o+@h94A$TorlDbP7de;0J42gNW&t{(&dh`+2ZFDFmT|aq417r<#pPZ(~N(el6aL7 z(Ctw=w)qfXkW(xI0VJnGj}Wlr**#yO*oYxV>9Acm{dkP{*u-##cZGQM*^`6>;b9CL zEewPc0}c=bBw%F&jjdi32lM-GQVLiBoB^%kC9+Sk*Gci5C18icmjdwbw(d3%9;X=( z+<68+8&tRWVjSEu2-s8|^>v#S8?R*lw8^{x3gy#ePp z1w0{sHePpPZ^@Z6!sQ4_hX0b;u2 z3LMVT(k7Tppj9TMvyos(glGLN*j;48*ye>yeHGAFr?+Jb`g)0Iq1)%C&OGPW+A2+*i^t?`2XQ=r?w(y9N6su zG=fO%&;yP09&Y=hsF0WoaP(bR1RTv|9^%ZVIYQXb)6nl%=nfhd)Uh%e* z`IPmu(OyajY|T(?2SNO7==>-M{yi+dus+IdKvVOl8X%@M!C_qG9a*H%3iKvnFjE*ow;%+o{pqZ>BXl{Yb^81Po(fEMSv@Je<`$R42E1n+Z1I zzR+ht29h1)l&2hdw+&|d!!j4bJBeZU8lWFk3Rh?n!TV4&c{h!i?rm2FL$^Xd8`KEg zfSeGLLQSFevq1^yC-U@3;%Vy>LgYcNz$R?Pt#<%5Nk%ao1j_;NOF^EbB-S|CvdLstfzARl zfgO=-t|;jkCf_YO;mEeJCU zT;ISS0!`vqtT>3jXvrnXVHIHze(QsUcjTo-6A8%+CfFdujDR}A*964FyQp}IZAT%0 z8iVZsU^`Alf*?qajF@!TfKL$M#147g5{GSoB#L7@1ZcA&SRS^M1qEI{C5JaK>ruS{ z+cEoKK?KhXiX$^AY8QYXq+xb0P+7n`fSn$8E$n_av@Ddsc03_Xk8dF{W<%PV3KG2D zrL2qQ#9i5+NFug6L3OkXED&<07nToQR>J=vn|A`um1Ze4_-sF~r$UV?YqNLuW&P*^FCYqk@ONaF75eH_$UFLyQZI zAYx?FNDwF&&;$W6zfgdZNdVYMM$8UKEOR{4V-IW*6y9Mtk$Bi$82H#4BX5zANHS}{ zlY^BzEF~bk%pzzcOm{d&a7(OTk%O0*6G;*9&j-_MHV<$;qVk0<9IaV#1~Hsu$}Cj5_RD#0hl1z@rxKD244PUbp;xeAe~=eRbu_p z?cZ-W56(me7}ylvyZw6`TcTLV3zu3b1vn45MlQfR-k+kH1ia&^Jh#9P>1Ts}P<_@K zK?f!c!MkEp6}E>Wj(2o0-og__@Y+<~EzUqB2+KosKWcW;c$VNf9_0-m zWFfCjv3YqkaGqijOJH*0r6j8W7(8T$i}zIKEkK*#w#=s_l7c_ErG9dmAdh`s5)W?- z8KjVtjsiPRD(pd!Z@&P>0qk(U5O}v;6Vg)ptuW|ECbknm z1H1#+>AorwlgaTvN`=W03kL`j6!(^neUV8JDZv~&ws4r!fWs0vx?{C02)-ahPCNcU*kk|!sy+DI z$)+k|;KCxHLDnX8Cc^EH?PsGMfFeANkx8&E4ilXR<1({gwME;M5*QIOeKj~a4CTXQ zB32WN?dTzBK4F`pP&Kxz7BiLNMzI|z%EMUjf!Peer!IG;IA@ty#C4CnSSFxcitUgM zF+S(Nom9b)C(c-zol0hB7DfU+NUuhh7Cu!x2DT-ICYH#FY>JmIOv$t2gtyopg;9qQ z3WUVi^z%=ECj?(@<*{O2Ktxff9WM><7G=Rur@&4=)QMZXRoZfe3~a}=DB{r~4jEDe z1@`}fpN*$gd8;Iv3{x|0Wwb1f7a@e$F79VL6ZK^iitO)@=76t8WEiTkJxdtOy#xSQ zK&TMa*%HN{vME(gvqeMB&Z}+#Ezx13pQlnl$RU2BKLfSIZBdZ{LLNaR0_hM2vcZ)> z5kAYjxsiYlb3zDRG`A8YhbrmPhG0A3ee8iK9CExf|kS{|Lnr>M9*ZgcsbqpBlw5=7)$isFKKij1T z$><3PfN?Yj%qjx!c=;NyA(LjJZOWF8NR?xPnxTRkV8K(tEcunpVAgd@>6fK>H~^4m zyOXjsdMQu~S7kG@>CuNF224;INsobnppkh)5P&5k9ZPkxS%9$*bB>;@;F)$5+sP27 zSHL@!8BjoJc?8&^T&MzXEV9i6M-Bb(BM6EEQj~ayw*zQm_}k%ZXZ`JP%Mcy@$Ng;b zbWY>R3{E#p(WWx}Y&1RT`D8hkrESBu5gH55#?@CPFIG%AEcv+{1lp#QKbg4m3og{< z79tH`8iMH#l%P0337Olew2x&;2)kvLS$GLpRA(Onl=2bVfwaOMTR8jy_)sG&Ck$+g z=PYqJOrh01Wrc%wq(qqpIZnvHmDb`Y_CwnBt3YEko115IaLpDg`Z zJ<^@nD+~$X1MS%VWdi68=oa5iW1q@1+VQD@>`hE)2;zff8;H_4PDyAOV9kq97=fX)Jnw5;NOHdwh>%g8(jg`$a^D7_%~*|MxSZyu-3nnOPu zDHlC~wjfI^y70x;qS#LLMv~j>Efb-6~Y}aCGV1+yzEX#56BPC#QTfAQI zt5Y~-&2>Vv4jFMiyr;bNJKIJ)8ejkRIPmQwv3MyJMdPy!SXuCRDs`)%pN#-JoJcae z4Zy14_}P@IK1ocmo!7E#vnt|eqeY9%*JxIX?L0qQA%YjRsQIM<;*;s;7s|s2dJAla zji0lHmUA@;%5_YN|{epmNCrMHz-FMQDQH(L)Pzh+QnfY0Fa&gC1C9lA9u2n)Jtw0`>A*u?(}>){D#l!l zPq@=GfO>r99bX9}2W(X9XM@XvZY7hAW_pDriqx(UrI9yr=aQd|wjk^)_^((+6(WRD zi<&PQz&U&XJA(0Cf7+1<0o#D>OFsZD;snl(+5zO{K>?s1Fsopp;De#fYaQV&tUFA^ z)WBoyd>oGiu;ctBAc$mCt)Gn?fo>5443{cNO_F@qD0 z6(W#Pi<<8mxc)#g0O`(7p?0tXz?E_W=N`h~rBpKfg>R?kq)@aDYs|CW5A6BEyABwa z8OH99!Y^&*q-dFWv;6Woz@HvCQOX}Bv$#Bt#9Ubr{A{ebmG5w&7N8JmV6%S$h73Rh zK*3@~9*-lH6jyMZz`z7xJ9~&iB^3k{jC5+cv#WK)V^JUz*x6q&!Q2Nxrg$rq3JHXf z@?wyfXRfoi=uY&M5r7>h+5GOD|Oxc}N#g$A?MY0YV;<|y`2XDI%*&2>d0TZ0JUU>^KEaU>)Nm;@(dsz4& zrObmaLh;x)c3J+QSyU$(;rGKkQ0ymGgbWLKOuqQpSe;--&Ud&_3s8tOFl3$B_fGM} zQISvkX8EyPwrAocclOJ->?76E1;h!Qdp0WZ%*b10A)X*@XW!fSo)~_$nf_EO`(hEk zmj$rp!8^?>^Zg@UGs!dBWm^9Di5BvHD-e>$r?A}Si=T~m7^x5ei(1rt*Fdwm{u!U; z{zwPVn0(%l2jk?cuy~~Sz{JOIu`VDVxm7$@Hc~3(1m^Kay+r0RUgCVbg$G97B8%AG zfcJhI!|;vwwm!iG>H)c|D+Z1ofGtdVwiXmgSU)+NfYQWhM>4R5ozE_pWSaft~I6n(T~C67h!~nc$c^9O>A%S6CPdH-tM?2gjAe0#bLC=`%RFR znC^gmkvS2VPd(>EUA$XFQh296A6BuXEPAEyU9xH9(Rs7nlUF*8&wD=`DVlAU!UZg9 zY4cqJrz2j_4lE=HCR2oGZ|RT333Ksc@cmnwQRG*{c)7B1tCSO1$e;Y!9N--wFML|i zVlW5cg8(?^3G|~2BG}Rd*vYT&;U`~(*iMXgg0%R7RPosm+1YtPLf=74P=Qf{6-%6C6ozGH=2fWoDLRieKTfnVmOu*@Uq7t1lY@WXZ@ zLyY&!p}A*?$%84xi-<=b5o{;bWNSwg0BQ;d&JdB<)&YGi;ssnWK=q;9A{JhVL+HOL zOo;7p!c&X|!5*X`iP@`69}86okHCj;g(f{amC$mra6mlV@9+yD(0CBkX+wY=%~2?( zTAnJDy;a1|R=9vgEp5JQz)N&{OZc;26yY)SNCzffL79tjk^rU`%>@FtKv8gJ1ME*_ zhXXG?G1?V(0`s!tmRDK8JCGc}LZl^Ckcs)QLU9y?FhoUI&$h4>6~;gqR!W#)UL6pZqQoG*7z? z^siu9g*utIpAF5C?^vN0An!HMW?_KS<}jf2noDsAIN6BXt}B8Rk)+q^Tk=K(R{Gcj zr9iv(<&5N@ITg#~(ky z4dWkRf>}EoBGD{BX}H#@Z=V(+LXatv*YU9KqdfnE1iBNMa}^oR>NG?H06-uiAQ9MD z7x~3)kT;usU8cbR=oSHXpa;wCS2uG-MV5QhAS>FApLDLwmv!6^X$D0Y5*a6skiQEFUnvVjqXs@o=k1p+96A z^cm6?K={IlQF$*jP%)6{FmKX64*d6a-iwj#5+OfkC5WwHe@10R5I#JSKRW=l>57;K z7wj$4Yz%lp`X0H4CcaY~(g~~FUUAEG0`v4HzP^CnPGJxRFc1%@jw_2@6x)ewh}8+D zd4;O#R^F6E)T=DKQ(%YKSc@qoBr(+Kd`Fe02!YuXdS-hUODiSDkCYg$PV_W%DpV@l zaPdQC1Y%RO7WhU19M&wa1Hi;BAR2%v4p9$**It4`Wa$8?q(5*ZMmncHTt-gxP0eWe!{L$2>x1%XED3YZeWzeG^D&ul2 zwVe>yfz=|;7MZRaA-s>?_TBr5ta9M2z-S^Mzx?v!KTgB|s|RilAGR$5fyFK!jaS|K zZVUtROtk{Sv2^M(;{{|9Pd2046*0)U1O{x zotP!xJK|E&wT#Au-*J6;GeNr(jN-9%ZpiSbHAG zEaHb@bFnn4z)l=I)BQ$Pzotjf4-QWpdX(pOV1XSpInK=vOqsM&E_VgD_NW>aCxGz0 zqj#*dcsF0%=%r8bbzeB%d8#0{h({24$xCr*krD#4Mmsdk3aB&%>CjctW|am4`A0qh9*Zo0F>Sxv)hK>-a!wvn0oa9}X!o>sATpks<% zM*zubJO~9{F+w?6XFh7gCfE^}#keM>JFXA_+lBJri((o@Fy0`Adxv*O5;1J;L})m0 zuofWa!94S;T?caIk0{b zoZckA(8nI*#6cIDSXD%piv_AroPi`Si19iMxkXJ?C6cmyh|!LU;76}yz6qi%!)&K# z2dtVV8UQx3hAwEpBO9_*6zjT|d3+^H4vHjTOJS!W*15#9=M`bgrlI|cH%a|{H0yEA zTMLU@@AOy*9jY*USPpoXA8P?bDrgQ7UqqOL3o@?r-@ZXD30wA4~KbJ{j)UbIe8DQ)M!UV z5c2oO;@N?$rl|(tk$@Kh#wzQzW;-yj4t@`I3ZQvGuoiXpTp}ztnKUG%@?eR32Lm85el4S%}bUi@RRz4X*>WN956wE z05(!!M-g<^povvQkhKXB7&8uTfsL$XD}wF#DoY!mV7#hNH%uWXq*axpgPj($tS^Ok zYVKlx6T-tXr>M>{p$N}Ls)UyL5lE<1rmqG&8c;sg8VD?~gGP;jt4e(wSS9jPqn%)T z{+jOWfK}7b05B7FuRKT>b^sX0GVzl&s(B6#mFSsun6SqbG2KuhdB(P~<+9TUk5!BL zH$Hv-OoQB?>!6~@c|(VVcajzZ69_3pZ-$c$5^f)A_p&@yh?X)+&CDc_0$?Y*002W6 z;UwS~j7)6D2UzG=wlE(d5PuZ;8iVjFH!{l=kAyH}t`SehJ|*x@X9Qq70-Hcc%Y=Pl zGNodK*pAf!EeKB+oPX5q-%zU9Gf`hYxrRPNkIuqZLw>G3x3N9$)q4c;1BEDyxUC4P z(<>xFTfpQ%$~<02C_CPN?DPOk#ZjH@w8FFH>_#V2X1V>UtYX=7EG%;@H>hAabO*7l zgws>(OUbWqkRbA7OjH;iF@U0ZMq6 zlP*$tDTQ(Z4S)%}Wa763*fHrS`>9*3JLIjE#7k7+Qy#WMbrjfnrCfTDj2{q30C z4NwmY93V*pU>rs)O+X1m!q8>)gDmtZ{3N`mY|3oV>>R{$W($?Mpir!^VrMnR7{@Cv}C2oz9l1Ds(clGOxtu+XOkpMd#IZSpMlYU$5>6KKV^=sTAd!~ z*THBZwxhG*M6QCGS5Q&efOmLl*dHaASrC97mQT(#9}_1MiCl@IxPa#6tY@d2ul}X$a_SV27m}&JP<>iEue-#7927% zJ?hwl!?K+n^`Maw8D$!uu*u;+;jI^lUxffWt~g)Ble19V5=EinSxU=;R$zO(RkvEN z2)0=rGVPeebcgEDF6dq8TIdh3BC_PEYyzGPC{!e1rsf@b$Bctc%g#8UiHVZ);h@Mc zF9>OXEx=L$jtJgnTTULZ1ELkQcp(*wf#?{>%ZdSM+1|pQW?_>lOJka#Y}wO~;KO3O zvTSL3oO<4fF`EdEr;Qy4>ruuN1(B%qQl0%MB36><~C zQ2rnQ8bD+4BqK3PR^)4kaLC9@Nst^@?8kvK3_OAoGO-=NPB9z@x#1eZ3W7b&h^M#} zRv`~!Sft8Ealm$&RTi@19ZDhC4tOU4FAj{|A4OM%=m0slgoQF7MnQN7u*>wflm3G% znjU?U3jE)}cJ}0n(1xU-lnsLQDx;+UYsxZVWdjGyK`aLr{CPGun@lO1T@LWh>f{jH z!41bSNd1d8ZJX!(%1o2gjcadsVvv=S(ElB5XCX_4*bY{#UnLvBPB5AEa-+Riyamk`A=3s{ z3fS3QTHZ1Nd{{*(#TJPn8!IX*0{-%}jUVYqhFjpnClXTg`v-{S0k6z40yM@5g0ZC3 zpq5vJf}kM}rHKqM>L^UH1PpkY+o^D^voJ1`#)Oi`+oJ@jWa?ZgRV$d7oe+iC4tVeE zdm9EkLCc)XI9bZWHkpu?*@A>8q!I!6bQbmx&tV2fV!)Ko==mG+IWAVbS1xSZMjpPA4k>u9nx3AxSqCupa z<@O_Dv;(VwDu5T(76Q#Howe{4gk^AGd9s5MW01!`+qb;a(JVyZk#I#1Ka5OB=S9N8 zr-vJ}Et`TF>GUVul~9m_;>pNfGu0A46HOg5EP)MHoVUShLUGQ@rUZ0TF=P_>>1q+4 zSXZ(=ily-=+f!0Duq9uzP|W~vR3!k8ThVo(pf`lh5)<56e7zG*t@-z&oG` z8b*MYgl&|)B4{ppP6qr3ZwY7dTu4KQG^5H1w2Mf?;StssB85UxtloGuj0a&K7U4!8 z$sDrj?}e=b(qwx_nB@bI7gnD=LX+hr!tMo7$)O72 zlp!n#G4oEvyh!~>1NK!ZlY&4HbBMRF#W3NG9dXPNrsrkHZT5y9PeobUey9#0f@i(s zpra7R<;4KrbI(Ns^HKz(RBpyoIK`~-zkhEF!JHQZs~$(+c{*3sEpNevS(t8x6U;{f zd1bMyNMYAP3``LiD%r5!Wscc`7Rln3BKD+$^0QE!rHQKuPZoHElLhN7fvL=ogU zG%OR)GIOzZxVZlZLb6>BlZ8@x7_}|@S;|KmUghhLBC!=AG)B#&BlrJ0`H+~7thvq( zB0L39$U}IHDfn$f>~^q%WtGFjArKhQEzkA?GRSk-l9#9CfjNywvfOjaKzn2wWwpxE z(0n$aN!Xw?hR%cT`=fXmF1)o}69Qm|TSk#BZ(4*>1a?wL+X2$a{EI1=-3t)eYLVA1 zp+IPrXPGD^l}vCbXpy;u?W}Vndq^u(6w8zM6h*L4voxxC*~u--L7sKZ&RO#CpKzl` zG$BkjmJ+thZYI4;r{SsSN8Od`mMTdMJQ2ra7JoovlwtV82$wma0RAF2JPOK*%q$M@ z5FW@Wk28A`lEOHT$n8(virDH@y)yMFuTojYWs<`TA34d-wdl~osut3vE$D}vIM zg;O@Wh|KKr0i_7VU@d|pAUBOS9qPF5xG(m-a^ zOXf^;D)MFgn{*o93f?(oJ9)m)7$fkR@Bl~T7UN4qPHLu#ClleI$Rhv+Ik^pMP+odP zjP~5~!|`VdOQjN*rj)iVE;oWKMw^$x0JKDqDmw zJr5HK=520Zdv5TA_NbQws+Q@y=6Pm>Zh3i4fQ)SOi96Eql=Zq}Qjo`1JRXn^MIpfW zM|FfX^1bpn?)3*6o~PvV?})J~qO{`hp5>89j8K3E2B18{o)(%z0`LxCmuK&RInQXv zEiVSnnLIwZBoE#ZpF?dZk{#y^(JsVjhl8D9J7Q2e8_>jgFxT(|2DW1fCfrel&5yt) zM!y2EW97(3W{(yh+6ClkZs2fk@PxV)VaujLt0}k=0j|;}R%D^Urbk9(QPz6L1Oba3 ze6U8q?11b-@BQQh(Xq)NXo!1NKz~pkBU+vzN8&M{6mbiap_lXZGHpr`0^S&T#vYEl z0LjUh%Gj^U;AJJ&-!8&DHy+8uc9mG6iU^ETk;HT-4jGi2_b@I~PJ-=#ck+TNyfiqx zN|t6kY)5wVuADpD!KZ+rx40NA7%GT_;tcVWHG{Kl)(T5u?RF8j32MRi0YzNm>@KQI z_lQs!)`x@QzyX>RCX*L~#Ha$UfON9HfY`kC!td)tAH00ehJxmDCwc~Mi(|Xua9u#) zg6%&nP2oN7zb8Ynovdr1C`_qvUIAmXToAEU$Tp3|&Zs^2s6z(wWSf<0Gg52^yt4uD zuG)fFZt});L5rs{EAGU|vI@DulLc*YAZ6cX0_utz)nG-XMdB>0MicPh9ZXOzL2Q}^ z1P~iVKzNw<#F+y;he*U+M?7W|81O>7z2nlG(J$V!0k5f2Q40=1VMiXq7aUP@E(w8m z81^}5r4$FEWSlk1ZHJYJRDp4Ch(iYRi%7COenbyRvcL`+o5Hy#2|K_GGEKe5N+Fwg zjaYOQPpSA*7E8sko#zr4pR@3k_5qRQfJ`|7$TY7~1h@g!0qJC!06xN^+bs^f_dJaa zI5VSEDS49^4orEdPU01D$mETvDk%la5FortSSii~#<|MhQBu5gnsWN_7_=!}h$*;_ zNwce*kY}`GKSktpP0q!Ti3SBQk_9)OTOixgvN)`umm|xvF!j(z$ucntrHMg69+_EK zqaAacxP>p10}5gVV+)l>(>WB_4ul7=%T&=|ztD(hX>5QEFOO$F#`Az3UIJds4~Fef zbsle|=40dXiiWeA^~MlrSkHdy7LH3AMng5 zvIT%r=AC{RmXyj11r1eLXFGWd6;(zgdn#MCgPNyO^=)2ifaejSW;45w*~vEqCu&w+ zi6@D%HGmZdW_%UCyGqNYU@j!oJ{e#L3!93Z5)p!%Fa~hPcDbA{2iS#x(0w5kfW)v% z63D|tZ-h&0KrYG7v+5O}FY=%r@%{FH zuO-|{Oc4fr(VbOAzSB5K$g|~Gk>HqxF|Wcw%`#Wh`K|$(`Q#sg%bOGH88dHAfXctCP?=91Z_3Oacd6gY>; zn$7j!c;m^<_!OC;U><{%sZ|=uGwEr(nkdv7kO!)x_C(t6knvH1+^a0>c*o&(2!;Rx z*bcXRZj_tDF`k#%0f4Lq6gP~;g=9^40IX6@3CbBZKa~wkvLPF?@T_;r5CnK)`k=+- zBLP2*>yEoeBVGnPekU`)_s&XQVCh^vqEKLK{ofHxWFK?lk^9~KzWcd7Vz`-;KJtttr zu1#pG0rRslS;!Mu*?4^H(SCE-_vhZrz z#5Ew#T!$OP>tHnbE`dy+40-EHoO$-1!uJkf@4N9%_OfRqm$D;0f71iv*gEpI9kVSP z&ohG}z*!MH88FVy3&^OfH%2Hk>WI?GE+>`)*>)2NIV%#=dO^Uzb+^avxi{}j?DpWN z=O4Vj68l#15cw>PZJ>fo1KTmuvDGEhfX5CO*2^N_U@XX0Q_CiAA9KXcy9C&AwOM`3 zZkr6ZOfJDYdKA7Pk8cjk`;LUlTTPMiUZBzd_gE#U3i`l@WeXahjk07K%$N&cU<=O^ z<{a4bSk>nLT<@{!mg~;Df1ik1=bw1=?#oLL-()*PJx|NGAJyYEo&vXYiw%xY>hL6( zKpp}76=0)IQlK?}2BkLqKWAb`?}@}Ns;%?@B;dWvS{a@h_-9mj5|U~Mhiu8mg6AMZWksEo=_%fOA#zAl%0UVXM{aurE(i8;I_JewK53q@QgS;_+|9Wc)7 zM-du;pS>N}Eak~z0_#Nq1Eda?Ij3Vc1}2?~etqV?YQow3uW!b`yZ_=nKI&W0-c(Yg z$&iMJ?F7%+Yp%XmqM(rKWGc}B*~diV^7b()-m2uAx~!-;c14-f1D2G)T%+>ogDsuV zIYf{A$_^~$+1Mg36rPZHcb*(;k+&NQ171OdM>18d8hAox|lMs2_Q*NKN~ zt|uM{e|a+cwF<+T2XAgBq~Mc}FH=7iBHxR!&y$!ev0bJgULH4fd_mR#rfC4X@Ew2p z=2~u?fF+;$r+6-tz?_1WLN1x{*}#wjk_CpkOb-e07VZ(?GaG>Ch!i5W2r|Ql$5tt_ z@Fo!~889{AkxW;7UMi=nPcTlfOgeaf@%gxI!OxE0d!_OK`#d-yCFbS(HwE(Rjyb^- zjC9sY=g~qO$Vpk*&a2+c&9>^;jM&G7w@vs4C?Fk>n|t3k18&QNbT$%cSW#6-=Oq@Y zyez=G%tM2U>qi9JRW5A~8Ma>%IB;DkPO!{675lIMlOvI@aw(j>{|0#e=+%dU_UQn{ zn^im|407=|!GZI6c9=n)s1On>3j}!y)bUDbKnUz4JAgfx%x1zL?iUuxSsG58T=mT4 z5O4}YcEw#NY-fNqj(MRV$S+fdX7l`euD&<f~fGF+Nukc89(=7?GTN;oO5aw-Zz2 zU#F*iELfj{VVg`PG%R6uXN_mB(_8XgDV3C%B@@67J*Yzx1K7#3LXGWNYOjDNkms3! zHzrr-6sSceuoT8fdFK*&O%F)NNky3JD%pEgp`zem8NNAu!omCV&&6#Fdb%(CWp0NH zF>mf9r6#^f|L`NY&w1@E`xXO@qIZ@=UY?U7=W~GMIIxE|s_5*a#&+2aS$JaQ+3mS% zu@m*E5SSwD_`%Z4@!LY4?+ksBH(`Ich09r>k_%m8J`#>cn*Zeo+$!77^%kg!U*Yj*|YNsiG#&^ zfApNQaq9w}ZVP#lmtlW+^5utb@%sPkv_keiQErbl${+r1n99`kArDs(kBJ~}&{bqv zfk)~CnY8T+5dknqA7f!0Cv)Iw2jJ(yH>C?BcosC7ZI;5pa>sSoy&1-4l7N-?UI3;TBv5UMYHsz_0R+ziC6eVF|1Lhk zzi$ll*dP7(>A02GpRBw2EWd(Z(6ghFuL9%W;qdv7cesUkCIPnOY#3IrD*p*f;V1xL zQqvvgx-dcB#E6`?$59#e*AMch6@IW%3KWnQ1YtTX3mUlo&gfnDrXG8^@KU^Q;M4pK z>w}&hyZ0(6AtnAz`j36K1$H}uckDOeLwtnJZOJ$Vx%|{v9EDG$oCd6TDg!jP*v(Ch=zVWmmgbhK@Pei@O?~o?FD;&Rbp^||^_LwN7 zQ{w;aor!lON1f-*vVYRlvRMP_AX-C3n?_wVUNMn*R8ENSK13c5dF6+yl^LZYH-_oDAy7qKt^BU>vgiNa z?SJI(^fOK2m%CH%jV|wYt=hy6``0l~BL<&u?bN|7h`A9b`#@`rN{J^w5)cF`rnD8<(ci!8{mQk%~lN-Z{YmtpQ8QdaHq+${n2_x&dk}lIX&WdSp1-3kL_v1oQ;TB)lcB_P@M7_J#Myzj1Kt@l$jE-W>m3-@=>2%eJ-mohxUjH^DU>3Cpa_;tCR|eF7yH;ZjxjAiy&D?PIh5))aZE zGxhtyC7T-}`RArLJqy>@cGBRM5?%qC&dYiZmmbQG7q>A~rre`tO4t!rMFMspP%0@d zvYyXn0xW@lIW+ym>G|hd60Z&{)r9RDTgA)%!IhhvH+Rrr#j>8a!hwe~U)CM5auTR- z0!30hiB+v8sC3}2pEyUD>V<+wE9sB5k} z-1u_T&pJt9hY%=Cob%lZ0ha%>Z}O2NGe0;RexW`2o8E=mvV-GmJ&`N(>$mD-<`z4j z+mLi>z_=2@6`OW7vsO|S*SVtZQmkZ_Q#jz zqMNsO;AbqVd)`9W%RQ#Ox*asxdlg@gHE9)B)gl2aT5VqDzx~1Wg%5mR*&lrLcaFDbkGDPlYj@ylpG-Y=a_$G`W6yV_YTf=Yywo_gfteL|?943%pDo<5tOVe+Yx6+T zbuTOD9a6cXEN@5DC_&3xxn_~{GrXIqo?VYnaRWulh3t(mo3 zx9(@&4W*HQtq5Gcbq{*(Ok8Q6UWb@#sxJN>bT1hf({wVaKq2?9TAN!E@1 zv?IO8wc0t4!HO8%@@EJ-jRb5hou6L5Zrfh4VYVgkbaSGn?dM(TeV)wV zb9`pbwvgE{5-=oSMcygwhUl1?lfY9K6E$Zq^(^4ap^n70m23A9J*SaC?GjkIdiS7f z`Q4$kp-nAcuidV(<<%wd#QAtl7~W$&F|pxJU*EWyd6$Sr0(C)cl8(#=o*1U;vbz|JBtnz*cKJH$ME=>|eELh5Vc zauDr5HokK6?)}u(Ep!2C^kNI~CSK81BJk*$Xyxsh*2ITnD_!Bs>C1NzZK09CPA1S8 zSUc!iN^RZ}5VmgI?F?g||!#kOtU2@QLsFAJ1jxzif+@aahT>}Or6!~RQ{ ziEHD=y`2V@{Uw2&Kp>mbzGr0N#+~~+fq-rM_{~$15*lt3FZV5+m|XWRT*qgLY};!# zj08xaNCNn|alo}?=&>X7sCT8v`nh?L1ipSUQlve4CWddDo|)1Hw|rV;d$>6XkbwOO zWOLVLsb@^4y2tTrC&C37hE2XPv~*#16Q7x@Zu_}+5+H%f6F|HL(v6SX%3`jh5tgZm z=LMCgSD8Kj-{WD6_W1eu+at^P40Q7H9SmBfkpKyh!1X)#N8*>?8B816>A)HhRg1t^ zj)hI^>5B=>tT>3lE!XZ=tA*Sz36Oxz2_Wz;w7oC91+|AE0c}rg-m-b)>$Q3RbaY-Z z3|2fierYsyZR^&(dhIp)MFJ#HLING34NcpTC}Fj%su%)aIx-Kx{l%{I5r1ZI3%)OZ z@BW`?BtQZrV4c9^(sgM25$}riO<1zr1SXd8mhhiwBtQZrP%we@>vwlK7Vx*=8n__| zkN^pgfDH*y*zI>vKE+$jG!h^I5+DH*AOR8}0TLhqI}^Bb|5F+XkN^pg011!)36KB@ zkN^pg011!)36MaA3EaN-DUAe3fCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W2G* z0(U>XO(OvkAORAnF9Nsjeo7+&5+DH*AOR8}0TLhq60kXen|D8@kpKyh011!)36KB@ zkN^pg011!)36KB@RGh$le4K+u0wh2JBv4NTZrr&~BLNa10TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5-5_u^*i@zBtQZrKmzqf;P(CNG!h^I5+DH*AOR8}0TLhqdlR^J z`#y~XNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNaONCH=H-KUWN36KB@kN^pg z011!)3D}&#m0R~{BtQZrKmsH{0wh2JBtQaoCvfxL6&eYU011#leG#~P^B#=^NPq-L zfCNZ@1W14cNPq-LfCNZ@1W2I51h#J8qmcj!kN^pg011!)36KB@*qy+QyIV98AOR8} zf%+n_dE+jP1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LphyB6*YDCufCNZ@ z1W14cNPq-LfCOw#VEy`C8VQg936KB@kN^pg011$Q-3eT~yG|nk5+DH*s4oJSuHB`P z011!)36KB@kN^pg014Qfz}mGtG!h^I5+DH*AOR8}0TLhqyA!y2XN^VzBtQZrP+tUA zuil}N011!)36KB@kN^pg014Qfz{=G-G!h^I5+H$kBXH%;3XKFvfCNZ@1W14cNPq-L z!0rTYuUw !)3DgyV*L50wh2JBv5YzHgBbABtQZrKmsH{0wh2J zBtQc8CXm{^MI!+cAOR8}0TLhq5+DH*usMO`<}DftkN^pgK)n&zxRs=l011!)3Dg^b zo5>9t36KB@kU(7#NNn7skpKyh014C^f%TgS8VQg936KB@kN^pg011$Qy$QtEZ_-GB z1W14cNPq-LfCNZ@1Z++qwtkaF0wh2JBv5YzF5QgLNPq-LfCNZ@1W14cNPqWe^R?FNkmNPq-LfCNZ@1W14cNWkUY~ zOV?>6KmsH{0(D2=+Vm2Q1W14cNPq-LfCNZ@1W3Tv1f~|R(MW&`u@~ zfCNZ@1nP=_D}I?q0wh2JBtQZrKmsH{0wh2JBtQZrKmsICX#%m!E*c4t011#leGwRo zU8a!$36KB@kN^pg011!)3D}%~Gj^Fq0wh2JBv5w*wwy5<36KB@kU)JAh;BJ)BtQZr zKmzqeU^Kc#BLNa10TLhq5+DH*AOR8}0TLhq5+DH*s4#(%$QF$RNPq-LfCNZ@1W14c zNWkU<9FZ*=36KB@RFc3*bj2B)b|psL$u3Xof;WA9Jbg%*H`RztccOnR?i!8FJ0k0q zY#aAQ0wh2JB#;k*b!RLH#rCGo2pPASfYiGZj?q{+pWV@GB>@s30TL)90cUIm{<%dN zH!lVc-<22`jm9bRISCAhw`e3l0whol0;AE8C)H#w*M+ThCp#UHg>tmHj_TYT4%0}0 z1W2Hi1V*AUce1rG-L}4!E79wStWd!W2@HidX(T`bBv2{>!;vL-qSIWT$C4j+&A-t! z{o=97XAb%v-|czieb+aH?el&InWuvPeqrX9y^%k9Q=jChEipJ0zErCAvmO#40TLhq zg}`XcZ=%DF`0jHvFYWhzU&y$X#0TzwIUIPpHS~%rxj$Rwp46F<=)BSxE|LHVkN^o3 zNnkj#>Pqxv)86jz9}fDTu%hH9Wj=6y6Mp`1d{?%;jKv*A_JW&}011#lUIb2fmJg0D zz<$>j{l$f_W>1}%`R4vfa}$M;*fp5aD#>ft6)5b8#Qn@a|;uPBV6xJ9?T-v%i9aZBeKT zF1E+>|M0L?zjsga{7`tgQLy?`93xFt<5C zBLNaHB5=U5@Lc0ut?RkrO#%KqetNvwm1v(@FH8aO)KU?4j9~f5^JtMOUGV0I{7<=4 z2bCs`M16(zt`4^9pWCF7013zhKIl(9d3*-yXQ+zxmkDS7x2@48|EdhZJnf7*R27Zy zLG-&|WiH8vhXOy)d+$Txhm7W8}1ilFZ-kKD)K%sza;l!C#3u4HY#BKb8AD9&`8YXjQ6>d=RK)LnY=f39GPQ@ zuF=@YaAc}~eyIXY;x2Y9fwTUV>W0&CL;1%33C+-wpP!#MH0Y`*hC~&ASzzxU^d}#j zFzepbG5O*hh`w8aaqNZ~Zj!mz`ZNEDQ=MI zN;W&={f_831aM$}v9xW-QCn!EuWU9Ho*Rt~ql5CvU?uHIo&k{I$Yg(Lt$fX6%{z_2 z$Bu<>H%wK=E&l>u8vS_U=jY~O*e~p?Z>1!_wc1{8iK1q72Yablj~ad3W{g2J=78^C zO*FQOtMJyUA~l2ai6Z$Ah37}2W3EJ-H+@v8+~OkK+Oat1CH4=@Efm?9oSXNCHcD;- z^D!v1a(}njcYU$3MCVX=y5x;yg*%GC8(s0Qms11bRHOc%otuBZKY7HpRC%^%d@Im= zG~mf&Gvy03IbuiTD-?4xR#Cmpca7O2N8)?r)NM9t2>%GFePUV?$Ps+HfQQy_GktOd1l}KbN-BLQ7?4H+qY+zS*_W*noN8af`>4 zKA1iTlXK#WD)_F7d_%`qSCEOfh7lse*H|!C*1Wc{cxQiTvB+j~^ExK*@$f=v;}THC zH#*~I##ib9+WURUXHSRn{Vns49}X#3rE(REE4n+nd*;%>!j)t<1XZEJz25KUwYeyKdg^((*`8#h`4JonPkD^yw3I8+(u1-0+vi?wn)wBO9YDTd zyW9_p{UU(@|H#DKvZsU3w}gJ%6L~A!yu?c7__5F*S~72^m9;&y8^zeb{2Zc2O54OD zW(~s49p6kr>`U%-&NRNvf`L`aJy%q#C59uuVp`5^>yp6Xv87VQ)e*{g;@Hf4eaYs@ zOU1BinVPr|be@@PJrOtzJ23uB&33sT%XuMa1;i#t{d-Zv>4`>E2rH&l*cPm;i~Nfh zwgsH~qVMP%4+UPk5&!e{f6(WAl^LqOy^cTMzJI-C{w@6;bLK#AJ=-TD=$}g%a_gH* zAuOPXjIuZs`v49qWBH}GIhz9FUU6hAQx+nG=1de3ZuHWD3H`YskR zvjqI`;s;0JTP^rvi>OvfIOE;Dq2+?x&kgH|K=b4pq_`w;^=~%>-{_2?!UFg_knxri zfkOwzU)tj-`x`yDL10Hm{U2$9-#L>mpv{NJ79sNHVflu!Z7v*sfD66S5{AOANi+oC zy1c{NSA<o~Wv zBZ1$vME0c10Ks~3&m-9NEnx_J1CR+~q-r48DJk0F|}NtlYK);B$Vd=yyxu@b4W?Tkj+E9O4NHwH{X~(?yZ9+Wq4%9S
P^93 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

D@^0$GtM<#+P7=v@XhR&F`N zy%J2I9!i!`ji{~uA#vy1?LY?B-H@9+Rc@U$^SPR}vn;}&3`wxRqupNJ+|-8dPI;Ub zf551ZU48=dV8EGPHo|`mmch7#X}UYl4iH$~`b!Z4rrN2LKOL2#g_-H#aE4*Wq@>=q z-(~)cK?F=OMz;ZB0DPWHI^)@@7dvdv1dL_p>--ULN|P1Z`GG~u?&Bm=C9RHa)_tg& zV2eQE3p53cf3D!DPh%l}J@9iZPqltT!g38b%#$qL}9upNra~u^$wsyd!&L+mztXHW=vS(Z$)(= zeEV3W-5nd{!f=}oB3Z8SI8ntN<5c(JXqe0d%4zW}gV28B_^7h%hPgraQHi1YfT*F| zVeTBALTS&o7JN6niG3Uf%n5j>;Rvqa+dQ`I??RjGBS@wslr_+xsxitbop>Yc32omf z<&pZ#pZVHM1e!|;QFjU|#Jf-yOv8C#+s`G5(QBEH-Xj#SgR7tM%DRp`Oh#yu?N|RP zj@fG6uDlcxwbyHjXpXhw@A}&{{q*2Gy9B7>ZE=fDon01?BBs(w6}bT|Z`q^Up68vk zE`bj+VBF%P@F9;IUU<$cTFwmxjQ$0LsM%cwm1=xO?O=X%7aw{S` zYtEovR1^@wwJXw$QjO9$t@|K{hNvj?4`Ip=&q`w@3B?=H)0X4rp_|cv1;d=s-dEuz z){Cb;MM*+&`(9qm>zBl?kC=!w$|@d@bnWSxxKQ5$84XEs4^z2*WDP;EK*PAXT^ztg z#gz#wugeH+^YQtz41Fl!E~GfI-|~hci5GRe#Sru^4#>=`G|l0%v3$K<-I-LS3xszg zU1R=PcSwj)H@-o6qx*?2!xI5zDPj6;xc$%f%FT15yT($k+_kzm`g|985J}4 zY<12>&U>e4M3Z`@jIENpNWH2D@I@s(>pwDgSaX_%8IOs7^iwsf{-gdT8+i|Z#5BPA zO0*5b`Y9+6_l0skk8Q{x;2l8-4MuF+43kQhRim;t`&BQG%uLl#4t@t-;xE&iq@G7* zFAKsLl8pE8*|S%I2-QPMaAudIZ(_f-xP-JAeWn(kA`H!V3V|znzV-B3_K|n*B^N1D z#(1inktB=*tcH{EX3J z<|AZq???Y*H6>E9>#%+ozxSUySML^ck`{*?B2=E}9{(W=6f^{8C!BHa)b4{v{YtN*b<`OH zZ1~SQDtkjA?=AkHBbNLN5!#msaM@Q|*cbx_+Ns;H>cwlAv79A{`##P>)<=cIT&p$; z9}0FIpOP1c(bHvj+@uWR;lV`BY+tokrO$!Rsz3r8gNAjf;xMV-FH3-{`SqBu-eb!% zYZCdwb1SmCl2kvn%O^!vymJBZD*!`2sWO~YsbHU%6aMP>V#;f+gz&y-i^2r)Rfh*+C;J_XBQ*5uV$FF6 z^tq5cWK=5@O6co|ZMRoc{uECLZ`Nu>o5JYqMBfg&57Xh=bs+xVNoDxYW|9F#JEL5L zjoV8dhg@;c{6D|;Z(nAz^vC{ha|q4k%XJ~0Ij$;mxB;aXhXa=3pl4hTid2Ldy#vOU zcGK^4y9DOUA7Tx&KVsDfVm0G~M}6(cdN5-k`v94-HTq=>i9aMAdAptbCW)wG*Pm7! zTZk&2rkz*Xm_%oVJCw|u*70f@B$j^E7{=P>^#t+7&9Ld9#8cZGoODba>Jw-_n3@}i+$4@bPWiJHCTx}G@cDdR=eU)c@+`ZCwPouE>WQQ;f3!gcDDkZd}cGRrj z2i7E1K57&wYzsrME)#r~oo5%c^cdewD=$lTOi|2ch}4opEz73}DQcPdGTVtp!A6r( zs-ymy{t3_XP!6e1GR(s4COu1ZCUzcg?K2%h2q2+i8bJVS^FSy0p_SeLHGUVf6aPzA zs^Am=0+8BTGwIbR00A=JMAu$%*gQ5XVuD!90QzOgL{j8QP|B+e(8`8&)f(j1525g4 z=eVgJy~NlorIv8W)0zlWsrBSZ=t9ng1rcpLn`WN6x}_<7`5kM%?ce?|M6OGtYe{O( z6>lid9{Fg@7agnA(nfIxdWdb*sKIz-SKOTIf{}8gxq^JH9-%{voD)h?l%Xam=Nw%b zs3Ztu7{&iO&Q#4I@UCuqE0(7fCem}-i+ZP`_;jRJFcUdXhUDkpo>X%tD`Lxg8X zJ*=@+5TP>0+p=Mu&K^D`r3p$o7?v^yWbRvoZN3X-ZDn)iF;5w!PmaL@uWl^)z3w^S z2tOg7tri=j22%z>EMGnk&h{irA&AVzW~QUkGt55L0gC@>SE`n#C8fYV6!zs(gv)s% z;e$FjtwVef0m*p3n0cdW4|WJeE4T6T07J1K+@Qqo&nA_W`se9d0$4@^=XPR(@`rNC zFpmx0qUXCm;GD=Fgv^OC{XO;GcAWw<4Zp7P>T|82rR_xsjFuv0|mRBC@$XTPAV#Ba+6%=2aea#pWv82P;3b^ zcU5y%Xdy10ig(LU(FLOEIYlvn>4 zhsy^KhPkU)hsz`rNs4fQ>!8y*oD@fdSKzLX5*X8^an;GL#7BXLq>q%96i4!9xAj^r zq56vST?SK(YM99{Un8*NNkucL#$5J!W2USXQ6l9Lrn`{}2V5dnU^z^#@ImkNnCIYl zPcJgMkwf+R*)5Y-@#ShtUkLKh*rGUi4$P3VpP*c?Q40pkzJboXuBHv3b|bN6x}kFd z%X@!&wK1D5e63NmK`}{{^mS8HaB_zBfxZWfXfAm5DAA|%zhC|jHMTw!3+kEdM7N&1Qf%8V($BKfV#A& zmr_NQ!^S69IOs;JLp#+iS^qQOCqmew#>X<#pu(jMi%_5Dal{~yXMx|IAMQ*AT`311 zKraPq+Zk-&@~w)5hn90wLDlRjE!rFjgl7|`l85jK)W@kQ#BvpKgR3Bm#o|d8I01S~ zix4fJ1?RPBr>joT9u5usqDCtBi<(n93YqNE2ymYtS1#IxU3LS5U>`+IDi^)_QmzH1r@F-R>Rn_M4Ez_RPEwlN za|~VyE=voKgl+uatmV~S)sxx#`7}LSmr;+y?eAV6Z+Y;2z4HL=;?YWL1)JNCymqp{ z8iCU4IKCIeJ??~6c}IN<$QM4LKquCR3H7Wa!)vMgcb(BqwKL7RhS_P zF$W`j3yh)hgIZ}@?t4FOdk!ATiF7wPG$ktj0PUrZVEh~1foFVuAJE!C#i=^{5*eTH zgSZ`>Wv2^e!hl|`aql}}R>}~@!mj^IbCBKe$(){;Gj* zS|U#am*2up;tQ2;phCQJSv2S(RU`uKdUtKwK)d90%LVLZ0oPyUxVZ9|{z^DPwwF3h zK+JBLIVF4~mXs3~0})4uX!KkNTnvOiRj)wk@4wP!kEBH8Vmp^d5NrdfI-`m_G)e-Q zFdY9r!1s}-NgUns6T(x?#%mmAnOw@WMy%DfG-SF6WAGRdi0CEboK+n0U>m?C9i=CQ zP`6~d1Ji(m5D)D-z+FmRLF~DhQw}YPWq|^oZ*~%jE?K7*EC|r?+@5%W=yifr$S)KJCO%V$&W1SzUGNyr< z=IM7RWov{-Co+oH+H3T;+YWn=j*MbbB$V&E+CW-b{v{fMaZDaRxM6q-#8dm#R9Iyd zvMRq;s9*Q&dkK^|*ucpAoLyeUnf74@;#6{lt%$$ss&}RkhKz)JqA;dByXEu4*D+O#YZ~i0K1id6g~C)8!pv-{@H+(h z^+w;;KxJ)Efm~c3ZTL1y{5kiG}OnnOma5E&5Ac zOfw*so6+ZPY@F_-#P2{rZ>Ea*4KGq*zRYN^?d`I?p+bD&3y(xi!V))RT98l%@E-|* zm`KDHbN0cMv%TNOop;X57MXpOJpjbU(2L9$b3Y?@IR_0Xy&I*`Dy45^64cjE zW~!W57TQjRuZ#P98jSCSQRw{47o@H8>n^j)dwv49u=g!hB~r<0sF=zF@86M`H7Dhm zR6xs7%gVj2t0zx)viBI=)D+w~)GaiRUdZ$1YDbU<;&TsU{)Pt;gJU^5Aa3!= zL35-Yul4ZehJwEz0Ffi%I!~ilCaeld3!D8OKUuJ1S?xeeTojso>#L99nDbdHk0eCX zuRc9rJ)rf*ETK>zI7w>G9_M*as8HD#t==)+a#p~;l>Dn);4TKnGixT2bDiyYOAoHq zJufDRRWb&s41!-|^YI;YcO9q_8KmYB6qjf9kdKludy_hqw}URU*vjWKm-O+b&t)L0HGX>0i6W|shHUKUxNau zO!C5WZ6--KvV9Lpydsehvl;0ps^k=Ji(F10Gotcjvwd8*6#}gxV^h&qs^=23ki!KFhtTcrLueNQas`y3Jh|cu+b-Zs$YD1pd8>(P)|9Sn8 zMIInsvWwC?r3Tp3sutSxm6a(tyuLqXP{U)Bu<#Y-O;)^?ok*zYTjwhtQ*I19I5&sd zmR^q)Ar^^#bb9?PCn1&wX~z;Z5VLkYn<_70NRB090tClDMl5NQQ<7@DBai!6M*BY+sQAk}g z#C0kj0zv9*OX#}k--M`p{9J+g)qg$t$ z>m9;ZRfa=M4B+mJ=4?#ZD`CkJ;z}=jZN?UxqB2MC*+L$YZ!H$(Yyp{Zw?)2la-IO6 z8b^~!T)nhx8`<%;{!MdmjL4u$&cU>{t_wu&Z3(#k{z6Q@z!1NAu_7|b)NjK&JXqr* zan??Y4X;08hjpjJ102UC{e%flr1NJ*v{EWW^Wa7sd0lgvM1DHN5T^`T=Oog$a@SZW|rt({bR)feEI!7@fvnl?Ftq|7I5h#R*-L zJJMgZKC)}{*JT{;pc^wt8aAfp}&G&B!wluWKS1?9(sj`eE|IOja?#M19~Hd7j*VT-7{ zvJd_SR?eo@pmoIVs(@P8uRB%=fRU?RwLAjYeq^yTyU|e;HWpI?O4ie=Ve;Z8{}3?Q z*Mu^P8Y*(?k~Zay;zf7Ak`CME;BH&fWsQB+Rzc#^HxV}}6nM9=MD zp(3tydpl8*aEEh;DY?vv3z$15943EKb8$y_L@7_!hRtJ2ed^LA4q<#Xt>P&MH3yXT z_Uoc4AGCUFtjlPltxEaivME?uXk@egbG%t1j9h=i?et}j!_i(JhogYx1w87>aZlb; z6a!%=%nAhg=Y^L^)53N6Uggesfy#mSt9xe?sz0qnI4fu9BsvDN!i^V-m-{xLsd3t(oLfkVYkz!3g7D5YkPqkBDfH%2e4QhF zR5KTL?+%lf#R@Ye-gLPy;7E3j6d1tSh6C-XXoD#_^*wJ;a<4dB$s| z_s&DAHY2{^^sgDiz!4OqeAN%3W*>K&a4(qFDsk9eucy(pyVuP((=pn}^#@eWdEbt_ zY&c*p<(%zKD}yq6NF`Yw$9K>)>RBUr)c*Bv8BUBV%l6IZD(r(x5~I;e9Ekna@hN6F z{>w*5m)nS2{qM9#hZJ!cldk&5L|My=Rs=OpF(GBMZJjr$YHBifJdrK7rEzl5MRwg) zWO05N7XwkJ<%Wt$GFE-0Z_3wn1Q}=VbJaJ|H39E)SXhKZ&rwf_iM$Qlod<|$^p=0} zf{fD&-F{i(&gcU9|fEEvgP=9Kfhn}ZM=5p zaiy)7&w`nmp(;mF-rf6OEp^;vCM6!}c~YQ?o9(kjTu=MZR{Y!+&AoeM|5R~K#cssX zbT(1H~?Rz!?yrNt9Y-G$3LG=Es>o%plN*C)|!7oP^#UP1ix0b_JB z+RMLY#Usi(cw-KOH<@9x{h2p<4d%5UF{II3$~e|4dQ__=E0?Ivr}|Xbo8iAgD&n_ni~o=yEUcI?(?jVFystmbI5T2 z4q|KIM4LD7Pa)-GEO4}s_fkbmkl?`WlhG^iKt1EZG`wNGjJGq_u zR>jkDt->xUe-!DZHa(eFX=g_tw_99+T_#a4V5k;Ab7#KrEPC|RWXZ6v4hnbP5$aQiH*3Ygul;&jI_ zKd^^nWNg@?Hxvl<+mTc`k7x^6l)Kr1mQg3`as;}XP(dt;{_bA3RJd+&e1jnVz!O}X z`ZF5Q*(Xse*55#n$?tZtYW-YU+J13j9+MIaJ^8UqY|G_Dy%PTyQwj3{()LA$Ou@na zDZ$V8`W*{b&0>qsf*R+}YG!Ndc^rd-asc~?z*Ic=8g+}~qT^n`#=I4ewZ|#*UtPO> zh})sAV3Hf*a}Br_h=)*Zk)+(vh^$Yo?QjHYv@2s`YSn>R!PHyWS-QfcX+)@wO+uLF z9QkuHLBFYikWyJFj%bGFUd{Wj=3Kk*4iFrTNITYov^fw+sr}5Os%YH>dwBuW=6LP` z=w}gDwNEgCVhw8NXa67Y5O{%0>ylemu6%nxr?Bcu4q-k|8O2fj-imgPN>eDcm){E(Qt=6~yf zVatVrZ&CGpvP4`RQ+i_Bjl?S>>N6&gI*pBF_PQZ1(;LD&N;XfSpFN{+a*Gh8k4BG&S3Zw^2IIeu#qtNj0CySe~+o-3c4 zoqyd@XTTejdCzVm))d(iR!aW~um38NhAxzJLz^0r#3l>}0KepoIV%*fO%c07VK%y`g<@`T2p9>231 z5cq=A`|Iz5yi+4tlm7#@)JX7SI-yfH&Jc?%&_~>2yYA5gFg6SXtJyG$d(jN7mBY&vTf>z2?>QfF{*#pW=PClAp;q8T5p8~;V=9)`w&I*X~==9zcP0!~)hXyD;u zbCjMdpK8z`1BY+NJ#SUp{*7};PO0IIi>#rBg6r6ErB=B`8p8J>i zOY&2zTCUczmpM7~9koO4E)3ZkF55TF)ALMgy`X01wGb=qcwIWhpGg>C?-i1V{kNzW zX}FFrhm7aI4OTX9kCC*BJSv^f_n$HF!@`P|rS|}1?B7RA@~KNXfvx1un`mmAi+8OK zgN#ENqTzulZ-y2^+GDGrL)lzEN8_ab2Ku1yn&;>-bEMZv63xduB!si=o{(L+K(HtU@EYM-7J-3r1A~u{^QlV+NdH$4))zjSU%_bNVPvAAbSUilD-&5n{AKW z{{vMtjmG@=lZq60<-XdgWIl}e{)}yHl))5!mBtcdN7VQSp|xu=bV{iOl=(#ZO;iLk znL%_z(imT|s`bL$t>8C_dHEa$>4`;1R-qns&uN5?L*>uP7aQ4Y(qC-2>JYN)pzk-z8N}Tp-n|^$(5UhF5!!~uq`S~ z${kI~F7_+Pyz4O{PUauO#1EhEGtvd!0RpNg7e(-I6@lz*C8P-F@{XRWNDu&G4=l(Bp0sP&=_Yh8qMA>R%>N7R?0X$V94s>|tL-2f~ zQQVGraj`j_O< zdz8;~M7caBwVa6jG$N&{5rcFiWt=;>=UpRRWPW33L5H?pPuZHAoue1==jB!E`@N8S ziCj#(;w!}o_x2CmDHNWrSj!LDFpWE@wCBqcKjh9-m+?Dqity32%s}qHb0_~=sq=&& z1Iv`I!Lskk#QLVv2TybLmEW7^Eux~+h<$vI2(A9D*&`*|Ks$_Zu{+v;cc>fPDFSw(vr%_#A6 zM0o5X9O$a9>-{^C^VwSv?k%0OjO^SidBVBc_nxBs`SWr03uPC!76Jx<8_Ym&@ic=)FWAue=6S?%c`))fcde;NT(8OIe5cXprmg*x-to9(U zDP)#H&rAqkPwGr|X&Ri+Htmhk`T9tV(IxzP{YOh^O1*8qHL{<$%Zpb0_FwpOVFfwy zZ2vi5ZO=Hrjj19tKMmI05<)@$Zsmw%b7+apKo%=6ij$1K+5Ti@S;k}XgZ`^)+sN)KAE~N@w zAAbgA?yHN!TuqFX&WDby?0pa839aZI@%>W+Vb3R)P+|E~)7$d6*HKCLP2%$FFD^uw z2;Hk^2cdaaPfH!nP<*`J#IuuGjO}%?rO?ZJ<1VoA7g)b--^rks?!-U__a zuXBj0;lAL?1!jFSz#|s@P9!Glt+YB-KJSQuaNXQmBX&Kzx{Gc;Rp8bRBHnIEcF<~I zOjaWjH>wG?%OPwv=4gll-PODFjR$bURzLcS_rJz)FoLA~>#68gkcQ@_A6rH7+>uf0 z9X_*l##UN36T*NLMegf5U4|G1)U>)%F1Wv$%Y#P3S>*+bAbsWG-J_m`ue1{nM?iij zrN)qT(-*N|>(*dFePSy1*qq`7GmE^inYp<=cdiKaBYqebf<8vu_Fj@qlPQ>F#_SGbCAirA&K`w07>oab-F3~asK4>6FT9&{f>zG zyj_BK>KblTd%cXMDBsyL$K;&YreAB@CA4OjPQ2*#fD}lOr`r+hSB$Q=DYh-3l^;U6 z;cs2H9E9TZd@m@TXR&$telVPwk!+2C@DH3)?L;hSN(xjLV9k938k?7HYI|=FH*Jpn zUQbdn(#V%2D)bfZt*k2Ml$}D6oDBr@5%%q?s{boMsAu0|>kn13%jwsPa5yEEcS za7ej^COg~043Sj`3t=UpRhdB?=abaVBHw(7Y`rFdTCru}=YCY}sEb_#?Qa-f_9Ltu zf-FQcOb5$$ynr&wgHWxlM5d|e;MMjs?66032wjqA0JD|^(X*5Z8*PL0VN4r%;_vN5SgT^OyXl7Z5k*tgn{7BmrPy?(49;jCJ%RvKH*r!{vFbDI!}a zu181>+Lu03445i--*I}bTBk~Vz39{4?+VvW#ZGw#t;^vVm=w3Lc{zlNSIh}gpA zb62P*jiSn*k~+RTPLmQWDX5FK3GsD58N<;qK%y?k!vyfB%~j)kx46a9%Fvo6jnD9? z2_|Or4%bK2%$tfek3N~ zB-BrSS4GUl2)7;JV1*^44a?rBpNqKRq|e{|k_fA$0z(wDJtI=8*@Xl*E_sox$!;*U zHB^)#`_RRVOAY?sjqRP=?N-xO@|C7HP3^8jbRK_pdNVAzPYERuKX0&SirWY387R<< z*&}+%;Xuv(9G##3TkZ98_N>wT-M)foB}D}ZH8fs~g}X)u$0FQfzpz_y=~Xy|!4K?a zBQK6;`=Y-Iwy_Tk5)vavL88vF4=?IBo)($rYs#3sS}6K6jbrh}Hf0GTaAE!vCg>Pq z&Fg(>)t_YJYYD#GYBy_hY9Q>!>aGLwuI8Y(PmC|j{U4T&`3R?ahvpPMakt31azC~8 z)!=&U;`@5N{vC{8Z(l#dtE_(xtG|a{ciYxQ_Vq81;nVN%>ihV09sD|2v-knsl91p zfu*=O5sa~Om445>LMXMI%Wg(@sjyqW?_wO|>E&1^WE5MBf(^j9epf_BiF!%fzHRwH zYk;!?|1d4vE`HGUga~lK-5bv7QWdZ#B?q24mbVZhL}fKe8YLhQa50($D9lWmR?;HI zB^Y%Ff&(6q6o{A+Y}rbZ36s4ohkWS|R`QI$T>fP=P(_=kFo|LD*(>XSZ|E!>N2mR3S1WpY*WN0fw|_4h{yo>D_UFIgih9;4V>4EQ8=Dk&ty zN)T6e$S#t@ME^u5E0v}|{_tyH%35tCFkZOAckAyM#{yrIxK@QoBYLj)c zVo(>(Cz#(7o1sPuTP)DnF3Tn&r{4-1GJMqv^B5DT!C;a8V5Rv43B24NfN;7j00Kq; zVsZ{;KOx^ipt9?|WB(aVMS;z_b*wPYVU-Iq`uP{HT)kUB2n+F2aa&s69nD)wp9!^X zHTMePoxt3*mxB?fwD1eD_O9PlU;z?<6rUw%9&~4E^__41GL=UBC#)yi}Hq z`Tnf2&1y#?2^95ogIe&)n71-V_YBJxh72j~bj3*5q#Ap?1-lriMQ*W{90 zHK0wXqm4e&on(U3{Ryp)me8lmTqIr519lQ?^zM_nPw%gb@qnYnM%zeiHD~5Rz3qj# z0_US=rbP6t57g5fdSDkQljV#_7Y)b5A6+r^VWEN85XdnQY5hzdj+JQRn)ri7%h$RH zgpI@wAqnKDZJ(s~*EKd~L^8n|Ny9i`4&PF>7!+tfs9=~)A*9wIFN(5Pj%^`q*t%n` zibgmhMX&Z$-}IouM3GfhYi|grdUq?0*CR;R$PCKUx99>fjMDiOr zYZD0nfI$R}28;%*WgL>cE^s_rr573;VTF1x*04}zrcgi{*6{y^P_BE!qOjv_*Ci~z zi0m7e`<-%xlnH0d1G=uu^_`}rFBwuam z8t4~rV)THx2KuC^-UZz_tWZxu0g!bGjpIDHDsoFAa85Jj`9F^VF_p?pzj5E#^$ti#hF=-(zoy^?@_8`_@d&cB6`B*3H||C8jzFKD>Ukj$8|qjm9V$^+ z#C6=n@h!7Mf&K`+%hbRsZ-g8zmj|S;#X=D=8~3O_U%oJp;6<)})-ScfCxBu$zVGeo z0;Q#enA=C2QW3&Jn8QvsCtNTA8tq~U7nJM7%vOBZ1}<}Z5C<0Tz5LNJJb+z+*WY3L zNMrrmY8z*d8l_1O>`<&v&RFPXC)z`1Gx29NS{q0U;#G`$p;Whs8l6&1|6McnE(}Lz z7y3D@dmD>VJw$pwY}|0z{Uj8Lc^lPfqA|8X+>`$TRKsZ`lXS=TstV}xc(I--9mDVP!`f%M12#Z;r8 zB00eBDB!n=Pu#Hjp7Jrn$ZO>4penbuN!u2X(R^e-ORb0!*IMNQ$sAh&ecV^VFl@mS z44+WG^ZkM!l510CiY>RkTYWQl6yzcwr3u>`J`FuBL0=YFBen>aq;uh!bs`N6FfkR+ znvTTCk5UIGJQ1;PJO~Glh{(c%zOQ%?TtCt_LxyDuyVebbnfc^^A@RF)T7ScLN+7sHE!o4}S$Ya!lrq*A@7K{u6mgw%HZ!PvE8 z621(~(!Q;@((wVAKf1XjrnhX8-E-V9XD8~WYZ%=dqZ!b*+M>Z%}XN17K8rd0a*qq(zi8MH$E03*RDy*R=bW9EjufLs|=O;ZSt2P{h|_Mwy0E)a76Xf94Lb z;$B6Gh+$+)Fa_zM?>XJ-U$id)HI;!h!dd9;VCaZlhD2R;xsEC)#1>J@@ck1Q1<~{v zum1tp@Go+hOstJ4=65@2o2qP-B#M1`HZH+hjmL35??RW);Y_>D(~!%&*qM)?>;sR7Qqwo&k$}67EiiV zMILeJ0CkD_28G1ZEEVm%XA!KmuzBadV;=U#(OS9tmr%UyhpY@JrNebv7Qa^W0K$$6 zSKTjP0snB)+R-~Q7Yok!rP5!WX=MiaicTW6lL_(patbFYB}~A$>t$9VQax z%Eqsbx6sSB3_PzNfQS7pI zHeS%!AD8ppo_Xg^g=qaXqlDpDRUCp&wvjBm#wqLdjD!FH00000000(|%HBoo(#{J% zJd|gr+rl&U?^-;U9Mmu{KcRF5qT{}kG*tbuMXi3hOQBFhILDgZutF-yy}@ewmXa{2 zz%Nmb4nU7Cpw;!V;OJfhn;>SN?ds$U09vubnQ=clRWn5D?IREzv}x1ePv*wV%L|3qB*vp$f&dS5n`oil zVi@+|w8(|JA5K9ck>B&@Y>nY4W_mSXlT&B)(9%Qyay-znpg{VaQWAG-N1J{;Y}WwBPqEo2DHv^31Ti2zqXsK3g; z*u($;0000000m(mM*?e*^X4vlRQ}GBLq&_UYJ>@^ep&Og%xdAQ8={2!QE?{6ph>ek zLIQcF?(u5HZ;sk9pXYaEzEmnOXh7Jrj|NZ)5M`9SVZ+i9Oowv}kz~1414$$K*PK3c z#SHoJxuHBHPhM?6vsiPy=Fu^5Cu-IF%g%vz(FK!6Hyg0H{%$xlW~cxF000000M!D9 zty<^D`O1CiH6W=0)UYT_aZ4>3(IAsn-dz?5+V$5CP{V#q z#&=?avUPtS;#*qeovK3hiYDv&ga>!L+W z9%F`~-GJ3G7CKFHBX4EIei2c^h=XpXqm$x#ylKNO2J^8%000000000SBtY0Y1)JNy z=@xE{^>wBQb{`)hAzo6l@h8xJP(9J{5j?i$+;`3Fq}1)ESUD?j!S?31EQC^Tn>bO))59T>povb!lEY4FcZi!6Pu{8+J2V((kDb(o%(Q-l!@DTSNs{7 ztcB&!r|d_X|9NNE-|x4dvXBsdclz-&<&n?sB`yG!v2K0AoDZV(fo0=+iu7iN@>J2{7Q*C9` zKS!ucKhq52IA_VYD;)eOlI%J16fGzF=A3iSOI?oxiL1Po@K|e< z9d+GKgYV~zMLGF&D{tGGIc8gSeNWh%%%sP+@_>ofd-vcAiV6GqYUGwCKg#ud?N55(4G6tI63+ixdn&6#bNxC#vboG zP-~6l;sqsC8JQ_;iSdRoD8*()i9g#Msj#(0SRPNAWmH-CxNf0tcd9k zYIJgtQhQ=nLqgLEIIg``>Ji>T$Ja>YR9AjgwpYTLOo?H83qy8eEG&_jgiGoMexd^F zyU)6on6btD>iT&*LDGA9z8dF%5$J7uOtHgO@5(dULit`b8Gp_6{?urWkY+-Y^1dki)HT*H zx1LU~YQ&D?4fMShubAhk_D@4->L7HkqE6aCJbocQbHMEVollLk94Y^PB`7NQoz5oh z7r3yrgG3n+_EEiQ&fX%FRe6FN_sW=aI4(7C032{_w+#>eMh$ z7MI3Q&1q69-NPYGIy4-~$l0eL2_3sXf)e{$mQI+aqWPg+GzHN&)Ti&g!{IMdjZy83 z!m`#b26+J&-CsbLgcdWns5TpEeU2M$F0M^Dm*a3B`y73(vLj&M;xP-EZ&F5|T&bE^ zMTHIkq@#?t8pdHQ-Hm}yv%-l8KCptw>1kPM$;_&{@!DF3Z}e)|EF_G&-h&&uK^X-t z{}uRP16xf$fktvI%f!iee%TFnTMpRIx_amo1j$g}VR}JIxg8cJq|b{Q^$~p+7n27= z^SxP$IvlOccdZBl(fl0pfva5q9Iqzg81SU@8VdK*w4-!q*wabq%NW&k4#WE2qx!Q_ zBPDBynP`t!q)7phf#~aIA`EmpgWxBqa?$3cXg!kD z;r{T%MKv7ONn90vWX!@CmLphQAboCn+$>eko)`ZteCCWBo;qN7Yh1*DR4K?=4lq8O z==!_zZ%;_Xh5L1kd0~wbI_;7ySKovywq+wb$>7``v=7?j8Pqs!w|mn9ljTrL1UPCW zy(a{xSxeNHGrcs0#B)m zmM~@^y*~-qu{*Ud!BiE@q%Uh+T9tAV#n|$V-lIT(;x=0<z*VxMCFT?JBt zb}dV{kHdZ`RgRnx+yS-S-##kP+ks91dj&e0FXv+nMK)91e?-OLHhm(O@#ej5d!HwL z0$8-~sraj9m#&Qc zm&)k~h4gOHJ^a*v63|sgDGfo?Pz1_~{Qc0mJ!j~FWM`RP{pmpK*KhpVuHTmJ36wz& zbQ^cA$HMLlh5&|HISIBho57?MssWe{V)=JrnR^7hI`!#!$b?Ar_U`1hXka^e23UYI0c@jL3yafJB1Mfp2c`ji?oiM5ct5_1&%6{dB!ZEm}4x$Hct z0#F?a2WsW`Bn9tdK9(MoG=xw7tk!s+cVbEG9O}PKQqsfhOmN`-HM~Udy4-S4<}|KY z>9XTss}`@&zToqJL1vxa!t_bY-d&fCHT^zy@q(53;fv~}*||g(LOpl7TUgdO z_^~rz)C_~%)YQGnJ1t}iD9N>GZJgrp6NCglr6C(%-;cNZrk{xsbE%_kK;+17qEn@wR2G)A)p!;Oy^B|4S%Lec6;;Pf^+HsgI8XKpgvybz&d$! zP8e12q|bp&+*Tvnd5+f`i$+JDDL!#;Jt=e08h|}$=!HiKl<{`bW^a=(wtK)`n5VUD z`s2gRi;xEDA>^1!$f4}Zf*;6(oOIoE;Fm8#3&nkrG)Ii`&#+ufkVZS~=ru*_W0G9OY=JyqpirY`GH^sojc|Dm(fjPAvlY_Ch2J|{BiUEJ;pk1&^s^Q@3}N&;`MEBsdO13lxpRa)e8{K z>99qQ^qWwX-aqmI0L?mAd$BLv-_4hiH23`Zpa_1UQOX#G>F&PFcrSbw^<(TGwbpDY)>gAhoew~%JXd3J3?^c<1<%W;Z_P*{PE2W? zw1;ckD1b!=0)Ne!9cYVgeED^k!nQuCxc!tC`;{Tg=Si|0HX-xQh`#)^ve>tZE#UF&9g#Hh&{*AYr z#;{m|ZXsj!-wHr33*hHJPip9jk`M@WGkGE2A$;k1qkl=k>?iu?s=Je*$FqF>xA)bP zxC7hS_l`clVxffYx3H|D;f7uZc>}6hW;(rxugr0KIe`14Z-Zc1h#MoZygw}NgoxOC z8CJcHmo+sjhi{lIE^^?Xg7dc^AXSmsm~^?cfYl%fHo0=QsGsiKi9iJ@7O4JZd#|zF z(LMb1j9G~-PJ?WC%(ZsNf^4EuGau+#;2WsE^s;GkR0{O6zA~u0Bc&8pJcI54qX{(q z6{(KP+H~7-xGYGeYZsTLNSA6xr68|Q2LS&H5;Hhis8Vstsea-6dKkX0ny;&*-`miJ z7uC?8?deDM^lSTi2gCOCQTuvo{k{aC*ruRcjGXep42wL3}WmdIg@A{5Gr-pQaG9}g**I4LpN8qHNWC+Ef zFLz-QuLU9rSA^9E9vhm%3mZd#vq)RZ_tT*YQrHt|9f4z6)u{}Q74-MW>FpNN{`KeH z>*ErtPg+P=NO(p*r$gwMT%7+moe)23Uyb~s^vr#!jcKY9Q?hnOZB(b7e(o(7ctZO~& z+yuX!u&8s_r67#m4=+^2`FzzcfU&NAD*;*B6Q%ODI}TztH;y5$7A#KmXFB&ds$Ogb zW+F3>-{7s1Ez0mKd1VX*CedI5SkVa#U*a>e6<0cdPt3&&uTc=pGLwIgE5auCgnhpM zQx~c6YjD;U&d^&UmHD>&%9ht3;zB0YX)QLjS=Y99a#TP~EE@k9!@KC3OYBg|32$d| z>-0-;67!QTwQ+F0DE2}q?40mzi&MRFg2fQB>P|!Om*l*5YDw^yyQbLLa@Qp|G%4m(V$0_)R^+{KJqT%TdXsu0HcC`^F0=eHD} zw1*U15;0)2me>QU=n#6KN3jK@xeF?-CJgKZe}%KBba&jt;s&*{y_uMBR|~P&U)Gh_ zIJU=g5NH7hO!DD0k!8XsV}I_TpZt`E?7$`sIu7~c0BFJ_G_k!aw2bhFKW=mK#}Kx4 zMc3V8jyPHxiO&~Rt#j+efMl3%+@=rC;Dhzp z80YzYZi>tzPHUZGiTF9)M3;xvAvzA~8+@~)uxf%iZC_oA=A`_#>};bpO|Hl^UrygE z+At6TYSs4*ji6K79`w-;i8j%^DB>>Tjne_W+V6G;ZcDmQ}rM%BSisWs|Jdl`Q%fndoep+T51i3Dz;h#6oEKsnwughpS+ zWxM6fzfu8;GuI&?DE30av_thDJdzR4T;-HC?``Dw^}-_`UjE=l!1k9z+Ej=LXv0`} zxz}cL-MUbW{MICVFEo}Fu8`K6K;!ydM~Sgw5lj*HJ+Q$}R&4h3+M@ycQR{uOG-(EO zf()C60d>ld>}oCu5j|KHXob*YZd#-WGbkBUNMYw-!2W(t16K!=xhl3oTAUR4il)%;gVv|BL}my7=uRg_QYV?%&S_#WOZNS7OYQkmoD-`H_Y zFAXEwJa8M(P85@1$l`s74Jb}zmg6v5T)ZKhi)GN*G|BlqDp2<1M=1<0|5DF@v>@S( zseNvHB5C&GAm@5Z9e7>GVg0;gyDZ>26|7-iPn)I0>iALbu%%D22*oEFCAjr33S;pS z3L`X>qq(QMg{bGFChn@q4*=pg*b{zhp$+wPR=`fQR)kf;c(1N5p%P`1ZJvf=eVn`3 z(ybU@MTj;Key|Eu5mVz-ZpT(TCD22U%8|)m_k}Vdj1sgh5xAF)pRhmVfGwQv*4cFCLm!5S9Kirm^wchW;NbIgWjQK|_To4N%sGb^ z@gMh4T4i4hYoS<(TL!~Bu@s1ivI{3)%c`@a-w+M$yTR1DN^@jTG3iNOR8eXRv1o$}_>F%8_4>-f4qt zeH$!pQdq&i%ZwW zna978(UOZ3gEdt1eBYagCWz}@pSIhFixD|g?>KT2v1hXqB2HJ2eVJy5|%C#oOS(V9bXswa{$z4POkNLu1K^G zqxGV@vXZ!vhHnHOmT$6}M^z!g{b?y}wv+=@=sC_QWl6P?wJjpV>?g_UHbu8gV<&<} zb{KpS=2con_-%jqCRVC&bI(`88ju2`j_kQ9E$$I z8Pq4%U^dmQ8OIpUK1pgk5?|;tckQ;d1uI=L->Y)I+M&g2b@d{W#2H+K5E=U_un=tKDY(M$343+ zA`->N=ilRqc8C%K+tb0TgoA|*`Cr~$#8Yv8R0IN{6VLG3C(JYnxA^Ll+JX@P&}bSV z?90S60(v%NkXonli8O5zt`@R+GW<}w!-+$R;3b{F03Yw8LL;(Fw1vpgcrt&j5BVLz z&z5#Nb?UR=R_#owThGr=XX?{qR7YZIa1#d8yk-rLUyhn>;Wz<-J%WroId+cEk7Xi{r zmdXzIqMa-9Tvn)sc;lxcXGU@SIO@Yunf+t80>JP#FHLlG^8ro!TQEbnjdgWNy!&@( zYeb&u)n(>UTpD%5LZX%aAVPq8mD^*haB4IzCFR%{C>Ypq$aQDgFVPf*r4=LrJo=y| zQli|5?}d|{1`k6W+VoXj>L8^I>uoXWHX#VA-1-XHByPfZH`lWQCl*u?xC0ASh!(p^ zsU9zgKIl)Feq2T%p2e0!aq8|K2gj#TrVSr`KNOhuG5=w%KZD*E$HL_5h+XtcZQ z1fz3XNFeMnK!L=nALC#80`w6K#&=v2*ssC3#pXlmJXq;jjJJRHqE;e{p_ z{NhrVpJ+LFyW;%(RFV1MSdqcgEzPk)s;2L!Q*CbkU5iuc5N)<4tS$vvH(7TY3qYs` z`y<~KNU= zxQ1Qbab{X^_s=gRgpW*OgZ>mkdX`PMsat_Pr%mt}5zlPn^U? z(TjdBC#>In=2z%ww)PU63^rJyB~YH2g5BXB-8D`{xKTMyBRrV7TPWoJ z9O}d|gf$%KrP0fh7~OJ~iJa6m2lqWK$FcxEVPiqebTlH=S)#gsI8c;L7ZdA3olKB-of2fa20To6vl> zGOE@2p2D`NJQ3~DylR6Wkp8@hk{1VS==k*-X(+ z-9m+EBKuB+$k*d?`o>K#At;!aOMx)z$esrLk_r^t=y_M(mlry{t*%H+o||>)Mid$v z$nh-#C%G@}C&In_%bqRwdrky;@q%V; z8HN5?2oj|4`9inG8gYSigHiA}*SJx# zw7|{Ji@b2u@{A>-$Q&D69yd|z*XwRbO(eOe2jN)5$%5MT5HPXeU ztb14qQ^fOZccKNU?Dxp5l}cV;6iTBzJTY7Mu`r@(OVS(Eyo!A7RqX~sd*8Zb*_e4G z);PpEXCV8wZRQ_|{5~64)xcM4pKkru$^FRcK=>3=)2nz{(TP$kX_j6*{d{}ylYB}- zq`u!WwY4}fEc`i$^><_IaEXSPa)bQe9ix!EY<6&? z0TIrtpIpSp+KeF;o`6WDNNL1iLv}aZ8527h(4^mI>^BE_jA@S?=iZA&Oiu=3H}e6&#l(NVsI$t@(L}W}r31nxgk0)FOGm z8}e3U(++;7e&GU)odO@#G1v%=TZ>Fnwo41St|1oas@%C$O*(VT3w7!T+Y0lGi}jG7 z`jP9G(UPWZVU}Rd=5xkj(!EBx_9npW&O!e$W^aMqxu;PJsWOVG>93f@3gZC+7%|@Q zEjs%N2k&KW+|pXFB){*z+TBJ7{zyYx1G&sa-dJv|sjl=u(-seJ#@NM(TxuoQU{5ls zNUElyQK92P+IyCSvuogyZgZ;dW$%Y|`3QckMT+J;(Tc7CsqvZf4a$qsKu&`TrjmHo zb~Z!l&5s*l|9KT{a`)!ysoXtLxoO+(4ccGN#ok#M2#XmZatt6da9unvBotu^WnGbM zgH6)O%Rq0XSmM}qUn{1dkwvGyXwF4aHh)>I3=rIf^?;jwy5lviNcoq9gyLbJ!B8q@ zz#rZV(BG4x83=vQE#~koOJJfkmq6}n&%+4VvxPJMnSB?8yy@-2MoxwO!v7#RMjBI= z^tLW|@sIN$c=PZ}&~F$F?$YN9p)-AXZ=v(KU(#Nx{!iel$UOql5t~oII#tg@l@lI3 z@ff%0B)-v2{VpR=Pw4hXz>%g`&4{5RZ zFA^~lkOFOvahsm=!Bko=ZU*V8vwa@V9%yxBBnnD|LHLt6Q2O<~K@>u+$$93Y4Zz%9 zBr~K*UPs$ajaG3D$Q~#rw33$KQQ=Cdlh$zaA6n-$lbs@H!h^+ytgcPeN|8gXt((?f zWb^e~gvNu-8j#RIkf!#Y9Qllwko?2nZL%hwYC1Vt?bS8>C!du<=#=)s9lm3SrZRXd zwXE8hdx$@<)mptRV}W|8EJlWhF_5i=LbIKCg*%1d?d{-@TB{m~UZf#{7-Z_CsYZHg0e2#*ZlwRjyoM z$7N9FDrsAT6N(!Vk&dt_fY&pGBjtX7_8prSf}z?V*{lA}u?S|xKQ~moFffPZLg11o zDG**RHcTUwoPy9W=c@J)OkQQKF))uVlShuWXzjF;>_JWPwQq^dyuzW|2GEd3Z#SlK zgnYilJ&hv_PdxA|e~20bqnhRIu&f!th#o+30S>>Y;RgQWwaRD6w70}g3)4C1aV&;~ z&+53nX7wC3u%E zdr&J-vGbIE*Q~{DTOxJqCad9OMs}qAwy4)P|1Q0^v`!*lAS%RYy}!?{yAbwJ)Von2PDOw0DifxWfS{17W| z{8@f>?kp(*z--_sJIg-SP=i|ec-vWC;=NQ%+UVg~v?0bNm&Y;Y*`_=~ zjyf1%eTX6Tale+)rottC0b0#IerRm$Fq}z{D*Kklt>A$EGi27c4BTsuA< zCSFi4{fuEF*OgMsI$4JGEE>*$bge`f%y^$#N21cPA+H~doK!ni2z_^12vVK^;b7Dh zrR0gbszrR3v(=S;XJp4H^$jak)Ji$ci2Jac|1~dJoG+Z>G?d2GG%Ux;W*)p9hn8|~ zl<08iq8f84Oh~|cfqZ}c?*-Ml$5p+l&Zxh>y%n4LjRs^%>Bs)LEPxWnJMK-2 zt64nCIdVtF=b%mUUmt*d|6g7{d#w&xZD{*E=KL3-2Jv>~^-yECDX7qRz?Z|A`(hE7 zSvTY|{KJ}7-ZKGrj3Z8Io$S!$d67*|fR?d{i%d%;#9$!1HLQkMGy|DxiR8f_8n!D15<%~Qjcl8|22KBAS1?ya(E1;uX(C_<5Tp>|UfHOVpRk9`aE_w7&p!E2U@StE zj0>iTHWz*q_xP03)-JxDj-IW_*Hm?E3-s&9FGSF6&DT`snn4aqQBN_eN%5j;h+2T3 zO2EXY-2^Mlq7uj*^FfaMX9}k)KvuGtD(q&i3GSb*(18{J*a+}1Ug>LEe6vc2N_6u= z7UI3Ldh0zn6Xrz#VE|FSV2z|BrB1~d1NwsaStpkc4vjHIxAopXgjw^ItIC8o!tgfE z{Z*a7@5`?9QcTvf&{{i`dIJ9lo6s{&3J!S>jyc#rZUhPpq`2#FRlQ3{s1f|_^+sK! zpeT=}PTogEMF^|Qzo{y??gqEs{ZN}7KpZL~DsVX0rk0oC5HC`rkd7s;fU76!x>^uz z^k9KFZ66E9RBtx@wySkxp5sVOj^g3?IT4!qJ5gWqdyzca-M!dbltJ{XOd7cToh9J# zanqm}~I-{6r9u!2TesG$0brIrv^?RYS6aRj}MNcSA{Rza8`S~}-HXV@inNKO%! zrLBrOxGG5>q(e>i38Uu&?Kb0SyqXnbSZShlG;(UZP3zre_kEiAw8ssTh2<&H<;Hu% zXk;aXP;aPz*amfz)1ffBL+AG>c~YRG%R+=M*2K>x(Saw1*h|s!>i+eXy2a3hglRTp zC#1#WS0A`QwL6xAyW;zLa=zZNFSn}S;nOBBx2B)r)n)ee8T>j~$MEUi`+B+l9Y_BM zNnrMaO9pImX60R<(sh_z+dJPiHfC6i-+(wQg^`C;MV8G?<&CK?meboq4D+q_t!og> z823iT-p0<$V7cl3IAlP)^YH&CWT}n!;A5(~o9 zfh62TL_0^Ukb->WJs6*9jfw{(A@)R)PSzh@Xf6K7TrU1U0%c(vyGws4OXqki-h<2z z$nbye7qj!i82mR(-o#6)WW%>sm;kZ3{P!aWe7?~xAN1Rh-fSLITFEH72+{)ek~0o< z0FTSc%Jh+Yr%O|r$Bb19ep7XVj-D$RfOWP0E%W4tnY!aHfV0;e{SMZ&7Ofhy+daQw ztiLPWGhB_Gm)LK;p6osumjae5r%{xG`O1-fs~534*ZpX5Ago#~B3O|JJtrt}3$hQ- zo9ODFz*eHlY|PN_2+Bg0V3p6O!Ii-@N{)^Q8@B0s^)TI^);Ndh(2cPoOv1~4HE4aH zMz{7Y^@6g;G2id2?EywiMKecNZkJNsFHsy8N~*>L03hRBFr!_RB*8|cje1P=Nml%w zONHOiv=XVkMYo;?FWLEg=AA@8D)no;zV;0l7qIOYziife`N&b)(DeN2D_8d`&5^cB zv!`p2WpahHG`QrTs%FU~0X^Y*c05ZI<-VE3=rQVbX+E#Y5{|)>JA5%n`1y#v9`jVlt=zE%!hmdEj{fc5ZxMemm1cs&~|$t;7-z?8Da$jQXYwO^D0 z@Sg38C;U)TC8Sa)9)&JSaXeemLHbfhzf^VvouW29njth(gKnueZ0Q&4v9q&Y9ah35 z@2;wx?9Qq_6hDTThiIRdF}9hFsL40m$8!lkooVQ&BK0gHBH3LExkdsm)tp&FSJ6{k zuL7@sTcJ@_dSk{k#h_IScd7-!0}Rl+a5Fm7xYD@?Zn8E|P!IB8B6dg72m6BmZ?`Zp zusQ>h`#Fo~7(tKldW@RY#)8j{Kx3ObWXYsDAAaPV^9hYI-Q8+xe6bzn2MLRKy@f|k zVCMbq)1z&s^yu}{k>%K6&XpZj4&{CbF9h}VQ^ot2r^gbmQVw#D5W(L&j#ZRNtT9+t zo2Inio!5@UTd@`z#3tRVaNkz=+zjNJS}o2st%n1JeUfVZukj_3{m_9YS6QpX_}R_x z+Pv%4u^rcjf62n9-S6|S;s{#Ke1Ci1An!D3H^Ux{|0!oc@y{X4i{!0P0 zM&*Hx9kKI$q~>>sHp6KmgfBiLj=vpuH_QggntFW+^5(ocmo&fR&5ZZh=NGBabY8y% zgJ5^K#^$Nn0k)oVCTNI(zMl+D#DBQIC){AW|7EBZV)#@Ts!31C#}AnZg{Dz&?GB#t#j})Y30?IKzWE%&6KrU6Tc(y zV`m;14m;jP3-9K|=)@SJH{&WkY64X#8S5V0txaTjE6fSj7M!4l!%)Ux<0G+A;I!hx z-$d5X8{}7Q3FI=;(a?JdI)17`hKw8eYS{aOF*gnjR$^UY82zHhscsCy$*?AVZ^W!>EInMHFLEU+`lq(+K)Z1m0@)}1}!HXy2F9PMte!R zeofGCr@mxI?a=|!L`U9UF-%Xl)Uc8+hA~Z68KzKd~-|Ga(&zh=Ue=ef25WLqe3BrR9svTXL-D?L0k(( z&bZria8I{}u0eKk&72{}(oqGU{9dlJ>JbRs!p;#9%9P zGYikpdm#Zw8bDB^z2U)*1rs4s?}D7r3=#!_OB@EUm`HGqEe;ks&hZ-7B|SQP<6)kv*5dkUQ6+GGaA zBy&o#(Y$=x0Obk87iZi&upSp`C=unWVs^6^=VNCP)>5+TY#F&QlbCqow+l;=zP>~tL*7QcmSrE`5Vnmrr{^4-b5{em2$A&$`Jd@b$_Cf*% z?YY~NlQF#0wz(_qpl1kcP1GOzv|p-fgHf@LDB}w=YEAo)1N%dZ!B>4w#PC1aq&D!m z1woo~<}uI_qt_!hk7QsMU<7bNQBgIQpMi3y%OILGts(hvUOQ|9IasBZa4Zlc?buIK1G|uA-~j_vrJD`%0MzhX8$)5%N?nyZ_oxOej5qP zTxdCUWd*c`fbxT%u_s=r%CkWRf94(4Q%wg`bBHSk|5I!Xg?xf4R3GH-_K1&MX%)uu zi?CZ*@yM&~BYyCtNhae}o(KW-CW-cGxF~j(0lb@;vG?(g6<1t$)UsuAzqC$5(ZXXoB@z`f^=AhFL+S0`Xm#i|2?jd7u~04oVZ((-Zk}iILSR$TtK< zeNNJk?}^y*Ly7FwJ2;YH>A55yCb?k|xppYiCO6H=@aG%xVU3rDQ{io}F2f_Vh$VQUf_| z4gd`}O{0^0mtL4`DFT4vu)6}o0A{!EXcbZsrHn^whzD`|r=kgr;&DmULMQl4d>e$P zWM`Qw>hIqwBg%q0&2}FM*X$cVmW9qJ$vSF zQ>6xOh7J*Wq(ca;m3&8Fck4rmoU&rf>+CAULN(ZCmCK$C@@Vg1ab1t=dJ$Y53yhv7 zwwR78_Q8#iG`q5z;Lj2d zG1W{m7v<6}o44cv$%cLI1TM9S>yHzX6R`Y8 zMekDglY(ZnU!zu)Dyl6a=b4zCcb2)BQ|VHqfg! znHa_@XE!F2@(G%#3nyJKPKHXHjE(E4dYtJn^>Ae%BLq`|W{hYuy8l>2Z75B~=A-9i zUgE}Cmv>xu`8$M)dF<30^I|-zS87FcIQWM3SFVx$-9aF8UuL2Q0~4=?Koe9P^lPMUxVRLD>7;)1ycVqZAWSbhR@kB#)vJ8_$u|hjR24IsApBh=hFbwi zdS;^JC-u_eY<$PqSw(d!y!Upt25XZsI2w_=B73}LX+K2*6nJU;&_S04Hl4($$q-FR zsYm?Ia@%9Y09HIAvPBwO{=0k&LSZWr`|*#;8iV4)-WscyTeT{WK#rwKXbp2-GI9c3 zpZ2;+cTt~F3D>6|%>5n#aeL!u*&Fc!0; z`|!MBN} z112tDm@VF{!^%+v>j1|=5DF}XALqz8El2Kr<3VT}JUR{P6Zy3idAFmNY?lB#M0nX80b-7Hov(abh+$Eb&^kf=+ZSPc*aO2cU7Gdfsib` z&nE!WcUtdxv$89RKOU{?iSfV9gS`U~y~XCmnhETg@^(^m%B-zk;hkVZ7Dq)+2ku|UzB zDG>@PP;^b0v?I=T5p2I-MNYLjJk93SOROU(}F0#Ums7f$rH!XYjnsgQX*ftT$Ij|Il9^(P2!w;%(UG}N>6xF-Y}pe{Po|cjcf4p>9t|oYHzVH zgRvvzDNmPtTUvCU^jJU`1`0=H&lHvmj-p5ItT}Jlw zeoA^;Y*tTcq2|>F`%?*#`gk?JM`rFD%i$z^Db}`;?q&+>w+*Kg=Nq?9cJ$9ex8P^f zq&||oYG8Z?W1;ul)W?SU8S1mcZ@%NJ7-zGW9Vu3Yv>+gnV7yWdGFs}jem6Je9o)eYY%Ay9OF)2pCV&h#GY2|Ox@&7b4~{*^{0s3Jlq zKHSY9VR^coN^vBUlH=33kB~l4l!2+NWQ5lFi{~@4;Xh>~D)|ujHJ*VnSfjelFUlE~ zJ@(wEHQEoc+j~_HO1(>Oilrkr%a4Lm^xiBhvek0jV)r%6kf#J}O60MLRc;6f!^g!*t{YOw#jOzCbI`m;yR@ia*UKnU%y+XGD?QldD)njMUC< z!Zs(B%HfkHIgpBwS1I04-|{)&wnj}`=z?)6b4&2tR0?R5)qh+wx2=e#H4>|lFGcj1 zaOx+oHowlCA;KW?>GHrt2W|E3zv`)7$tW1ex{!R_5J%GE^ga}L`rn@!0IqvhRw19?PhhhU&*HF29#7(6*pmo zWPa*4vY_nXq^qBEGZ}d35KeeW0k3vP**ogRIHtE~0JN_gDSTeBJ0@wt^V`>2GWIdG z3OfY&VRF)!RurO z>lTcmlbFe;a@a1VRf?wv^om0Yqfb=KU{?1j>)IGpI*MlH z_#_4IW`(?xg7QH79It=&enHxXX&(7?(fdaBH1cnOh@fNCzg=Q8mmZNrk-69qw24KS zgzFG-`y4n8KiY@s`iFuDI1d36WY?}m8W=?b#L~Fhr68p4>Oqfn$D@+2 z`$|4CZeHT{oK7!^11qH{@o5_^%J$9UB-G541aDBB;|)9d{E)hXE0&0mZpDv#I3?Uw ziqZt?`OcS7Y_6gS?QxJ{?e)8678S5v6Sore^=EFDJm zv70r&@S*<{^B1LluyVcvbY}rLgWl~BDekmj#ns$E?1b2;x1;&({&qVCT#ov=dW}hh zlYJGeCIjsrMFy*3AmeZ1iKdw;N{mEo zOZw6&9$>zy1qQgC1Kp3kp3lY;ruOWp<*P+Y&P6ti_G^Hx^l;XwEdZkBTN4?5z+d7<1~YHDFz4%Sr& z%5-sDWR+>!z(gN_;Gm=5;#sXi1oMbM(i8D+NU0GN67yHk6ppQhgzg`D zBd%$4CIlx#ooc|6aL4W1IH9+Z=tB~bJGa!#OXobJFzNMjbdY1+)&vkf0VEG_auLzc z;?mX&)#sK$2g|JB<>(|{tj~aj+r>z!;yl*H_N_a3!nrh5Mn@5ly=4*EowJdq!J)V& zk%abLnyGcasX)F=!B~oQ$D7hOS&4DtN%fq}+ zc>MCm?OZ?nRkEUdF}fH8`Y)s28}1tI<-=qj9Gt*LmA=m8xeX$>aL$Pl93sp;-Eb_} z1q0dTrl7=?GqB^Xy0g?p6Tce#JRa;x)H=;}W?v5NbaFy)3X|rAL^SiV2seLb)2%BZh_GNc~yAO8=pI=s6;Kxy^Kf_}wUfsDg zQQ$<_Mw00j44V7|s=DpLRv!?hkfrz_2zHbB7z#3Cp%+k*L0ZZzi9?0*t8>`~q7FZV zqi5L{lYZCBUQwCz-e|NGA9t5!fTV%dG*lys&OgFn0DJZuv^S#F#>$*ds@=Y&CX(B| z;@lKhiVlfcnqBpDJQS>B+gt3HTz@*?T!v#_pq!K}md5a}Dz}IWmSx0d{}{5q zwi+EoAQ!)ZFA#y+kt6;Hzx~tVkdlLYYzUB)4i`q@6UrKaZ@b9KoRH!CKtB2w7O& z0poXl@*2w>zxEW1$CLSBSN(MNvZxX&)WrTGG#a0n9q(!{7-oTHk->!(E97?^)Bg;c zTpvb|sRQE993IV!@^Wk5*s7(kr{Olu>%*k4yE7f>Azx_-?OE9YiW9_MGe=Tv{S%@1BtpdrprW#B*6q9jGy2LseI9#_ zMo3yGLoml?UhIg@pc&6$x(QIm3~iYn&gERL`sQhW4)zbh@L68unL%s7oa}Q_L-!Or z3$_{psHGnY4|G8rS-HcnptN$Uz=CAqnZ)GI^saLw4~ssI`mkt>M70Wtg$KzQ{(!k1|K z0geTDfD8MJyIY$o9@xrC&`LFg-;Xj73@dR36SUQ}iDAm>B>9%dOW@Dla16F|Vma#U zlX%WquwFU_V}F6U#qV*Z9QE_JLQ4K>)x`rA9ZDl;a3J;qB!(ug_olhwpBX}H7SFAe zKEF^7ak|L>Nrs{n_vDY~@ETMOaInCeOeM}zJZTF@z;J?4(=8GZK$|tD1f~8#Y;k63 zCgQ-QFYyC@pM$M9885WREsZ;ha>SJc9#C91lJe!|?$351%keDd~%}!_S;e z9H4L}=~Q#d_A6-q$5VYRyJINDC0>2Ih7?5xHqpL)iHL6i*n0mSm>+=2tj|_wcoLsR z_fOGIh@##1kVKf{-Os`Wi9(AUTqJm-J4ayEgBEM2*M&?$caeDT0<6{|K{}qW*(aW3 zs7jtl_ec>S10{7r)mGSVTvltnjmQumwX2~gi$I2u@fvETIAnji7$eJF5T`X;vJAX8 z%+cJi(Z%H}?zq5+QE(ypbfpM=Q`mSwZQv$>9;^|(Hc;g>BY$!(K1K2g#tg%@2V~7Q zM@hrpUqL@4-MoJ#C|FXV^k>rYAH&zzZrb$}8*eU(tcR<+r@X^+1b z?Ul3;f?myZKALPn#zi7&=D!*INtI}>1Bgm`LV9SY#v)#@oy@~5U_D+4erZor7Vo+Z zzHs}6&aB5ttOzEG56e^DmyWmA=&vx*PY_l3@~!s8qZUCy1yz zyF{})AAerPkI@qd&;)sCpC~nu<2htZF)sdGjs@gtjcvie&O2x;_VYHGGKpYz)=ZWG zPaw>(dn-tba?=Lu95*NCT|1jDHvY)>2k*P=;KY!v33@0x>1eP5nr%rs2H7kRQ}2W6K&*bE?Z7QnGtfPA%TC>ArG59&nA8#Oc!`u-VWZWH&Lpqu|^)Yfb zKoAwWCGM`O_FHlFiJlkyNW&J5p&5QNBDouN`snAfhRC)#%dvubDupupG{fG}^$s&i z{X7X|X30UZqZpKwbIW6Cd&PK>H`VRr-FDjTY7@|_?gp)r_>SNksrl9_zQY9FvBp)i zR%DLQE`z^pR{sDvK!PDmf__5q;HYp zTp^%=?fPL5qf}OXmcRa{UZy_LCa*S&iJ74Frf)tRkFAyE>^x>HsQY+>za8n=YxGRf zs^Oe3w^f}i8?V5Xki3a+xT5?SeperaMd)S4-?b4t`@A_9oxsKTpb5? z_5J{zgL@uC`xYspB}yDc4&R<0$_<6;YLOT>Rgmohfs+z(r`ME(?pf}eXyZ?KBp~?a zn%43jFi=Y$4g^|s7lBK*!ZK&B({xdszYufL%@h=Ni#vBc7?&he;y5R1%%~yT?OaOX zb+|B@uZI#NUMGZ#&BFdtBHlV+KFXe&+@_FBN~6=49+H+#k%s}hs%&o)9GXIjbGkpsL`k-q0Z}yfc#RXvAnu(faMaq0ef2UD z(*6|ZaT9rU?@SHj#IAud$yR(%+0w<~R$O9$@ObBJI*qOnE`IKai3QVTi#LD^dcpv& z0f_BDU!1m!*W+tg{T+v|h{`Z9vA5lWA< z(-2|3|4L4^SZ&vSm27aNG=Srdr(gmS<(D9ohV&7O_fhWU{m)Rke*8_2R~9_IgpvZm zXNmY0og1@9ToerF(4JaIIlk*4NjW<_Mq?wmayv^vlbf#1olLsv6jUu_#1AIAwnrcO z#`apf#5ufhQ@EBoSJHxsxwjK)YH&6%GUb$p44F&h3uGWoULkmJ0gT`DV>%B(X;-$$ z-adeDjl$(`1B1GKf%T70VKqqvST0YY_y?*7;PjWel3t0&Cjm9zZuJgJt%oT;on6@Y#pRa z0V4a>poem~X_$5cZxyiX1VNM&Bdalp!M}jjp{S%MqaU2cF-1a~oiAWAUtH7c1eG)W zN5Pz7cLb`S?svz}AiNfF{)P5oC@!;qbqwgv9~5f7!4Z91Vdawu*UT1#Puj%4AOW9+$eROh}z%XB)u*g1aA5TW#CC7e%je?+|5=d!uF{E%5xQU z#*GdcV-k_!d$2yik-QtNPHiD&j2V~KSSe&TZYeVixOcBRhCRk7b(O~fA7SE-C<9hR zA+3Y<=bZILLtRaWIRt?UeJi$b?I1f&E7%Px;DX{7X193*hHR1=5wIiVlL|9#5U#9{ z&eDv>3L<|+l4t90dnWJU$xZ%T1}Ndqe>fCbx!R#_e7%0g#5-)I^x;>R(=8oBWEL$3 zH3A$Sh)Bya;JOj#HQvZS>lYwEU$Sml_VT!ojnX=fbmg6cJ#!?3lMVIHc*(=y=1y1T z@AQedg2X0?T{XMroLr#dKzAwmq*U5LcP`GHZrO3~fSFpCa7I zco|UBF;xnFcetH{+dw))`v+xR#C%C(x(|4Ys^`_HQWOl?G_6~md`BL2F&-!j1^#(! zzaz2^@eeK1J`%7p>SO@e%+=hX+4MLHI+#1ISb-SFY{w81j#{b4#e9RQ;zOwC+-MMywxqA`ZxFJV)^+9Q zkfrYUsgvOY{KK39qkY@D#8JPFq=nmouT4h)*%v2*G`7BrA%$`_Gx(fvf>3<$Lu<{(oX!w|iA9+2- z;HN=7eH3iXk?)I;%l2V?nPh1Q6;&O~QN)%E3a7y_P%7Gt)2E8Z z3&q+IuV=if3uci2DKI-?1+Ray_c4F6cYe;rP>4WIp2+sJ5?cBD@`6R3_t%3lWng}Z zmFjQGkkZs;LCxmZdr`mBF=;0t)LyCSMV#37DwJIHU}p z0fXg6%(77_SY`nE28T9N!ZGViy1r`4?-`m_u9ZrAX) z=hbCTs?`1#w?D$#{u&ei28VwOTKjKV^=zd2w0iq@lb=?#&#PKB^6I>9iN|r;P9WC{En`SfYdPs{T1THkAHlt@-Te;Mm$L zydi+ecn%}gNCENKtz$BCR&ah1BHe^k%!1CF&cZ?WG}6E~`QCUJ4c43;5dR3_K8*S6 zz_x*SkyF!X(UrEfj$psaFvnmun^vg$f9Hav=?@g zF2+*G3;$b{t)FEGY=hOR0dPm2#ZlgrcMuN&Gvq3Sup}gaG~{e#7-bc$J_didk3iPy zEtW<9E8*7G6CpKdPCO|W*+@8|x5jebW*7fYia$tVcB>;;7rTaF_d(8GEl4gL}@ZZ9eX#BsbMvu zK3KMDPSI!{(-ei`^09XG56(*k^Nd}rO6!y|-ZyenQ5Fo>`A}Z?RM42XQ02L_DrYyl z9?5E!u+Ql0^^}kp24OcmhxUX+RN~yLz5dyzN#wg;-ve(8=ErI+PkB~4BeT(fpe-<# zEPMB64^r#a+RW#$n)u!iDKXBAH1Q-;2a0Nv9}RiLK+yx5>4DU5ie&Yr7QGq!Rth3T zr1@f~cMkDY;Fj$W$_h7)mBDNM+!Z-Z`d~bJ${5P1e=k+*54B6n>LAi~R27f$Q1~VC z_-p}o{6LBQr$+!+GXnXU)n5I4k5CB`Isn`k!GAt&0}}=@Jf6lypH-ckoco{(=18mM zTcd*Djjg3r^Ryj%kc3~$CpGpyeem&1V(CCpq2BYn(Y5?D9&N@a!*vRTJHt!B@KY5*J^5AIQBN>XH(wnNedK) zf$u)jr4c>96A*!LZP)?Mq_7`htu)WhwY{4O>soW;hF%c}vb~aUy1DVL40w(zI882k zg5K3G7vlL{HiyEpcW&EYD;K`KDsST6sDu#_yC-$<*T4l*(fAUZU;4W*6Td}o&$sRl zTyE#a;$V!<>y7)JuY><+kX95xV_M*dYSvt?*QG{t<1*hMtLuxEv9R9I=u>&nI9Agz zP(z{gQ(2 zJyvCriD~ig78KN-@-jXjL)33|(@1KZ9)$bf^5SNF^vBzXba9XdG&XHe;yhp)0#rA) z7Lu~Uea}>$%nuOLowhCN#QY~lKAj!{H$7!XH^L!X>>*_pX2$?M>4XKoXiPz;>GS)K zM`i`c@{Jz*dQZb#WQgyb&F2_Yl@l722|};8#T4>kC55su-O={vw|C8^!7=^>QIV2W z$W6ez6o@PaRRQh@P@(8HeDrdKgdG5OHB^mJRWPuQYd9^H3Ihf6B4?UhB=`^-pvT$wTT8zxTo6_;;%}xyD~|wUfWhSuzx9AM zcp>@y3?_Jkh9T&Zi4y$4bDg55Cl$QeH|XI{`85CF*{Z z3cZ~2op7SrQyVK0k(_uqxyFmrt1_rK@VKU~7zmS(sBgo3Ch__9m&u8jx5m%V{bEhX zt-#Rfv>g@iO)ypufkQ%!vQ>KxB_^^3gd!I5cc{TbTR00n+?!A5f%)qeqdaEiN*Tks zjM=y4aRiyHB(&63XAKNt^Kc@%pOPOuacpd5=iaUI%|4#??~JShW`O(zL_hyc#tcIB z;N}RhQ}FaUS-zdB!$H*o|8a`A66&%~3ix*>GM55YKyAE(1y);ez&n#TW;iPdF{l|` zv8rCF!7zPZ*^@LAY%>O#o4K|LD3!H{@QzjSY1e60&jWak+hIBMFIx9g2OSGx31tqK z5`PiJ7l(Bn#36D&Z2v8nsYqfcU~Y!Hh2iTyt#dG(_MbB{8tjAys_tl(C669=P(bsL zkRQ>yTc_x$F6miO>)p1i3Dv4|ru5_Em=zvYi|$jeF%iRQY#y(pivSQ09Y5WjRjfvk zxS_kT&;NQusEm#OAgys2dup4R?+>c0pap~tWylL=;uj0v6l&SfUZ_SaoTBy+mr{K9 ziz45ni7T9e3uCT+RW%u{L&w;>vo2z6YSfh2)u%rKf-@(BA8i2qn7)}O8Ta@H?DyFR zi9i{?_bV}}ubOc&L|)?d;DI@VEH1UMmOYH7bI4|SzK8#8TITLt1|KTrsKuIlSJ)KV zUXn|B>Z${oF`;VfWb!uqs%RYhyet-!)%Xp59HAo`(}T8uO#$nl_zJ%Ab@(Sz8-=+ZljzWkQnH%siC(y$)V^@=)mmR&D=uH-LiuQ`Ar;>8 zKqMP};w)2%`jyl!4{OV_;bP*-J>yxgl_9TeLQuj$IcJQUrAO?XR=3MeXZ$ zh70(75MgnAMdDJ2p>cbeoY>wdtB)q)r(2|erW-S?>%M7cE)69ouN0j-K_e3dPW$`{ z=%A;TSx!C3hu8YKSs*lJF#m|gos_23qIT91Ur93~^RX@U2P7^vIVYf^)d94m&WIBO zHLUHWRuRWI#4JXc`L@***8UiK5Te+nRCtIj-}~1@Fg^o-P>g!cwa*$#Z`y>&QPmn! zJv4}zjkQmddjWf?pVj|X5w`YaHjZ24v7EsxR@=31G5#ysU@+7}N3iFhI@63}TjCI% ztcwNn$ZKNQ&rEZE8Z4!f;_XXc{ZKO%<7?S6q5n9W;Zc0mS%>3BL1eS+5Ze%dAjfNnW`PU<_&7Rqo#JiQ-}hD@c!ivPX1l;XXo<10fM|&LA)o#h`)sV2EEKeNfO>DVL^#LrnOmAPw=+ zy?yIX8)P1}dBz0Ca_y1UaiNh1+*G_RC0g8(Pmtu`_c!7HGK?0LXX|B}#lz12GJ+6d z7&D>%J9!cK1+KD0TH#4EqXI@B;}E!mfCcML{W3QyMb*OqcBeB9or6cPn4({rU6YD; zekCfytpHmWXaSHyznF6eZyz=EX7xda0{0T%=zI_y`LcKt9fbvpeIoTJi9DxRF_)UN z)KqpCs&&4`9~w+Ikqci^3)YiBA)#YLFXxo#ZRZLyC0e*@Droy{sjn;|mV$@&8??D{ z+rU4EKAZR_KzwEPJ1U(gT2;Ba3IObdjWsfO%oAOHd&JsN)gQs8-Pqjwi!4#J2uX-Q z5x(0utUi28bE^BbN1s}cPKeBtT1d!MIF)}C-*_HwNY&19s01fJZiRno$xA4-6J#)E zu1<5L2cxUmEX!D+f6c8NBe&bm9iEm@#qp?XX|@pnB+i=cOHPcs+(8S*Du2yLUxSSr@daS2XPd|xkzcyB? z#X_%+untgckjVaq*0giJj{fk8ii;UIQqHbazs2y;B^y9dx9o#){H6$yxy);qCkbH~ zX01C1J!!({iW*o1nSQ4XPYeyy?zhm=S`7*ofdDFjQgwyKL=QN0|Q0AntwUl?3#6^tvy1=TK51J_jS;sDtGX zz5Q>Z`>zSQR)PA9)_Zi`w~x1dj(d!Z6M?0fvk&bIU`NafR{kEq#by_?W%chRBCv-s zus%Ll%~ZxKiEt=F_%zD`NF%KZ)eLL}(__V2x?^Y)^qjJvas*?__(>1qXX;w90B524 z&KN`oONOMHto9C~4OS_3q=Q(WLx81w18cqRQegn)UHpgT2T7rm!ZADQev&xv=c z>uKy~{Dn9W&8nKq7!bUf|1jB6b)fAOD1N?Z1a-*&dyJ|1Fjm^P6L1Hg3fc>ijh@`t z<&@gHZeG^NSb?z~*F6+OsK*G05RFy%tqhDevV?OgIA?z)#?y;KCfBp0wo%g!g2|vl zx9V~nXl91G-gQ8bIHh(85FSOE<@XyxrqSFvRJuIE)_?zOb|k}tB1~G#uxVa6jWyTP ze71p@ zRDPT`Y}e}gxTIS7K8Rv<{@l(;5`HBM;R)|@8_;CPzjC^Xl?1NF6%tQuzyB9Hyrq(~ zNx8`)$UQ>jZ3|ByLRC-}Q-9H{{KYp30{LNk5Bu~dp-sa05f_udApaPsyoD~eotFKV zKcX>9q-fgFX$BJS(Z{xbOMDmw#^BscnCzB>GLFvJLJHJv@^Tm3Ll?ZtcP>Qg*_Bg! z*-A1qB~()u@AU(|259g3`(ofwYKbX|cmgO%t_v7xg%80EcY-^2Mzute{b_s1Cc}2t zW!Jh5dWoIL^m=2+GEINqfX$afQZhfk-Jxhot}Ht!Bi_ced3Xj>Rh{_Ik#2y&dswx{ z`<&0WI&`3-0I=XKR{W&&Zf=#3CPQmkjadZXcSF!PVaq4TjQfq;f>Z1Tkz}(9ce7o; z&`nf(wDQ*uusY+F}|$&N4vz!>sUMXt#D8wbbF)v1@4kmOOL8?+To zC+>m{h$mbnXl;f=RsT~SUS3wMU{@5MYdnw(Eg`zl=PNh&Qa4zo*=`0=(a(v0Of3H; ztgnYR<%zMI2>$52H;YHAV~_eG@#tAMHg)jcZ&h>vhQL2ANfZR?{8Dxm`x-x7r01&$ zdt3B!>quBBRW()tSgl^@fqGOQ28|1T5i45zx>v%0sdK}(TQ!kYZKP<7mZ7bfcVlB!t|1h8o(sm`pz7dt^ z{MPZsu@!!$kKJaHWuzYUyCPpE07f|Wcn24H*Y{7%7w5A29=52pBBD_Iy}HQWQnQXH z=3CR6(=V)sXL`JuR=1w|3RT-*i!jay$yq3%AC4CHG+VZb;8*yg6qjk!!w&Dh3(Lpj zSeb~F?fgu0KOkj9!E;dWy>`68K-J$W#lo7tIea z;xbviqa1j4;-RO~d!$3qFZ7T9SmgChg8wJL)%}W4pJr1x=QVT2 zr`S3-8>~uF>xRLJC{Pycvu_g$>>N_*jCqrD{>T?BpuwqJ4R=oO=zRu)POmZiAB*@A4$<^?@4~=MxQsql_=)WF8J^*+a-^i5 z`^TluBq<<+H;i0(3y%Iwpbva~Px3;&4ahU9uK8N49Eppytka1Mr!FX6EzY|Z?_UV1 zmpt2}9+mHGrP_n@v{Q=}LlBna@8`sa?U%7OM*-#43k($aXvKJ5HXtk>4d#K%R!&rZ z98-eePkx~?Q)5-mW;(MPVYqnqJC;1X>bWV|%){j+xo!pI7@Pkc2;U^|45!WQ?k9Am z0O~DIM4_2)XU@vVJzaJ)B^mPRX|v}hS0Pg=O^7RCJ#|eCX;b8q6`84evbD!agyhR) zAv;@Dr|#NSo|1{m`o+ymwJ~BfVmX+%Y%E$4B3th)-mE`kg!Xa1cW<`tdR`?T9AIkf zzzryW>!J7rr+$~|=WG;K-k05G?Zj63lt-CIE$2$&9Y8jX}$P1k*E)j9? z$*1TQwWGwrvkcU1u-&ZMCjF^eQ*AheSRzH4Uy$lepx+oTRM}C#lY*gs)N8et#Iqk6 z1YwkVCmC~A{~~ES^xeifgL#Sn4(PV%C`}#ha-qGyv#pm$fn0Y7g6M~U2oQ-#AE{Zq z&+c2BUBO1ImL1h6(th^UV`WB6VMg^6H26#tU9CLH1d0e_R`VmR2?2d!-GKOeJs&%DgM-fb)Uy2r z+_;oE_vSj|;72jxsNdv2h|AIaZnkycPa&1%-F7{G+VX*aLz0jINu&_PSqe>s`p6yD z^S~VIbozwpRObyXYy|_geS&?(mXUZN#=vwxj}8^l@KhP*rAWT^Pu>-v}f-3aacn(Y}l);EaS;U^N2*0Pl44_N)kws|WGxt?q;o z3S6}u5R|fxdVrN*NWWWCWnbH%cMe93bL$zGghWJ@1Pqgsiv*dt zO;54GB4dByI5@FYg2>F~ylqw?s>cQqxQ7!0r?%UXH{UfCz?7lMjjAylSH(7P*zssC zbqHB$vqv3X>`MOq6&1D%MCPbY_;L!vl|q(Ft^V0+D(zq6k&1h+O6fV^xMu?2@x6G3CmAe#SWiHB_wY`+?kU)ftHaXp!He>Qv1jE>1@k%015KazUs0T!61eQFf5ZJ@(hWklD1W1RPIdU3 z>KydbdwjFJAJ7Z_sFG(+QQQ=M@3MP@*Z#+WV-%rxbt?Y|+KuNG2+ns=dE?8ZGV5w| z*d*JfXwbfo9zQ@@7B%JkKrNmzZ=iGW0v{zI_4y8SXXBT5aSdkb^Gy$h;qY#z4d0fN zU~C?Upkevik>ZN=k8X(zJ5@wy%VAECV+ery?|Wj&mbXNIkD!c*6(aTfMh1iS$_F@! zL?Nm}k`e+I0*sW8@lGK``k{GWE0Ro2;tg(GcgV=XOxK#gP%XJQ?tbBdC>ByT9}N29 zgdo%wvv|U7hslJ*$_uvhFN=*0WEdB#?`KkP?Hzdba?P$Brfblnwv9rO8YQ9Q3$m>; zdDuu*hFQf5shIE{Q^Zs_ThRWST-jbMmndF z%rl4%!ASvU)_P!ddq%=tXIHwRzn$67F2JVd&IKR^l?<6(z-jH@dZWT76ldRF2>$k- zF>d_)-p;JM}& z1+elFP_w4tD#H|CBs9B&w4}4muk;mEPz^a%eT6VXESVZKyl*i zU-9R&D)BQ)M=cqyS`iJTXlfCLv?D7ejrEW%^40cjN@wvp-CCrK$&2H(N-G{~!|=e3kxp#FuWr(b^tKKF>I!TwnE4mQ(?Gsq6RH zi7T@l1=AsU>Ir1au@I<=IFbkpiqC)k z$aOehz=mh!{^c4<2#hs+_ z1klz!ho#_ORmY>EbvS&@bZaJoxT+l8hImlt^_ulk{MLy}W&W_iJx z%?3r@N{f`krjw{^er5=cGz9+^k*(oF6jLh4S$-t=ZE;qpI(qvO%yjGbGo1j+ArEwm z2*Rqo8oEFcvUbRD;{Bf0qoD^u6yuACj$Z_c(ES;X_dwV-V`Bwr^_}f&Pe68`Do7A$ zSb26JPQ-RgebsP8-fwN_(!zUsqlE-k*(1dl#KEo)Lq-!CBane8N0gAM5fm5WW;M3U z--^PI>6b37m5D0*-z5dKT7boNaEa9g85lvEkk410 zgnZH0^!?U;RI?0@H>3IdW&P5!>*sz9Yu%#!Q>H;eMxecJ*S0Oo8_dNg!o;^owz%@FqHdd1W_pn!L(=x`~|6^C`>kIU;P>I|E{ma!3b8D`OKBHtCp=ojYt z@I1^bpb@HqZwjEIadJ#KJIbkKJQ__W-;IAz$=M@AKIMx<@Qo(MhTT_(MQkq$hw1ik zYl2+tY;MzpL5t1UQu49~@xjml$F45uU>AX`RpKdbOa|PN?0+WN=v4YtL06vYp9MB`i(4k!xMJ*$$4<|HHJKo~bP$L8 z6vzyr>~prQr>6gGCIz-@Yg%u3^AZd>Z$pRL5k;{9GjAe~7@#uR@ddamb}N)2b-t*f zelz|}vtD?Z*O#ycQj3`hDxs@YD&5OSf*RBgtio<#C-Y+!qsul&u}SvpM1zE5bfG4? zscFkCNUbRCM}g>Ucs6Kg_?Z4PmTP)K@duX#3w`%pzz7}?=!cELM*Tez++u0*Pg#AC zF0Y&;IXBuhWNff^@2jBXKOfJu|04>eH|$Ogy90y%ey~Sd;9%dJM3n%yLA21+h=_K` z@2&i4fr(Syal#BlD0mf-VtbH_EKr-E9+5<;dj!Ej!}3YBMOM^$ZFq&u0EvuyvK?NQ z#}^dxi0DU!VogX^LVgf&yfw^R=`f{^azrLdQ)e$nsD}O8EdeZeOufN|#CJ@C?00&M+3+*1BmP50eTbb6$R=JvC)D_{D_lAnPJh=BLlaPpaQPICmzW;r!d z$Wf!}y6m1m^H&YIS$>-a$ywPm#vI|RuO(QELWJVek5qs91K9wvo7|^?t8&*-+&fzL zAJh`0V}z!y7u>fysJ$)6n%qlSrOfbJT|w>ujVXlSyW+uW%7}8O)+@-#W3Tzwk(z?g zfD99Fa~d!Z=(<787$9Sy@aNk&^p$# z;vHiVSqgG$+tcM&xizP2!vUCV68PSz&QHUwpB;guBP z#5>;B|7sA1tvem0F7bADC78u5i$yr05ioiCg>bnw3@cmUah+ff1ee-*xqTP}E*%3V zP*yq<@DLFDUBkV^;GJNoMuYAvy^#~And!3GwwwiQuCm2s4_+&OlmCDJe~n0fN99?0 zz+lUTFF_wF8B+-ff3&+f2t6_|c#&D9{w8#=s(_kN!u$IfybBKJLy(*k_e`Gcgic+W zc}&>!Anudr6|Hzv4RSlNWCMjf4iO8UY&uD}zhI)KQV~&Iqbuob8lu{0+(h(vbQ5I1 znfmwDk$d}8v=C;xx{a-wGPEC73co)L+KxUynG>BMn0qo}zFf3E0~6Mnf5wjkhKm;{#obyE

Ym08~o2eegK54zk18=|29dxY#i4@#EEvVPrMK5^@U z;nn=k3J0=uuZ^Iw3txo0o(4+PkxNV4Tk;MU!?$HpeJiu{CtqAQWr0h*^K?U)&thO) zX5;NmXO<5xI3;#5;z|zmb8vx@Df#w~@Q-*r_>m!1<;m%T(;Vmoaa-Ln59~u&ZetUV zKa$8&zEbtW%e;}Nn#1&vsi8Z(9-`xy44?Ru>3p6H_%jfH=rsY>;9R*FHWU!_@dGOC zM4y$lM=S*~C^bGuzV5G{4}(%E(Blx|pwacPmS-^*{j?ATgT2(dRiAmTCUNyZ zkkivfvivWGD+lW(`MUB9zV1hv9InM3AGDU8L|Qw=CAPHij4Vn$fugm_Z44T`Q_|x2 zYaMB9qQ?($uuRquc9er1HI$4e3yH-Bxx0y;NKS7NbL>1PbtPxl^uL%;#6xrk<$!en z?%Kk#BJw<-tpeMcJO17WT6%de60UuR>;$r!$Z)F$eh0ug%x8#TfGc%a=jR_u8@P{%fUb=V z84M5M9j6DE$o3(?R4JPD<_6i;CK$tEXc5d_Q_^z}G_{K#MJ(AAgN@}*5L$}GrJR5> z6DE6iBl?&*m=oK7+!f-E`=vPC)XXsKXNeaoKi0|$X)VIt z{xr7^xMzctETu&e^D$CU+P$996i;{mfBii{#W98MWad#j1c&4t0e{ywRye@hCqqOd z@(j8DznuVDI)^HKv)LOyh^Mf+et8WQ=mrn=T13UT_4GH3`)B`tII?*s2@eS&p?;sC z5werc^dK`&V}3Lyxl5BNg~5dYJPH2>n1Q|P+Q_4zqM$(Ua0PN{gTw;+`Y4Z1C({NT z=N(wjjYEvlLBx;|@fZ=A_}vvfg+_Oog3q04EG82zt8XnMXYSc1#x2Y>8kArDE@_kO zCkPR4d0hpPvctj+|9}5~{aLs6jjO>=K227*2R{2RY(&1{5`?hi5XI@1^*i4dTuswo z^H)EHvO+|u>`uPLaHUrfcWfgvo8+%mGCO%@`ceORA`0?Gojj|tw{8AJ1I}sl6t54b z6WzyA)6ph(SYbE@o`u!f7K{ z$tbxGYWpQssV74I&6jA8Efm}IbE7-_-Y3e-bquM*N=+rpl~y2<`wdT4_Q3GfO5wYj5Z-r8cMc9~K4d`BWSnE^v1b?*_WEbh3pA1&>j25+ z&QXHWab=+C?S^$OonU#N;8Up3NO-=9a=*1_MMi|!yX?m!(^7gw`0amu%w$tpqK?w1 z(o?T(!}%u4$pQ$=R>IG1>)^FCta7pokAB(M*-f5_sYNCvyC})i_>Jhcs+f_-4@QS9 z^rbYTwGtOd&|Ci8El@#%>9z5G9JzUN)47kL?*U*3C>cDlyPwV|8oMgR-;Dns)81P% zcy}ILeBDd~vYy$>bme=uTlL8jLO8@^IXPL%r!DT4MI$;MX?2Mjv>4fuM&ejU#oBe4 z$E(VvQ#TU!<>%JBRw$#pav1XVM^!;kER%UoWU+`_ua?0WHq32u3e*G=#llb1n=NWf|MHZQHhO z+qP}{#`cZ<#O94{+fL@~?y9M->gt(4aXy^A_FnQKWUvFrYxjux13rK9-ML0Yk7cOX z9}R=S*5*+Sm$*Fy^UXcys;L5aJPyYvR>oNdIuvKuYVhS@W#uRcb&wcgFYn}-JN%Ca zxJAoaR1v8l;~7W^Kj&e{6MrIhgn)|F=jJPEgKtWlnksLS&msfRkc!KBhEldu^14pK zn4d0v&9+)qZEy8v2@0CunAAagNHII1Y)_ymni@_l(;Z#w6$ZQwg}BOqS-6llidkAO z@7D*EA}2t&-bf~wIg{ecs~2@tPD+)!ylA`|fo}U&y z>e`C+Yp7#=1At|1=lYpZfxbMfaj>$sB`s4HgQkvUiD=#rJE#7XNGx>`I}j|9M1Q^f zfxo8!vIP4FCc0Ui<3}u)oH!ib^+bl;Q_*?`yro3k{|{620qaa&e~rCYsOhItY>x+) z&%}}wFhvb+BU{nTB@~y!{!#S_lhQ~TjKqYtQyTax{%WM!I}B|KRTP?=zDe4)!A@>@ zCbve7hW!w8FlIW>kpZE7xz4L&Xt!0#GR1MV^pqGR5J(9{Nm!Djo+F<3?5+}=#y81< zEO@+ggR(<8bZc=X+!J64ayyqFV+qaM|d~g>d>rmle9SriXxPHufdr>WVWC_|t ztHfZM(E2W&Nw9ZwC~n>@kSN~~=tWJKwyoh<=-Lsl=KYs=zsiWE@*e(7@Bp+c_=buw zgPFYY5y=A#_T5hvBa)eLSIlnQMS%Ily5Aay;){d%ZxFPW4S^|i%nx3F{5sI1wZfJn znhSN*bcVg$NBG(I>ZzwD5xAo^cEAAD&)l>4M!~Lvn2&BW7%yV4ZB|6Vr|-JyUX+ zDYN}%BSm+9B2-6!3;%HE2%ZDo-RzSF zD7wUs_Px~Y5 z%nF9q(zc3ynz{$(ktX=Y*Oc@ctL4oOl z(fG8MPyMOR#cx9Nid#k`M%-g0OhPyzU`3v|qN`Dk@%9*oz}!X;rHylSW@8PgR9p%a zh8+ea2`)`%n;b&VkQ8$FC*CPAPgW1KV5atBrcD5Mk%z(08^Jk_~NK^|sD1|MmA_liO%Wm-;9#EB6j*eo|1a)o}x4P_lkh zKj(U%8US?hZ2b9)mM_(*cgX^NL*z^{%9wR6gSM$f;G-&rp-A@2ea#AErvI1t2)gU4 zP?!DfE4}j^v?5Evt+dLLxCv^PHWwi(CrEWK`#8 zo&RqE#&QmbUB+37(%L=jPex9uR2fOqwno3E^!rz8wKhPFATtr^OOH!i$0<+d1bNmGxzi!!GFfOMPSl>Z@ zJzha#D+Rpq;&{W@a8uOH5s#?_u&?s@;+ZMp!+eho%+D9%rOu6SxJaEIWV0t6ixZ!> zPHo;_ps7CA1Km~@rT0A9#j5lP$?2H$T!rp;bN?m6_eEpUTsA+rKbW@r256*rl2R~S zd%e}6H&MY^-i*)X`_+3N%OW*{peWrdQn&+-2n_%$fJpLR>P0TGFAmAvW)I1`U)dQK z{erx&pvOeTDP$vdRGgXYfH>Q&njM)@5a$MIag7grO*rA4<^J<18MMXvC5Vwo(T3;muN|-SVlu?)gi!27i9aMz{?IDsAU1O*_=NaMNS0sfNn94CC;BTsDwOV0P zq7xu&7~3V=G%H{3w<~}J?{J!4iyqDuS!i+sN$Aj7IldgD5dxh)>gQA^wx+KW*i;UL zY1J8o?+QFQ|0W)Z&A&xwxH=na$*hGFm01>cdDW5B1AyrPHj&t}h94gk-S;%DmoFvx zp5Mc?b;^+!7nzx6XxQ|!q{F*FYgNwNH)-!gAQwXid(-bo(yag|AiSP01_2mUs0;&ph9#_5u<&;&usA>%WiH(5knNZV0$$c;qpj(GhU5 z%C;m`!*`w|e1xQIZ(7r&hjr|F1L|jK$JoJC5VIvS9OD8zqJMhpI?BkAwG8g>YsAlK&_pkZYFkDEtCPFeZLImQ2UYMS8Znp0fFDP{L`qTM3nE(M z6aoEc-u7K4y}oR>d|Y(3HmcpIs1_$lFt|ht6WMBp?;t04)l}M+qG}_mTFIy9bH4t$ z7@%Of1wit8Xafkd2nE5JjXSjuG72U&-6z=YR~ppTPB2`H{uJ+nN7(AEue2M(sx#a( zIsnjcJT0EJ{3D*R~C zsx0{Cd;psu{@tSKQ!3E$qPy|{oykY8A=@da$7WO)j=6~oem;l|ND_+?KEk7AHYoHROg!xF#t^0_ww44&P4E! z5=hbx##pq`X+PPa-!7Q=ebDq?hPn$Mc>XAeT0UN$N!}X@B=`ASHWcXZ3PgWvI$o?P zE>{xPxOrZz{@Sbve6&EmT$VkaVLw<~y|aD2KS`oLo(nEp-!9wl3M71MKwhi?mWu&3 zcI_974a>Fs&jy0+YK-~60{)o-{#640@B`m!?H9Fz%bGvcg3nsN>h*#(5`r32fi()h zv`T+#G5Z!EJt7d%bCSQH z%6JT2XiY0nexLi)782su)mRs~_+r2ik)Fqgcvcl0FyIQ6&os^Zp>lkJ^UPolX4tdf*uE)z>W z7SVp~CB_wWtt|aw1-n!~Ei3%mFZm()bZ~ZktRiy=i}8;i$r@3KsW}H);W}kiU(v>F-v26A7?2^qZ1? z1yyF<=H{_)V%0fZ(cLGb_DKnQSn+%VG~ALW5aIJPaSb!Q`jPIY-|cA=Yc`RE6!7NC znluEgdI|D`gJu^}0yyV1-#hn$(|SC|CBDu9x~I}po-xOEfAeKrzR=Nb`4PDJwN&32 zloP0;x6I!dmNS1E91qRyd_Pob;fUs8itT6Fw*aJZwB?LdVI6h=3Vq{F1c{qRty_NBjFQ8`_mh>%vJmUhdo9clzv;#AnANApAC0a^5^^kP$7+I9f z6?cz6qjWaz++8AkeX;$&W}U7#V1n)G;*{CuvmMSw07bEkuK$k8Wqae$y@j6^I*qmS z2VIm$cqmZ`^rF0$r)w^#L3+Fn(9;j^>^0=)f3#H7-QHfn8(#en$>;(u)`Fr&w5I3j zwww(1jCFfo9}~7Sa93ba6KK2a;Uz0_{H=lXQ7$9LKt$>NO+V^VzU)8*`4&mS{E3Fa zzZf{9clLSq`kN-WFpWhhP0x+}Y#6~wlKv!5&^rTKgaVPvg7~_czcK|)b@;E}>M1XJ z#IkVQrKszh`-E+Ks=UfkY;oB~J4vb+uRA4$)76p)lnruBkLx1_?hp#he!*M~n5Y$g z%L8CTqr)l5n*sxa4VI|D-B<7XQb!DlumlilO0h^;n6q<@&w6uKc`aAKk)76SwUM5h zoSKDA$5;DtCaE|r&Hyw|xt~=r3<3!2)*rcs@h)%N{73IDXhE&uVeXTOKC-bf1F;A! z%-3JZ&P-w+VSgK06kfRkh_&_`Kk;2N4(up+`A2Z8=$_NGpnFe$*%g(c6XgsiQM2lQhiOs_2=2LEWlQn_YEF9QxA1kSr3+ z_4(DeA!bU}*bG9dEnns}j5oh}gmuT>Q#9~3EvRVTXOOVDN+71p0li>RGgB_O`rY6* zhCbwr;P?FZAH_M4By7=HY{xTp8M57<2QzswD}RE=XY^Dg2Bgs$QwAgqhir7Ad5!v4 zFqk=L4S3CsYft+S!uPdELy8PW{&vqk9R4kV4gwO`QV0532zL%5T5quO{=}QEU2~{v zniMGzF|V!F&f3mlf*A|Pcb;K>;VlrJK7pBUKk>h?xeNxr*I7BpA40WJLnrZycx6TD z=Ypjw48PzefX-M=w6$V`f%daBa;9oSN^Z4Kn1F=Ys@XXmJ+7VF8-F2Bz`c50zhs{V zY3JJD=!cqyH}}o(s2z8KCOexZ)YVI5EQcD?aN0ycaW~;|88Y`?7SG1(Jg4k*JH$e= zLaWc|)4Xnc5QAX9D-`obFqs2JzQDa{E<3`mSQfo+=cc`4EN^A^uaLMgHN=zHQXjCn zIn@y)advHJsH-yufLk}j&Gf){UJyKR>^UBLA&@j^)SPL#BpFCcvi<{GM62q zbka*`7D4P{Hb|6Yl-TfvN!~036zLD4keKozP9e5jc~BjbtT5xani0yISOU}{XFhoS zR`WuolZ7XfrI{(g3m~CRgB8vWbP=HwE5vc05RreE;{%`@%c_a4@m!rM{MkrVgyhF? zYtuFm2-pu2gHedBJlQi{62SF8^)xJ(JxUPa<$!dN}uTqkF1i6jv-Xy!Ue}G zf85EO@Td3BiSZXuj&S%Kg9}#uaGQCS2{1kIMr7K=B1Ot=fk=B`@VAA&t%V`XpgZka znP$D1tNYau|@tTxzx! z1F0dMJv`A@@~Ov@Ph{c&Byt@p0ejFA8W)Aj$mmtLxS;^q6khIy26CidF=nexQ=>4T zdxR&<=Bc!hK*gl_FCV|RSs(JRxDlMA8pZfqD)(c}Vc{F%+kEEkAc-*l(p8%y>J$5X z2C|h790nlWU@;QL)J6qa<{e}QQ2EGN|8$?&^QjLr((w>Vahn`Ed54eJ!e_a@EK4$_2+J>+veYqN)I@T*vI=t-^EXJR?YON1DLMQ5MmQ};z7mKS+lZ&Q;&mjKffDs02>0JOVp)fP7&^Y8Cj#;` zzMZ5le{R6e0L6aUVE{?hI?a-3$#-0>nMdMW;RX>76|-ZNA4X-w@I+?coIe@ zi@w>Jgn(!kez=y!X@gI=Zj{UW7ajSKxk5o$^D^jIWLc%7=sr|Jh`BZzF|#nf+O@Sp z#mHWBW!JN62EDeoU3aw7CzG>Qii)D^Yea>90XD@GKXGtM-`m|(Dq*9SSKkq(j^ z4_VXZ<;)C(+u^O=aEjM98aqod(7Iv^lh$c}xBKQGi?Q(V&rn&=S3oXMI7fpAcpsu4 zEE8qir@@oy+~a{>rQp_#k^lJ;^94!-r@!&AaiqdnQmWCv77B&L3QhcW(~AB9PdnJ* z0coLBg+G+JWB)01nIR05!sz5%CBw^nCf5|mwX_*TRyKLVnM^GhdRyZmtJ5|KCF)0B zd%nV&@n+aB_84#93q(7aLOYO|;Lu>zvo=*i((o-aFrQB~IO5-t%#dt_Eif>0)XK!) z%Rv$^0&;bT;)n>k(^6=*Z@1{8uy!;L!Z-xCTmrYDE%#sbTyOtVw2YbFyzYA@m*OIV z9!XJ&^wJY=$F%Mch%kIa7US1ju-UUZlX6C1sLM`HotK}v}IxL-NoQo9lO?2CatTh){8sni`NzqJ`e`TD*X{Ws^ zY)1Vf_}>A0^sofx1F$IV|F>7?xI!)NtP4Tl7(Lx+!vtXnlW|lz8EU3fR{XC4*ey7T z`iRfH@6o4cDa`c9DIVoS(4hcmSl6jYkyo>suA4m}WW;vY{vdKwUnoTQZ~Hj~$Xm8( z-gX=e%KMKr=ofCKEE*+&yFmtFPtS&uS07ZcK_w9(voOsTn}3A((3YT6JWg?Vt)g>x z#n$kzuple==@&p4KAN&4XO-Z}iuTxHrMp<>VkUTHI#_Q^8ij*Dh7|W9t*UGfSbN)f zK>t_wP@Uh}YV;D`KL_0IWRj83lZKif$!SHiCAimK6t%dmQ)0czR;A$1mmm5am(2=^ z3F>4ZQljI}bx{U3a&f+m^l(00T}4W{WXeZz%ZZ`=lCAT)+X;&pk#M>29|$v1H29B$ zKWH8_8V}t&@V(1JXx(-^Eudvxh~ay=j+|`&k%AJFrtQ&e)=P%K%|gqq;~3{!xA$o< z$%d=8htMCCobG=a^AMXp4wg$b?(C-^brigy^C(wo7lw1_NhogemlG-lzJ5V4AjQf> z?g%QfXsyXvK;)R578t;jZv~5c?4*@G0nf5CafWe{QQ>5u1>B9YGPKY<@++!B0Bng3 z%2@Yj$h&OX3*7PCvYNhT^E+Bnzm=W&K&9apZ|O{h(mddE_bkW+RpCFan|DLv1N~#lE}I2rnF5w5+g9J%4F_n~{Z^gUga?3pf7)pg%FMyQk!tb*@w#Eq$ZOoM$%`t< zYMxm7Xu(tp5@HM}baTns3(`?Y%j@QFrv>= zITr)BKTl%>=erzXob!B5`Ij5+ip3KP`pAz!C8+!LMD$20DD~U}s$+2YZhTApI7R?=jJ7!li7C2!mk!RlxM@05M!b7bX zf5QAl|4-%9yaZ7c0eQl%Yd_?X6MK1IBP8H}z+SAA+1dZM8!&2$_r9RzB;@sw;yn(oCVS1W~08)FF!-kmwxwS8++O*+HIIB zw8P6T8=bUQ9&0I6$*kJrZe#oD;E({m7p)HKHPDaHb-jwabmaO}E@faD)a`Kwar*%w z$^dU8bhf3Rj_QCob0uPNAwGo(iI6=*#7UE7lUfqA#vXN3QM4kpLi);p6B^p-?dJOv z(R=zv33%NL!&xzu$OL}Uv_i`4WmtqI@xt}ir3KMqPi!5M4 z!KiXlXFNT8r&)T;{1`P(HH|8+V$q*V-$TC2eIts8WGQ=x*j~yJ_NZh%CNGTnZD<&j zI3YN1!gxg??@pSr&737PUadb1qvEFDMGVC?{`hO2(4KU`*exFe5k^iqzftuu<(J)K zZXA)QvtS-U zH)5b{%uSezdXhC6?R=Q@7;q?!v;BD_PK~;9vSj=OyZ*A zrus-~`Mvhbnw=i){|t?@ab}IwqyK1tvZ_Q2O8eon-^#*7C~%8_=U?1qs?Y$OYsg6U zo=$|ctM^4Tga4zu!CggriW!D18k>+BRL*k^iR*qX-5Qpp3cN3cWOz9}Ju_ab=h-LL zV84a*LgMDdeB$>ib`{t7t0Z5~ISoWz=tlEz_YBbOhIEKwx6!Q0nUg!S)w5O8ght?F z_}sa=QLpPI!V16iLjY;Xi<-53Sg)Hnx&ZjZ787=gKKr|1$Y!%l4Z<+{nU<-C6nbt5 zg`E1}k5@4}OKnX_u?q5w5Z%#{IVRBeb$3*$pCgQ#eGs+){>`d|h#YZ~P%|L)6!~N& z?*x1zPMrBoQF=4J@0*`=vD`x8z#WGyDx@F~%yCZYLZIpzKC?nD7~UKYY{cd591i(@ zjkxhqSnX=YV5N3-{wc?)MgC(>lxgy+^!J_z20qw{t9bw)_p>dq(kFPk@V!V(XGZtM z{LRF&AK^#T1+1jbX@72fdoBML4ssVifY7|;-ln$QH3%kgmB}V>uE>b!)pt%+B<7I~ zqd|_eE*Yi_Fo@>=vW>wbto*1|@0?%z$3khDbVeWxTgpiB?!+@CIv5&IwpQ8~04T_r z+4$n8@1olhQYdyshAO$s2CfZyEDz#$Pl6Hc;Ze;lv=|${22pf;%U zWhMnzSp5|dQoABiT_?v6GQ>SUpo|4IsSlXC+agMb;3+n3BK{V5`&I2@MT2j98?K_8 zYJvXtBYtbS&T!LCzuv^p`wkZoo8=k9sB>j>5e-$+#*#sfuyFU(H8aLe{%1LOOlbp& zLIUq*2>|Tv+Kot{Z{EASgFZ__u4G7k!RCABp4`rD{KNg%5F*Jc3S^tbA`_g zdZkY00A+-uS22GO(*8(AH}lteyi0+?Fe>sJ(e;B{Adaj^D7{2ywjH4INI5Cqyr%)li;v{mDxeu`tZ z-?bXKiC-bmt)-paQVm(Cr&vL$gjS6*FN|W?!7n7HxWM~w&$zi^_-rg}vUhlHi?x5g z(75pvhzs-Z0Y7i*YHbeL=t&piH5LM-C{O! z0zbdjy+@XuR`;GvNd(%M%^)bCtz$cHFRl)?X*M@jY1IqY}v=4>{^ZjC&DUQ)Awh|b^;jDYdPiQXkEQ1jmT1a-t^P~4>}@P z0tF-YKy^}51`AXhE#+6*`Jfnz?ge5AzJ(_ZZe=X;)IwoBZD@+AJd?3d!L*DmcEjva zxaE?hBHR}7u2K&tLYgQ0TFl|@4MN>=JkSbh%vN#EMBH3_$*pg-Kws%o987PO42C|I z?Lv@AmKQamE=mx6y1!DVAEj%#o$D*gW2e6#LHJJQV_C`m(e>U=QAX(E8m~0!SX=ph zM(9W<*)f*zu#*6f)`ae~sW8HOF4hk9;4A<9@n`(W^F0VPhqMXD>^%#W7^OHU7vs=9 z0@2~^f%cBE9#T^K?gegpWUwk88Y~`}F83vObpyd^UjWq-K!xHXNEAV1qk{Qg;~r|i zkvX3aO@pephrjdna=1@u+nO>)-1TC>d@PBd@Jfxq8j+LZ0$fl9fja@T!Il_mr=a)m zRc9AX$cwhZ!*Nb}4n|W#D`$(2H9((ODN6OT4bx+pH>1<}_KvT+V{m~=S>~SPyGd_% z(R`rq`wHCHtIQ#&+zB}sOHjrK`P@Q_P((5EXfns4cvuxItQMoI5HLm@ZlN=)3dO5v zJLl8TH&a#36vwy!K$&D8CnMB@p*A2}9$(F|OBh3N=F^g#f+1b}Jm1Q4gZwUsZ|wrd z+A>H(x#hI~k4Amu$Vr9FPZ>%2BJnylK9m_>;UmvTtf8YA57xed@64vbBUn09`75+{ zt2tm zFQyxE!jG4zJ?D;M`-U4zNqpQClAN_Tf$3j(#_{#&5T_8KJoZ2?1c~I3?&_}v%ijC| zu{YBhr6*=ZL@|NfVpX)_#i)b_=v@%0WQrrqJP5TymknbL5q(h>z}G; zKAXKFl|?b0viqn{B_^Lr5GTlXEW#d}#$*@4LBy+WV0+(OtPdSB94;Ti(s%ah>2RJl0 zbRs^Bj^pn9K=zsjcT;KbbD3qieUg411w_EUA7n77E8hV=*$Rf!Z%J;kp-~tAdwHUJ z)0U6q?auZH?5DEaHHuB`}GKceilJHNU7CBb1LgFZ*dz~mgOzz z!LJV@?3mWBo;gjD8Cj;~Rqdpql=JDAEk=hgrArVjoytE3I4QvVP~{vSA4_~})F5fa zNKYMTRY!vm0;cf6+ruW!!wpQgxj9}7A{c|)zX*D*epAy9iF!bk!UW$@O8b`VTk^WC zpW8ydl7cNGlkdQ%r**g_F2`&C5E8Pi7{9NXeQ?ajLn492PrPExcEb>B@fARI0L5wy zcT@HFc+JavL$~b$0(M^~VuFF@*bg`1@E>+#_0EFBaSN67Ok&Et2siM6GuMGRv0fdR09) z&zofhysf$DYiVU|DO{y^G;V-qGH;7x0&y{q8Tg=$RYVF8xc-6uCqglx_FbZlKGeFd zI69=}vfGlJ; z#v_}iJ~2L&S`@w*jzRZRV6DWSiKLIH;-g=9_lGW@emlF7j0_z8_!M2)%cMzC6{^oL zmws0YPM%Dtq;$^=*S@LE#sEd=ZDL<-rZ=GELjCo{(qTKYL`NM;?jsgOx$&AQgElTw zeUjbe^-kHf0?;uCeW@#J4^9A`$TWq0yThNzid8_6@afh5Xg zlCCJVQZ1Eq$0$d8RCj@Lgu(|`R?;0#lX z`jn#4P90AdiMu);bpQJ74h++qszAGm*v+0{>cLX_!E_UI80myE=z$rGjM<~oK5jk$ z#`0tOi}U7xv;z~@wHyaYsQ`EP#eset(RU-qaay@YC zh~Ez@dpOoqQ6S$DhWER{`#B25c1fmGcTW&xeC}U;yS@5V8`U^_ef15&}Xg55- zD`T>n_SpBfAfknSdz9&k&0KBcnFyU*#(r)y^qw9&E$q!%&4zAJoEA$LYp=DZy?7V9 zp@t2`71H_th4*VMANVQQa9NE%%3T9lOk$}Z)^lfHSTqCp%4Z3eXu0GW=U+B(r`o-W zj)7g@eoRFEx=(j#{H5MnslXf$G9o@o{tV4Bu~?s_I4V&uc%f{SP0hGLaFoNp2<_-s z`cDt56_h;GMfm(@NHu2$DNjM_umEOL78!z3zffSj|HOGcF+6*0VWZ8z8+R4nF`=gxsMDx-E=6pg;fc!1wr^*vSf)HdZPumhnO!>=)}cTz`?rx%;3w$WkK_ET z`{I`=90AC3)YHhGroa!Ofe4}+S!CtYf|FpHeVFh_x zG7{n6e?>DKD=qFx+~^e?<@ZK=f!k0jvO9{q#y%nRL{L2gr9zlR2))5IdGFeuRMJDa ziNxP*$%k0bRC*dy#bvb|JA(j%61axT6F>&o~Y>`4OZK`-D%$a3jZO<>2F&kzd0glc162EVuP}~QY&qil59E5r|aUAr&JIY!-O3-u!hLF|U zvq`X`C{ckJA>L0}U6u&8Jwi8uaTIDd;4JKOH(dyx!Y%z5rEc*IkU`t?7&+H?jKrZ+ zO!UTh5tGL1oGQ+4OeTe&zcvd;y;Hm z9^$8oTCVwpu6yyIhPuuV|AwExdC~q1w{KzJMHtYPOyazwl1N069A$L4yz@y{H(C6r zK200HcgDAH_YPhq*r1mpg8-7?21mTd2zI}q4hgVz?sppp%BSg(9?h_tR!enK+=xdz zQ6335*ksSt8E-4ehbGQhBBWYNUlfxXOE7nNX{!mq~L=)VBtcx#C4Z=}Cm+E0{w^gui{ z6BW8)URvdVcV7k5j3C?LX%<_)f zU)vMx>~&`UGj=|POw2q-X<#j9GzE9Xp+osVvXrDaM)$Qv%Nn;xs*Fm z5fl^Y$OlgklAAuOKh9(^=d1r%W?ds|OX%^QfcTt1)6Mi$avW@-mO_4L+L}epadian zttCN%oSKRB$G3QAahIficAMF0W$dQa zPv51+fuw!#Uc-}ISe#r0zH@7aQj?1lQ0w3<{jsvDv9;h#$;9`}C&IdnS!E^n`!$Zq zKbxu>OJ6Na4{Dr6;(B=9sWp@z9I9BmqaX6>h#grVD^c8pJcL7-#BKM#t~AuzQ}Nba zqp24|j!~lAud`W@xp5cVO((@YtxuboA|_u1Av!RB{&saFDn=(`_KGqto>GdE7^>Bl z-<)ma^@(ScZ^AK%>@MYhws~02?c%*C@93+Bh!9xVEb?f^b^V9oVvm{QILD5X8>?-s z0hHYXBlQe77WZ5&@iuO9pb9tG&XHoEZ^PcMBBJ^S#sPCReCth@y2V*UGgZ1@DF)f ziw)|2Sq?RK3>=L~F+B#BJ=@jL0EUS5474JmQd)DY9bXm;^;aO_&weTLCzxV;GADw& zVH;UQ6N*r5uU!>AW#qE-Xm*@XIvWMk=HT)YuqKRu>>H6l(rJcv?_MvgOpKaNqfU@2ClK<#&sC=IsCb6vHZG<_?$AxTjtqR^X6mF^U z#s28il`aqb9j5spI>xM_6@Zh*RYBKR$n=Gr;7SEk?v%(czF5y;vniZcwh5)UeF||9 z+0X@XCckLwdlqTe5F481B|1yU*qK5W<)ojY!3Y}rnSc}uO*Qt7tk(<^hH+_N_H3q^|D{C%_T;Xz!D zvKel{WAB&FAuoyJeH|uSegvuXC@LPd4qKUiA83JpV0g(g6G~?n{L`Hff(G>(ue!#d zSP_~(O~cTbfNL}(T{})ae&hb}3vH)W6I%g=Iwkc+^9z5$@`j4+@Ahogwh)~lZEuhZ zkLo)y{&OGwBFb!41+oRSHy2O$;fGB?;wus=JqrsBwT;ZaC8ScQD66tAdXM1=lo@)= zZ?rmzW~=-P_D5Btwur;o*JOvw(u7D)hR-ws6zd^HjLm8JJ^h+%J`ocDO6T6nNw(6V zg$7r$^c`)fI{OF1p9A9VP771N+O!JemjEV{RDR~j>UO_N2bWzW4mzUJ7Y?-N97EN2 zH`x}(xZ%ZCeVJ`gdCngi^_tFsqDI7N-Xw^^3zSAawcqHMC6>Zn%2iEt_!sAg1_vm^ zyWr+){?{rBb-UoW8hq9Vol|<^PxaOV6xFck2xCUhbrpRDOZCzs%9;ABZg^8!Oy$Td zP&y`p{K@*U^y*%A^UcUhe|EsEx4tzgaS!4#O<@yQwPx&|@Ej=iJea_Vw;lEz>@-lP zzF?#})89&(GhcX_c|p_gNLT{6SRN@R5Nf7V(?ev4z6kTsu--14n`HjuqPXsGev`J# z78>3HnUR?Od*Z$V|6L^@($zg-`0myX>_lI0)OW|0TN$?2vsifL`ccUx28G7UPMC}n zf*|9Pb->IGZ@S}5P621Dx;Ne_h4CmQl&VR)#Yt%GY_YZo6yKQUeooizL7$V@Rg}^^ zm~;x7{6=OzP`4+YqoO+bXqm1X1!{#pJk9;k>er;a>vpPfG`<716}|J2mELWj zxZ$@3dL8vmGu<2Xb@|P@;n~}PYv6MIy$vu@qa8YT6Axr|8zWo@EUPuYBtMmT%7S zS{p;(>42!kpli%)dJHt>J5-3aNiQe}n~~uC7Lqt-Pq=w}Bv`A`F8*znEH zTIU^39)&i)Vq@z5y)HB{@H{MhZ6wdbjcksd;xM2htZ(7LkluYGuv9V-;59=Kfp63k zAbYE!>B%ZVFFth`lEeY_Gt`z9x?FfO(ITmQtw%%z6rgb1VKORgN`${c&CD9j^b%jR zFNfM&dF#c_LP;yOTW};uBQoybw~hsW0Er zrr2(G!~aOPmhU9uo%QT$l5j>L572=t_h*ZQ_*7C||fR^8v{1+%r2*Kh=G zAGa+5g~bpxUAEh+5s*pfRL`(oeE-y`JXn>|GyhMVkkDt~2z+Qu<@vC}G054*QcaEp z2Zg(Y81&uG{1eG^4G=acq%@7SN#rAU^aMIAMycsh`>@{Ef_UnDAD$YmDB+zOw!lBR zwO;GHu^{u9w48Nd>4%3Rd{imQU0)xNTG`$^akc~E=^MK(IQ1$+XqU!sq(y{)o>)uJ-&bAyQM>a|=X+5p=nxsO-Td7(^XUWo%V{s@ zF#D@p64-8YTb)`U&{H4)C=kd$^jBBB?g-p;H&hq@bST(tFKAc%<@6WatS@Lc{k2~Z z-2B_VEWN9~>aQ98tm-G&R`lHl`DrJ(sT8o8_;Qtay@lHFE*CFmLce%h6S z3ivLkIvhDp#1h6=PZg@S2dOqOiRe#!1)_}!9&oJHb1mtw0m5zdtf!D@b%21{RTBO; zv!~!{dyZ7lzmx|52N_+#C9m{zn~f^g^3_{7w+KHd&5m9v@AQ;@*40wmA*w*etLfN_ zWrPWQ{{5EEFM<(E-){!Ol{c{elNA5|6^w*@Wg=Mh7p$Aj4R{gpdn%r_SGvKleHKv0 z>sD}2hpQOH8aC~J5i5O6n?m+z%#PSwa}QHb{Q7}cX{i4qsL-`-!?BoRYaVOc+9kiB zIjX+h6Z7}^WK8dFBRmxch?f)o2HyWm9yB6XOI&#o7D)fhq3H3@XMnn&zCWDH z2Dzd*$HzYMbLZM0)P5Dje_2Glxwc+?`M)saLjEeusMjwyuwG;8>))l4jTCsq{;ugp zHO;TpM~q1E3TFeo0Ls)h!yB%O^hmHeSsGr+@>RLUe`g1UjM&o3qsSV09iqz$10&p@ zwy2;}ee7n4oe^-N493{F+ix8%f9o@QTiVCZOd4*!FaA%otj7j> z+Zzx6ie(6v%=-n2)s5kuu%!NDmAbgX913pjzs`Wq)Q(&j&iEW5MI3~qWJ&O{ZXClm zQ!qd?LPVs>Epm5$^}h0P&6oa-RTTSgPi>`W>n0Daye&_wlFRC5^AzYJgv&_0?%G22 z5K9zUFPb=&`|Kbx;48rR;-@{r_(6K_41h?aCxjLULs8-_16+)6|_Nkau(nk`&WkBEa z@;b=!b1;!X-3xHRg{x#?GapGltfv9 z`rDu(!Y~s{W0>}IAMOSY)tXiR^&CU>!uS0g!s$s1icBvRgDQSUVOJmsw9QvmJTyEA zTxI_t`tmQmH)1M8QS5DGAQ$BBc3GaCdGY^Y?3}g)0k&+Lww;x>ZQHhO+qP}nwr$&H zrEPZg>3jRR{~;pw*dx|l(=t^k0X|Uj*stg2mRU*I?M$_O<>L_>A}-iwwZ&j*N%4jW z%aP(c0BEDG0*hC9-LoC_YjZhrGol~&r{fkO$1Gt-V@H+fi3%EqmS86w=@&Pm+c6RX z8TH7Z1IWZV%Cym%cHK-a{)T8QU9A7usWdISz89hy-^JbN2S1yWvc?C$mQ<7fO6i*L)hMJ&-&`%v&jQxl)MU@|xPHqV%DzFnfW8j*azDm+xMJ;@BNC7a+q_Qx4 zT#MSEjgNW~6v+yXKwubfCpHs3&K)*BTq`j%+{x?do|a%n+{jekDE}+EhB?5Zwa76C zA;`-SEBz9*7ke!akzZW919#k7^%q&QZe}5PZ4sDpW#{FR#GffJP&}Dv{gTSFgq(!> z4J21`{_mLc5DNb|TRx~uOpVCxYw~g$1nzzC9}aFQmXmf=OUxo4D}qXxY!vrKcHl~V zGfN*faZQ2Op41~O!|r!4VXZu`pWGpgDcXz*Tzqd(kn0m54p}D|SW)WO9{=q4nChWB zqM9LWqUedE@}%;EKZ#2C1U{=~oJja*dszA@Stp{`1XM(myx$J06w*&c54RwrT)eP% zExt~)x=hMTxgsHhSjlba+0zICh$(r87& zdh+W=R8%)vb`S0sNdb9z@>p)(6Q~s5=76`nnHjgmRIU^MiOE0Br(-N@FByVd4K<;@ zVRV$0t>w2P>GW}U$}Rd73$I0v9|Ex4LdnwKFRG3C8Nv-4soYiNb`ioyj+Eb@r}}xX zSFl*57+Nd2^02D&=glPhesqq@+G%b92d*jfE*G?^#RL^}>49E8qtU4-=Y8GMel<7~ zvqQo+bGIwO4PP9E{mo21Q_(%XR_D{v`E?n&2Ly)d*3x5gWX=4k8}*i|5tL-NWb}Q@ zRVc2H&3nI@At}N#_nDX6FLpxZ4-UVz`BxOTXM-HH)i3tKOR?G=uez;eMjxtO{Ip2} z72E=g>y4XOU!omG*=87QRus44C(RO5lxpvp&jkrH1+jO4Gk9OWNVH!rCMUiej?Yg$ zRCE0pHHZl=N<(WeTHwB+39P=^JsLQuXXS*0t>Z@aapTQ8Jn_A4F7zr!BwDzwRFxNb zm4OA1ZV6Q$s6h(OBTjnk+ObW))WTOPI=P%#;^DmH!omNv+$e7Lc`s-LmJj}+MOs_* z{OI79Sou@sR+zOw9ih$&)3Cb_@#~rN@9CZ^vCC3R}srT|sW?P>T zEJx+vFUJ&Hm5h`s^Po9UGn`$5i8wEIQ!6MBL~$Mzknuu^UnOxh?jR=pGYV`H6dbko zA2^V~Q{$c{bW+V8AT{fLOp|Y4cx>WBcD1^ zGbwvIY=1=wAH9BIi2VWBiJEn)`XcR_G&kJ5?dGaD1zpoCo&}l)Bk$5EXv^q+U?WC& ziN;}uw7?oJs0J;j>3M>g6X9AYAYt(B#7fQf_mHqA7|{T-VosS~q($TD{;tBEOZgPz z9_ZN{q(yw$0n_N9?so)=I)ay7kU(B~>jMd>OWKwcb<3H4;~F7}AO{gV=t|dhPZ{$# ztA77U|7L8_W36<#75V8W?b>uDNo=qtFo$C*7Qovvvqxw>bVnmDbLM|c6+V(Rk4!BU z+g%T?iNVArY^y?R+ePc82O1sQ+1KN6v5UgPi$ss<{Z*0<43#}J^h@Sye6Q5*D$s2q zf6Pj+;5{O>lt~m&B{;giDJHaG;SVP&5jrOjX~Zs8dzzG{)&jA?RNe8CSR5~w4KGx zP#8Ds20c@2B6L>IkCrDlI+u0xh`fPuN=h#oCF0d#XLokNp&F-Me;{7^-Y8ExZ>lGYn(RG zssh}2KrP)UV|ev6>gn_#vkp-tvvlA(-2U2bQ;d9asB*9LgbgpUuhAdcXMo!A7U>oa zNXwVY&=qFE5<>A|2U%tM_4 z#x)^g(>04PgAE3u=KLCVNM7|N`?@vW=B$kI9zX_BKIf%&=rnD)@4t%5b0z5G6Ue<} z&CH~KQzyTDBjc*EJ)+XK5jD-3^$hR0ttITz<;(r4zj^m-+ii&x1lE*>PfCR80oZdv zWN=#?OoRU@r$}MCDN6^DM-LUUGD0p{eI{p{)7pGf)1HuJi{puNgogka} z0{y^4$bGxS0u(zsdJzxOgaRf=$6OY#-pYsLkdG!RB`$~8#MZkjCFX0&jZH4>^#L6K zig!GExMNwv)MYdA1DE--wlim}q!_(YoA+atD(Pd8^bRk>j-IFGi+%(UvMjPwWt z#KMeaN^k#Y(YOMaD|T3Xu6i;knWJ>}`xpG*Je|20N_4%X?(WzLkB&y+ga`B#V&pk% zWPnAxU{3@g#k*6|)kguqB~l?Z47b-a_(j}_mHh9%bzt#dEWQQwU@J3r#hO{}nEVb5 zBCmKjBrk%y!;^Gtue!kJ|!Hu_Xv09xHw9i*Ec+gR$@mwk*NN^PdeNdfdQZPAqd)b^#NeZ8i?XfAt}&;=;N z^~J~X|5O|`!K0fgpCzvuwQAZtzNoKh<|e$Z_%=yOp0sAT{<_CM9On3kzNrjKB{@nk z&ubG>bRFwKbZkYIaedbclwS@J2l*l!Wc$*^RV@Ux4`=_qJk)& z;z^u%phYAo5SD4X6T6ESM}AJr*xZP01(k|4{UdW3_&X=yb5%yETGCd2R#!VnK)XfI z4$K}(rj_iAgWC0e8fLI$lr>Yv-Nps@vm=gp95$!_}YpME^t=Eb5)avL+9 zh;F$ePyTMSkpq0H2||Fy_GxfpbD?9#-G&nK1Pf9$njn9(v9;{=-XNS#qd&)WnGY!2 zyv=pQ^1XqfxUOq+r7@Jdwkex@9I3=LZ`;3=lSGN+_WwLMcQN}GQ=|omT_~8kp0Ee$ zf>`0M(xHiM?jTwNs|3(z^KV1^1W|U4 zw2Vu>7Fa5!*!Am34(<4=rTw&*(hWsdLU1f=KlE|%sf-nmMQGJ=G?kgxaM80U)9h_E zI@v&uj|*V$0WK0F_Bfw(C;XXdhP?g)6fvKJbS)7Qtblu_Nq&}kRf4;w>qAaDo;6(=0E5i5!oE*ZlI7Hl1 zI)tikhE?zE4BFYdd?nt{tPN|u2;hY?;*;pG>&I2fgE&T;xZ9^!d7avA_fwe}wlAx%_x zW?Cs4hvn4)NhWD?-#n}2J<~mDaD7i{vKY(L!HvB|ac_alyxOyt&oB9FgP*WbKCKfq*FyXOfdS1g92Dv?%zY^Ll|>r~5O z-=Dti1>oN#y2rC5rC1zLC40$VvZenFK+aiWmzsJAS-Dj3)#3dy?<6L#Z(@S_7ZLi$ zCKxax8I|U3+9AC7!WCn$TwphvAGm z*juuVZ2fqpP+XBX{fOQIO>|W=y-+{E002MwpCXXr{MAIx3Oq%qT5pRgHI^Bi#+01G zFXuB29C%omwdW=%squGaXogrwB^CN@k#cjA&{KYMRJ zPoj}n^O@}H1eQz#QLpMSkDLqsCea*|ioHX6jR$NH|Q z0*`WOt6W}!nsWWt3GdUO zNya`4JgVJpj!OB70J>qdOB*`!q7# zEE()Wd77!1xgc1#!>}wcKT$}b3u`NOYBPPft_{Eo+h;%ma05?eTjyg?2f{ver0*X1V0dZbV$*EXo*mostH%qL|a#g@QMTkCj%XhGRVA@TlMV zON#g|tk}^ANDNk$=?KFXeWE<2d3mk$2e_P&GK^_=P4(J#D(1N$VzE26#oT`6HLy#y z&mR&t7bc0Cr+O#^yWLbEaeQQ?{XTF^@q|fG)f`VS_3ZKQC1luo`M~FOJep4PTDe8m zc(YWCV5P7aa+Ix>azfvjZPjl~ecx1W0uozD1L14aL_K|g2 zjr&3+C^g4T&Zg}}ly9M97{FmZNOoW`7}j6NMy9uoG(1slVzG`G8~7GIInrGs<}F!W z%u8O7d<>7WUQVqaU~_|fs(0OB3YC;{#TxL05g^4hruLk*#cSI^Y-w)!;+d3>LL)N{ zbUc-bR2f%LQxXrqk%G>pX{xt7qYmZtHELgveOJKej%ITQ;AIgrbF%wKDw4XxqM5hO zHuiyV!Z7MRsF!=o3kwO6&t-^MgxRK!?%h)rKtl(XzYqnxZR{kyg$*{E@D}YD4Qd~} zZoGy9W`{01JVuou33ZTfsH2Pg@S!>IL$wwO!l(ekdp^Zo0pSYXhP%OD9O}T!8o=4b zzroh=cH%v)t+SU*hN)y4RTt&%9E)MO?>D{Y9m=;mBq>&tOX&XPO5^9AXnMyHb_ufQ znOGYC!$%NOM&Q<;$5i)!A?Jn~f+KPfzt^Khe&-B+?^y-ruH=gZ<`HpLXBOB03jBy> z*FaHmg=8I;LM=dlZ#^ye6OlW~CdRm4dUf`{DTr+y0}(am()q;({(x5_mk+J=(Jgs_#& zu;N1e##d!QwbgF>37%K~`yt*Cg25JI3gmp!jSKd?S#jff$YCzjd9niu9I+ zZ$Pp=N{JSl_dUy+oXV;Ej4SWPX67j>??@$=2v1L}6}~3%IhxETy*Kl`(oX0|Rg<1N z$6rS;TeH(|zpeDH32qr^9?1i}olqqas_SIyF~NO0AdH}x0`Zv4w5Dy@v;-YbWL-xZ zRYeX`|+_R^)OQ(#==7QJseNM0i}IRA-SFhr4ZZ#*dO zj00BPS)cz8#U~qA1Sm7iJL`VEURLI}<%A<>eidLZ@bDII(kGf^!;`{(&(|7rGu$xB z<&jRS?lYxvocWFtu)&$)6?q+L&lO0(rl#s|*b82$xrfd#qvOgWeuvTZyO|=jfUSw% zdmUC4qErE-=Z)`0RlB3mCLIAf`e&$cWMna~vAg=zFP5hpzp%&z36}=*>|f~mz)Q!0 z#L;M^2aJios_0Z+2mFLkmBITYwf2eJSeG-p;H6 z`2MuI3^phfsV<}o>MMe5-%py1)KKuBb2+0y-`dk80<>l3rH>&(=?Fp_9=WS9} zLza*MFVf`h?fC{}SpR&AR*ogB$hS+eV^8mipCW-m^BMeZ?W* zaB)#jJ2T&=M`_5=s?cz06y!N_eg^ShtIcZmsO-9pHy;+Ub-ns`xuPyF1lLXqdGCm6 zXRNS-fc#<}YlMsnNCx^aB*&;>v-Vl|3nA`$J^}HJZ;aU4km;8O*?_6h8)MoMpRb$R z4P_MD>tujNiIzdOaw7j&delrUy$$Bq(gfg!CoD8M`u`AYIaHsVq1D%i+1Hi&#{Jrunckp$e7fV-ep58qu0TKG zw7j!RcqOqSkAlt#1=R&%@2CtGrx)oxP{v*Jx1j3VGZ&kI7+5zA=mPWP*V~2EHOq6@ zEu-wLiki@xSO4*|JeA8Rjez>3yh?9KVq!hv*Z|BEBD8b()GhyGf9?A)f^jZN6ens4dm&LmS1w zBN`1Bizx_qBiZQL1ARW9`3|W-*T+=*fIO7nk__IuBy)DEy#6GNt%tXzf2spU;!jsD zqEMnYe~N3&dY1gg9Iymo*K7QEAn$5|D+w4;PIyt5^vK~l8y>m3bh5z73R0cmH$@&PzI41G+}!!sLkO5v4~*y4U) zyMwnF9QBTBVJ{8^h-Hij_>)vC55$rObCp7btu4a4wS>GR{xVFS}m&T?+32}eR$(A7u5^SiBNtdLOFOYL5q4RSqzS)CO1|=vMcng2V~8N)A=k=VnnKG z?`Ez_rRfWXE0H!?uMf-`Iu|p%-1o+%{Wof*SwmT2*7lzrNk5j%AX8yv@sl|8Y>6=g zT)Ryyt*rWgSsk_ggALxX#PK=_O=_LBFUEY96X~OCDQLVs-J(wO>yO%uOk`onZ&LV% zD9t=MtWv&&;73{OQWU?ar**}CbZ9oataR_RNQ&nqb|>6p^rVN1*E$+Jk3i({(<0wA zZaue?SeRRe z!`WmH3CI`dxnG@gl=UW9?eXWF4#%($IcHyn*EvD?s~+*2OGkF=YB+v4Ky7q4!Wxw1 zMZ}t-%a5!BE4?_A>EP{80XO4PKrw%Flk?YS-_>^qw`*MlfOPfQ@;1e)gAkZ_EcHOT zO_wP=a4m5h3^K@_3Vyk79d{F0>e*N}USeWbDNIVd(hJKV^^nd2ZRI@$uE)(^eNvna zyCEH9D?@Z9qHsyOX2Y}ek57$`7v$_uA6W*>Xe^Sx`{eGa8$$}gwu2f-SQG@BS^6f= zTp#CJ+KTuP%tAa~vV(JXR_M4+7nmOG7!I7g;c5LMD3U~B!Hv|){xNpJQI>J{LC0e% z4>0ir5J4Dnv7QiKn@zSy!BxXn^YoFfg1?qh1~Nmq9UoPc2Hl}LKkOhInwbwE>7Vqr z$K#jR5MkPf!oxIOB8hvaZrkl=S7&Bzf6uxU8ON9H>WSx!jX>-kKH;w7J`be>Y*;Of0RDHt6Ucp^8%H8sv5YrsiIxS1l;qKdI9i7kQN;) zn(^@0jS3^P8w)gK9cKvLJRglkoOXtFeI0j-JTz3!ym_3Bh16E={?0cOrXeO3Izw35 ztQ~hULSEg_g!ih+VJD^;q66enjAjH-svg{;KrXff*KX)Izh?PYxFWuFYi=d1$_x$M z{3687kB}K|`VrL5ieSujIYAE<_8e5v7>?J#cPr^8N>Y=xc}c6$#M0)XK>8&zp923u%*BffF-|3h(~jG6 z*5@c4WbMODjLs4TS0f(YC;-NNCdy9WLVTd+n`(XK&^smx z)eqCL3W`uj9BlBj%{p;v2~hm7|9`bd5XzkJU+d19N0RCg2$ztI+@)>3{rZYHhuZ?% zFD4r`eZJ4_N@b^oa(0RuwpM9!U)25j^`l)D>Js9{jR(b1)MSt~Ult8!ui}8bxOr@- zQ~enJnwf#tq~KS@oC`yzM9aCkd7tfV!sVv4f>m$Q0&KDmw)7^}oDy6Qx4w!Gof?RZ zW?-E3o{Gsqs75{4)CZed746@d-%~w#Zrtq}1`DUfenkdu zNFkI=vA)EOw?yZgF#DmgHLM%IOcxa;`p8LA^yiw4UD%BCoLwVJ5@N8hHy~OhamKq~L2VT4lfSrX;GJb_HsXWN=2fmAOoa zcI{$Z*;MHMgIDfeMms?f@}u0XGI+qjGpQlrbQ1C!>&gV)(P`3B;H040n3j|aIANeN ze4bN35I2hoy0<957w**l48c_yGU3^U&IwzbmQ&ku z!58@lKh(w`Q2=rwu0;$4jM2mgc~2{I+~fPa9F(-DuwdpJjjC$_o0C}t#ku42Hj(dY zPPmd143>QQO(@FV=!W3#gX6fhz4Y+2A-G@)w?y*-BSRcA{3rk$=^5I_6jtrO2qk0= zAIJ=gMB#zMVDNnnSING6#na1roTjFIE@k_`4>B8cO90bfC1reRZBzWF-2JRAT;Evf z>n~eXgyRg#UWMC*l4?#Aa*S+#<*xRoJE(9@m$@jiv-#v^n}WUC7t&q>@OpVy-VG zXn=@lSg`w>^w*eE9GQp_*QU?1sIEB%X<(>Wz?1H$*ypmov%D8uM{FK?6P|cZjq`q? zK*<;i3Do1d5Uwyn3llUAU%N5hvsu(0_!@&){uxY~!u4nk(GSoC)er@jTjM3CH)H&L zfEG7fvyR^okbl`5wu%1K-RaQwm3BiF2@{yU>^llq`~|Vs*MvrOpdTf!;qPueF~1q3 z#JnWsD|s!8M8IC|=RSooxlY7w-h0Ic76xr3n$e^K-{2#d|1%-(3S*ycAN|qh4d}Nd zN;a;>M}A_|#WXZ8&uf5^26(I$CIXofnoQo6H_%L(J+T~-+!uN;h{47BBi&4zyrBP0 zA*jFi8`hIY)0v@A(s>_DwZq16fpY%1?e7acUuvzR|H(jz)O>lv=-$RZn|9)zpFg%U z5sJ(^!+^yf2GZCt(aG*8zR(2R$Bm^reY8~|DwnKthB9sAsu4-pK|{80$PCoJU9ZA& z)VMY!BLt5b@%11V-$J!Cv+^Th8c6*)20}w*Ct|e(VJv4sGG6dm;q*X-TJx zm~XfqDdhsrphycT7PJrgz;<_}Q93LzD*ZV%)0_G>k2H(jA_0B=I`EX*5bEm)h*~f1 z1IW2{vQQ9u&jlWG`hnM&sc^Wc%0t@ZVvJIPd=bTe)lN$)yrVf*I;G>KWRTfM4rK8Q!3o`Z>JEh|_3;Jfuh{}r_{E;@1Bdb;SV=s4e zw5>kWNB5-a#Gl2SH-8`vQ;Q>yl+`8~1UV5Z>%e%-4^9_@6_2Rffsq5tbNE;VTiM2( z=HSHtqI`(w7XkPZJvWQ#CxavI4S#CFwTQkTXTjf|Dg6Fox_t*R4zCx-%w~^;;M&{= z05X1~QwMoVi`~qwvu{W%^`9PvHu~~MMyMJ9JfmFi zgD`M^;b1Y?e-Fx^on0qu*rR`D+E~q(;SHFdnprfEx$IAu0i$OT`Y>=i$=9^UTmRj1 zgs>LG@aTFtcfIPc>t=?De00Fsk;l8*luVQ_{;_XZP~756f}h1O#Vwc{O1t6d)7$$^ z+eVSxdnnWoy%MDui?Xm=>}D$VOoaZas#yXbanT{@WWCxtJqQj6NGn>YLD|QkoQB#+ zgVoQcN8G7{d+$;uw;#NN?qALV#eJsFe)S&FQEpALQRKW}EwiT&r5*e1N+o!6UxD*>hY17U=f z3XlO8#rmc$WN>kzA(lmMP}!2La!$>#n!fl;NPgw!-;;r#2PdwYVG<&p;h$)p%L|04 z=x-`z0GvHOIRS)RQt|+4E2u={=I@2{VzvhjelCS@DQA-o2!b>+J|@)vGDnB-V{jEL z*zQb)iZ<1jlOgR}>LcHVV)RSt`P6DN5Vs-=4b-R4SgD;i{p#h@hF7^WK$$IKVASNE z9bTnAchzi3@3Q^Df7)@WSYwq8Z%AxesMp5F=d%0_!LHjLHp1sjt0@+qTjwU&!9Ooo zAv(|d0a~@h010m8cDn|StsR1SDA97wz8M0kc=Y6)_w%e65WZ>ZO;5M8*>W!?6^qcK z{`EUMxe}OE6448ptCC^_LQKRI(KL0wPGM$vP_C5%Ai_r>}8Fg2BO>& zu-!mFo6cOTI>?+W`_d8r(LpI6P4VPh!ghtC&ou7Oya#BK>)_ov^Vc?Ek@WdEJ zING-J0zQbD;YJMAH;GU8rWz1L*}}ew4aeYn)GMJOCiZD-sZu`x%s;h{R1A1e_qJ^F zj;zs15H*&a%K-(Qi8-pWZ@4d&yF>JXr1nnADxXPF{YsOOCfw6gf2rPy6<_nntCmdH zRR?`E+Kqiue61){RcvZia5!Kchm0 zRA&dCj$f#g?VkWgh~4_AT2s`1U9r!Y8fFY|Cj}Fuy%^L7W*4-?W%nx`>xQ)-y1mu+ ziRY=26=vQ?%kZz=_(hAWu}JZWl1Q)A8Zc!ZBF&cou$V0~Y3b0OK2!!LAu>1piPt8U zCGM^A^9>$llaLb@Ddbt z8)Aa4+4#bQ?z&bHRG@&ER%j`_^jJ&|Bm+9ZQx&<7dFuc1Ip&)nQLa~sG%rn6;a=4Q z!yJh!YFNrn@oG^op)b+`q_^rcBvrm(K#U+#i#ln=#<@33?}P7I+YF%!tZuP5k5un$ zZWbdyC&fBETB}mf8^bmx&nnC`uNC=)U>Ov~iH2}(4I2#$38z~JwW`@_F>2JX55pZs zrK_g=ocK%dwKj9Ftl}QyKpn?^=CMdm8jSs9bdpR(2}ozjyPh*ebr!2(cL@{j|}zNgZ#M` z8H9e(4GoAyN+)%CuDg?tjHsXq+qld@BITQd# z39UcaQYKcAV2*cojOZbYtH|+eo$Y~j# zLsqp0zRaLB&sP zxU-Mm+?jUt9v?q1yR5ZIU4W?)gfE(+e@_|~mD~pkl~$7GM61(?@SOfyAJbF-`GgJ3 zi(lQyOtE}j*C@OUO*-Ib>g@kFPb|oY9UGxc5ed!$4Q^fd&W$)ivz=x2;+UBDGQdc% z^%l}@D7+tFrDaUIbSRja9?5SA=LD;SV|@+Eq2k*QIWZQjEYA{IrWuJ{jL-`$xM8ex z#J9z1l9qpp!Y__fC!1Wp_>{IpXLnaUU*FltYv@BuuUclMrJRY%YWEf#5O;pszmUox zRa=sq5fAfT#?XbC%ZPLVxs^c>Q94X(udZQ8N{j-JE+_f-dj4s!Ftz%8D97eMLbsgCc+~`*@=;#H+kF4D=zCfG)%^C6 z8-Bm-et!a*`zMU3w0qh5)w0l2VHx_=^|OKe*~EM4{@DciZl?WKw%k)8`KXXvQQcE9 z`?TPH@$KJ(97yO6l5^C9u^1j)kKk?mbK_!4|4>Wm8|JZXA>Kt{aJP7T@^edPyIuU2 zbNImzrn%ioZDg=>nFR5-@N_$soS^MhUnZGbD5gD3aX6eJGm?t6VG48s-1Q8Rr}Rpr zGj3l41KuK~XbdX5Zl%43!gau}e3!dz?sAEz$@ibcn|J4yU zP+Tl)AyLolzpITFUw>OhptR^dfo;=VBA&?LoW&jV%1J!O_+ z44vE*{$GX-(#Rn;ty^!k+iV`G-c&GqitEa5#}*SKT69E$DPqe z$e@1;#GR!Elj}2AQEN_H9?%)D-Y1H!#qX(}TC$|O7IAK+df6U!LH(_r$;~M+^*znf zwtPuVbAMkSrA|wzu@@qrc>ore9haKHR~37qtvs(unfyS!5n@JPCkWKs?veO=&!M+u zNm~{dNKaR)Rq_wSNKHgfw$1w;&PPnOOIoELEpl}P7o#TaoFZvWnvMCh|MX|z0`kpgFMVg9C|la8D%%4H+~;}&LCTDSagh+_7%Ft!@Gw7pg_WL5!FmxLD9=6Q>bG8kCi+|hiqR73K zyuC^5JRAgb7Ju1gEhJ~ta!T>fI|UfzAe3BM<8e*^&tpz6E~GWCzcni%-y|2SSv@NK zE5BLdu{3yn_Jfl2_sTiynp)(LV+`6NG_m!M$z$l_zGkdr#WOkKp-Or!MKOWs@gW^!))Df#04tvxvQD%JCtM1=_ zp~=ler27<<3*nY3tI)k9ta8O@Ky>PG3iCID1EUPW%k`e1+G8fI;{$R!8XCh*u;Wh= zB5n$IIY}1tGV38o`o*ijJNUbzUV?#|c}+dkqWQnE`NDbawGa>PC<^9>bqJjA9IzMu z5cIY+Bg|1>{W5DfY;2lKMTNJ&ldggy1IqHmc;V2A3t)XZ6)S)(TC{2#BoWIQ%tFR7 z3TIj)*g&+f6qGrFP-yt{$6;ibB!LO!rH~KudKmdy7OTCnZTr`XqYT^s!LZbTT(KEL zv%_Oo@ug1!NUr}C0;PvX;|BTmc$VyNN=5zJ6fkNFDbxMgH$%X82j$ zlZa_aflOKM-Ug@c_Vik+n6WN=el+~b)w6SbIpW15Pw6y`sikmOChUoszv;yjJL0%LWL>j%MUXSx6h(uU3s{$}#hk>9% zNL+sVf*~VP>4yR^^)0c_9<@u;DLBK69xx>N-Zi^iaVSX1)pC?vd^tzXj==*YYB>DY zBa{e?eA)Nzf_Rli(fO*g&&7&gfE0y_j^WeJu)B;Sp!Q@h<+sk|Uafuv9O@MQ0M3`r z&d1EnSsmt6ockXlpY@RkOQ2=i>Pz#hTlFE++rf8u(kTik4v~y^rqr4fC^%jd^~@QG zuQ9&$8#hJ`kTSB@KiyTN@Wr&gruWv9v}Xoj*I7pM!8WQtaC5-U z!RTdcS6oC$kK2>ScA<((1>8KIm4~+dX%94sI@6-Ju=-;k(B3yMoF6Kg5;y?u-zW7s z$!BOVAWjsYuQoReNKlL_<4&aj#j#@3o9*u*o!wDp;QDYv`eS=VHMt6&qz0+e_C}IM z6cRag#Ig{E-t2t1()4P6Fl)z?V*=A`zBmi1n;Pxddw%r3Ap!?H31w}ymA)=W3OXsx zci#>n_d;Q6vYUJfrU}+u&|7!}M;`T3`LP;kdi8o!O)YgO!%z+!6IJ&i0A-MwXshm$ z&1TMzqJj#Qf?4t62oT9hNPL``TVM`^xg@yiEuq5XM}@-D)Kjz#h8HEYR)&y7BJLyh zd4hCtpIPb-7lI=kxbV5t<*NO1(W|EpgmX6L|J6S;E-8ErB+{p$X1KB-O~E0ThKwBj zGk&Jzv)nC4i~HdAzR$SOy?L$M%L&QDRW)evg@jQ@3sHw|jSt0BJ9obqnMUb&44r#E zQTti($_6vy=aO;B+x<+4o~op@f@DIW$_R`gVl_JjNX>@U!b#?Q0nlE%Ota&NDIm5f z(HZKY^$pbTAac(X&Xr;u0K81}P>ve+)ixX5Kxl&0%k+my`|$a1);_W9a74o*$T$JV z05;06Q<6hzDzay%>=n!GroR%sEmjz|9SYgE;sr+IS&FSc=`$ioLhI~snF5aNb z7J0CYPPitoWGjIopvpH0j{)SyW3o4ePBUrdqfxyXg>FD(W`wPnFP3KkZmD8d9@kt^ zx?)UdDL;NNFNoBo;Kul&G@fOz*|!34eVH z;}PD%3}aOx#0Q~>-q1WsLmq=Ui0ETGE}pWWWy}`fOq^&*q~Q}H)-)R_joiofu?A+0 zpB0VcZYMy}d5+gILA$XnMy-l$0R5PL5)hqq@h;#Ak9sWjsiF$fu{{$`)MK=`7Wq0R zSr&Z{xIhVl89_x2~<=ukOd}!^ucF^NS3>TJ*=BRoE0T~C@qZo zuz-w~n+JC6_vqKx+1PvhzGkbPOT!It8>=?*_iMd66*4jrbaDf!I+hl8GBNoY($E$oZc7hJc^=4;c>Hw~}F4_YIyx-YMS2&!D{MrUrPA3?QW`ttX_A&!U!b+^w-CA;nU| z{?uaCe$M2M$)!PKor<;=>lz~YMgljL2}jC5C<8+hG0TqDj!aA{bIAlScU z-T1qt1J;pxzkCCRXR^(W%PlG{_WM*7&4t}1Qy491OD&al3hu2agx3(%rr;4f+edlbO0zF(!uTM&gFubHgw zAwZATa&%-5WHSdsSPMQAzhP7p(;lNqA z=9Cg{qZuzeSR#ke$jX~T^iWBDMlff0M}aV(ezaQuB*Zm`9e#)N0h;V$e5Ib9O1D+2 z3x}yttf%chEIzTmU2_LOfuXQpKZx}odqgKhmvo2-j7ROZ3Z_$+uoxGhDJaaLXddN0 zxYA|yK_juS+XHkk}j>Hrf{IY5K7AadTt-QeMMkQH|0*QkLv{t0HPZG9Bm+j^xDz;K;7gXk%|LE+!aWl&ab@L)N^f<(8s zQd7rz(Tbv~IUVFpDsJRHH+1Cp5=*O~&6}-UM;iGa%Yf+SvcWb`Cd%Qxbfgq`stwPp z_?OP3y#C+MR$MB7(Ce3>fIKo#Z%Tdb`aTz?!Yxq)AGqCzPkYn_ClZ*&&tLCvLGo-1 z(G}V*xJNVmM_MWR- z*Zvyp)u~!rSMYFbsg0F&gCWgG8YzL(E^7rn1(<)CNs8ZeZbDRoR3sz2-tM|(=w2y> z+NeMrKjaU~`1N8XIBNH&2KP9*kQogb^G08!Mk~i!zLmF_3mrI!Qk&v{C1=^iw$?^M zB2Y_=60C-UBhq4GX#N2v8q6ZmNn_1bCVO;_v8h3#$xQBDD^XzE0~dixyi@c+ctq1@suz=Ovy-CP5U&z93I-@XcV?2Yqu@pxN+#aiZz|an?1k^x`GHdA-!r z`6JA=)1E^b5jUdpHS`N&n7^sh_@dw4?8V7%2uaV?U&7E*AyiBOtj83I??nBFZD7cERl6Ur|dzo{<@ z;N)Wd!op8@dt4BU0vstIHQky_J+Imiw%dh0rlko|z|A zgwB1AUctr2hxTPB$LGFW5p>#>SFWN!CCw7pidIb{BibHc@Hi9v#2%`)e-I0bu($4U zw2v$*e|mRkYKDv$;s)VPdkC9EIq`ew3)PPOaP_@~G#BXSw8oe;94M+>#4qG@o+zkB z^Du^;MFk$9pAO_;5o7!?@0t2!4!4%pX*7@@EI+bpM8&oewATY+(Yrub=R|D)^`bFQ zE8 zP)-+q3+tXK`-_8QrJ04F&fTHDn^^m=J&s;_^Gtu&)Zl70u8$mxx(-j2M)oHIK*(ezQX^@{A-=%H<|q6fA2dI=04&ebT}VQ zb*UM~Yt{oAOS{}QXhRn0qphy~D^3Ej{ZKSvPh{u#>=XuX=nU^zh5#=lRK0gk{}U@V zLT^T)`YcWFrsp)-MTzX=hfR?Xk|a!yxRPa!N;QOl1vuNtcXoj;mo({gSKNUX0P#2K zNO7DU?@#NHitZ9Dx`z)_iO9-$m(7#zuQnBhe9-vhuE0umh6g}xr-8;sf0~axnE;D{(`^!QG!T)xT&^bFF%2zW3tM zaevB9;XQ=sI$l%Sl}Gd^JpjBwA+!5Fg@2uz&`aD)Ft}^j2Zl13md6dlXjf#^*)r9!3wR2vq*@doOm+}=v68pkK#H<6T zRj_7EnQ3Ewp`gn^pp{HyjaN=60oOWP+pYHXVM@ z6KOP3V67wtSdwCRp|JE|tbUc{XQ2%YF>Sw;8HQK=qLbG4bD<6CPGWkTaV&c?SudsZ z_F&qf24IRvB8zK52Bg9kifdw}1R3!vyCy+%1mD(}c^Isn=HR%%ohPDHWmC+YKs{@n z!h*kusvv4bEUPM+p^8W9fBc6Qem9V*L#%{uNO+Gtub5BC zIx1g4a}@$W_kUaftpuZHvb3-R4k(>3e)-9)g}Ggjtm63Nh>^#)o?j?Oxjd3x70E( literal 0 HcmV?d00001 diff --git a/jni/love/platform/macosx/icons/LoveDocument.icns b/jni/love/platform/macosx/icons/LoveDocument.icns new file mode 100644 index 0000000000000000000000000000000000000000..1dede26b898ad09359a7db1ea0a1ba5aa52c7eea GIT binary patch literal 133318 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

CiXZqQ+esXnjCC5~S(5HN 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 + + + + CFBundleDevelopmentRegion + English + CFBundleDocumentTypes + + + CFBundleTypeIconFile + LoveDocument.icns + CFBundleTypeName + LÖVE Project + CFBundleTypeRole + Viewer + LSHandlerRank + Owner + LSItemContentTypes + + org.love2d.love-game + + + + CFBundleTypeName + Folder + CFBundleTypeOSTypes + + fold + + CFBundleTypeRole + Viewer + LSHandlerRank + None + + + CFBundleExecutable + love + CFBundleIconFile + Love.icns + CFBundleIdentifier + org.love2d.love + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + LÖVE + CFBundlePackageType + APPL + CFBundleShortVersionString + 0.9.0 + CFBundleSignature + LoVe + LSApplicationCategoryType + public.app-category.games + NSHumanReadableCopyright + © 2006-2013 LÖVE Development Team + NSPrincipalClass + NSApplication + UTExportedTypeDeclarations + + + UTTypeConformsTo + + com.pkware.zip-archive + + UTTypeDescription + LÖVE Project + UTTypeIconFile + LoveDocument.icns + UTTypeIdentifier + org.love2d.love-game + UTTypeReferenceURL + http://love2d.org/wiki/Game_Distribution + UTTypeTagSpecification + + com.apple.ostype + LOVE + public.filename-extension + + love + + public.mime-type + application/x-love-game + + + + + diff --git a/jni/love/platform/macosx/love-framework.xcodeproj/project.pbxproj b/jni/love/platform/macosx/love-framework.xcodeproj/project.pbxproj new file mode 100644 index 00000000..d23ef1b3 --- /dev/null +++ b/jni/love/platform/macosx/love-framework.xcodeproj/project.pbxproj @@ -0,0 +1,2493 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + FA03546C1731F3A700284828 /* simplexnoise1234.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA03546A1731F3A700284828 /* simplexnoise1234.cpp */; }; + FA03546D1731F3A700284828 /* simplexnoise1234.h in Headers */ = {isa = PBXBuildFile; fileRef = FA03546B1731F3A700284828 /* simplexnoise1234.h */; }; + FA08F5B016C752F900F007B5 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2FB732687B1669402408356D /* Source.cpp */; }; + FA08F5B116C752F900F007B5 /* wrap_Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02CA1BE908D91B104EB9590F /* wrap_Audio.cpp */; }; + FA08F5B216C752F900F007B5 /* wrap_Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02662CBC29B954295A634A39 /* wrap_Source.cpp */; }; + FA08F5B316C752FC00F007B5 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1839744763625B5D64EC70AC /* Audio.cpp */; }; + FA08F5B416C7530100F007B5 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CC5707C79175FA6427B3D62 /* Audio.cpp */; }; + FA08F5B516C7530100F007B5 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A304E384AF2119905C01504 /* Source.cpp */; }; + FA08F5B616C7530A00F007B5 /* Audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6CB1193233FA78EE646A17A1 /* Audio.cpp */; }; + FA08F5B716C7530A00F007B5 /* Pool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 601E6A56345412E87E1D396B /* Pool.cpp */; }; + FA08F5B816C7530A00F007B5 /* Source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 28024635525B077E08A73D9B /* Source.cpp */; }; + FA08F5B916C7532A00F007B5 /* b64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5D383DA1468545C30E7B5805 /* b64.cpp */; }; + FA08F5BA16C7532A00F007B5 /* delay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36437CE95936736320710513 /* delay.cpp */; }; + FA08F5BB16C7532A00F007B5 /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3746164716797CF80D6B0CEE /* Exception.cpp */; }; + FA08F5BD16C7532A00F007B5 /* Matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0CB6025618505B055A4E75DD /* Matrix.cpp */; }; + FA08F5BE16C7532A00F007B5 /* Memoizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40A0593B616A223A4CEF07C9 /* Memoizer.cpp */; }; + FA08F5BF16C7532A00F007B5 /* Module.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 30E466F441EE727658716873 /* Module.cpp */; }; + FA08F5C016C7532A00F007B5 /* Object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 411B061C49172C971C622125 /* Object.cpp */; }; + FA08F5C116C7532A00F007B5 /* Reference.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 35B31EBC4DDB6F994BCA46B6 /* Reference.cpp */; }; + FA08F5C216C7532A00F007B5 /* runtime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 45E761A0072E0EF92BD66EA9 /* runtime.cpp */; }; + FA08F5C316C7532A00F007B5 /* utf8.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7D9B03C2438B748D0DE93DD5 /* utf8.cpp */; }; + FA08F5C416C7532A00F007B5 /* Variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C56375F752B7A9779DD37EC /* Variant.cpp */; }; + FA08F5C516C7532A00F007B5 /* Vector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A2A61843B753E3F5B330703 /* Vector.cpp */; }; + FA08F5C616C7532A00F007B5 /* wrap_Data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5ED732200E1B2E5F79831DDA /* wrap_Data.cpp */; }; + FA08F5C716C7533C00F007B5 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B5F4DF8110020A96B5D3EAB /* b2BroadPhase.cpp */; }; + FA08F5C816C7533C00F007B5 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7E7A068041FD553876712F05 /* b2CollideCircle.cpp */; }; + FA08F5C916C7533C00F007B5 /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1B036C7C5A8832AE53BB1C06 /* b2CollideEdge.cpp */; }; + FA08F5CA16C7533C00F007B5 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 427B4B2517C0516844370E3D /* b2CollidePolygon.cpp */; }; + FA08F5CB16C7533C00F007B5 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32CC11481CD9164455455D72 /* b2Collision.cpp */; }; + FA08F5CC16C7533C00F007B5 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 175A1B8D733B2D4803F64AC1 /* b2Distance.cpp */; }; + FA08F5CD16C7533C00F007B5 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 59D27EA33E8E62E15C185948 /* b2DynamicTree.cpp */; }; + FA08F5CE16C7533C00F007B5 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F0D375C38A245E403E53DB5 /* b2TimeOfImpact.cpp */; }; + FA08F5CF16C7534400F007B5 /* b2ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E6705C154C34FBD143F465E /* b2ChainShape.cpp */; }; + FA08F5D016C7534400F007B5 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08AA5965073A1C520A7A6833 /* b2CircleShape.cpp */; }; + FA08F5D116C7534400F007B5 /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 633E37194CB535AE41A00092 /* b2EdgeShape.cpp */; }; + FA08F5D216C7534400F007B5 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08983C025D0655270DF81A5B /* b2PolygonShape.cpp */; }; + FA08F5D316C7535000F007B5 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55A759CE711E157339930E58 /* b2BlockAllocator.cpp */; }; + FA08F5D416C7535000F007B5 /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 12390CBC115B00D06EF951DD /* b2Draw.cpp */; }; + FA08F5D516C7535000F007B5 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2C78323D7D5C628A53EC6931 /* b2Math.cpp */; }; + FA08F5D616C7535000F007B5 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6FF15DF4423F6426224024C9 /* b2Settings.cpp */; }; + FA08F5D716C7535000F007B5 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 780D5B6358096BEB1F1336EE /* b2StackAllocator.cpp */; }; + FA08F5D816C7535000F007B5 /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 239054AE7475433E39747DA9 /* b2Timer.cpp */; }; + FA08F5D916C7536C00F007B5 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 120B391518206E964493126C /* b2Body.cpp */; }; + FA08F5DA16C7536C00F007B5 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A6150F7479D21346EC54B68 /* b2ContactManager.cpp */; }; + FA08F5DB16C7536C00F007B5 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 059C04C13F3A7C05570F2987 /* b2Fixture.cpp */; }; + FA08F5DC16C7536C00F007B5 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 59BE634A2ACE722F14B86F89 /* b2Island.cpp */; }; + FA08F5DD16C7536C00F007B5 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0D6F00D95C4407BB26E71E02 /* b2World.cpp */; }; + FA08F5DE16C7536C00F007B5 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8D03F1544476B57CA97B01 /* b2WorldCallbacks.cpp */; }; + FA08F5DF16C7537B00F007B5 /* b2ChainAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 468F7A0A484820DE79CE76D2 /* b2ChainAndCircleContact.cpp */; }; + FA08F5E016C7537B00F007B5 /* b2ChainAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 60C95C7F507A381D0A483B3F /* b2ChainAndPolygonContact.cpp */; }; + FA08F5E116C7537B00F007B5 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 58792BC1126C2917432D706B /* b2CircleContact.cpp */; }; + FA08F5E216C7537B00F007B5 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 71F878E2440A021B68D93ABC /* b2Contact.cpp */; }; + FA08F5E316C7537B00F007B5 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1E9E4F657DEC2772493B79CC /* b2ContactSolver.cpp */; }; + FA08F5E416C7537B00F007B5 /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1108594E361A22D90D6022E8 /* b2EdgeAndCircleContact.cpp */; }; + FA08F5E516C7537B00F007B5 /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 243E18977E2A37CC6FDD55A5 /* b2EdgeAndPolygonContact.cpp */; }; + FA08F5E616C7537B00F007B5 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31871B8B7E1A697A73576040 /* b2PolygonAndCircleContact.cpp */; }; + FA08F5E716C7537B00F007B5 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F4E747212DE41716BC245C9 /* b2PolygonContact.cpp */; }; + FA08F5E816C7538F00F007B5 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 33627AE97E66147E76804EF9 /* b2DistanceJoint.cpp */; }; + FA08F5E916C7538F00F007B5 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 13093ADC78426C5009DF3B13 /* b2FrictionJoint.cpp */; }; + FA08F5EA16C7538F00F007B5 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69A01D71103275D451F965B2 /* b2GearJoint.cpp */; }; + FA08F5EB16C7538F00F007B5 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6F1B61350B6B36AF216C57D7 /* b2Joint.cpp */; }; + FA08F5EC16C7538F00F007B5 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A47384208BE218F688C4EFA /* b2MouseJoint.cpp */; }; + FA08F5ED16C7538F00F007B5 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1E27263847302FCA1F843B47 /* b2PrismaticJoint.cpp */; }; + FA08F5EE16C7538F00F007B5 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 66EC3C0463A703A97445193B /* b2PulleyJoint.cpp */; }; + FA08F5EF16C7538F00F007B5 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 11D62E873092729B497B447F /* b2RevoluteJoint.cpp */; }; + FA08F5F016C7538F00F007B5 /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38AF72D4790619BB022E2AEF /* b2RopeJoint.cpp */; }; + FA08F5F116C7538F00F007B5 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5BCC49F529F726385CD41FA6 /* b2WeldJoint.cpp */; }; + FA08F5F216C7538F00F007B5 /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0602250B7E4664E43CA113DC /* b2WheelJoint.cpp */; }; + FA08F5F316C7539B00F007B5 /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4832527C02C105776536438A /* b2Rope.cpp */; }; + FA08F5F416C753A400F007B5 /* luasocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DC90F3C6160198256795C75 /* luasocket.cpp */; }; + FA08F5F516C753B800F007B5 /* auxiliar.c in Sources */ = {isa = PBXBuildFile; fileRef = 1CD02D1975803957282F28AB /* auxiliar.c */; }; + FA08F5F616C753B800F007B5 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 21B25A7E333315172B754D4F /* buffer.c */; }; + FA08F5F716C753B800F007B5 /* except.c in Sources */ = {isa = PBXBuildFile; fileRef = 49496EAF3305281B19223C22 /* except.c */; }; + FA08F5F816C753B800F007B5 /* inet.c in Sources */ = {isa = PBXBuildFile; fileRef = 610B475400DE0F7213352BC3 /* inet.c */; }; + FA08F5F916C753B800F007B5 /* io.c in Sources */ = {isa = PBXBuildFile; fileRef = 135801A6483528800C676492 /* io.c */; }; + FA08F5FA16C753B800F007B5 /* luasocket.c in Sources */ = {isa = PBXBuildFile; fileRef = 5FAE2A9679C97F2C2792182D /* luasocket.c */; }; + FA08F5FB16C753B800F007B5 /* mime.c in Sources */ = {isa = PBXBuildFile; fileRef = 00393E4930202C2B6E381F68 /* mime.c */; }; + FA08F5FC16C753B800F007B5 /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 5F846B49240D52C10F6F76E5 /* options.c */; }; + FA08F5FD16C753B800F007B5 /* select.c in Sources */ = {isa = PBXBuildFile; fileRef = 415E1438178736BE0EA908D5 /* select.c */; }; + FA08F5FE16C753B800F007B5 /* tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = 22256CC12B7C7D0D1B430D46 /* tcp.c */; }; + FA08F5FF16C753B800F007B5 /* timeout.c in Sources */ = {isa = PBXBuildFile; fileRef = 4B41232F7AF7793540F46C58 /* timeout.c */; }; + FA08F60016C753B800F007B5 /* udp.c in Sources */ = {isa = PBXBuildFile; fileRef = 2E2675AF3DAA24CE0728042C /* udp.c */; }; + FA08F60116C753B800F007B5 /* unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 734947AA28AF36E436D242FD /* unix.c */; }; + FA08F60216C753B800F007B5 /* usocket.c in Sources */ = {isa = PBXBuildFile; fileRef = 041672ED2CF51FC62F532FDB /* usocket.c */; }; + FA08F60316C753CE00F007B5 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 24265680279E30A40DF81946 /* Event.cpp */; }; + FA08F60416C753CE00F007B5 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BA712260D725FEB72EB3CDE /* Event.cpp */; }; + FA08F60516C753CE00F007B5 /* wrap_Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 691C5C5828550E2F60754EF2 /* wrap_Event.cpp */; }; + FA08F60616C753DB00F007B5 /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 11D141087979064B441B787D /* File.cpp */; }; + FA08F60716C753DB00F007B5 /* FileData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62370A494F9D6E2D570065EB /* FileData.cpp */; }; + FA08F60816C753DB00F007B5 /* File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E0F565B03D05C3722496F27 /* File.cpp */; }; + FA08F60916C753DB00F007B5 /* Filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DE3129F3A0B2D9C178118F3 /* Filesystem.cpp */; }; + FA08F60A16C753DB00F007B5 /* wrap_File.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6C367AE309C453C412D91363 /* wrap_File.cpp */; }; + FA08F60B16C753DB00F007B5 /* wrap_FileData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 597478A255B82B56488B4717 /* wrap_FileData.cpp */; }; + FA08F60C16C753DB00F007B5 /* wrap_Filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1E827AE8548C52493ED95629 /* wrap_Filesystem.cpp */; }; + FA08F60D16C753E700F007B5 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 714251EE742346DC17103357 /* Font.cpp */; }; + FA08F60E16C753E700F007B5 /* TrueTypeRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C30420F7FD3038C721223A5 /* TrueTypeRasterizer.cpp */; }; + FA08F60F16C753E700F007B5 /* wrap_Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 232D67C67BEE54B776420682 /* wrap_Font.cpp */; }; + FA08F61016C753E700F007B5 /* GlyphData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 74003CB27FA762A021183AD5 /* GlyphData.cpp */; }; + FA08F61116C753E700F007B5 /* ImageRasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5D016F4C27EF506C13FE3058 /* ImageRasterizer.cpp */; }; + FA08F61216C753E700F007B5 /* Rasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1B1C4E4D288A1D2F29E57B1B /* Rasterizer.cpp */; }; + FA08F61316C753E700F007B5 /* wrap_GlyphData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1B4E22F1388E2B2E76E3377B /* wrap_GlyphData.cpp */; }; + FA08F61416C753E700F007B5 /* wrap_Rasterizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 11745DE315E859F71E881D76 /* wrap_Rasterizer.cpp */; }; + FA08F61516C753F600F007B5 /* Drawable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 58BA2BB460AF3C591B22690E /* Drawable.cpp */; }; + FA08F61716C753F600F007B5 /* Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 03F17FF546D637744E263961 /* Graphics.cpp */; }; + FA08F61816C753F600F007B5 /* Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 58CC50E70A375FDF53EF01B6 /* Image.cpp */; }; + FA08F61A16C753F600F007B5 /* Volatile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B731754147B27AF73AC5358 /* Volatile.cpp */; }; + FA08F61B16C7541400F007B5 /* Canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4AD52074367950B735707CE1 /* Canvas.cpp */; }; + FA08F61C16C7541400F007B5 /* Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 583037E9238A6EF00DD20B1A /* Font.cpp */; }; + FA08F61E16C7541400F007B5 /* Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 11773415762F3A38421C6DB3 /* Graphics.cpp */; }; + FA08F61F16C7541400F007B5 /* Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 56D6030A0B8F7397715062B9 /* Image.cpp */; }; + FA08F62016C7541400F007B5 /* OpenGL.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2E406F8328543EC63EB922C6 /* OpenGL.cpp */; }; + FA08F62116C7541400F007B5 /* ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 48A206C9004150640C432100 /* ParticleSystem.cpp */; }; + FA08F62316C7541400F007B5 /* Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA577A8516C71CF000860150 /* Shader.cpp */; }; + FA08F62416C7541400F007B5 /* SpriteBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D700D182EAA46273D1E2CC4 /* SpriteBatch.cpp */; }; + FA08F62516C7541400F007B5 /* VertexBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 426B1C4475DC54505B824B7F /* VertexBuffer.cpp */; }; + FA08F62616C7541400F007B5 /* wrap_Canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E3251027026699A1D4D310D /* wrap_Canvas.cpp */; }; + FA08F62716C7541400F007B5 /* wrap_Font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7A3B52AF1FBE73FC36AD50C8 /* wrap_Font.cpp */; }; + FA08F62816C7541400F007B5 /* wrap_Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A9810F758AC1D1E4B6431FD /* wrap_Graphics.cpp */; }; + FA08F62916C7541400F007B5 /* wrap_Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14AE68E14C2C74526A612FA0 /* wrap_Image.cpp */; }; + FA08F62A16C7541400F007B5 /* wrap_ParticleSystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5F42052D7C8271A1105541DE /* wrap_ParticleSystem.cpp */; }; + FA08F62C16C7541400F007B5 /* wrap_Shader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA577A8716C71CF000860150 /* wrap_Shader.cpp */; }; + FA08F62D16C7541400F007B5 /* wrap_SpriteBatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02C16FDB537A702F4D42534E /* wrap_SpriteBatch.cpp */; }; + FA08F62E16C7542600F007B5 /* ImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 78115E763B723C0C40AD47CF /* ImageData.cpp */; }; + FA08F62F16C7542600F007B5 /* Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 505F23A73BFE250833D650E4 /* Image.cpp */; }; + FA08F63016C7542600F007B5 /* DevilHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1AA7781A230065F346E2313A /* DevilHandler.cpp */; }; + FA08F63116C7542600F007B5 /* wrap_Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0B0728FA73B107B37A956A09 /* wrap_Image.cpp */; }; + FA08F63216C7542600F007B5 /* wrap_ImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076840774B0B6E721D0C18D0 /* wrap_ImageData.cpp */; }; + FA08F63416C7542D00F007B5 /* JoystickModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 55B425307C0C1C4B3EFC3A5F /* JoystickModule.cpp */; }; + FA08F63516C7542D00F007B5 /* wrap_JoystickModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 139411436818381E493F00F5 /* wrap_JoystickModule.cpp */; }; + FA08F63616C7543400F007B5 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 524741891BB93848039F4174 /* Keyboard.cpp */; }; + FA08F63716C7543400F007B5 /* Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43BC2B1C505E5EFF650C31E3 /* Keyboard.cpp */; }; + FA08F63816C7543400F007B5 /* wrap_Keyboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 19F40DF6507028212FEB1D77 /* wrap_Keyboard.cpp */; }; + FA08F63916C7543A00F007B5 /* love.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 19ED419874B46EC16F927524 /* love.cpp */; }; + FA08F63A16C7544300F007B5 /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 31E0110E5797041465FF5F95 /* Mouse.cpp */; }; + FA08F63B16C7544300F007B5 /* Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 584E16AE09E12536206C46FE /* Mouse.cpp */; }; + FA08F63C16C7544300F007B5 /* wrap_Mouse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 22EF17981EBD442773FE41B6 /* wrap_Mouse.cpp */; }; + FA08F63D16C7544B00F007B5 /* Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2DCE45C868A0091B762C7377 /* Body.cpp */; }; + FA08F63E16C7544B00F007B5 /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69DB4423147C7E3362941E75 /* Joint.cpp */; }; + FA08F63F16C7544B00F007B5 /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 70F425B5336E1CD652827FD0 /* Shape.cpp */; }; + FA08F64016C7546400F007B5 /* Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 089B1AC1248B21D336594457 /* Body.cpp */; }; + FA08F64116C7546400F007B5 /* ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0959542C4B54320B1DDD5911 /* ChainShape.cpp */; }; + FA08F64216C7546400F007B5 /* CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DAB28A9235E2CBE75F56848 /* CircleShape.cpp */; }; + FA08F64316C7546400F007B5 /* Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02CD63315FF902E336AB4657 /* Contact.cpp */; }; + FA08F64416C7546400F007B5 /* DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34A36BB617BC5CCA5B870EA6 /* DistanceJoint.cpp */; }; + FA08F64516C7546400F007B5 /* EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 755C2B980C106EA7423E7E5E /* EdgeShape.cpp */; }; + FA08F64616C7546400F007B5 /* Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 47C77F6032FA77E046AA6810 /* Fixture.cpp */; }; + FA08F64716C7546400F007B5 /* FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1E22646A710E5EFC27FE3932 /* FrictionJoint.cpp */; }; + FA08F64816C7546400F007B5 /* GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6F4D478A52A0408765095920 /* GearJoint.cpp */; }; + FA08F64916C7546400F007B5 /* Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3EA80A4E0CE0014052076037 /* Joint.cpp */; }; + FA08F64A16C7546400F007B5 /* MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C0B06AF6B5326C840477B18 /* MouseJoint.cpp */; }; + FA08F64B16C7546400F007B5 /* Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 370D76DC224F2EB300CB4E2F /* Physics.cpp */; }; + FA08F64C16C7546400F007B5 /* PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 54E85987318206E93DC8189F /* PolygonShape.cpp */; }; + FA08F64D16C7546400F007B5 /* PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0AE5755936E84C247FB56C65 /* PrismaticJoint.cpp */; }; + FA08F64E16C7546400F007B5 /* PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CB720BA493D7D995E0E20DD /* PulleyJoint.cpp */; }; + FA08F64F16C7546400F007B5 /* RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36DD053F754B2D29719B1F80 /* RevoluteJoint.cpp */; }; + FA08F65016C7546400F007B5 /* RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53C4064801456193163E4631 /* RopeJoint.cpp */; }; + FA08F65116C7546400F007B5 /* Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61E64F07028039774F502D69 /* Shape.cpp */; }; + FA08F65216C7547300F007B5 /* WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 78E50525407567F863476E27 /* WeldJoint.cpp */; }; + FA08F65316C7547300F007B5 /* WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 44DE79C879CC0074510A2403 /* WheelJoint.cpp */; }; + FA08F65416C7547300F007B5 /* World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 644D0C953C3439FC57C03FC6 /* World.cpp */; }; + FA08F65516C7547300F007B5 /* wrap_Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 64694F91593478085859666F /* wrap_Body.cpp */; }; + FA08F65616C7547300F007B5 /* wrap_ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CAA69E00D0808BA2108238B /* wrap_ChainShape.cpp */; }; + FA08F65716C7547300F007B5 /* wrap_CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6EF321185C2B1F1E1AF54F64 /* wrap_CircleShape.cpp */; }; + FA08F65816C7547300F007B5 /* wrap_Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3BB22A142670197B0DBD0BED /* wrap_Contact.cpp */; }; + FA08F65916C7547300F007B5 /* wrap_DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 69967D2323404E1F0ED21F11 /* wrap_DistanceJoint.cpp */; }; + FA08F65A16C7547300F007B5 /* wrap_EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40F412FF29F65F5A3D511B98 /* wrap_EdgeShape.cpp */; }; + FA08F65B16C7547300F007B5 /* wrap_Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7F796B7A3362196075C62E61 /* wrap_Fixture.cpp */; }; + FA08F65C16C7547300F007B5 /* wrap_FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 340345481F165F8945C716AE /* wrap_FrictionJoint.cpp */; }; + FA08F65D16C7548200F007B5 /* wrap_GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 50B67F2D0CC511706810302E /* wrap_GearJoint.cpp */; }; + FA08F65E16C7548200F007B5 /* wrap_Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 71810207414B52F8340D7797 /* wrap_Joint.cpp */; }; + FA08F65F16C7548200F007B5 /* wrap_MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4D81102E7ABD1C282BE42CE3 /* wrap_MouseJoint.cpp */; }; + FA08F66016C7548200F007B5 /* wrap_Physics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6CEB48E969FC42C53F9432B1 /* wrap_Physics.cpp */; }; + FA08F66116C7548200F007B5 /* wrap_PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3AD03C7A77C546ED07BE4C06 /* wrap_PolygonShape.cpp */; }; + FA08F66216C7548200F007B5 /* wrap_PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0B4020CD058D70F569DF6129 /* wrap_PrismaticJoint.cpp */; }; + FA08F66316C7548200F007B5 /* wrap_PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1E840AF84AB61C6410E26634 /* wrap_PulleyJoint.cpp */; }; + FA08F66416C7548200F007B5 /* wrap_RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F3A277A44141DBF7BCF146A /* wrap_RevoluteJoint.cpp */; }; + FA08F66516C7548200F007B5 /* wrap_RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0E3E13BC3E3A7C0C7DBE7DF8 /* wrap_RopeJoint.cpp */; }; + FA08F66616C7548200F007B5 /* wrap_Shape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 124E716E0BCA055534A60AD2 /* wrap_Shape.cpp */; }; + FA08F66716C7548200F007B5 /* wrap_WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3DFF31EE26405E554C610C8F /* wrap_WeldJoint.cpp */; }; + FA08F66816C7548200F007B5 /* wrap_WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 73473B3C698B538002540A5D /* wrap_WheelJoint.cpp */; }; + FA08F66916C7548200F007B5 /* wrap_World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36324E12371E518E6E9C61B5 /* wrap_World.cpp */; }; + FA08F66A16C7549200F007B5 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 30ED4BB03C5F11254AF12E98 /* Sound.cpp */; }; + FA08F66B16C7549200F007B5 /* SoundData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C5C6C6E47851D1308411DE6 /* SoundData.cpp */; }; + FA08F66C16C7549200F007B5 /* wrap_Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CF629B94C7802D446D61C45 /* wrap_Decoder.cpp */; }; + FA08F66D16C7549200F007B5 /* wrap_Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 385902BD584E7D73154E4EBB /* wrap_Sound.cpp */; }; + FA08F66E16C7549200F007B5 /* wrap_SoundData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DC3617831763D2760335D87 /* wrap_SoundData.cpp */; }; + FA08F66F16C754A100F007B5 /* Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4E15567759041CC379292BE6 /* Decoder.cpp */; }; + FA08F67016C754A100F007B5 /* FLACDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A774BC26B7235E410D40C8E /* FLACDecoder.cpp */; }; + FA08F67116C754A100F007B5 /* GmeDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 02F0197227150E1B28D9425B /* GmeDecoder.cpp */; }; + FA08F67216C754A100F007B5 /* ModPlugDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 407422E8589417B6683D1042 /* ModPlugDecoder.cpp */; }; + FA08F67316C754A100F007B5 /* Mpg123Decoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F875B224C4E1B9E35854766 /* Mpg123Decoder.cpp */; }; + FA08F67416C754A100F007B5 /* Sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A5F7DCB40652F9B7D61073A /* Sound.cpp */; }; + FA08F67516C754A100F007B5 /* VorbisDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 727648E06CD863A2582F798F /* VorbisDecoder.cpp */; }; + FA08F67716C754A900F007B5 /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B3565203A1778431F8A5409 /* threads.cpp */; }; + FA08F67916C754B100F007B5 /* Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 113269E55FCF208D2D6754BC /* Timer.cpp */; }; + FA08F67A16C754B100F007B5 /* wrap_Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 695E4ED13AA0689E64280573 /* wrap_Timer.cpp */; }; + FA08F67B16C754BA00F007B5 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 351B09E51FDC338622F44624 /* Window.cpp */; }; + FA08F67C16C754BA00F007B5 /* Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6CDD4F3320303D222C180CD0 /* Window.cpp */; }; + FA0A4BF0182E0C2800E1E4D2 /* b2MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0A4BEE182E0C2800E1E4D2 /* b2MotorJoint.cpp */; }; + FA0A4BF1182E0C2800E1E4D2 /* b2MotorJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0A4BEF182E0C2800E1E4D2 /* b2MotorJoint.h */; }; + FA0A4BF4182E1AD600E1E4D2 /* MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0A4BF2182E1AD600E1E4D2 /* MotorJoint.cpp */; }; + FA0A4BF5182E1AD600E1E4D2 /* MotorJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0A4BF3182E1AD600E1E4D2 /* MotorJoint.h */; }; + FA0A4BF9182E260200E1E4D2 /* wrap_MotorJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0A4BF7182E260200E1E4D2 /* wrap_MotorJoint.h */; }; + FA0A4BFA182E26F500E1E4D2 /* wrap_MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA0A4BF6182E260200E1E4D2 /* wrap_MotorJoint.cpp */; }; + FA0CDE3D1710F9A50056E8D7 /* FormatHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FA0CDE3B1710F9A50056E8D7 /* FormatHandler.h */; }; + FA1EF7C41799FEAC00FF380C /* wrap_System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA34E7D4174B55AF00E04D3F /* wrap_System.cpp */; }; + FA1EF7C51799FEB200FF380C /* wrap_System.h in Headers */ = {isa = PBXBuildFile; fileRef = FA34E7D5174B55AF00E04D3F /* wrap_System.h */; }; + FA34E7CD174B513F00E04D3F /* System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA34E7CB174B513F00E04D3F /* System.cpp */; }; + FA34E7CE174B513F00E04D3F /* System.h in Headers */ = {isa = PBXBuildFile; fileRef = FA34E7CC174B513F00E04D3F /* System.h */; }; + FA34E7D2174B515D00E04D3F /* System.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA34E7D0174B515D00E04D3F /* System.cpp */; }; + FA34E7D3174B515D00E04D3F /* System.h in Headers */ = {isa = PBXBuildFile; fileRef = FA34E7D1174B515D00E04D3F /* System.h */; }; + FA3D9E0D16E68DE600CA6630 /* Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA3D9E0B16E68DE600CA6630 /* Cursor.cpp */; }; + FA3D9E0E16E68DE600CA6630 /* Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = FA3D9E0C16E68DE600CA6630 /* Cursor.h */; }; + FA3D9E1116E68EAE00CA6630 /* Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA3D9E0F16E68EAE00CA6630 /* Cursor.cpp */; }; + FA3D9E1216E68EAE00CA6630 /* Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = FA3D9E1016E68EAE00CA6630 /* Cursor.h */; }; + FA3D9E1516E6D41100CA6630 /* wrap_Cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA3D9E1316E6D41000CA6630 /* wrap_Cursor.cpp */; }; + FA3D9E1616E6D41100CA6630 /* wrap_Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = FA3D9E1416E6D41000CA6630 /* wrap_Cursor.h */; }; + FA435EA317B36E9C004C3F22 /* Polyline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA435EA117B36E9C004C3F22 /* Polyline.cpp */; }; + FA435EA417B36E9C004C3F22 /* Polyline.h in Headers */ = {isa = PBXBuildFile; fileRef = FA435EA217B36E9C004C3F22 /* Polyline.h */; }; + FA5454C216F1310000D30303 /* MathModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA5454C016F1310000D30303 /* MathModule.cpp */; }; + FA5454C316F1310000D30303 /* MathModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5454C116F1310000D30303 /* MathModule.h */; }; + FA577AB016C7507900860150 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7916C71A1700860150 /* Cocoa.framework */; }; + FA577AC216C7512D00860150 /* FreeType.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A6716C719D900860150 /* FreeType.framework */; }; + FA577AC416C7513200860150 /* IL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A6916C719DE00860150 /* IL.framework */; }; + FA577AC516C7513400860150 /* libmodplug.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A8216C71A5300860150 /* libmodplug.framework */; }; + FA577AC716C7513A00860150 /* mpg123.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A6F16C719F000860150 /* mpg123.framework */; }; + FA577AC816C7513C00860150 /* Ogg.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7116C719F400860150 /* Ogg.framework */; }; + FA577ACA16C7514100860150 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7C16C71A2600860150 /* OpenGL.framework */; }; + FA577ACB16C7514400860150 /* physfs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7316C719F900860150 /* physfs.framework */; }; + FA577ACD16C7514C00860150 /* Vorbis.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA577A7716C71A0800860150 /* Vorbis.framework */; }; + FA5FDC791788D548002F0ED2 /* enet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC5F1788D548002F0ED2 /* enet.cpp */; }; + FA5FDC7A1788D548002F0ED2 /* callbacks.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC611788D548002F0ED2 /* callbacks.c */; }; + FA5FDC7C1788D548002F0ED2 /* compress.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC631788D548002F0ED2 /* compress.c */; }; + FA5FDC7D1788D548002F0ED2 /* host.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC641788D548002F0ED2 /* host.c */; }; + FA5FDC7E1788D548002F0ED2 /* callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC671788D548002F0ED2 /* callbacks.h */; }; + FA5FDC7F1788D548002F0ED2 /* enet.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC681788D548002F0ED2 /* enet.h */; }; + FA5FDC801788D548002F0ED2 /* list.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC691788D548002F0ED2 /* list.h */; }; + FA5FDC811788D548002F0ED2 /* protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC6A1788D548002F0ED2 /* protocol.h */; }; + FA5FDC821788D548002F0ED2 /* time.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC6B1788D548002F0ED2 /* time.h */; }; + FA5FDC831788D548002F0ED2 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC6C1788D548002F0ED2 /* types.h */; }; + FA5FDC841788D548002F0ED2 /* unix.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC6D1788D548002F0ED2 /* unix.h */; }; + FA5FDC851788D548002F0ED2 /* utility.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC6E1788D548002F0ED2 /* utility.h */; }; + FA5FDC861788D548002F0ED2 /* win32.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC6F1788D548002F0ED2 /* win32.h */; }; + FA5FDC881788D548002F0ED2 /* list.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC711788D548002F0ED2 /* list.c */; }; + FA5FDC891788D548002F0ED2 /* packet.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC721788D548002F0ED2 /* packet.c */; }; + FA5FDC8A1788D548002F0ED2 /* peer.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC731788D548002F0ED2 /* peer.c */; }; + FA5FDC8B1788D548002F0ED2 /* protocol.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC741788D548002F0ED2 /* protocol.c */; }; + FA5FDC8D1788D548002F0ED2 /* unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC761788D548002F0ED2 /* unix.c */; }; + FA5FDC8E1788D548002F0ED2 /* win32.c in Sources */ = {isa = PBXBuildFile; fileRef = FA5FDC771788D548002F0ED2 /* win32.c */; }; + FA5FDC8F1788D548002F0ED2 /* lua-enet.h in Headers */ = {isa = PBXBuildFile; fileRef = FA5FDC781788D548002F0ED2 /* lua-enet.h */; }; + FA636D8A171B70920065623F /* RandomGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA636D88171B70920065623F /* RandomGenerator.cpp */; }; + FA636D8B171B70920065623F /* RandomGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = FA636D89171B70920065623F /* RandomGenerator.h */; }; + FA636D8E171B72A70065623F /* wrap_RandomGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA636D8C171B72A70065623F /* wrap_RandomGenerator.cpp */; }; + FA636D8F171B72A70065623F /* wrap_RandomGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = FA636D8D171B72A70065623F /* wrap_RandomGenerator.h */; }; + FA7175AA178E8418001FE7FE /* lua.h in Headers */ = {isa = PBXBuildFile; fileRef = FA7175A9178E8418001FE7FE /* lua.h */; }; + FA7AA59217F6AC1F00704BE2 /* wrap_Mesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA7AA59017F6AC1F00704BE2 /* wrap_Mesh.cpp */; }; + FA7AA59317F6AC1F00704BE2 /* wrap_Mesh.h in Headers */ = {isa = PBXBuildFile; fileRef = FA7AA59117F6AC1F00704BE2 /* wrap_Mesh.h */; }; + FA7C937A16DCC6C2006F2BEE /* wrap_Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA7C937516DCC6C2006F2BEE /* wrap_Math.cpp */; }; + FA7C937B16DCC6C2006F2BEE /* wrap_Math.h in Headers */ = {isa = PBXBuildFile; fileRef = FA7C937616DCC6C2006F2BEE /* wrap_Math.h */; }; + FA9A100C182A0D5200106F9F /* glad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9A1009182A0D5200106F9F /* glad.cpp */; }; + FA9A100D182A0D5200106F9F /* glad.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA9A100A182A0D5200106F9F /* glad.hpp */; }; + FA9A100E182A0D5200106F9F /* gladfuncs.hpp in Headers */ = {isa = PBXBuildFile; fileRef = FA9A100B182A0D5200106F9F /* gladfuncs.hpp */; }; + FA9B4A0816E1578300074F42 /* SDL2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA9B4A0716E1578300074F42 /* SDL2.framework */; }; + FA9FC0B0173D6E3E005027FF /* wrap_Window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FA9FC0AE173D6E3E005027FF /* wrap_Window.cpp */; }; + FA9FC0B1173D6E3E005027FF /* wrap_Window.h in Headers */ = {isa = PBXBuildFile; fileRef = FA9FC0AF173D6E3E005027FF /* wrap_Window.h */; }; + FAAC6B02170A373B008A61C5 /* CompressedData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAAC6B00170A373A008A61C5 /* CompressedData.cpp */; }; + FAAC6B03170A373B008A61C5 /* CompressedData.h in Headers */ = {isa = PBXBuildFile; fileRef = FAAC6B01170A373A008A61C5 /* CompressedData.h */; }; + FAAFF04416CB11C700CCDE45 /* OpenAL-Soft.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAAFF04316CB11C700CCDE45 /* OpenAL-Soft.framework */; }; + FAB0078F1740C12D00A9664D /* Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAB0078D1740C12D00A9664D /* Joystick.cpp */; }; + FAB007901740C12D00A9664D /* Joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = FAB0078E1740C12D00A9664D /* Joystick.h */; }; + FAB007931740C28900A9664D /* Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAB007911740C28900A9664D /* Joystick.cpp */; }; + FAB007941740C28900A9664D /* Joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = FAB007921740C28900A9664D /* Joystick.h */; }; + FAB007971740C87D00A9664D /* wrap_Joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAB007951740C87D00A9664D /* wrap_Joystick.cpp */; }; + FAB007981740C87D00A9664D /* wrap_Joystick.h in Headers */ = {isa = PBXBuildFile; fileRef = FAB007961740C87D00A9664D /* wrap_Joystick.h */; }; + FAC5710017402D1100D147E4 /* BezierCurve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC570FC17402D1100D147E4 /* BezierCurve.cpp */; }; + FAC5710117402D1100D147E4 /* BezierCurve.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC570FD17402D1100D147E4 /* BezierCurve.h */; }; + FAC5710217402D1100D147E4 /* wrap_BezierCurve.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC570FE17402D1100D147E4 /* wrap_BezierCurve.cpp */; }; + FAC5710317402D1100D147E4 /* wrap_BezierCurve.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC570FF17402D1100D147E4 /* wrap_BezierCurve.h */; }; + FAC86E631724552C00EED715 /* wrap_Quad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC86E611724552C00EED715 /* wrap_Quad.cpp */; }; + FAC86E641724552C00EED715 /* wrap_Quad.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC86E621724552C00EED715 /* wrap_Quad.h */; }; + FAC86E6A1724555D00EED715 /* DrawQable.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC86E661724555D00EED715 /* DrawQable.h */; }; + FAC86E6B1724555D00EED715 /* Quad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAC86E671724555D00EED715 /* Quad.cpp */; }; + FAC86E6C1724555D00EED715 /* Quad.h in Headers */ = {isa = PBXBuildFile; fileRef = FAC86E681724555D00EED715 /* Quad.h */; }; + FAE010DB170DDE99006F29D0 /* ddsinfo.h in Headers */ = {isa = PBXBuildFile; fileRef = FAE010D8170DDE99006F29D0 /* ddsinfo.h */; }; + FAE010DC170DDE99006F29D0 /* ddsparse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAE010D9170DDE99006F29D0 /* ddsparse.cpp */; }; + FAE010DD170DDE99006F29D0 /* ddsparse.h in Headers */ = {isa = PBXBuildFile; fileRef = FAE010DA170DDE99006F29D0 /* ddsparse.h */; }; + FAE010E0170DE25E006F29D0 /* ddsHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAE010DE170DE25E006F29D0 /* ddsHandler.cpp */; }; + FAE010E1170DE25E006F29D0 /* ddsHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = FAE010DF170DE25E006F29D0 /* ddsHandler.h */; }; + FAE010E4170DF75C006F29D0 /* wrap_CompressedData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAE010E2170DF75B006F29D0 /* wrap_CompressedData.cpp */; }; + FAE010E5170DF75C006F29D0 /* wrap_CompressedData.h in Headers */ = {isa = PBXBuildFile; fileRef = FAE010E3170DF75C006F29D0 /* wrap_CompressedData.h */; }; + FAEC808A1710FEA60057279A /* ImageData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAEC80881710FEA60057279A /* ImageData.cpp */; }; + FAEC808B1710FEA60057279A /* ImageData.h in Headers */ = {isa = PBXBuildFile; fileRef = FAEC80891710FEA60057279A /* ImageData.h */; }; + FAEC808E1711E76C0057279A /* CompressedData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAEC808C1711E76C0057279A /* CompressedData.cpp */; }; + FAEC808F1711E76C0057279A /* CompressedData.h in Headers */ = {isa = PBXBuildFile; fileRef = FAEC808D1711E76C0057279A /* CompressedData.h */; }; + FAF272A416E3D44400CC193A /* Channel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF2729816E3D44400CC193A /* Channel.cpp */; }; + FAF272A516E3D44400CC193A /* Channel.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF2729916E3D44400CC193A /* Channel.h */; }; + FAF272A616E3D44400CC193A /* LuaThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF2729A16E3D44400CC193A /* LuaThread.cpp */; }; + FAF272A716E3D44400CC193A /* LuaThread.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF2729B16E3D44400CC193A /* LuaThread.h */; }; + FAF272A816E3D44400CC193A /* ThreadModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF2729C16E3D44400CC193A /* ThreadModule.cpp */; }; + FAF272A916E3D44400CC193A /* ThreadModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF2729D16E3D44400CC193A /* ThreadModule.h */; }; + FAF272AA16E3D44400CC193A /* wrap_Channel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF2729E16E3D44400CC193A /* wrap_Channel.cpp */; }; + FAF272AB16E3D44400CC193A /* wrap_Channel.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF2729F16E3D44400CC193A /* wrap_Channel.h */; }; + FAF272AC16E3D44400CC193A /* wrap_LuaThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF272A016E3D44400CC193A /* wrap_LuaThread.cpp */; }; + FAF272AD16E3D44400CC193A /* wrap_LuaThread.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF272A116E3D44400CC193A /* wrap_LuaThread.h */; }; + FAF272AE16E3D44400CC193A /* wrap_ThreadModule.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF272A216E3D44400CC193A /* wrap_ThreadModule.cpp */; }; + FAF272AF16E3D44400CC193A /* wrap_ThreadModule.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF272A316E3D44400CC193A /* wrap_ThreadModule.h */; }; + FAF272B516E3D46400CC193A /* Thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF272B116E3D46400CC193A /* Thread.cpp */; }; + FAF272B616E3D46400CC193A /* Thread.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF272B216E3D46400CC193A /* Thread.h */; }; + FAF272B716E3D46400CC193A /* threads.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF272B316E3D46400CC193A /* threads.cpp */; }; + FAF272B816E3D46400CC193A /* threads.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF272B416E3D46400CC193A /* threads.h */; }; + FAF4376F17F4AC530074F9E2 /* Mesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF4376D17F4AC530074F9E2 /* Mesh.cpp */; }; + FAF4377017F4AC530074F9E2 /* Mesh.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF4376E17F4AC530074F9E2 /* Mesh.h */; }; + FAF6704C18184FF800DBDEEA /* wuff.c in Sources */ = {isa = PBXBuildFile; fileRef = FAF6704418184FF800DBDEEA /* wuff.c */; }; + FAF6704D18184FF800DBDEEA /* wuff.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6704518184FF800DBDEEA /* wuff.h */; }; + FAF6704E18184FF800DBDEEA /* wuff_config.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6704618184FF800DBDEEA /* wuff_config.h */; }; + FAF6704F18184FF800DBDEEA /* wuff_convert.c in Sources */ = {isa = PBXBuildFile; fileRef = FAF6704718184FF800DBDEEA /* wuff_convert.c */; }; + FAF6705018184FF800DBDEEA /* wuff_convert.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6704818184FF800DBDEEA /* wuff_convert.h */; }; + FAF6705118184FF800DBDEEA /* wuff_internal.c in Sources */ = {isa = PBXBuildFile; fileRef = FAF6704918184FF800DBDEEA /* wuff_internal.c */; }; + FAF6705218184FF800DBDEEA /* wuff_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF6704A18184FF800DBDEEA /* wuff_internal.h */; }; + FAF6705318184FF800DBDEEA /* wuff_memory.c in Sources */ = {isa = PBXBuildFile; fileRef = FAF6704B18184FF800DBDEEA /* wuff_memory.c */; }; + FAF670561818501300DBDEEA /* WaveDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FAF670541818501300DBDEEA /* WaveDecoder.cpp */; }; + FAF670571818501300DBDEEA /* WaveDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF670551818501300DBDEEA /* WaveDecoder.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 001F02BC119E349012652C17 /* wrap_Data.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Data.h; sourceTree = ""; }; + 003142374F3D40A518716024 /* wrap_Keyboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Keyboard.h; sourceTree = ""; }; + 00393E4930202C2B6E381F68 /* mime.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mime.c; sourceTree = ""; }; + 006B015320155B4D42B43B61 /* wrap_Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Image.h; sourceTree = ""; }; + 00744BD73BFE3F591537728F /* Shape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Shape.h; sourceTree = ""; }; + 00D329851B1E7F6A3AF9614E /* tcp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tcp.h; sourceTree = ""; }; + 02662CBC29B954295A634A39 /* wrap_Source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Source.cpp; sourceTree = ""; }; + 02C16FDB537A702F4D42534E /* wrap_SpriteBatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_SpriteBatch.cpp; sourceTree = ""; }; + 02CA1BE908D91B104EB9590F /* wrap_Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Audio.cpp; sourceTree = ""; }; + 02CD63315FF902E336AB4657 /* Contact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Contact.cpp; sourceTree = ""; }; + 02F0197227150E1B28D9425B /* GmeDecoder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = GmeDecoder.cpp; sourceTree = ""; }; + 02F064F5202E34F5718352B8 /* wrap_Shape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Shape.h; sourceTree = ""; }; + 034144EE6C33421377674516 /* b2Distance.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = ""; }; + 03F17FF546D637744E263961 /* Graphics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Graphics.cpp; sourceTree = ""; }; + 041672ED2CF51FC62F532FDB /* usocket.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = usocket.c; sourceTree = ""; }; + 047815B73C1C5373551442A6 /* wrap_Joint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Joint.h; sourceTree = ""; }; + 048C39D14DA05F5843FE08CA /* ftp.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ftp.lua.h; sourceTree = ""; }; + 057A3770539D25AE6C8F20D3 /* Keyboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; + 059C04C13F3A7C05570F2987 /* b2Fixture.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = ""; }; + 05DF237B657042515F3B4E52 /* wrap_Graphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Graphics.h; sourceTree = ""; }; + 0602250B7E4664E43CA113DC /* b2WheelJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = ""; }; + 065364DB7A29396C777213D0 /* Joint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Joint.h; sourceTree = ""; }; + 076840774B0B6E721D0C18D0 /* wrap_ImageData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ImageData.cpp; sourceTree = ""; }; + 079504CB332E415D4B27797B /* b2Body.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; + 07B301984BE42246402F7D27 /* ImageData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ImageData.h; sourceTree = ""; }; + 085B376E3FBB254F0FD37958 /* Matrix.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Matrix.h; sourceTree = ""; }; + 086B4A4E025B4B5F606747A2 /* b2DistanceJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; + 08983C025D0655270DF81A5B /* b2PolygonShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; + 089B1AC1248B21D336594457 /* Body.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Body.cpp; sourceTree = ""; }; + 08AA5965073A1C520A7A6833 /* b2CircleShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; + 08D24B70441A2496160C0849 /* Rasterizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Rasterizer.h; sourceTree = ""; }; + 090F537B70DA06EA0B29593F /* b2Settings.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; + 0959542C4B54320B1DDD5911 /* ChainShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ChainShape.cpp; sourceTree = ""; }; + 09C71F9D7DC45F5765B2462B /* socket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = socket.h; sourceTree = ""; }; + 0A063D006D52330E67FF4B3A /* b2PolygonContact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; + 0A0A2DA4094130187F655E52 /* b2Math.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; + 0A420541704C1C2D718A4D20 /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = ""; }; + 0A936C83344E2CF84E703059 /* PulleyJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PulleyJoint.h; sourceTree = ""; }; + 0AA1539E66B2641B66130709 /* b2MouseJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; + 0AE5755936E84C247FB56C65 /* PrismaticJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PrismaticJoint.cpp; sourceTree = ""; }; + 0AFB7DA45B2D6913110A5AAB /* wrap_WheelJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_WheelJoint.h; sourceTree = ""; }; + 0B0728FA73B107B37A956A09 /* wrap_Image.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Image.cpp; sourceTree = ""; }; + 0B4020CD058D70F569DF6129 /* wrap_PrismaticJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_PrismaticJoint.cpp; sourceTree = ""; }; + 0B727D416262392743091BC3 /* TrueTypeRasterizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TrueTypeRasterizer.h; sourceTree = ""; }; + 0BEB72033ACA25550ADA76C4 /* b64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b64.h; sourceTree = ""; }; + 0C30420F7FD3038C721223A5 /* TrueTypeRasterizer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TrueTypeRasterizer.cpp; sourceTree = ""; }; + 0C5C6C6E47851D1308411DE6 /* SoundData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SoundData.cpp; sourceTree = ""; }; + 0CB6025618505B055A4E75DD /* Matrix.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Matrix.cpp; sourceTree = ""; }; + 0CFF64090F0F4F481BB80CF0 /* Volatile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Volatile.h; sourceTree = ""; }; + 0D6F00D95C4407BB26E71E02 /* b2World.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; + 0E3E13BC3E3A7C0C7DBE7DF8 /* wrap_RopeJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RopeJoint.cpp; sourceTree = ""; }; + 0E755DCF691828CE11444877 /* b2PolygonShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; + 0EA87794395D3B287C5949AA /* wrap_FrictionJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_FrictionJoint.h; sourceTree = ""; }; + 0EB870A1180261FD424A41B3 /* Shape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Shape.h; sourceTree = ""; }; + 0F0E666B7C790BB870477994 /* b2BlockAllocator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; + 0F8D03F1544476B57CA97B01 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; + 104144AB73A974BC04A03131 /* graphics.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = graphics.lua.h; sourceTree = ""; }; + 104D5534669B772556942891 /* PrismaticJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PrismaticJoint.h; sourceTree = ""; }; + 104D567660003ADE696D341A /* Source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Source.h; sourceTree = ""; }; + 10A608C96F067F972C962EFB /* love.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = love.h; sourceTree = ""; }; + 10F83B5848B77A937C250FEB /* b2Joint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; + 1108594E361A22D90D6022E8 /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = ""; }; + 112814480BBF2ED06EED15BF /* GlyphData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GlyphData.h; sourceTree = ""; }; + 113269E55FCF208D2D6754BC /* Timer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Timer.cpp; sourceTree = ""; }; + 11745DE315E859F71E881D76 /* wrap_Rasterizer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Rasterizer.cpp; sourceTree = ""; }; + 11773415762F3A38421C6DB3 /* Graphics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Graphics.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; + 11CF30E73CEA2D8D0A1B17D3 /* b2DynamicTree.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = ""; }; + 11D141087979064B441B787D /* File.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = File.cpp; sourceTree = ""; }; + 11D62E873092729B497B447F /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; + 120B391518206E964493126C /* b2Body.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; + 12390CBC115B00D06EF951DD /* b2Draw.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = ""; }; + 124E716E0BCA055534A60AD2 /* wrap_Shape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Shape.cpp; sourceTree = ""; }; + 13093ADC78426C5009DF3B13 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = ""; }; + 131F69C3368C4B8A55EE0DAD /* wrap_WeldJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_WeldJoint.h; sourceTree = ""; }; + 135801A6483528800C676492 /* io.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = io.c; sourceTree = ""; }; + 138913BE5126483748FA43D0 /* Joint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Joint.h; sourceTree = ""; }; + 139411436818381E493F00F5 /* wrap_JoystickModule.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_JoystickModule.cpp; sourceTree = ""; }; + 14AE68E14C2C74526A612FA0 /* wrap_Image.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Image.cpp; sourceTree = ""; }; + 15093E1B1A14176374C81299 /* wrap_CircleShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_CircleShape.h; sourceTree = ""; }; + 153957EB332E1269671E7F4A /* b2CircleShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; + 16C36B3C59A10CDC7ACE0DD4 /* http.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = http.lua.h; sourceTree = ""; }; + 174D472C1AFE594D77A0322B /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2ChainAndCircleContact.h; sourceTree = ""; }; + 175A1B8D733B2D4803F64AC1 /* b2Distance.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; + 17C730CB1DA01B8F0A11217C /* except.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = except.h; sourceTree = ""; }; + 17E9544103AE376210ED5BAA /* select.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = select.h; sourceTree = ""; }; + 182A781C7A2D3D2B6B8904A8 /* Data.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Data.h; sourceTree = ""; }; + 1839744763625B5D64EC70AC /* Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Audio.cpp; sourceTree = ""; }; + 18E0492204644DE929B96486 /* wrap_DistanceJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_DistanceJoint.h; sourceTree = ""; }; + 1916112F57AF56A173727464 /* Audio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Audio.h; sourceTree = ""; }; + 198A44BD71BB61EE517C2A39 /* Mouse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Mouse.h; sourceTree = ""; }; + 19ED419874B46EC16F927524 /* love.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = love.cpp; sourceTree = ""; }; + 19F40DF6507028212FEB1D77 /* wrap_Keyboard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Keyboard.cpp; sourceTree = ""; }; + 1A2A61843B753E3F5B330703 /* Vector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Vector.cpp; sourceTree = ""; }; + 1A304E384AF2119905C01504 /* Source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Source.cpp; sourceTree = ""; }; + 1A311FC16B9C0F8D7A41580E /* wrap_Body.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Body.h; sourceTree = ""; }; + 1A95437F513E662113AC154A /* b2Rope.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = ""; }; + 1A9810F758AC1D1E4B6431FD /* wrap_Graphics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Graphics.cpp; sourceTree = ""; }; + 1AA213FC158815FA77C40330 /* ChainShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChainShape.h; sourceTree = ""; }; + 1AA7781A230065F346E2313A /* DevilHandler.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DevilHandler.cpp; sourceTree = ""; }; + 1B036C7C5A8832AE53BB1C06 /* b2CollideEdge.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = ""; }; + 1B1C4E4D288A1D2F29E57B1B /* Rasterizer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Rasterizer.cpp; sourceTree = ""; }; + 1B4E22F1388E2B2E76E3377B /* wrap_GlyphData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_GlyphData.cpp; sourceTree = ""; }; + 1BCD6EE50EB8791E5A870135 /* utf8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = ""; }; + 1C5B57F87B315E39005B119F /* b2TimeOfImpact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = ""; }; + 1CAA69E00D0808BA2108238B /* wrap_ChainShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ChainShape.cpp; sourceTree = ""; }; + 1CD02D1975803957282F28AB /* auxiliar.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = auxiliar.c; sourceTree = ""; }; + 1CE84F1F19BC2AA412C638B1 /* timeout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = timeout.h; sourceTree = ""; }; + 1DA41DFF0869489411A71AFC /* Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Image.h; sourceTree = ""; }; + 1E22646A710E5EFC27FE3932 /* FrictionJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FrictionJoint.cpp; sourceTree = ""; }; + 1E27263847302FCA1F843B47 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; + 1E827AE8548C52493ED95629 /* wrap_Filesystem.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Filesystem.cpp; sourceTree = ""; }; + 1E840AF84AB61C6410E26634 /* wrap_PulleyJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_PulleyJoint.cpp; sourceTree = ""; }; + 1E9E4F657DEC2772493B79CC /* b2ContactSolver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; + 1F0D375C38A245E403E53DB5 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; + 1F3A277A44141DBF7BCF146A /* wrap_RevoluteJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RevoluteJoint.cpp; sourceTree = ""; }; + 1F4E747212DE41716BC245C9 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; + 1F6F652A57F8098E5CCA6F9A /* auxiliar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = auxiliar.h; sourceTree = ""; }; + 1F875B224C4E1B9E35854766 /* Mpg123Decoder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Mpg123Decoder.cpp; sourceTree = ""; }; + 202650DE4F267CD3082A1B30 /* wrap_Font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Font.h; sourceTree = ""; }; + 208275724C9421035EA145A4 /* MouseJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MouseJoint.h; sourceTree = ""; }; + 21124F915912499179A42115 /* b2CircleContact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; + 219636CF6780074F7871463D /* Filesystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Filesystem.h; sourceTree = ""; }; + 21B25A7E333315172B754D4F /* buffer.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = buffer.c; sourceTree = ""; }; + 21E975B81E8D701F2147658C /* wrap_Contact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Contact.h; sourceTree = ""; }; + 22256CC12B7C7D0D1B430D46 /* tcp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tcp.c; sourceTree = ""; }; + 22EF17981EBD442773FE41B6 /* wrap_Mouse.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Mouse.cpp; sourceTree = ""; }; + 232D67C67BEE54B776420682 /* wrap_Font.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Font.cpp; sourceTree = ""; }; + 23573F2F4F7D56312E663E24 /* Canvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Canvas.h; sourceTree = ""; }; + 239054AE7475433E39747DA9 /* b2Timer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = ""; }; + 23985AB32E7B463A2CB87E2C /* Sound.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Sound.h; sourceTree = ""; }; + 23A266CD4FC729355E23606E /* b2WheelJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = ""; }; + 24265680279E30A40DF81946 /* Event.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Event.cpp; sourceTree = ""; }; + 243E18977E2A37CC6FDD55A5 /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = ""; }; + 249015D170563D85709D7B6D /* options.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = ""; }; + 24D758D262EA18DC15187A12 /* delay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = delay.h; sourceTree = ""; }; + 24EE059E03D8155F4BFF64D6 /* Audio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Audio.h; sourceTree = ""; }; + 25C325DC2128769F6C6A54C3 /* Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Image.h; sourceTree = ""; }; + 25CE236F66F70EB3444A7CC8 /* GearJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GearJoint.h; sourceTree = ""; }; + 276C3474657D0A246F64221C /* wrap_EdgeShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_EdgeShape.h; sourceTree = ""; }; + 27F777AB188D674F30BC1829 /* wrap_World.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_World.h; sourceTree = ""; }; + 28016C9B51FE1A893DC35B66 /* Variant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Variant.h; sourceTree = ""; }; + 28024635525B077E08A73D9B /* Source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Source.cpp; sourceTree = ""; }; + 283342E174613897621A43F1 /* DevilHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DevilHandler.h; sourceTree = ""; }; + 286660042F9654F61AB90D7A /* Body.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Body.h; sourceTree = ""; }; + 2912092853050AF9785F39BE /* wrap_RevoluteJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_RevoluteJoint.h; sourceTree = ""; }; + 295C665B1E0B6B2D03CC4937 /* wrap_Event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Event.h; sourceTree = ""; }; + 2A5F7DCB40652F9B7D61073A /* Sound.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Sound.cpp; sourceTree = ""; }; + 2A6150F7479D21346EC54B68 /* b2ContactManager.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; + 2B8C245A21A515E86636725A /* wrap_PrismaticJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_PrismaticJoint.h; sourceTree = ""; }; + 2BE75A693BE206B22DAE1B2E /* wrap_SpriteBatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_SpriteBatch.h; sourceTree = ""; }; + 2C78323D7D5C628A53EC6931 /* b2Math.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; + 2C87695707B046B536F347D8 /* OpenGL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenGL.h; sourceTree = ""; }; + 2C970EA7229F20934C72581D /* b2RopeJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = ""; }; + 2CAE75B079B828FE6892684A /* udp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = udp.h; sourceTree = ""; }; + 2CEC5ED5211174C7583849AD /* Reference.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Reference.h; sourceTree = ""; }; + 2D290E902C451D6849051FEF /* b2WeldJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = ""; }; + 2D7B7DEC4FC87878332E41B3 /* wrap_JoystickModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_JoystickModule.h; sourceTree = ""; }; + 2D8E6FAE2A100B5866E96BFF /* runtime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = runtime.h; sourceTree = ""; }; + 2D9475890CDA3D3776435622 /* Timer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = ""; }; + 2DC90F3C6160198256795C75 /* luasocket.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = luasocket.cpp; sourceTree = ""; }; + 2DCE45C868A0091B762C7377 /* Body.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Body.cpp; sourceTree = ""; }; + 2E2675AF3DAA24CE0728042C /* udp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = udp.c; sourceTree = ""; }; + 2E406F8328543EC63EB922C6 /* OpenGL.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = OpenGL.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; + 2E5C2A2F05417B294ED655E8 /* Audio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Audio.h; sourceTree = ""; }; + 2E9B5D9926034F9172215D5E /* Font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Font.h; sourceTree = ""; }; + 2FB732687B1669402408356D /* Source.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Source.cpp; sourceTree = ""; }; + 2FD366F113387BC95125133D /* b2Shape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; + 2FF26CC52C28773750B812D9 /* PolygonShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PolygonShape.h; sourceTree = ""; }; + 30E466F441EE727658716873 /* Module.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Module.cpp; sourceTree = ""; }; + 30ED4BB03C5F11254AF12E98 /* Sound.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Sound.cpp; sourceTree = ""; }; + 31871B8B7E1A697A73576040 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = ""; }; + 31A444CF0B4E6DA450120730 /* File.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = File.h; sourceTree = ""; }; + 31B85B507F466FE158A3718E /* wrap_ImageData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_ImageData.h; sourceTree = ""; }; + 31C84D0129AE5F6044A94AC2 /* ModPlugDecoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ModPlugDecoder.h; sourceTree = ""; }; + 31E0110E5797041465FF5F95 /* Mouse.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = ""; }; + 325E60A57F2624766A524423 /* b2World.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; + 329915E84B0B6D025DDC34A9 /* luasocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = luasocket.h; sourceTree = ""; }; + 32CC11481CD9164455455D72 /* b2Collision.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; + 32FD3FEE52FD1911405B3C59 /* b2BroadPhase.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; + 330F59B11A5B5D1B44DC07BF /* wrap_Source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Source.h; sourceTree = ""; }; + 33627AE97E66147E76804EF9 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; + 33FD508B0754314530A35EF3 /* StringMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StringMap.h; sourceTree = ""; }; + 340345481F165F8945C716AE /* wrap_FrictionJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_FrictionJoint.cpp; sourceTree = ""; }; + 343E66751EBA75264C3400FA /* b2Draw.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = ""; }; + 34A36BB617BC5CCA5B870EA6 /* DistanceJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = DistanceJoint.cpp; sourceTree = ""; }; + 350C47C774835EA552130431 /* Object.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Object.h; sourceTree = ""; }; + 3512460642B046876D687B22 /* wrap_FileData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_FileData.h; sourceTree = ""; }; + 351B09E51FDC338622F44624 /* Window.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Window.cpp; sourceTree = ""; }; + 3547706F2E7D43212CB40D04 /* wrap_GlyphData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_GlyphData.h; sourceTree = ""; }; + 35B31EBC4DDB6F994BCA46B6 /* Reference.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Reference.cpp; sourceTree = ""; }; + 36324E12371E518E6E9C61B5 /* wrap_World.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_World.cpp; sourceTree = ""; }; + 36437CE95936736320710513 /* delay.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = delay.cpp; sourceTree = ""; }; + 36465ABA28FB06F4333C3F07 /* ImageRasterizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ImageRasterizer.h; sourceTree = ""; }; + 36DD053F754B2D29719B1F80 /* RevoluteJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RevoluteJoint.cpp; sourceTree = ""; }; + 370D76DC224F2EB300CB4E2F /* Physics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Physics.cpp; sourceTree = ""; }; + 37224F6B30CA5D800B1F41F1 /* wrap_Rasterizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Rasterizer.h; sourceTree = ""; }; + 3746164716797CF80D6B0CEE /* Exception.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Exception.cpp; sourceTree = ""; }; + 385902BD584E7D73154E4EBB /* wrap_Sound.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Sound.cpp; sourceTree = ""; }; + 386430B43A081E2A617B05F1 /* EnumMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EnumMap.h; sourceTree = ""; }; + 389E3CEC356050A27784290E /* Graphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Graphics.h; sourceTree = ""; }; + 38AF72D4790619BB022E2AEF /* b2RopeJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = ""; }; + 3960064616E26C0213E323E2 /* wrap_Sound.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Sound.h; sourceTree = ""; }; + 3A430C846C642DBC14975C7C /* utf8.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = ""; }; + 3AC7627D7E1458AA0D8E0522 /* b2GrowableStack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = ""; }; + 3AD03C7A77C546ED07BE4C06 /* wrap_PolygonShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_PolygonShape.cpp; sourceTree = ""; }; + 3AFB3A18384A2D22352262B1 /* wrap_Canvas.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Canvas.h; sourceTree = ""; }; + 3BA712260D725FEB72EB3CDE /* Event.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Event.cpp; sourceTree = ""; }; + 3BB22A142670197B0DBD0BED /* wrap_Contact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Contact.cpp; sourceTree = ""; }; + 3C0B06AF6B5326C840477B18 /* MouseJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = MouseJoint.cpp; sourceTree = ""; }; + 3C4D70E82FC12A9A15EC39BA /* checked.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = checked.h; sourceTree = ""; }; + 3C56375F752B7A9779DD37EC /* Variant.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Variant.cpp; sourceTree = ""; }; + 3C9253C8152355E1274814B7 /* FLACDecoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FLACDecoder.h; sourceTree = ""; }; + 3C965422252F672D3FF6598C /* CircleShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CircleShape.h; sourceTree = ""; }; + 3CDA3E9B364F17A902384AAC /* wrap_Font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Font.h; sourceTree = ""; }; + 3CFE5C4A12D5675E7C9C7BF9 /* Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Image.h; sourceTree = ""; }; + 3D8460B2486A372825213933 /* Vector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Vector.h; sourceTree = ""; }; + 3DFF31EE26405E554C610C8F /* wrap_WeldJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WeldJoint.cpp; sourceTree = ""; }; + 3EA80A4E0CE0014052076037 /* Joint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = ""; }; + 407422E8589417B6683D1042 /* ModPlugDecoder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ModPlugDecoder.cpp; sourceTree = ""; }; + 40A0593B616A223A4CEF07C9 /* Memoizer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Memoizer.cpp; sourceTree = ""; }; + 40BC14C607396F8B1B084012 /* int.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = int.h; sourceTree = ""; }; + 40F412FF29F65F5A3D511B98 /* wrap_EdgeShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_EdgeShape.cpp; sourceTree = ""; }; + 411B061C49172C971C622125 /* Object.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Object.cpp; sourceTree = ""; }; + 415E1438178736BE0EA908D5 /* select.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = select.c; sourceTree = ""; }; + 426B1C4475DC54505B824B7F /* VertexBuffer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = VertexBuffer.cpp; sourceTree = ""; }; + 427B4B2517C0516844370E3D /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = ""; }; + 439E46D768A266780E894800 /* JoystickModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JoystickModule.h; sourceTree = ""; }; + 43A258C229C75C15238E520C /* Decoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; + 43BC2B1C505E5EFF650C31E3 /* Keyboard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Keyboard.cpp; sourceTree = ""; }; + 448C492C7AEB7840504F1C9D /* b2EdgeShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = ""; }; + 44DE79C879CC0074510A2403 /* WheelJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WheelJoint.cpp; sourceTree = ""; }; + 44E85D982F01082F5E1346B6 /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2ChainAndPolygonContact.h; sourceTree = ""; }; + 457674E43FF71E974D990C00 /* DistanceJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DistanceJoint.h; sourceTree = ""; }; + 459946CA7F4406B026E80501 /* inet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = inet.h; sourceTree = ""; }; + 45DC20A760FC42341E5762F7 /* FrictionJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FrictionJoint.h; sourceTree = ""; }; + 45E761A0072E0EF92BD66EA9 /* runtime.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = runtime.cpp; sourceTree = ""; }; + 465D0438379342C4589E2B1C /* WeldJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WeldJoint.h; sourceTree = ""; }; + 468F7A0A484820DE79CE76D2 /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndCircleContact.cpp; sourceTree = ""; }; + 46CA2B6B17C32BBE55772268 /* Source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Source.h; sourceTree = ""; }; + 473D2247745F4901155A75DB /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 47C77F6032FA77E046AA6810 /* Fixture.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Fixture.cpp; sourceTree = ""; }; + 47D46915001F342A3CD23E86 /* File.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = File.h; sourceTree = ""; }; + 4832527C02C105776536438A /* b2Rope.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = ""; }; + 485645C663D372A96DFD33F7 /* mime.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mime.h; sourceTree = ""; }; + 48A206C9004150640C432100 /* ParticleSystem.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ParticleSystem.cpp; sourceTree = ""; }; + 4941079838020ECA049B5C21 /* Color.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Color.h; sourceTree = ""; }; + 49496EAF3305281B19223C22 /* except.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = except.c; sourceTree = ""; }; + 4A1D6DAE45E627BD12903B52 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; + 4A47384208BE218F688C4EFA /* b2MouseJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; + 4A774BC26B7235E410D40C8E /* FLACDecoder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FLACDecoder.cpp; sourceTree = ""; }; + 4A80315175C5625804AA4A56 /* VorbisDecoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VorbisDecoder.h; sourceTree = ""; }; + 4ABD4A7B5CB6678E39490982 /* io.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = io.h; sourceTree = ""; }; + 4AD52074367950B735707CE1 /* Canvas.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Canvas.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; + 4B002CBD52493ED9347C6EBA /* url.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = url.lua.h; sourceTree = ""; }; + 4B41232F7AF7793540F46C58 /* timeout.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = timeout.c; sourceTree = ""; }; + 4B5F4DF8110020A96B5D3EAB /* b2BroadPhase.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; + 4B731754147B27AF73AC5358 /* Volatile.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Volatile.cpp; sourceTree = ""; }; + 4C606AEC342457600C3F0741 /* JoystickModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JoystickModule.h; sourceTree = ""; }; + 4D700D182EAA46273D1E2CC4 /* SpriteBatch.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SpriteBatch.cpp; sourceTree = ""; }; + 4D81102E7ABD1C282BE42CE3 /* wrap_MouseJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_MouseJoint.cpp; sourceTree = ""; }; + 4DAB28A9235E2CBE75F56848 /* CircleShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CircleShape.cpp; sourceTree = ""; }; + 4DC3617831763D2760335D87 /* wrap_SoundData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_SoundData.cpp; sourceTree = ""; }; + 4E0F565B03D05C3722496F27 /* File.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = File.cpp; sourceTree = ""; }; + 4E15567759041CC379292BE6 /* Decoder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Decoder.cpp; sourceTree = ""; }; + 4E3251027026699A1D4D310D /* wrap_Canvas.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Canvas.cpp; sourceTree = ""; }; + 4E6705C154C34FBD143F465E /* b2ChainShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainShape.cpp; sourceTree = ""; }; + 4E972C114A6C25A63B5B6EF2 /* wrap_Mouse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Mouse.h; sourceTree = ""; }; + 4F1862D324C9429157A27A2E /* Event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = ""; }; + 4F34010A575C02E66D400CE2 /* RopeJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RopeJoint.h; sourceTree = ""; }; + 4F3E12BD4A646D0366792FC9 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; + 503971A86B7167A91B670FBA /* boot.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = boot.lua.h; sourceTree = ""; }; + 505F23A73BFE250833D650E4 /* Image.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Image.cpp; sourceTree = ""; }; + 50B67F2D0CC511706810302E /* wrap_GearJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_GearJoint.cpp; sourceTree = ""; }; + 50EC67CE3ED71F5D13304FD4 /* b2Contact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; + 50F0575E16561864699E41F5 /* b2Fixture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = ""; }; + 5100177E5D8A14366C5B0BC5 /* b2Island.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; + 524741891BB93848039F4174 /* Keyboard.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Keyboard.cpp; sourceTree = ""; }; + 525A4D633D9B0D8B225936D4 /* b2Timer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = ""; }; + 52D130DF3DC82D9D4C867B61 /* math.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = math.h; sourceTree = ""; }; + 52E15B702C40593D3BF431DF /* wrap_File.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_File.h; sourceTree = ""; }; + 53C4064801456193163E4631 /* RopeJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RopeJoint.cpp; sourceTree = ""; }; + 53C6151E07FB1E3471590CB9 /* ltn12.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ltn12.lua.h; sourceTree = ""; }; + 53EE57FF4DBD52BB22701160 /* ParticleSystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParticleSystem.h; sourceTree = ""; }; + 54A13C2209F945671BC27974 /* FileData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FileData.h; sourceTree = ""; }; + 54E653E84E8873D467C750FC /* mime.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mime.lua.h; sourceTree = ""; }; + 54E85987318206E93DC8189F /* PolygonShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PolygonShape.cpp; sourceTree = ""; }; + 55A759CE711E157339930E58 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; + 55AE226405CC1A55462E1D89 /* threads.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = ""; }; + 55B425307C0C1C4B3EFC3A5F /* JoystickModule.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JoystickModule.cpp; sourceTree = ""; }; + 561D4A4722E36BAA16D17CC8 /* EdgeShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EdgeShape.h; sourceTree = ""; }; + 567C0A0C58931DE54733011B /* b2StackAllocator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; + 56D6030A0B8F7397715062B9 /* Image.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = Image.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; + 577B66502A5360AE60733B10 /* VertexBuffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VertexBuffer.h; sourceTree = ""; }; + 57E6429235C547BE26B73C6C /* version.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = ""; }; + 583037E9238A6EF00DD20B1A /* Font.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Font.cpp; sourceTree = ""; }; + 584E16AE09E12536206C46FE /* Mouse.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Mouse.cpp; sourceTree = ""; }; + 58792BC1126C2917432D706B /* b2CircleContact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; + 58BA2BB460AF3C591B22690E /* Drawable.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Drawable.cpp; sourceTree = ""; }; + 58CC50E70A375FDF53EF01B6 /* Image.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Image.cpp; sourceTree = ""; }; + 58CD093F254501E37CA47CA8 /* types.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; + 597478A255B82B56488B4717 /* wrap_FileData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_FileData.cpp; sourceTree = ""; }; + 59BE634A2ACE722F14B86F89 /* b2Island.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; + 59D27EA33E8E62E15C185948 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = ""; }; + 5A1C77401B1B32CE326332A1 /* b2ContactSolver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; + 5B3306B5587A708557EE4D4F /* Source.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Source.h; sourceTree = ""; }; + 5B5A0BEC36BE007E6E491396 /* wrap_SoundData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_SoundData.h; sourceTree = ""; }; + 5BCC49F529F726385CD41FA6 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = ""; }; + 5CB720BA493D7D995E0E20DD /* PulleyJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PulleyJoint.cpp; sourceTree = ""; }; + 5CE0167703887B376F2368FD /* RevoluteJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RevoluteJoint.h; sourceTree = ""; }; + 5CE370672B1234B10F9532FA /* Physics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Physics.h; sourceTree = ""; }; + 5CF629B94C7802D446D61C45 /* wrap_Decoder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Decoder.cpp; sourceTree = ""; }; + 5D016F4C27EF506C13FE3058 /* ImageRasterizer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ImageRasterizer.cpp; sourceTree = ""; }; + 5D383DA1468545C30E7B5805 /* b64.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b64.cpp; sourceTree = ""; }; + 5D590ACE5E237B7D5B556AD0 /* Contact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Contact.h; sourceTree = ""; }; + 5D93601669875EE06721689E /* Drawable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Drawable.h; sourceTree = ""; }; + 5DA322AC59AD7E43183577CB /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = ""; }; + 5DC271240F0119AE16FA1B8E /* wrap_Filesystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Filesystem.h; sourceTree = ""; }; + 5ED732200E1B2E5F79831DDA /* wrap_Data.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Data.cpp; sourceTree = ""; }; + 5F1F169C7FC633EF292E26DF /* wrap_Fixture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Fixture.h; sourceTree = ""; }; + 5F42052D7C8271A1105541DE /* wrap_ParticleSystem.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ParticleSystem.cpp; sourceTree = ""; }; + 5F846B49240D52C10F6F76E5 /* options.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = options.c; sourceTree = ""; }; + 5FAE2A9679C97F2C2792182D /* luasocket.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = luasocket.c; sourceTree = ""; }; + 5FF97D522B8872947DED611C /* wrap_Audio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Audio.h; sourceTree = ""; }; + 601E6A56345412E87E1D396B /* Pool.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Pool.cpp; sourceTree = ""; }; + 60840050412A459D5D21518F /* Fixture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Fixture.h; sourceTree = ""; }; + 60C95C7F507A381D0A483B3F /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndPolygonContact.cpp; sourceTree = ""; }; + 610B475400DE0F7213352BC3 /* inet.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = inet.c; sourceTree = ""; }; + 615E0F450F2B7BA25EE679A6 /* Font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Font.h; sourceTree = ""; }; + 61E64F07028039774F502D69 /* Shape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = ""; }; + 62370A494F9D6E2D570065EB /* FileData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FileData.cpp; sourceTree = ""; }; + 62E121F35BEB622029324F25 /* Pool.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Pool.h; sourceTree = ""; }; + 63024AF52EE3658260BE116B /* Module.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Module.h; sourceTree = ""; }; + 633E37194CB535AE41A00092 /* b2EdgeShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = ""; }; + 63936FF81D4E14F6534A43BB /* usocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = usocket.h; sourceTree = ""; }; + 63A63DFB339266AC401B545A /* Mouse.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Mouse.h; sourceTree = ""; }; + 64491E98483728D601110EF0 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; + 644D0C953C3439FC57C03FC6 /* World.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = World.cpp; sourceTree = ""; }; + 64694F91593478085859666F /* wrap_Body.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Body.cpp; sourceTree = ""; }; + 64AC15B600F2473651823D40 /* GmeDecoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GmeDecoder.h; sourceTree = ""; }; + 64BA1CE328FF17144B475111 /* wrap_MouseJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_MouseJoint.h; sourceTree = ""; }; + 6590063A6E4B3AEF4550443C /* b2GearJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; + 66EC3C0463A703A97445193B /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; + 66F8479E6D2D587A592F2024 /* socket.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = socket.lua.h; sourceTree = ""; }; + 678E42771C9B415628A3234D /* wrap_ParticleSystem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_ParticleSystem.h; sourceTree = ""; }; + 68616BD516DB124312B47EB3 /* Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Image.h; sourceTree = ""; }; + 691C5C5828550E2F60754EF2 /* wrap_Event.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Event.cpp; sourceTree = ""; }; + 695E4ED13AA0689E64280573 /* wrap_Timer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Timer.cpp; sourceTree = ""; }; + 69967D2323404E1F0ED21F11 /* wrap_DistanceJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_DistanceJoint.cpp; sourceTree = ""; }; + 69A01D71103275D451F965B2 /* b2GearJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; + 69DB4423147C7E3362941E75 /* Joint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Joint.cpp; sourceTree = ""; }; + 6AA03CE31B942DC660045FE9 /* WheelJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WheelJoint.h; sourceTree = ""; }; + 6B255FFC4A2C404E50512CB5 /* Mpg123Decoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Mpg123Decoder.h; sourceTree = ""; }; + 6B2E52E6185E6980660F1374 /* luasocket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = luasocket.h; sourceTree = ""; }; + 6B3565203A1778431F8A5409 /* threads.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = threads.cpp; sourceTree = ""; }; + 6BEE6511475F641A70A0591E /* Timer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = ""; }; + 6C367AE309C453C412D91363 /* wrap_File.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_File.cpp; sourceTree = ""; }; + 6C7E6C3F1CCA1CF6164123F6 /* b2ChainShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2ChainShape.h; sourceTree = ""; }; + 6C981DA13E3D42DA06891046 /* Keyboard.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Keyboard.h; sourceTree = ""; }; + 6CB1193233FA78EE646A17A1 /* Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Audio.cpp; sourceTree = ""; }; + 6CDD4F3320303D222C180CD0 /* Window.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Window.cpp; sourceTree = ""; }; + 6CEB48E969FC42C53F9432B1 /* wrap_Physics.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Physics.cpp; sourceTree = ""; }; + 6D822D830EF049417D184372 /* b2TimeStep.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = ""; }; + 6DE3129F3A0B2D9C178118F3 /* Filesystem.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Filesystem.cpp; sourceTree = ""; }; + 6E682862758051BF7C0A10AA /* tp.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tp.lua.h; sourceTree = ""; }; + 6E6D5AB27B71488D405526C3 /* Body.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Body.h; sourceTree = ""; }; + 6EF321185C2B1F1E1AF54F64 /* wrap_CircleShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_CircleShape.cpp; sourceTree = ""; }; + 6F1B61350B6B36AF216C57D7 /* b2Joint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; + 6F4D478A52A0408765095920 /* GearJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = GearJoint.cpp; sourceTree = ""; }; + 6FF15DF4423F6426224024C9 /* b2Settings.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; + 70564CC32DEC209F2A615F44 /* wrap_ChainShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_ChainShape.h; sourceTree = ""; }; + 70F425B5336E1CD652827FD0 /* Shape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Shape.cpp; sourceTree = ""; }; + 714251EE742346DC17103357 /* Font.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Font.cpp; sourceTree = ""; }; + 71810207414B52F8340D7797 /* wrap_Joint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Joint.cpp; sourceTree = ""; }; + 71C579A557640A3E2A696518 /* wrap_Physics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Physics.h; sourceTree = ""; }; + 71F878E2440A021B68D93ABC /* b2Contact.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; + 727648E06CD863A2582F798F /* VorbisDecoder.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = VorbisDecoder.cpp; sourceTree = ""; }; + 727D23FA1CC755B902471A45 /* SpriteBatch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SpriteBatch.h; sourceTree = ""; }; + 733758E8028B20BB799A7BE6 /* Decoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Decoder.h; sourceTree = ""; }; + 73473B3C698B538002540A5D /* wrap_WheelJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_WheelJoint.cpp; sourceTree = ""; }; + 734947AA28AF36E436D242FD /* unix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = unix.c; sourceTree = ""; }; + 74003CB27FA762A021183AD5 /* GlyphData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = GlyphData.cpp; sourceTree = ""; }; + 74215662418726B35C581E55 /* Thread.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; + 7423362764CF57574BB16CDA /* Window.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = ""; }; + 74EE403977734BA53DDF16F0 /* core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; + 753F0B42534106D6545926C8 /* Memoizer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Memoizer.h; sourceTree = ""; }; + 755C2B980C106EA7423E7E5E /* EdgeShape.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = EdgeShape.cpp; sourceTree = ""; }; + 75C0197971FE16926CDA624A /* wrap_RopeJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_RopeJoint.h; sourceTree = ""; }; + 762E57DE65A626FA1F6D4305 /* wrap_PulleyJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_PulleyJoint.h; sourceTree = ""; }; + 77234CEE2EFE633537975850 /* Sound.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Sound.h; sourceTree = ""; }; + 774434E1581A23EC1B0F1E6F /* b2RevoluteJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; + 777352284E262F48543E6E7F /* Graphics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Graphics.h; sourceTree = ""; }; + 78073FEB0F54031B1A3A56FD /* wrap_PolygonShape.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_PolygonShape.h; sourceTree = ""; }; + 780D5B6358096BEB1F1336EE /* b2StackAllocator.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; + 78115E763B723C0C40AD47CF /* ImageData.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ImageData.cpp; sourceTree = ""; }; + 782A153A1E6314CB583250E0 /* wrap_Decoder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Decoder.h; sourceTree = ""; }; + 785D31764A1D6CDE21BC6404 /* SoundData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SoundData.h; sourceTree = ""; }; + 78A2127828793F7A778D7932 /* wrap_Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Image.h; sourceTree = ""; }; + 78C0420E2548523B241E3D61 /* b2FrictionJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = ""; }; + 78E50525407567F863476E27 /* WeldJoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = WeldJoint.cpp; sourceTree = ""; }; + 79A9038A15A324B450010E8B /* unix.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unix.h; sourceTree = ""; }; + 7A0A2BB707F44CAD12694679 /* buffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; + 7A3B52AF1FBE73FC36AD50C8 /* wrap_Font.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Font.cpp; sourceTree = ""; }; + 7A5C32955F016AB85EB55519 /* Exception.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Exception.h; sourceTree = ""; }; + 7A707F7A60B47A091107144B /* World.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = World.h; sourceTree = ""; }; + 7A840CB020803B7C6C097CD1 /* b2PulleyJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; + 7B7A47F267D77A570D995658 /* Box2D.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; + 7BAB25936D207169591A666A /* wrap_GearJoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_GearJoint.h; sourceTree = ""; }; + 7CA02BF51EBA65C263E15250 /* unchecked.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = unchecked.h; sourceTree = ""; }; + 7CC5707C79175FA6427B3D62 /* Audio.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Audio.cpp; sourceTree = ""; }; + 7D48236B78EA06D346A86E3F /* smtp.lua.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = smtp.lua.h; sourceTree = ""; }; + 7D9B03C2438B748D0DE93DD5 /* utf8.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = utf8.cpp; sourceTree = ""; }; + 7E4B280637927B532B456D5E /* Event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = ""; }; + 7E7A068041FD553876712F05 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; + 7EC570BC74C369747ED0183A /* Window.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Window.h; sourceTree = ""; }; + 7EFA04373ADC5CC24DCB5824 /* Font.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Font.h; sourceTree = ""; }; + 7F4B2A3860273D89294A44F4 /* b2ContactManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; + 7F575BE9573C654B5ED44CC1 /* wrap_Timer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wrap_Timer.h; sourceTree = ""; }; + 7F796B7A3362196075C62E61 /* wrap_Fixture.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Fixture.cpp; sourceTree = ""; }; + 7F911CF2107B22F44C5B2542 /* b2Collision.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; + FA03546A1731F3A700284828 /* simplexnoise1234.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simplexnoise1234.cpp; sourceTree = ""; }; + FA03546B1731F3A700284828 /* simplexnoise1234.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simplexnoise1234.h; sourceTree = ""; }; + FA08F5AE16C7525600F007B5 /* Info-Framework.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-Framework.plist"; sourceTree = ""; }; + FA0A4BEE182E0C2800E1E4D2 /* b2MotorJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MotorJoint.cpp; sourceTree = ""; }; + FA0A4BEF182E0C2800E1E4D2 /* b2MotorJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MotorJoint.h; sourceTree = ""; }; + FA0A4BF2182E1AD600E1E4D2 /* MotorJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MotorJoint.cpp; sourceTree = ""; }; + FA0A4BF3182E1AD600E1E4D2 /* MotorJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MotorJoint.h; sourceTree = ""; }; + FA0A4BF6182E260200E1E4D2 /* wrap_MotorJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_MotorJoint.cpp; sourceTree = ""; }; + FA0A4BF7182E260200E1E4D2 /* wrap_MotorJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_MotorJoint.h; sourceTree = ""; }; + FA0CDE3B1710F9A50056E8D7 /* FormatHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormatHandler.h; sourceTree = ""; }; + FA34E7CB174B513F00E04D3F /* System.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = System.cpp; sourceTree = ""; }; + FA34E7CC174B513F00E04D3F /* System.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = System.h; sourceTree = ""; }; + FA34E7D0174B515D00E04D3F /* System.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = System.cpp; sourceTree = ""; }; + FA34E7D1174B515D00E04D3F /* System.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = System.h; sourceTree = ""; }; + FA34E7D4174B55AF00E04D3F /* wrap_System.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_System.cpp; sourceTree = ""; }; + FA34E7D5174B55AF00E04D3F /* wrap_System.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_System.h; sourceTree = ""; }; + FA3D9E0B16E68DE600CA6630 /* Cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cursor.cpp; sourceTree = ""; }; + FA3D9E0C16E68DE600CA6630 /* Cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cursor.h; sourceTree = ""; }; + FA3D9E0F16E68EAE00CA6630 /* Cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Cursor.cpp; sourceTree = ""; }; + FA3D9E1016E68EAE00CA6630 /* Cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cursor.h; sourceTree = ""; }; + FA3D9E1316E6D41000CA6630 /* wrap_Cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Cursor.cpp; sourceTree = ""; }; + FA3D9E1416E6D41000CA6630 /* wrap_Cursor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Cursor.h; sourceTree = ""; }; + FA435EA117B36E9C004C3F22 /* Polyline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Polyline.cpp; sourceTree = ""; }; + FA435EA217B36E9C004C3F22 /* Polyline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Polyline.h; sourceTree = ""; }; + FA5454C016F1310000D30303 /* MathModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathModule.cpp; sourceTree = ""; }; + FA5454C116F1310000D30303 /* MathModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathModule.h; sourceTree = ""; }; + FA577A6716C719D900860150 /* FreeType.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FreeType.framework; path = /Library/Frameworks/FreeType.framework; sourceTree = ""; }; + FA577A6916C719DE00860150 /* IL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IL.framework; path = /Library/Frameworks/IL.framework; sourceTree = ""; }; + FA577A6D16C719EA00860150 /* Lua.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Lua.framework; path = /Library/Frameworks/Lua.framework; sourceTree = ""; }; + FA577A6F16C719F000860150 /* mpg123.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = mpg123.framework; path = /Library/Frameworks/mpg123.framework; sourceTree = ""; }; + FA577A7116C719F400860150 /* Ogg.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Ogg.framework; path = /Library/Frameworks/Ogg.framework; sourceTree = ""; }; + FA577A7316C719F900860150 /* physfs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = physfs.framework; path = /Library/Frameworks/physfs.framework; sourceTree = ""; }; + FA577A7716C71A0800860150 /* Vorbis.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Vorbis.framework; path = /Library/Frameworks/Vorbis.framework; sourceTree = ""; }; + FA577A7916C71A1700860150 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + FA577A7C16C71A2600860150 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = ""; }; + FA577A8216C71A5300860150 /* libmodplug.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = libmodplug.framework; path = /Library/Frameworks/libmodplug.framework; sourceTree = ""; }; + FA577A8516C71CF000860150 /* Shader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Shader.cpp; sourceTree = ""; }; + FA577A8616C71CF000860150 /* Shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Shader.h; sourceTree = ""; }; + FA577A8716C71CF000860150 /* wrap_Shader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Shader.cpp; sourceTree = ""; }; + FA577A8816C71CF000860150 /* wrap_Shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Shader.h; sourceTree = ""; }; + FA577A8C16C71D3600860150 /* auto.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = auto.lua; sourceTree = ""; }; + FA577A8D16C71D3600860150 /* boot.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = boot.lua; sourceTree = ""; }; + FA577A8E16C71D3600860150 /* graphics.lua */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = graphics.lua; sourceTree = ""; }; + FA577AAF16C7507900860150 /* love.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = love.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FA5FDC5F1788D548002F0ED2 /* enet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = enet.cpp; sourceTree = ""; }; + FA5FDC611788D548002F0ED2 /* callbacks.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = callbacks.c; sourceTree = ""; }; + FA5FDC631788D548002F0ED2 /* compress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = compress.c; sourceTree = ""; }; + FA5FDC641788D548002F0ED2 /* host.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = host.c; sourceTree = ""; }; + FA5FDC671788D548002F0ED2 /* callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = callbacks.h; sourceTree = ""; }; + FA5FDC681788D548002F0ED2 /* enet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enet.h; sourceTree = ""; }; + FA5FDC691788D548002F0ED2 /* list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = list.h; sourceTree = ""; }; + FA5FDC6A1788D548002F0ED2 /* protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = protocol.h; sourceTree = ""; }; + FA5FDC6B1788D548002F0ED2 /* time.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time.h; sourceTree = ""; }; + FA5FDC6C1788D548002F0ED2 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; + FA5FDC6D1788D548002F0ED2 /* unix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unix.h; sourceTree = ""; }; + FA5FDC6E1788D548002F0ED2 /* utility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utility.h; sourceTree = ""; }; + FA5FDC6F1788D548002F0ED2 /* win32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = win32.h; sourceTree = ""; }; + FA5FDC711788D548002F0ED2 /* list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = list.c; sourceTree = ""; }; + FA5FDC721788D548002F0ED2 /* packet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = packet.c; sourceTree = ""; }; + FA5FDC731788D548002F0ED2 /* peer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = peer.c; sourceTree = ""; }; + FA5FDC741788D548002F0ED2 /* protocol.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = protocol.c; sourceTree = ""; }; + FA5FDC761788D548002F0ED2 /* unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unix.c; sourceTree = ""; }; + FA5FDC771788D548002F0ED2 /* win32.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = win32.c; sourceTree = ""; }; + FA5FDC781788D548002F0ED2 /* lua-enet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "lua-enet.h"; sourceTree = ""; }; + FA636D88171B70920065623F /* RandomGenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RandomGenerator.cpp; sourceTree = ""; }; + FA636D89171B70920065623F /* RandomGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RandomGenerator.h; sourceTree = ""; }; + FA636D8C171B72A70065623F /* wrap_RandomGenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_RandomGenerator.cpp; sourceTree = ""; }; + FA636D8D171B72A70065623F /* wrap_RandomGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_RandomGenerator.h; sourceTree = ""; }; + FA7175A9178E8418001FE7FE /* lua.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lua.h; sourceTree = ""; }; + FA7AA59017F6AC1F00704BE2 /* wrap_Mesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Mesh.cpp; sourceTree = ""; }; + FA7AA59117F6AC1F00704BE2 /* wrap_Mesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Mesh.h; sourceTree = ""; }; + FA7C937516DCC6C2006F2BEE /* wrap_Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Math.cpp; sourceTree = ""; }; + FA7C937616DCC6C2006F2BEE /* wrap_Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Math.h; sourceTree = ""; }; + FA9A1009182A0D5200106F9F /* glad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = glad.cpp; sourceTree = ""; }; + FA9A100A182A0D5200106F9F /* glad.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = glad.hpp; sourceTree = ""; }; + FA9A100B182A0D5200106F9F /* gladfuncs.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = gladfuncs.hpp; sourceTree = ""; }; + FA9B4A0716E1578300074F42 /* SDL2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL2.framework; path = /Library/Frameworks/SDL2.framework; sourceTree = ""; }; + FA9FC0AE173D6E3E005027FF /* wrap_Window.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Window.cpp; sourceTree = ""; }; + FA9FC0AF173D6E3E005027FF /* wrap_Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Window.h; sourceTree = ""; }; + FAAC6B00170A373A008A61C5 /* CompressedData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CompressedData.cpp; sourceTree = ""; }; + FAAC6B01170A373A008A61C5 /* CompressedData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompressedData.h; sourceTree = ""; }; + FAAFF04316CB11C700CCDE45 /* OpenAL-Soft.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = "OpenAL-Soft.framework"; path = "/Library/Frameworks/OpenAL-Soft.framework"; sourceTree = ""; }; + FAB0078D1740C12D00A9664D /* Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick.cpp; sourceTree = ""; }; + FAB0078E1740C12D00A9664D /* Joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick.h; sourceTree = ""; }; + FAB007911740C28900A9664D /* Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Joystick.cpp; sourceTree = ""; }; + FAB007921740C28900A9664D /* Joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Joystick.h; sourceTree = ""; }; + FAB007951740C87D00A9664D /* wrap_Joystick.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Joystick.cpp; sourceTree = ""; }; + FAB007961740C87D00A9664D /* wrap_Joystick.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Joystick.h; sourceTree = ""; }; + FAC570FC17402D1100D147E4 /* BezierCurve.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BezierCurve.cpp; sourceTree = ""; }; + FAC570FD17402D1100D147E4 /* BezierCurve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BezierCurve.h; sourceTree = ""; }; + FAC570FE17402D1100D147E4 /* wrap_BezierCurve.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_BezierCurve.cpp; sourceTree = ""; }; + FAC570FF17402D1100D147E4 /* wrap_BezierCurve.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_BezierCurve.h; sourceTree = ""; }; + FAC86E611724552C00EED715 /* wrap_Quad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Quad.cpp; sourceTree = ""; }; + FAC86E621724552C00EED715 /* wrap_Quad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Quad.h; sourceTree = ""; }; + FAC86E661724555D00EED715 /* DrawQable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawQable.h; sourceTree = ""; }; + FAC86E671724555D00EED715 /* Quad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Quad.cpp; sourceTree = ""; }; + FAC86E681724555D00EED715 /* Quad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Quad.h; sourceTree = ""; }; + FAE010D8170DDE99006F29D0 /* ddsinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ddsinfo.h; sourceTree = ""; }; + FAE010D9170DDE99006F29D0 /* ddsparse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ddsparse.cpp; sourceTree = ""; }; + FAE010DA170DDE99006F29D0 /* ddsparse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ddsparse.h; sourceTree = ""; }; + FAE010DE170DE25E006F29D0 /* ddsHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ddsHandler.cpp; sourceTree = ""; }; + FAE010DF170DE25E006F29D0 /* ddsHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ddsHandler.h; sourceTree = ""; }; + FAE010E2170DF75B006F29D0 /* wrap_CompressedData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_CompressedData.cpp; sourceTree = ""; }; + FAE010E3170DF75C006F29D0 /* wrap_CompressedData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_CompressedData.h; sourceTree = ""; }; + FAEC80881710FEA60057279A /* ImageData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageData.cpp; sourceTree = ""; }; + FAEC80891710FEA60057279A /* ImageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageData.h; sourceTree = ""; }; + FAEC808C1711E76C0057279A /* CompressedData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CompressedData.cpp; sourceTree = ""; }; + FAEC808D1711E76C0057279A /* CompressedData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompressedData.h; sourceTree = ""; }; + FAF2729816E3D44400CC193A /* Channel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Channel.cpp; sourceTree = ""; }; + FAF2729916E3D44400CC193A /* Channel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Channel.h; sourceTree = ""; }; + FAF2729A16E3D44400CC193A /* LuaThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LuaThread.cpp; sourceTree = ""; }; + FAF2729B16E3D44400CC193A /* LuaThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LuaThread.h; sourceTree = ""; }; + FAF2729C16E3D44400CC193A /* ThreadModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ThreadModule.cpp; sourceTree = ""; }; + FAF2729D16E3D44400CC193A /* ThreadModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadModule.h; sourceTree = ""; }; + FAF2729E16E3D44400CC193A /* wrap_Channel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_Channel.cpp; sourceTree = ""; }; + FAF2729F16E3D44400CC193A /* wrap_Channel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_Channel.h; sourceTree = ""; }; + FAF272A016E3D44400CC193A /* wrap_LuaThread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_LuaThread.cpp; sourceTree = ""; }; + FAF272A116E3D44400CC193A /* wrap_LuaThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_LuaThread.h; sourceTree = ""; }; + FAF272A216E3D44400CC193A /* wrap_ThreadModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wrap_ThreadModule.cpp; sourceTree = ""; }; + FAF272A316E3D44400CC193A /* wrap_ThreadModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_ThreadModule.h; sourceTree = ""; }; + FAF272B116E3D46400CC193A /* Thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Thread.cpp; sourceTree = ""; }; + FAF272B216E3D46400CC193A /* Thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Thread.h; sourceTree = ""; }; + FAF272B316E3D46400CC193A /* threads.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = threads.cpp; sourceTree = ""; }; + FAF272B416E3D46400CC193A /* threads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = threads.h; sourceTree = ""; }; + FAF4376D17F4AC530074F9E2 /* Mesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Mesh.cpp; sourceTree = ""; }; + FAF4376E17F4AC530074F9E2 /* Mesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mesh.h; sourceTree = ""; }; + FAF6704418184FF800DBDEEA /* wuff.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wuff.c; sourceTree = ""; }; + FAF6704518184FF800DBDEEA /* wuff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wuff.h; sourceTree = ""; }; + FAF6704618184FF800DBDEEA /* wuff_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wuff_config.h; sourceTree = ""; }; + FAF6704718184FF800DBDEEA /* wuff_convert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wuff_convert.c; sourceTree = ""; }; + FAF6704818184FF800DBDEEA /* wuff_convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wuff_convert.h; sourceTree = ""; }; + FAF6704918184FF800DBDEEA /* wuff_internal.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wuff_internal.c; sourceTree = ""; }; + FAF6704A18184FF800DBDEEA /* wuff_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wuff_internal.h; sourceTree = ""; }; + FAF6704B18184FF800DBDEEA /* wuff_memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wuff_memory.c; sourceTree = ""; }; + FAF670541818501300DBDEEA /* WaveDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WaveDecoder.cpp; sourceTree = ""; }; + FAF670551818501300DBDEEA /* WaveDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WaveDecoder.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FA577AAB16C7507900860150 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FA9B4A0816E1578300074F42 /* SDL2.framework in Frameworks */, + FAAFF04416CB11C700CCDE45 /* OpenAL-Soft.framework in Frameworks */, + FA577AB016C7507900860150 /* Cocoa.framework in Frameworks */, + FA577AC216C7512D00860150 /* FreeType.framework in Frameworks */, + FA577AC416C7513200860150 /* IL.framework in Frameworks */, + FA577AC516C7513400860150 /* libmodplug.framework in Frameworks */, + FA577AC716C7513A00860150 /* mpg123.framework in Frameworks */, + FA577AC816C7513C00860150 /* Ogg.framework in Frameworks */, + FA577ACA16C7514100860150 /* OpenGL.framework in Frameworks */, + FA577ACB16C7514400860150 /* physfs.framework in Frameworks */, + FA577ACD16C7514C00860150 /* Vorbis.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 003F4BA82B6046BC133B3F0F /* image */ = { + isa = PBXGroup; + children = ( + FAAC6B00170A373A008A61C5 /* CompressedData.cpp */, + FAAC6B01170A373A008A61C5 /* CompressedData.h */, + 25C325DC2128769F6C6A54C3 /* Image.h */, + 78115E763B723C0C40AD47CF /* ImageData.cpp */, + 07B301984BE42246402F7D27 /* ImageData.h */, + 13730AB030E309FF6E2961F1 /* magpie */, + FAE010E2170DF75B006F29D0 /* wrap_CompressedData.cpp */, + FAE010E3170DF75C006F29D0 /* wrap_CompressedData.h */, + 0B0728FA73B107B37A956A09 /* wrap_Image.cpp */, + 006B015320155B4D42B43B61 /* wrap_Image.h */, + 076840774B0B6E721D0C18D0 /* wrap_ImageData.cpp */, + 31B85B507F466FE158A3718E /* wrap_ImageData.h */, + ); + path = image; + sourceTree = ""; + }; + 02E0744773D13AD65E7C49DC /* thread */ = { + isa = PBXGroup; + children = ( + FAF2729816E3D44400CC193A /* Channel.cpp */, + FAF2729916E3D44400CC193A /* Channel.h */, + FAF2729A16E3D44400CC193A /* LuaThread.cpp */, + FAF2729B16E3D44400CC193A /* LuaThread.h */, + FAF272B016E3D46400CC193A /* sdl */, + 74215662418726B35C581E55 /* Thread.h */, + FAF2729C16E3D44400CC193A /* ThreadModule.cpp */, + FAF2729D16E3D44400CC193A /* ThreadModule.h */, + 6B3565203A1778431F8A5409 /* threads.cpp */, + 55AE226405CC1A55462E1D89 /* threads.h */, + FAF2729E16E3D44400CC193A /* wrap_Channel.cpp */, + FAF2729F16E3D44400CC193A /* wrap_Channel.h */, + FAF272A016E3D44400CC193A /* wrap_LuaThread.cpp */, + FAF272A116E3D44400CC193A /* wrap_LuaThread.h */, + FAF272A216E3D44400CC193A /* wrap_ThreadModule.cpp */, + FAF272A316E3D44400CC193A /* wrap_ThreadModule.h */, + ); + path = thread; + sourceTree = ""; + }; + 07571BBD29A9184E2F465E28 /* common */ = { + isa = PBXGroup; + children = ( + 5D383DA1468545C30E7B5805 /* b64.cpp */, + 0BEB72033ACA25550ADA76C4 /* b64.h */, + 473D2247745F4901155A75DB /* config.h */, + 182A781C7A2D3D2B6B8904A8 /* Data.h */, + 36437CE95936736320710513 /* delay.cpp */, + 24D758D262EA18DC15187A12 /* delay.h */, + 386430B43A081E2A617B05F1 /* EnumMap.h */, + 3746164716797CF80D6B0CEE /* Exception.cpp */, + 7A5C32955F016AB85EB55519 /* Exception.h */, + 40BC14C607396F8B1B084012 /* int.h */, + 52D130DF3DC82D9D4C867B61 /* math.h */, + 0CB6025618505B055A4E75DD /* Matrix.cpp */, + 085B376E3FBB254F0FD37958 /* Matrix.h */, + 40A0593B616A223A4CEF07C9 /* Memoizer.cpp */, + 753F0B42534106D6545926C8 /* Memoizer.h */, + 30E466F441EE727658716873 /* Module.cpp */, + 63024AF52EE3658260BE116B /* Module.h */, + 411B061C49172C971C622125 /* Object.cpp */, + 350C47C774835EA552130431 /* Object.h */, + 35B31EBC4DDB6F994BCA46B6 /* Reference.cpp */, + 2CEC5ED5211174C7583849AD /* Reference.h */, + 45E761A0072E0EF92BD66EA9 /* runtime.cpp */, + 2D8E6FAE2A100B5866E96BFF /* runtime.h */, + 33FD508B0754314530A35EF3 /* StringMap.h */, + 58CD093F254501E37CA47CA8 /* types.h */, + 7D9B03C2438B748D0DE93DD5 /* utf8.cpp */, + 3A430C846C642DBC14975C7C /* utf8.h */, + 3C56375F752B7A9779DD37EC /* Variant.cpp */, + 28016C9B51FE1A893DC35B66 /* Variant.h */, + 1A2A61843B753E3F5B330703 /* Vector.cpp */, + 3D8460B2486A372825213933 /* Vector.h */, + 57E6429235C547BE26B73C6C /* version.h */, + 5ED732200E1B2E5F79831DDA /* wrap_Data.cpp */, + 001F02BC119E349012652C17 /* wrap_Data.h */, + ); + name = common; + path = ../../src/common; + sourceTree = ""; + }; + 09000F404D44660029EF38F0 /* sdl */ = { + isa = PBXGroup; + children = ( + 3BA712260D725FEB72EB3CDE /* Event.cpp */, + 7E4B280637927B532B456D5E /* Event.h */, + 691C5C5828550E2F60754EF2 /* wrap_Event.cpp */, + 295C665B1E0B6B2D03CC4937 /* wrap_Event.h */, + ); + path = sdl; + sourceTree = ""; + }; + 12BB56F127170B3709670896 /* freetype */ = { + isa = PBXGroup; + children = ( + 714251EE742346DC17103357 /* Font.cpp */, + 615E0F450F2B7BA25EE679A6 /* Font.h */, + 0C30420F7FD3038C721223A5 /* TrueTypeRasterizer.cpp */, + 0B727D416262392743091BC3 /* TrueTypeRasterizer.h */, + 232D67C67BEE54B776420682 /* wrap_Font.cpp */, + 202650DE4F267CD3082A1B30 /* wrap_Font.h */, + ); + path = freetype; + sourceTree = ""; + }; + 130737AF4BD12D0356A65C87 /* mouse */ = { + isa = PBXGroup; + children = ( + FA3D9E0B16E68DE600CA6630 /* Cursor.cpp */, + FA3D9E0C16E68DE600CA6630 /* Cursor.h */, + 31E0110E5797041465FF5F95 /* Mouse.cpp */, + 63A63DFB339266AC401B545A /* Mouse.h */, + 1E017A8673D531394B5A3B16 /* sdl */, + FA3D9E1316E6D41000CA6630 /* wrap_Cursor.cpp */, + FA3D9E1416E6D41000CA6630 /* wrap_Cursor.h */, + 22EF17981EBD442773FE41B6 /* wrap_Mouse.cpp */, + 4E972C114A6C25A63B5B6EF2 /* wrap_Mouse.h */, + ); + path = mouse; + sourceTree = ""; + }; + 1350109F709C227D4AFD423C /* libluasocket */ = { + isa = PBXGroup; + children = ( + FA7175A9178E8418001FE7FE /* lua.h */, + 1CD02D1975803957282F28AB /* auxiliar.c */, + 1F6F652A57F8098E5CCA6F9A /* auxiliar.h */, + 21B25A7E333315172B754D4F /* buffer.c */, + 7A0A2BB707F44CAD12694679 /* buffer.h */, + 49496EAF3305281B19223C22 /* except.c */, + 17C730CB1DA01B8F0A11217C /* except.h */, + 048C39D14DA05F5843FE08CA /* ftp.lua.h */, + 16C36B3C59A10CDC7ACE0DD4 /* http.lua.h */, + 610B475400DE0F7213352BC3 /* inet.c */, + 459946CA7F4406B026E80501 /* inet.h */, + 135801A6483528800C676492 /* io.c */, + 4ABD4A7B5CB6678E39490982 /* io.h */, + 53C6151E07FB1E3471590CB9 /* ltn12.lua.h */, + 5FAE2A9679C97F2C2792182D /* luasocket.c */, + 329915E84B0B6D025DDC34A9 /* luasocket.h */, + 00393E4930202C2B6E381F68 /* mime.c */, + 485645C663D372A96DFD33F7 /* mime.h */, + 54E653E84E8873D467C750FC /* mime.lua.h */, + 5F846B49240D52C10F6F76E5 /* options.c */, + 249015D170563D85709D7B6D /* options.h */, + 415E1438178736BE0EA908D5 /* select.c */, + 17E9544103AE376210ED5BAA /* select.h */, + 7D48236B78EA06D346A86E3F /* smtp.lua.h */, + 09C71F9D7DC45F5765B2462B /* socket.h */, + 66F8479E6D2D587A592F2024 /* socket.lua.h */, + 22256CC12B7C7D0D1B430D46 /* tcp.c */, + 00D329851B1E7F6A3AF9614E /* tcp.h */, + 4B41232F7AF7793540F46C58 /* timeout.c */, + 1CE84F1F19BC2AA412C638B1 /* timeout.h */, + 6E682862758051BF7C0A10AA /* tp.lua.h */, + 2E2675AF3DAA24CE0728042C /* udp.c */, + 2CAE75B079B828FE6892684A /* udp.h */, + 734947AA28AF36E436D242FD /* unix.c */, + 79A9038A15A324B450010E8B /* unix.h */, + 4B002CBD52493ED9347C6EBA /* url.lua.h */, + 041672ED2CF51FC62F532FDB /* usocket.c */, + 63936FF81D4E14F6534A43BB /* usocket.h */, + ); + path = libluasocket; + sourceTree = ""; + }; + 13730AB030E309FF6E2961F1 /* magpie */ = { + isa = PBXGroup; + children = ( + FAEC808C1711E76C0057279A /* CompressedData.cpp */, + FAEC808D1711E76C0057279A /* CompressedData.h */, + FAE010DE170DE25E006F29D0 /* ddsHandler.cpp */, + FAE010DF170DE25E006F29D0 /* ddsHandler.h */, + 1AA7781A230065F346E2313A /* DevilHandler.cpp */, + 283342E174613897621A43F1 /* DevilHandler.h */, + FA0CDE3B1710F9A50056E8D7 /* FormatHandler.h */, + 505F23A73BFE250833D650E4 /* Image.cpp */, + 68616BD516DB124312B47EB3 /* Image.h */, + FAEC80881710FEA60057279A /* ImageData.cpp */, + FAEC80891710FEA60057279A /* ImageData.h */, + ); + path = magpie; + sourceTree = ""; + }; + 153D76205F7A4ACD12FB4C0E /* window */ = { + isa = PBXGroup; + children = ( + 63082CBA23A6046C60DA1C6F /* sdl */, + 351B09E51FDC338622F44624 /* Window.cpp */, + 7423362764CF57574BB16CDA /* Window.h */, + FA9FC0AE173D6E3E005027FF /* wrap_Window.cpp */, + FA9FC0AF173D6E3E005027FF /* wrap_Window.h */, + ); + path = window; + sourceTree = ""; + }; + 18AF317B298302545C386404 /* Dynamics */ = { + isa = PBXGroup; + children = ( + 7DE032B3334E559969264529 /* Contacts */, + 68027AB25AAF234679615C14 /* Joints */, + 120B391518206E964493126C /* b2Body.cpp */, + 079504CB332E415D4B27797B /* b2Body.h */, + 2A6150F7479D21346EC54B68 /* b2ContactManager.cpp */, + 7F4B2A3860273D89294A44F4 /* b2ContactManager.h */, + 059C04C13F3A7C05570F2987 /* b2Fixture.cpp */, + 50F0575E16561864699E41F5 /* b2Fixture.h */, + 59BE634A2ACE722F14B86F89 /* b2Island.cpp */, + 5100177E5D8A14366C5B0BC5 /* b2Island.h */, + 6D822D830EF049417D184372 /* b2TimeStep.h */, + 0D6F00D95C4407BB26E71E02 /* b2World.cpp */, + 325E60A57F2624766A524423 /* b2World.h */, + 0F8D03F1544476B57CA97B01 /* b2WorldCallbacks.cpp */, + 4F3E12BD4A646D0366792FC9 /* b2WorldCallbacks.h */, + ); + path = Dynamics; + sourceTree = ""; + }; + 196B6B2E1BC81F47771E6467 /* font */ = { + isa = PBXGroup; + children = ( + 2E9B5D9926034F9172215D5E /* Font.h */, + 12BB56F127170B3709670896 /* freetype */, + 74003CB27FA762A021183AD5 /* GlyphData.cpp */, + 112814480BBF2ED06EED15BF /* GlyphData.h */, + 5D016F4C27EF506C13FE3058 /* ImageRasterizer.cpp */, + 36465ABA28FB06F4333C3F07 /* ImageRasterizer.h */, + 1B1C4E4D288A1D2F29E57B1B /* Rasterizer.cpp */, + 08D24B70441A2496160C0849 /* Rasterizer.h */, + 1B4E22F1388E2B2E76E3377B /* wrap_GlyphData.cpp */, + 3547706F2E7D43212CB40D04 /* wrap_GlyphData.h */, + 11745DE315E859F71E881D76 /* wrap_Rasterizer.cpp */, + 37224F6B30CA5D800B1F41F1 /* wrap_Rasterizer.h */, + ); + path = font; + sourceTree = ""; + }; + 1E017A8673D531394B5A3B16 /* sdl */ = { + isa = PBXGroup; + children = ( + FA3D9E0F16E68EAE00CA6630 /* Cursor.cpp */, + FA3D9E1016E68EAE00CA6630 /* Cursor.h */, + 584E16AE09E12536206C46FE /* Mouse.cpp */, + 198A44BD71BB61EE517C2A39 /* Mouse.h */, + ); + path = sdl; + sourceTree = ""; + }; + 20A8288624E9654322DC388D /* sdl */ = { + isa = PBXGroup; + children = ( + 43BC2B1C505E5EFF650C31E3 /* Keyboard.cpp */, + 057A3770539D25AE6C8F20D3 /* Keyboard.h */, + ); + path = sdl; + sourceTree = ""; + }; + 264B1FF46F2C68D26B7B158D /* openal */ = { + isa = PBXGroup; + children = ( + 6CB1193233FA78EE646A17A1 /* Audio.cpp */, + 1916112F57AF56A173727464 /* Audio.h */, + 601E6A56345412E87E1D396B /* Pool.cpp */, + 62E121F35BEB622029324F25 /* Pool.h */, + 28024635525B077E08A73D9B /* Source.cpp */, + 5B3306B5587A708557EE4D4F /* Source.h */, + ); + path = openal; + sourceTree = ""; + }; + 2F654C0235EB60C744A22507 /* Products */ = { + isa = PBXGroup; + children = ( + FA577AAF16C7507900860150 /* love.framework */, + ); + name = Products; + sourceTree = ""; + }; + 34067FA94AEA4D7C3E103A64 /* box2d */ = { + isa = PBXGroup; + children = ( + 089B1AC1248B21D336594457 /* Body.cpp */, + 6E6D5AB27B71488D405526C3 /* Body.h */, + 0959542C4B54320B1DDD5911 /* ChainShape.cpp */, + 1AA213FC158815FA77C40330 /* ChainShape.h */, + 4DAB28A9235E2CBE75F56848 /* CircleShape.cpp */, + 3C965422252F672D3FF6598C /* CircleShape.h */, + 02CD63315FF902E336AB4657 /* Contact.cpp */, + 5D590ACE5E237B7D5B556AD0 /* Contact.h */, + 34A36BB617BC5CCA5B870EA6 /* DistanceJoint.cpp */, + 457674E43FF71E974D990C00 /* DistanceJoint.h */, + 755C2B980C106EA7423E7E5E /* EdgeShape.cpp */, + 561D4A4722E36BAA16D17CC8 /* EdgeShape.h */, + 47C77F6032FA77E046AA6810 /* Fixture.cpp */, + 60840050412A459D5D21518F /* Fixture.h */, + 1E22646A710E5EFC27FE3932 /* FrictionJoint.cpp */, + 45DC20A760FC42341E5762F7 /* FrictionJoint.h */, + 6F4D478A52A0408765095920 /* GearJoint.cpp */, + 25CE236F66F70EB3444A7CC8 /* GearJoint.h */, + 3EA80A4E0CE0014052076037 /* Joint.cpp */, + 138913BE5126483748FA43D0 /* Joint.h */, + FA0A4BF2182E1AD600E1E4D2 /* MotorJoint.cpp */, + FA0A4BF3182E1AD600E1E4D2 /* MotorJoint.h */, + 3C0B06AF6B5326C840477B18 /* MouseJoint.cpp */, + 208275724C9421035EA145A4 /* MouseJoint.h */, + 370D76DC224F2EB300CB4E2F /* Physics.cpp */, + 5CE370672B1234B10F9532FA /* Physics.h */, + 54E85987318206E93DC8189F /* PolygonShape.cpp */, + 2FF26CC52C28773750B812D9 /* PolygonShape.h */, + 0AE5755936E84C247FB56C65 /* PrismaticJoint.cpp */, + 104D5534669B772556942891 /* PrismaticJoint.h */, + 5CB720BA493D7D995E0E20DD /* PulleyJoint.cpp */, + 0A936C83344E2CF84E703059 /* PulleyJoint.h */, + 36DD053F754B2D29719B1F80 /* RevoluteJoint.cpp */, + 5CE0167703887B376F2368FD /* RevoluteJoint.h */, + 53C4064801456193163E4631 /* RopeJoint.cpp */, + 4F34010A575C02E66D400CE2 /* RopeJoint.h */, + 61E64F07028039774F502D69 /* Shape.cpp */, + 0EB870A1180261FD424A41B3 /* Shape.h */, + 78E50525407567F863476E27 /* WeldJoint.cpp */, + 465D0438379342C4589E2B1C /* WeldJoint.h */, + 44DE79C879CC0074510A2403 /* WheelJoint.cpp */, + 6AA03CE31B942DC660045FE9 /* WheelJoint.h */, + 644D0C953C3439FC57C03FC6 /* World.cpp */, + 7A707F7A60B47A091107144B /* World.h */, + 64694F91593478085859666F /* wrap_Body.cpp */, + 1A311FC16B9C0F8D7A41580E /* wrap_Body.h */, + 1CAA69E00D0808BA2108238B /* wrap_ChainShape.cpp */, + 70564CC32DEC209F2A615F44 /* wrap_ChainShape.h */, + 6EF321185C2B1F1E1AF54F64 /* wrap_CircleShape.cpp */, + 15093E1B1A14176374C81299 /* wrap_CircleShape.h */, + 3BB22A142670197B0DBD0BED /* wrap_Contact.cpp */, + 21E975B81E8D701F2147658C /* wrap_Contact.h */, + 69967D2323404E1F0ED21F11 /* wrap_DistanceJoint.cpp */, + 18E0492204644DE929B96486 /* wrap_DistanceJoint.h */, + 40F412FF29F65F5A3D511B98 /* wrap_EdgeShape.cpp */, + 276C3474657D0A246F64221C /* wrap_EdgeShape.h */, + 7F796B7A3362196075C62E61 /* wrap_Fixture.cpp */, + 5F1F169C7FC633EF292E26DF /* wrap_Fixture.h */, + 340345481F165F8945C716AE /* wrap_FrictionJoint.cpp */, + 0EA87794395D3B287C5949AA /* wrap_FrictionJoint.h */, + 50B67F2D0CC511706810302E /* wrap_GearJoint.cpp */, + 7BAB25936D207169591A666A /* wrap_GearJoint.h */, + 71810207414B52F8340D7797 /* wrap_Joint.cpp */, + 047815B73C1C5373551442A6 /* wrap_Joint.h */, + FA0A4BF6182E260200E1E4D2 /* wrap_MotorJoint.cpp */, + FA0A4BF7182E260200E1E4D2 /* wrap_MotorJoint.h */, + 4D81102E7ABD1C282BE42CE3 /* wrap_MouseJoint.cpp */, + 64BA1CE328FF17144B475111 /* wrap_MouseJoint.h */, + 6CEB48E969FC42C53F9432B1 /* wrap_Physics.cpp */, + 71C579A557640A3E2A696518 /* wrap_Physics.h */, + 3AD03C7A77C546ED07BE4C06 /* wrap_PolygonShape.cpp */, + 78073FEB0F54031B1A3A56FD /* wrap_PolygonShape.h */, + 0B4020CD058D70F569DF6129 /* wrap_PrismaticJoint.cpp */, + 2B8C245A21A515E86636725A /* wrap_PrismaticJoint.h */, + 1E840AF84AB61C6410E26634 /* wrap_PulleyJoint.cpp */, + 762E57DE65A626FA1F6D4305 /* wrap_PulleyJoint.h */, + 1F3A277A44141DBF7BCF146A /* wrap_RevoluteJoint.cpp */, + 2912092853050AF9785F39BE /* wrap_RevoluteJoint.h */, + 0E3E13BC3E3A7C0C7DBE7DF8 /* wrap_RopeJoint.cpp */, + 75C0197971FE16926CDA624A /* wrap_RopeJoint.h */, + 124E716E0BCA055534A60AD2 /* wrap_Shape.cpp */, + 02F064F5202E34F5718352B8 /* wrap_Shape.h */, + 3DFF31EE26405E554C610C8F /* wrap_WeldJoint.cpp */, + 131F69C3368C4B8A55EE0DAD /* wrap_WeldJoint.h */, + 73473B3C698B538002540A5D /* wrap_WheelJoint.cpp */, + 0AFB7DA45B2D6913110A5AAB /* wrap_WheelJoint.h */, + 36324E12371E518E6E9C61B5 /* wrap_World.cpp */, + 27F777AB188D674F30BC1829 /* wrap_World.h */, + ); + path = box2d; + sourceTree = ""; + }; + 352E6C5F6F8A681766EB5299 /* scripts */ = { + isa = PBXGroup; + children = ( + FA577A8C16C71D3600860150 /* auto.lua */, + FA577A8D16C71D3600860150 /* boot.lua */, + 503971A86B7167A91B670FBA /* boot.lua.h */, + FA577A8E16C71D3600860150 /* graphics.lua */, + 104144AB73A974BC04A03131 /* graphics.lua.h */, + ); + name = scripts; + path = ../../src/scripts; + sourceTree = ""; + }; + 36C14C81334735EC54E33637 /* utf8 */ = { + isa = PBXGroup; + children = ( + 5CB1063C6DF04E2E409F2DB0 /* utf8 */, + 1BCD6EE50EB8791E5A870135 /* utf8.h */, + ); + path = utf8; + sourceTree = ""; + }; + 36DA23075AF92B22676D34C9 /* audio */ = { + isa = PBXGroup; + children = ( + 1839744763625B5D64EC70AC /* Audio.cpp */, + 24EE059E03D8155F4BFF64D6 /* Audio.h */, + 7DB6750C1F01062849171B8B /* null */, + 264B1FF46F2C68D26B7B158D /* openal */, + 2FB732687B1669402408356D /* Source.cpp */, + 46CA2B6B17C32BBE55772268 /* Source.h */, + 02CA1BE908D91B104EB9590F /* wrap_Audio.cpp */, + 5FF97D522B8872947DED611C /* wrap_Audio.h */, + 02662CBC29B954295A634A39 /* wrap_Source.cpp */, + 330F59B11A5B5D1B44DC07BF /* wrap_Source.h */, + ); + path = audio; + sourceTree = ""; + }; + 3AED1DE005A53DDB07902760 /* luasocket */ = { + isa = PBXGroup; + children = ( + 1350109F709C227D4AFD423C /* libluasocket */, + 2DC90F3C6160198256795C75 /* luasocket.cpp */, + 6B2E52E6185E6980660F1374 /* luasocket.h */, + ); + path = luasocket; + sourceTree = ""; + }; + 3D490B3A36B935BD14B05986 /* Collision */ = { + isa = PBXGroup; + children = ( + 7BC957592F43649453A57B23 /* Shapes */, + 4B5F4DF8110020A96B5D3EAB /* b2BroadPhase.cpp */, + 32FD3FEE52FD1911405B3C59 /* b2BroadPhase.h */, + 7E7A068041FD553876712F05 /* b2CollideCircle.cpp */, + 1B036C7C5A8832AE53BB1C06 /* b2CollideEdge.cpp */, + 427B4B2517C0516844370E3D /* b2CollidePolygon.cpp */, + 32CC11481CD9164455455D72 /* b2Collision.cpp */, + 7F911CF2107B22F44C5B2542 /* b2Collision.h */, + 175A1B8D733B2D4803F64AC1 /* b2Distance.cpp */, + 034144EE6C33421377674516 /* b2Distance.h */, + 59D27EA33E8E62E15C185948 /* b2DynamicTree.cpp */, + 11CF30E73CEA2D8D0A1B17D3 /* b2DynamicTree.h */, + 1F0D375C38A245E403E53DB5 /* b2TimeOfImpact.cpp */, + 1C5B57F87B315E39005B119F /* b2TimeOfImpact.h */, + ); + path = Collision; + sourceTree = ""; + }; + 47217E6729AC72E74FF651E3 /* lullaby */ = { + isa = PBXGroup; + children = ( + 4E15567759041CC379292BE6 /* Decoder.cpp */, + 733758E8028B20BB799A7BE6 /* Decoder.h */, + 4A774BC26B7235E410D40C8E /* FLACDecoder.cpp */, + 3C9253C8152355E1274814B7 /* FLACDecoder.h */, + 02F0197227150E1B28D9425B /* GmeDecoder.cpp */, + 64AC15B600F2473651823D40 /* GmeDecoder.h */, + 407422E8589417B6683D1042 /* ModPlugDecoder.cpp */, + 31C84D0129AE5F6044A94AC2 /* ModPlugDecoder.h */, + 1F875B224C4E1B9E35854766 /* Mpg123Decoder.cpp */, + 6B255FFC4A2C404E50512CB5 /* Mpg123Decoder.h */, + 2A5F7DCB40652F9B7D61073A /* Sound.cpp */, + 77234CEE2EFE633537975850 /* Sound.h */, + 727648E06CD863A2582F798F /* VorbisDecoder.cpp */, + 4A80315175C5625804AA4A56 /* VorbisDecoder.h */, + FAF670541818501300DBDEEA /* WaveDecoder.cpp */, + FAF670551818501300DBDEEA /* WaveDecoder.h */, + ); + path = lullaby; + sourceTree = ""; + }; + 48DE0A5A52042D0361883E40 /* libraries */ = { + isa = PBXGroup; + children = ( + 63287ED84D0F2EEB65D249A3 /* Box2D */, + FAE010D7170DDE99006F29D0 /* ddsparse */, + FA5FDC5E1788D548002F0ED2 /* enet */, + FA9A1008182A0D5200106F9F /* glad */, + 3AED1DE005A53DDB07902760 /* luasocket */, + FA0354691731F3A700284828 /* noise1234 */, + 36C14C81334735EC54E33637 /* utf8 */, + FAF6704318184FF800DBDEEA /* Wuff */, + ); + name = libraries; + path = ../../src/libraries; + sourceTree = ""; + }; + 4BAB08EE4A6B4A1A01DA50A4 /* sound */ = { + isa = PBXGroup; + children = ( + 43A258C229C75C15238E520C /* Decoder.h */, + 47217E6729AC72E74FF651E3 /* lullaby */, + 30ED4BB03C5F11254AF12E98 /* Sound.cpp */, + 23985AB32E7B463A2CB87E2C /* Sound.h */, + 0C5C6C6E47851D1308411DE6 /* SoundData.cpp */, + 785D31764A1D6CDE21BC6404 /* SoundData.h */, + 5CF629B94C7802D446D61C45 /* wrap_Decoder.cpp */, + 782A153A1E6314CB583250E0 /* wrap_Decoder.h */, + 385902BD584E7D73154E4EBB /* wrap_Sound.cpp */, + 3960064616E26C0213E323E2 /* wrap_Sound.h */, + 4DC3617831763D2760335D87 /* wrap_SoundData.cpp */, + 5B5A0BEC36BE007E6E491396 /* wrap_SoundData.h */, + ); + path = sound; + sourceTree = ""; + }; + 4E2517690E6C64EB07D164F7 /* event */ = { + isa = PBXGroup; + children = ( + 24265680279E30A40DF81946 /* Event.cpp */, + 4F1862D324C9429157A27A2E /* Event.h */, + 09000F404D44660029EF38F0 /* sdl */, + ); + path = event; + sourceTree = ""; + }; + 501126AD67DC2A4B527654EA /* joystick */ = { + isa = PBXGroup; + children = ( + FAB0078D1740C12D00A9664D /* Joystick.cpp */, + FAB0078E1740C12D00A9664D /* Joystick.h */, + 4C606AEC342457600C3F0741 /* JoystickModule.h */, + 687216AD6FA406C838284B91 /* sdl */, + ); + path = joystick; + sourceTree = ""; + }; + 54067CFB7D564E5764FA17DC /* love */ = { + isa = PBXGroup; + children = ( + 07571BBD29A9184E2F465E28 /* common */, + 48DE0A5A52042D0361883E40 /* libraries */, + 548A533617C45319431D3ECF /* modules */, + 352E6C5F6F8A681766EB5299 /* scripts */, + FA577A6616C7199700860150 /* Frameworks */, + FA08F5AC16C751BA00F007B5 /* Resources */, + 2F654C0235EB60C744A22507 /* Products */, + ); + name = love; + sourceTree = ""; + usesTabs = 1; + }; + 548A533617C45319431D3ECF /* modules */ = { + isa = PBXGroup; + children = ( + 36DA23075AF92B22676D34C9 /* audio */, + 4E2517690E6C64EB07D164F7 /* event */, + 7B0734182055607468261A5E /* filesystem */, + 196B6B2E1BC81F47771E6467 /* font */, + 586900D11BD011D949F45D7D /* graphics */, + 003F4BA82B6046BC133B3F0F /* image */, + 501126AD67DC2A4B527654EA /* joystick */, + 752A4B4672B6166A2CA30E85 /* keyboard */, + 70C250C41ADF59C0697925C2 /* love */, + FA7C937116DCC6C2006F2BEE /* math */, + 130737AF4BD12D0356A65C87 /* mouse */, + 67F10C1D58A96C1C53563B5C /* physics */, + 4BAB08EE4A6B4A1A01DA50A4 /* sound */, + FA34E7CA174B512200E04D3F /* system */, + 02E0744773D13AD65E7C49DC /* thread */, + 6D590DDD41E72A60262E4A4F /* timer */, + 153D76205F7A4ACD12FB4C0E /* window */, + ); + name = modules; + path = ../../src/modules; + sourceTree = ""; + }; + 586900D11BD011D949F45D7D /* graphics */ = { + isa = PBXGroup; + children = ( + 4941079838020ECA049B5C21 /* Color.h */, + 58BA2BB460AF3C591B22690E /* Drawable.cpp */, + 5D93601669875EE06721689E /* Drawable.h */, + FAC86E661724555D00EED715 /* DrawQable.h */, + 03F17FF546D637744E263961 /* Graphics.cpp */, + 777352284E262F48543E6E7F /* Graphics.h */, + 58CC50E70A375FDF53EF01B6 /* Image.cpp */, + 1DA41DFF0869489411A71AFC /* Image.h */, + 75093EE94918576801F50993 /* opengl */, + FAC86E671724555D00EED715 /* Quad.cpp */, + FAC86E681724555D00EED715 /* Quad.h */, + 4B731754147B27AF73AC5358 /* Volatile.cpp */, + 0CFF64090F0F4F481BB80CF0 /* Volatile.h */, + ); + path = graphics; + sourceTree = ""; + }; + 59207AEF0DE97A632CE30FE6 /* Rope */ = { + isa = PBXGroup; + children = ( + 4832527C02C105776536438A /* b2Rope.cpp */, + 1A95437F513E662113AC154A /* b2Rope.h */, + ); + path = Rope; + sourceTree = ""; + }; + 5CB1063C6DF04E2E409F2DB0 /* utf8 */ = { + isa = PBXGroup; + children = ( + 3C4D70E82FC12A9A15EC39BA /* checked.h */, + 74EE403977734BA53DDF16F0 /* core.h */, + 7CA02BF51EBA65C263E15250 /* unchecked.h */, + ); + path = utf8; + sourceTree = ""; + }; + 5CFF12567FFB5C5166631693 /* sdl */ = { + isa = PBXGroup; + children = ( + 113269E55FCF208D2D6754BC /* Timer.cpp */, + 6BEE6511475F641A70A0591E /* Timer.h */, + ); + path = sdl; + sourceTree = ""; + }; + 63082CBA23A6046C60DA1C6F /* sdl */ = { + isa = PBXGroup; + children = ( + 6CDD4F3320303D222C180CD0 /* Window.cpp */, + 7EC570BC74C369747ED0183A /* Window.h */, + ); + path = sdl; + sourceTree = ""; + }; + 63287ED84D0F2EEB65D249A3 /* Box2D */ = { + isa = PBXGroup; + children = ( + 7B7A47F267D77A570D995658 /* Box2D.h */, + 3D490B3A36B935BD14B05986 /* Collision */, + 71F67B4A51CC637C6D113715 /* Common */, + 18AF317B298302545C386404 /* Dynamics */, + 59207AEF0DE97A632CE30FE6 /* Rope */, + ); + path = Box2D; + sourceTree = ""; + }; + 64DD03B45BF6265723662DAF /* physfs */ = { + isa = PBXGroup; + children = ( + 4E0F565B03D05C3722496F27 /* File.cpp */, + 47D46915001F342A3CD23E86 /* File.h */, + 6DE3129F3A0B2D9C178118F3 /* Filesystem.cpp */, + 219636CF6780074F7871463D /* Filesystem.h */, + 6C367AE309C453C412D91363 /* wrap_File.cpp */, + 52E15B702C40593D3BF431DF /* wrap_File.h */, + 597478A255B82B56488B4717 /* wrap_FileData.cpp */, + 3512460642B046876D687B22 /* wrap_FileData.h */, + 1E827AE8548C52493ED95629 /* wrap_Filesystem.cpp */, + 5DC271240F0119AE16FA1B8E /* wrap_Filesystem.h */, + ); + path = physfs; + sourceTree = ""; + }; + 67F10C1D58A96C1C53563B5C /* physics */ = { + isa = PBXGroup; + children = ( + 2DCE45C868A0091B762C7377 /* Body.cpp */, + 286660042F9654F61AB90D7A /* Body.h */, + 69DB4423147C7E3362941E75 /* Joint.cpp */, + 065364DB7A29396C777213D0 /* Joint.h */, + 70F425B5336E1CD652827FD0 /* Shape.cpp */, + 00744BD73BFE3F591537728F /* Shape.h */, + 34067FA94AEA4D7C3E103A64 /* box2d */, + ); + path = physics; + sourceTree = ""; + }; + 68027AB25AAF234679615C14 /* Joints */ = { + isa = PBXGroup; + children = ( + 33627AE97E66147E76804EF9 /* b2DistanceJoint.cpp */, + 086B4A4E025B4B5F606747A2 /* b2DistanceJoint.h */, + 13093ADC78426C5009DF3B13 /* b2FrictionJoint.cpp */, + 78C0420E2548523B241E3D61 /* b2FrictionJoint.h */, + 69A01D71103275D451F965B2 /* b2GearJoint.cpp */, + 6590063A6E4B3AEF4550443C /* b2GearJoint.h */, + 6F1B61350B6B36AF216C57D7 /* b2Joint.cpp */, + 10F83B5848B77A937C250FEB /* b2Joint.h */, + FA0A4BEE182E0C2800E1E4D2 /* b2MotorJoint.cpp */, + FA0A4BEF182E0C2800E1E4D2 /* b2MotorJoint.h */, + 4A47384208BE218F688C4EFA /* b2MouseJoint.cpp */, + 0AA1539E66B2641B66130709 /* b2MouseJoint.h */, + 1E27263847302FCA1F843B47 /* b2PrismaticJoint.cpp */, + 64491E98483728D601110EF0 /* b2PrismaticJoint.h */, + 66EC3C0463A703A97445193B /* b2PulleyJoint.cpp */, + 7A840CB020803B7C6C097CD1 /* b2PulleyJoint.h */, + 11D62E873092729B497B447F /* b2RevoluteJoint.cpp */, + 774434E1581A23EC1B0F1E6F /* b2RevoluteJoint.h */, + 38AF72D4790619BB022E2AEF /* b2RopeJoint.cpp */, + 2C970EA7229F20934C72581D /* b2RopeJoint.h */, + 5BCC49F529F726385CD41FA6 /* b2WeldJoint.cpp */, + 2D290E902C451D6849051FEF /* b2WeldJoint.h */, + 0602250B7E4664E43CA113DC /* b2WheelJoint.cpp */, + 23A266CD4FC729355E23606E /* b2WheelJoint.h */, + ); + path = Joints; + sourceTree = ""; + }; + 687216AD6FA406C838284B91 /* sdl */ = { + isa = PBXGroup; + children = ( + FAB007911740C28900A9664D /* Joystick.cpp */, + FAB007921740C28900A9664D /* Joystick.h */, + 55B425307C0C1C4B3EFC3A5F /* JoystickModule.cpp */, + 439E46D768A266780E894800 /* JoystickModule.h */, + FAB007951740C87D00A9664D /* wrap_Joystick.cpp */, + FAB007961740C87D00A9664D /* wrap_Joystick.h */, + 139411436818381E493F00F5 /* wrap_JoystickModule.cpp */, + 2D7B7DEC4FC87878332E41B3 /* wrap_JoystickModule.h */, + ); + path = sdl; + sourceTree = ""; + }; + 6D590DDD41E72A60262E4A4F /* timer */ = { + isa = PBXGroup; + children = ( + 5CFF12567FFB5C5166631693 /* sdl */, + 2D9475890CDA3D3776435622 /* Timer.h */, + 695E4ED13AA0689E64280573 /* wrap_Timer.cpp */, + 7F575BE9573C654B5ED44CC1 /* wrap_Timer.h */, + ); + path = timer; + sourceTree = ""; + }; + 70C250C41ADF59C0697925C2 /* love */ = { + isa = PBXGroup; + children = ( + 19ED419874B46EC16F927524 /* love.cpp */, + 10A608C96F067F972C962EFB /* love.h */, + ); + path = love; + sourceTree = ""; + }; + 71F67B4A51CC637C6D113715 /* Common */ = { + isa = PBXGroup; + children = ( + 55A759CE711E157339930E58 /* b2BlockAllocator.cpp */, + 0F0E666B7C790BB870477994 /* b2BlockAllocator.h */, + 12390CBC115B00D06EF951DD /* b2Draw.cpp */, + 343E66751EBA75264C3400FA /* b2Draw.h */, + 3AC7627D7E1458AA0D8E0522 /* b2GrowableStack.h */, + 2C78323D7D5C628A53EC6931 /* b2Math.cpp */, + 0A0A2DA4094130187F655E52 /* b2Math.h */, + 6FF15DF4423F6426224024C9 /* b2Settings.cpp */, + 090F537B70DA06EA0B29593F /* b2Settings.h */, + 780D5B6358096BEB1F1336EE /* b2StackAllocator.cpp */, + 567C0A0C58931DE54733011B /* b2StackAllocator.h */, + 239054AE7475433E39747DA9 /* b2Timer.cpp */, + 525A4D633D9B0D8B225936D4 /* b2Timer.h */, + ); + path = Common; + sourceTree = ""; + }; + 75093EE94918576801F50993 /* opengl */ = { + isa = PBXGroup; + children = ( + 4AD52074367950B735707CE1 /* Canvas.cpp */, + 23573F2F4F7D56312E663E24 /* Canvas.h */, + 583037E9238A6EF00DD20B1A /* Font.cpp */, + 7EFA04373ADC5CC24DCB5824 /* Font.h */, + 11773415762F3A38421C6DB3 /* Graphics.cpp */, + 389E3CEC356050A27784290E /* Graphics.h */, + 56D6030A0B8F7397715062B9 /* Image.cpp */, + 3CFE5C4A12D5675E7C9C7BF9 /* Image.h */, + FAF4376D17F4AC530074F9E2 /* Mesh.cpp */, + FAF4376E17F4AC530074F9E2 /* Mesh.h */, + 2E406F8328543EC63EB922C6 /* OpenGL.cpp */, + 2C87695707B046B536F347D8 /* OpenGL.h */, + 48A206C9004150640C432100 /* ParticleSystem.cpp */, + 53EE57FF4DBD52BB22701160 /* ParticleSystem.h */, + FA435EA117B36E9C004C3F22 /* Polyline.cpp */, + FA435EA217B36E9C004C3F22 /* Polyline.h */, + FA577A8516C71CF000860150 /* Shader.cpp */, + FA577A8616C71CF000860150 /* Shader.h */, + 4D700D182EAA46273D1E2CC4 /* SpriteBatch.cpp */, + 727D23FA1CC755B902471A45 /* SpriteBatch.h */, + 426B1C4475DC54505B824B7F /* VertexBuffer.cpp */, + 577B66502A5360AE60733B10 /* VertexBuffer.h */, + 4E3251027026699A1D4D310D /* wrap_Canvas.cpp */, + 3AFB3A18384A2D22352262B1 /* wrap_Canvas.h */, + 7A3B52AF1FBE73FC36AD50C8 /* wrap_Font.cpp */, + 3CDA3E9B364F17A902384AAC /* wrap_Font.h */, + 1A9810F758AC1D1E4B6431FD /* wrap_Graphics.cpp */, + 05DF237B657042515F3B4E52 /* wrap_Graphics.h */, + 14AE68E14C2C74526A612FA0 /* wrap_Image.cpp */, + 78A2127828793F7A778D7932 /* wrap_Image.h */, + FA7AA59017F6AC1F00704BE2 /* wrap_Mesh.cpp */, + FA7AA59117F6AC1F00704BE2 /* wrap_Mesh.h */, + 5F42052D7C8271A1105541DE /* wrap_ParticleSystem.cpp */, + 678E42771C9B415628A3234D /* wrap_ParticleSystem.h */, + FAC86E611724552C00EED715 /* wrap_Quad.cpp */, + FAC86E621724552C00EED715 /* wrap_Quad.h */, + FA577A8716C71CF000860150 /* wrap_Shader.cpp */, + FA577A8816C71CF000860150 /* wrap_Shader.h */, + 02C16FDB537A702F4D42534E /* wrap_SpriteBatch.cpp */, + 2BE75A693BE206B22DAE1B2E /* wrap_SpriteBatch.h */, + ); + path = opengl; + sourceTree = ""; + }; + 752A4B4672B6166A2CA30E85 /* keyboard */ = { + isa = PBXGroup; + children = ( + 524741891BB93848039F4174 /* Keyboard.cpp */, + 6C981DA13E3D42DA06891046 /* Keyboard.h */, + 20A8288624E9654322DC388D /* sdl */, + 19F40DF6507028212FEB1D77 /* wrap_Keyboard.cpp */, + 003142374F3D40A518716024 /* wrap_Keyboard.h */, + ); + path = keyboard; + sourceTree = ""; + }; + 7B0734182055607468261A5E /* filesystem */ = { + isa = PBXGroup; + children = ( + 11D141087979064B441B787D /* File.cpp */, + 31A444CF0B4E6DA450120730 /* File.h */, + 62370A494F9D6E2D570065EB /* FileData.cpp */, + 54A13C2209F945671BC27974 /* FileData.h */, + 64DD03B45BF6265723662DAF /* physfs */, + ); + path = filesystem; + sourceTree = ""; + }; + 7BC957592F43649453A57B23 /* Shapes */ = { + isa = PBXGroup; + children = ( + 4E6705C154C34FBD143F465E /* b2ChainShape.cpp */, + 6C7E6C3F1CCA1CF6164123F6 /* b2ChainShape.h */, + 08AA5965073A1C520A7A6833 /* b2CircleShape.cpp */, + 153957EB332E1269671E7F4A /* b2CircleShape.h */, + 633E37194CB535AE41A00092 /* b2EdgeShape.cpp */, + 448C492C7AEB7840504F1C9D /* b2EdgeShape.h */, + 08983C025D0655270DF81A5B /* b2PolygonShape.cpp */, + 0E755DCF691828CE11444877 /* b2PolygonShape.h */, + 2FD366F113387BC95125133D /* b2Shape.h */, + ); + path = Shapes; + sourceTree = ""; + }; + 7DB6750C1F01062849171B8B /* null */ = { + isa = PBXGroup; + children = ( + 7CC5707C79175FA6427B3D62 /* Audio.cpp */, + 2E5C2A2F05417B294ED655E8 /* Audio.h */, + 1A304E384AF2119905C01504 /* Source.cpp */, + 104D567660003ADE696D341A /* Source.h */, + ); + path = null; + sourceTree = ""; + }; + 7DE032B3334E559969264529 /* Contacts */ = { + isa = PBXGroup; + children = ( + 468F7A0A484820DE79CE76D2 /* b2ChainAndCircleContact.cpp */, + 174D472C1AFE594D77A0322B /* b2ChainAndCircleContact.h */, + 60C95C7F507A381D0A483B3F /* b2ChainAndPolygonContact.cpp */, + 44E85D982F01082F5E1346B6 /* b2ChainAndPolygonContact.h */, + 58792BC1126C2917432D706B /* b2CircleContact.cpp */, + 21124F915912499179A42115 /* b2CircleContact.h */, + 71F878E2440A021B68D93ABC /* b2Contact.cpp */, + 50EC67CE3ED71F5D13304FD4 /* b2Contact.h */, + 1E9E4F657DEC2772493B79CC /* b2ContactSolver.cpp */, + 5A1C77401B1B32CE326332A1 /* b2ContactSolver.h */, + 1108594E361A22D90D6022E8 /* b2EdgeAndCircleContact.cpp */, + 0A420541704C1C2D718A4D20 /* b2EdgeAndCircleContact.h */, + 243E18977E2A37CC6FDD55A5 /* b2EdgeAndPolygonContact.cpp */, + 5DA322AC59AD7E43183577CB /* b2EdgeAndPolygonContact.h */, + 31871B8B7E1A697A73576040 /* b2PolygonAndCircleContact.cpp */, + 4A1D6DAE45E627BD12903B52 /* b2PolygonAndCircleContact.h */, + 1F4E747212DE41716BC245C9 /* b2PolygonContact.cpp */, + 0A063D006D52330E67FF4B3A /* b2PolygonContact.h */, + ); + path = Contacts; + sourceTree = ""; + }; + FA0354691731F3A700284828 /* noise1234 */ = { + isa = PBXGroup; + children = ( + FA03546A1731F3A700284828 /* simplexnoise1234.cpp */, + FA03546B1731F3A700284828 /* simplexnoise1234.h */, + ); + path = noise1234; + sourceTree = ""; + }; + FA08F5AC16C751BA00F007B5 /* Resources */ = { + isa = PBXGroup; + children = ( + FA08F5AE16C7525600F007B5 /* Info-Framework.plist */, + ); + name = Resources; + sourceTree = ""; + }; + FA34E7CA174B512200E04D3F /* system */ = { + isa = PBXGroup; + children = ( + FA34E7CF174B514F00E04D3F /* sdl */, + FA34E7CB174B513F00E04D3F /* System.cpp */, + FA34E7CC174B513F00E04D3F /* System.h */, + FA34E7D4174B55AF00E04D3F /* wrap_System.cpp */, + FA34E7D5174B55AF00E04D3F /* wrap_System.h */, + ); + path = system; + sourceTree = ""; + }; + FA34E7CF174B514F00E04D3F /* sdl */ = { + isa = PBXGroup; + children = ( + FA34E7D0174B515D00E04D3F /* System.cpp */, + FA34E7D1174B515D00E04D3F /* System.h */, + ); + path = sdl; + sourceTree = ""; + }; + FA577A6616C7199700860150 /* Frameworks */ = { + isa = PBXGroup; + children = ( + FA9B4A0716E1578300074F42 /* SDL2.framework */, + FA577A7916C71A1700860150 /* Cocoa.framework */, + FA577A6716C719D900860150 /* FreeType.framework */, + FA577A6916C719DE00860150 /* IL.framework */, + FA577A8216C71A5300860150 /* libmodplug.framework */, + FA577A6D16C719EA00860150 /* Lua.framework */, + FA577A6F16C719F000860150 /* mpg123.framework */, + FA577A7116C719F400860150 /* Ogg.framework */, + FAAFF04316CB11C700CCDE45 /* OpenAL-Soft.framework */, + FA577A7C16C71A2600860150 /* OpenGL.framework */, + FA577A7316C719F900860150 /* physfs.framework */, + FA577A7716C71A0800860150 /* Vorbis.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + FA5FDC5E1788D548002F0ED2 /* enet */ = { + isa = PBXGroup; + children = ( + FA5FDC5F1788D548002F0ED2 /* enet.cpp */, + FA5FDC601788D548002F0ED2 /* libenet */, + FA5FDC781788D548002F0ED2 /* lua-enet.h */, + ); + path = enet; + sourceTree = ""; + }; + FA5FDC601788D548002F0ED2 /* libenet */ = { + isa = PBXGroup; + children = ( + FA5FDC611788D548002F0ED2 /* callbacks.c */, + FA5FDC631788D548002F0ED2 /* compress.c */, + FA5FDC641788D548002F0ED2 /* host.c */, + FA5FDC651788D548002F0ED2 /* include */, + FA5FDC711788D548002F0ED2 /* list.c */, + FA5FDC721788D548002F0ED2 /* packet.c */, + FA5FDC731788D548002F0ED2 /* peer.c */, + FA5FDC741788D548002F0ED2 /* protocol.c */, + FA5FDC761788D548002F0ED2 /* unix.c */, + FA5FDC771788D548002F0ED2 /* win32.c */, + ); + path = libenet; + sourceTree = ""; + }; + FA5FDC651788D548002F0ED2 /* include */ = { + isa = PBXGroup; + children = ( + FA5FDC661788D548002F0ED2 /* enet */, + ); + path = include; + sourceTree = ""; + }; + FA5FDC661788D548002F0ED2 /* enet */ = { + isa = PBXGroup; + children = ( + FA5FDC671788D548002F0ED2 /* callbacks.h */, + FA5FDC681788D548002F0ED2 /* enet.h */, + FA5FDC691788D548002F0ED2 /* list.h */, + FA5FDC6A1788D548002F0ED2 /* protocol.h */, + FA5FDC6B1788D548002F0ED2 /* time.h */, + FA5FDC6C1788D548002F0ED2 /* types.h */, + FA5FDC6D1788D548002F0ED2 /* unix.h */, + FA5FDC6E1788D548002F0ED2 /* utility.h */, + FA5FDC6F1788D548002F0ED2 /* win32.h */, + ); + path = enet; + sourceTree = ""; + }; + FA7C937116DCC6C2006F2BEE /* math */ = { + isa = PBXGroup; + children = ( + FAC570FC17402D1100D147E4 /* BezierCurve.cpp */, + FAC570FD17402D1100D147E4 /* BezierCurve.h */, + FA5454C016F1310000D30303 /* MathModule.cpp */, + FA5454C116F1310000D30303 /* MathModule.h */, + FA636D88171B70920065623F /* RandomGenerator.cpp */, + FA636D89171B70920065623F /* RandomGenerator.h */, + FAC570FE17402D1100D147E4 /* wrap_BezierCurve.cpp */, + FAC570FF17402D1100D147E4 /* wrap_BezierCurve.h */, + FA7C937516DCC6C2006F2BEE /* wrap_Math.cpp */, + FA7C937616DCC6C2006F2BEE /* wrap_Math.h */, + FA636D8C171B72A70065623F /* wrap_RandomGenerator.cpp */, + FA636D8D171B72A70065623F /* wrap_RandomGenerator.h */, + ); + path = math; + sourceTree = ""; + }; + FA9A1008182A0D5200106F9F /* glad */ = { + isa = PBXGroup; + children = ( + FA9A1009182A0D5200106F9F /* glad.cpp */, + FA9A100A182A0D5200106F9F /* glad.hpp */, + FA9A100B182A0D5200106F9F /* gladfuncs.hpp */, + ); + path = glad; + sourceTree = ""; + }; + FAE010D7170DDE99006F29D0 /* ddsparse */ = { + isa = PBXGroup; + children = ( + FAE010D8170DDE99006F29D0 /* ddsinfo.h */, + FAE010D9170DDE99006F29D0 /* ddsparse.cpp */, + FAE010DA170DDE99006F29D0 /* ddsparse.h */, + ); + path = ddsparse; + sourceTree = ""; + }; + FAF272B016E3D46400CC193A /* sdl */ = { + isa = PBXGroup; + children = ( + FAF272B116E3D46400CC193A /* Thread.cpp */, + FAF272B216E3D46400CC193A /* Thread.h */, + FAF272B316E3D46400CC193A /* threads.cpp */, + FAF272B416E3D46400CC193A /* threads.h */, + ); + path = sdl; + sourceTree = ""; + }; + FAF6704318184FF800DBDEEA /* Wuff */ = { + isa = PBXGroup; + children = ( + FAF6704418184FF800DBDEEA /* wuff.c */, + FAF6704518184FF800DBDEEA /* wuff.h */, + FAF6704618184FF800DBDEEA /* wuff_config.h */, + FAF6704718184FF800DBDEEA /* wuff_convert.c */, + FAF6704818184FF800DBDEEA /* wuff_convert.h */, + FAF6704918184FF800DBDEEA /* wuff_internal.c */, + FAF6704A18184FF800DBDEEA /* wuff_internal.h */, + FAF6704B18184FF800DBDEEA /* wuff_memory.c */, + ); + path = Wuff; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + FA577AAC16C7507900860150 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + FA7C937B16DCC6C2006F2BEE /* wrap_Math.h in Headers */, + FAF272A516E3D44400CC193A /* Channel.h in Headers */, + FAF272A716E3D44400CC193A /* LuaThread.h in Headers */, + FAF4377017F4AC530074F9E2 /* Mesh.h in Headers */, + FAF272A916E3D44400CC193A /* ThreadModule.h in Headers */, + FAF6705018184FF800DBDEEA /* wuff_convert.h in Headers */, + FA9A100D182A0D5200106F9F /* glad.hpp in Headers */, + FAF272AB16E3D44400CC193A /* wrap_Channel.h in Headers */, + FA0A4BF9182E260200E1E4D2 /* wrap_MotorJoint.h in Headers */, + FAF272AD16E3D44400CC193A /* wrap_LuaThread.h in Headers */, + FAF272AF16E3D44400CC193A /* wrap_ThreadModule.h in Headers */, + FAF272B616E3D46400CC193A /* Thread.h in Headers */, + FAF272B816E3D46400CC193A /* threads.h in Headers */, + FA5454C316F1310000D30303 /* MathModule.h in Headers */, + FAAC6B03170A373B008A61C5 /* CompressedData.h in Headers */, + FAE010DB170DDE99006F29D0 /* ddsinfo.h in Headers */, + FAE010DD170DDE99006F29D0 /* ddsparse.h in Headers */, + FAE010E1170DE25E006F29D0 /* ddsHandler.h in Headers */, + FAE010E5170DF75C006F29D0 /* wrap_CompressedData.h in Headers */, + FAF6704E18184FF800DBDEEA /* wuff_config.h in Headers */, + FA0CDE3D1710F9A50056E8D7 /* FormatHandler.h in Headers */, + FA7AA59317F6AC1F00704BE2 /* wrap_Mesh.h in Headers */, + FAEC808B1710FEA60057279A /* ImageData.h in Headers */, + FAEC808F1711E76C0057279A /* CompressedData.h in Headers */, + FA636D8B171B70920065623F /* RandomGenerator.h in Headers */, + FA636D8F171B72A70065623F /* wrap_RandomGenerator.h in Headers */, + FAC86E641724552C00EED715 /* wrap_Quad.h in Headers */, + FAC86E6A1724555D00EED715 /* DrawQable.h in Headers */, + FAC86E6C1724555D00EED715 /* Quad.h in Headers */, + FA03546D1731F3A700284828 /* simplexnoise1234.h in Headers */, + FA3D9E0E16E68DE600CA6630 /* Cursor.h in Headers */, + FA3D9E1216E68EAE00CA6630 /* Cursor.h in Headers */, + FA3D9E1616E6D41100CA6630 /* wrap_Cursor.h in Headers */, + FA9A100E182A0D5200106F9F /* gladfuncs.hpp in Headers */, + FA9FC0B1173D6E3E005027FF /* wrap_Window.h in Headers */, + FAB007901740C12D00A9664D /* Joystick.h in Headers */, + FAF6705218184FF800DBDEEA /* wuff_internal.h in Headers */, + FAB007941740C28900A9664D /* Joystick.h in Headers */, + FAB007981740C87D00A9664D /* wrap_Joystick.h in Headers */, + FAC5710117402D1100D147E4 /* BezierCurve.h in Headers */, + FAC5710317402D1100D147E4 /* wrap_BezierCurve.h in Headers */, + FA5FDC7E1788D548002F0ED2 /* callbacks.h in Headers */, + FA5FDC7F1788D548002F0ED2 /* enet.h in Headers */, + FA5FDC801788D548002F0ED2 /* list.h in Headers */, + FA5FDC811788D548002F0ED2 /* protocol.h in Headers */, + FA5FDC821788D548002F0ED2 /* time.h in Headers */, + FA5FDC831788D548002F0ED2 /* types.h in Headers */, + FA0A4BF5182E1AD600E1E4D2 /* MotorJoint.h in Headers */, + FA5FDC841788D548002F0ED2 /* unix.h in Headers */, + FA0A4BF1182E0C2800E1E4D2 /* b2MotorJoint.h in Headers */, + FA5FDC851788D548002F0ED2 /* utility.h in Headers */, + FAF6704D18184FF800DBDEEA /* wuff.h in Headers */, + FA5FDC861788D548002F0ED2 /* win32.h in Headers */, + FA5FDC8F1788D548002F0ED2 /* lua-enet.h in Headers */, + FA7175AA178E8418001FE7FE /* lua.h in Headers */, + FA34E7CE174B513F00E04D3F /* System.h in Headers */, + FA34E7D3174B515D00E04D3F /* System.h in Headers */, + FAF670571818501300DBDEEA /* WaveDecoder.h in Headers */, + FA1EF7C51799FEB200FF380C /* wrap_System.h in Headers */, + FA435EA417B36E9C004C3F22 /* Polyline.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + FA577AAE16C7507900860150 /* Framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = FA577ABF16C7507900860150 /* Build configuration list for PBXNativeTarget "Framework" */; + buildPhases = ( + FA577AAA16C7507900860150 /* Sources */, + FA577AAB16C7507900860150 /* Frameworks */, + FA577AAC16C7507900860150 /* Headers */, + FA577AAD16C7507900860150 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Framework; + productName = love; + productReference = FA577AAF16C7507900860150 /* love.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0500; + }; + buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "love-framework" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + en, + ); + mainGroup = 54067CFB7D564E5764FA17DC /* love */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + FA577AAE16C7507900860150 /* Framework */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + FA577AAD16C7507900860150 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FA577AAA16C7507900860150 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FA08F5B016C752F900F007B5 /* Source.cpp in Sources */, + FA08F5B116C752F900F007B5 /* wrap_Audio.cpp in Sources */, + FA08F5B216C752F900F007B5 /* wrap_Source.cpp in Sources */, + FA08F5B316C752FC00F007B5 /* Audio.cpp in Sources */, + FA08F5B416C7530100F007B5 /* Audio.cpp in Sources */, + FA08F5B516C7530100F007B5 /* Source.cpp in Sources */, + FAF6705118184FF800DBDEEA /* wuff_internal.c in Sources */, + FA08F5B616C7530A00F007B5 /* Audio.cpp in Sources */, + FA08F5B716C7530A00F007B5 /* Pool.cpp in Sources */, + FA08F5B816C7530A00F007B5 /* Source.cpp in Sources */, + FA08F5B916C7532A00F007B5 /* b64.cpp in Sources */, + FA08F5BA16C7532A00F007B5 /* delay.cpp in Sources */, + FA08F5BB16C7532A00F007B5 /* Exception.cpp in Sources */, + FA08F5BD16C7532A00F007B5 /* Matrix.cpp in Sources */, + FA08F5BE16C7532A00F007B5 /* Memoizer.cpp in Sources */, + FA08F5BF16C7532A00F007B5 /* Module.cpp in Sources */, + FA08F5C016C7532A00F007B5 /* Object.cpp in Sources */, + FAF670561818501300DBDEEA /* WaveDecoder.cpp in Sources */, + FA08F5C116C7532A00F007B5 /* Reference.cpp in Sources */, + FA08F5C216C7532A00F007B5 /* runtime.cpp in Sources */, + FA08F5C316C7532A00F007B5 /* utf8.cpp in Sources */, + FA08F5C416C7532A00F007B5 /* Variant.cpp in Sources */, + FA08F5C516C7532A00F007B5 /* Vector.cpp in Sources */, + FA08F5C616C7532A00F007B5 /* wrap_Data.cpp in Sources */, + FA08F5C716C7533C00F007B5 /* b2BroadPhase.cpp in Sources */, + FA08F5C816C7533C00F007B5 /* b2CollideCircle.cpp in Sources */, + FA08F5C916C7533C00F007B5 /* b2CollideEdge.cpp in Sources */, + FA08F5CA16C7533C00F007B5 /* b2CollidePolygon.cpp in Sources */, + FA08F5CB16C7533C00F007B5 /* b2Collision.cpp in Sources */, + FA08F5CC16C7533C00F007B5 /* b2Distance.cpp in Sources */, + FA08F5CD16C7533C00F007B5 /* b2DynamicTree.cpp in Sources */, + FA08F5CE16C7533C00F007B5 /* b2TimeOfImpact.cpp in Sources */, + FA08F5CF16C7534400F007B5 /* b2ChainShape.cpp in Sources */, + FA08F5D016C7534400F007B5 /* b2CircleShape.cpp in Sources */, + FA08F5D116C7534400F007B5 /* b2EdgeShape.cpp in Sources */, + FA08F5D216C7534400F007B5 /* b2PolygonShape.cpp in Sources */, + FA08F5D316C7535000F007B5 /* b2BlockAllocator.cpp in Sources */, + FA08F5D416C7535000F007B5 /* b2Draw.cpp in Sources */, + FA0A4BF4182E1AD600E1E4D2 /* MotorJoint.cpp in Sources */, + FA08F5D516C7535000F007B5 /* b2Math.cpp in Sources */, + FA08F5D616C7535000F007B5 /* b2Settings.cpp in Sources */, + FA08F5D716C7535000F007B5 /* b2StackAllocator.cpp in Sources */, + FA08F5D816C7535000F007B5 /* b2Timer.cpp in Sources */, + FA08F5D916C7536C00F007B5 /* b2Body.cpp in Sources */, + FA08F5DA16C7536C00F007B5 /* b2ContactManager.cpp in Sources */, + FA08F5DB16C7536C00F007B5 /* b2Fixture.cpp in Sources */, + FA08F5DC16C7536C00F007B5 /* b2Island.cpp in Sources */, + FA08F5DD16C7536C00F007B5 /* b2World.cpp in Sources */, + FA08F5DE16C7536C00F007B5 /* b2WorldCallbacks.cpp in Sources */, + FA08F5DF16C7537B00F007B5 /* b2ChainAndCircleContact.cpp in Sources */, + FA08F5E016C7537B00F007B5 /* b2ChainAndPolygonContact.cpp in Sources */, + FA08F5E116C7537B00F007B5 /* b2CircleContact.cpp in Sources */, + FA08F5E216C7537B00F007B5 /* b2Contact.cpp in Sources */, + FA08F5E316C7537B00F007B5 /* b2ContactSolver.cpp in Sources */, + FA08F5E416C7537B00F007B5 /* b2EdgeAndCircleContact.cpp in Sources */, + FA08F5E516C7537B00F007B5 /* b2EdgeAndPolygonContact.cpp in Sources */, + FA08F5E616C7537B00F007B5 /* b2PolygonAndCircleContact.cpp in Sources */, + FA08F5E716C7537B00F007B5 /* b2PolygonContact.cpp in Sources */, + FA08F5E816C7538F00F007B5 /* b2DistanceJoint.cpp in Sources */, + FA08F5E916C7538F00F007B5 /* b2FrictionJoint.cpp in Sources */, + FA08F5EA16C7538F00F007B5 /* b2GearJoint.cpp in Sources */, + FA08F5EB16C7538F00F007B5 /* b2Joint.cpp in Sources */, + FA08F5EC16C7538F00F007B5 /* b2MouseJoint.cpp in Sources */, + FA08F5ED16C7538F00F007B5 /* b2PrismaticJoint.cpp in Sources */, + FAF6705318184FF800DBDEEA /* wuff_memory.c in Sources */, + FA08F5EE16C7538F00F007B5 /* b2PulleyJoint.cpp in Sources */, + FA08F5EF16C7538F00F007B5 /* b2RevoluteJoint.cpp in Sources */, + FA08F5F016C7538F00F007B5 /* b2RopeJoint.cpp in Sources */, + FA08F5F116C7538F00F007B5 /* b2WeldJoint.cpp in Sources */, + FA08F5F216C7538F00F007B5 /* b2WheelJoint.cpp in Sources */, + FA08F5F316C7539B00F007B5 /* b2Rope.cpp in Sources */, + FA08F5F416C753A400F007B5 /* luasocket.cpp in Sources */, + FA08F5F516C753B800F007B5 /* auxiliar.c in Sources */, + FA08F5F616C753B800F007B5 /* buffer.c in Sources */, + FAF6704F18184FF800DBDEEA /* wuff_convert.c in Sources */, + FA08F5F716C753B800F007B5 /* except.c in Sources */, + FA08F5F816C753B800F007B5 /* inet.c in Sources */, + FA08F5F916C753B800F007B5 /* io.c in Sources */, + FA08F5FA16C753B800F007B5 /* luasocket.c in Sources */, + FA08F5FB16C753B800F007B5 /* mime.c in Sources */, + FA08F5FC16C753B800F007B5 /* options.c in Sources */, + FA08F5FD16C753B800F007B5 /* select.c in Sources */, + FA08F5FE16C753B800F007B5 /* tcp.c in Sources */, + FA08F5FF16C753B800F007B5 /* timeout.c in Sources */, + FA08F60016C753B800F007B5 /* udp.c in Sources */, + FA08F60116C753B800F007B5 /* unix.c in Sources */, + FA08F60216C753B800F007B5 /* usocket.c in Sources */, + FA08F60316C753CE00F007B5 /* Event.cpp in Sources */, + FA08F60416C753CE00F007B5 /* Event.cpp in Sources */, + FA08F60516C753CE00F007B5 /* wrap_Event.cpp in Sources */, + FA08F60616C753DB00F007B5 /* File.cpp in Sources */, + FA08F60716C753DB00F007B5 /* FileData.cpp in Sources */, + FA08F60816C753DB00F007B5 /* File.cpp in Sources */, + FA08F60916C753DB00F007B5 /* Filesystem.cpp in Sources */, + FA08F60A16C753DB00F007B5 /* wrap_File.cpp in Sources */, + FA08F60B16C753DB00F007B5 /* wrap_FileData.cpp in Sources */, + FA08F60C16C753DB00F007B5 /* wrap_Filesystem.cpp in Sources */, + FA08F60D16C753E700F007B5 /* Font.cpp in Sources */, + FA08F60E16C753E700F007B5 /* TrueTypeRasterizer.cpp in Sources */, + FA08F60F16C753E700F007B5 /* wrap_Font.cpp in Sources */, + FA08F61016C753E700F007B5 /* GlyphData.cpp in Sources */, + FA08F61116C753E700F007B5 /* ImageRasterizer.cpp in Sources */, + FA08F61216C753E700F007B5 /* Rasterizer.cpp in Sources */, + FA08F61316C753E700F007B5 /* wrap_GlyphData.cpp in Sources */, + FA08F61416C753E700F007B5 /* wrap_Rasterizer.cpp in Sources */, + FA08F61516C753F600F007B5 /* Drawable.cpp in Sources */, + FA08F61716C753F600F007B5 /* Graphics.cpp in Sources */, + FA08F61816C753F600F007B5 /* Image.cpp in Sources */, + FA08F61A16C753F600F007B5 /* Volatile.cpp in Sources */, + FA08F61B16C7541400F007B5 /* Canvas.cpp in Sources */, + FA08F61C16C7541400F007B5 /* Font.cpp in Sources */, + FA08F61E16C7541400F007B5 /* Graphics.cpp in Sources */, + FAF4376F17F4AC530074F9E2 /* Mesh.cpp in Sources */, + FA08F61F16C7541400F007B5 /* Image.cpp in Sources */, + FA08F62016C7541400F007B5 /* OpenGL.cpp in Sources */, + FA08F62116C7541400F007B5 /* ParticleSystem.cpp in Sources */, + FA08F62316C7541400F007B5 /* Shader.cpp in Sources */, + FA08F62416C7541400F007B5 /* SpriteBatch.cpp in Sources */, + FA08F62516C7541400F007B5 /* VertexBuffer.cpp in Sources */, + FA08F62616C7541400F007B5 /* wrap_Canvas.cpp in Sources */, + FA08F62716C7541400F007B5 /* wrap_Font.cpp in Sources */, + FA08F62816C7541400F007B5 /* wrap_Graphics.cpp in Sources */, + FA08F62916C7541400F007B5 /* wrap_Image.cpp in Sources */, + FA08F62A16C7541400F007B5 /* wrap_ParticleSystem.cpp in Sources */, + FA08F62C16C7541400F007B5 /* wrap_Shader.cpp in Sources */, + FA0A4BFA182E26F500E1E4D2 /* wrap_MotorJoint.cpp in Sources */, + FA08F62D16C7541400F007B5 /* wrap_SpriteBatch.cpp in Sources */, + FA08F62E16C7542600F007B5 /* ImageData.cpp in Sources */, + FA08F62F16C7542600F007B5 /* Image.cpp in Sources */, + FA08F63016C7542600F007B5 /* DevilHandler.cpp in Sources */, + FA08F63116C7542600F007B5 /* wrap_Image.cpp in Sources */, + FA08F63216C7542600F007B5 /* wrap_ImageData.cpp in Sources */, + FA08F63416C7542D00F007B5 /* JoystickModule.cpp in Sources */, + FA7AA59217F6AC1F00704BE2 /* wrap_Mesh.cpp in Sources */, + FA08F63516C7542D00F007B5 /* wrap_JoystickModule.cpp in Sources */, + FA08F63616C7543400F007B5 /* Keyboard.cpp in Sources */, + FA08F63716C7543400F007B5 /* Keyboard.cpp in Sources */, + FA08F63816C7543400F007B5 /* wrap_Keyboard.cpp in Sources */, + FA08F63916C7543A00F007B5 /* love.cpp in Sources */, + FA08F63A16C7544300F007B5 /* Mouse.cpp in Sources */, + FA08F63B16C7544300F007B5 /* Mouse.cpp in Sources */, + FA08F63C16C7544300F007B5 /* wrap_Mouse.cpp in Sources */, + FA08F63D16C7544B00F007B5 /* Body.cpp in Sources */, + FA08F63E16C7544B00F007B5 /* Joint.cpp in Sources */, + FA08F63F16C7544B00F007B5 /* Shape.cpp in Sources */, + FA08F64016C7546400F007B5 /* Body.cpp in Sources */, + FA08F64116C7546400F007B5 /* ChainShape.cpp in Sources */, + FA08F64216C7546400F007B5 /* CircleShape.cpp in Sources */, + FA08F64316C7546400F007B5 /* Contact.cpp in Sources */, + FA08F64416C7546400F007B5 /* DistanceJoint.cpp in Sources */, + FA08F64516C7546400F007B5 /* EdgeShape.cpp in Sources */, + FA08F64616C7546400F007B5 /* Fixture.cpp in Sources */, + FA08F64716C7546400F007B5 /* FrictionJoint.cpp in Sources */, + FA08F64816C7546400F007B5 /* GearJoint.cpp in Sources */, + FA08F64916C7546400F007B5 /* Joint.cpp in Sources */, + FA08F64A16C7546400F007B5 /* MouseJoint.cpp in Sources */, + FA08F64B16C7546400F007B5 /* Physics.cpp in Sources */, + FA08F64C16C7546400F007B5 /* PolygonShape.cpp in Sources */, + FA08F64D16C7546400F007B5 /* PrismaticJoint.cpp in Sources */, + FA08F64E16C7546400F007B5 /* PulleyJoint.cpp in Sources */, + FA08F64F16C7546400F007B5 /* RevoluteJoint.cpp in Sources */, + FA08F65016C7546400F007B5 /* RopeJoint.cpp in Sources */, + FA08F65116C7546400F007B5 /* Shape.cpp in Sources */, + FA08F65216C7547300F007B5 /* WeldJoint.cpp in Sources */, + FAF6704C18184FF800DBDEEA /* wuff.c in Sources */, + FA08F65316C7547300F007B5 /* WheelJoint.cpp in Sources */, + FA08F65416C7547300F007B5 /* World.cpp in Sources */, + FA08F65516C7547300F007B5 /* wrap_Body.cpp in Sources */, + FA08F65616C7547300F007B5 /* wrap_ChainShape.cpp in Sources */, + FA08F65716C7547300F007B5 /* wrap_CircleShape.cpp in Sources */, + FA08F65816C7547300F007B5 /* wrap_Contact.cpp in Sources */, + FA08F65916C7547300F007B5 /* wrap_DistanceJoint.cpp in Sources */, + FA08F65A16C7547300F007B5 /* wrap_EdgeShape.cpp in Sources */, + FA08F65B16C7547300F007B5 /* wrap_Fixture.cpp in Sources */, + FA08F65C16C7547300F007B5 /* wrap_FrictionJoint.cpp in Sources */, + FA08F65D16C7548200F007B5 /* wrap_GearJoint.cpp in Sources */, + FA08F65E16C7548200F007B5 /* wrap_Joint.cpp in Sources */, + FA08F65F16C7548200F007B5 /* wrap_MouseJoint.cpp in Sources */, + FA08F66016C7548200F007B5 /* wrap_Physics.cpp in Sources */, + FA08F66116C7548200F007B5 /* wrap_PolygonShape.cpp in Sources */, + FA08F66216C7548200F007B5 /* wrap_PrismaticJoint.cpp in Sources */, + FA08F66316C7548200F007B5 /* wrap_PulleyJoint.cpp in Sources */, + FA08F66416C7548200F007B5 /* wrap_RevoluteJoint.cpp in Sources */, + FA08F66516C7548200F007B5 /* wrap_RopeJoint.cpp in Sources */, + FA08F66616C7548200F007B5 /* wrap_Shape.cpp in Sources */, + FA08F66716C7548200F007B5 /* wrap_WeldJoint.cpp in Sources */, + FA08F66816C7548200F007B5 /* wrap_WheelJoint.cpp in Sources */, + FA08F66916C7548200F007B5 /* wrap_World.cpp in Sources */, + FA08F66A16C7549200F007B5 /* Sound.cpp in Sources */, + FA08F66B16C7549200F007B5 /* SoundData.cpp in Sources */, + FA08F66C16C7549200F007B5 /* wrap_Decoder.cpp in Sources */, + FA08F66D16C7549200F007B5 /* wrap_Sound.cpp in Sources */, + FA08F66E16C7549200F007B5 /* wrap_SoundData.cpp in Sources */, + FA08F66F16C754A100F007B5 /* Decoder.cpp in Sources */, + FA08F67016C754A100F007B5 /* FLACDecoder.cpp in Sources */, + FA08F67116C754A100F007B5 /* GmeDecoder.cpp in Sources */, + FA08F67216C754A100F007B5 /* ModPlugDecoder.cpp in Sources */, + FA08F67316C754A100F007B5 /* Mpg123Decoder.cpp in Sources */, + FA08F67416C754A100F007B5 /* Sound.cpp in Sources */, + FA08F67516C754A100F007B5 /* VorbisDecoder.cpp in Sources */, + FA08F67716C754A900F007B5 /* threads.cpp in Sources */, + FA08F67916C754B100F007B5 /* Timer.cpp in Sources */, + FA08F67A16C754B100F007B5 /* wrap_Timer.cpp in Sources */, + FA08F67B16C754BA00F007B5 /* Window.cpp in Sources */, + FA08F67C16C754BA00F007B5 /* Window.cpp in Sources */, + FA7C937A16DCC6C2006F2BEE /* wrap_Math.cpp in Sources */, + FAF272A416E3D44400CC193A /* Channel.cpp in Sources */, + FAF272A616E3D44400CC193A /* LuaThread.cpp in Sources */, + FA0A4BF0182E0C2800E1E4D2 /* b2MotorJoint.cpp in Sources */, + FAF272A816E3D44400CC193A /* ThreadModule.cpp in Sources */, + FAF272AA16E3D44400CC193A /* wrap_Channel.cpp in Sources */, + FAF272AC16E3D44400CC193A /* wrap_LuaThread.cpp in Sources */, + FAF272AE16E3D44400CC193A /* wrap_ThreadModule.cpp in Sources */, + FAF272B516E3D46400CC193A /* Thread.cpp in Sources */, + FAF272B716E3D46400CC193A /* threads.cpp in Sources */, + FA5454C216F1310000D30303 /* MathModule.cpp in Sources */, + FAAC6B02170A373B008A61C5 /* CompressedData.cpp in Sources */, + FAE010DC170DDE99006F29D0 /* ddsparse.cpp in Sources */, + FAE010E0170DE25E006F29D0 /* ddsHandler.cpp in Sources */, + FAE010E4170DF75C006F29D0 /* wrap_CompressedData.cpp in Sources */, + FAEC808A1710FEA60057279A /* ImageData.cpp in Sources */, + FAEC808E1711E76C0057279A /* CompressedData.cpp in Sources */, + FA636D8A171B70920065623F /* RandomGenerator.cpp in Sources */, + FA636D8E171B72A70065623F /* wrap_RandomGenerator.cpp in Sources */, + FAC86E631724552C00EED715 /* wrap_Quad.cpp in Sources */, + FAC86E6B1724555D00EED715 /* Quad.cpp in Sources */, + FA03546C1731F3A700284828 /* simplexnoise1234.cpp in Sources */, + FA3D9E0D16E68DE600CA6630 /* Cursor.cpp in Sources */, + FA3D9E1116E68EAE00CA6630 /* Cursor.cpp in Sources */, + FA3D9E1516E6D41100CA6630 /* wrap_Cursor.cpp in Sources */, + FA9FC0B0173D6E3E005027FF /* wrap_Window.cpp in Sources */, + FAB0078F1740C12D00A9664D /* Joystick.cpp in Sources */, + FAB007931740C28900A9664D /* Joystick.cpp in Sources */, + FAB007971740C87D00A9664D /* wrap_Joystick.cpp in Sources */, + FAC5710017402D1100D147E4 /* BezierCurve.cpp in Sources */, + FAC5710217402D1100D147E4 /* wrap_BezierCurve.cpp in Sources */, + FA5FDC791788D548002F0ED2 /* enet.cpp in Sources */, + FA5FDC7A1788D548002F0ED2 /* callbacks.c in Sources */, + FA5FDC7C1788D548002F0ED2 /* compress.c in Sources */, + FA5FDC7D1788D548002F0ED2 /* host.c in Sources */, + FA5FDC881788D548002F0ED2 /* list.c in Sources */, + FA5FDC891788D548002F0ED2 /* packet.c in Sources */, + FA5FDC8A1788D548002F0ED2 /* peer.c in Sources */, + FA5FDC8B1788D548002F0ED2 /* protocol.c in Sources */, + FA5FDC8D1788D548002F0ED2 /* unix.c in Sources */, + FA5FDC8E1788D548002F0ED2 /* win32.c in Sources */, + FA34E7CD174B513F00E04D3F /* System.cpp in Sources */, + FA34E7D2174B515D00E04D3F /* System.cpp in Sources */, + FA1EF7C41799FEAC00FF380C /* wrap_System.cpp in Sources */, + FA435EA317B36E9C004C3F22 /* Polyline.cpp in Sources */, + FA9A100C182A0D5200106F9F /* glad.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 10D5479E63C26BB35EB5482E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_ENABLE_MODULES = YES; + DEAD_CODE_STRIPPING = YES; + FRAMEWORK_SEARCH_PATHS = /Library/Frameworks; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "\"$(SRCROOT)/../../src\"", + "\"$(SRCROOT)/../../src/libraries\"", + "\"$(SRCROOT)/../../src/modules\"", + "\"$(SRCROOT)/../../src/libraries/enet/libenet/include\"", + /Library/Frameworks/FreeType.framework/Headers, + /Library/Frameworks/Lua.framework/Headers, + /Library/Frameworks/SDL2.framework/Headers, + ); + LD_RUNPATH_SEARCH_PATHS = "@rpath"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = 10.6; + ONLY_ACTIVE_ARCH = NO; + USE_HEADERMAP = NO; + WARNING_CFLAGS = "-Wall"; + }; + name = Release; + }; + 64274E785071353E1A1D0D4B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_ENABLE_MODULES = YES; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = /Library/Frameworks; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ""; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "\"$(SRCROOT)/../../src\"", + "\"$(SRCROOT)/../../src/libraries\"", + "\"$(SRCROOT)/../../src/modules\"", + "\"$(SRCROOT)/../../src/libraries/enet/libenet/include\"", + /Library/Frameworks/FreeType.framework/Headers, + /Library/Frameworks/Lua.framework/Headers, + /Library/Frameworks/SDL2.framework/Headers, + ); + LD_RUNPATH_SEARCH_PATHS = "@rpath"; + LIBRARY_SEARCH_PATHS = ""; + MACOSX_DEPLOYMENT_TARGET = 10.6; + ONLY_ACTIVE_ARCH = YES; + USE_HEADERMAP = NO; + WARNING_CFLAGS = "-Wall"; + }; + name = Debug; + }; + FA577AC016C7507900860150 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = NO; + COMBINE_HIDPI_IMAGES = YES; + DYLIB_COMPATIBILITY_VERSION = 9.0; + DYLIB_CURRENT_VERSION = 9.0; + FRAMEWORK_VERSION = A; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "Info-Framework.plist"; + LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)"; + OTHER_LDFLAGS = ( + "-undefined", + dynamic_lookup, + ); + PRODUCT_NAME = love; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = framework; + }; + name = Debug; + }; + FA577AC116C7507900860150 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ENABLE_MODULES = NO; + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DYLIB_COMPATIBILITY_VERSION = 9.0; + DYLIB_CURRENT_VERSION = 9.0; + FRAMEWORK_VERSION = A; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + INFOPLIST_FILE = "Info-Framework.plist"; + LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)"; + OTHER_LDFLAGS = ( + "-undefined", + dynamic_lookup, + ); + PRODUCT_NAME = love; + SKIP_INSTALL = YES; + WRAPPER_EXTENSION = framework; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "love-framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 64274E785071353E1A1D0D4B /* Debug */, + 10D5479E63C26BB35EB5482E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + FA577ABF16C7507900860150 /* Build configuration list for PBXNativeTarget "Framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FA577AC016C7507900860150 /* Debug */, + FA577AC116C7507900860150 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/jni/love/platform/macosx/love.xcodeproj/TemplateIcon.icns b/jni/love/platform/macosx/love.xcodeproj/TemplateIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..62cb7015e09d6ea3e65d7f7949c4c07f9246a908 GIT binary patch literal 52318 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 WhsmLR^b3` + + + + Debug Dynamic + Win32 + + + Debug Dynamic + x64 + + + Release Dynamic + Win32 + + + Release Dynamic + x64 + + + Release Static + Win32 + + + Release Static + x64 + + + + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8} + liblove + + + + DynamicLibrary + true + Unicode + + + DynamicLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + true + Unicode + + + DynamicLibrary + false + true + Unicode + + + DynamicLibrary + false + true + Unicode + Windows7.1SDK + + + StaticLibrary + Unicode + + + StaticLibrary + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)\$(PlatformShortName)\$(Configuration) + + + $(SolutionDir)\$(PlatformShortName)\$(Configuration) + + + $(ProjectName)\$(Configuration)\ + + + $(ProjectName)\$(Configuration)\ + + + $(SolutionDir)\bin\$(PlatformShortName)\Debug\MD\ + $(ProjectName)\$(PlatformShortName)\Debug\ + false + love + + + $(SolutionDir)\bin\$(PlatformShortName)\Debug\MD\ + $(ProjectName)\$(PlatformShortName)\Debug\ + false + love + + + $(SolutionDir)\bin\$(PlatformShortName)\Release\MT\ + $(ProjectName)\$(PlatformShortName)\Release\ + + + $(SolutionDir)\bin\$(PlatformShortName)\Release\MT\ + $(ProjectName)\$(PlatformShortName)\Release\ + + + $(SolutionDir)\bin\$(PlatformShortName)\Release\MD\ + $(ProjectName)\$(PlatformShortName)\Release\ + false + love + + + $(SolutionDir)\bin\$(PlatformShortName)\Release\MD\ + $(ProjectName)\$(PlatformShortName)\Release\ + false + love + + + + Level3 + Disabled + include;include\SDL;include\AL;..\..\src;..\..\src\libraries;..\..\src\modules;..\..\src\libraries\enet\libenet\include;%(AdditionalIncludeDirectories) + true + _DEBUG;DEBUG;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + $(IntDir)obj\obj\obj\%(RelativeDir) + ProgramDatabase + + + true + msvcrtd.lib;msvcprtd.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;advapi32.lib;ws2_32.lib;winmm.lib;opengl32.lib;oldnames.lib;DevIL.lib;freetype.lib;libmodplug.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua51.lib;mpg123.lib;physfs.lib;OpenAL.lib;zlib.lib;SDL2.lib;%(AdditionalDependencies) + true + lib\$(PlatformShortName)\Debug\MD\ + $(TargetDir)lib$(TargetName).pdb + $(TargetDir)lib$(TargetName).pgd + + + LOVE_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + + + Level3 + Disabled + include;include\SDL;include\AL;..\..\src;..\..\src\libraries;..\..\src\modules;..\..\src\libraries\enet\libenet\include;%(AdditionalIncludeDirectories) + true + _DEBUG;DEBUG;%(PreprocessorDefinitions) + false + MultiThreadedDebugDLL + $(IntDir)obj\obj\obj\%(RelativeDir) + ProgramDatabase + + + true + msvcrtd.lib;msvcprtd.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;advapi32.lib;ws2_32.lib;winmm.lib;opengl32.lib;oldnames.lib;DevIL.lib;freetype.lib;libmodplug.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua51.lib;mpg123.lib;physfs.lib;OpenAL.lib;zlib.lib;SDL2.lib;%(AdditionalDependencies) + true + lib\$(PlatformShortName)\Debug\MD\ + $(TargetDir)lib$(TargetName).pdb + $(TargetDir)lib$(TargetName).pgd + + + LOVE_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + include;include\SDL;include\AL;..\..\src;..\..\src\libraries;..\..\src\modules;..\..\src\libraries\enet\libenet\include;%(AdditionalIncludeDirectories) + true + true + NDEBUG;%(PreprocessorDefinitions) + MultiThreaded + false + $(IntDir)obj\obj\obj\%(RelativeDir) + true + + + true + true + true + + + LOVE_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + MachineX86 + + + + + true + true + + + + + Level3 + MaxSpeed + true + true + include;include\SDL;include\AL;..\..\src;..\..\src\libraries;..\..\src\modules;..\..\src\libraries\enet\libenet\include;%(AdditionalIncludeDirectories) + true + true + NDEBUG;%(PreprocessorDefinitions) + MultiThreaded + false + $(IntDir)obj\obj\obj\%(RelativeDir) + true + + + true + true + true + + + LOVE_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + MachineX64 + + + + + true + true + + + + + Level3 + MaxSpeed + true + true + include;include\SDL;include\AL;..\..\src;..\..\src\libraries;..\..\src\modules;..\..\src\libraries\enet\libenet\include;%(AdditionalIncludeDirectories) + true + true + NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + false + $(IntDir)obj\obj\obj\%(RelativeDir) + true + + + true + true + true + msvcrt.lib;msvcprt.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;advapi32.lib;ws2_32.lib;winmm.lib;opengl32.lib;oldnames.lib;DevIL.lib;freetype.lib;libmodplug.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua51.lib;mpg123.lib;physfs.lib;OpenAL.lib;zlib.lib;SDL2.lib;%(AdditionalDependencies) + true + lib\$(PlatformShortName)\Release\MD\ + $(TargetDir)lib$(TargetName).pdb + $(TargetDir)lib$(TargetName).pgd + + + LOVE_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + + + Level3 + MaxSpeed + true + true + include;include\SDL;include\AL;..\..\src;..\..\src\libraries;..\..\src\modules;..\..\src\libraries\enet\libenet\include;%(AdditionalIncludeDirectories) + true + true + NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + false + $(IntDir)obj\obj\obj\%(RelativeDir) + true + + + true + true + true + msvcrt.lib;msvcprt.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;advapi32.lib;ws2_32.lib;winmm.lib;opengl32.lib;oldnames.lib;DevIL.lib;freetype.lib;libmodplug.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua51.lib;mpg123.lib;physfs.lib;OpenAL.lib;zlib.lib;SDL2.lib;%(AdditionalDependencies) + true + lib\$(PlatformShortName)\Release\MD\ + $(TargetDir)lib$(TargetName).pdb + $(TargetDir)lib$(TargetName).pgd + + + LOVE_LIB;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jni/love/platform/msvc2010/liblove.vcxproj.filters b/jni/love/platform/msvc2010/liblove.vcxproj.filters new file mode 100644 index 00000000..b8b83546 --- /dev/null +++ b/jni/love/platform/msvc2010/liblove.vcxproj.filters @@ -0,0 +1,1796 @@ + + + + + {9204b296-06f7-44d4-a739-c7bd2f1b6a10} + + + {8db39aa0-6dd9-454e-83e3-337a250a26a7} + + + {c33f8514-328c-435a-83cf-592b907efdf6} + + + {15622628-c450-48d5-af6d-11a81d9b3453} + + + {648d76dd-df9d-458d-beb3-de53e780d07e} + + + {67d48dd8-574e-4bdd-bdb1-71af5801e234} + + + {b00f9fc5-a6a6-44e7-a52d-84c134de265d} + + + {4ed69d3b-2b3e-4bb1-b756-620816c86916} + + + {3c66e3d3-c2fd-409b-88d9-fd6d67df2edd} + + + {7eb57e83-24c3-4b47-a9bb-f73adac7c4c2} + + + {90878f00-844f-453d-a521-76366e3031b2} + + + {7ae21d0a-2dbd-4d89-8ed3-74a0af8e1901} + + + {809e6999-08d1-41b5-9536-bcfe7cc09588} + + + {9c1b1395-34b7-4158-b778-56b622c81e37} + + + {5dcd8aac-7614-4d4e-b507-7df82969cb68} + + + {6f277a7f-c3b8-4eff-bffe-1635d2819c01} + + + {0ceac368-959f-47da-8881-66e22383e2c3} + + + {822de099-663f-46e9-8c22-e2563903b2d1} + + + {374bede6-77d8-4dd9-922c-65ebc1094df4} + + + {83e8ce99-8a0f-4e64-b5be-3c184026aa52} + + + {d9e2d64e-5fd3-4f49-be70-50d5ae85ee26} + + + {679a49ca-08fc-400a-b0ae-30ac2a072b6b} + + + {cc6c06ce-6fa1-46fe-9308-f0844d198123} + + + {e4a78077-53fd-4f65-bc7b-9357fca59d37} + + + {44378345-7eb7-45d5-8f32-fe7e3375ca7b} + + + {03c38556-a58d-4a16-bd8a-26da917b73aa} + + + {a9c040aa-4e09-4a43-b7d4-62ab7e9cde4b} + + + {8ca0aa01-6595-4e00-9257-6668218bfaad} + + + {d0e97654-3e56-4ce0-aa0a-a5b660ade090} + + + {018b53e4-51ff-41ef-8752-530f7ca83f5f} + + + {e3bb8877-dc46-45db-999d-97a3b3482227} + + + {9a56922c-6ee8-4e4a-af76-c310a3052de6} + + + {6c504e35-8799-4ce8-89e7-b4904095efe5} + + + {d78871c7-7ca9-4dff-9163-f2a6a97462d7} + + + {72f85e75-dd35-4a93-9c39-258c8aee813b} + + + {806ac1d0-ed5c-47d5-8cdc-60e3fdbfe412} + + + {1266e902-11b4-4f0d-afb5-66df65b0429c} + + + {7715d905-5dc6-41ce-9aa1-6f94c707ced5} + + + {ad88c2dc-e31c-4362-bd7a-4d76c79d5783} + + + {fe7cb272-ea46-4f31-873a-a8a42e4efd3a} + + + {ea198321-c3fb-4444-bd1e-608461f7af20} + + + {d46cbbf1-a76f-4401-83d4-1f20492f9889} + + + {5fb201c1-9b39-48ca-8334-6862da260b43} + + + {5d2c2149-93bf-42a6-b8b5-6ddbac9485a3} + + + {5673936a-786e-40ee-96d2-1830e89c1532} + + + {dd0ef317-7117-4ddc-b8ef-aaf58130c7bd} + + + {d39bd4fd-3bea-428a-813f-4b1c55aedac8} + + + {d5e565d0-da66-4412-9144-dff8c7d82b2e} + + + {4bf8a9b0-db1a-4a6e-a157-a9eab128f5ca} + + + {ab75aa3d-8e32-45e0-b91b-ed3cb31f472e} + + + {86f5346b-8859-4c03-8c1f-3bd8d200b658} + + + {a9a12c5a-ff54-43c1-b0c6-ba1597af7b03} + + + {731671fa-d695-42c3-9d1c-9e227d9ebab4} + + + {2241f4ca-a51c-4d8d-be82-2b7dfd267b7b} + + + {731671fa-d695-42c3-9d1c-9e227d9ebab4} + + + {2241f4ca-a51c-4d8d-be82-2b7dfd267b7b} + + + {4127f9be-b9c3-45bf-968f-888df9d5bc35} + + + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Rope + + + libraries\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + modules\audio + + + modules\audio + + + modules\audio + + + modules\audio + + + modules\audio\null + + + modules\audio\null + + + modules\audio\openal + + + modules\audio\openal + + + modules\audio\openal + + + modules\event + + + modules\event\sdl + + + modules\event\sdl + + + modules\filesystem + + + modules\filesystem + + + modules\filesystem\physfs + + + modules\filesystem\physfs + + + modules\filesystem\physfs + + + modules\filesystem\physfs + + + modules\filesystem\physfs + + + modules\font + + + modules\font + + + modules\font + + + modules\font + + + modules\font + + + modules\font\freetype + + + modules\font\freetype + + + modules\font\freetype + + + modules\graphics + + + modules\graphics + + + modules\graphics + + + modules\graphics + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\image + + + modules\image + + + modules\image + + + modules\joystick + + + modules\joystick\sdl + + + modules\joystick\sdl + + + modules\keyboard + + + modules\keyboard + + + modules\keyboard\sdl + + + modules\mouse + + + modules\mouse + + + modules\mouse\sdl + + + modules\physics + + + modules\physics + + + modules\physics + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\sound + + + modules\sound + + + modules\sound + + + modules\sound + + + modules\sound + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\timer + + + modules\timer\sdl + + + modules\window + + + modules\window\sdl + + + modules\love + + + common + + + modules\math + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread\sdl + + + modules\thread\sdl + + + modules\math + + + libraries\ddsparse + + + modules\image\magpie + + + modules\image\magpie + + + modules\image\magpie + + + modules\image\magpie + + + modules\image\magpie + + + modules\image + + + modules\image + + + modules\math + + + modules\math + + + libraries\noise1234 + + + modules\math + + + modules\math + + + modules\window + + + libraries\enet\libenet + + + libraries\enet\libenet + + + libraries\enet\libenet + + + libraries\enet\libenet + + + libraries\enet\libenet + + + libraries\enet\libenet + + + libraries\enet\libenet + + + libraries\enet\libenet + + + libraries\enet + + + modules\graphics\opengl + + + modules\joystick\sdl + + + modules\joystick\sdl + + + modules\mouse + + + modules\mouse + + + modules\mouse\sdl + + + modules\system + + + modules\system + + + modules\system\sdl + + + modules\joystick\sdl + + + modules\joystick\sdl + + + modules\mouse + + + modules\mouse + + + modules\mouse\sdl + + + modules\system + + + modules\system + + + modules\system\sdl + + + modules\graphics + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + libraries\Wuff + + + libraries\Wuff + + + libraries\Wuff + + + libraries\Wuff + + + modules\sound\lullaby + + + + + scripts + + + scripts + + + scripts + + + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + common + + + libraries\Box2D + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Collision\Shapes + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Common + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Contacts + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Dynamcis\Joints + + + libraries\Box2D\Rope + + + libraries\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\luasocket\luasocket + + + libraries\utf8 + + + libraries\utf8 + + + libraries\utf8 + + + libraries\utf8 + + + modules\audio + + + modules\audio + + + modules\audio + + + modules\audio + + + modules\audio\null + + + modules\audio\null + + + modules\audio\openal + + + modules\audio\openal + + + modules\audio\openal + + + modules\event + + + modules\event\sdl + + + modules\event\sdl + + + modules\filesystem + + + modules\filesystem + + + modules\filesystem\physfs + + + modules\filesystem\physfs + + + modules\filesystem\physfs + + + modules\filesystem\physfs + + + modules\filesystem\physfs + + + modules\font + + + modules\font + + + modules\font + + + modules\font + + + modules\font + + + modules\font + + + modules\font\freetype + + + modules\font\freetype + + + modules\font\freetype + + + modules\graphics + + + modules\graphics + + + modules\graphics + + + modules\graphics + + + modules\graphics + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\image + + + modules\image + + + modules\image + + + modules\image + + + modules\joystick + + + modules\joystick\sdl + + + modules\joystick\sdl + + + modules\keyboard + + + modules\keyboard + + + modules\keyboard\sdl + + + modules\mouse + + + modules\mouse + + + modules\mouse\sdl + + + modules\physics + + + modules\physics + + + modules\physics + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\physics\box2d + + + modules\sound + + + modules\sound + + + modules\sound + + + modules\sound + + + modules\sound + + + modules\sound + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\sound\lullaby + + + modules\timer + + + modules\timer + + + modules\timer\sdl + + + modules\window + + + modules\window\sdl + + + modules\love + + + modules\math + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread + + + modules\thread\sdl + + + modules\thread\sdl + + + modules\math + + + libraries\ddsparse + + + libraries\ddsparse + + + modules\image\magpie + + + modules\image\magpie + + + modules\image\magpie + + + modules\image\magpie + + + modules\image\magpie + + + modules\image\magpie + + + modules\image + + + modules\image + + + modules\math + + + modules\math + + + libraries\noise1234 + + + modules\math + + + modules\math + + + modules\window + + + libraries\enet + + + libraries\enet\libenet\include\enet + + + libraries\enet\libenet\include\enet + + + libraries\enet\libenet\include\enet + + + libraries\enet\libenet\include\enet + + + libraries\enet\libenet\include\enet + + + libraries\enet\libenet\include\enet + + + libraries\enet\libenet\include\enet + + + libraries\enet\libenet\include\enet + + + libraries\enet\libenet\include\enet + + + modules\graphics\opengl + + + modules\joystick + + + modules\joystick\sdl + + + modules\joystick\sdl + + + modules\mouse + + + modules\mouse + + + modules\mouse\sdl + + + modules\system + + + modules\system + + + modules\system\sdl + + + modules\joystick + + + modules\joystick\sdl + + + modules\joystick\sdl + + + modules\mouse + + + modules\mouse + + + modules\mouse\sdl + + + modules\system + + + modules\system + + + modules\system\sdl + + + modules\graphics + + + modules\graphics + + + modules\graphics\opengl + + + modules\graphics\opengl + + + modules\graphics\opengl + + + libraries\Wuff + + + libraries\Wuff + + + libraries\Wuff + + + libraries\Wuff + + + modules\sound\lullaby + + + + + + \ No newline at end of file diff --git a/jni/love/platform/msvc2010/love.ico b/jni/love/platform/msvc2010/love.ico new file mode 100644 index 0000000000000000000000000000000000000000..73403aedbeb599dc19f7df618793c7363da488eb GIT binary patch literal 35492 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 V=w+!1g!}-RQ#F`}h(&&u{eL{pkDLGi literal 0 HcmV?d00001 diff --git a/jni/love/platform/msvc2010/love.rc b/jni/love/platform/msvc2010/love.rc new file mode 100644 index 0000000000000000000000000000000000000000..bb620fa118c724e83ef3f39090d153898c45a51d GIT binary patch literal 3468 zcmb`JZ%-RX5XR>%mHHi4=0%#SfJu``ys6|sUAZ*|fg$QEOaVsrYPzM>KE$A zY5RM2Z@stYGel~2y1Tu-otbB5o|)Z${@$~%xxTb7%<*=1WOJL@Gg~sgX1uT)8~d*% zU(W7qWWO=vnES;FzO}BfiJvQwb&L!CF8$mN^E3Ov%*g+{u%UHr$M)^D?XK+Z`H@g; zvv%w?&b-ER)}L9=2KEEbuKjFZ+3)roE8D!AB!+fkRjIhXI#<;s9lGn0c#D6+?lMFl z>>FnK*toRs?aJQR1-Sae&6Ux(CnjTL93Cq=ij(4{Xx_jkq?`m!M^7AaRy;;NE@RLsE+Ew_f>nu^V|+W+w$G&9rJ(rif;BaNe=Mz80jE6_bk{2#e^%$jv1>5G{r1w zs$%$W*2i?hacO-YWIa4nM%{)>K1bvQ6+W*Z54}2PkaXr;Q3ku%kcZKud_``%n*GR> zypJYUOJ-;WkVXS$ik54TQWYt?-NGn^qUtY^PZ}YhMhkhA+M~wPmA|LvdMma28ecJq*FCKWh3lZRaB|=oP7u0!0>=Y_!r)b_0w3g znKV3a%x05chvaKYBy}Eofb}E3)ce#I($yjpp`SZyLZ^)hJvy9jbz0GmA9JC8IU_^6 zD;}&zvyY7%WG3)wj`ath&l}E9%Zlw*!(V5AV)q5nX>$(P@uPieRFRAb#SxtX)s=6( zKRQ$Be5RAo^buUA;Lz#k9{kJCh(=`kx`(-@O{__|dx|ejxl^2VR$BP@Pd4CfJ>u_4 z8TXLE3H1|By2@wbLF_l`k72itRq{vK8^Sxx=6&K4O^cOYA#Uyvd9@Fb5hL%&VPaNb VrTTg3AL8gf40y#IYzG|S`7iE`+l>GK literal 0 HcmV?d00001 diff --git a/jni/love/platform/msvc2010/love.sln b/jni/love/platform/msvc2010/love.sln new file mode 100644 index 00000000..0bb8e317 --- /dev/null +++ b/jni/love/platform/msvc2010/love.sln @@ -0,0 +1,47 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "love", "love.vcxproj", "{B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}" + ProjectSection(ProjectDependencies) = postProject + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8} = {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "liblove", "liblove.vcxproj", "{A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug MD|Win32 = Debug MD|Win32 + Debug MD|x64 = Debug MD|x64 + Release MD|Win32 = Release MD|Win32 + Release MD|x64 = Release MD|x64 + Release MT|Win32 = Release MT|Win32 + Release MT|x64 = Release MT|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Debug MD|Win32.ActiveCfg = Debug Dynamic|Win32 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Debug MD|Win32.Build.0 = Debug Dynamic|Win32 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Debug MD|x64.ActiveCfg = Debug Dynamic|x64 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release MD|Win32.ActiveCfg = Release Dynamic|Win32 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release MD|Win32.Build.0 = Release Dynamic|Win32 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release MD|x64.ActiveCfg = Release Dynamic|x64 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release MD|x64.Build.0 = Release Dynamic|x64 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release MT|Win32.ActiveCfg = Release Static|Win32 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release MT|Win32.Build.0 = Release Static|Win32 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release MT|x64.ActiveCfg = Release Static|x64 + {B496CCF6-9B6D-0794-8F41-67A6EC86B4AA}.Release MT|x64.Build.0 = Release Static|x64 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Debug MD|Win32.ActiveCfg = Debug Dynamic|Win32 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Debug MD|Win32.Build.0 = Debug Dynamic|Win32 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Debug MD|x64.ActiveCfg = Debug Dynamic|x64 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Release MD|Win32.ActiveCfg = Release Dynamic|Win32 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Release MD|Win32.Build.0 = Release Dynamic|Win32 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Release MD|x64.ActiveCfg = Release Dynamic|x64 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Release MD|x64.Build.0 = Release Dynamic|x64 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Release MT|Win32.ActiveCfg = Release Static|Win32 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Release MT|Win32.Build.0 = Release Static|Win32 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Release MT|x64.ActiveCfg = Release Static|x64 + {A3FCC735-3E18-4D6B-9DA9-01D9E910B7F8}.Release MT|x64.Build.0 = Release Static|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/jni/love/platform/msvc2010/love.vcxproj b/jni/love/platform/msvc2010/love.vcxproj new file mode 100644 index 00000000..1d956c3a --- /dev/null +++ b/jni/love/platform/msvc2010/love.vcxproj @@ -0,0 +1,273 @@ + + + + + Debug Dynamic + Win32 + + + Debug Dynamic + x64 + + + Release Dynamic + Win32 + + + Release Dynamic + x64 + + + Release Static + Win32 + + + Release Static + x64 + + + + Win32Proj + + + + Application + true + Unicode + + + Application + true + Unicode + + + Application + false + Unicode + true + + + Application + false + Unicode + true + Windows7.1SDK + + + Unicode + + + Unicode + + + true + + + true + Windows7.1SDK + + + + + + + + + + + + + + + + + + + false + false + $(SolutionDir)\bin\$(PlatformShortName)\Debug\MD\ + $(ProjectName)\$(PlatformShortName)\Debug\ + + + false + false + $(SolutionDir)\bin\$(PlatformShortName)\Debug\MD\ + $(ProjectName)\$(PlatformShortName)\Debug\ + + + false + $(SolutionDir)\bin\$(PlatformShortName)\Release\MD\ + $(ProjectName)\$(PlatformShortName)\Release\ + false + + + false + $(SolutionDir)\bin\$(PlatformShortName)\Release\MD\ + $(ProjectName)\$(PlatformShortName)\Release\ + false + + + $(SolutionDir)\bin\$(PlatformShortName)\Release\MT\ + $(ProjectName)\$(PlatformShortName)\Release\ + false + false + + + $(SolutionDir)\bin\$(PlatformShortName)\Release\MT\ + $(ProjectName)\$(PlatformShortName)\Release\ + false + false + + + + DEBUG;_DEBUG%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + ProgramDatabase + Disabled + include;include\SDL;..\..\src;%(AdditionalIncludeDirectories) + + + false + + + MachineX86 + true + Windows + lib\$(PlatformShortName)\Debug\MD\ + msvcrtd.lib;msvcprtd.lib;kernel32.lib;lua51.lib;SDL2main.lib;SDL2.lib;%(AdditionalDependencies) + true + $(TargetDir)$(TargetName).pdb + $(TargetDir)$(TargetName).pgd + + + + + DEBUG;_DEBUG%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + ProgramDatabase + Disabled + include;include\SDL;..\..\src;%(AdditionalIncludeDirectories) + + + false + false + + + true + Windows + lib\$(PlatformShortName)\Debug\MD\ + msvcrtd.lib;msvcprtd.lib;kernel32.lib;lua51.lib;SDL2main.lib;SDL2.lib;%(AdditionalDependencies) + true + $(TargetDir)$(TargetName).pgd + $(TargetDir)$(TargetName).pdb + + + + + NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + Level1 + ProgramDatabase + include;include\SDL;..\..\src;%(AdditionalIncludeDirectories) + true + true + false + true + + + MachineX86 + true + Windows + true + true + lib\$(PlatformShortName)\Release\MD\ + msvcrt.lib;msvcprt.lib;kernel32.lib;lua51.lib;SDL2main.lib;SDL2.lib;%(AdditionalDependencies) + true + + + + + NDEBUG;%(PreprocessorDefinitions) + MultiThreadedDLL + Level1 + ProgramDatabase + include;include\SDL;..\..\src;%(AdditionalIncludeDirectories) + true + true + false + true + + + true + Windows + true + true + lib\$(PlatformShortName)\Release\MD\ + msvcrt.lib;msvcprt.lib;kernel32.lib;lua51.lib;SDL2main.lib;SDL2.lib;%(AdditionalDependencies) + true + + + + + include;include\SDL;..\..\src;%(AdditionalIncludeDirectories) + true + NDEBUG;%(PreprocessorDefinitions) + true + MultiThreaded + false + true + + + Windows + true + true + libcmt.lib;libcpmt.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;advapi32.lib;ws2_32.lib;winmm.lib;opengl32.lib;oldnames.lib;DevIL.lib;freetype.lib;libmodplug.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua51.lib;mpg123.lib;physfs.lib;OpenAL.lib;zlib.lib;SDL2main.lib;SDL2.lib;%(AdditionalDependencies) + lib\$(PlatformShortName)\Release\MT\ + true + NotSet + true + true + + + + + include;include\SDL;..\..\src;%(AdditionalIncludeDirectories) + true + NDEBUG;%(PreprocessorDefinitions) + true + MultiThreaded + false + true + + + Windows + true + true + libcmt.lib;libcpmt.lib;kernel32.lib;user32.lib;shell32.lib;uuid.lib;advapi32.lib;ws2_32.lib;winmm.lib;opengl32.lib;oldnames.lib;DevIL.lib;freetype.lib;libmodplug.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;lua51.lib;mpg123.lib;physfs.lib;OpenAL.lib;zlib.lib;SDL2main.lib;SDL2.lib;%(AdditionalDependencies) + lib\$(PlatformShortName)\Release\MT\ + true + true + + + + + + + + {a3fcc735-3e18-4d6b-9da9-01d9e910b7f8} + false + false + false + true + false + + + + + + + + + \ No newline at end of file diff --git a/jni/love/platform/msvc2010/love.vcxproj.filters b/jni/love/platform/msvc2010/love.vcxproj.filters new file mode 100644 index 00000000..8c1f9cea --- /dev/null +++ b/jni/love/platform/msvc2010/love.vcxproj.filters @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/jni/love/platform/unix/Makefile.am b/jni/love/platform/unix/Makefile.am new file mode 100644 index 00000000..5bde8860 --- /dev/null +++ b/jni/love/platform/unix/Makefile.am @@ -0,0 +1,24 @@ +ACLOCAL_AMFLAGS = -I platform/unix/m4 +SUBDIRS = src +EXTRA_DIST = changes.txt license.txt readme.md \ + platform/unix/love.desktop.in +dist_man1_MANS = platform/unix/love.1 + +applicationsdir=$(datarootdir)/applications +mimeinfodir=$(datarootdir)/mime/packages +pixmapsdir=$(datarootdir)/pixmaps +mimeiconsdir=$(datarootdir)/icons/hicolor/scalable/mimetypes + +applications_DATA = platform/unix/love.desktop +dist_mimeinfo_DATA = platform/unix/love.xml +dist_pixmaps_DATA = platform/unix/love.svg +dist_mimeicons_DATA = platform/unix/application-x-love-game.svg + +platform/unix/love.desktop: platform/unix/love.desktop.in + $(MKDIR_P) platform/unix + rm -f $@ $@.tmp + $(SED) \ + -e "s|@bindir[@]|$(bindir)|" \ + ${srcdir}/$@.in > $@.tmp + chmod a-w $@.tmp + mv $@.tmp $@ diff --git a/jni/love/platform/unix/application-x-love-game.svg b/jni/love/platform/unix/application-x-love-game.svg new file mode 100644 index 00000000..19c62362 --- /dev/null +++ b/jni/love/platform/unix/application-x-love-game.svg @@ -0,0 +1,1024 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jni/love/platform/unix/automagic b/jni/love/platform/unix/automagic new file mode 100755 index 00000000..f2d8d600 --- /dev/null +++ b/jni/love/platform/unix/automagic @@ -0,0 +1,64 @@ +#!/bin/bash + +log() { + echo "[automagic] " $@ +} + +die() { + log "Fatal: "$@ + exit 1 +} + +if [[ ! -d platform/unix ]]; then + log "Can't find the 'plaform/unix' folder, make sure you run this from the root of the repository." + exit 1 +fi + +AUTOHEADER=$(which autoheader) +AUTOCONF=$(which autoconf) +LIBTOOLIZE=$(which libtoolize) +ACLOCAL=$(which aclocal) +AUTOMAKE=$(which automake) + +[[ -x ${AUTOHEADER} ]] || die "Could not find autoheader. Install autoconf." +[[ -x ${AUTOCONF} ]] || die "Could not find autoconf." +[[ -x ${LIBTOOLIZE} ]] || die "Could not find libtoolize. Install libtool." +[[ -x ${ACLOCAL} ]] || die "Could not find aclocal. Install automake." +[[ -x ${AUTOMAKE} ]] || die "Could not find automake." + +automagic() { + cp platform/unix/configure.ac . + cp platform/unix/Makefile.am . + + if ! sh platform/unix/gen-makefile; then + echo "You should be doing this from the root directory of the project." + exit 1 + fi + + log "Running autoheader..." >&2 + ${AUTOHEADER} 2>&1 || return 1 # Gimmie config.h.in + + log "Running libtoolize..." >&2 + ${LIBTOOLIZE} --force 2>&1 || return 1 + + log "Running aclocal..." >&2 + ${ACLOCAL} 2>&1 || return 1 + + log "Running autoconf..." >&2 + ${AUTOCONF} 2>&1 || return 1 + + log "Running automake..." >&2 + ${AUTOMAKE} -a 2>&1 || return 1 +} + +if [[ $1 == "-d" ]]; then + automagic 2>&1 +else + (automagic > /dev/null) 2>&1 +fi +if [[ $? -eq 1 ]]; then + log "Failed, please contact the developers." + exit 1 +else + log "Success, carry on configuring." +fi diff --git a/jni/love/platform/unix/configure.ac b/jni/love/platform/unix/configure.ac new file mode 100644 index 00000000..8f1259f3 --- /dev/null +++ b/jni/love/platform/unix/configure.ac @@ -0,0 +1,104 @@ +AC_INIT([love], [HEAD]) +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_AUX_DIR([platform/unix]) +AC_CONFIG_MACRO_DIR([platform/unix/m4]) +AC_CONFIG_SRCDIR([src/love.cpp]) +AM_INIT_AUTOMAKE([foreign -Wall foreign tar-ustar silent-rules]) +AM_SILENT_RULES +AC_PREFIX_DEFAULT([/usr]) +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) +AC_PROG_LIBTOOL +AC_PROG_CC +AC_PROG_CXX +AC_PROG_SED +AC_PROG_MKDIR_P +AC_C_BIGENDIAN +AC_LANG([C++]) + +includes= + +AC_DEFUN([ACLOVE_CXX_FLAG_TEST], # WARNING: NOT REENTRANT + [aclove_cxx_flag_test_save_cflags="$CXXFLAGS" + CXXFLAGS="$1" + AC_MSG_CHECKING([whether $CXX supports flag $1]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])], + [AC_MSG_RESULT([yes])]; $2, + [AC_MSG_RESULT([no]); $3]) + CXXFLAGS="$aclove_cxx_flag_test_save_cflags"]) + +# C++11 support +cxx11name="no" +ACLOVE_CXX_FLAG_TEST([-std=c++0x], cxx11name="c++0x", []) +ACLOVE_CXX_FLAG_TEST([-std=c++11], cxx11name="c++11", []) +AS_VAR_IF([cxx11name], [no], AC_MSG_ERROR([Can't LÖVE without C++11]), CXXFLAGS="$CXXFLAGS -std=$cxx11name") + +# Libraries +AC_SEARCH_LIBS([sqrt], [m], [], AC_MSG_ERROR([Can't LÖVE without C math library])) +AC_SEARCH_LIBS([glLoadIdentity], [GL], [], AC_MSG_ERROR([Can't LÖVE without OpenGL])) +AC_SEARCH_LIBS([alSourcePlay], [openal], [], AC_MSG_ERROR([Can't LÖVE without OpenAL])) +AC_SEARCH_LIBS([ilInit], [IL], [], AC_MSG_ERROR([Can't LÖVE without DevIL])) +AC_SEARCH_LIBS([FT_Load_Glyph], [freetype], [], AC_MSG_ERROR([Can't LÖVE without FreeType])) +AC_SEARCH_LIBS([PHYSFS_init], [physfs], [], AC_MSG_ERROR([Can't LÖVE without PhysicsFS])) +AC_SEARCH_LIBS([ModPlug_Load], [modplug], [], AC_MSG_ERROR([Can't LÖVE without ModPlug])) +AC_SEARCH_LIBS([ov_open], [vorbisfile], [], AC_MSG_ERROR([Can't LÖVE without VorbisFile])) + +# Includes +AC_CHECK_HEADER([freetype2/freetype/config/ftheader.h], [includes="$includes -I/usr/include/freetype2"]) + +# SDL 2, treated seperately because it combines setting SDL2_LIBS and SDL2_CFLAGS into one step +AM_PATH_SDL2([], [], AC_MSG_ERROR([Can't LÖVE without SDL 2])) + +# Lua, treated seperately because of --with-lua +AC_ARG_WITH([lua], [AS_HELP_STRING([--with-lua], [Select the lua implementation])], + [], [with_lua=lua]) +AC_ARG_WITH([luaversion], [AS_HELP_STRING([--with-luaversion], [Select the lua version])], + [], [with_luaversion=5.1]) + +AS_VAR_IF([with_luaversion], [5.2], [luatest=lua_version], [luatest=lua_pcall]) # use lua_version for 5.2 +AC_SEARCH_LIBS([$luatest], ["${with_lua}${with_luaversion}" "${with_lua}"], [], + AC_MSG_ERROR([Can't LÖVE without $with_lua])) +AC_CHECK_HEADER(["${with_lua}${with_luaversion}/lua.h"], [includes="$includes -I/usr/include/${with_lua}${with_luaversion}"], []) +AC_CHECK_HEADER(["${with_lua}/lua.h"], [includes="$includes -I/usr/include/${with_lua}"], []) + +# mpg123, treated seperately because it can be disabled (default on) +AC_ARG_ENABLE([mpg123], AC_HELP_STRING([--disable-mpg123], [Disable mp3 support, for patent-free builds]), [], [enable_mpg123=yes]) +AS_VAR_IF([enable_mpg123], [no], + AC_DEFINE([LOVE_NOMPG123], [], [Build without mpg123]), + # else + AC_SEARCH_LIBS([mpg123_open_feed], [mpg123], [], + AC_MSG_ERROR([Can't LÖVE without Mpg123])) + AC_SEARCH_LIBS([mpg123_seek_64], [mpg123], + AC_SUBST([FILE_OFFSET],[-D_FILE_OFFSET_BITS=64]), + AC_SUBST([FILE_OFFSET],[]))) + +# GME, treated seperately because it can be enabled (default off) +AC_ARG_ENABLE([gme], AC_HELP_STRING([--enable-gme], [Enable GME support, for more chiptuney goodness]), [], [enable_gme=no]) +AS_VAR_IF([enable_gme], [yes], + AC_SEARCH_LIBS([gme_open_data], [gme], [], AC_MSG_ERROR([Can't LÖVE without gme])) + AC_DEFINE([LOVE_SUPPORT_GME], [], [Enable gme]) + AC_CHECK_HEADER([gme/gme.h], [includes="$includes -I/usr/include/gme"], [])) + +# libenet check for socklen_t +AC_CHECK_TYPE([socklen_t], [AC_DEFINE([HAS_SOCKLEN_T], [1], [Define if socklen_t exists.] )], , + #include + #include +) + +# Optionally build the executable (default on) +AC_ARG_ENABLE([exe], + AC_HELP_STRING([--disable-exe], [Disable building of executable launcher]), [], [enable_exe=yes]) + +AS_VAR_IF([enable_exe], [no], [], #else + AC_DEFINE([LOVE_BUILD_EXE], [], [Don't build launcher])) + +AM_CONDITIONAL([LOVE_BUILD_EXE], [test "x$enable_exe" != xno]) +AM_CONDITIONAL([LOVE_NOMPG123], [test "x$enable_mpg123" == xno]) + +# Set our includes as automake variable +AC_SUBST([LOVE_INCLUDES], ["$includes"]) + +AC_CONFIG_FILES([ + Makefile + src/Makefile +]) +AC_OUTPUT diff --git a/jni/love/platform/unix/debian/changelog b/jni/love/platform/unix/debian/changelog new file mode 100644 index 00000000..c9b52249 --- /dev/null +++ b/jni/love/platform/unix/debian/changelog @@ -0,0 +1,5 @@ +love (0.9.0~ppatest5) precise; urgency=medium + + * Upstream testing release + + -- Bart van Strien Sat, 2 Nov 2013 16:23:40 +0100 diff --git a/jni/love/platform/unix/debian/compat b/jni/love/platform/unix/debian/compat new file mode 100644 index 00000000..ec635144 --- /dev/null +++ b/jni/love/platform/unix/debian/compat @@ -0,0 +1 @@ +9 diff --git a/jni/love/platform/unix/debian/control b/jni/love/platform/unix/debian/control new file mode 100644 index 00000000..d8bbc182 --- /dev/null +++ b/jni/love/platform/unix/debian/control @@ -0,0 +1,58 @@ +Source: love +Section: games +Priority: extra +Maintainer: Bart van Strien +Build-Depends: debhelper (>= 9), + autotools-dev, + libdevil-dev, + libfreetype6-dev, + libluajit-5.1-dev, + libphysfs-dev, + libsdl2-dev (>= 2.0.1), + libopenal-dev, + libogg-dev, + libvorbis-dev, + libflac-dev, + libflac++-dev, + libmodplug-dev, + libmpg123-dev, + libmng-dev +Standards-Version: 3.9.3 +Homepage: http://love2d.org + +Package: liblove +Architecture: any +Multi-Arch: same +Pre-Depends: ${misc:Pre-Depends} +Depends: ${misc:Depends}, + ${shlibs:Depends}, + libdevil1c2, + libmng1, + libfreetype6, + libgl1-mesa-glx, + libluajit-5.1-2, + libphysfs-1.0-0, + libsdl2 (>= 2.0.1), + libopenal1, + libogg0, + libvorbis0a, + libvorbisfile3, + libmodplug1, + libmpg123-0 +Description: LOVE is a free 2D game engine which enables easy game creation in Lua. + +Package: love +Architecture: any +Multi-Arch: same +Depends: ${misc:Depends}, + liblove (= ${binary:Version}) +Description: LOVE is a free 2D game engine which enables easy game creation in Lua. + +Package: love-dbg +Priority: extra +Section: debug +Architecture: any +Multi-Arch: same +Depends: ${misc:Depends}, + love (= ${binary:Version}), +Description: LOVE is a free 2D game engine which enables easy game creation in Lua. diff --git a/jni/love/platform/unix/debian/copyright b/jni/love/platform/unix/debian/copyright new file mode 100644 index 00000000..1f06aed4 --- /dev/null +++ b/jni/love/platform/unix/debian/copyright @@ -0,0 +1,20 @@ +Copyright (c) 2006-2010 LOVE Development Team + +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. \ No newline at end of file diff --git a/jni/love/platform/unix/debian/docs b/jni/love/platform/unix/debian/docs new file mode 100644 index 00000000..6f69fe09 --- /dev/null +++ b/jni/love/platform/unix/debian/docs @@ -0,0 +1,2 @@ +changes.txt +license.txt diff --git a/jni/love/platform/unix/debian/liblove.install b/jni/love/platform/unix/debian/liblove.install new file mode 100644 index 00000000..93beb289 --- /dev/null +++ b/jni/love/platform/unix/debian/liblove.install @@ -0,0 +1 @@ +usr/lib/*/liblove.so.* diff --git a/jni/love/platform/unix/debian/love.install b/jni/love/platform/unix/debian/love.install new file mode 100644 index 00000000..487155e2 --- /dev/null +++ b/jni/love/platform/unix/debian/love.install @@ -0,0 +1 @@ +usr/bin/love diff --git a/jni/love/platform/unix/debian/love.manpages b/jni/love/platform/unix/debian/love.manpages new file mode 100644 index 00000000..a510eb2e --- /dev/null +++ b/jni/love/platform/unix/debian/love.manpages @@ -0,0 +1 @@ +platform/unix/love.1 diff --git a/jni/love/platform/unix/debian/rules b/jni/love/platform/unix/debian/rules new file mode 100755 index 00000000..93c8611e --- /dev/null +++ b/jni/love/platform/unix/debian/rules @@ -0,0 +1,16 @@ +#!/usr/bin/make -f + +DEB_HOST_ARCH_CPU ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU) +DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) + +override_dh_auto_configure: + dh_auto_configure -- CPPFLAGS=-I/usr/include/luajit-2.0 --with-lua=luajit-5.1 + +override_dh_link: + dh_link -plove-dev usr/lib/$(DEB_HOST_MULTIARCH)/liblove.so.0.0.0 usr/lib/$(DEB_HOST_MULTIARCH)/liblove.so + +override_dh_strip: + dh_strip --dbg-package=love-dbg + +%: + dh $@ --parallel diff --git a/jni/love/platform/unix/debian/source/format b/jni/love/platform/unix/debian/source/format new file mode 100644 index 00000000..89ae9db8 --- /dev/null +++ b/jni/love/platform/unix/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/jni/love/platform/unix/exclude b/jni/love/platform/unix/exclude new file mode 100644 index 00000000..b233a4d1 --- /dev/null +++ b/jni/love/platform/unix/exclude @@ -0,0 +1,5 @@ +\./libraries/luasocket/libluasocket/wsocket\.* +\./modules/sound/lullaby/FLACDecoder\.* +\./love\.cpp +\./modules/sound/lullaby/Mpg123Decoder\.cpp +\./modules/sound/lullaby/Mpg123Decoder\.h diff --git a/jni/love/platform/unix/gen-makefile b/jni/love/platform/unix/gen-makefile new file mode 100644 index 00000000..e1791e8f --- /dev/null +++ b/jni/love/platform/unix/gen-makefile @@ -0,0 +1,48 @@ +#!/bin/bash +echo Generating src/Makefile.am ... +cd src +inc_current='$(srcdir)' +inc_modules="$inc_current/modules" +inc_libraries="$inc_current/libraries" + +cat > Makefile.am << EOF +AM_CPPFLAGS = -I$inc_current -I$inc_modules -I$inc_libraries -I$inc_libraries/enet/libenet/include \$(LOVE_INCLUDES) \$(FILE_OFFSET) +AM_CXXFLAGS = \$(SDL_CFLAGS) +AUTOMAKE_OPTIONS = subdir-objects +SUBDIRS = + +if LOVE_BUILD_EXE +# LÖVE executable +bin_PROGRAMS = love +#love_LDFLAGS = +love_LDADD = liblove.la +love_SOURCES = love.cpp +endif + +# Compile scripts +#scripts/%.lua.h: scripts/%.lua +# cd scripts; \ +# lua auto.lua \$* +#TODO: Figure out how to only do this on gnu make, and detect which lua +# executable to run + +# libLÖVE +lib_LTLIBRARIES = liblove.la +liblove_la_LDFLAGS = -module -export-dynamic \$(LDFLAGS) \$(SDL_LIBS) +liblove_la_SOURCES = \\ +EOF + +find . \( \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" -o -iname "*.lch" \) \) -exec echo '{}' \\ \; \ + | grep -v -f"../platform/unix/exclude" | head -c -3 >> Makefile.am + +printf "\n\n" >> Makefile.am +cat >> Makefile.am << EOF +if !LOVE_NOMPG123 +liblove_la_SOURCES += \\ +./modules/sound/lullaby/Mpg123Decoder.cpp \\ +./modules/sound/lullaby/Mpg123Decoder.h +endif +EOF + +cd .. +echo "src/Makefile.am is updated! ^.^" diff --git a/jni/love/platform/unix/love.1 b/jni/love/platform/unix/love.1 new file mode 100644 index 00000000..0abaa557 --- /dev/null +++ b/jni/love/platform/unix/love.1 @@ -0,0 +1,26 @@ +.\" (c) 2008-2011 Miriam Ruiz +.\" +.\" This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damagesarising 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. +.\" +.\" Modifications: +.\" - Update version to 0.9 and remove reference to doc dir - Bart van Strien, 2013 +.TH "LÖVE" "1" "0.9" "" "" +.SH "NAME" +love \- 2D game development framework +.SH "SYNOPSIS" +.B love +<\fIgame.love\fR> +.SH "DESCRIPTION" +LÖVE was created to be a user\-friendly engine in which simple (or complicated) games could be made without having extensive knowledge of system or graphics functions and without having to dedicate time towards developing the same engine features time and time again. +.P +Developed with cross\-platform implementation in mind, it utilizes the latest open source libraries to deliver a similar game experience, independent of operating system. By relying on the Lua scripting language for game\-specific programming, it allows even the novice game creator to quickly and efficiently develop an idea into a fully working game. +.SH "SEE ALSO" +You can find more information at \fIhttp://love2d.org/\fR diff --git a/jni/love/platform/unix/love.desktop.in b/jni/love/platform/unix/love.desktop.in new file mode 100644 index 00000000..3a9e2df1 --- /dev/null +++ b/jni/love/platform/unix/love.desktop.in @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=LÖVE +Comment=The unquestionably awesome 2D game engine +MimeType=application/x-love-game; +Exec=@bindir@/love +Type=Application +Categories=Development;Game; +Terminal=false +Icon=love +NoDisplay=true diff --git a/jni/love/platform/unix/love.svg b/jni/love/platform/unix/love.svg new file mode 100644 index 00000000..03267f0b --- /dev/null +++ b/jni/love/platform/unix/love.svg @@ -0,0 +1,1030 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/jni/love/platform/unix/love.xml b/jni/love/platform/unix/love.xml new file mode 100644 index 00000000..2ab5ac89 --- /dev/null +++ b/jni/love/platform/unix/love.xml @@ -0,0 +1,7 @@ + + + + LÖVE game + + + diff --git a/jni/love/platform/unix/postinst b/jni/love/platform/unix/postinst new file mode 100755 index 00000000..68e87b81 --- /dev/null +++ b/jni/love/platform/unix/postinst @@ -0,0 +1,5 @@ +#!/bin/sh + +update-mime-database /usr/share/mime +gtk-update-icon-cache --force /usr/share/icons/gnome +xdg-mime default love.desktop application/x-love-game diff --git a/jni/love/platform/unix/postrm b/jni/love/platform/unix/postrm new file mode 100755 index 00000000..7cb24e4b --- /dev/null +++ b/jni/love/platform/unix/postrm @@ -0,0 +1,4 @@ +#!/bin/sh + +update-mime-database /usr/share/mime +gtk-update-icon-cache --force /usr/share/icons/gnome diff --git a/jni/love/readme.md b/jni/love/readme.md new file mode 100644 index 00000000..918f97ab --- /dev/null +++ b/jni/love/readme.md @@ -0,0 +1,70 @@ +LÖVE is an *awesome* framework you can use to make 2D games in Lua. It's free, open-source, and works on Windows, Mac OS X and Linux. + +Documentation +------------- + +We use our [wiki][wiki] for documentation. +If you need further help, feel free to ask on our [forums][forums], and last but not least there's the irc channel [#love on OFTC][irc]. + +Compilation +----------- + +###Windows +Use the project files for Visual Studio 2010 located in the platform dir. + +###*nix +Run `platform/unix/automagic` from the repository root, then run ./configure and make. + + $ platform/unix/automagic + $ ./configure + $ make + +###OSX +Use the XCode project in platform/macosx. + +For both Windows and OSX there are dependencies available [here][dependencies]. + +Repository information +---------------------- + +We use the 'default' branch for development, and therefore it should not be considered stable. +Also used is the 'minor' branch, which is used for features in the next minor version and it is +not our development target (which would be the next revision). (Version numbers formatted major.minor.revision.) + +We tag all our releases (since we started using mercurial), and have binary downloads available for them. + +Builds +------ + +Releases are found in the 'downloads' section on bitbucket, are linked on [the site][site], +and there's a ppa for ubuntu, [ppa:bartbes/love-stable][stableppa]. + +There are also unstable/nightly builds: + +- Most can be found [here][builds]. +- For ubuntu linux they are in [ppa:bartbes/love-unstable][unstableppa] +- For arch linux there's [love-hg][aur] in the AUR. + +Dependencies +------------ + +- SDL2 +- OpenGL +- OpenAL +- Lua / LuaJIT / LLVM-lua +- DevIL with MNG and TIFF +- FreeType +- PhysicsFS +- ModPlug +- mpg123 +- Vorbisfile + +[site]: http://love2d.org +[wiki]: http://love2d.org/wiki +[forums]: http://love2d.org/forums +[irc]: irc://irc.oftc.net/love +[dependencies]: http://love2d.org/sdk +[builds]: http://love2d.org/builds +[stableppa]: https://launchpad.net/~bartbes/+archive/love-stable +[unstableppa]: https://launchpad.net/~bartbes/+archive/love-unstable +[aur]: http://aur.archlinux.org/packages.php?ID=35279 diff --git a/jni/love/src/common/Data.h b/jni/love/src/common/Data.h new file mode 100644 index 00000000..89068d8b --- /dev/null +++ b/jni/love/src/common/Data.h @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_DATA_H +#define LOVE_DATA_H + +// LOVE +#include "config.h" +#include "Object.h" + +namespace love +{ + +/** + * This class is a simple abstraction over all objects which contain data. + **/ +class Data : public Object +{ +public: + + /** + * Destructor. + **/ + virtual ~Data() {}; + + /** + * Gets a pointer to the data. This pointer will obviously not + * be valid if the Data object is destroyed. + **/ + virtual void *getData() const = 0 ; + + /** + * Gets the size of the Data in bytes. + **/ + virtual int getSize() const = 0; + +}; // Data + +} // love + +#endif // LOVE_DATA_H diff --git a/jni/love/src/common/EnumMap.h b/jni/love/src/common/EnumMap.h new file mode 100644 index 00000000..1b105f56 --- /dev/null +++ b/jni/love/src/common/EnumMap.h @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_ENUM_MAP_H +#define LOVE_ENUM_MAP_H + +#include "Exception.h" + +namespace love +{ + +template +class EnumMap +{ +public: + + struct Entry + { + T t; + U u; + }; + + EnumMap(Entry *entries, unsigned size) + { + unsigned n = size/sizeof(Entry); + + for (unsigned i = 0; i + +namespace love +{ + +Exception::Exception(const char *fmt, ...) +{ + va_list args; + int size_buffer = 256, size_out; + char *buffer; + while (true) + { + buffer = new char[size_buffer]; + memset(buffer, 0, size_buffer); + + va_start(args, fmt); + size_out = vsnprintf(buffer, size_buffer, fmt, args); + va_end(args); + + // see http://perfec.to/vsnprintf/pasprintf.c + // if size_out ... + // == -1 --> output was truncated + // == size_buffer --> output was truncated + // == size_buffer-1 --> ambiguous, /may/ have been truncated + // > size_buffer --> output was truncated, and size_out + // bytes would have been written + if (size_out == size_buffer || size_out == -1 || size_out == size_buffer-1) + size_buffer *= 2; + else if (size_out > size_buffer) + size_buffer = size_out + 2; // to avoid the ambiguous case + else + break; + + delete[] buffer; + } + message = std::string(buffer); + delete[] buffer; +} + +} diff --git a/jni/love/src/common/Exception.h b/jni/love/src/common/Exception.h new file mode 100644 index 00000000..90dd3b49 --- /dev/null +++ b/jni/love/src/common/Exception.h @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_EXCEPTION_H +#define LOVE_EXCEPTION_H + +#include +#include // vararg +#include // vsnprintf +#include // strncpy +#include + +namespace love +{ + +/** + * A convenient vararg-enabled exception class. + **/ +class Exception : public std::exception +{ +public: + + /** + * Creates a new Exception according to printf-rules. + * + * See: http://www.cplusplus.com/reference/clibrary/cstdio/printf/ + * + * @param fmt The format string (see printf). + **/ + Exception(const char *fmt, ...); + virtual ~Exception() throw() {} + + /** + * Returns a string containing reason for the exception. + * @return A description of the exception. + **/ + inline virtual const char *what() const throw() + { + return message.c_str(); + } + +private: + + std::string message; + +}; // Exception + +} // love + +#endif // LOVE_EXCEPTION_H diff --git a/jni/love/src/common/Matrix.cpp b/jni/love/src/common/Matrix.cpp new file mode 100644 index 00000000..b1e9d8dc --- /dev/null +++ b/jni/love/src/common/Matrix.cpp @@ -0,0 +1,212 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Matrix.h" + +// STD +#include // memcpy +#include + +namespace love +{ + +// | e0 e4 e8 e12 | +// | e1 e5 e9 e13 | +// | e2 e6 e10 e14 | +// | e3 e7 e11 e15 | + +Matrix::Matrix() +{ + setIdentity(); +} + +Matrix::~Matrix() +{ +} + +// | e0 e4 e8 e12 | +// | e1 e5 e9 e13 | +// | e2 e6 e10 e14 | +// | e3 e7 e11 e15 | +// | e0 e4 e8 e12 | +// | e1 e5 e9 e13 | +// | e2 e6 e10 e14 | +// | e3 e7 e11 e15 | + +Matrix Matrix::operator * (const Matrix &m) const +{ + Matrix t; + + t.e[0] = (e[0]*m.e[0]) + (e[4]*m.e[1]) + (e[8]*m.e[2]) + (e[12]*m.e[3]); + t.e[4] = (e[0]*m.e[4]) + (e[4]*m.e[5]) + (e[8]*m.e[6]) + (e[12]*m.e[7]); + t.e[8] = (e[0]*m.e[8]) + (e[4]*m.e[9]) + (e[8]*m.e[10]) + (e[12]*m.e[11]); + t.e[12] = (e[0]*m.e[12]) + (e[4]*m.e[13]) + (e[8]*m.e[14]) + (e[12]*m.e[15]); + + t.e[1] = (e[1]*m.e[0]) + (e[5]*m.e[1]) + (e[9]*m.e[2]) + (e[13]*m.e[3]); + t.e[5] = (e[1]*m.e[4]) + (e[5]*m.e[5]) + (e[9]*m.e[6]) + (e[13]*m.e[7]); + t.e[9] = (e[1]*m.e[8]) + (e[5]*m.e[9]) + (e[9]*m.e[10]) + (e[13]*m.e[11]); + t.e[13] = (e[1]*m.e[12]) + (e[5]*m.e[13]) + (e[9]*m.e[14]) + (e[13]*m.e[15]); + + t.e[2] = (e[2]*m.e[0]) + (e[6]*m.e[1]) + (e[10]*m.e[2]) + (e[14]*m.e[3]); + t.e[6] = (e[2]*m.e[4]) + (e[6]*m.e[5]) + (e[10]*m.e[6]) + (e[14]*m.e[7]); + t.e[10] = (e[2]*m.e[8]) + (e[6]*m.e[9]) + (e[10]*m.e[10]) + (e[14]*m.e[11]); + t.e[14] = (e[2]*m.e[12]) + (e[6]*m.e[13]) + (e[10]*m.e[14]) + (e[14]*m.e[15]); + + t.e[3] = (e[3]*m.e[0]) + (e[7]*m.e[1]) + (e[11]*m.e[2]) + (e[15]*m.e[3]); + t.e[7] = (e[3]*m.e[4]) + (e[7]*m.e[5]) + (e[11]*m.e[6]) + (e[15]*m.e[7]); + t.e[11] = (e[3]*m.e[8]) + (e[7]*m.e[9]) + (e[11]*m.e[10]) + (e[15]*m.e[11]); + t.e[15] = (e[3]*m.e[12]) + (e[7]*m.e[13]) + (e[11]*m.e[14]) + (e[15]*m.e[15]); + + return t; +} + +void Matrix::operator *= (const Matrix &m) +{ + Matrix t = (*this) * m; + memcpy((void *)this->e, (void *)t.e, sizeof(float)*16); +} + +const float *Matrix::getElements() const +{ + return e; +} + +void Matrix::setIdentity() +{ + memset(e, 0, sizeof(float)*16); + e[0] = e[5] = e[10] = e[15] = 1; +} + +void Matrix::setTranslation(float x, float y) +{ + setIdentity(); + e[12] = x; + e[13] = y; +} + +void Matrix::setRotation(float rad) +{ + setIdentity(); + float c = cosf(rad), s = sinf(rad); + e[0] = c; + e[4] = -s; + e[1] = s; + e[5] = c; +} + +void Matrix::setScale(float sx, float sy) +{ + setIdentity(); + e[0] = sx; + e[5] = sy; +} + +void Matrix::setShear(float kx, float ky) +{ + setIdentity(); + e[1] = ky; + e[4] = kx; +} + +void Matrix::setTransformation(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + memset(e, 0, sizeof(float)*16); // zero out matrix + float c = cosf(angle), s = sinf(angle); + // matrix multiplication carried out on paper: + // |1 x| |c -s | |sx | | 1 ky | |1 -ox| + // | 1 y| |s c | | sy | |kx 1 | | 1 -oy| + // | 1 | | 1 | | 1 | | 1 | | 1 | + // | 1| | 1| | 1| | 1| | 1 | + // move rotate scale skew origin + e[10] = e[15] = 1.0f; + e[0] = c * sx - ky * s * sy; // = a + e[1] = s * sx + ky * c * sy; // = b + e[4] = kx * c * sx - s * sy; // = c + e[5] = kx * s * sx + c * sy; // = d + e[12] = x - ox * e[0] - oy * e[4]; + e[13] = y - ox * e[1] - oy * e[5]; +} + +void Matrix::translate(float x, float y) +{ + Matrix t; + t.setTranslation(x, y); + this->operator *=(t); +} + +void Matrix::rotate(float rad) +{ + Matrix t; + t.setRotation(rad); + this->operator *=(t); +} + +void Matrix::scale(float sx, float sy) +{ + Matrix t; + t.setScale(sx, sy); + this->operator *=(t); +} + +void Matrix::shear(float kx, float ky) +{ + Matrix t; + t.setShear(kx,ky); + this->operator *=(t); +} + +// | x | +// | y | +// | 0 | +// | 1 | +// | e0 e4 e8 e12 | +// | e1 e5 e9 e13 | +// | e2 e6 e10 e14 | +// | e3 e7 e11 e15 | + +void Matrix::transform(Vertex *dst, const Vertex *src, int size) const +{ + for (int i = 0; i + +namespace love +{ + +std::map Memoizer::objectMap; + +void Memoizer::add(void *key, void *val) +{ + objectMap[key] = val; +} + +void Memoizer::remove(void *key) +{ + objectMap.erase(key); +} + +void *Memoizer::find(void *key) +{ + if (objectMap.count(key)) return objectMap[key]; + return NULL; +} + +} // love diff --git a/jni/love/src/common/Memoizer.h b/jni/love/src/common/Memoizer.h new file mode 100644 index 00000000..6248e5d3 --- /dev/null +++ b/jni/love/src/common/Memoizer.h @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MEMOIZER_H +#define LOVE_MEMOIZER_H + +#include + +namespace love +{ + +class Memoizer +{ +public: + + static void add(void *key, void *val); + + static void remove(void *key); + + static void *find(void *key); + +private: + + static std::map objectMap; +}; // Memoizer + +} // love + +#endif // LOVE_MEMOIZER_H diff --git a/jni/love/src/common/Module.cpp b/jni/love/src/common/Module.cpp new file mode 100644 index 00000000..4a75fe78 --- /dev/null +++ b/jni/love/src/common/Module.cpp @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Module.h" +#include "Exception.h" + +// std +#include +#include +#include + +namespace +{ + typedef std::map ModuleRegistry; + + // The registry must be dynamically managed, because some modules + // (the math module) are static globals that are not guaranteed to + // be destroyed before other static globals. + ModuleRegistry *registry = nullptr; + + ModuleRegistry ®istryInstance() + { + if (!registry) + registry = new ModuleRegistry; + + return *registry; + } + + void freeEmptyRegistry() + { + if (registry && registry->empty()) + { + delete registry; + registry = nullptr; + } + } + +} // anonymous namespace + +namespace love +{ + +Module::~Module() +{ + ModuleRegistry ®istry = registryInstance(); + + // We can't use the overridden Module::getName() in this destructor. + for (auto it = registry.begin(); it != registry.end(); ++it) + { + if (it->second == this) + { + registry.erase(it); + break; + } + } + + freeEmptyRegistry(); +} + +void Module::registerInstance(Module *instance) +{ + if (instance == nullptr) + throw Exception("Module instance is NULL"); + + std::string name(instance->getName()); + + ModuleRegistry ®istry = registryInstance(); + + auto it = registry.find(name); + + if (it != registry.end()) + { + if (it->second == instance) + return; + throw Exception("Module %s already registered!", instance->getName()); + } + + registry.insert(make_pair(name, instance)); +} + +Module *Module::getInstance(const std::string &name) +{ + ModuleRegistry ®istry = registryInstance(); + + auto it = registry.find(name); + + if (registry.end() == it) + return nullptr; + + return it->second; +} + +Module *Module::findInstance(const std::string &name) +{ + ModuleRegistry ®istry = registryInstance(); + + for (auto it = registry.begin(); it != registry.end(); ++it) + { + if (it->first.find(name) == 0) + return it->second; + } + + return nullptr; +} + +} // love diff --git a/jni/love/src/common/Module.h b/jni/love/src/common/Module.h new file mode 100644 index 00000000..e317b4f9 --- /dev/null +++ b/jni/love/src/common/Module.h @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MODULE_H +#define LOVE_MODULE_H + +// LOVE +#include "runtime.h" +#include "Exception.h" +#include "Object.h" + +namespace love +{ +/** + * Abstract superclass for all modules. + **/ +class Module : public Object +{ +public: + + /** + * Destructor. + **/ + virtual ~Module(); + + /** + * Gets the name of the module. This is used in case of errors + * and other messages. + * + * @return The full name of the module, eg. love.graphics.opengl. + **/ + virtual const char *getName() const = 0; + + /** + * Add module to internal registry. To be used /only/ in + * runtime.cpp:luax_register_module() + * @param instance The module instance. + */ + static void registerInstance(Module *instance); + + /** + * Retrieve module instance from internal registry. May return NULL + * if module not registered. + * @param name The full name of the module. + * @return Module instance or NULL if the module is not registered. + */ + static Module *getInstance(const std::string &name); + + /** + * Find the first module instance from the internal registry whose name + * starts with the supplied name. May return NULL if module is not + * registered or the supplied name is not part of any module name. + * @param name The partial name of the module. + * @return Module instance or NULL if the module is not registered. + **/ + static Module *findInstance(const std::string &name); + +}; // Module + +} // love + +#endif // LOVE_MODULE_H diff --git a/jni/love/src/common/Object.cpp b/jni/love/src/common/Object.cpp new file mode 100644 index 00000000..9a042139 --- /dev/null +++ b/jni/love/src/common/Object.cpp @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Object.h" + +namespace love +{ + +Object::Object() + : count(1) +{ +} + +Object::~Object() +{ +} + +int Object::getReferenceCount() const +{ + return count; +} + +void Object::retain() +{ + ++count; +} + +void Object::release() +{ + if (--count <= 0) + delete this; +} + +} // love diff --git a/jni/love/src/common/Object.h b/jni/love/src/common/Object.h new file mode 100644 index 00000000..99e64919 --- /dev/null +++ b/jni/love/src/common/Object.h @@ -0,0 +1,102 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_OBJECT_H +#define LOVE_OBJECT_H + +namespace love +{ + +/** + * Superclass for all object that should be able to cross the Lua/C border + * (this pertains to most objects). + * + * This class is an alternative to using smart pointers; it contains retain/release + * methods, and will delete itself with the reference count hits zero. The wrapper + * code assumes that all userdata inherits from this class. + **/ +class Object +{ +public: + + /** + * Constructor. Sets reference count to one. + **/ + Object(); + + /** + * Destructor. + **/ + virtual ~Object() = 0; + + /** + * Gets the reference count of this Object. + * @returns The reference count. + **/ + int getReferenceCount() const; + + /** + * Retains the Object, i.e. increases the + * reference count by one. + **/ + virtual void retain(); + + /** + * Releases one reference to the Object, i.e. decrements the + * reference count by one, and potentially deletes the Object + * if there are no more references. + **/ + virtual void release(); + + /** + * Meant to be used as a temporary object. Facilitates safer and cleaner + * code to release objects by doing so when the AutoRelease object is + * destroyed (e.g. goes out of scope.) + **/ + class AutoRelease + { + public: + + AutoRelease(Object *obj) + : object(obj) + { + } + + ~AutoRelease() + { + if (object) + object->release(); + } + + private: + + AutoRelease() {} + Object *object; + + }; // AutoRelease + +private: + + // The reference count. + int count; +}; // Object +} // love + +#endif // LOVE_OBJECT_H diff --git a/jni/love/src/common/Reference.cpp b/jni/love/src/common/Reference.cpp new file mode 100644 index 00000000..3fb44d6f --- /dev/null +++ b/jni/love/src/common/Reference.cpp @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Reference.h" + +namespace love +{ + +const char REFERENCE_TABLE_NAME[] = "love-references"; + +Reference::Reference() + : L(0) + , idx(LUA_REFNIL) +{ +} + +Reference::Reference(lua_State *L) + : L(L) + , idx(LUA_REFNIL) +{ + ref(L); +} + +Reference::~Reference() +{ + unref(); +} + +void Reference::ref(lua_State *L) +{ + unref(); // Just to be safe. + this->L = L; + luax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME); + lua_insert(L, -2); // Move reference table behind value. + idx = luaL_ref(L, -2); + lua_pop(L, 1); +} + +void Reference::unref() +{ + if (idx != LUA_REFNIL) + { + luax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME); + luaL_unref(L, -1, idx); + lua_pop(L, 1); + idx = LUA_REFNIL; + } +} + +void Reference::push() +{ + if (idx != LUA_REFNIL) + { + luax_insist(L, LUA_REGISTRYINDEX, REFERENCE_TABLE_NAME); + lua_rawgeti(L, -1, idx); + lua_remove(L, -2); + } + else + lua_pushnil(L); +} + +lua_State *Reference::getL() +{ + return L; +} + +} // love diff --git a/jni/love/src/common/Reference.h b/jni/love/src/common/Reference.h new file mode 100644 index 00000000..59cc9a72 --- /dev/null +++ b/jni/love/src/common/Reference.h @@ -0,0 +1,88 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_REFERENCE_H +#define LOVE_REFERENCE_H + +// LOVE +#include "runtime.h" + +namespace love +{ + +/** + * This class wraps the reference functionality built into + * Lua, which allows C++ code to refer to Lua variables. + **/ +class Reference +{ +public: + + /** + * Creates the reference object, but does not create + * the actual reference. + **/ + Reference(); + + /** + * Creates the object and a reference to the value + * on the top of the stack. + **/ + Reference(lua_State *L); + + /** + * Deletes the reference, if any. + **/ + virtual ~Reference(); + + /** + * Creates a reference to the value on the + * top of the stack. + **/ + void ref(lua_State *L); + + /** + * Unrefs the reference, if any. + **/ + void unref(); + + /** + * Pushes the referred value onto the stack. + **/ + void push(); + + /** + * Gets the Lua state associated with this + * reference. + **/ + lua_State *getL(); + +private: + + // The Lua state in which the reference resides. + lua_State *L; + + // Index to the Lua reference. + int idx; +}; + +} // love + +#endif // LOVE_REFERENCE_H diff --git a/jni/love/src/common/StringMap.h b/jni/love/src/common/StringMap.h new file mode 100644 index 00000000..7fa1f9b5 --- /dev/null +++ b/jni/love/src/common/StringMap.h @@ -0,0 +1,168 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_STRING_MAP_H +#define LOVE_STRING_MAP_H + +#include "Exception.h" + +namespace love +{ + +template +class StringMap +{ +public: + + struct Entry + { + const char *key; + T value; + }; + + StringMap(Entry *entries, unsigned num) + { + + for (unsigned i = 0; i < SIZE; ++i) + reverse[i] = 0; + + unsigned n = num/sizeof(Entry); + + for (unsigned i = 0; i < n; ++i) + { + add(entries[i].key, entries[i].value); + } + } + + bool streq(const char *a, const char *b) + { + while (*a != 0 && *b != 0) + { + if (*a != *b) + return false; + ++a; + ++b; + } + + return (*a == 0 && *b == 0); + } + + bool find(const char *key, T &t) + { + unsigned str_hash = djb2(key); + + for (unsigned i = 0; i < MAX; ++i) + { + unsigned str_i = (str_hash + i) % MAX; + + if (!records[str_i].set) + return false; + + if (streq(records[str_i].key, key)) + { + t = records[str_i].value; + return true; + } + } + + return false; + } + + bool find(T key, const char *&str) + { + unsigned index = (unsigned)key; + + if (index >= SIZE) + return false; + + if (reverse[index] != 0) + { + str = reverse[index]; + return true; + } + else + { + return false; + } + } + + bool add(const char *key, T value) + { + unsigned str_hash = djb2(key); + bool inserted = false; + + for (unsigned i = 0; i < MAX; ++i) + { + unsigned str_i = (str_hash + i) % MAX; + + if (!records[str_i].set) + { + inserted = true; + records[str_i].set = true; + records[str_i].key = key; + records[str_i].value = value; + break; + } + } + + unsigned index = (unsigned)value; + + if (index >= SIZE) + { + printf("\nConstant %s out of bounds with %i!\n", key, index); + return false; + } + + reverse[index] = key; + + return inserted; + } + + unsigned djb2(const char *key) + { + unsigned hash = 5381; + int c; + + while ((c = *key++)) + hash = ((hash << 5) + hash) + c; + + return hash; + } + +private: + + struct Record + { + const char *key; + T value; + bool set; + Record() : set(false) {} + }; + + const static unsigned MAX = SIZE*2; + + Record records[MAX]; + const char *reverse[SIZE]; + +}; // StringMap + +} // love + +#endif // LOVE_STRING_MAP_H diff --git a/jni/love/src/common/Variant.cpp b/jni/love/src/common/Variant.cpp new file mode 100644 index 00000000..b1aa939d --- /dev/null +++ b/jni/love/src/common/Variant.cpp @@ -0,0 +1,255 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Variant.h" +#include "common/StringMap.h" + +namespace love +{ + +extern StringMap types; + +static love::Type extractudatatype(lua_State *L, int idx) +{ + Type t = INVALID_ID; + if (!lua_isuserdata(L, idx)) + return t; + if (luaL_getmetafield(L, idx, "__tostring") == 0) + return t; + lua_pushvalue(L, idx); + int result = lua_pcall(L, 1, 1, 0); + if (result == 0) + types.find(lua_tostring(L, -1), t); + if (result == 0 || result == LUA_ERRRUN) + lua_pop(L, 1); + return t; +} + +static inline void delete_table(std::vector > *table) +{ + while (!table->empty()) + { + std::pair &kv = table->back(); + kv.first->release(); + kv.second->release(); + table->pop_back(); + } + delete table; +} + +Variant::Variant() + : type(NIL) + , data() +{ +} + +Variant::Variant(bool boolean) + : type(BOOLEAN) +{ + data.boolean = boolean; +} + +Variant::Variant(double number) + : type(NUMBER) +{ + data.number = number; +} + +Variant::Variant(const char *string, size_t len) + : type(STRING) +{ + char *buf = new char[len+1]; + memset(buf, 0, len+1); + memcpy(buf, string, len); + data.string.str = buf; + data.string.len = len; +} + +Variant::Variant(char c) + : type(CHARACTER) +{ + data.character = c; +} + +Variant::Variant(void *userdata) + : type(LUSERDATA) +{ + data.userdata = userdata; +} + +Variant::Variant(love::Type udatatype, void *userdata) + : type(FUSERDATA) + , udatatype(udatatype) +{ + if (udatatype != INVALID_ID) + { + Proxy *p = (Proxy *) userdata; + flags = p->flags; + data.userdata = p->data; + ((love::Object *) data.userdata)->retain(); + } + else + data.userdata = userdata; +} + +// Variant gets ownership of the vector. +Variant::Variant(std::vector > *table) + : type(TABLE) +{ + data.table = table; +} + +Variant::~Variant() +{ + switch (type) + { + case STRING: + delete[] data.string.str; + break; + case FUSERDATA: + ((love::Object *) data.userdata)->release(); + break; + case TABLE: + delete_table(data.table); + default: + break; + } +} + +Variant *Variant::fromLua(lua_State *L, int n, bool allowTables) +{ + Variant *v = NULL; + size_t len; + const char *str; + if (n < 0) // Fix the stack position, we might modify it later + n += lua_gettop(L) + 1; + + switch (lua_type(L, n)) + { + case LUA_TBOOLEAN: + v = new Variant(luax_toboolean(L, n)); + break; + case LUA_TNUMBER: + v = new Variant(lua_tonumber(L, n)); + break; + case LUA_TSTRING: + str = lua_tolstring(L, n, &len); + v = new Variant(str, len); + break; + case LUA_TLIGHTUSERDATA: + v = new Variant(lua_touserdata(L, n)); + break; + case LUA_TUSERDATA: + v = new Variant(extractudatatype(L, n), lua_touserdata(L, n)); + break; + case LUA_TNIL: + v = new Variant(); + break; + case LUA_TTABLE: + if (allowTables) + { + bool success = true; + std::vector > *table = new std::vector >(); + lua_pushnil(L); + while (lua_next(L, n)) + { + Variant *key = fromLua(L, -2, false); + if (!key) + { + success = false; + lua_pop(L, 2); + break; + } + + Variant *value = fromLua(L, -1, false); + if (!value) + { + delete key; + success = false; + lua_pop(L, 2); + break; + } + + table->push_back(std::make_pair(key, value)); + + lua_pop(L, 1); + } + + if (success) + v = new Variant(table); + else + delete_table(table); + } + break; + } + return v; +} + +void Variant::toLua(lua_State *L) +{ + switch (type) + { + case BOOLEAN: + lua_pushboolean(L, data.boolean); + break; + case CHARACTER: + lua_pushlstring(L, &data.character, 1); + break; + case NUMBER: + lua_pushnumber(L, data.number); + break; + case STRING: + lua_pushlstring(L, data.string.str, data.string.len); + break; + case LUSERDATA: + lua_pushlightuserdata(L, data.userdata); + break; + case FUSERDATA: + if (udatatype != INVALID_ID) + { + const char *name = NULL; + love::types.find(udatatype, name); + ((love::Object *) data.userdata)->retain(); + luax_pushtype(L, name, flags, (love::Object *) data.userdata); + } + else + lua_pushlightuserdata(L, data.userdata); + // I know this is not the same + // sadly, however, it's the most + // I can do (at the moment). + break; + case TABLE: + lua_newtable(L); + for (size_t i = 0; i < data.table->size(); ++i) + { + std::pair &kv = data.table->at(i); + kv.first->toLua(L); + kv.second->toLua(L); + lua_settable(L, -3); + } + break; + case NIL: + default: + lua_pushnil(L); + break; + } +} + +} // love diff --git a/jni/love/src/common/Variant.h b/jni/love/src/common/Variant.h new file mode 100644 index 00000000..e75c676d --- /dev/null +++ b/jni/love/src/common/Variant.h @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_VARIANT_H +#define LOVE_VARIANT_H + +#include "common/runtime.h" +#include "common/Object.h" + +#include +#include +#include + +namespace love +{ + +class Variant : public love::Object +{ +public: + + Variant(); + Variant(bool boolean); + Variant(double number); + Variant(const char *string, size_t len); + Variant(char c); + Variant(void *userdata); + Variant(love::Type udatatype, void *userdata); + Variant(std::vector > *table); + virtual ~Variant(); + + static Variant *fromLua(lua_State *L, int n, bool allowTables = true); + void toLua(lua_State *L); + +private: + enum Type + { + UNKNOWN = 0, + BOOLEAN, + NUMBER, + CHARACTER, + STRING, + LUSERDATA, + FUSERDATA, + NIL, + TABLE + } type; + union + { + bool boolean; + char character; + double number; + struct + { + const char *str; + size_t len; + } string; + void *userdata; + std::vector > *table; + } data; + love::Type udatatype; + bits flags; + +}; // Variant +} // love + +#endif // LOVE_VARIANT_H diff --git a/jni/love/src/common/Vector.cpp b/jni/love/src/common/Vector.cpp new file mode 100644 index 00000000..41c7f56c --- /dev/null +++ b/jni/love/src/common/Vector.cpp @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Vector.h" + +namespace love +{ +// Implementation in header. +} \ No newline at end of file diff --git a/jni/love/src/common/Vector.h b/jni/love/src/common/Vector.h new file mode 100644 index 00000000..528fdaaa --- /dev/null +++ b/jni/love/src/common/Vector.h @@ -0,0 +1,325 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_VECTOR_H +#define LOVE_VECTOR_H + +// STD +#include + +// LOVE +#include "Matrix.h" + +namespace love +{ + +/** + * 2D Vector class. + * + * @author Anders Ruud + * @date 2006-05-13 + **/ +class Vector +{ +public: + + // The components. + float x, y; + + /** + * Creates a new (1,1) Vector. + **/ + Vector(); + + /** + * Creates a new Vector. + * @param x The x position/dimension. + * @param y The y position/dimension. + **/ + Vector(float x, float y); + + /** + * Gets the length of the Vector. + * @return The length of the Vector. + * + * This method requires sqrtf() and should be used + * carefully. + **/ + float getLength() const; + + /** + * Normalizes the Vector. + * @param length Desired length of the vector. + * @return The old length of the Vector. + **/ + float normalize(float length = 1.0); + + /** + * Gets a vector perpendicular to the Vector. + * To get the true (normalized) normal, use v.getNormal(1.0f / v.getLength()) + * @return A normal to the Vector. + **/ + Vector getNormal() const; + + /** + * Gets a vector perpendicular to the Vector. + * To get the true (normalized) normal, use v.getNormal(1.0f / v.getLength()) + * @param scale factor to apply. + * @return A normal to the Vector. + **/ + Vector getNormal(float scale) const; + + /** + * Adds a Vector to this Vector. + * @param v The Vector we want to add to this Vector. + * @return The resulting Vector. + **/ + Vector operator + (const Vector &v) const; + + /** + * Substracts a Vector to this Vector. + * @param v The Vector we want to subtract to this Vector. + * @return The resulting Vector. + **/ + Vector operator - (const Vector &v) const; + + /** + * Resizes a Vector by a scalar. + * @param s The scalar with which to resize the Vector. + * @return The resulting Vector. + **/ + Vector operator * (float s) const; + + /** + * Resizes a Vector by a scalar. + * @param s The scalar with which to resize the Vector. + * @return The resulting Vector. + **/ + Vector operator / (float s) const; + + /** + * Reverses the Vector. + * @return The reversed Vector. + **/ + Vector operator - () const; + + /** + * Adds a Vector to this Vector, and also saves changes in the first Vector. + * @param v The Vector we want to add to this Vector. + **/ + void operator += (const Vector &v); + + /** + * Subtracts a Vector to this Vector, and also saves changes in the first Vector. + * @param v The Vector we want to subtract to this Vector. + **/ + void operator -= (const Vector &v); + + /** + * Resizes the Vector, and also saves changes in the first Vector. + * @param s The scalar by which we want to resize the Vector. + **/ + void operator *= (float s); + + /** + * Resizes the Vector, and also saves changes in the first Vector. + * @param s The scalar by which we want to resize the Vector. + **/ + void operator /= (float s); + + /** + * Calculates the dot product of two Vectors. + * @return The dot product of the two Vectors. + **/ + float operator * (const Vector &v) const; + + /** + * Calculates the cross product of two Vectors. + * @return The cross product of the two Vectors. + **/ + float operator ^ (const Vector &v) const; + + bool operator == (const Vector &v) const; + + bool operator < (const Vector &v) const; + /** + * Gets the x value of the Vector. + * @return The x value of the Vector. + **/ + float getX() const; + + /** + * Gets the x value of the Vector. + * @return The x value of the Vector. + **/ + float getY() const; + + /** + * Sets the x value of the Vector. + * @param x The x value of the Vector. + **/ + void setX(float x); + + /** + * Sets the x value of the Vector. + * @param y The x value of the Vector. + **/ + void setY(float y); + +}; + +inline float Vector::getLength() const +{ + return sqrtf(x*x + y*y); +} + +inline Vector Vector::getNormal() const +{ + return Vector(-y, x); +} + +inline Vector Vector::getNormal(float scale) const +{ + return Vector(-y * scale, x * scale); +} + +inline float Vector::normalize(float length) +{ + + float length_current = getLength(); + + if (length_current > 0) + (*this) *= length / length_current; + + return length_current; +} + +/** + * Inline methods must have body in header. + **/ + +inline Vector::Vector() +{ + x = 1; + y = 1; +} + +inline Vector::Vector(float x, float y) +{ + this->x = x; + this->y = y; +} + +inline Vector Vector::operator + (const Vector &v) const +{ + return Vector(x + v.x, y + v.y); +} + +inline Vector Vector::operator - (const Vector &v) const +{ + return Vector(x - v.getX(), y - v.getY()); +} + +inline Vector Vector::operator * (float s) const +{ + return Vector(x*s, y*s); +} + +inline Vector Vector::operator / (float s) const +{ + return Vector(x/s, y/s); +} + +inline Vector Vector::operator - () const +{ + return Vector(-x, -y); +} + +inline void Vector::operator += (const Vector &v) +{ + x += v.getX(); + y += v.getY(); +} + +inline void Vector::operator -= (const Vector &v) +{ + x -= v.getX(); + y -= v.getY(); +} + +inline void Vector::operator *= (float s) +{ + x *= s; + y *= s; +} + +inline void Vector::operator /= (float s) +{ + x /= s; + y /= s; +} + +inline float Vector::operator * (const Vector &v) const +{ + return x * v.getX() + y * v.getY(); +} + +inline float Vector::operator ^ (const Vector &v) const +{ + return x * v.getY() - y * v.getX(); +} + +inline bool Vector::operator == (const Vector &v) const +{ + return getLength() == v.getLength(); +} + +inline bool Vector::operator < (const Vector &v) const +{ + return getLength() < v.getLength(); +} + +/** + * Accessor methods + **/ + +inline float Vector::getX() const +{ + return x; +} + +inline float Vector::getY() const +{ + return y; +} + +inline void Vector::setX(float x) +{ + this->x = x; +} + +inline void Vector::setY(float y) +{ + this->y = y; +} + +} //love + +#endif// LOVE_VECTOR_H diff --git a/jni/love/src/common/b64.cpp b/jni/love/src/common/b64.cpp new file mode 100644 index 00000000..96f80596 --- /dev/null +++ b/jni/love/src/common/b64.cpp @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "b64.h" + +namespace love +{ + +static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq"; + +void b64_decode_block(char in[4], char out[3]) +{ + out[0] = (char)(in[0] << 2 | in[1] >> 4); + out[1] = (char)(in[1] << 4 | in[2] >> 2); + out[2] = (char)(((in[2] << 6) & 0xc0) | in[3]); +} + +char *b64_decode(const char *src, int slen, int &size) +{ + size = (slen / 4) * 3; + + char *dst = new char[size]; + char *d = dst; + + char in[4] = {0}, out[3], v; + int i, len, pos = 0; + + while (pos <= slen) + { + for (len = 0, i = 0; i < 4 && pos <= slen; i++) + { + v = 0; + + while (pos <= slen && v == 0) + { + v = src[pos++]; + v = (char)((v < 43 || v > 122) ? 0 : cd64[v - 43]); + if (v) + v = (char)((v == '$') ? 0 : v - 61); + } + + if (pos <= slen) + { + len++; + if (v) + in[i] = (char)(v - 1); + } + else + in[i] = 0; + } + + if (len) + { + b64_decode_block(in, out); + for (i = 0; i < len - 1; i++) + *(d++) = out[i]; + } + } + + return dst; +} + +} // love diff --git a/jni/love/src/common/b64.h b/jni/love/src/common/b64.h new file mode 100644 index 00000000..e0c82d63 --- /dev/null +++ b/jni/love/src/common/b64.h @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "config.h" + +#ifndef LOVE_B64_H +#define LOVE_B64_H + +namespace love +{ + +/** + * Decode base64 encoded data. + * + * @param src The string containing the base64 data. + * @param slen The length of the string. + * @param size The size of the binary data is stored here. + * @return A chunk of memory containing the binary data (allocated with new[]). + */ +char *b64_decode(const char *src, int slen, int &size); + +} // love + +#endif // LOVE_B64_H \ No newline at end of file diff --git a/jni/love/src/common/config.h b/jni/love/src/common/config.h new file mode 100644 index 00000000..15e46b9e --- /dev/null +++ b/jni/love/src/common/config.h @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_CONFIG_H +#define LOVE_CONFIG_H + +// Platform stuff. +#if defined(WIN32) || defined(_WIN32) +# define LOVE_WINDOWS 1 +#endif +#if defined(linux) || defined(__linux) || defined(__linux__) +# define LOVE_LINUX 1 +#endif +#if defined(__APPLE__) +# define LOVE_MACOSX 1 +# include +#endif + +// Endianness. +#if defined(__i386__) || defined(__i386) +# define LOVE_LITTLE_ENDIAN 1 +#endif +#if defined(__ppc__) || defined(__ppc) || defined(__powerpc__) || defined(__powerpc) +# define LOVE_BIG_ENDIAN 1 +#endif + +// Warnings. +#ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +#endif + +// Preferably, and ironically, this macro should go unused. +#ifndef LOVE_UNUSED +# define LOVE_UNUSED(x) (void)sizeof(x) +#endif + +#ifndef LOVE_BUILD +# define LOVE_BUILD +# define LOVE_BUILD_STANDALONE +# define LOVE_BUILD_EXE +//# define LOVE_BUILD_DLL +#endif + +// DLL-stuff. +#ifdef LOVE_WINDOWS +# define LOVE_EXPORT __declspec(dllexport) +#else +# define LOVE_EXPORT +#endif + +#if defined(LOVE_WINDOWS) +# define LOVE_LEGENDARY_UTF8_ARGV_HACK +# define LOVE_LEGENDARY_CONSOLE_IO_HACK +# define NOMINMAX +#endif + +#if defined(LOVE_MACOSX) +# define LOVE_LEGENDARY_APP_ARGV_HACK +#endif + +// Autotools config.h +#ifdef HAVE_CONFIG_H +# include <../config.h> +# undef VERSION +# ifdef WORDS_BIGENDIAN +# undef LOVE_LITTLE_ENDIAN +# define LOVE_BIG_ENDIAN 1 +# else +# undef LOVE_BIG_ENDIAN +# define LOVE_LITTLE_ENDIAN 1 +# endif +#endif + +#endif // LOVE_CONFIG_H diff --git a/jni/love/src/common/delay.cpp b/jni/love/src/common/delay.cpp new file mode 100644 index 00000000..6d8359b5 --- /dev/null +++ b/jni/love/src/common/delay.cpp @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "delay.h" + +#include + +namespace love +{ + +void delay(unsigned int ms) +{ + SDL_Delay(ms); +} + +} // love diff --git a/jni/love/src/common/delay.h b/jni/love/src/common/delay.h new file mode 100644 index 00000000..db0636f7 --- /dev/null +++ b/jni/love/src/common/delay.h @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 DELAY_H_ +#define DELAY_H_ + +namespace love +{ + +void delay(unsigned int ms); + +} // namespace love + +#endif // DELAY_H_ diff --git a/jni/love/src/common/int.h b/jni/love/src/common/int.h new file mode 100644 index 00000000..3769370b --- /dev/null +++ b/jni/love/src/common/int.h @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_INT_H +#define LOVE_INT_H + +#include "common/config.h" + +#ifndef LOVE_WINDOWS +#include +#endif + +#define LOVE_INT8_MAX 0x7F +#define LOVE_UINT8_MAX 0xFF +#define LOVE_INT16_MAX 0x7FFF +#define LOVE_UINT16_MAX 0xFFFF +#define LOVE_INT32_MAX 0x7FFFFFFF +#define LOVE_UINT32_MAX 0xFFFFFFFF +#define LOVE_INT64_MAX 0x7FFFFFFFFFFFFFFF +#define LOVE_UINT64_MAX 0xFFFFFFFFFFFFFFFF + +namespace love +{ + +// Blame Microsoft +#ifdef LOVE_WINDOWS + typedef __int8 int8; + typedef unsigned __int8 uint8; + typedef __int16 int16; + typedef unsigned __int16 uint16; + typedef __int32 int32; + typedef unsigned __int32 uint32; + typedef __int64 int64; + typedef unsigned __int64 uint64; +#else // LOVE_WINDOWS + typedef int8_t int8; + typedef uint8_t uint8; + typedef int16_t int16; + typedef uint16_t uint16; + typedef int32_t int32; + typedef uint32_t uint32; + typedef int64_t int64; + typedef uint64_t uint64; +#endif // LOVE_WINDOWS + +} // love + +#endif // LOVE_INT_H diff --git a/jni/love/src/common/math.h b/jni/love/src/common/math.h new file mode 100644 index 00000000..d77176a1 --- /dev/null +++ b/jni/love/src/common/math.h @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MATH_H +#define LOVE_MATH_H + +#include // for CHAR_BIT +#include // for rand() and RAND_MAX + +/* Definitions of useful mathematical constants + * M_E - e + * M_LOG2E - log2(e) + * M_LOG10E - log10(e) + * M_LN2 - ln(2) + * M_LN10 - ln(10) + * M_PI - pi + * M_PI_2 - pi/2 + * M_PI_4 - pi/4 + * M_1_PI - 1/pi + * M_2_PI - 2/pi + * M_2_SQRTPI - 2/sqrt(pi) + * M_SQRT2 - sqrt(2) + * M_SQRT1_2 - 1/sqrt(2) + */ + +#define LOVE_M_E 2.71828182845904523536 +#define LOVE_M_LOG2E 1.44269504088896340736 +#define LOVE_M_LOG10E 0.434294481903251827651 +#define LOVE_M_LN2 0.693147180559945309417 +#define LOVE_M_LN10 2.30258509299404568402 +#define LOVE_M_PI 3.14159265358979323846 +#define LOVE_M_PI_2 1.57079632679489661923 +#define LOVE_M_PI_4 0.785398163397448309616 +#define LOVE_M_1_PI 0.318309886183790671538 +#define LOVE_M_2_PI 0.636619772367581343076 +#define LOVE_M_2_SQRTPI 1.12837916709551257390 +#define LOVE_M_SQRT2 1.41421356237309504880 +#define LOVE_M_SQRT1_2 0.707106781186547524401 +#define LOVE_M_TORAD (float)(LOVE_M_PI/180.0) +#define LOVE_M_TODEG (float)(180.0/LOVE_M_PI) +#define LOVE_TORAD(x) (float)(x*LOVE_M_TORAD) +#define LOVE_TODEG(x) (float)(x*LOVE_M_TODEG) + +namespace love +{ + +struct Vertex +{ + float x, y; + float s, t; + unsigned char r, g, b, a; +}; + +struct Triangle +{ + Triangle(const Vertex &x, const Vertex &y, const Vertex &z) + : a(x), b(y), c(z) + {} + Vertex a, b, c; +}; + +inline int next_p2(int x) +{ + x += (x == 0); + x--; + for (unsigned int i = 1; i < sizeof(int)*CHAR_BIT; i <<= 1) x |= x >> i; + return ++x; +} + +inline float next_p2(float x) +{ + return static_cast(next_p2(static_cast(x))); +} + +} // love + +#endif // LOVE_MATH_H diff --git a/jni/love/src/common/runtime.cpp b/jni/love/src/common/runtime.cpp new file mode 100644 index 00000000..75558edd --- /dev/null +++ b/jni/love/src/common/runtime.cpp @@ -0,0 +1,757 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "config.h" +#include "runtime.h" + +// LOVE +#include "Module.h" +#include "Object.h" +#include "Reference.h" +#include "StringMap.h" +#include + +// C++ +#include +#include +#include + +namespace love +{ + +static thread::Mutex *gcmutex = 0; +void *_gcmutex = 0; + +/** + * Called when an object is collected. The object is released + * once in this function, possibly deleting it. + **/ +static int w__gc(lua_State *L) +{ + if (!gcmutex) + { + gcmutex = thread::newMutex(); + _gcmutex = (void *) gcmutex; + } + + Proxy *p = (Proxy *)lua_touserdata(L, 1); + Object *t = (Object *)p->data; + + thread::Lock lock(gcmutex); + + int numretains = p->retains; + if (numretains >= 0) + numretains = std::min(numretains, t->getReferenceCount()); + + for (int i = numretains; i > 0; i--) + t->release(); + + // Signal that this Proxy is dead. + p->retains = -1; + return 0; +} + +static int w__tostring(lua_State *L) +{ + lua_pushvalue(L, lua_upvalueindex(1)); + return 1; +} + +static int w__typeOf(lua_State *L) +{ + Proxy *p = (Proxy *)lua_touserdata(L, 1); + Type t = luax_type(L, 2); + luax_pushboolean(L, p->flags[t]); + return 1; +} + +static int w__eq(lua_State *L) +{ + Proxy *p1 = (Proxy *)lua_touserdata(L, 1); + Proxy *p2 = (Proxy *)lua_touserdata(L, 2); + luax_pushboolean(L, p1->data == p2->data); + return 1; +} + +Reference *luax_refif(lua_State *L, int type) +{ + Reference *r = 0; + + // Create a reference only if the test succeeds. + if (lua_type(L, -1) == type) + r = new Reference(L); + else // Pop the value even if it fails (but also if it succeeds). + lua_pop(L, 1); + + return r; +} + +void luax_printstack(lua_State *L) +{ + for (int i = 1; i<=lua_gettop(L); i++) + { + std::cout << i << " - " << luaL_typename(L, i) << std::endl; + } +} + +bool luax_toboolean(lua_State *L, int idx) +{ + return (lua_toboolean(L, idx) != 0); +} + +void luax_pushboolean(lua_State *L, bool b) +{ + lua_pushboolean(L, b ? 1 : 0); +} + +bool luax_optboolean(lua_State *L, int idx, bool b) +{ + if (lua_isboolean(L, idx) == 1) + return (lua_toboolean(L, idx) == 1 ? true : false); + return b; +} + +std::string luax_tostring(lua_State *L, int idx) +{ + size_t len; + const char *str = lua_tolstring(L, idx, &len); + return std::string(str, len); +} + +std::string luax_checkstring(lua_State *L, int idx) +{ + size_t len; + const char *str = luaL_checklstring(L, idx, &len); + return std::string(str, len); +} + +void luax_pushstring(lua_State *L, const std::string &str) +{ + lua_pushlstring(L, str.data(), str.size()); +} + +bool luax_boolflag(lua_State *L, int table_index, const char *key, bool defaultValue) +{ + lua_getfield(L, table_index, key); + + bool retval; + if (lua_isnoneornil(L, -1)) + retval = defaultValue; + else + retval = lua_toboolean(L, -1); + + lua_pop(L, 1); + return retval; +} + +int luax_intflag(lua_State *L, int table_index, const char *key, int defaultValue) +{ + lua_getfield(L, table_index, key); + + int retval; + if (!lua_isnumber(L, -1)) + retval = defaultValue; + else + retval = (int) lua_tointeger(L, -1); + + lua_pop(L, 1); + return retval; +} + +int luax_assert_argc(lua_State *L, int min) +{ + int argc = lua_gettop(L); + if (argc < min) + return luaL_error(L, "Incorrect number of arguments. Got [%d], expected at least [%d]", argc, min); + return 0; +} + +int luax_assert_argc(lua_State *L, int min, int max) +{ + int argc = lua_gettop(L); + if (argc < min || argc > max) + return luaL_error(L, "Incorrect number of arguments. Got [%d], expected [%d-%d]", argc, min, max); + return 0; +} + +int luax_assert_function(lua_State *L, int idx) +{ + if (!lua_isfunction(L, idx)) + return luaL_error(L, "Argument must be of type \"function\"."); + return 0; +} + +int luax_assert_nilerror(lua_State *L, int idx) +{ + if (lua_isnoneornil(L, idx)) + { + if (lua_isstring(L, idx + 1)) + return luaL_error(L, lua_tostring(L, idx + 1)); + else + return luaL_error(L, "assertion failed!"); + } + return 0; +} + +void luax_setfuncs(lua_State *L, const luaL_Reg *l) +{ + if (l == 0) + return; + + for (; l->name != 0; l++) + { + lua_pushcfunction(L, l->func); + lua_setfield(L, -2, l->name); + } +} + +int luax_register_module(lua_State *L, const WrappedModule &m) +{ + // Put a reference to the C++ module in Lua. + luax_insistregistry(L, REGISTRY_MODULES); + + Proxy *p = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); + p->retains = 1; + p->data = m.module; + p->flags = m.flags; + + luaL_newmetatable(L, m.module->getName()); + lua_pushvalue(L, -1); + lua_setfield(L, -2, "__index"); + lua_pushcfunction(L, w__gc); + lua_setfield(L, -2, "__gc"); + + lua_setmetatable(L, -2); + lua_setfield(L, -2, m.name); // _modules[name] = proxy + lua_pop(L, 1); + + // Gets the love table. + luax_insistglobal(L, "love"); + + // Create new table for module. + lua_newtable(L); + + // Register all the functions. + if (m.functions != 0) + luax_setfuncs(L, m.functions); + + // Register types. + if (m.types != 0) + for (const lua_CFunction *t = m.types; *t != 0; t++) + (*t)(L); + + lua_pushvalue(L, -1); + lua_setfield(L, -3, m.name); // love.graphics = table + lua_remove(L, -2); // love + + // Register module instance + Module::registerInstance(m.module); + + return 1; +} + +int luax_preload(lua_State *L, lua_CFunction f, const char *name) +{ + lua_getglobal(L, "package"); + lua_getfield(L, -1, "preload"); + lua_pushcfunction(L, f); + lua_setfield(L, -2, name); + lua_pop(L, 2); + return 0; +} + +int luax_register_type(lua_State *L, const char *tname, const luaL_Reg *f) +{ + // Verify that this type name has a matching Type ID and type name mapping. + love::Type ltype; + if (!love::getType(tname, ltype)) + printf("Missing type entry for type name: %s\n", tname); + + // Get the place for storing and re-using instantiated love types. + luax_getregistry(L, REGISTRY_TYPES); + + // Create registry._lovetypes if it doesn't exist yet. + if (!lua_istable(L, -1)) + { + lua_newtable(L); + lua_replace(L, -2); + + // Create a metatable. + lua_newtable(L); + + // metatable.__mode = "v". Weak userdata values. + lua_pushliteral(L, "v"); + lua_setfield(L, -2, "__mode"); + + // setmetatable(newtable, metatable) + lua_setmetatable(L, -2); + + // registry._lovetypes = newtable + lua_setfield(L, LUA_REGISTRYINDEX, "_lovetypes"); + } + else + lua_pop(L, 1); + + luaL_newmetatable(L, tname); + + // m.__index = m + lua_pushvalue(L, -1); + lua_setfield(L, -2, "__index"); + + // setup gc + lua_pushcfunction(L, w__gc); + lua_setfield(L, -2, "__gc"); + + // Add equality + lua_pushcfunction(L, w__eq); + lua_setfield(L, -2, "__eq"); + + // Add tostring function. + lua_pushstring(L, tname); + lua_pushcclosure(L, w__tostring, 1); + lua_setfield(L, -2, "__tostring"); + + // Add tostring to as type() as well. + lua_pushstring(L, tname); + lua_pushcclosure(L, w__tostring, 1); + lua_setfield(L, -2, "type"); + + // Add typeOf + lua_pushcfunction(L, w__typeOf); + lua_setfield(L, -2, "typeOf"); + + if (f != 0) + luax_setfuncs(L, f); + + lua_pop(L, 1); // Pops metatable. + return 0; +} + +int luax_table_insert(lua_State *L, int tindex, int vindex, int pos) +{ + if (tindex < 0) + tindex = lua_gettop(L)+1+tindex; + if (vindex < 0) + vindex = lua_gettop(L)+1+vindex; + if (pos == -1) + { + lua_pushvalue(L, vindex); + lua_rawseti(L, tindex, lua_objlen(L, tindex)+1); + return 0; + } + else if (pos < 0) + pos = lua_objlen(L, tindex)+1+pos; + for (int i = lua_objlen(L, tindex)+1; i > pos; i--) + { + lua_rawgeti(L, tindex, i-1); + lua_rawseti(L, tindex, i); + } + lua_pushvalue(L, vindex); + lua_rawseti(L, tindex, pos); + return 0; +} + +int luax_register_searcher(lua_State *L, lua_CFunction f, int pos) +{ + // Add the package loader to the package.loaders table. + lua_getglobal(L, "package"); + + if (lua_isnil(L, -1)) + return luaL_error(L, "Can't register searcher: package table does not exist."); + + lua_getfield(L, -1, "loaders"); + + // Lua 5.2 renamed package.loaders to package.searchers. + if (lua_isnil(L, -1)) + { + lua_pop(L, 1); + lua_getfield(L, -1, "searchers"); + } + + if (lua_isnil(L, -1)) + return luaL_error(L, "Can't register searcher: package.loaders table does not exist."); + + lua_pushcfunction(L, f); + luax_table_insert(L, -2, -1, pos); + lua_pop(L, 3); + return 0; +} + +void luax_rawnewtype(lua_State *L, const char *name, bits flags, love::Object *data, bool own) +{ + Proxy *u = (Proxy *)lua_newuserdata(L, sizeof(Proxy)); + + u->data = (void *) data; + u->flags = flags; + u->retains = own ? 1 : 0; + + luaL_newmetatable(L, name); + lua_setmetatable(L, -2); +} + +void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *data, bool own) +{ + // Fetch the registry table of instantiated types. + luax_getregistry(L, REGISTRY_TYPES); + + // The table might not exist - it should be insisted in luax_register_type. + if (!lua_istable(L, -1)) + { + lua_pop(L, 1); + return luax_rawnewtype(L, name, flags, data, own); + } + + // Get the value of lovetypes[data] on the stack. + lua_pushlightuserdata(L, (void *) data); + lua_gettable(L, -2); + + // If the Proxy userdata isn't in the instantiated types table yet, add it. + if (lua_type(L, -1) != LUA_TUSERDATA) + { + lua_pop(L, 1); + + luax_rawnewtype(L, name, flags, data, own); + + lua_pushlightuserdata(L, (void *) data); + lua_pushvalue(L, -2); + + // lovetypes[data] = Proxy. + lua_settable(L, -4); + + // Remove the lovetypes table from the stack. + lua_remove(L, -2); + + // The Proxy userdata remains at the top of the stack. + return; + } + + // Remove the lovetypes table from the stack. + lua_remove(L, -2); + + // If the object should be released on GC and we already have a stored + // Proxy, we should tell the Proxy that the object was retained again. + if (own) + { + Proxy *p = (Proxy *) lua_touserdata(L, -1); + + thread::EmptyLock lock; + if (gcmutex) + lock.setLock(gcmutex); + + if (p->retains >= 0) + ++(p->retains); + } + + // Keep the Proxy userdata on the stack. +} + +bool luax_istype(lua_State *L, int idx, love::bits type) +{ + if (lua_isuserdata(L, idx) == 0) + return false; + + return ((((Proxy *)lua_touserdata(L, idx))->flags & type) == type); +} + +int luax_getfunction(lua_State *L, const char *mod, const char *fn) +{ + lua_getglobal(L, "love"); + if (lua_isnil(L, -1)) return luaL_error(L, "Could not find global love!"); + lua_getfield(L, -1, mod); + if (lua_isnil(L, -1)) return luaL_error(L, "Could not find love.%s!", mod); + lua_getfield(L, -1, fn); + if (lua_isnil(L, -1)) return luaL_error(L, "Could not find love.%s.%s!", mod, fn); + + lua_remove(L, -2); // remove mod + lua_remove(L, -2); // remove fn + return 0; +} + +int luax_convobj(lua_State *L, int idx, const char *mod, const char *fn) +{ + // Convert string to a file. + luax_getfunction(L, mod, fn); + lua_pushvalue(L, idx); // The initial argument. + lua_call(L, 1, 2); // Call the function, one arg, one return value (plus optional errstring.) + luax_assert_nilerror(L, -2); // Make sure the function returned something. + lua_pop(L, 1); // Pop the second return value now that we don't need it. + lua_replace(L, idx); // Replace the initial argument with the new object. + return 0; +} + +int luax_convobj(lua_State *L, int idxs[], int n, const char *mod, const char *fn) +{ + luax_getfunction(L, mod, fn); + for (int i = 0; i < n; i++) + { + lua_pushvalue(L, idxs[i]); // The arguments. + } + lua_call(L, n, 2); // Call the function, n args, one return value (plus optional errstring.) + luax_assert_nilerror(L, -2); // Make sure the function returned something. + lua_pop(L, 1); // Pop the second return value now that we don't need it. + lua_replace(L, idxs[0]); // Replace the initial argument with the new object. + return 0; +} + +int luax_pconvobj(lua_State *L, int idx, const char *mod, const char *fn) +{ + // Convert string to a file. + luax_getfunction(L, mod, fn); + lua_pushvalue(L, idx); // The initial argument. + int ret = lua_pcall(L, 1, 1, 0); // Call the function, one arg, one return value. + if (ret == 0) + lua_replace(L, idx); // Replace the initial argument with the new object. + return ret; +} + +int luax_pconvobj(lua_State *L, int idxs[], int n, const char *mod, const char *fn) +{ + luax_getfunction(L, mod, fn); + for (int i = 0; i < n; i++) + { + lua_pushvalue(L, idxs[i]); // The arguments. + } + int ret = lua_pcall(L, n, 1, 0); // Call the function, n args, one return value. + if (ret == 0) + lua_replace(L, idxs[0]); // Replace the initial argument with the new object. + return ret; +} + +int luax_insist(lua_State *L, int idx, const char *k) +{ + // Convert to absolute index if necessary. + if (idx < 0 && idx > LUA_REGISTRYINDEX) + idx = lua_gettop(L) + ++idx; + + lua_getfield(L, idx, k); + + // Create if necessary. + if (!lua_istable(L, -1)) + { + lua_pop(L, 1); // Pop the non-table. + lua_newtable(L); + lua_pushvalue(L, -1); // Duplicate the table to leave on top. + lua_setfield(L, idx, k); // lua_stack[idx][k] = lua_stack[-1] (table) + } + + return 1; +} + +int luax_insistglobal(lua_State *L, const char *k) +{ + lua_getglobal(L, k); + + if (!lua_istable(L, -1)) + { + lua_pop(L, 1); // Pop the non-table. + lua_newtable(L); + lua_pushvalue(L, -1); + lua_setglobal(L, k); + } + + return 1; +} + +int luax_insistlove(lua_State *L, const char *k) +{ + luax_insistglobal(L, "love"); + luax_insist(L, -1, k); + + // The love table should be replaced with the top stack + // item. Only the reqested table should remain on the stack. + lua_replace(L, -2); + + return 1; +} + +int luax_getlove(lua_State *L, const char *k) +{ + lua_getglobal(L, "love"); + + if (!lua_isnil(L, -1)) + { + lua_getfield(L, -1, k); + lua_replace(L, -2); + } + + return 1; +} + +int luax_insistregistry(lua_State *L, Registry r) +{ + switch (r) + { + case REGISTRY_GC: + return luax_insistlove(L, "_gc"); + case REGISTRY_MODULES: + return luax_insistlove(L, "_modules"); + case REGISTRY_TYPES: + return luax_insist(L, LUA_REGISTRYINDEX, "_lovetypes"); + default: + return luaL_error(L, "Attempted to use invalid registry."); + } +} + +int luax_getregistry(lua_State *L, Registry r) +{ + switch (r) + { + case REGISTRY_GC: + return luax_getlove(L, "_gc"); + case REGISTRY_MODULES: + return luax_getlove(L, "_modules"); + case REGISTRY_TYPES: + lua_getfield(L, LUA_REGISTRYINDEX, "_lovetypes"); + return 1; + default: + return luaL_error(L, "Attempted to use invalid registry."); + } +} + +extern "C" int luax_typerror(lua_State *L, int narg, const char *tname) +{ + int argtype = lua_type(L, narg); + const char *argtname = 0; + + // We want to use the love type name for userdata, if possible. + if (argtype == LUA_TUSERDATA && luaL_getmetafield(L, narg, "__tostring") != 0) + { + lua_pushvalue(L, narg); + if (lua_pcall(L, 1, 1, 0) == 0 && lua_type(L, -1) == LUA_TSTRING) + { + argtname = lua_tostring(L, -1); + + // Non-love userdata might have a tostring metamethod which doesn't + // describe its type, so we only use __tostring for love types. + love::Type t; + if (!love::getType(argtname, t)) + argtname = 0; + } + } + + if (argtname == 0) + argtname = lua_typename(L, argtype); + + const char *msg = lua_pushfstring(L, "%s expected, got %s", tname, argtname); + return luaL_argerror(L, narg, msg); +} + +StringMap::Entry typeEntries[] = +{ + {"Invalid", INVALID_ID}, + + {"Object", OBJECT_ID}, + {"Data", DATA_ID}, + {"Module", MODULE_ID}, + + // Filesystem + {"File", FILESYSTEM_FILE_ID}, + {"FileData", FILESYSTEM_FILE_DATA_ID}, + + // Font + {"GlyphData", FONT_GLYPH_DATA_ID}, + {"Rasterizer", FONT_RASTERIZER_ID}, + + // Graphics + {"Drawable", GRAPHICS_DRAWABLE_ID}, + {"Image", GRAPHICS_IMAGE_ID}, + {"Quad", GRAPHICS_QUAD_ID}, + {"Font", GRAPHICS_FONT_ID}, + {"ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_ID}, + {"SpriteBatch", GRAPHICS_SPRITE_BATCH_ID}, + {"Canvas", GRAPHICS_CANVAS_ID}, + {"Shader", GRAPHICS_SHADER_ID}, + {"Mesh", GRAPHICS_MESH_ID}, + + // Image + {"ImageData", IMAGE_IMAGE_DATA_ID}, + {"CompressedData", IMAGE_COMPRESSED_DATA_ID}, + + // Joystick + {"Joystick", JOYSTICK_JOYSTICK_ID}, + + // Math + {"RandomGenerator", MATH_RANDOM_GENERATOR_ID}, + {"BezierCurve", MATH_BEZIER_CURVE_ID}, + + // Audio + {"Source", AUDIO_SOURCE_ID}, + + // Sound + {"SoundData", SOUND_SOUND_DATA_ID}, + {"Decoder", SOUND_DECODER_ID}, + + // Mouse + {"Cursor", MOUSE_CURSOR_ID}, + + // Physics + {"World", PHYSICS_WORLD_ID}, + {"Contact", PHYSICS_CONTACT_ID}, + {"Body", PHYSICS_BODY_ID}, + {"Fixture", PHYSICS_FIXTURE_ID}, + {"Shape", PHYSICS_SHAPE_ID}, + {"CircleShape", PHYSICS_CIRCLE_SHAPE_ID}, + {"PolygonShape", PHYSICS_POLYGON_SHAPE_ID}, + {"EdgeShape", PHYSICS_EDGE_SHAPE_ID}, + {"ChainShape", PHYSICS_CHAIN_SHAPE_ID}, + {"Joint", PHYSICS_JOINT_ID}, + {"MouseJoint", PHYSICS_MOUSE_JOINT_ID}, + {"DistanceJoint", PHYSICS_DISTANCE_JOINT_ID}, + {"PrismaticJoint", PHYSICS_PRISMATIC_JOINT_ID}, + {"RevoluteJoint", PHYSICS_REVOLUTE_JOINT_ID}, + {"PulleyJoint", PHYSICS_PULLEY_JOINT_ID}, + {"GearJoint", PHYSICS_GEAR_JOINT_ID}, + {"FrictionJoint", PHYSICS_FRICTION_JOINT_ID}, + {"WeldJoint", PHYSICS_WELD_JOINT_ID}, + {"RopeJoint", PHYSICS_ROPE_JOINT_ID}, + {"WheelJoint", PHYSICS_WHEEL_JOINT_ID}, + {"MotorJoint", PHYSICS_MOTOR_JOINT_ID}, + + // Thread + {"Thread", THREAD_THREAD_ID}, + {"Channel", THREAD_CHANNEL_ID}, + + // The modules themselves. Only add abstracted modules here. + {"filesystem", MODULE_FILESYSTEM_ID}, + {"graphics", MODULE_GRAPHICS_ID}, + {"image", MODULE_IMAGE_ID}, + {"sound", MODULE_SOUND_ID}, +}; + +StringMap types(typeEntries, sizeof(typeEntries)); + +bool getType(const char *in, love::Type &out) +{ + return types.find(in, out); +} + +bool getType(love::Type in, const char *&out) +{ + return types.find(in, out); +} + +Type luax_type(lua_State *L, int idx) +{ + Type t = INVALID_ID; + types.find(luaL_checkstring(L, idx), t); + return t; +} + +} // love diff --git a/jni/love/src/common/runtime.h b/jni/love/src/common/runtime.h new file mode 100644 index 00000000..3c283d51 --- /dev/null +++ b/jni/love/src/common/runtime.h @@ -0,0 +1,494 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_RUNTIME_H +#define LOVE_RUNTIME_H + +// LOVE +#include "types.h" +#include "Object.h" + +// Lua +extern "C" { + #define LUA_COMPAT_ALL + #include + #include + #include +} + +namespace love +{ + +// Forward declarations. +class Module; +class Reference; + +// Exposed mutex of the GC +extern void *_gcmutex; + +/** + * Registries represent special tables which can be accessed with + * luax_insistregistry and luax_getregistry. + **/ +enum Registry +{ + REGISTRY_GC = 1, + REGISTRY_MODULES, + REGISTRY_TYPES +}; + +/** + * This structure wraps all Lua-exposed objects. It exists in the + * Lua state as a full userdata (so we can catch __gc "events"), + * though the Object it refers to is light userdata in the sense + * that it is not allocated by the Lua VM. + **/ +struct Proxy +{ + // Holds type information (see types.h). + bits flags; + + // The light userdata (pointer to the love::Object). + void *data; + + // The number of times release() should be called on GC. + int retains; +}; + +/** + * A Module with Lua wrapper functions and other data. + **/ +struct WrappedModule +{ + // The module containing the functions. + Module *module; + + // The name for the table to put the functions in, without the 'love'-prefix. + const char *name; + + // The type flags of this module. + love::bits flags; + + // The functions of the module (last element {0,0}). + const luaL_Reg *functions; + + // A list of functions which expose the types of the modules (last element 0). + const lua_CFunction *types; + +}; + +/** + * Returns a reference to the top stack element (-1) if the value + * is of the specified type. If the value is incorrect, zero is returned. + * + * In any case, the top stack element is popped, regardless of its type. + **/ +Reference *luax_refif(lua_State *L, int type); + +/** + * Prints the current contents of the stack. Only useful for debugging. + * @param L The Lua state. + **/ +void luax_printstack(lua_State *L); + +/** + * Converts the value at idx to a bool. It follow the same rules + * as lua_toboolean, but returns a bool instead of an int. + * @param L The Lua state. + * @param idx The index on the Lua stack. + * @return True if the value evaluates to true, false otherwise. + **/ +bool luax_toboolean(lua_State *L, int idx); + +/** + * Pushes a bool onto the stack. It's the same as lua_pushboolean, + * but with bool instead of int. + * @param L The Lua state. + * @param b The bool to push. + **/ +void luax_pushboolean(lua_State *L, bool b); + +/** + * Converts the value at idx to a bool, or if not present, b is returned. + * @param L The Lua state. + * @param idx The index of the Lua stack. + * @param b The value to return if no value exist at the specified index. + * @return True if the value evaluates to true, false otherwise. + **/ +bool luax_optboolean(lua_State *L, int idx, bool b); + +/** + * Converts the value at idx to a std::string. It takes care of the string + * size and possible embedded nulls. + * @param L The Lua state. + * @param idx The index on the Lua stack. + * @return Copy of the string at the specified index. + **/ +std::string luax_tostring(lua_State *L, int idx); + +/** + * Converts the value at idx to a std::string. It takes care of the string + * size and possible embedded nulls. + * @param L The Lua state. + * @param idx The index on the Lua stack. + * @return Copy of the string at the specified index. + **/ +std::string luax_checkstring(lua_State *L, int idx); + +/** + * Pushes a std::string onto the stack. It uses the length of the string + * for lua_pushlstring's len argument. + * @param L The Lua state. + * @param str The string to push. + **/ +void luax_pushstring(lua_State *L, const std::string &str); + + +bool luax_boolflag(lua_State *L, int table_index, const char *key, bool defaultValue); +int luax_intflag(lua_State *L, int table_index, const char *key, int defaultValue); + +/** + * Convert the value at the specified index to an Lua number, and then + * convert to a float. + * + * @param L The Lua state. + * @param idx The index on the stack. + */ +inline float luax_tofloat(lua_State *L, int idx) +{ + return static_cast(lua_tonumber(L, idx)); +} + +/** + * Like luax_tofloat, but checks that the value is a number. + * + * @see luax_tofloat + */ +inline float luax_checkfloat(lua_State *L, int idx) +{ + return static_cast(luaL_checknumber(L, idx)); +} + +/** + * Require at least 'min' number of items on the stack. + * @param L The Lua state. + * @param min The minimum number of items on the stack. + * @return Zero if conditions are met, otherwise a Lua error (longjmp). + **/ +int luax_assert_argc(lua_State *L, int min); + +/** + * Require at least 'min', but more than 'max' items on the stack. + * @param L The Lua state. + * @param min The minimum number of items on the stack. + * @param max The maximum number of items on the stack. + * @return Zero if conditions are met, otherwise a Lua error (longjmp). + **/ +int luax_assert_argc(lua_State *L, int min, int max); + +/** + * Require that the value at idx is a function. + * @param L The Lua state. + *@param idx The index on the stack. + **/ +int luax_assert_function(lua_State *L, int idx); + +/** + * Require that the value at idx is not nil. If it is, the function throws an + * error using an optional error string at idx+1. + * @param L The Lua state. + * @param idx The index on the stack. + **/ +int luax_assert_nilerror(lua_State *L, int idx); + +/** + * Registers all functions in the array l (see luaL_Reg) into the table at the + * top of the stack. + * Similar to Lua 5.2's luaL_setfuncs without the upvalues, and to Lua 5.1's + * luaL_register without the library name. + **/ +void luax_setfuncs(lua_State *L, const luaL_Reg *l); + +/** + * Register a module in the love table. The love table will be created if it does not exist. + * @param L The Lua state. + **/ +int luax_register_module(lua_State *L, const WrappedModule &m); + +/** + * Inserts a module with 'name' into the package.preloaded table. + * @param f The function to be called when the module is opened. + * @param name The name of the module, with 'love'-prefix, for instance 'love.graphics'. + **/ +int luax_preload(lua_State *L, lua_CFunction f, const char *name); + +/** + * Register a new type. + * @param tname The name of the type. This must not conflict with other type names, + * even from other modules. + * @param f The list of member functions for the type. + **/ +int luax_register_type(lua_State *L, const char *tname, const luaL_Reg *f = 0); + +/** + * Do a table.insert from C + * @param L the state + * @param tindex the stack index of the table + * @param vindex the stack index of the value + * @param pos the position to insert it in + **/ +int luax_table_insert(lua_State *L, int tindex, int vindex, int pos = -1); + +/** + * Register a new searcher function for package.loaders. This can for instance enable + * loading of files through love.filesystem using standard require. + * @param L The Lua state. + * @param f The searcher function. + * @param pos The position to insert the loader in. + **/ +int luax_register_searcher(lua_State *L, lua_CFunction f, int pos = -1); + +/** + * Pushes a Lua representation of the given object onto the stack, creating and + * storing the Lua representation in a weak table if it doesn't exist yet. + * @param L The Lua state. + * @param name The name of the type. This must match the name used with luax_register_type. + * @param flags The type information of the object. + * @param data The pointer to the actual object. + * @param own Set this to true (default) if the object should be released upon garbage collection. + **/ +void luax_pushtype(lua_State *L, const char *name, bits flags, love::Object *data, bool own = true); + +/** + * Creates a new Lua representation of the given object *without* checking if it + * exists yet, and *without* storing it in a weak table. + * This should only be used when performance is an extreme concern and the + * object is not ever expected to be pushed to Lua again, as it prevents the + * Lua-side objects from working in all cases when used as keys in tables. + * @param L The Lua state. + * @param name The name of the type. This must match the name used with luax_register_type. + * @param flags The type information of the object. + * @param data The pointer to the actual object. + * @param own Set this to true (default) if the object should be released upon garbage collection. + **/ +void luax_rawnewtype(lua_State *L, const char *name, bits flags, love::Object *data, bool own = true); + +/** + * Checks whether the value at idx is a certain type. + * @param L The Lua state. + * @param idx The index on the stack. + * @param type The type to check for. + * @return True if the value is Proxy of the specified type, false otherwise. + **/ +bool luax_istype(lua_State *L, int idx, love::bits type); + +/** + * Gets the function love.module.function and puts it on top of the stack (alone). If the + * love table, the module, or the function does not exist, an error is returned. + * @return An error if nonexistent, or 1 if successful. + **/ +int luax_getfunction(lua_State *L, const char *module, const char *function); + +/** + * Converts an object into another object by the specified function love.module.function. + * The conversion function must accept a single object of the relevant type as a parameter, + * and returnone value. If the function does not exist (see luax_getfunction), an error is returned. + * + * Note that the initial object at idx is replaced by the new object. + * + * @param L The Lua state. + * @param idx The index on the stack. + * @param module The module in the love table. + * @param function The function in the module. + **/ +int luax_convobj(lua_State *L, int idx, const char *module, const char *function); + +/** + * Converts an object into another object by the specified function love.module.function. + * The conversion function must accept a single object of the relevant type as its first parameter, + * and return one value. If the function does not exist (see luax_getfunction), an error is returned. + * + * Note that the initial object at idx is replaced by the new object. + * + * @param L The Lua state. + * @param idxs An array of indices on the stack. + * @param n How many arguments are being passed. + * @param module The module in the love table. + * @param function The function in the module. + **/ +int luax_convobj(lua_State *L, int idxs[], int n, const char *module, const char *function); + +// pcall versions of the above +int luax_pconvobj(lua_State *L, int idx, const char *module, const char *function); +int luax_pconvobj(lua_State *L, int idxs[], int n, const char *module, const char *function); + +/** + * 'Insist' that a table 'k' exists in the table at idx. Insistence involves that the + * table (k) is created if it does not exist in the table at idx. The table at idx must + * pre-exist, however. Also note that if the a non-table value exists at the specified + * location, it will be overwritten with a new table. The insisted table, and only the + * insisted table, will be placed on top of the stack. + * + * @param idx The index on the stack containing a table. + * @param k The name of the table we are insisting exist. + **/ +int luax_insist(lua_State *L, int idx, const char *k); + +/** + * Insist that a global table 'k' exists. See luax_insist. + * @param k The name of the table we are insisting exist. + **/ +int luax_insistglobal(lua_State *L, const char *k); + +/** + * Insists that a table 'k' exists inside the 'love' table. See luax_insist. + * @param k The name of the table we are insisting exist. + **/ +int luax_insistlove(lua_State *L, const char *k); + +/** + * Pushes the table 'k' in the love table onto the stack. Pushes nil if the + * table doesn't exist. + * @param k The name of the table we want to get. + **/ +int luax_getlove(lua_State *L, const char *k); + +/** + * Gets (creates if needed) the specified Registry, and pushes it into the + * stack. + * @param L The Lua state. + * @param r The Registry to get. + **/ +int luax_insistregistry(lua_State *L, Registry r); + +/** + * Gets the specified Registry, and pushes it onto the stack. Pushes nil if the + * registry hasn't been created (see luax_insistregistry.) + * @param L The Lua state. + * @param r The Registry to get. + **/ +int luax_getregistry(lua_State *L, Registry r); + +extern "C" { // Also called from luasocket + int luax_typerror(lua_State *L, int narg, const char *tname); +} + +/** + * Like luax_totype, but causes an error if the value at idx is not Proxy, + * or is not the specified type. + * @param L The Lua state. + * @param idx The index on the stack. + * @param name The name of the type. + * @param type The type bit. + **/ +template +T *luax_checktype(lua_State *L, int idx, const char *name, love::bits type) +{ + if (lua_isuserdata(L, idx) == 0) + luax_typerror(L, idx, name); + + Proxy *u = (Proxy *)lua_touserdata(L, idx); + + if ((u->flags & type) != type) + luax_typerror(L, idx, name); + + return (T *)u->data; +} + +template +T *luax_getmodule(lua_State *L, const char *k, love::bits type) +{ + luax_insistregistry(L, REGISTRY_MODULES); + lua_getfield(L, -1, k); + + if (!lua_isuserdata(L, -1)) + luaL_error(L, "Tried to get nonexistant module %s.", k); + + Proxy *u = (Proxy *)lua_touserdata(L, -1); + + if ((u->flags & type) != type) + luaL_error(L, "Incorrect module %s", k); + + lua_pop(L, 2); + + return (T *)u->data; +} + +template +T *luax_optmodule(lua_State *L, const char *k, love::bits type) +{ + luax_insistregistry(L, REGISTRY_MODULES); + lua_getfield(L, -1, k); + + if (!lua_isuserdata(L, -1)) + { + lua_pop(L, 2); + return 0; + } + + Proxy *u = (Proxy *)lua_touserdata(L, -1); + + if ((u->flags & type) != type) + luaL_error(L, "Incorrect module %s", k); + + lua_pop(L, 2); + + return (T *) u->data; +} + +/** + * Converts the value at idx to the specified type without checking that + * this conversion is valid. If the type has been previously verified with + * luax_istype, then this can be safely used. Otherwise, use luax_checktype. + * @param L The Lua state. + * @param idx The index on the stack. + * @param name The name of the type. + * @param type The type bit. + **/ +template +T *luax_totype(lua_State *L, int idx, const char * /* name */, love::bits /* type */) +{ + return (T *)(((Proxy *)lua_touserdata(L, idx))->data); +} + +Type luax_type(lua_State *L, int idx); + +/** + * Macro for converting a LOVE exception into a Lua error. + * lua_error (and luaL_error) cannot be called from inside the exception handler + * because they use longjmp, which causes undefined behaviour when the + * destructor of the exception would have been called. + **/ +#define EXCEPT_GUARD(A) \ +{ \ + bool should_error = false; \ + try { A } \ + catch (love::Exception &e) \ + { \ + should_error = true; \ + lua_pushstring(L, e.what()); \ + } \ + if (should_error) \ + return luaL_error(L, "%s", lua_tostring(L, -1)); \ +} + +} // love + +#endif // LOVE_RUNTIME_H diff --git a/jni/love/src/common/types.h b/jni/love/src/common/types.h new file mode 100644 index 00000000..a161a80b --- /dev/null +++ b/jni/love/src/common/types.h @@ -0,0 +1,202 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_TYPES_H +#define LOVE_TYPES_H + +// STD +#include + +namespace love +{ + +enum Type +{ + INVALID_ID = 0, + // Cross-module types. + OBJECT_ID, + DATA_ID, + MODULE_ID, + + // Filesystem. + FILESYSTEM_FILE_ID, + FILESYSTEM_FILE_DATA_ID, + + // Font + FONT_GLYPH_DATA_ID, + FONT_RASTERIZER_ID, + + // Graphics + GRAPHICS_DRAWABLE_ID, + GRAPHICS_DRAWQABLE_ID, + GRAPHICS_IMAGE_ID, + GRAPHICS_QUAD_ID, + GRAPHICS_FONT_ID, + GRAPHICS_PARTICLE_SYSTEM_ID, + GRAPHICS_SPRITE_BATCH_ID, + GRAPHICS_CANVAS_ID, + GRAPHICS_SHADER_ID, + GRAPHICS_MESH_ID, + + // Image + IMAGE_IMAGE_DATA_ID, + IMAGE_COMPRESSED_DATA_ID, + + // Joystick + JOYSTICK_JOYSTICK_ID, + + // Math + MATH_RANDOM_GENERATOR_ID, + MATH_BEZIER_CURVE_ID, + + // Audio + AUDIO_SOURCE_ID, + + // Sound + SOUND_SOUND_DATA_ID, + SOUND_DECODER_ID, + + // Mouse + MOUSE_CURSOR_ID, + + // Physics + PHYSICS_WORLD_ID, + PHYSICS_CONTACT_ID, + PHYSICS_BODY_ID, + PHYSICS_FIXTURE_ID, + PHYSICS_SHAPE_ID, + PHYSICS_CIRCLE_SHAPE_ID, + PHYSICS_POLYGON_SHAPE_ID, + PHYSICS_EDGE_SHAPE_ID, + PHYSICS_CHAIN_SHAPE_ID, + PHYSICS_JOINT_ID, + PHYSICS_MOUSE_JOINT_ID, + PHYSICS_DISTANCE_JOINT_ID, + PHYSICS_PRISMATIC_JOINT_ID, + PHYSICS_REVOLUTE_JOINT_ID, + PHYSICS_PULLEY_JOINT_ID, + PHYSICS_GEAR_JOINT_ID, + PHYSICS_FRICTION_JOINT_ID, + PHYSICS_WELD_JOINT_ID, + PHYSICS_ROPE_JOINT_ID, + PHYSICS_WHEEL_JOINT_ID, + PHYSICS_MOTOR_JOINT_ID, + + // Thread + THREAD_THREAD_ID, + THREAD_CHANNEL_ID, + + // The modules themselves. Only add abstracted modules here. + MODULE_FILESYSTEM_ID, + MODULE_GRAPHICS_ID, + MODULE_IMAGE_ID, + MODULE_SOUND_ID, + + // Count the number of bits needed. + TYPE_MAX_ENUM +}; + +typedef std::bitset bits; + +const bits INVALID_T = bits(1) << INVALID_ID; + +const bits OBJECT_T = bits(1) << OBJECT_ID; +const bits DATA_T = (bits(1) << DATA_ID) | OBJECT_T; +const bits MODULE_T = (bits(1) << MODULE_ID) | OBJECT_T; + +// Filesystem. +const bits FILESYSTEM_FILE_T = (bits(1) << FILESYSTEM_FILE_ID) | OBJECT_T; +const bits FILESYSTEM_FILE_DATA_T = (bits(1) << FILESYSTEM_FILE_DATA_ID) | DATA_T; + +const bits FONT_GLYPH_DATA_T = (bits(1) << FONT_GLYPH_DATA_ID) | DATA_T; +const bits FONT_RASTERIZER_T = (bits(1) << FONT_RASTERIZER_ID) | OBJECT_T; + +// Graphics. +const bits GRAPHICS_DRAWABLE_T = (bits(1) << GRAPHICS_DRAWABLE_ID) | OBJECT_T; +const bits GRAPHICS_DRAWQABLE_T = (bits(1) << GRAPHICS_DRAWQABLE_ID) | GRAPHICS_DRAWABLE_T; +const bits GRAPHICS_IMAGE_T = (bits(1) << GRAPHICS_IMAGE_ID) | GRAPHICS_DRAWQABLE_T; +const bits GRAPHICS_QUAD_T = (bits(1) << GRAPHICS_QUAD_ID) | OBJECT_T; +const bits GRAPHICS_FONT_T = (bits(1) << GRAPHICS_FONT_ID) | OBJECT_T; +const bits GRAPHICS_PARTICLE_SYSTEM_T = (bits(1) << GRAPHICS_PARTICLE_SYSTEM_ID) | GRAPHICS_DRAWABLE_T; +const bits GRAPHICS_SPRITE_BATCH_T = (bits(1) << GRAPHICS_SPRITE_BATCH_ID) | GRAPHICS_DRAWABLE_T; +const bits GRAPHICS_CANVAS_T = (bits(1) << GRAPHICS_CANVAS_ID) | GRAPHICS_DRAWQABLE_T; +const bits GRAPHICS_SHADER_T = (bits(1) << GRAPHICS_SHADER_ID) | OBJECT_T; +const bits GRAPHICS_MESH_T = (bits(1) << GRAPHICS_MESH_ID) | GRAPHICS_DRAWABLE_T; + +// Image. +const bits IMAGE_IMAGE_DATA_T = (bits(1) << IMAGE_IMAGE_DATA_ID) | DATA_T; +const bits IMAGE_COMPRESSED_DATA_T = (bits(1) << IMAGE_COMPRESSED_DATA_ID) | DATA_T; + +// Joystick. +const bits JOYSTICK_JOYSTICK_T = (bits(1) << JOYSTICK_JOYSTICK_ID) | OBJECT_T; + +// Math. +const bits MATH_RANDOM_GENERATOR_T = (bits(1) << MATH_RANDOM_GENERATOR_ID) | OBJECT_T; +const bits MATH_BEZIER_CURVE_T = (bits(1) << MATH_BEZIER_CURVE_ID) | OBJECT_T; + +// Audio. +const bits AUDIO_SOURCE_T = (bits(1) << AUDIO_SOURCE_ID) | OBJECT_T; + +// Sound. +const bits SOUND_SOUND_DATA_T = (bits(1) << SOUND_SOUND_DATA_ID) | DATA_T; +const bits SOUND_DECODER_T = bits(1) << SOUND_DECODER_ID; + +// Mouse. +const bits MOUSE_CURSOR_T = (bits(1) << MOUSE_CURSOR_ID) | OBJECT_T; + +// Physics. +const bits PHYSICS_WORLD_T = (bits(1) << PHYSICS_WORLD_ID) | OBJECT_T; +const bits PHYSICS_CONTACT_T = (bits(1) << PHYSICS_CONTACT_ID) | OBJECT_T; +const bits PHYSICS_BODY_T = (bits(1) << PHYSICS_BODY_ID) | OBJECT_T; +const bits PHYSICS_FIXTURE_T = (bits(1) << PHYSICS_FIXTURE_ID) | OBJECT_T; +const bits PHYSICS_SHAPE_T = (bits(1) << PHYSICS_SHAPE_ID) | OBJECT_T; +const bits PHYSICS_CIRCLE_SHAPE_T = (bits(1) << PHYSICS_CIRCLE_SHAPE_ID) | PHYSICS_SHAPE_T; +const bits PHYSICS_POLYGON_SHAPE_T = (bits(1) << PHYSICS_POLYGON_SHAPE_ID) | PHYSICS_SHAPE_T; +const bits PHYSICS_EDGE_SHAPE_T = (bits(1) << PHYSICS_EDGE_SHAPE_ID) | PHYSICS_SHAPE_T; +const bits PHYSICS_CHAIN_SHAPE_T = (bits(1) << PHYSICS_CHAIN_SHAPE_ID) | PHYSICS_SHAPE_T; +const bits PHYSICS_JOINT_T = (bits(1) << PHYSICS_JOINT_ID) | OBJECT_T; +const bits PHYSICS_MOUSE_JOINT_T = (bits(1) << PHYSICS_MOUSE_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_DISTANCE_JOINT_T = (bits(1) << PHYSICS_DISTANCE_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_PRISMATIC_JOINT_T = (bits(1) << PHYSICS_PRISMATIC_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_REVOLUTE_JOINT_T = (bits(1) << PHYSICS_REVOLUTE_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_PULLEY_JOINT_T = (bits(1) << PHYSICS_PULLEY_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_GEAR_JOINT_T = (bits(1) << PHYSICS_GEAR_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_FRICTION_JOINT_T = (bits(1) << PHYSICS_FRICTION_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_WELD_JOINT_T = (bits(1) << PHYSICS_WELD_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_ROPE_JOINT_T = (bits(1) << PHYSICS_ROPE_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_WHEEL_JOINT_T = (bits(1) << PHYSICS_WHEEL_JOINT_ID) | PHYSICS_JOINT_T; +const bits PHYSICS_MOTOR_JOINT_T = (bits(1) << PHYSICS_MOTOR_JOINT_ID) | PHYSICS_JOINT_T; + +// Thread. +const bits THREAD_THREAD_T = (bits(1) << THREAD_THREAD_ID) | OBJECT_T; +const bits THREAD_CHANNEL_T = (bits(1) << THREAD_CHANNEL_ID) | OBJECT_T; + +// Modules. +const bits MODULE_FILESYSTEM_T = (bits(1) << MODULE_FILESYSTEM_ID) | MODULE_T; +const bits MODULE_GRAPHICS_T = (bits(1) << MODULE_GRAPHICS_ID) | MODULE_T; +const bits MODULE_IMAGE_T = (bits(1) << MODULE_IMAGE_ID) | MODULE_T; +const bits MODULE_SOUND_T = (bits(1) << MODULE_SOUND_ID) | MODULE_T; + +bool getType(const char *in, Type &out); +bool getType(Type in, const char *&out); + +} // love + +#endif // LOVE_TYPES_H diff --git a/jni/love/src/common/utf8.cpp b/jni/love/src/common/utf8.cpp new file mode 100644 index 00000000..7f294349 --- /dev/null +++ b/jni/love/src/common/utf8.cpp @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "utf8.h" + +#ifdef LOVE_WINDOWS + +namespace love +{ + +std::string to_utf8(LPCWSTR wstr) +{ + size_t wide_len = wcslen(wstr)+1; + + // Get size in UTF-8. + int utf8_size = WideCharToMultiByte(CP_UTF8, 0, wstr, wide_len, 0, 0, 0, 0); + + char *utf8_str = new char[utf8_size]; + + // Convert to UTF-8. + int ok = WideCharToMultiByte(CP_UTF8, 0, wstr, wide_len, utf8_str, utf8_size, 0, 0); + + std::string ret; + if (ok) + ret = utf8_str; + + delete[] utf8_str; + return ret; +} + +void replace_char(std::string &str, char find, char replace) +{ + int length = str.length(); + + for (int i = 0; i +#include + +namespace love +{ + +/** + * Convert the wide string to a UTF-8 encoded string. + * @param wstr The wide-char string. + * @return A UTF-8 string. + **/ +std::string to_utf8(LPCWSTR wstr); + +/** + * Replace all occurences of 'find' with 'replace' in a string. + * @param str The string to modify. + * @param find The character to match. + * @param replace The character to replace matches. + **/ +void replace_char(std::string &str, char find, char replace); + +} // love + +#endif // LOVE_WINDOWS \ No newline at end of file diff --git a/jni/love/src/common/version.h b/jni/love/src/common/version.h new file mode 100644 index 00000000..f9203236 --- /dev/null +++ b/jni/love/src/common/version.h @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_VERSION_H +#define LOVE_VERSION_H + +namespace love +{ + +// Version stuff. +const int VERSION_MAJOR = 0; +const int VERSION_MINOR = 9; +const int VERSION_REV = 0; +const char *VERSION = "0.9.0"; +const char *VERSION_COMPATIBILITY[] = { VERSION, 0 }; +const char *VERSION_CODENAME = "Baby Inspector"; + +} // love + +#endif // LOVE_VERSION_H diff --git a/jni/love/src/common/wrap_Data.cpp b/jni/love/src/common/wrap_Data.cpp new file mode 100644 index 00000000..06e0b689 --- /dev/null +++ b/jni/love/src/common/wrap_Data.cpp @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Data.h" + +namespace love +{ + +Data *luax_checkdata(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Data", DATA_T); +} + +int w_Data_getString(lua_State *L) +{ + Data *t = luax_checkdata(L, 1); + lua_pushlstring(L, (const char *) t->getData(), (size_t) t->getSize()); + return 1; +} + +int w_Data_getPointer(lua_State *L) +{ + Data *t = luax_checkdata(L, 1); + lua_pushlightuserdata(L, t->getData()); + return 1; +} + +int w_Data_getSize(lua_State *L) +{ + Data *t = luax_checkdata(L, 1); + lua_pushinteger(L, t->getSize()); + return 1; +} + +const luaL_Reg w_Data_functions[] = +{ + { "getString", w_Data_getString }, + { "getPointer", w_Data_getPointer }, + { "getSize", w_Data_getSize }, + { 0, 0 } +}; + +int w_Data_open(lua_State *L) +{ + luax_register_type(L, "Data", w_Data_functions); + return 0; +} + +} // love diff --git a/jni/love/src/common/wrap_Data.h b/jni/love/src/common/wrap_Data.h new file mode 100644 index 00000000..84faf41b --- /dev/null +++ b/jni/love/src/common/wrap_Data.h @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_WRAP_DATA_H +#define LOVE_WRAP_DATA_H + +// LOVE +#include "runtime.h" +#include "Data.h" + +namespace love +{ + +Data *luax_checkdata(lua_State *L, int idx); +int w_Data_getString(lua_State *L); +int w_Data_getPointer(lua_State *L); +int w_Data_getSize(lua_State *L); +int w_Data_open(lua_State *L); + +} // love + +#endif // LOVE_WRAP_DATA_H diff --git a/jni/love/src/libraries/Box2D/Box2D.h b/jni/love/src/libraries/Box2D/Box2D.h new file mode 100755 index 00000000..18704613 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Box2D.h @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 BOX2D_H +#define BOX2D_H + +/** +\mainpage Box2D API Documentation + +\section intro_sec Getting Started + +For documentation please see http://box2d.org/documentation.html + +For discussion please visit http://box2d.org/forum +*/ + +// These include files constitute the main Box2D API + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2ChainShape.cpp b/jni/love/src/libraries/Box2D/Collision/Shapes/b2ChainShape.cpp new file mode 100755 index 00000000..069b4cae --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2ChainShape.cpp @@ -0,0 +1,190 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include + +b2ChainShape::~b2ChainShape() +{ + b2Free(m_vertices); + m_vertices = NULL; + m_count = 0; +} + +void b2ChainShape::CreateLoop(const b2Vec2* vertices, int32 count) +{ + b2Assert(m_vertices == NULL && m_count == 0); + b2Assert(count >= 3); + for (int32 i = 1; i < count; ++i) + { + b2Vec2 v1 = vertices[i-1]; + b2Vec2 v2 = vertices[i]; + // If the code crashes here, it means your vertices are too close together. + b2Assert(b2DistanceSquared(v1, v2) > b2_linearSlop * b2_linearSlop); + } + + m_count = count + 1; + m_vertices = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2)); + memcpy(m_vertices, vertices, count * sizeof(b2Vec2)); + m_vertices[count] = m_vertices[0]; + m_prevVertex = m_vertices[m_count - 2]; + m_nextVertex = m_vertices[1]; + m_hasPrevVertex = true; + m_hasNextVertex = true; +} + +void b2ChainShape::CreateChain(const b2Vec2* vertices, int32 count) +{ + b2Assert(m_vertices == NULL && m_count == 0); + b2Assert(count >= 2); + for (int32 i = 1; i < count; ++i) + { + b2Vec2 v1 = vertices[i-1]; + b2Vec2 v2 = vertices[i]; + // If the code crashes here, it means your vertices are too close together. + b2Assert(b2DistanceSquared(v1, v2) > b2_linearSlop * b2_linearSlop); + } + + m_count = count; + m_vertices = (b2Vec2*)b2Alloc(count * sizeof(b2Vec2)); + memcpy(m_vertices, vertices, m_count * sizeof(b2Vec2)); + + m_hasPrevVertex = false; + m_hasNextVertex = false; + + m_prevVertex.SetZero(); + m_nextVertex.SetZero(); +} + +void b2ChainShape::SetPrevVertex(const b2Vec2& prevVertex) +{ + m_prevVertex = prevVertex; + m_hasPrevVertex = true; +} + +void b2ChainShape::SetNextVertex(const b2Vec2& nextVertex) +{ + m_nextVertex = nextVertex; + m_hasNextVertex = true; +} + +b2Shape* b2ChainShape::Clone(b2BlockAllocator* allocator) const +{ + void* mem = allocator->Allocate(sizeof(b2ChainShape)); + b2ChainShape* clone = new (mem) b2ChainShape; + clone->CreateChain(m_vertices, m_count); + clone->m_prevVertex = m_prevVertex; + clone->m_nextVertex = m_nextVertex; + clone->m_hasPrevVertex = m_hasPrevVertex; + clone->m_hasNextVertex = m_hasNextVertex; + return clone; +} + +int32 b2ChainShape::GetChildCount() const +{ + // edge count = vertex count - 1 + return m_count - 1; +} + +void b2ChainShape::GetChildEdge(b2EdgeShape* edge, int32 index) const +{ + b2Assert(0 <= index && index < m_count - 1); + edge->m_type = b2Shape::e_edge; + edge->m_radius = m_radius; + + edge->m_vertex1 = m_vertices[index + 0]; + edge->m_vertex2 = m_vertices[index + 1]; + + if (index > 0) + { + edge->m_vertex0 = m_vertices[index - 1]; + edge->m_hasVertex0 = true; + } + else + { + edge->m_vertex0 = m_prevVertex; + edge->m_hasVertex0 = m_hasPrevVertex; + } + + if (index < m_count - 2) + { + edge->m_vertex3 = m_vertices[index + 2]; + edge->m_hasVertex3 = true; + } + else + { + edge->m_vertex3 = m_nextVertex; + edge->m_hasVertex3 = m_hasNextVertex; + } +} + +bool b2ChainShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const +{ + B2_NOT_USED(xf); + B2_NOT_USED(p); + return false; +} + +bool b2ChainShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& xf, int32 childIndex) const +{ + b2Assert(childIndex < m_count); + + b2EdgeShape edgeShape; + + int32 i1 = childIndex; + int32 i2 = childIndex + 1; + if (i2 == m_count) + { + i2 = 0; + } + + edgeShape.m_vertex1 = m_vertices[i1]; + edgeShape.m_vertex2 = m_vertices[i2]; + + return edgeShape.RayCast(output, input, xf, 0); +} + +void b2ChainShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const +{ + b2Assert(childIndex < m_count); + + int32 i1 = childIndex; + int32 i2 = childIndex + 1; + if (i2 == m_count) + { + i2 = 0; + } + + b2Vec2 v1 = b2Mul(xf, m_vertices[i1]); + b2Vec2 v2 = b2Mul(xf, m_vertices[i2]); + + aabb->lowerBound = b2Min(v1, v2); + aabb->upperBound = b2Max(v1, v2); +} + +void b2ChainShape::ComputeMass(b2MassData* massData, float32 density) const +{ + B2_NOT_USED(density); + + massData->mass = 0.0f; + massData->center.SetZero(); + massData->I = 0.0f; +} diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2ChainShape.h b/jni/love/src/libraries/Box2D/Collision/Shapes/b2ChainShape.h new file mode 100755 index 00000000..e836dfef --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2ChainShape.h @@ -0,0 +1,102 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org +* +* 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 B2_CHAIN_SHAPE_H +#define B2_CHAIN_SHAPE_H + +#include + +class b2EdgeShape; + +/// A chain shape is a free form sequence of line segments. +/// The chain has two-sided collision, so you can use inside and outside collision. +/// Therefore, you may use any winding order. +/// Since there may be many vertices, they are allocated using b2Alloc. +/// Connectivity information is used to create smooth collisions. +/// WARNING: The chain will not collide properly if there are self-intersections. +class b2ChainShape : public b2Shape +{ +public: + b2ChainShape(); + + /// The destructor frees the vertices using b2Free. + ~b2ChainShape(); + + /// Create a loop. This automatically adjusts connectivity. + /// @param vertices an array of vertices, these are copied + /// @param count the vertex count + void CreateLoop(const b2Vec2* vertices, int32 count); + + /// Create a chain with isolated end vertices. + /// @param vertices an array of vertices, these are copied + /// @param count the vertex count + void CreateChain(const b2Vec2* vertices, int32 count); + + /// Establish connectivity to a vertex that precedes the first vertex. + /// Don't call this for loops. + void SetPrevVertex(const b2Vec2& prevVertex); + + /// Establish connectivity to a vertex that follows the last vertex. + /// Don't call this for loops. + void SetNextVertex(const b2Vec2& nextVertex); + + /// Implement b2Shape. Vertices are cloned using b2Alloc. + b2Shape* Clone(b2BlockAllocator* allocator) const; + + /// @see b2Shape::GetChildCount + int32 GetChildCount() const; + + /// Get a child edge. + void GetChildEdge(b2EdgeShape* edge, int32 index) const; + + /// This always return false. + /// @see b2Shape::TestPoint + bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; + + /// Implement b2Shape. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const; + + /// @see b2Shape::ComputeAABB + void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; + + /// Chains have zero mass. + /// @see b2Shape::ComputeMass + void ComputeMass(b2MassData* massData, float32 density) const; + + /// The vertices. Owned by this class. + b2Vec2* m_vertices; + + /// The vertex count. + int32 m_count; + + b2Vec2 m_prevVertex, m_nextVertex; + bool m_hasPrevVertex, m_hasNextVertex; +}; + +inline b2ChainShape::b2ChainShape() +{ + m_type = e_chain; + m_radius = b2_polygonRadius; + m_vertices = NULL; + m_count = 0; + m_hasPrevVertex = false; + m_hasNextVertex = false; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2CircleShape.cpp b/jni/love/src/libraries/Box2D/Collision/Shapes/b2CircleShape.cpp new file mode 100755 index 00000000..39d4ae99 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2CircleShape.cpp @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include + +b2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const +{ + void* mem = allocator->Allocate(sizeof(b2CircleShape)); + b2CircleShape* clone = new (mem) b2CircleShape; + *clone = *this; + return clone; +} + +int32 b2CircleShape::GetChildCount() const +{ + return 1; +} + +bool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const +{ + b2Vec2 center = transform.p + b2Mul(transform.q, m_p); + b2Vec2 d = p - center; + return b2Dot(d, d) <= m_radius * m_radius; +} + +// Collision Detection in Interactive 3D Environments by Gino van den Bergen +// From Section 3.1.2 +// x = s + a * r +// norm(x) = radius +bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const +{ + B2_NOT_USED(childIndex); + + b2Vec2 position = transform.p + b2Mul(transform.q, m_p); + b2Vec2 s = input.p1 - position; + float32 b = b2Dot(s, s) - m_radius * m_radius; + + // Solve quadratic equation. + b2Vec2 r = input.p2 - input.p1; + float32 c = b2Dot(s, r); + float32 rr = b2Dot(r, r); + float32 sigma = c * c - rr * b; + + // Check for negative discriminant and short segment. + if (sigma < 0.0f || rr < b2_epsilon) + { + return false; + } + + // Find the point of intersection of the line with the circle. + float32 a = -(c + b2Sqrt(sigma)); + + // Is the intersection point on the segment? + if (0.0f <= a && a <= input.maxFraction * rr) + { + a /= rr; + output->fraction = a; + output->normal = s + a * r; + output->normal.Normalize(); + return true; + } + + return false; +} + +void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const +{ + B2_NOT_USED(childIndex); + + b2Vec2 p = transform.p + b2Mul(transform.q, m_p); + aabb->lowerBound.Set(p.x - m_radius, p.y - m_radius); + aabb->upperBound.Set(p.x + m_radius, p.y + m_radius); +} + +void b2CircleShape::ComputeMass(b2MassData* massData, float32 density) const +{ + massData->mass = density * b2_pi * m_radius * m_radius; + massData->center = m_p; + + // inertia about the local origin + massData->I = massData->mass * (0.5f * m_radius * m_radius + b2Dot(m_p, m_p)); +} diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2CircleShape.h b/jni/love/src/libraries/Box2D/Collision/Shapes/b2CircleShape.h new file mode 100755 index 00000000..3209f924 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2CircleShape.h @@ -0,0 +1,91 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_CIRCLE_SHAPE_H +#define B2_CIRCLE_SHAPE_H + +#include + +/// A circle shape. +class b2CircleShape : public b2Shape +{ +public: + b2CircleShape(); + + /// Implement b2Shape. + b2Shape* Clone(b2BlockAllocator* allocator) const; + + /// @see b2Shape::GetChildCount + int32 GetChildCount() const; + + /// Implement b2Shape. + bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; + + /// Implement b2Shape. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const; + + /// @see b2Shape::ComputeAABB + void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; + + /// @see b2Shape::ComputeMass + void ComputeMass(b2MassData* massData, float32 density) const; + + /// Get the supporting vertex index in the given direction. + int32 GetSupport(const b2Vec2& d) const; + + /// Get the supporting vertex in the given direction. + const b2Vec2& GetSupportVertex(const b2Vec2& d) const; + + /// Get the vertex count. + int32 GetVertexCount() const { return 1; } + + /// Get a vertex by index. Used by b2Distance. + const b2Vec2& GetVertex(int32 index) const; + + /// Position + b2Vec2 m_p; +}; + +inline b2CircleShape::b2CircleShape() +{ + m_type = e_circle; + m_radius = 0.0f; + m_p.SetZero(); +} + +inline int32 b2CircleShape::GetSupport(const b2Vec2 &d) const +{ + B2_NOT_USED(d); + return 0; +} + +inline const b2Vec2& b2CircleShape::GetSupportVertex(const b2Vec2 &d) const +{ + B2_NOT_USED(d); + return m_p; +} + +inline const b2Vec2& b2CircleShape::GetVertex(int32 index) const +{ + B2_NOT_USED(index); + b2Assert(index == 0); + return m_p; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.cpp b/jni/love/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.cpp new file mode 100755 index 00000000..8bcd12f7 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.cpp @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org +* +* 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 +#include + +void b2EdgeShape::Set(const b2Vec2& v1, const b2Vec2& v2) +{ + m_vertex1 = v1; + m_vertex2 = v2; + m_hasVertex0 = false; + m_hasVertex3 = false; +} + +b2Shape* b2EdgeShape::Clone(b2BlockAllocator* allocator) const +{ + void* mem = allocator->Allocate(sizeof(b2EdgeShape)); + b2EdgeShape* clone = new (mem) b2EdgeShape; + *clone = *this; + return clone; +} + +int32 b2EdgeShape::GetChildCount() const +{ + return 1; +} + +bool b2EdgeShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const +{ + B2_NOT_USED(xf); + B2_NOT_USED(p); + return false; +} + +// p = p1 + t * d +// v = v1 + s * e +// p1 + t * d = v1 + s * e +// s * e - t * d = p1 - v1 +bool b2EdgeShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& xf, int32 childIndex) const +{ + B2_NOT_USED(childIndex); + + // Put the ray into the edge's frame of reference. + b2Vec2 p1 = b2MulT(xf.q, input.p1 - xf.p); + b2Vec2 p2 = b2MulT(xf.q, input.p2 - xf.p); + b2Vec2 d = p2 - p1; + + b2Vec2 v1 = m_vertex1; + b2Vec2 v2 = m_vertex2; + b2Vec2 e = v2 - v1; + b2Vec2 normal(e.y, -e.x); + normal.Normalize(); + + // q = p1 + t * d + // dot(normal, q - v1) = 0 + // dot(normal, p1 - v1) + t * dot(normal, d) = 0 + float32 numerator = b2Dot(normal, v1 - p1); + float32 denominator = b2Dot(normal, d); + + if (denominator == 0.0f) + { + return false; + } + + float32 t = numerator / denominator; + if (t < 0.0f || input.maxFraction < t) + { + return false; + } + + b2Vec2 q = p1 + t * d; + + // q = v1 + s * r + // s = dot(q - v1, r) / dot(r, r) + b2Vec2 r = v2 - v1; + float32 rr = b2Dot(r, r); + if (rr == 0.0f) + { + return false; + } + + float32 s = b2Dot(q - v1, r) / rr; + if (s < 0.0f || 1.0f < s) + { + return false; + } + + output->fraction = t; + if (numerator > 0.0f) + { + output->normal = -b2Mul(xf.q, normal); + } + else + { + output->normal = b2Mul(xf.q, normal); + } + return true; +} + +void b2EdgeShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const +{ + B2_NOT_USED(childIndex); + + b2Vec2 v1 = b2Mul(xf, m_vertex1); + b2Vec2 v2 = b2Mul(xf, m_vertex2); + + b2Vec2 lower = b2Min(v1, v2); + b2Vec2 upper = b2Max(v1, v2); + + b2Vec2 r(m_radius, m_radius); + aabb->lowerBound = lower - r; + aabb->upperBound = upper + r; +} + +void b2EdgeShape::ComputeMass(b2MassData* massData, float32 density) const +{ + B2_NOT_USED(density); + + massData->mass = 0.0f; + massData->center = 0.5f * (m_vertex1 + m_vertex2); + massData->I = 0.0f; +} diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.h b/jni/love/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.h new file mode 100755 index 00000000..0acef851 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2EdgeShape.h @@ -0,0 +1,74 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org +* +* 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 B2_EDGE_SHAPE_H +#define B2_EDGE_SHAPE_H + +#include + +/// A line segment (edge) shape. These can be connected in chains or loops +/// to other edge shapes. The connectivity information is used to ensure +/// correct contact normals. +class b2EdgeShape : public b2Shape +{ +public: + b2EdgeShape(); + + /// Set this as an isolated edge. + void Set(const b2Vec2& v1, const b2Vec2& v2); + + /// Implement b2Shape. + b2Shape* Clone(b2BlockAllocator* allocator) const; + + /// @see b2Shape::GetChildCount + int32 GetChildCount() const; + + /// @see b2Shape::TestPoint + bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; + + /// Implement b2Shape. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const; + + /// @see b2Shape::ComputeAABB + void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; + + /// @see b2Shape::ComputeMass + void ComputeMass(b2MassData* massData, float32 density) const; + + /// These are the edge vertices + b2Vec2 m_vertex1, m_vertex2; + + /// Optional adjacent vertices. These are used for smooth collision. + b2Vec2 m_vertex0, m_vertex3; + bool m_hasVertex0, m_hasVertex3; +}; + +inline b2EdgeShape::b2EdgeShape() +{ + m_type = e_edge; + m_radius = b2_polygonRadius; + m_vertex0.x = 0.0f; + m_vertex0.y = 0.0f; + m_vertex3.x = 0.0f; + m_vertex3.y = 0.0f; + m_hasVertex0 = false; + m_hasVertex3 = false; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.cpp b/jni/love/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.cpp new file mode 100755 index 00000000..2f32e9fe --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.cpp @@ -0,0 +1,459 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include + +b2Shape* b2PolygonShape::Clone(b2BlockAllocator* allocator) const +{ + void* mem = allocator->Allocate(sizeof(b2PolygonShape)); + b2PolygonShape* clone = new (mem) b2PolygonShape; + *clone = *this; + return clone; +} + +void b2PolygonShape::SetAsBox(float32 hx, float32 hy) +{ + m_count = 4; + m_vertices[0].Set(-hx, -hy); + m_vertices[1].Set( hx, -hy); + m_vertices[2].Set( hx, hy); + m_vertices[3].Set(-hx, hy); + m_normals[0].Set(0.0f, -1.0f); + m_normals[1].Set(1.0f, 0.0f); + m_normals[2].Set(0.0f, 1.0f); + m_normals[3].Set(-1.0f, 0.0f); + m_centroid.SetZero(); +} + +void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle) +{ + m_count = 4; + m_vertices[0].Set(-hx, -hy); + m_vertices[1].Set( hx, -hy); + m_vertices[2].Set( hx, hy); + m_vertices[3].Set(-hx, hy); + m_normals[0].Set(0.0f, -1.0f); + m_normals[1].Set(1.0f, 0.0f); + m_normals[2].Set(0.0f, 1.0f); + m_normals[3].Set(-1.0f, 0.0f); + m_centroid = center; + + b2Transform xf; + xf.p = center; + xf.q.Set(angle); + + // Transform vertices and normals. + for (int32 i = 0; i < m_count; ++i) + { + m_vertices[i] = b2Mul(xf, m_vertices[i]); + m_normals[i] = b2Mul(xf.q, m_normals[i]); + } +} + +int32 b2PolygonShape::GetChildCount() const +{ + return 1; +} + +static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) +{ + b2Assert(count >= 3); + + b2Vec2 c; c.Set(0.0f, 0.0f); + float32 area = 0.0f; + + // pRef is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + b2Vec2 pRef(0.0f, 0.0f); +#if 0 + // This code would put the reference point inside the polygon. + for (int32 i = 0; i < count; ++i) + { + pRef += vs[i]; + } + pRef *= 1.0f / count; +#endif + + const float32 inv3 = 1.0f / 3.0f; + + for (int32 i = 0; i < count; ++i) + { + // Triangle vertices. + b2Vec2 p1 = pRef; + b2Vec2 p2 = vs[i]; + b2Vec2 p3 = i + 1 < count ? vs[i+1] : vs[0]; + + b2Vec2 e1 = p2 - p1; + b2Vec2 e2 = p3 - p1; + + float32 D = b2Cross(e1, e2); + + float32 triangleArea = 0.5f * D; + area += triangleArea; + + // Area weighted centroid + c += triangleArea * inv3 * (p1 + p2 + p3); + } + + // Centroid + b2Assert(area > b2_epsilon); + c *= 1.0f / area; + return c; +} + +void b2PolygonShape::Set(const b2Vec2* vertices, int32 count) +{ + b2Assert(3 <= count && count <= b2_maxPolygonVertices); + if (count < 3) + { + SetAsBox(1.0f, 1.0f); + return; + } + + int32 n = b2Min(count, b2_maxPolygonVertices); + + // Perform welding and copy vertices into local buffer. + b2Vec2 ps[b2_maxPolygonVertices]; + int32 tempCount = 0; + for (int32 i = 0; i < n; ++i) + { + b2Vec2 v = vertices[i]; + + bool unique = true; + for (int32 j = 0; j < tempCount; ++j) + { + if (b2DistanceSquared(v, ps[j]) < 0.5f * b2_linearSlop) + { + unique = false; + break; + } + } + + if (unique) + { + ps[tempCount++] = v; + } + } + + n = tempCount; + if (n < 3) + { + // Polygon is degenerate. + b2Assert(false); + SetAsBox(1.0f, 1.0f); + return; + } + + // Create the convex hull using the Gift wrapping algorithm + // http://en.wikipedia.org/wiki/Gift_wrapping_algorithm + + // Find the right most point on the hull + int32 i0 = 0; + float32 x0 = ps[0].x; + for (int32 i = 1; i < n; ++i) + { + float32 x = ps[i].x; + if (x > x0 || (x == x0 && ps[i].y < ps[i0].y)) + { + i0 = i; + x0 = x; + } + } + + int32 hull[b2_maxPolygonVertices]; + int32 m = 0; + int32 ih = i0; + + for (;;) + { + hull[m] = ih; + + int32 ie = 0; + for (int32 j = 1; j < n; ++j) + { + if (ie == ih) + { + ie = j; + continue; + } + + b2Vec2 r = ps[ie] - ps[hull[m]]; + b2Vec2 v = ps[j] - ps[hull[m]]; + float32 c = b2Cross(r, v); + if (c < 0.0f) + { + ie = j; + } + + // Collinearity check + if (c == 0.0f && v.LengthSquared() > r.LengthSquared()) + { + ie = j; + } + } + + ++m; + ih = ie; + + if (ie == i0) + { + break; + } + } + + m_count = m; + + // Copy vertices. + for (int32 i = 0; i < m; ++i) + { + m_vertices[i] = ps[hull[i]]; + } + + // Compute normals. Ensure the edges have non-zero length. + for (int32 i = 0; i < m; ++i) + { + int32 i1 = i; + int32 i2 = i + 1 < m ? i + 1 : 0; + b2Vec2 edge = m_vertices[i2] - m_vertices[i1]; + b2Assert(edge.LengthSquared() > b2_epsilon * b2_epsilon); + m_normals[i] = b2Cross(edge, 1.0f); + m_normals[i].Normalize(); + } + + // Compute the polygon centroid. + m_centroid = ComputeCentroid(m_vertices, m); +} + +bool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const +{ + b2Vec2 pLocal = b2MulT(xf.q, p - xf.p); + + for (int32 i = 0; i < m_count; ++i) + { + float32 dot = b2Dot(m_normals[i], pLocal - m_vertices[i]); + if (dot > 0.0f) + { + return false; + } + } + + return true; +} + +bool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& xf, int32 childIndex) const +{ + B2_NOT_USED(childIndex); + + // Put the ray into the polygon's frame of reference. + b2Vec2 p1 = b2MulT(xf.q, input.p1 - xf.p); + b2Vec2 p2 = b2MulT(xf.q, input.p2 - xf.p); + b2Vec2 d = p2 - p1; + + float32 lower = 0.0f, upper = input.maxFraction; + + int32 index = -1; + + for (int32 i = 0; i < m_count; ++i) + { + // p = p1 + a * d + // dot(normal, p - v) = 0 + // dot(normal, p1 - v) + a * dot(normal, d) = 0 + float32 numerator = b2Dot(m_normals[i], m_vertices[i] - p1); + float32 denominator = b2Dot(m_normals[i], d); + + if (denominator == 0.0f) + { + if (numerator < 0.0f) + { + return false; + } + } + else + { + // Note: we want this predicate without division: + // lower < numerator / denominator, where denominator < 0 + // Since denominator < 0, we have to flip the inequality: + // lower < numerator / denominator <==> denominator * lower > numerator. + if (denominator < 0.0f && numerator < lower * denominator) + { + // Increase lower. + // The segment enters this half-space. + lower = numerator / denominator; + index = i; + } + else if (denominator > 0.0f && numerator < upper * denominator) + { + // Decrease upper. + // The segment exits this half-space. + upper = numerator / denominator; + } + } + + // The use of epsilon here causes the assert on lower to trip + // in some cases. Apparently the use of epsilon was to make edge + // shapes work, but now those are handled separately. + //if (upper < lower - b2_epsilon) + if (upper < lower) + { + return false; + } + } + + b2Assert(0.0f <= lower && lower <= input.maxFraction); + + if (index >= 0) + { + output->fraction = lower; + output->normal = b2Mul(xf.q, m_normals[index]); + return true; + } + + return false; +} + +void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const +{ + B2_NOT_USED(childIndex); + + b2Vec2 lower = b2Mul(xf, m_vertices[0]); + b2Vec2 upper = lower; + + for (int32 i = 1; i < m_count; ++i) + { + b2Vec2 v = b2Mul(xf, m_vertices[i]); + lower = b2Min(lower, v); + upper = b2Max(upper, v); + } + + b2Vec2 r(m_radius, m_radius); + aabb->lowerBound = lower - r; + aabb->upperBound = upper + r; +} + +void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const +{ + // Polygon mass, centroid, and inertia. + // Let rho be the polygon density in mass per unit area. + // Then: + // mass = rho * int(dA) + // centroid.x = (1/mass) * rho * int(x * dA) + // centroid.y = (1/mass) * rho * int(y * dA) + // I = rho * int((x*x + y*y) * dA) + // + // We can compute these integrals by summing all the integrals + // for each triangle of the polygon. To evaluate the integral + // for a single triangle, we make a change of variables to + // the (u,v) coordinates of the triangle: + // x = x0 + e1x * u + e2x * v + // y = y0 + e1y * u + e2y * v + // where 0 <= u && 0 <= v && u + v <= 1. + // + // We integrate u from [0,1-v] and then v from [0,1]. + // We also need to use the Jacobian of the transformation: + // D = cross(e1, e2) + // + // Simplification: triangle centroid = (1/3) * (p1 + p2 + p3) + // + // The rest of the derivation is handled by computer algebra. + + b2Assert(m_count >= 3); + + b2Vec2 center; center.Set(0.0f, 0.0f); + float32 area = 0.0f; + float32 I = 0.0f; + + // s is the reference point for forming triangles. + // It's location doesn't change the result (except for rounding error). + b2Vec2 s(0.0f, 0.0f); + + // This code would put the reference point inside the polygon. + for (int32 i = 0; i < m_count; ++i) + { + s += m_vertices[i]; + } + s *= 1.0f / m_count; + + const float32 k_inv3 = 1.0f / 3.0f; + + for (int32 i = 0; i < m_count; ++i) + { + // Triangle vertices. + b2Vec2 e1 = m_vertices[i] - s; + b2Vec2 e2 = i + 1 < m_count ? m_vertices[i+1] - s : m_vertices[0] - s; + + float32 D = b2Cross(e1, e2); + + float32 triangleArea = 0.5f * D; + area += triangleArea; + + // Area weighted centroid + center += triangleArea * k_inv3 * (e1 + e2); + + float32 ex1 = e1.x, ey1 = e1.y; + float32 ex2 = e2.x, ey2 = e2.y; + + float32 intx2 = ex1*ex1 + ex2*ex1 + ex2*ex2; + float32 inty2 = ey1*ey1 + ey2*ey1 + ey2*ey2; + + I += (0.25f * k_inv3 * D) * (intx2 + inty2); + } + + // Total mass + massData->mass = density * area; + + // Center of mass + b2Assert(area > b2_epsilon); + center *= 1.0f / area; + massData->center = center + s; + + // Inertia tensor relative to the local origin (point s). + massData->I = density * I; + + // Shift to center of mass then to original body origin. + massData->I += massData->mass * (b2Dot(massData->center, massData->center) - b2Dot(center, center)); +} + +bool b2PolygonShape::Validate() const +{ + for (int32 i = 0; i < m_count; ++i) + { + int32 i1 = i; + int32 i2 = i < m_count - 1 ? i1 + 1 : 0; + b2Vec2 p = m_vertices[i1]; + b2Vec2 e = m_vertices[i2] - p; + + for (int32 j = 0; j < m_count; ++j) + { + if (j == i1 || j == i2) + { + continue; + } + + b2Vec2 v = m_vertices[j] - p; + float32 c = b2Cross(e, v); + if (c < 0.0f) + { + return false; + } + } + } + + return true; +} diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.h b/jni/love/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.h new file mode 100755 index 00000000..b1929803 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2PolygonShape.h @@ -0,0 +1,101 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_POLYGON_SHAPE_H +#define B2_POLYGON_SHAPE_H + +#include + +/// A convex polygon. It is assumed that the interior of the polygon is to +/// the left of each edge. +/// Polygons have a maximum number of vertices equal to b2_maxPolygonVertices. +/// In most cases you should not need many vertices for a convex polygon. +class b2PolygonShape : public b2Shape +{ +public: + b2PolygonShape(); + + /// Implement b2Shape. + b2Shape* Clone(b2BlockAllocator* allocator) const; + + /// @see b2Shape::GetChildCount + int32 GetChildCount() const; + + /// Create a convex hull from the given array of local points. + /// The count must be in the range [3, b2_maxPolygonVertices]. + /// @warning the points may be re-ordered, even if they form a convex polygon + /// @warning collinear points are handled but not removed. Collinear points + /// may lead to poor stacking behavior. + void Set(const b2Vec2* points, int32 count); + + /// Build vertices to represent an axis-aligned box centered on the local origin. + /// @param hx the half-width. + /// @param hy the half-height. + void SetAsBox(float32 hx, float32 hy); + + /// Build vertices to represent an oriented box. + /// @param hx the half-width. + /// @param hy the half-height. + /// @param center the center of the box in local coordinates. + /// @param angle the rotation of the box in local coordinates. + void SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle); + + /// @see b2Shape::TestPoint + bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; + + /// Implement b2Shape. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const; + + /// @see b2Shape::ComputeAABB + void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; + + /// @see b2Shape::ComputeMass + void ComputeMass(b2MassData* massData, float32 density) const; + + /// Get the vertex count. + int32 GetVertexCount() const { return m_count; } + + /// Get a vertex by index. + const b2Vec2& GetVertex(int32 index) const; + + /// Validate convexity. This is a very time consuming operation. + /// @returns true if valid + bool Validate() const; + + b2Vec2 m_centroid; + b2Vec2 m_vertices[b2_maxPolygonVertices]; + b2Vec2 m_normals[b2_maxPolygonVertices]; + int32 m_count; +}; + +inline b2PolygonShape::b2PolygonShape() +{ + m_type = e_polygon; + m_radius = b2_polygonRadius; + m_count = 0; + m_centroid.SetZero(); +} + +inline const b2Vec2& b2PolygonShape::GetVertex(int32 index) const +{ + b2Assert(0 <= index && index < m_count); + return m_vertices[index]; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/Shapes/b2Shape.h b/jni/love/src/libraries/Box2D/Collision/Shapes/b2Shape.h new file mode 100755 index 00000000..170ea1a1 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/Shapes/b2Shape.h @@ -0,0 +1,101 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_SHAPE_H +#define B2_SHAPE_H + +#include +#include +#include + +/// This holds the mass data computed for a shape. +struct b2MassData +{ + /// The mass of the shape, usually in kilograms. + float32 mass; + + /// The position of the shape's centroid relative to the shape's origin. + b2Vec2 center; + + /// The rotational inertia of the shape about the local origin. + float32 I; +}; + +/// A shape is used for collision detection. You can create a shape however you like. +/// Shapes used for simulation in b2World are created automatically when a b2Fixture +/// is created. Shapes may encapsulate a one or more child shapes. +class b2Shape +{ +public: + + enum Type + { + e_circle = 0, + e_edge = 1, + e_polygon = 2, + e_chain = 3, + e_typeCount = 4 + }; + + virtual ~b2Shape() {} + + /// Clone the concrete shape using the provided allocator. + virtual b2Shape* Clone(b2BlockAllocator* allocator) const = 0; + + /// Get the type of this shape. You can use this to down cast to the concrete shape. + /// @return the shape type. + Type GetType() const; + + /// Get the number of child primitives. + virtual int32 GetChildCount() const = 0; + + /// Test a point for containment in this shape. This only works for convex shapes. + /// @param xf the shape world transform. + /// @param p a point in world coordinates. + virtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0; + + /// Cast a ray against a child shape. + /// @param output the ray-cast results. + /// @param input the ray-cast input parameters. + /// @param transform the transform to be applied to the shape. + /// @param childIndex the child shape index + virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, + const b2Transform& transform, int32 childIndex) const = 0; + + /// Given a transform, compute the associated axis aligned bounding box for a child shape. + /// @param aabb returns the axis aligned box. + /// @param xf the world transform of the shape. + /// @param childIndex the child shape + virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const = 0; + + /// Compute the mass properties of this shape using its dimensions and density. + /// The inertia tensor is computed about the local origin. + /// @param massData returns the mass data for this shape. + /// @param density the density in kilograms per meter squared. + virtual void ComputeMass(b2MassData* massData, float32 density) const = 0; + + Type m_type; + float32 m_radius; +}; + +inline b2Shape::Type b2Shape::GetType() const +{ + return m_type; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/b2BroadPhase.cpp b/jni/love/src/libraries/Box2D/Collision/b2BroadPhase.cpp new file mode 100755 index 00000000..5cd6f0e8 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2BroadPhase.cpp @@ -0,0 +1,120 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include + +b2BroadPhase::b2BroadPhase() +{ + m_proxyCount = 0; + + m_pairCapacity = 16; + m_pairCount = 0; + m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair)); + + m_moveCapacity = 16; + m_moveCount = 0; + m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32)); +} + +b2BroadPhase::~b2BroadPhase() +{ + b2Free(m_moveBuffer); + b2Free(m_pairBuffer); +} + +int32 b2BroadPhase::CreateProxy(const b2AABB& aabb, void* userData) +{ + int32 proxyId = m_tree.CreateProxy(aabb, userData); + ++m_proxyCount; + BufferMove(proxyId); + return proxyId; +} + +void b2BroadPhase::DestroyProxy(int32 proxyId) +{ + UnBufferMove(proxyId); + --m_proxyCount; + m_tree.DestroyProxy(proxyId); +} + +void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement) +{ + bool buffer = m_tree.MoveProxy(proxyId, aabb, displacement); + if (buffer) + { + BufferMove(proxyId); + } +} + +void b2BroadPhase::TouchProxy(int32 proxyId) +{ + BufferMove(proxyId); +} + +void b2BroadPhase::BufferMove(int32 proxyId) +{ + if (m_moveCount == m_moveCapacity) + { + int32* oldBuffer = m_moveBuffer; + m_moveCapacity *= 2; + m_moveBuffer = (int32*)b2Alloc(m_moveCapacity * sizeof(int32)); + memcpy(m_moveBuffer, oldBuffer, m_moveCount * sizeof(int32)); + b2Free(oldBuffer); + } + + m_moveBuffer[m_moveCount] = proxyId; + ++m_moveCount; +} + +void b2BroadPhase::UnBufferMove(int32 proxyId) +{ + for (int32 i = 0; i < m_moveCount; ++i) + { + if (m_moveBuffer[i] == proxyId) + { + m_moveBuffer[i] = e_nullProxy; + } + } +} + +// This is called from b2DynamicTree::Query when we are gathering pairs. +bool b2BroadPhase::QueryCallback(int32 proxyId) +{ + // A proxy cannot form a pair with itself. + if (proxyId == m_queryProxyId) + { + return true; + } + + // Grow the pair buffer as needed. + if (m_pairCount == m_pairCapacity) + { + b2Pair* oldBuffer = m_pairBuffer; + m_pairCapacity *= 2; + m_pairBuffer = (b2Pair*)b2Alloc(m_pairCapacity * sizeof(b2Pair)); + memcpy(m_pairBuffer, oldBuffer, m_pairCount * sizeof(b2Pair)); + b2Free(oldBuffer); + } + + m_pairBuffer[m_pairCount].proxyIdA = b2Min(proxyId, m_queryProxyId); + m_pairBuffer[m_pairCount].proxyIdB = b2Max(proxyId, m_queryProxyId); + ++m_pairCount; + + return true; +} diff --git a/jni/love/src/libraries/Box2D/Collision/b2BroadPhase.h b/jni/love/src/libraries/Box2D/Collision/b2BroadPhase.h new file mode 100755 index 00000000..0c460cab --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2BroadPhase.h @@ -0,0 +1,257 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_BROAD_PHASE_H +#define B2_BROAD_PHASE_H + +#include +#include +#include +#include + +struct b2Pair +{ + int32 proxyIdA; + int32 proxyIdB; +}; + +/// The broad-phase is used for computing pairs and performing volume queries and ray casts. +/// This broad-phase does not persist pairs. Instead, this reports potentially new pairs. +/// It is up to the client to consume the new pairs and to track subsequent overlap. +class b2BroadPhase +{ +public: + + enum + { + e_nullProxy = -1 + }; + + b2BroadPhase(); + ~b2BroadPhase(); + + /// Create a proxy with an initial AABB. Pairs are not reported until + /// UpdatePairs is called. + int32 CreateProxy(const b2AABB& aabb, void* userData); + + /// Destroy a proxy. It is up to the client to remove any pairs. + void DestroyProxy(int32 proxyId); + + /// Call MoveProxy as many times as you like, then when you are done + /// call UpdatePairs to finalized the proxy pairs (for your time step). + void MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement); + + /// Call to trigger a re-processing of it's pairs on the next call to UpdatePairs. + void TouchProxy(int32 proxyId); + + /// Get the fat AABB for a proxy. + const b2AABB& GetFatAABB(int32 proxyId) const; + + /// Get user data from a proxy. Returns NULL if the id is invalid. + void* GetUserData(int32 proxyId) const; + + /// Test overlap of fat AABBs. + bool TestOverlap(int32 proxyIdA, int32 proxyIdB) const; + + /// Get the number of proxies. + int32 GetProxyCount() const; + + /// Update the pairs. This results in pair callbacks. This can only add pairs. + template + void UpdatePairs(T* callback); + + /// Query an AABB for overlapping proxies. The callback class + /// is called for each proxy that overlaps the supplied AABB. + template + void Query(T* callback, const b2AABB& aabb) const; + + /// Ray-cast against the proxies in the tree. This relies on the callback + /// to perform a exact ray-cast in the case were the proxy contains a shape. + /// The callback also performs the any collision filtering. This has performance + /// roughly equal to k * log(n), where k is the number of collisions and n is the + /// number of proxies in the tree. + /// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). + /// @param callback a callback class that is called for each proxy that is hit by the ray. + template + void RayCast(T* callback, const b2RayCastInput& input) const; + + /// Get the height of the embedded tree. + int32 GetTreeHeight() const; + + /// Get the balance of the embedded tree. + int32 GetTreeBalance() const; + + /// Get the quality metric of the embedded tree. + float32 GetTreeQuality() const; + + /// Shift the world origin. Useful for large worlds. + /// The shift formula is: position -= newOrigin + /// @param newOrigin the new origin with respect to the old origin + void ShiftOrigin(const b2Vec2& newOrigin); + +private: + + friend class b2DynamicTree; + + void BufferMove(int32 proxyId); + void UnBufferMove(int32 proxyId); + + bool QueryCallback(int32 proxyId); + + b2DynamicTree m_tree; + + int32 m_proxyCount; + + int32* m_moveBuffer; + int32 m_moveCapacity; + int32 m_moveCount; + + b2Pair* m_pairBuffer; + int32 m_pairCapacity; + int32 m_pairCount; + + int32 m_queryProxyId; +}; + +/// This is used to sort pairs. +inline bool b2PairLessThan(const b2Pair& pair1, const b2Pair& pair2) +{ + if (pair1.proxyIdA < pair2.proxyIdA) + { + return true; + } + + if (pair1.proxyIdA == pair2.proxyIdA) + { + return pair1.proxyIdB < pair2.proxyIdB; + } + + return false; +} + +inline void* b2BroadPhase::GetUserData(int32 proxyId) const +{ + return m_tree.GetUserData(proxyId); +} + +inline bool b2BroadPhase::TestOverlap(int32 proxyIdA, int32 proxyIdB) const +{ + const b2AABB& aabbA = m_tree.GetFatAABB(proxyIdA); + const b2AABB& aabbB = m_tree.GetFatAABB(proxyIdB); + return b2TestOverlap(aabbA, aabbB); +} + +inline const b2AABB& b2BroadPhase::GetFatAABB(int32 proxyId) const +{ + return m_tree.GetFatAABB(proxyId); +} + +inline int32 b2BroadPhase::GetProxyCount() const +{ + return m_proxyCount; +} + +inline int32 b2BroadPhase::GetTreeHeight() const +{ + return m_tree.GetHeight(); +} + +inline int32 b2BroadPhase::GetTreeBalance() const +{ + return m_tree.GetMaxBalance(); +} + +inline float32 b2BroadPhase::GetTreeQuality() const +{ + return m_tree.GetAreaRatio(); +} + +template +void b2BroadPhase::UpdatePairs(T* callback) +{ + // Reset pair buffer + m_pairCount = 0; + + // Perform tree queries for all moving proxies. + for (int32 i = 0; i < m_moveCount; ++i) + { + m_queryProxyId = m_moveBuffer[i]; + if (m_queryProxyId == e_nullProxy) + { + continue; + } + + // We have to query the tree with the fat AABB so that + // we don't fail to create a pair that may touch later. + const b2AABB& fatAABB = m_tree.GetFatAABB(m_queryProxyId); + + // Query tree, create pairs and add them pair buffer. + m_tree.Query(this, fatAABB); + } + + // Reset move buffer + m_moveCount = 0; + + // Sort the pair buffer to expose duplicates. + std::sort(m_pairBuffer, m_pairBuffer + m_pairCount, b2PairLessThan); + + // Send the pairs back to the client. + int32 i = 0; + while (i < m_pairCount) + { + b2Pair* primaryPair = m_pairBuffer + i; + void* userDataA = m_tree.GetUserData(primaryPair->proxyIdA); + void* userDataB = m_tree.GetUserData(primaryPair->proxyIdB); + + callback->AddPair(userDataA, userDataB); + ++i; + + // Skip any duplicate pairs. + while (i < m_pairCount) + { + b2Pair* pair = m_pairBuffer + i; + if (pair->proxyIdA != primaryPair->proxyIdA || pair->proxyIdB != primaryPair->proxyIdB) + { + break; + } + ++i; + } + } + + // Try to keep the tree balanced. + //m_tree.Rebalance(4); +} + +template +inline void b2BroadPhase::Query(T* callback, const b2AABB& aabb) const +{ + m_tree.Query(callback, aabb); +} + +template +inline void b2BroadPhase::RayCast(T* callback, const b2RayCastInput& input) const +{ + m_tree.RayCast(callback, input); +} + +inline void b2BroadPhase::ShiftOrigin(const b2Vec2& newOrigin) +{ + m_tree.ShiftOrigin(newOrigin); +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/b2CollideCircle.cpp b/jni/love/src/libraries/Box2D/Collision/b2CollideCircle.cpp new file mode 100755 index 00000000..4181fd47 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2CollideCircle.cpp @@ -0,0 +1,154 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +void b2CollideCircles( + b2Manifold* manifold, + const b2CircleShape* circleA, const b2Transform& xfA, + const b2CircleShape* circleB, const b2Transform& xfB) +{ + manifold->pointCount = 0; + + b2Vec2 pA = b2Mul(xfA, circleA->m_p); + b2Vec2 pB = b2Mul(xfB, circleB->m_p); + + b2Vec2 d = pB - pA; + float32 distSqr = b2Dot(d, d); + float32 rA = circleA->m_radius, rB = circleB->m_radius; + float32 radius = rA + rB; + if (distSqr > radius * radius) + { + return; + } + + manifold->type = b2Manifold::e_circles; + manifold->localPoint = circleA->m_p; + manifold->localNormal.SetZero(); + manifold->pointCount = 1; + + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; +} + +void b2CollidePolygonAndCircle( + b2Manifold* manifold, + const b2PolygonShape* polygonA, const b2Transform& xfA, + const b2CircleShape* circleB, const b2Transform& xfB) +{ + manifold->pointCount = 0; + + // Compute circle position in the frame of the polygon. + b2Vec2 c = b2Mul(xfB, circleB->m_p); + b2Vec2 cLocal = b2MulT(xfA, c); + + // Find the min separating edge. + int32 normalIndex = 0; + float32 separation = -b2_maxFloat; + float32 radius = polygonA->m_radius + circleB->m_radius; + int32 vertexCount = polygonA->m_count; + const b2Vec2* vertices = polygonA->m_vertices; + const b2Vec2* normals = polygonA->m_normals; + + for (int32 i = 0; i < vertexCount; ++i) + { + float32 s = b2Dot(normals[i], cLocal - vertices[i]); + + if (s > radius) + { + // Early out. + return; + } + + if (s > separation) + { + separation = s; + normalIndex = i; + } + } + + // Vertices that subtend the incident face. + int32 vertIndex1 = normalIndex; + int32 vertIndex2 = vertIndex1 + 1 < vertexCount ? vertIndex1 + 1 : 0; + b2Vec2 v1 = vertices[vertIndex1]; + b2Vec2 v2 = vertices[vertIndex2]; + + // If the center is inside the polygon ... + if (separation < b2_epsilon) + { + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = normals[normalIndex]; + manifold->localPoint = 0.5f * (v1 + v2); + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; + return; + } + + // Compute barycentric coordinates + float32 u1 = b2Dot(cLocal - v1, v2 - v1); + float32 u2 = b2Dot(cLocal - v2, v1 - v2); + if (u1 <= 0.0f) + { + if (b2DistanceSquared(cLocal, v1) > radius * radius) + { + return; + } + + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = cLocal - v1; + manifold->localNormal.Normalize(); + manifold->localPoint = v1; + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; + } + else if (u2 <= 0.0f) + { + if (b2DistanceSquared(cLocal, v2) > radius * radius) + { + return; + } + + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = cLocal - v2; + manifold->localNormal.Normalize(); + manifold->localPoint = v2; + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; + } + else + { + b2Vec2 faceCenter = 0.5f * (v1 + v2); + float32 separation = b2Dot(cLocal - faceCenter, normals[vertIndex1]); + if (separation > radius) + { + return; + } + + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = normals[vertIndex1]; + manifold->localPoint = faceCenter; + manifold->points[0].localPoint = circleB->m_p; + manifold->points[0].id.key = 0; + } +} diff --git a/jni/love/src/libraries/Box2D/Collision/b2CollideEdge.cpp b/jni/love/src/libraries/Box2D/Collision/b2CollideEdge.cpp new file mode 100755 index 00000000..88e311c6 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2CollideEdge.cpp @@ -0,0 +1,698 @@ +/* + * Copyright (c) 2007-2009 Erin Catto http://www.box2d.org + * + * 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 +#include +#include +#include + + +// Compute contact points for edge versus circle. +// This accounts for edge connectivity. +void b2CollideEdgeAndCircle(b2Manifold* manifold, + const b2EdgeShape* edgeA, const b2Transform& xfA, + const b2CircleShape* circleB, const b2Transform& xfB) +{ + manifold->pointCount = 0; + + // Compute circle in frame of edge + b2Vec2 Q = b2MulT(xfA, b2Mul(xfB, circleB->m_p)); + + b2Vec2 A = edgeA->m_vertex1, B = edgeA->m_vertex2; + b2Vec2 e = B - A; + + // Barycentric coordinates + float32 u = b2Dot(e, B - Q); + float32 v = b2Dot(e, Q - A); + + float32 radius = edgeA->m_radius + circleB->m_radius; + + b2ContactFeature cf; + cf.indexB = 0; + cf.typeB = b2ContactFeature::e_vertex; + + // Region A + if (v <= 0.0f) + { + b2Vec2 P = A; + b2Vec2 d = Q - P; + float32 dd = b2Dot(d, d); + if (dd > radius * radius) + { + return; + } + + // Is there an edge connected to A? + if (edgeA->m_hasVertex0) + { + b2Vec2 A1 = edgeA->m_vertex0; + b2Vec2 B1 = A; + b2Vec2 e1 = B1 - A1; + float32 u1 = b2Dot(e1, B1 - Q); + + // Is the circle in Region AB of the previous edge? + if (u1 > 0.0f) + { + return; + } + } + + cf.indexA = 0; + cf.typeA = b2ContactFeature::e_vertex; + manifold->pointCount = 1; + manifold->type = b2Manifold::e_circles; + manifold->localNormal.SetZero(); + manifold->localPoint = P; + manifold->points[0].id.key = 0; + manifold->points[0].id.cf = cf; + manifold->points[0].localPoint = circleB->m_p; + return; + } + + // Region B + if (u <= 0.0f) + { + b2Vec2 P = B; + b2Vec2 d = Q - P; + float32 dd = b2Dot(d, d); + if (dd > radius * radius) + { + return; + } + + // Is there an edge connected to B? + if (edgeA->m_hasVertex3) + { + b2Vec2 B2 = edgeA->m_vertex3; + b2Vec2 A2 = B; + b2Vec2 e2 = B2 - A2; + float32 v2 = b2Dot(e2, Q - A2); + + // Is the circle in Region AB of the next edge? + if (v2 > 0.0f) + { + return; + } + } + + cf.indexA = 1; + cf.typeA = b2ContactFeature::e_vertex; + manifold->pointCount = 1; + manifold->type = b2Manifold::e_circles; + manifold->localNormal.SetZero(); + manifold->localPoint = P; + manifold->points[0].id.key = 0; + manifold->points[0].id.cf = cf; + manifold->points[0].localPoint = circleB->m_p; + return; + } + + // Region AB + float32 den = b2Dot(e, e); + b2Assert(den > 0.0f); + b2Vec2 P = (1.0f / den) * (u * A + v * B); + b2Vec2 d = Q - P; + float32 dd = b2Dot(d, d); + if (dd > radius * radius) + { + return; + } + + b2Vec2 n(-e.y, e.x); + if (b2Dot(n, Q - A) < 0.0f) + { + n.Set(-n.x, -n.y); + } + n.Normalize(); + + cf.indexA = 0; + cf.typeA = b2ContactFeature::e_face; + manifold->pointCount = 1; + manifold->type = b2Manifold::e_faceA; + manifold->localNormal = n; + manifold->localPoint = A; + manifold->points[0].id.key = 0; + manifold->points[0].id.cf = cf; + manifold->points[0].localPoint = circleB->m_p; +} + +// This structure is used to keep track of the best separating axis. +struct b2EPAxis +{ + enum Type + { + e_unknown, + e_edgeA, + e_edgeB + }; + + Type type; + int32 index; + float32 separation; +}; + +// This holds polygon B expressed in frame A. +struct b2TempPolygon +{ + b2Vec2 vertices[b2_maxPolygonVertices]; + b2Vec2 normals[b2_maxPolygonVertices]; + int32 count; +}; + +// Reference face used for clipping +struct b2ReferenceFace +{ + int32 i1, i2; + + b2Vec2 v1, v2; + + b2Vec2 normal; + + b2Vec2 sideNormal1; + float32 sideOffset1; + + b2Vec2 sideNormal2; + float32 sideOffset2; +}; + +// This class collides and edge and a polygon, taking into account edge adjacency. +struct b2EPCollider +{ + void Collide(b2Manifold* manifold, const b2EdgeShape* edgeA, const b2Transform& xfA, + const b2PolygonShape* polygonB, const b2Transform& xfB); + b2EPAxis ComputeEdgeSeparation(); + b2EPAxis ComputePolygonSeparation(); + + enum VertexType + { + e_isolated, + e_concave, + e_convex + }; + + b2TempPolygon m_polygonB; + + b2Transform m_xf; + b2Vec2 m_centroidB; + b2Vec2 m_v0, m_v1, m_v2, m_v3; + b2Vec2 m_normal0, m_normal1, m_normal2; + b2Vec2 m_normal; + VertexType m_type1, m_type2; + b2Vec2 m_lowerLimit, m_upperLimit; + float32 m_radius; + bool m_front; +}; + +// Algorithm: +// 1. Classify v1 and v2 +// 2. Classify polygon centroid as front or back +// 3. Flip normal if necessary +// 4. Initialize normal range to [-pi, pi] about face normal +// 5. Adjust normal range according to adjacent edges +// 6. Visit each separating axes, only accept axes within the range +// 7. Return if _any_ axis indicates separation +// 8. Clip +void b2EPCollider::Collide(b2Manifold* manifold, const b2EdgeShape* edgeA, const b2Transform& xfA, + const b2PolygonShape* polygonB, const b2Transform& xfB) +{ + m_xf = b2MulT(xfA, xfB); + + m_centroidB = b2Mul(m_xf, polygonB->m_centroid); + + m_v0 = edgeA->m_vertex0; + m_v1 = edgeA->m_vertex1; + m_v2 = edgeA->m_vertex2; + m_v3 = edgeA->m_vertex3; + + bool hasVertex0 = edgeA->m_hasVertex0; + bool hasVertex3 = edgeA->m_hasVertex3; + + b2Vec2 edge1 = m_v2 - m_v1; + edge1.Normalize(); + m_normal1.Set(edge1.y, -edge1.x); + float32 offset1 = b2Dot(m_normal1, m_centroidB - m_v1); + float32 offset0 = 0.0f, offset2 = 0.0f; + bool convex1 = false, convex2 = false; + + // Is there a preceding edge? + if (hasVertex0) + { + b2Vec2 edge0 = m_v1 - m_v0; + edge0.Normalize(); + m_normal0.Set(edge0.y, -edge0.x); + convex1 = b2Cross(edge0, edge1) >= 0.0f; + offset0 = b2Dot(m_normal0, m_centroidB - m_v0); + } + + // Is there a following edge? + if (hasVertex3) + { + b2Vec2 edge2 = m_v3 - m_v2; + edge2.Normalize(); + m_normal2.Set(edge2.y, -edge2.x); + convex2 = b2Cross(edge1, edge2) > 0.0f; + offset2 = b2Dot(m_normal2, m_centroidB - m_v2); + } + + // Determine front or back collision. Determine collision normal limits. + if (hasVertex0 && hasVertex3) + { + if (convex1 && convex2) + { + m_front = offset0 >= 0.0f || offset1 >= 0.0f || offset2 >= 0.0f; + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = m_normal0; + m_upperLimit = m_normal2; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = -m_normal1; + m_upperLimit = -m_normal1; + } + } + else if (convex1) + { + m_front = offset0 >= 0.0f || (offset1 >= 0.0f && offset2 >= 0.0f); + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = m_normal0; + m_upperLimit = m_normal1; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = -m_normal2; + m_upperLimit = -m_normal1; + } + } + else if (convex2) + { + m_front = offset2 >= 0.0f || (offset0 >= 0.0f && offset1 >= 0.0f); + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = m_normal1; + m_upperLimit = m_normal2; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = -m_normal1; + m_upperLimit = -m_normal0; + } + } + else + { + m_front = offset0 >= 0.0f && offset1 >= 0.0f && offset2 >= 0.0f; + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = m_normal1; + m_upperLimit = m_normal1; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = -m_normal2; + m_upperLimit = -m_normal0; + } + } + } + else if (hasVertex0) + { + if (convex1) + { + m_front = offset0 >= 0.0f || offset1 >= 0.0f; + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = m_normal0; + m_upperLimit = -m_normal1; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = m_normal1; + m_upperLimit = -m_normal1; + } + } + else + { + m_front = offset0 >= 0.0f && offset1 >= 0.0f; + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = m_normal1; + m_upperLimit = -m_normal1; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = m_normal1; + m_upperLimit = -m_normal0; + } + } + } + else if (hasVertex3) + { + if (convex2) + { + m_front = offset1 >= 0.0f || offset2 >= 0.0f; + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = -m_normal1; + m_upperLimit = m_normal2; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = -m_normal1; + m_upperLimit = m_normal1; + } + } + else + { + m_front = offset1 >= 0.0f && offset2 >= 0.0f; + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = -m_normal1; + m_upperLimit = m_normal1; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = -m_normal2; + m_upperLimit = m_normal1; + } + } + } + else + { + m_front = offset1 >= 0.0f; + if (m_front) + { + m_normal = m_normal1; + m_lowerLimit = -m_normal1; + m_upperLimit = -m_normal1; + } + else + { + m_normal = -m_normal1; + m_lowerLimit = m_normal1; + m_upperLimit = m_normal1; + } + } + + // Get polygonB in frameA + m_polygonB.count = polygonB->m_count; + for (int32 i = 0; i < polygonB->m_count; ++i) + { + m_polygonB.vertices[i] = b2Mul(m_xf, polygonB->m_vertices[i]); + m_polygonB.normals[i] = b2Mul(m_xf.q, polygonB->m_normals[i]); + } + + m_radius = 2.0f * b2_polygonRadius; + + manifold->pointCount = 0; + + b2EPAxis edgeAxis = ComputeEdgeSeparation(); + + // If no valid normal can be found than this edge should not collide. + if (edgeAxis.type == b2EPAxis::e_unknown) + { + return; + } + + if (edgeAxis.separation > m_radius) + { + return; + } + + b2EPAxis polygonAxis = ComputePolygonSeparation(); + if (polygonAxis.type != b2EPAxis::e_unknown && polygonAxis.separation > m_radius) + { + return; + } + + // Use hysteresis for jitter reduction. + const float32 k_relativeTol = 0.98f; + const float32 k_absoluteTol = 0.001f; + + b2EPAxis primaryAxis; + if (polygonAxis.type == b2EPAxis::e_unknown) + { + primaryAxis = edgeAxis; + } + else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) + { + primaryAxis = polygonAxis; + } + else + { + primaryAxis = edgeAxis; + } + + b2ClipVertex ie[2]; + b2ReferenceFace rf; + if (primaryAxis.type == b2EPAxis::e_edgeA) + { + manifold->type = b2Manifold::e_faceA; + + // Search for the polygon normal that is most anti-parallel to the edge normal. + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_normal, m_polygonB.normals[0]); + for (int32 i = 1; i < m_polygonB.count; ++i) + { + float32 value = b2Dot(m_normal, m_polygonB.normals[i]); + if (value < bestValue) + { + bestValue = value; + bestIndex = i; + } + } + + int32 i1 = bestIndex; + int32 i2 = i1 + 1 < m_polygonB.count ? i1 + 1 : 0; + + ie[0].v = m_polygonB.vertices[i1]; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = static_cast(i1); + ie[0].id.cf.typeA = b2ContactFeature::e_face; + ie[0].id.cf.typeB = b2ContactFeature::e_vertex; + + ie[1].v = m_polygonB.vertices[i2]; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = static_cast(i2); + ie[1].id.cf.typeA = b2ContactFeature::e_face; + ie[1].id.cf.typeB = b2ContactFeature::e_vertex; + + if (m_front) + { + rf.i1 = 0; + rf.i2 = 1; + rf.v1 = m_v1; + rf.v2 = m_v2; + rf.normal = m_normal1; + } + else + { + rf.i1 = 1; + rf.i2 = 0; + rf.v1 = m_v2; + rf.v2 = m_v1; + rf.normal = -m_normal1; + } + } + else + { + manifold->type = b2Manifold::e_faceB; + + ie[0].v = m_v1; + ie[0].id.cf.indexA = 0; + ie[0].id.cf.indexB = static_cast(primaryAxis.index); + ie[0].id.cf.typeA = b2ContactFeature::e_vertex; + ie[0].id.cf.typeB = b2ContactFeature::e_face; + + ie[1].v = m_v2; + ie[1].id.cf.indexA = 0; + ie[1].id.cf.indexB = static_cast(primaryAxis.index); + ie[1].id.cf.typeA = b2ContactFeature::e_vertex; + ie[1].id.cf.typeB = b2ContactFeature::e_face; + + rf.i1 = primaryAxis.index; + rf.i2 = rf.i1 + 1 < m_polygonB.count ? rf.i1 + 1 : 0; + rf.v1 = m_polygonB.vertices[rf.i1]; + rf.v2 = m_polygonB.vertices[rf.i2]; + rf.normal = m_polygonB.normals[rf.i1]; + } + + rf.sideNormal1.Set(rf.normal.y, -rf.normal.x); + rf.sideNormal2 = -rf.sideNormal1; + rf.sideOffset1 = b2Dot(rf.sideNormal1, rf.v1); + rf.sideOffset2 = b2Dot(rf.sideNormal2, rf.v2); + + // Clip incident edge against extruded edge1 side edges. + b2ClipVertex clipPoints1[2]; + b2ClipVertex clipPoints2[2]; + int32 np; + + // Clip to box side 1 + np = b2ClipSegmentToLine(clipPoints1, ie, rf.sideNormal1, rf.sideOffset1, rf.i1); + + if (np < b2_maxManifoldPoints) + { + return; + } + + // Clip to negative box side 1 + np = b2ClipSegmentToLine(clipPoints2, clipPoints1, rf.sideNormal2, rf.sideOffset2, rf.i2); + + if (np < b2_maxManifoldPoints) + { + return; + } + + // Now clipPoints2 contains the clipped points. + if (primaryAxis.type == b2EPAxis::e_edgeA) + { + manifold->localNormal = rf.normal; + manifold->localPoint = rf.v1; + } + else + { + manifold->localNormal = polygonB->m_normals[rf.i1]; + manifold->localPoint = polygonB->m_vertices[rf.i1]; + } + + int32 pointCount = 0; + for (int32 i = 0; i < b2_maxManifoldPoints; ++i) + { + float32 separation; + + separation = b2Dot(rf.normal, clipPoints2[i].v - rf.v1); + + if (separation <= m_radius) + { + b2ManifoldPoint* cp = manifold->points + pointCount; + + if (primaryAxis.type == b2EPAxis::e_edgeA) + { + cp->localPoint = b2MulT(m_xf, clipPoints2[i].v); + cp->id = clipPoints2[i].id; + } + else + { + cp->localPoint = clipPoints2[i].v; + cp->id.cf.typeA = clipPoints2[i].id.cf.typeB; + cp->id.cf.typeB = clipPoints2[i].id.cf.typeA; + cp->id.cf.indexA = clipPoints2[i].id.cf.indexB; + cp->id.cf.indexB = clipPoints2[i].id.cf.indexA; + } + + ++pointCount; + } + } + + manifold->pointCount = pointCount; +} + +b2EPAxis b2EPCollider::ComputeEdgeSeparation() +{ + b2EPAxis axis; + axis.type = b2EPAxis::e_edgeA; + axis.index = m_front ? 0 : 1; + axis.separation = FLT_MAX; + + for (int32 i = 0; i < m_polygonB.count; ++i) + { + float32 s = b2Dot(m_normal, m_polygonB.vertices[i] - m_v1); + if (s < axis.separation) + { + axis.separation = s; + } + } + + return axis; +} + +b2EPAxis b2EPCollider::ComputePolygonSeparation() +{ + b2EPAxis axis; + axis.type = b2EPAxis::e_unknown; + axis.index = -1; + axis.separation = -FLT_MAX; + + b2Vec2 perp(-m_normal.y, m_normal.x); + + for (int32 i = 0; i < m_polygonB.count; ++i) + { + b2Vec2 n = -m_polygonB.normals[i]; + + float32 s1 = b2Dot(n, m_polygonB.vertices[i] - m_v1); + float32 s2 = b2Dot(n, m_polygonB.vertices[i] - m_v2); + float32 s = b2Min(s1, s2); + + if (s > m_radius) + { + // No collision + axis.type = b2EPAxis::e_edgeB; + axis.index = i; + axis.separation = s; + return axis; + } + + // Adjacency + if (b2Dot(n, perp) >= 0.0f) + { + if (b2Dot(n - m_upperLimit, m_normal) < -b2_angularSlop) + { + continue; + } + } + else + { + if (b2Dot(n - m_lowerLimit, m_normal) < -b2_angularSlop) + { + continue; + } + } + + if (s > axis.separation) + { + axis.type = b2EPAxis::e_edgeB; + axis.index = i; + axis.separation = s; + } + } + + return axis; +} + +void b2CollideEdgeAndPolygon( b2Manifold* manifold, + const b2EdgeShape* edgeA, const b2Transform& xfA, + const b2PolygonShape* polygonB, const b2Transform& xfB) +{ + b2EPCollider collider; + collider.Collide(manifold, edgeA, xfA, polygonB, xfB); +} diff --git a/jni/love/src/libraries/Box2D/Collision/b2CollidePolygon.cpp b/jni/love/src/libraries/Box2D/Collision/b2CollidePolygon.cpp new file mode 100755 index 00000000..0aac38b2 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2CollidePolygon.cpp @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include + +// Find the max separation between poly1 and poly2 using edge normals from poly1. +static float32 b2FindMaxSeparation(int32* edgeIndex, + const b2PolygonShape* poly1, const b2Transform& xf1, + const b2PolygonShape* poly2, const b2Transform& xf2) +{ + int32 count1 = poly1->m_count; + int32 count2 = poly2->m_count; + const b2Vec2* n1s = poly1->m_normals; + const b2Vec2* v1s = poly1->m_vertices; + const b2Vec2* v2s = poly2->m_vertices; + b2Transform xf = b2MulT(xf2, xf1); + + int32 bestIndex = 0; + float32 maxSeparation = -b2_maxFloat; + for (int32 i = 0; i < count1; ++i) + { + // Get poly1 normal in frame2. + b2Vec2 n = b2Mul(xf.q, n1s[i]); + b2Vec2 v1 = b2Mul(xf, v1s[i]); + + // Find deepest point for normal i. + float32 si = b2_maxFloat; + for (int32 j = 0; j < count2; ++j) + { + float32 sij = b2Dot(n, v2s[j] - v1); + if (sij < si) + { + si = sij; + } + } + + if (si > maxSeparation) + { + maxSeparation = si; + bestIndex = i; + } + } + + *edgeIndex = bestIndex; + return maxSeparation; +} + +static void b2FindIncidentEdge(b2ClipVertex c[2], + const b2PolygonShape* poly1, const b2Transform& xf1, int32 edge1, + const b2PolygonShape* poly2, const b2Transform& xf2) +{ + const b2Vec2* normals1 = poly1->m_normals; + + int32 count2 = poly2->m_count; + const b2Vec2* vertices2 = poly2->m_vertices; + const b2Vec2* normals2 = poly2->m_normals; + + b2Assert(0 <= edge1 && edge1 < poly1->m_count); + + // Get the normal of the reference edge in poly2's frame. + b2Vec2 normal1 = b2MulT(xf2.q, b2Mul(xf1.q, normals1[edge1])); + + // Find the incident edge on poly2. + int32 index = 0; + float32 minDot = b2_maxFloat; + for (int32 i = 0; i < count2; ++i) + { + float32 dot = b2Dot(normal1, normals2[i]); + if (dot < minDot) + { + minDot = dot; + index = i; + } + } + + // Build the clip vertices for the incident edge. + int32 i1 = index; + int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0; + + c[0].v = b2Mul(xf2, vertices2[i1]); + c[0].id.cf.indexA = (uint8)edge1; + c[0].id.cf.indexB = (uint8)i1; + c[0].id.cf.typeA = b2ContactFeature::e_face; + c[0].id.cf.typeB = b2ContactFeature::e_vertex; + + c[1].v = b2Mul(xf2, vertices2[i2]); + c[1].id.cf.indexA = (uint8)edge1; + c[1].id.cf.indexB = (uint8)i2; + c[1].id.cf.typeA = b2ContactFeature::e_face; + c[1].id.cf.typeB = b2ContactFeature::e_vertex; +} + +// Find edge normal of max separation on A - return if separating axis is found +// Find edge normal of max separation on B - return if separation axis is found +// Choose reference edge as min(minA, minB) +// Find incident edge +// Clip + +// The normal points from 1 to 2 +void b2CollidePolygons(b2Manifold* manifold, + const b2PolygonShape* polyA, const b2Transform& xfA, + const b2PolygonShape* polyB, const b2Transform& xfB) +{ + manifold->pointCount = 0; + float32 totalRadius = polyA->m_radius + polyB->m_radius; + + int32 edgeA = 0; + float32 separationA = b2FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB); + if (separationA > totalRadius) + return; + + int32 edgeB = 0; + float32 separationB = b2FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA); + if (separationB > totalRadius) + return; + + const b2PolygonShape* poly1; // reference polygon + const b2PolygonShape* poly2; // incident polygon + b2Transform xf1, xf2; + int32 edge1; // reference edge + uint8 flip; + const float32 k_tol = 0.1f * b2_linearSlop; + + if (separationB > separationA + k_tol) + { + poly1 = polyB; + poly2 = polyA; + xf1 = xfB; + xf2 = xfA; + edge1 = edgeB; + manifold->type = b2Manifold::e_faceB; + flip = 1; + } + else + { + poly1 = polyA; + poly2 = polyB; + xf1 = xfA; + xf2 = xfB; + edge1 = edgeA; + manifold->type = b2Manifold::e_faceA; + flip = 0; + } + + b2ClipVertex incidentEdge[2]; + b2FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2); + + int32 count1 = poly1->m_count; + const b2Vec2* vertices1 = poly1->m_vertices; + + int32 iv1 = edge1; + int32 iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; + + b2Vec2 v11 = vertices1[iv1]; + b2Vec2 v12 = vertices1[iv2]; + + b2Vec2 localTangent = v12 - v11; + localTangent.Normalize(); + + b2Vec2 localNormal = b2Cross(localTangent, 1.0f); + b2Vec2 planePoint = 0.5f * (v11 + v12); + + b2Vec2 tangent = b2Mul(xf1.q, localTangent); + b2Vec2 normal = b2Cross(tangent, 1.0f); + + v11 = b2Mul(xf1, v11); + v12 = b2Mul(xf1, v12); + + // Face offset. + float32 frontOffset = b2Dot(normal, v11); + + // Side offsets, extended by polytope skin thickness. + float32 sideOffset1 = -b2Dot(tangent, v11) + totalRadius; + float32 sideOffset2 = b2Dot(tangent, v12) + totalRadius; + + // Clip incident edge against extruded edge1 side edges. + b2ClipVertex clipPoints1[2]; + b2ClipVertex clipPoints2[2]; + int np; + + // Clip to box side 1 + np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1, iv1); + + if (np < 2) + return; + + // Clip to negative box side 1 + np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); + + if (np < 2) + { + return; + } + + // Now clipPoints2 contains the clipped points. + manifold->localNormal = localNormal; + manifold->localPoint = planePoint; + + int32 pointCount = 0; + for (int32 i = 0; i < b2_maxManifoldPoints; ++i) + { + float32 separation = b2Dot(normal, clipPoints2[i].v) - frontOffset; + + if (separation <= totalRadius) + { + b2ManifoldPoint* cp = manifold->points + pointCount; + cp->localPoint = b2MulT(xf2, clipPoints2[i].v); + cp->id = clipPoints2[i].id; + if (flip) + { + // Swap features + b2ContactFeature cf = cp->id.cf; + cp->id.cf.indexA = cf.indexB; + cp->id.cf.indexB = cf.indexA; + cp->id.cf.typeA = cf.typeB; + cp->id.cf.typeB = cf.typeA; + } + ++pointCount; + } + } + + manifold->pointCount = pointCount; +} diff --git a/jni/love/src/libraries/Box2D/Collision/b2Collision.cpp b/jni/love/src/libraries/Box2D/Collision/b2Collision.cpp new file mode 100755 index 00000000..4ebf3556 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2Collision.cpp @@ -0,0 +1,252 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* +* 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 +#include + +void b2WorldManifold::Initialize(const b2Manifold* manifold, + const b2Transform& xfA, float32 radiusA, + const b2Transform& xfB, float32 radiusB) +{ + if (manifold->pointCount == 0) + { + return; + } + + switch (manifold->type) + { + case b2Manifold::e_circles: + { + normal.Set(1.0f, 0.0f); + b2Vec2 pointA = b2Mul(xfA, manifold->localPoint); + b2Vec2 pointB = b2Mul(xfB, manifold->points[0].localPoint); + if (b2DistanceSquared(pointA, pointB) > b2_epsilon * b2_epsilon) + { + normal = pointB - pointA; + normal.Normalize(); + } + + b2Vec2 cA = pointA + radiusA * normal; + b2Vec2 cB = pointB - radiusB * normal; + points[0] = 0.5f * (cA + cB); + separations[0] = b2Dot(cB - cA, normal); + } + break; + + case b2Manifold::e_faceA: + { + normal = b2Mul(xfA.q, manifold->localNormal); + b2Vec2 planePoint = b2Mul(xfA, manifold->localPoint); + + for (int32 i = 0; i < manifold->pointCount; ++i) + { + b2Vec2 clipPoint = b2Mul(xfB, manifold->points[i].localPoint); + b2Vec2 cA = clipPoint + (radiusA - b2Dot(clipPoint - planePoint, normal)) * normal; + b2Vec2 cB = clipPoint - radiusB * normal; + points[i] = 0.5f * (cA + cB); + separations[i] = b2Dot(cB - cA, normal); + } + } + break; + + case b2Manifold::e_faceB: + { + normal = b2Mul(xfB.q, manifold->localNormal); + b2Vec2 planePoint = b2Mul(xfB, manifold->localPoint); + + for (int32 i = 0; i < manifold->pointCount; ++i) + { + b2Vec2 clipPoint = b2Mul(xfA, manifold->points[i].localPoint); + b2Vec2 cB = clipPoint + (radiusB - b2Dot(clipPoint - planePoint, normal)) * normal; + b2Vec2 cA = clipPoint - radiusA * normal; + points[i] = 0.5f * (cA + cB); + separations[i] = b2Dot(cA - cB, normal); + } + + // Ensure normal points from A to B. + normal = -normal; + } + break; + } +} + +void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints], + const b2Manifold* manifold1, const b2Manifold* manifold2) +{ + for (int32 i = 0; i < b2_maxManifoldPoints; ++i) + { + state1[i] = b2_nullState; + state2[i] = b2_nullState; + } + + // Detect persists and removes. + for (int32 i = 0; i < manifold1->pointCount; ++i) + { + b2ContactID id = manifold1->points[i].id; + + state1[i] = b2_removeState; + + for (int32 j = 0; j < manifold2->pointCount; ++j) + { + if (manifold2->points[j].id.key == id.key) + { + state1[i] = b2_persistState; + break; + } + } + } + + // Detect persists and adds. + for (int32 i = 0; i < manifold2->pointCount; ++i) + { + b2ContactID id = manifold2->points[i].id; + + state2[i] = b2_addState; + + for (int32 j = 0; j < manifold1->pointCount; ++j) + { + if (manifold1->points[j].id.key == id.key) + { + state2[i] = b2_persistState; + break; + } + } + } +} + +// From Real-time Collision Detection, p179. +bool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const +{ + float32 tmin = -b2_maxFloat; + float32 tmax = b2_maxFloat; + + b2Vec2 p = input.p1; + b2Vec2 d = input.p2 - input.p1; + b2Vec2 absD = b2Abs(d); + + b2Vec2 normal; + + for (int32 i = 0; i < 2; ++i) + { + if (absD(i) < b2_epsilon) + { + // Parallel. + if (p(i) < lowerBound(i) || upperBound(i) < p(i)) + { + return false; + } + } + else + { + float32 inv_d = 1.0f / d(i); + float32 t1 = (lowerBound(i) - p(i)) * inv_d; + float32 t2 = (upperBound(i) - p(i)) * inv_d; + + // Sign of the normal vector. + float32 s = -1.0f; + + if (t1 > t2) + { + b2Swap(t1, t2); + s = 1.0f; + } + + // Push the min up + if (t1 > tmin) + { + normal.SetZero(); + normal(i) = s; + tmin = t1; + } + + // Pull the max down + tmax = b2Min(tmax, t2); + + if (tmin > tmax) + { + return false; + } + } + } + + // Does the ray start inside the box? + // Does the ray intersect beyond the max fraction? + if (tmin < 0.0f || input.maxFraction < tmin) + { + return false; + } + + // Intersection. + output->fraction = tmin; + output->normal = normal; + return true; +} + +// Sutherland-Hodgman clipping. +int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], + const b2Vec2& normal, float32 offset, int32 vertexIndexA) +{ + // Start with no output points + int32 numOut = 0; + + // Calculate the distance of end points to the line + float32 distance0 = b2Dot(normal, vIn[0].v) - offset; + float32 distance1 = b2Dot(normal, vIn[1].v) - offset; + + // If the points are behind the plane + if (distance0 <= 0.0f) vOut[numOut++] = vIn[0]; + if (distance1 <= 0.0f) vOut[numOut++] = vIn[1]; + + // If the points are on different sides of the plane + if (distance0 * distance1 < 0.0f) + { + // Find intersection point of edge and plane + float32 interp = distance0 / (distance0 - distance1); + vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v); + + // VertexA is hitting edgeB. + vOut[numOut].id.cf.indexA = static_cast(vertexIndexA); + vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB; + vOut[numOut].id.cf.typeA = b2ContactFeature::e_vertex; + vOut[numOut].id.cf.typeB = b2ContactFeature::e_face; + ++numOut; + } + + return numOut; +} + +bool b2TestOverlap( const b2Shape* shapeA, int32 indexA, + const b2Shape* shapeB, int32 indexB, + const b2Transform& xfA, const b2Transform& xfB) +{ + b2DistanceInput input; + input.proxyA.Set(shapeA, indexA); + input.proxyB.Set(shapeB, indexB); + input.transformA = xfA; + input.transformB = xfB; + input.useRadii = true; + + b2SimplexCache cache; + cache.count = 0; + + b2DistanceOutput output; + + b2Distance(&output, &cache, &input); + + return output.distance < 10.0f * b2_epsilon; +} diff --git a/jni/love/src/libraries/Box2D/Collision/b2Collision.h b/jni/love/src/libraries/Box2D/Collision/b2Collision.h new file mode 100755 index 00000000..ad023b3c --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2Collision.h @@ -0,0 +1,277 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_COLLISION_H +#define B2_COLLISION_H + +#include +#include + +/// @file +/// Structures and functions used for computing contact points, distance +/// queries, and TOI queries. + +class b2Shape; +class b2CircleShape; +class b2EdgeShape; +class b2PolygonShape; + +const uint8 b2_nullFeature = UCHAR_MAX; + +/// The features that intersect to form the contact point +/// This must be 4 bytes or less. +struct b2ContactFeature +{ + enum Type + { + e_vertex = 0, + e_face = 1 + }; + + uint8 indexA; ///< Feature index on shapeA + uint8 indexB; ///< Feature index on shapeB + uint8 typeA; ///< The feature type on shapeA + uint8 typeB; ///< The feature type on shapeB +}; + +/// Contact ids to facilitate warm starting. +union b2ContactID +{ + b2ContactFeature cf; + uint32 key; ///< Used to quickly compare contact ids. +}; + +/// A manifold point is a contact point belonging to a contact +/// manifold. It holds details related to the geometry and dynamics +/// of the contact points. +/// The local point usage depends on the manifold type: +/// -e_circles: the local center of circleB +/// -e_faceA: the local center of cirlceB or the clip point of polygonB +/// -e_faceB: the clip point of polygonA +/// This structure is stored across time steps, so we keep it small. +/// Note: the impulses are used for internal caching and may not +/// provide reliable contact forces, especially for high speed collisions. +struct b2ManifoldPoint +{ + b2Vec2 localPoint; ///< usage depends on manifold type + float32 normalImpulse; ///< the non-penetration impulse + float32 tangentImpulse; ///< the friction impulse + b2ContactID id; ///< uniquely identifies a contact point between two shapes +}; + +/// A manifold for two touching convex shapes. +/// Box2D supports multiple types of contact: +/// - clip point versus plane with radius +/// - point versus point with radius (circles) +/// The local point usage depends on the manifold type: +/// -e_circles: the local center of circleA +/// -e_faceA: the center of faceA +/// -e_faceB: the center of faceB +/// Similarly the local normal usage: +/// -e_circles: not used +/// -e_faceA: the normal on polygonA +/// -e_faceB: the normal on polygonB +/// We store contacts in this way so that position correction can +/// account for movement, which is critical for continuous physics. +/// All contact scenarios must be expressed in one of these types. +/// This structure is stored across time steps, so we keep it small. +struct b2Manifold +{ + enum Type + { + e_circles, + e_faceA, + e_faceB + }; + + b2ManifoldPoint points[b2_maxManifoldPoints]; ///< the points of contact + b2Vec2 localNormal; ///< not use for Type::e_points + b2Vec2 localPoint; ///< usage depends on manifold type + Type type; + int32 pointCount; ///< the number of manifold points +}; + +/// This is used to compute the current state of a contact manifold. +struct b2WorldManifold +{ + /// Evaluate the manifold with supplied transforms. This assumes + /// modest motion from the original state. This does not change the + /// point count, impulses, etc. The radii must come from the shapes + /// that generated the manifold. + void Initialize(const b2Manifold* manifold, + const b2Transform& xfA, float32 radiusA, + const b2Transform& xfB, float32 radiusB); + + b2Vec2 normal; ///< world vector pointing from A to B + b2Vec2 points[b2_maxManifoldPoints]; ///< world contact point (point of intersection) + float32 separations[b2_maxManifoldPoints]; ///< a negative value indicates overlap, in meters +}; + +/// This is used for determining the state of contact points. +enum b2PointState +{ + b2_nullState, ///< point does not exist + b2_addState, ///< point was added in the update + b2_persistState, ///< point persisted across the update + b2_removeState ///< point was removed in the update +}; + +/// Compute the point states given two manifolds. The states pertain to the transition from manifold1 +/// to manifold2. So state1 is either persist or remove while state2 is either add or persist. +void b2GetPointStates(b2PointState state1[b2_maxManifoldPoints], b2PointState state2[b2_maxManifoldPoints], + const b2Manifold* manifold1, const b2Manifold* manifold2); + +/// Used for computing contact manifolds. +struct b2ClipVertex +{ + b2Vec2 v; + b2ContactID id; +}; + +/// Ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). +struct b2RayCastInput +{ + b2Vec2 p1, p2; + float32 maxFraction; +}; + +/// Ray-cast output data. The ray hits at p1 + fraction * (p2 - p1), where p1 and p2 +/// come from b2RayCastInput. +struct b2RayCastOutput +{ + b2Vec2 normal; + float32 fraction; +}; + +/// An axis aligned bounding box. +struct b2AABB +{ + /// Verify that the bounds are sorted. + bool IsValid() const; + + /// Get the center of the AABB. + b2Vec2 GetCenter() const + { + return 0.5f * (lowerBound + upperBound); + } + + /// Get the extents of the AABB (half-widths). + b2Vec2 GetExtents() const + { + return 0.5f * (upperBound - lowerBound); + } + + /// Get the perimeter length + float32 GetPerimeter() const + { + float32 wx = upperBound.x - lowerBound.x; + float32 wy = upperBound.y - lowerBound.y; + return 2.0f * (wx + wy); + } + + /// Combine an AABB into this one. + void Combine(const b2AABB& aabb) + { + lowerBound = b2Min(lowerBound, aabb.lowerBound); + upperBound = b2Max(upperBound, aabb.upperBound); + } + + /// Combine two AABBs into this one. + void Combine(const b2AABB& aabb1, const b2AABB& aabb2) + { + lowerBound = b2Min(aabb1.lowerBound, aabb2.lowerBound); + upperBound = b2Max(aabb1.upperBound, aabb2.upperBound); + } + + /// Does this aabb contain the provided AABB. + bool Contains(const b2AABB& aabb) const + { + bool result = true; + result = result && lowerBound.x <= aabb.lowerBound.x; + result = result && lowerBound.y <= aabb.lowerBound.y; + result = result && aabb.upperBound.x <= upperBound.x; + result = result && aabb.upperBound.y <= upperBound.y; + return result; + } + + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const; + + b2Vec2 lowerBound; ///< the lower vertex + b2Vec2 upperBound; ///< the upper vertex +}; + +/// Compute the collision manifold between two circles. +void b2CollideCircles(b2Manifold* manifold, + const b2CircleShape* circleA, const b2Transform& xfA, + const b2CircleShape* circleB, const b2Transform& xfB); + +/// Compute the collision manifold between a polygon and a circle. +void b2CollidePolygonAndCircle(b2Manifold* manifold, + const b2PolygonShape* polygonA, const b2Transform& xfA, + const b2CircleShape* circleB, const b2Transform& xfB); + +/// Compute the collision manifold between two polygons. +void b2CollidePolygons(b2Manifold* manifold, + const b2PolygonShape* polygonA, const b2Transform& xfA, + const b2PolygonShape* polygonB, const b2Transform& xfB); + +/// Compute the collision manifold between an edge and a circle. +void b2CollideEdgeAndCircle(b2Manifold* manifold, + const b2EdgeShape* polygonA, const b2Transform& xfA, + const b2CircleShape* circleB, const b2Transform& xfB); + +/// Compute the collision manifold between an edge and a circle. +void b2CollideEdgeAndPolygon(b2Manifold* manifold, + const b2EdgeShape* edgeA, const b2Transform& xfA, + const b2PolygonShape* circleB, const b2Transform& xfB); + +/// Clipping for contact manifolds. +int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], + const b2Vec2& normal, float32 offset, int32 vertexIndexA); + +/// Determine if two generic shapes overlap. +bool b2TestOverlap( const b2Shape* shapeA, int32 indexA, + const b2Shape* shapeB, int32 indexB, + const b2Transform& xfA, const b2Transform& xfB); + +// ---------------- Inline Functions ------------------------------------------ + +inline bool b2AABB::IsValid() const +{ + b2Vec2 d = upperBound - lowerBound; + bool valid = d.x >= 0.0f && d.y >= 0.0f; + valid = valid && lowerBound.IsValid() && upperBound.IsValid(); + return valid; +} + +inline bool b2TestOverlap(const b2AABB& a, const b2AABB& b) +{ + b2Vec2 d1, d2; + d1 = b.lowerBound - a.upperBound; + d2 = a.lowerBound - b.upperBound; + + if (d1.x > 0.0f || d1.y > 0.0f) + return false; + + if (d2.x > 0.0f || d2.y > 0.0f) + return false; + + return true; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/b2Distance.cpp b/jni/love/src/libraries/Box2D/Collision/b2Distance.cpp new file mode 100755 index 00000000..78daab3e --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2Distance.cpp @@ -0,0 +1,603 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include + +// GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. +int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; + +void b2DistanceProxy::Set(const b2Shape* shape, int32 index) +{ + switch (shape->GetType()) + { + case b2Shape::e_circle: + { + const b2CircleShape* circle = static_cast(shape); + m_vertices = &circle->m_p; + m_count = 1; + m_radius = circle->m_radius; + } + break; + + case b2Shape::e_polygon: + { + const b2PolygonShape* polygon = static_cast(shape); + m_vertices = polygon->m_vertices; + m_count = polygon->m_count; + m_radius = polygon->m_radius; + } + break; + + case b2Shape::e_chain: + { + const b2ChainShape* chain = static_cast(shape); + b2Assert(0 <= index && index < chain->m_count); + + m_buffer[0] = chain->m_vertices[index]; + if (index + 1 < chain->m_count) + { + m_buffer[1] = chain->m_vertices[index + 1]; + } + else + { + m_buffer[1] = chain->m_vertices[0]; + } + + m_vertices = m_buffer; + m_count = 2; + m_radius = chain->m_radius; + } + break; + + case b2Shape::e_edge: + { + const b2EdgeShape* edge = static_cast(shape); + m_vertices = &edge->m_vertex1; + m_count = 2; + m_radius = edge->m_radius; + } + break; + + default: + b2Assert(false); + } +} + + +struct b2SimplexVertex +{ + b2Vec2 wA; // support point in proxyA + b2Vec2 wB; // support point in proxyB + b2Vec2 w; // wB - wA + float32 a; // barycentric coordinate for closest point + int32 indexA; // wA index + int32 indexB; // wB index +}; + +struct b2Simplex +{ + void ReadCache( const b2SimplexCache* cache, + const b2DistanceProxy* proxyA, const b2Transform& transformA, + const b2DistanceProxy* proxyB, const b2Transform& transformB) + { + b2Assert(cache->count <= 3); + + // Copy data from cache. + m_count = cache->count; + b2SimplexVertex* vertices = &m_v1; + for (int32 i = 0; i < m_count; ++i) + { + b2SimplexVertex* v = vertices + i; + v->indexA = cache->indexA[i]; + v->indexB = cache->indexB[i]; + b2Vec2 wALocal = proxyA->GetVertex(v->indexA); + b2Vec2 wBLocal = proxyB->GetVertex(v->indexB); + v->wA = b2Mul(transformA, wALocal); + v->wB = b2Mul(transformB, wBLocal); + v->w = v->wB - v->wA; + v->a = 0.0f; + } + + // Compute the new simplex metric, if it is substantially different than + // old metric then flush the simplex. + if (m_count > 1) + { + float32 metric1 = cache->metric; + float32 metric2 = GetMetric(); + if (metric2 < 0.5f * metric1 || 2.0f * metric1 < metric2 || metric2 < b2_epsilon) + { + // Reset the simplex. + m_count = 0; + } + } + + // If the cache is empty or invalid ... + if (m_count == 0) + { + b2SimplexVertex* v = vertices + 0; + v->indexA = 0; + v->indexB = 0; + b2Vec2 wALocal = proxyA->GetVertex(0); + b2Vec2 wBLocal = proxyB->GetVertex(0); + v->wA = b2Mul(transformA, wALocal); + v->wB = b2Mul(transformB, wBLocal); + v->w = v->wB - v->wA; + v->a = 1.0f; + m_count = 1; + } + } + + void WriteCache(b2SimplexCache* cache) const + { + cache->metric = GetMetric(); + cache->count = uint16(m_count); + const b2SimplexVertex* vertices = &m_v1; + for (int32 i = 0; i < m_count; ++i) + { + cache->indexA[i] = uint8(vertices[i].indexA); + cache->indexB[i] = uint8(vertices[i].indexB); + } + } + + b2Vec2 GetSearchDirection() const + { + switch (m_count) + { + case 1: + return -m_v1.w; + + case 2: + { + b2Vec2 e12 = m_v2.w - m_v1.w; + float32 sgn = b2Cross(e12, -m_v1.w); + if (sgn > 0.0f) + { + // Origin is left of e12. + return b2Cross(1.0f, e12); + } + else + { + // Origin is right of e12. + return b2Cross(e12, 1.0f); + } + } + + default: + b2Assert(false); + return b2Vec2_zero; + } + } + + b2Vec2 GetClosestPoint() const + { + switch (m_count) + { + case 0: + b2Assert(false); + return b2Vec2_zero; + + case 1: + return m_v1.w; + + case 2: + return m_v1.a * m_v1.w + m_v2.a * m_v2.w; + + case 3: + return b2Vec2_zero; + + default: + b2Assert(false); + return b2Vec2_zero; + } + } + + void GetWitnessPoints(b2Vec2* pA, b2Vec2* pB) const + { + switch (m_count) + { + case 0: + b2Assert(false); + break; + + case 1: + *pA = m_v1.wA; + *pB = m_v1.wB; + break; + + case 2: + *pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA; + *pB = m_v1.a * m_v1.wB + m_v2.a * m_v2.wB; + break; + + case 3: + *pA = m_v1.a * m_v1.wA + m_v2.a * m_v2.wA + m_v3.a * m_v3.wA; + *pB = *pA; + break; + + default: + b2Assert(false); + break; + } + } + + float32 GetMetric() const + { + switch (m_count) + { + case 0: + b2Assert(false); + return 0.0f; + + case 1: + return 0.0f; + + case 2: + return b2Distance(m_v1.w, m_v2.w); + + case 3: + return b2Cross(m_v2.w - m_v1.w, m_v3.w - m_v1.w); + + default: + b2Assert(false); + return 0.0f; + } + } + + void Solve2(); + void Solve3(); + + b2SimplexVertex m_v1, m_v2, m_v3; + int32 m_count; +}; + + +// Solve a line segment using barycentric coordinates. +// +// p = a1 * w1 + a2 * w2 +// a1 + a2 = 1 +// +// The vector from the origin to the closest point on the line is +// perpendicular to the line. +// e12 = w2 - w1 +// dot(p, e) = 0 +// a1 * dot(w1, e) + a2 * dot(w2, e) = 0 +// +// 2-by-2 linear system +// [1 1 ][a1] = [1] +// [w1.e12 w2.e12][a2] = [0] +// +// Define +// d12_1 = dot(w2, e12) +// d12_2 = -dot(w1, e12) +// d12 = d12_1 + d12_2 +// +// Solution +// a1 = d12_1 / d12 +// a2 = d12_2 / d12 +void b2Simplex::Solve2() +{ + b2Vec2 w1 = m_v1.w; + b2Vec2 w2 = m_v2.w; + b2Vec2 e12 = w2 - w1; + + // w1 region + float32 d12_2 = -b2Dot(w1, e12); + if (d12_2 <= 0.0f) + { + // a2 <= 0, so we clamp it to 0 + m_v1.a = 1.0f; + m_count = 1; + return; + } + + // w2 region + float32 d12_1 = b2Dot(w2, e12); + if (d12_1 <= 0.0f) + { + // a1 <= 0, so we clamp it to 0 + m_v2.a = 1.0f; + m_count = 1; + m_v1 = m_v2; + return; + } + + // Must be in e12 region. + float32 inv_d12 = 1.0f / (d12_1 + d12_2); + m_v1.a = d12_1 * inv_d12; + m_v2.a = d12_2 * inv_d12; + m_count = 2; +} + +// Possible regions: +// - points[2] +// - edge points[0]-points[2] +// - edge points[1]-points[2] +// - inside the triangle +void b2Simplex::Solve3() +{ + b2Vec2 w1 = m_v1.w; + b2Vec2 w2 = m_v2.w; + b2Vec2 w3 = m_v3.w; + + // Edge12 + // [1 1 ][a1] = [1] + // [w1.e12 w2.e12][a2] = [0] + // a3 = 0 + b2Vec2 e12 = w2 - w1; + float32 w1e12 = b2Dot(w1, e12); + float32 w2e12 = b2Dot(w2, e12); + float32 d12_1 = w2e12; + float32 d12_2 = -w1e12; + + // Edge13 + // [1 1 ][a1] = [1] + // [w1.e13 w3.e13][a3] = [0] + // a2 = 0 + b2Vec2 e13 = w3 - w1; + float32 w1e13 = b2Dot(w1, e13); + float32 w3e13 = b2Dot(w3, e13); + float32 d13_1 = w3e13; + float32 d13_2 = -w1e13; + + // Edge23 + // [1 1 ][a2] = [1] + // [w2.e23 w3.e23][a3] = [0] + // a1 = 0 + b2Vec2 e23 = w3 - w2; + float32 w2e23 = b2Dot(w2, e23); + float32 w3e23 = b2Dot(w3, e23); + float32 d23_1 = w3e23; + float32 d23_2 = -w2e23; + + // Triangle123 + float32 n123 = b2Cross(e12, e13); + + float32 d123_1 = n123 * b2Cross(w2, w3); + float32 d123_2 = n123 * b2Cross(w3, w1); + float32 d123_3 = n123 * b2Cross(w1, w2); + + // w1 region + if (d12_2 <= 0.0f && d13_2 <= 0.0f) + { + m_v1.a = 1.0f; + m_count = 1; + return; + } + + // e12 + if (d12_1 > 0.0f && d12_2 > 0.0f && d123_3 <= 0.0f) + { + float32 inv_d12 = 1.0f / (d12_1 + d12_2); + m_v1.a = d12_1 * inv_d12; + m_v2.a = d12_2 * inv_d12; + m_count = 2; + return; + } + + // e13 + if (d13_1 > 0.0f && d13_2 > 0.0f && d123_2 <= 0.0f) + { + float32 inv_d13 = 1.0f / (d13_1 + d13_2); + m_v1.a = d13_1 * inv_d13; + m_v3.a = d13_2 * inv_d13; + m_count = 2; + m_v2 = m_v3; + return; + } + + // w2 region + if (d12_1 <= 0.0f && d23_2 <= 0.0f) + { + m_v2.a = 1.0f; + m_count = 1; + m_v1 = m_v2; + return; + } + + // w3 region + if (d13_1 <= 0.0f && d23_1 <= 0.0f) + { + m_v3.a = 1.0f; + m_count = 1; + m_v1 = m_v3; + return; + } + + // e23 + if (d23_1 > 0.0f && d23_2 > 0.0f && d123_1 <= 0.0f) + { + float32 inv_d23 = 1.0f / (d23_1 + d23_2); + m_v2.a = d23_1 * inv_d23; + m_v3.a = d23_2 * inv_d23; + m_count = 2; + m_v1 = m_v3; + return; + } + + // Must be in triangle123 + float32 inv_d123 = 1.0f / (d123_1 + d123_2 + d123_3); + m_v1.a = d123_1 * inv_d123; + m_v2.a = d123_2 * inv_d123; + m_v3.a = d123_3 * inv_d123; + m_count = 3; +} + +void b2Distance(b2DistanceOutput* output, + b2SimplexCache* cache, + const b2DistanceInput* input) +{ + ++b2_gjkCalls; + + const b2DistanceProxy* proxyA = &input->proxyA; + const b2DistanceProxy* proxyB = &input->proxyB; + + b2Transform transformA = input->transformA; + b2Transform transformB = input->transformB; + + // Initialize the simplex. + b2Simplex simplex; + simplex.ReadCache(cache, proxyA, transformA, proxyB, transformB); + + // Get simplex vertices as an array. + b2SimplexVertex* vertices = &simplex.m_v1; + const int32 k_maxIters = 20; + + // These store the vertices of the last simplex so that we + // can check for duplicates and prevent cycling. + int32 saveA[3], saveB[3]; + int32 saveCount = 0; + + float32 distanceSqr1 = b2_maxFloat; + float32 distanceSqr2 = distanceSqr1; + + // Main iteration loop. + int32 iter = 0; + while (iter < k_maxIters) + { + // Copy simplex so we can identify duplicates. + saveCount = simplex.m_count; + for (int32 i = 0; i < saveCount; ++i) + { + saveA[i] = vertices[i].indexA; + saveB[i] = vertices[i].indexB; + } + + switch (simplex.m_count) + { + case 1: + break; + + case 2: + simplex.Solve2(); + break; + + case 3: + simplex.Solve3(); + break; + + default: + b2Assert(false); + } + + // If we have 3 points, then the origin is in the corresponding triangle. + if (simplex.m_count == 3) + { + break; + } + + // Compute closest point. + b2Vec2 p = simplex.GetClosestPoint(); + distanceSqr2 = p.LengthSquared(); + + // Ensure progress + if (distanceSqr2 >= distanceSqr1) + { + //break; + } + distanceSqr1 = distanceSqr2; + + // Get search direction. + b2Vec2 d = simplex.GetSearchDirection(); + + // Ensure the search direction is numerically fit. + if (d.LengthSquared() < b2_epsilon * b2_epsilon) + { + // The origin is probably contained by a line segment + // or triangle. Thus the shapes are overlapped. + + // We can't return zero here even though there may be overlap. + // In case the simplex is a point, segment, or triangle it is difficult + // to determine if the origin is contained in the CSO or very close to it. + break; + } + + // Compute a tentative new simplex vertex using support points. + b2SimplexVertex* vertex = vertices + simplex.m_count; + vertex->indexA = proxyA->GetSupport(b2MulT(transformA.q, -d)); + vertex->wA = b2Mul(transformA, proxyA->GetVertex(vertex->indexA)); + b2Vec2 wBLocal; + vertex->indexB = proxyB->GetSupport(b2MulT(transformB.q, d)); + vertex->wB = b2Mul(transformB, proxyB->GetVertex(vertex->indexB)); + vertex->w = vertex->wB - vertex->wA; + + // Iteration count is equated to the number of support point calls. + ++iter; + ++b2_gjkIters; + + // Check for duplicate support points. This is the main termination criteria. + bool duplicate = false; + for (int32 i = 0; i < saveCount; ++i) + { + if (vertex->indexA == saveA[i] && vertex->indexB == saveB[i]) + { + duplicate = true; + break; + } + } + + // If we found a duplicate support point we must exit to avoid cycling. + if (duplicate) + { + break; + } + + // New vertex is ok and needed. + ++simplex.m_count; + } + + b2_gjkMaxIters = b2Max(b2_gjkMaxIters, iter); + + // Prepare output. + simplex.GetWitnessPoints(&output->pointA, &output->pointB); + output->distance = b2Distance(output->pointA, output->pointB); + output->iterations = iter; + + // Cache the simplex. + simplex.WriteCache(cache); + + // Apply radii if requested. + if (input->useRadii) + { + float32 rA = proxyA->m_radius; + float32 rB = proxyB->m_radius; + + if (output->distance > rA + rB && output->distance > b2_epsilon) + { + // Shapes are still no overlapped. + // Move the witness points to the outer surface. + output->distance -= rA + rB; + b2Vec2 normal = output->pointB - output->pointA; + normal.Normalize(); + output->pointA += rA * normal; + output->pointB -= rB * normal; + } + else + { + // Shapes are overlapped when radii are considered. + // Move the witness points to the middle. + b2Vec2 p = 0.5f * (output->pointA + output->pointB); + output->pointA = p; + output->pointB = p; + output->distance = 0.0f; + } + } +} diff --git a/jni/love/src/libraries/Box2D/Collision/b2Distance.h b/jni/love/src/libraries/Box2D/Collision/b2Distance.h new file mode 100755 index 00000000..7bae689d --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2Distance.h @@ -0,0 +1,141 @@ + +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_DISTANCE_H +#define B2_DISTANCE_H + +#include + +class b2Shape; + +/// A distance proxy is used by the GJK algorithm. +/// It encapsulates any shape. +struct b2DistanceProxy +{ + b2DistanceProxy() : m_vertices(NULL), m_count(0), m_radius(0.0f) {} + + /// Initialize the proxy using the given shape. The shape + /// must remain in scope while the proxy is in use. + void Set(const b2Shape* shape, int32 index); + + /// Get the supporting vertex index in the given direction. + int32 GetSupport(const b2Vec2& d) const; + + /// Get the supporting vertex in the given direction. + const b2Vec2& GetSupportVertex(const b2Vec2& d) const; + + /// Get the vertex count. + int32 GetVertexCount() const; + + /// Get a vertex by index. Used by b2Distance. + const b2Vec2& GetVertex(int32 index) const; + + b2Vec2 m_buffer[2]; + const b2Vec2* m_vertices; + int32 m_count; + float32 m_radius; +}; + +/// Used to warm start b2Distance. +/// Set count to zero on first call. +struct b2SimplexCache +{ + float32 metric; ///< length or area + uint16 count; + uint8 indexA[3]; ///< vertices on shape A + uint8 indexB[3]; ///< vertices on shape B +}; + +/// Input for b2Distance. +/// You have to option to use the shape radii +/// in the computation. Even +struct b2DistanceInput +{ + b2DistanceProxy proxyA; + b2DistanceProxy proxyB; + b2Transform transformA; + b2Transform transformB; + bool useRadii; +}; + +/// Output for b2Distance. +struct b2DistanceOutput +{ + b2Vec2 pointA; ///< closest point on shapeA + b2Vec2 pointB; ///< closest point on shapeB + float32 distance; + int32 iterations; ///< number of GJK iterations used +}; + +/// Compute the closest points between two shapes. Supports any combination of: +/// b2CircleShape, b2PolygonShape, b2EdgeShape. The simplex cache is input/output. +/// On the first call set b2SimplexCache.count to zero. +void b2Distance(b2DistanceOutput* output, + b2SimplexCache* cache, + const b2DistanceInput* input); + + +////////////////////////////////////////////////////////////////////////// + +inline int32 b2DistanceProxy::GetVertexCount() const +{ + return m_count; +} + +inline const b2Vec2& b2DistanceProxy::GetVertex(int32 index) const +{ + b2Assert(0 <= index && index < m_count); + return m_vertices[index]; +} + +inline int32 b2DistanceProxy::GetSupport(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_count; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return bestIndex; +} + +inline const b2Vec2& b2DistanceProxy::GetSupportVertex(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_count; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return m_vertices[bestIndex]; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/b2DynamicTree.cpp b/jni/love/src/libraries/Box2D/Collision/b2DynamicTree.cpp new file mode 100755 index 00000000..7035ab8b --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2DynamicTree.cpp @@ -0,0 +1,778 @@ +/* +* Copyright (c) 2009 Erin Catto http://www.box2d.org +* +* 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 +#include + +b2DynamicTree::b2DynamicTree() +{ + m_root = b2_nullNode; + + m_nodeCapacity = 16; + m_nodeCount = 0; + m_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode)); + memset(m_nodes, 0, m_nodeCapacity * sizeof(b2TreeNode)); + + // Build a linked list for the free list. + for (int32 i = 0; i < m_nodeCapacity - 1; ++i) + { + m_nodes[i].next = i + 1; + m_nodes[i].height = -1; + } + m_nodes[m_nodeCapacity-1].next = b2_nullNode; + m_nodes[m_nodeCapacity-1].height = -1; + m_freeList = 0; + + m_path = 0; + + m_insertionCount = 0; +} + +b2DynamicTree::~b2DynamicTree() +{ + // This frees the entire tree in one shot. + b2Free(m_nodes); +} + +// Allocate a node from the pool. Grow the pool if necessary. +int32 b2DynamicTree::AllocateNode() +{ + // Expand the node pool as needed. + if (m_freeList == b2_nullNode) + { + b2Assert(m_nodeCount == m_nodeCapacity); + + // The free list is empty. Rebuild a bigger pool. + b2TreeNode* oldNodes = m_nodes; + m_nodeCapacity *= 2; + m_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode)); + memcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2TreeNode)); + b2Free(oldNodes); + + // Build a linked list for the free list. The parent + // pointer becomes the "next" pointer. + for (int32 i = m_nodeCount; i < m_nodeCapacity - 1; ++i) + { + m_nodes[i].next = i + 1; + m_nodes[i].height = -1; + } + m_nodes[m_nodeCapacity-1].next = b2_nullNode; + m_nodes[m_nodeCapacity-1].height = -1; + m_freeList = m_nodeCount; + } + + // Peel a node off the free list. + int32 nodeId = m_freeList; + m_freeList = m_nodes[nodeId].next; + m_nodes[nodeId].parent = b2_nullNode; + m_nodes[nodeId].child1 = b2_nullNode; + m_nodes[nodeId].child2 = b2_nullNode; + m_nodes[nodeId].height = 0; + m_nodes[nodeId].userData = NULL; + ++m_nodeCount; + return nodeId; +} + +// Return a node to the pool. +void b2DynamicTree::FreeNode(int32 nodeId) +{ + b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); + b2Assert(0 < m_nodeCount); + m_nodes[nodeId].next = m_freeList; + m_nodes[nodeId].height = -1; + m_freeList = nodeId; + --m_nodeCount; +} + +// Create a proxy in the tree as a leaf node. We return the index +// of the node instead of a pointer so that we can grow +// the node pool. +int32 b2DynamicTree::CreateProxy(const b2AABB& aabb, void* userData) +{ + int32 proxyId = AllocateNode(); + + // Fatten the aabb. + b2Vec2 r(b2_aabbExtension, b2_aabbExtension); + m_nodes[proxyId].aabb.lowerBound = aabb.lowerBound - r; + m_nodes[proxyId].aabb.upperBound = aabb.upperBound + r; + m_nodes[proxyId].userData = userData; + m_nodes[proxyId].height = 0; + + InsertLeaf(proxyId); + + return proxyId; +} + +void b2DynamicTree::DestroyProxy(int32 proxyId) +{ + b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); + b2Assert(m_nodes[proxyId].IsLeaf()); + + RemoveLeaf(proxyId); + FreeNode(proxyId); +} + +bool b2DynamicTree::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement) +{ + b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); + + b2Assert(m_nodes[proxyId].IsLeaf()); + + if (m_nodes[proxyId].aabb.Contains(aabb)) + { + return false; + } + + RemoveLeaf(proxyId); + + // Extend AABB. + b2AABB b = aabb; + b2Vec2 r(b2_aabbExtension, b2_aabbExtension); + b.lowerBound = b.lowerBound - r; + b.upperBound = b.upperBound + r; + + // Predict AABB displacement. + b2Vec2 d = b2_aabbMultiplier * displacement; + + if (d.x < 0.0f) + { + b.lowerBound.x += d.x; + } + else + { + b.upperBound.x += d.x; + } + + if (d.y < 0.0f) + { + b.lowerBound.y += d.y; + } + else + { + b.upperBound.y += d.y; + } + + m_nodes[proxyId].aabb = b; + + InsertLeaf(proxyId); + return true; +} + +void b2DynamicTree::InsertLeaf(int32 leaf) +{ + ++m_insertionCount; + + if (m_root == b2_nullNode) + { + m_root = leaf; + m_nodes[m_root].parent = b2_nullNode; + return; + } + + // Find the best sibling for this node + b2AABB leafAABB = m_nodes[leaf].aabb; + int32 index = m_root; + while (m_nodes[index].IsLeaf() == false) + { + int32 child1 = m_nodes[index].child1; + int32 child2 = m_nodes[index].child2; + + float32 area = m_nodes[index].aabb.GetPerimeter(); + + b2AABB combinedAABB; + combinedAABB.Combine(m_nodes[index].aabb, leafAABB); + float32 combinedArea = combinedAABB.GetPerimeter(); + + // Cost of creating a new parent for this node and the new leaf + float32 cost = 2.0f * combinedArea; + + // Minimum cost of pushing the leaf further down the tree + float32 inheritanceCost = 2.0f * (combinedArea - area); + + // Cost of descending into child1 + float32 cost1; + if (m_nodes[child1].IsLeaf()) + { + b2AABB aabb; + aabb.Combine(leafAABB, m_nodes[child1].aabb); + cost1 = aabb.GetPerimeter() + inheritanceCost; + } + else + { + b2AABB aabb; + aabb.Combine(leafAABB, m_nodes[child1].aabb); + float32 oldArea = m_nodes[child1].aabb.GetPerimeter(); + float32 newArea = aabb.GetPerimeter(); + cost1 = (newArea - oldArea) + inheritanceCost; + } + + // Cost of descending into child2 + float32 cost2; + if (m_nodes[child2].IsLeaf()) + { + b2AABB aabb; + aabb.Combine(leafAABB, m_nodes[child2].aabb); + cost2 = aabb.GetPerimeter() + inheritanceCost; + } + else + { + b2AABB aabb; + aabb.Combine(leafAABB, m_nodes[child2].aabb); + float32 oldArea = m_nodes[child2].aabb.GetPerimeter(); + float32 newArea = aabb.GetPerimeter(); + cost2 = newArea - oldArea + inheritanceCost; + } + + // Descend according to the minimum cost. + if (cost < cost1 && cost < cost2) + { + break; + } + + // Descend + if (cost1 < cost2) + { + index = child1; + } + else + { + index = child2; + } + } + + int32 sibling = index; + + // Create a new parent. + int32 oldParent = m_nodes[sibling].parent; + int32 newParent = AllocateNode(); + m_nodes[newParent].parent = oldParent; + m_nodes[newParent].userData = NULL; + m_nodes[newParent].aabb.Combine(leafAABB, m_nodes[sibling].aabb); + m_nodes[newParent].height = m_nodes[sibling].height + 1; + + if (oldParent != b2_nullNode) + { + // The sibling was not the root. + if (m_nodes[oldParent].child1 == sibling) + { + m_nodes[oldParent].child1 = newParent; + } + else + { + m_nodes[oldParent].child2 = newParent; + } + + m_nodes[newParent].child1 = sibling; + m_nodes[newParent].child2 = leaf; + m_nodes[sibling].parent = newParent; + m_nodes[leaf].parent = newParent; + } + else + { + // The sibling was the root. + m_nodes[newParent].child1 = sibling; + m_nodes[newParent].child2 = leaf; + m_nodes[sibling].parent = newParent; + m_nodes[leaf].parent = newParent; + m_root = newParent; + } + + // Walk back up the tree fixing heights and AABBs + index = m_nodes[leaf].parent; + while (index != b2_nullNode) + { + index = Balance(index); + + int32 child1 = m_nodes[index].child1; + int32 child2 = m_nodes[index].child2; + + b2Assert(child1 != b2_nullNode); + b2Assert(child2 != b2_nullNode); + + m_nodes[index].height = 1 + b2Max(m_nodes[child1].height, m_nodes[child2].height); + m_nodes[index].aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb); + + index = m_nodes[index].parent; + } + + //Validate(); +} + +void b2DynamicTree::RemoveLeaf(int32 leaf) +{ + if (leaf == m_root) + { + m_root = b2_nullNode; + return; + } + + int32 parent = m_nodes[leaf].parent; + int32 grandParent = m_nodes[parent].parent; + int32 sibling; + if (m_nodes[parent].child1 == leaf) + { + sibling = m_nodes[parent].child2; + } + else + { + sibling = m_nodes[parent].child1; + } + + if (grandParent != b2_nullNode) + { + // Destroy parent and connect sibling to grandParent. + if (m_nodes[grandParent].child1 == parent) + { + m_nodes[grandParent].child1 = sibling; + } + else + { + m_nodes[grandParent].child2 = sibling; + } + m_nodes[sibling].parent = grandParent; + FreeNode(parent); + + // Adjust ancestor bounds. + int32 index = grandParent; + while (index != b2_nullNode) + { + index = Balance(index); + + int32 child1 = m_nodes[index].child1; + int32 child2 = m_nodes[index].child2; + + m_nodes[index].aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb); + m_nodes[index].height = 1 + b2Max(m_nodes[child1].height, m_nodes[child2].height); + + index = m_nodes[index].parent; + } + } + else + { + m_root = sibling; + m_nodes[sibling].parent = b2_nullNode; + FreeNode(parent); + } + + //Validate(); +} + +// Perform a left or right rotation if node A is imbalanced. +// Returns the new root index. +int32 b2DynamicTree::Balance(int32 iA) +{ + b2Assert(iA != b2_nullNode); + + b2TreeNode* A = m_nodes + iA; + if (A->IsLeaf() || A->height < 2) + { + return iA; + } + + int32 iB = A->child1; + int32 iC = A->child2; + b2Assert(0 <= iB && iB < m_nodeCapacity); + b2Assert(0 <= iC && iC < m_nodeCapacity); + + b2TreeNode* B = m_nodes + iB; + b2TreeNode* C = m_nodes + iC; + + int32 balance = C->height - B->height; + + // Rotate C up + if (balance > 1) + { + int32 iF = C->child1; + int32 iG = C->child2; + b2TreeNode* F = m_nodes + iF; + b2TreeNode* G = m_nodes + iG; + b2Assert(0 <= iF && iF < m_nodeCapacity); + b2Assert(0 <= iG && iG < m_nodeCapacity); + + // Swap A and C + C->child1 = iA; + C->parent = A->parent; + A->parent = iC; + + // A's old parent should point to C + if (C->parent != b2_nullNode) + { + if (m_nodes[C->parent].child1 == iA) + { + m_nodes[C->parent].child1 = iC; + } + else + { + b2Assert(m_nodes[C->parent].child2 == iA); + m_nodes[C->parent].child2 = iC; + } + } + else + { + m_root = iC; + } + + // Rotate + if (F->height > G->height) + { + C->child2 = iF; + A->child2 = iG; + G->parent = iA; + A->aabb.Combine(B->aabb, G->aabb); + C->aabb.Combine(A->aabb, F->aabb); + + A->height = 1 + b2Max(B->height, G->height); + C->height = 1 + b2Max(A->height, F->height); + } + else + { + C->child2 = iG; + A->child2 = iF; + F->parent = iA; + A->aabb.Combine(B->aabb, F->aabb); + C->aabb.Combine(A->aabb, G->aabb); + + A->height = 1 + b2Max(B->height, F->height); + C->height = 1 + b2Max(A->height, G->height); + } + + return iC; + } + + // Rotate B up + if (balance < -1) + { + int32 iD = B->child1; + int32 iE = B->child2; + b2TreeNode* D = m_nodes + iD; + b2TreeNode* E = m_nodes + iE; + b2Assert(0 <= iD && iD < m_nodeCapacity); + b2Assert(0 <= iE && iE < m_nodeCapacity); + + // Swap A and B + B->child1 = iA; + B->parent = A->parent; + A->parent = iB; + + // A's old parent should point to B + if (B->parent != b2_nullNode) + { + if (m_nodes[B->parent].child1 == iA) + { + m_nodes[B->parent].child1 = iB; + } + else + { + b2Assert(m_nodes[B->parent].child2 == iA); + m_nodes[B->parent].child2 = iB; + } + } + else + { + m_root = iB; + } + + // Rotate + if (D->height > E->height) + { + B->child2 = iD; + A->child1 = iE; + E->parent = iA; + A->aabb.Combine(C->aabb, E->aabb); + B->aabb.Combine(A->aabb, D->aabb); + + A->height = 1 + b2Max(C->height, E->height); + B->height = 1 + b2Max(A->height, D->height); + } + else + { + B->child2 = iE; + A->child1 = iD; + D->parent = iA; + A->aabb.Combine(C->aabb, D->aabb); + B->aabb.Combine(A->aabb, E->aabb); + + A->height = 1 + b2Max(C->height, D->height); + B->height = 1 + b2Max(A->height, E->height); + } + + return iB; + } + + return iA; +} + +int32 b2DynamicTree::GetHeight() const +{ + if (m_root == b2_nullNode) + { + return 0; + } + + return m_nodes[m_root].height; +} + +// +float32 b2DynamicTree::GetAreaRatio() const +{ + if (m_root == b2_nullNode) + { + return 0.0f; + } + + const b2TreeNode* root = m_nodes + m_root; + float32 rootArea = root->aabb.GetPerimeter(); + + float32 totalArea = 0.0f; + for (int32 i = 0; i < m_nodeCapacity; ++i) + { + const b2TreeNode* node = m_nodes + i; + if (node->height < 0) + { + // Free node in pool + continue; + } + + totalArea += node->aabb.GetPerimeter(); + } + + return totalArea / rootArea; +} + +// Compute the height of a sub-tree. +int32 b2DynamicTree::ComputeHeight(int32 nodeId) const +{ + b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); + b2TreeNode* node = m_nodes + nodeId; + + if (node->IsLeaf()) + { + return 0; + } + + int32 height1 = ComputeHeight(node->child1); + int32 height2 = ComputeHeight(node->child2); + return 1 + b2Max(height1, height2); +} + +int32 b2DynamicTree::ComputeHeight() const +{ + int32 height = ComputeHeight(m_root); + return height; +} + +void b2DynamicTree::ValidateStructure(int32 index) const +{ + if (index == b2_nullNode) + { + return; + } + + if (index == m_root) + { + b2Assert(m_nodes[index].parent == b2_nullNode); + } + + const b2TreeNode* node = m_nodes + index; + + int32 child1 = node->child1; + int32 child2 = node->child2; + + if (node->IsLeaf()) + { + b2Assert(child1 == b2_nullNode); + b2Assert(child2 == b2_nullNode); + b2Assert(node->height == 0); + return; + } + + b2Assert(0 <= child1 && child1 < m_nodeCapacity); + b2Assert(0 <= child2 && child2 < m_nodeCapacity); + + b2Assert(m_nodes[child1].parent == index); + b2Assert(m_nodes[child2].parent == index); + + ValidateStructure(child1); + ValidateStructure(child2); +} + +void b2DynamicTree::ValidateMetrics(int32 index) const +{ + if (index == b2_nullNode) + { + return; + } + + const b2TreeNode* node = m_nodes + index; + + int32 child1 = node->child1; + int32 child2 = node->child2; + + if (node->IsLeaf()) + { + b2Assert(child1 == b2_nullNode); + b2Assert(child2 == b2_nullNode); + b2Assert(node->height == 0); + return; + } + + b2Assert(0 <= child1 && child1 < m_nodeCapacity); + b2Assert(0 <= child2 && child2 < m_nodeCapacity); + + int32 height1 = m_nodes[child1].height; + int32 height2 = m_nodes[child2].height; + int32 height; + height = 1 + b2Max(height1, height2); + b2Assert(node->height == height); + + b2AABB aabb; + aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb); + + b2Assert(aabb.lowerBound == node->aabb.lowerBound); + b2Assert(aabb.upperBound == node->aabb.upperBound); + + ValidateMetrics(child1); + ValidateMetrics(child2); +} + +void b2DynamicTree::Validate() const +{ + ValidateStructure(m_root); + ValidateMetrics(m_root); + + int32 freeCount = 0; + int32 freeIndex = m_freeList; + while (freeIndex != b2_nullNode) + { + b2Assert(0 <= freeIndex && freeIndex < m_nodeCapacity); + freeIndex = m_nodes[freeIndex].next; + ++freeCount; + } + + b2Assert(GetHeight() == ComputeHeight()); + + b2Assert(m_nodeCount + freeCount == m_nodeCapacity); +} + +int32 b2DynamicTree::GetMaxBalance() const +{ + int32 maxBalance = 0; + for (int32 i = 0; i < m_nodeCapacity; ++i) + { + const b2TreeNode* node = m_nodes + i; + if (node->height <= 1) + { + continue; + } + + b2Assert(node->IsLeaf() == false); + + int32 child1 = node->child1; + int32 child2 = node->child2; + int32 balance = b2Abs(m_nodes[child2].height - m_nodes[child1].height); + maxBalance = b2Max(maxBalance, balance); + } + + return maxBalance; +} + +void b2DynamicTree::RebuildBottomUp() +{ + int32* nodes = (int32*)b2Alloc(m_nodeCount * sizeof(int32)); + int32 count = 0; + + // Build array of leaves. Free the rest. + for (int32 i = 0; i < m_nodeCapacity; ++i) + { + if (m_nodes[i].height < 0) + { + // free node in pool + continue; + } + + if (m_nodes[i].IsLeaf()) + { + m_nodes[i].parent = b2_nullNode; + nodes[count] = i; + ++count; + } + else + { + FreeNode(i); + } + } + + while (count > 1) + { + float32 minCost = b2_maxFloat; + int32 iMin = -1, jMin = -1; + for (int32 i = 0; i < count; ++i) + { + b2AABB aabbi = m_nodes[nodes[i]].aabb; + + for (int32 j = i + 1; j < count; ++j) + { + b2AABB aabbj = m_nodes[nodes[j]].aabb; + b2AABB b; + b.Combine(aabbi, aabbj); + float32 cost = b.GetPerimeter(); + if (cost < minCost) + { + iMin = i; + jMin = j; + minCost = cost; + } + } + } + + int32 index1 = nodes[iMin]; + int32 index2 = nodes[jMin]; + b2TreeNode* child1 = m_nodes + index1; + b2TreeNode* child2 = m_nodes + index2; + + int32 parentIndex = AllocateNode(); + b2TreeNode* parent = m_nodes + parentIndex; + parent->child1 = index1; + parent->child2 = index2; + parent->height = 1 + b2Max(child1->height, child2->height); + parent->aabb.Combine(child1->aabb, child2->aabb); + parent->parent = b2_nullNode; + + child1->parent = parentIndex; + child2->parent = parentIndex; + + nodes[jMin] = nodes[count-1]; + nodes[iMin] = parentIndex; + --count; + } + + m_root = nodes[0]; + b2Free(nodes); + + Validate(); +} + +void b2DynamicTree::ShiftOrigin(const b2Vec2& newOrigin) +{ + // Build array of leaves. Free the rest. + for (int32 i = 0; i < m_nodeCapacity; ++i) + { + m_nodes[i].aabb.lowerBound -= newOrigin; + m_nodes[i].aabb.upperBound -= newOrigin; + } +} diff --git a/jni/love/src/libraries/Box2D/Collision/b2DynamicTree.h b/jni/love/src/libraries/Box2D/Collision/b2DynamicTree.h new file mode 100755 index 00000000..bf80f73a --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2DynamicTree.h @@ -0,0 +1,289 @@ +/* +* Copyright (c) 2009 Erin Catto http://www.box2d.org +* +* 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 B2_DYNAMIC_TREE_H +#define B2_DYNAMIC_TREE_H + +#include +#include + +#define b2_nullNode (-1) + +/// A node in the dynamic tree. The client does not interact with this directly. +struct b2TreeNode +{ + bool IsLeaf() const + { + return child1 == b2_nullNode; + } + + /// Enlarged AABB + b2AABB aabb; + + void* userData; + + union + { + int32 parent; + int32 next; + }; + + int32 child1; + int32 child2; + + // leaf = 0, free node = -1 + int32 height; +}; + +/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. +/// A dynamic tree arranges data in a binary tree to accelerate +/// queries such as volume queries and ray casts. Leafs are proxies +/// with an AABB. In the tree we expand the proxy AABB by b2_fatAABBFactor +/// so that the proxy AABB is bigger than the client object. This allows the client +/// object to move by small amounts without triggering a tree update. +/// +/// Nodes are pooled and relocatable, so we use node indices rather than pointers. +class b2DynamicTree +{ +public: + /// Constructing the tree initializes the node pool. + b2DynamicTree(); + + /// Destroy the tree, freeing the node pool. + ~b2DynamicTree(); + + /// Create a proxy. Provide a tight fitting AABB and a userData pointer. + int32 CreateProxy(const b2AABB& aabb, void* userData); + + /// Destroy a proxy. This asserts if the id is invalid. + void DestroyProxy(int32 proxyId); + + /// Move a proxy with a swepted AABB. If the proxy has moved outside of its fattened AABB, + /// then the proxy is removed from the tree and re-inserted. Otherwise + /// the function returns immediately. + /// @return true if the proxy was re-inserted. + bool MoveProxy(int32 proxyId, const b2AABB& aabb1, const b2Vec2& displacement); + + /// Get proxy user data. + /// @return the proxy user data or 0 if the id is invalid. + void* GetUserData(int32 proxyId) const; + + /// Get the fat AABB for a proxy. + const b2AABB& GetFatAABB(int32 proxyId) const; + + /// Query an AABB for overlapping proxies. The callback class + /// is called for each proxy that overlaps the supplied AABB. + template + void Query(T* callback, const b2AABB& aabb) const; + + /// Ray-cast against the proxies in the tree. This relies on the callback + /// to perform a exact ray-cast in the case were the proxy contains a shape. + /// The callback also performs the any collision filtering. This has performance + /// roughly equal to k * log(n), where k is the number of collisions and n is the + /// number of proxies in the tree. + /// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). + /// @param callback a callback class that is called for each proxy that is hit by the ray. + template + void RayCast(T* callback, const b2RayCastInput& input) const; + + /// Validate this tree. For testing. + void Validate() const; + + /// Compute the height of the binary tree in O(N) time. Should not be + /// called often. + int32 GetHeight() const; + + /// Get the maximum balance of an node in the tree. The balance is the difference + /// in height of the two children of a node. + int32 GetMaxBalance() const; + + /// Get the ratio of the sum of the node areas to the root area. + float32 GetAreaRatio() const; + + /// Build an optimal tree. Very expensive. For testing. + void RebuildBottomUp(); + + /// Shift the world origin. Useful for large worlds. + /// The shift formula is: position -= newOrigin + /// @param newOrigin the new origin with respect to the old origin + void ShiftOrigin(const b2Vec2& newOrigin); + +private: + + int32 AllocateNode(); + void FreeNode(int32 node); + + void InsertLeaf(int32 node); + void RemoveLeaf(int32 node); + + int32 Balance(int32 index); + + int32 ComputeHeight() const; + int32 ComputeHeight(int32 nodeId) const; + + void ValidateStructure(int32 index) const; + void ValidateMetrics(int32 index) const; + + int32 m_root; + + b2TreeNode* m_nodes; + int32 m_nodeCount; + int32 m_nodeCapacity; + + int32 m_freeList; + + /// This is used to incrementally traverse the tree for re-balancing. + uint32 m_path; + + int32 m_insertionCount; +}; + +inline void* b2DynamicTree::GetUserData(int32 proxyId) const +{ + b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); + return m_nodes[proxyId].userData; +} + +inline const b2AABB& b2DynamicTree::GetFatAABB(int32 proxyId) const +{ + b2Assert(0 <= proxyId && proxyId < m_nodeCapacity); + return m_nodes[proxyId].aabb; +} + +template +inline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const +{ + b2GrowableStack stack; + stack.Push(m_root); + + while (stack.GetCount() > 0) + { + int32 nodeId = stack.Pop(); + if (nodeId == b2_nullNode) + { + continue; + } + + const b2TreeNode* node = m_nodes + nodeId; + + if (b2TestOverlap(node->aabb, aabb)) + { + if (node->IsLeaf()) + { + bool proceed = callback->QueryCallback(nodeId); + if (proceed == false) + { + return; + } + } + else + { + stack.Push(node->child1); + stack.Push(node->child2); + } + } + } +} + +template +inline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) const +{ + b2Vec2 p1 = input.p1; + b2Vec2 p2 = input.p2; + b2Vec2 r = p2 - p1; + b2Assert(r.LengthSquared() > 0.0f); + r.Normalize(); + + // v is perpendicular to the segment. + b2Vec2 v = b2Cross(1.0f, r); + b2Vec2 abs_v = b2Abs(v); + + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + + float32 maxFraction = input.maxFraction; + + // Build a bounding box for the segment. + b2AABB segmentAABB; + { + b2Vec2 t = p1 + maxFraction * (p2 - p1); + segmentAABB.lowerBound = b2Min(p1, t); + segmentAABB.upperBound = b2Max(p1, t); + } + + b2GrowableStack stack; + stack.Push(m_root); + + while (stack.GetCount() > 0) + { + int32 nodeId = stack.Pop(); + if (nodeId == b2_nullNode) + { + continue; + } + + const b2TreeNode* node = m_nodes + nodeId; + + if (b2TestOverlap(node->aabb, segmentAABB) == false) + { + continue; + } + + // Separating axis for segment (Gino, p80). + // |dot(v, p1 - c)| > dot(|v|, h) + b2Vec2 c = node->aabb.GetCenter(); + b2Vec2 h = node->aabb.GetExtents(); + float32 separation = b2Abs(b2Dot(v, p1 - c)) - b2Dot(abs_v, h); + if (separation > 0.0f) + { + continue; + } + + if (node->IsLeaf()) + { + b2RayCastInput subInput; + subInput.p1 = input.p1; + subInput.p2 = input.p2; + subInput.maxFraction = maxFraction; + + float32 value = callback->RayCastCallback(subInput, nodeId); + + if (value == 0.0f) + { + // The client has terminated the ray cast. + return; + } + + if (value > 0.0f) + { + // Update segment bounding box. + maxFraction = value; + b2Vec2 t = p1 + maxFraction * (p2 - p1); + segmentAABB.lowerBound = b2Min(p1, t); + segmentAABB.upperBound = b2Max(p1, t); + } + } + else + { + stack.Push(node->child1); + stack.Push(node->child2); + } + } +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Collision/b2TimeOfImpact.cpp b/jni/love/src/libraries/Box2D/Collision/b2TimeOfImpact.cpp new file mode 100755 index 00000000..60da95c3 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2TimeOfImpact.cpp @@ -0,0 +1,486 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include +#include + +#include + +float32 b2_toiTime, b2_toiMaxTime; +int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters; +int32 b2_toiRootIters, b2_toiMaxRootIters; + +// +struct b2SeparationFunction +{ + enum Type + { + e_points, + e_faceA, + e_faceB + }; + + // TODO_ERIN might not need to return the separation + + float32 Initialize(const b2SimplexCache* cache, + const b2DistanceProxy* proxyA, const b2Sweep& sweepA, + const b2DistanceProxy* proxyB, const b2Sweep& sweepB, + float32 t1) + { + m_proxyA = proxyA; + m_proxyB = proxyB; + int32 count = cache->count; + b2Assert(0 < count && count < 3); + + m_sweepA = sweepA; + m_sweepB = sweepB; + + b2Transform xfA, xfB; + m_sweepA.GetTransform(&xfA, t1); + m_sweepB.GetTransform(&xfB, t1); + + if (count == 1) + { + m_type = e_points; + b2Vec2 localPointA = m_proxyA->GetVertex(cache->indexA[0]); + b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]); + b2Vec2 pointA = b2Mul(xfA, localPointA); + b2Vec2 pointB = b2Mul(xfB, localPointB); + m_axis = pointB - pointA; + float32 s = m_axis.Normalize(); + return s; + } + else if (cache->indexA[0] == cache->indexA[1]) + { + // Two points on B and one on A. + m_type = e_faceB; + b2Vec2 localPointB1 = proxyB->GetVertex(cache->indexB[0]); + b2Vec2 localPointB2 = proxyB->GetVertex(cache->indexB[1]); + + m_axis = b2Cross(localPointB2 - localPointB1, 1.0f); + m_axis.Normalize(); + b2Vec2 normal = b2Mul(xfB.q, m_axis); + + m_localPoint = 0.5f * (localPointB1 + localPointB2); + b2Vec2 pointB = b2Mul(xfB, m_localPoint); + + b2Vec2 localPointA = proxyA->GetVertex(cache->indexA[0]); + b2Vec2 pointA = b2Mul(xfA, localPointA); + + float32 s = b2Dot(pointA - pointB, normal); + if (s < 0.0f) + { + m_axis = -m_axis; + s = -s; + } + return s; + } + else + { + // Two points on A and one or two points on B. + m_type = e_faceA; + b2Vec2 localPointA1 = m_proxyA->GetVertex(cache->indexA[0]); + b2Vec2 localPointA2 = m_proxyA->GetVertex(cache->indexA[1]); + + m_axis = b2Cross(localPointA2 - localPointA1, 1.0f); + m_axis.Normalize(); + b2Vec2 normal = b2Mul(xfA.q, m_axis); + + m_localPoint = 0.5f * (localPointA1 + localPointA2); + b2Vec2 pointA = b2Mul(xfA, m_localPoint); + + b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]); + b2Vec2 pointB = b2Mul(xfB, localPointB); + + float32 s = b2Dot(pointB - pointA, normal); + if (s < 0.0f) + { + m_axis = -m_axis; + s = -s; + } + return s; + } + } + + // + float32 FindMinSeparation(int32* indexA, int32* indexB, float32 t) const + { + b2Transform xfA, xfB; + m_sweepA.GetTransform(&xfA, t); + m_sweepB.GetTransform(&xfB, t); + + switch (m_type) + { + case e_points: + { + b2Vec2 axisA = b2MulT(xfA.q, m_axis); + b2Vec2 axisB = b2MulT(xfB.q, -m_axis); + + *indexA = m_proxyA->GetSupport(axisA); + *indexB = m_proxyB->GetSupport(axisB); + + b2Vec2 localPointA = m_proxyA->GetVertex(*indexA); + b2Vec2 localPointB = m_proxyB->GetVertex(*indexB); + + b2Vec2 pointA = b2Mul(xfA, localPointA); + b2Vec2 pointB = b2Mul(xfB, localPointB); + + float32 separation = b2Dot(pointB - pointA, m_axis); + return separation; + } + + case e_faceA: + { + b2Vec2 normal = b2Mul(xfA.q, m_axis); + b2Vec2 pointA = b2Mul(xfA, m_localPoint); + + b2Vec2 axisB = b2MulT(xfB.q, -normal); + + *indexA = -1; + *indexB = m_proxyB->GetSupport(axisB); + + b2Vec2 localPointB = m_proxyB->GetVertex(*indexB); + b2Vec2 pointB = b2Mul(xfB, localPointB); + + float32 separation = b2Dot(pointB - pointA, normal); + return separation; + } + + case e_faceB: + { + b2Vec2 normal = b2Mul(xfB.q, m_axis); + b2Vec2 pointB = b2Mul(xfB, m_localPoint); + + b2Vec2 axisA = b2MulT(xfA.q, -normal); + + *indexB = -1; + *indexA = m_proxyA->GetSupport(axisA); + + b2Vec2 localPointA = m_proxyA->GetVertex(*indexA); + b2Vec2 pointA = b2Mul(xfA, localPointA); + + float32 separation = b2Dot(pointA - pointB, normal); + return separation; + } + + default: + b2Assert(false); + *indexA = -1; + *indexB = -1; + return 0.0f; + } + } + + // + float32 Evaluate(int32 indexA, int32 indexB, float32 t) const + { + b2Transform xfA, xfB; + m_sweepA.GetTransform(&xfA, t); + m_sweepB.GetTransform(&xfB, t); + + switch (m_type) + { + case e_points: + { + b2Vec2 localPointA = m_proxyA->GetVertex(indexA); + b2Vec2 localPointB = m_proxyB->GetVertex(indexB); + + b2Vec2 pointA = b2Mul(xfA, localPointA); + b2Vec2 pointB = b2Mul(xfB, localPointB); + float32 separation = b2Dot(pointB - pointA, m_axis); + + return separation; + } + + case e_faceA: + { + b2Vec2 normal = b2Mul(xfA.q, m_axis); + b2Vec2 pointA = b2Mul(xfA, m_localPoint); + + b2Vec2 localPointB = m_proxyB->GetVertex(indexB); + b2Vec2 pointB = b2Mul(xfB, localPointB); + + float32 separation = b2Dot(pointB - pointA, normal); + return separation; + } + + case e_faceB: + { + b2Vec2 normal = b2Mul(xfB.q, m_axis); + b2Vec2 pointB = b2Mul(xfB, m_localPoint); + + b2Vec2 localPointA = m_proxyA->GetVertex(indexA); + b2Vec2 pointA = b2Mul(xfA, localPointA); + + float32 separation = b2Dot(pointA - pointB, normal); + return separation; + } + + default: + b2Assert(false); + return 0.0f; + } + } + + const b2DistanceProxy* m_proxyA; + const b2DistanceProxy* m_proxyB; + b2Sweep m_sweepA, m_sweepB; + Type m_type; + b2Vec2 m_localPoint; + b2Vec2 m_axis; +}; + +// CCD via the local separating axis method. This seeks progression +// by computing the largest time at which separation is maintained. +void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input) +{ + b2Timer timer; + + ++b2_toiCalls; + + output->state = b2TOIOutput::e_unknown; + output->t = input->tMax; + + const b2DistanceProxy* proxyA = &input->proxyA; + const b2DistanceProxy* proxyB = &input->proxyB; + + b2Sweep sweepA = input->sweepA; + b2Sweep sweepB = input->sweepB; + + // Large rotations can make the root finder fail, so we normalize the + // sweep angles. + sweepA.Normalize(); + sweepB.Normalize(); + + float32 tMax = input->tMax; + + float32 totalRadius = proxyA->m_radius + proxyB->m_radius; + float32 target = b2Max(b2_linearSlop, totalRadius - 3.0f * b2_linearSlop); + float32 tolerance = 0.25f * b2_linearSlop; + b2Assert(target > tolerance); + + float32 t1 = 0.0f; + const int32 k_maxIterations = 20; // TODO_ERIN b2Settings + int32 iter = 0; + + // Prepare input for distance query. + b2SimplexCache cache; + cache.count = 0; + b2DistanceInput distanceInput; + distanceInput.proxyA = input->proxyA; + distanceInput.proxyB = input->proxyB; + distanceInput.useRadii = false; + + // The outer loop progressively attempts to compute new separating axes. + // This loop terminates when an axis is repeated (no progress is made). + for(;;) + { + b2Transform xfA, xfB; + sweepA.GetTransform(&xfA, t1); + sweepB.GetTransform(&xfB, t1); + + // Get the distance between shapes. We can also use the results + // to get a separating axis. + distanceInput.transformA = xfA; + distanceInput.transformB = xfB; + b2DistanceOutput distanceOutput; + b2Distance(&distanceOutput, &cache, &distanceInput); + + // If the shapes are overlapped, we give up on continuous collision. + if (distanceOutput.distance <= 0.0f) + { + // Failure! + output->state = b2TOIOutput::e_overlapped; + output->t = 0.0f; + break; + } + + if (distanceOutput.distance < target + tolerance) + { + // Victory! + output->state = b2TOIOutput::e_touching; + output->t = t1; + break; + } + + // Initialize the separating axis. + b2SeparationFunction fcn; + fcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB, t1); +#if 0 + // Dump the curve seen by the root finder + { + const int32 N = 100; + float32 dx = 1.0f / N; + float32 xs[N+1]; + float32 fs[N+1]; + + float32 x = 0.0f; + + for (int32 i = 0; i <= N; ++i) + { + sweepA.GetTransform(&xfA, x); + sweepB.GetTransform(&xfB, x); + float32 f = fcn.Evaluate(xfA, xfB) - target; + + printf("%g %g\n", x, f); + + xs[i] = x; + fs[i] = f; + + x += dx; + } + } +#endif + + // Compute the TOI on the separating axis. We do this by successively + // resolving the deepest point. This loop is bounded by the number of vertices. + bool done = false; + float32 t2 = tMax; + int32 pushBackIter = 0; + for (;;) + { + // Find the deepest point at t2. Store the witness point indices. + int32 indexA, indexB; + float32 s2 = fcn.FindMinSeparation(&indexA, &indexB, t2); + + // Is the final configuration separated? + if (s2 > target + tolerance) + { + // Victory! + output->state = b2TOIOutput::e_separated; + output->t = tMax; + done = true; + break; + } + + // Has the separation reached tolerance? + if (s2 > target - tolerance) + { + // Advance the sweeps + t1 = t2; + break; + } + + // Compute the initial separation of the witness points. + float32 s1 = fcn.Evaluate(indexA, indexB, t1); + + // Check for initial overlap. This might happen if the root finder + // runs out of iterations. + if (s1 < target - tolerance) + { + output->state = b2TOIOutput::e_failed; + output->t = t1; + done = true; + break; + } + + // Check for touching + if (s1 <= target + tolerance) + { + // Victory! t1 should hold the TOI (could be 0.0). + output->state = b2TOIOutput::e_touching; + output->t = t1; + done = true; + break; + } + + // Compute 1D root of: f(x) - target = 0 + int32 rootIterCount = 0; + float32 a1 = t1, a2 = t2; + for (;;) + { + // Use a mix of the secant rule and bisection. + float32 t; + if (rootIterCount & 1) + { + // Secant rule to improve convergence. + t = a1 + (target - s1) * (a2 - a1) / (s2 - s1); + } + else + { + // Bisection to guarantee progress. + t = 0.5f * (a1 + a2); + } + + ++rootIterCount; + ++b2_toiRootIters; + + float32 s = fcn.Evaluate(indexA, indexB, t); + + if (b2Abs(s - target) < tolerance) + { + // t2 holds a tentative value for t1 + t2 = t; + break; + } + + // Ensure we continue to bracket the root. + if (s > target) + { + a1 = t; + s1 = s; + } + else + { + a2 = t; + s2 = s; + } + + if (rootIterCount == 50) + { + break; + } + } + + b2_toiMaxRootIters = b2Max(b2_toiMaxRootIters, rootIterCount); + + ++pushBackIter; + + if (pushBackIter == b2_maxPolygonVertices) + { + break; + } + } + + ++iter; + ++b2_toiIters; + + if (done) + { + break; + } + + if (iter == k_maxIterations) + { + // Root finder got stuck. Semi-victory. + output->state = b2TOIOutput::e_failed; + output->t = t1; + break; + } + } + + b2_toiMaxIters = b2Max(b2_toiMaxIters, iter); + + float32 time = timer.GetMilliseconds(); + b2_toiMaxTime = b2Max(b2_toiMaxTime, time); + b2_toiTime += time; +} diff --git a/jni/love/src/libraries/Box2D/Collision/b2TimeOfImpact.h b/jni/love/src/libraries/Box2D/Collision/b2TimeOfImpact.h new file mode 100755 index 00000000..20620c1e --- /dev/null +++ b/jni/love/src/libraries/Box2D/Collision/b2TimeOfImpact.h @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_TIME_OF_IMPACT_H +#define B2_TIME_OF_IMPACT_H + +#include +#include + +/// Input parameters for b2TimeOfImpact +struct b2TOIInput +{ + b2DistanceProxy proxyA; + b2DistanceProxy proxyB; + b2Sweep sweepA; + b2Sweep sweepB; + float32 tMax; // defines sweep interval [0, tMax] +}; + +// Output parameters for b2TimeOfImpact. +struct b2TOIOutput +{ + enum State + { + e_unknown, + e_failed, + e_overlapped, + e_touching, + e_separated + }; + + State state; + float32 t; +}; + +/// Compute the upper bound on time before two shapes penetrate. Time is represented as +/// a fraction between [0,tMax]. This uses a swept separating axis and may miss some intermediate, +/// non-tunneling collision. If you change the time interval, you should call this function +/// again. +/// Note: use b2Distance to compute the contact point and normal at the time of impact. +void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input); + +#endif diff --git a/jni/love/src/libraries/Box2D/Common/b2BlockAllocator.cpp b/jni/love/src/libraries/Box2D/Common/b2BlockAllocator.cpp new file mode 100755 index 00000000..f7a4688e --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2BlockAllocator.cpp @@ -0,0 +1,215 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include + +int32 b2BlockAllocator::s_blockSizes[b2_blockSizes] = +{ + 16, // 0 + 32, // 1 + 64, // 2 + 96, // 3 + 128, // 4 + 160, // 5 + 192, // 6 + 224, // 7 + 256, // 8 + 320, // 9 + 384, // 10 + 448, // 11 + 512, // 12 + 640, // 13 +}; +uint8 b2BlockAllocator::s_blockSizeLookup[b2_maxBlockSize + 1]; +bool b2BlockAllocator::s_blockSizeLookupInitialized; + +struct b2Chunk +{ + int32 blockSize; + b2Block* blocks; +}; + +struct b2Block +{ + b2Block* next; +}; + +b2BlockAllocator::b2BlockAllocator() +{ + b2Assert(b2_blockSizes < UCHAR_MAX); + + m_chunkSpace = b2_chunkArrayIncrement; + m_chunkCount = 0; + m_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk)); + + memset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk)); + memset(m_freeLists, 0, sizeof(m_freeLists)); + + if (s_blockSizeLookupInitialized == false) + { + int32 j = 0; + for (int32 i = 1; i <= b2_maxBlockSize; ++i) + { + b2Assert(j < b2_blockSizes); + if (i <= s_blockSizes[j]) + { + s_blockSizeLookup[i] = (uint8)j; + } + else + { + ++j; + s_blockSizeLookup[i] = (uint8)j; + } + } + + s_blockSizeLookupInitialized = true; + } +} + +b2BlockAllocator::~b2BlockAllocator() +{ + for (int32 i = 0; i < m_chunkCount; ++i) + { + b2Free(m_chunks[i].blocks); + } + + b2Free(m_chunks); +} + +void* b2BlockAllocator::Allocate(int32 size) +{ + if (size == 0) + return NULL; + + b2Assert(0 < size); + + if (size > b2_maxBlockSize) + { + return b2Alloc(size); + } + + int32 index = s_blockSizeLookup[size]; + b2Assert(0 <= index && index < b2_blockSizes); + + if (m_freeLists[index]) + { + b2Block* block = m_freeLists[index]; + m_freeLists[index] = block->next; + return block; + } + else + { + if (m_chunkCount == m_chunkSpace) + { + b2Chunk* oldChunks = m_chunks; + m_chunkSpace += b2_chunkArrayIncrement; + m_chunks = (b2Chunk*)b2Alloc(m_chunkSpace * sizeof(b2Chunk)); + memcpy(m_chunks, oldChunks, m_chunkCount * sizeof(b2Chunk)); + memset(m_chunks + m_chunkCount, 0, b2_chunkArrayIncrement * sizeof(b2Chunk)); + b2Free(oldChunks); + } + + b2Chunk* chunk = m_chunks + m_chunkCount; + chunk->blocks = (b2Block*)b2Alloc(b2_chunkSize); +#if defined(_DEBUG) + memset(chunk->blocks, 0xcd, b2_chunkSize); +#endif + int32 blockSize = s_blockSizes[index]; + chunk->blockSize = blockSize; + int32 blockCount = b2_chunkSize / blockSize; + b2Assert(blockCount * blockSize <= b2_chunkSize); + for (int32 i = 0; i < blockCount - 1; ++i) + { + b2Block* block = (b2Block*)((int8*)chunk->blocks + blockSize * i); + b2Block* next = (b2Block*)((int8*)chunk->blocks + blockSize * (i + 1)); + block->next = next; + } + b2Block* last = (b2Block*)((int8*)chunk->blocks + blockSize * (blockCount - 1)); + last->next = NULL; + + m_freeLists[index] = chunk->blocks->next; + ++m_chunkCount; + + return chunk->blocks; + } +} + +void b2BlockAllocator::Free(void* p, int32 size) +{ + if (size == 0) + { + return; + } + + b2Assert(0 < size); + + if (size > b2_maxBlockSize) + { + b2Free(p); + return; + } + + int32 index = s_blockSizeLookup[size]; + b2Assert(0 <= index && index < b2_blockSizes); + +#ifdef _DEBUG + // Verify the memory address and size is valid. + int32 blockSize = s_blockSizes[index]; + bool found = false; + for (int32 i = 0; i < m_chunkCount; ++i) + { + b2Chunk* chunk = m_chunks + i; + if (chunk->blockSize != blockSize) + { + b2Assert( (int8*)p + blockSize <= (int8*)chunk->blocks || + (int8*)chunk->blocks + b2_chunkSize <= (int8*)p); + } + else + { + if ((int8*)chunk->blocks <= (int8*)p && (int8*)p + blockSize <= (int8*)chunk->blocks + b2_chunkSize) + { + found = true; + } + } + } + + b2Assert(found); + + memset(p, 0xfd, blockSize); +#endif + + b2Block* block = (b2Block*)p; + block->next = m_freeLists[index]; + m_freeLists[index] = block; +} + +void b2BlockAllocator::Clear() +{ + for (int32 i = 0; i < m_chunkCount; ++i) + { + b2Free(m_chunks[i].blocks); + } + + m_chunkCount = 0; + memset(m_chunks, 0, m_chunkSpace * sizeof(b2Chunk)); + + memset(m_freeLists, 0, sizeof(m_freeLists)); +} diff --git a/jni/love/src/libraries/Box2D/Common/b2BlockAllocator.h b/jni/love/src/libraries/Box2D/Common/b2BlockAllocator.h new file mode 100755 index 00000000..cea3cef9 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2BlockAllocator.h @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_BLOCK_ALLOCATOR_H +#define B2_BLOCK_ALLOCATOR_H + +#include + +const int32 b2_chunkSize = 16 * 1024; +const int32 b2_maxBlockSize = 640; +const int32 b2_blockSizes = 14; +const int32 b2_chunkArrayIncrement = 128; + +struct b2Block; +struct b2Chunk; + +/// This is a small object allocator used for allocating small +/// objects that persist for more than one time step. +/// See: http://www.codeproject.com/useritems/Small_Block_Allocator.asp +class b2BlockAllocator +{ +public: + b2BlockAllocator(); + ~b2BlockAllocator(); + + /// Allocate memory. This will use b2Alloc if the size is larger than b2_maxBlockSize. + void* Allocate(int32 size); + + /// Free memory. This will use b2Free if the size is larger than b2_maxBlockSize. + void Free(void* p, int32 size); + + void Clear(); + +private: + + b2Chunk* m_chunks; + int32 m_chunkCount; + int32 m_chunkSpace; + + b2Block* m_freeLists[b2_blockSizes]; + + static int32 s_blockSizes[b2_blockSizes]; + static uint8 s_blockSizeLookup[b2_maxBlockSize + 1]; + static bool s_blockSizeLookupInitialized; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Common/b2Draw.cpp b/jni/love/src/libraries/Box2D/Common/b2Draw.cpp new file mode 100755 index 00000000..2cd9b1a5 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2Draw.cpp @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2011 Erin Catto http://box2d.org +* +* 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 + +b2Draw::b2Draw() +{ + m_drawFlags = 0; +} + +void b2Draw::SetFlags(uint32 flags) +{ + m_drawFlags = flags; +} + +uint32 b2Draw::GetFlags() const +{ + return m_drawFlags; +} + +void b2Draw::AppendFlags(uint32 flags) +{ + m_drawFlags |= flags; +} + +void b2Draw::ClearFlags(uint32 flags) +{ + m_drawFlags &= ~flags; +} diff --git a/jni/love/src/libraries/Box2D/Common/b2Draw.h b/jni/love/src/libraries/Box2D/Common/b2Draw.h new file mode 100755 index 00000000..20359c91 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2Draw.h @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2011 Erin Catto http://box2d.org +* +* 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 B2_DRAW_H +#define B2_DRAW_H + +#include + +/// Color for debug drawing. Each value has the range [0,1]. +struct b2Color +{ + b2Color() {} + b2Color(float32 r, float32 g, float32 b) : r(r), g(g), b(b) {} + void Set(float32 ri, float32 gi, float32 bi) { r = ri; g = gi; b = bi; } + float32 r, g, b; +}; + +/// Implement and register this class with a b2World to provide debug drawing of physics +/// entities in your game. +class b2Draw +{ +public: + b2Draw(); + + virtual ~b2Draw() {} + + enum + { + e_shapeBit = 0x0001, ///< draw shapes + e_jointBit = 0x0002, ///< draw joint connections + e_aabbBit = 0x0004, ///< draw axis aligned bounding boxes + e_pairBit = 0x0008, ///< draw broad-phase pairs + e_centerOfMassBit = 0x0010 ///< draw center of mass frame + }; + + /// Set the drawing flags. + void SetFlags(uint32 flags); + + /// Get the drawing flags. + uint32 GetFlags() const; + + /// Append flags to the current flags. + void AppendFlags(uint32 flags); + + /// Clear flags from the current flags. + void ClearFlags(uint32 flags); + + /// Draw a closed polygon provided in CCW order. + virtual void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0; + + /// Draw a solid closed polygon provided in CCW order. + virtual void DrawSolidPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color) = 0; + + /// Draw a circle. + virtual void DrawCircle(const b2Vec2& center, float32 radius, const b2Color& color) = 0; + + /// Draw a solid circle. + virtual void DrawSolidCircle(const b2Vec2& center, float32 radius, const b2Vec2& axis, const b2Color& color) = 0; + + /// Draw a line segment. + virtual void DrawSegment(const b2Vec2& p1, const b2Vec2& p2, const b2Color& color) = 0; + + /// Draw a transform. Choose your own length scale. + /// @param xf a transform. + virtual void DrawTransform(const b2Transform& xf) = 0; + +protected: + uint32 m_drawFlags; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Common/b2GrowableStack.h b/jni/love/src/libraries/Box2D/Common/b2GrowableStack.h new file mode 100755 index 00000000..4094644a --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2GrowableStack.h @@ -0,0 +1,85 @@ +/* +* Copyright (c) 2010 Erin Catto http://www.box2d.org +* +* 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 B2_GROWABLE_STACK_H +#define B2_GROWABLE_STACK_H +#include +#include + +/// This is a growable LIFO stack with an initial capacity of N. +/// If the stack size exceeds the initial capacity, the heap is used +/// to increase the size of the stack. +template +class b2GrowableStack +{ +public: + b2GrowableStack() + { + m_stack = m_array; + m_count = 0; + m_capacity = N; + } + + ~b2GrowableStack() + { + if (m_stack != m_array) + { + b2Free(m_stack); + m_stack = NULL; + } + } + + void Push(const T& element) + { + if (m_count == m_capacity) + { + T* old = m_stack; + m_capacity *= 2; + m_stack = (T*)b2Alloc(m_capacity * sizeof(T)); + memcpy(m_stack, old, m_count * sizeof(T)); + if (old != m_array) + { + b2Free(old); + } + } + + m_stack[m_count] = element; + ++m_count; + } + + T Pop() + { + b2Assert(m_count > 0); + --m_count; + return m_stack[m_count]; + } + + int32 GetCount() + { + return m_count; + } + +private: + T* m_stack; + T m_array[N]; + int32 m_count; + int32 m_capacity; +}; + + +#endif diff --git a/jni/love/src/libraries/Box2D/Common/b2Math.cpp b/jni/love/src/libraries/Box2D/Common/b2Math.cpp new file mode 100755 index 00000000..d6027be9 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2Math.cpp @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* +* 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 + +const b2Vec2 b2Vec2_zero(0.0f, 0.0f); + +/// Solve A * x = b, where b is a column vector. This is more efficient +/// than computing the inverse in one-shot cases. +b2Vec3 b2Mat33::Solve33(const b2Vec3& b) const +{ + float32 det = b2Dot(ex, b2Cross(ey, ez)); + if (det != 0.0f) + { + det = 1.0f / det; + } + b2Vec3 x; + x.x = det * b2Dot(b, b2Cross(ey, ez)); + x.y = det * b2Dot(ex, b2Cross(b, ez)); + x.z = det * b2Dot(ex, b2Cross(ey, b)); + return x; +} + +/// Solve A * x = b, where b is a column vector. This is more efficient +/// than computing the inverse in one-shot cases. +b2Vec2 b2Mat33::Solve22(const b2Vec2& b) const +{ + float32 a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y; + float32 det = a11 * a22 - a12 * a21; + if (det != 0.0f) + { + det = 1.0f / det; + } + b2Vec2 x; + x.x = det * (a22 * b.x - a12 * b.y); + x.y = det * (a11 * b.y - a21 * b.x); + return x; +} + +/// +void b2Mat33::GetInverse22(b2Mat33* M) const +{ + float32 a = ex.x, b = ey.x, c = ex.y, d = ey.y; + float32 det = a * d - b * c; + if (det != 0.0f) + { + det = 1.0f / det; + } + + M->ex.x = det * d; M->ey.x = -det * b; M->ex.z = 0.0f; + M->ex.y = -det * c; M->ey.y = det * a; M->ey.z = 0.0f; + M->ez.x = 0.0f; M->ez.y = 0.0f; M->ez.z = 0.0f; +} + +/// Returns the zero matrix if singular. +void b2Mat33::GetSymInverse33(b2Mat33* M) const +{ + float32 det = b2Dot(ex, b2Cross(ey, ez)); + if (det != 0.0f) + { + det = 1.0f / det; + } + + float32 a11 = ex.x, a12 = ey.x, a13 = ez.x; + float32 a22 = ey.y, a23 = ez.y; + float32 a33 = ez.z; + + M->ex.x = det * (a22 * a33 - a23 * a23); + M->ex.y = det * (a13 * a23 - a12 * a33); + M->ex.z = det * (a12 * a23 - a13 * a22); + + M->ey.x = M->ex.y; + M->ey.y = det * (a11 * a33 - a13 * a13); + M->ey.z = det * (a13 * a12 - a11 * a23); + + M->ez.x = M->ex.z; + M->ez.y = M->ey.z; + M->ez.z = det * (a11 * a22 - a12 * a12); +} diff --git a/jni/love/src/libraries/Box2D/Common/b2Math.h b/jni/love/src/libraries/Box2D/Common/b2Math.h new file mode 100755 index 00000000..713100df --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2Math.h @@ -0,0 +1,721 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_MATH_H +#define B2_MATH_H + +#include +#include +#include + +/// This function is used to ensure that a floating point number is not a NaN or infinity. +inline bool b2IsValid(float32 x) +{ + int32 ix = *reinterpret_cast(&x); + return (ix & 0x7f800000) != 0x7f800000; +} + +/// This is a approximate yet fast inverse square-root. +inline float32 b2InvSqrt(float32 x) +{ + union + { + float32 x; + int32 i; + } convert; + + convert.x = x; + float32 xhalf = 0.5f * x; + convert.i = 0x5f3759df - (convert.i >> 1); + x = convert.x; + x = x * (1.5f - xhalf * x * x); + return x; +} + +#define b2Sqrt(x) sqrtf(x) +#define b2Atan2(y, x) atan2f(y, x) + +/// A 2D column vector. +struct b2Vec2 +{ + /// Default constructor does nothing (for performance). + b2Vec2() {} + + /// Construct using coordinates. + b2Vec2(float32 x, float32 y) : x(x), y(y) {} + + /// Set this vector to all zeros. + void SetZero() { x = 0.0f; y = 0.0f; } + + /// Set this vector to some specified coordinates. + void Set(float32 x_, float32 y_) { x = x_; y = y_; } + + /// Negate this vector. + b2Vec2 operator -() const { b2Vec2 v; v.Set(-x, -y); return v; } + + /// Read from and indexed element. + float32 operator () (int32 i) const + { + return (&x)[i]; + } + + /// Write to an indexed element. + float32& operator () (int32 i) + { + return (&x)[i]; + } + + /// Add a vector to this vector. + void operator += (const b2Vec2& v) + { + x += v.x; y += v.y; + } + + /// Subtract a vector from this vector. + void operator -= (const b2Vec2& v) + { + x -= v.x; y -= v.y; + } + + /// Multiply this vector by a scalar. + void operator *= (float32 a) + { + x *= a; y *= a; + } + + /// Get the length of this vector (the norm). + float32 Length() const + { + return b2Sqrt(x * x + y * y); + } + + /// Get the length squared. For performance, use this instead of + /// b2Vec2::Length (if possible). + float32 LengthSquared() const + { + return x * x + y * y; + } + + /// Convert this vector into a unit vector. Returns the length. + float32 Normalize() + { + float32 length = Length(); + if (length < b2_epsilon) + { + return 0.0f; + } + float32 invLength = 1.0f / length; + x *= invLength; + y *= invLength; + + return length; + } + + /// Does this vector contain finite coordinates? + bool IsValid() const + { + return b2IsValid(x) && b2IsValid(y); + } + + /// Get the skew vector such that dot(skew_vec, other) == cross(vec, other) + b2Vec2 Skew() const + { + return b2Vec2(-y, x); + } + + float32 x, y; +}; + +/// A 2D column vector with 3 elements. +struct b2Vec3 +{ + /// Default constructor does nothing (for performance). + b2Vec3() {} + + /// Construct using coordinates. + b2Vec3(float32 x, float32 y, float32 z) : x(x), y(y), z(z) {} + + /// Set this vector to all zeros. + void SetZero() { x = 0.0f; y = 0.0f; z = 0.0f; } + + /// Set this vector to some specified coordinates. + void Set(float32 x_, float32 y_, float32 z_) { x = x_; y = y_; z = z_; } + + /// Negate this vector. + b2Vec3 operator -() const { b2Vec3 v; v.Set(-x, -y, -z); return v; } + + /// Add a vector to this vector. + void operator += (const b2Vec3& v) + { + x += v.x; y += v.y; z += v.z; + } + + /// Subtract a vector from this vector. + void operator -= (const b2Vec3& v) + { + x -= v.x; y -= v.y; z -= v.z; + } + + /// Multiply this vector by a scalar. + void operator *= (float32 s) + { + x *= s; y *= s; z *= s; + } + + float32 x, y, z; +}; + +/// A 2-by-2 matrix. Stored in column-major order. +struct b2Mat22 +{ + /// The default constructor does nothing (for performance). + b2Mat22() {} + + /// Construct this matrix using columns. + b2Mat22(const b2Vec2& c1, const b2Vec2& c2) + { + ex = c1; + ey = c2; + } + + /// Construct this matrix using scalars. + b2Mat22(float32 a11, float32 a12, float32 a21, float32 a22) + { + ex.x = a11; ex.y = a21; + ey.x = a12; ey.y = a22; + } + + /// Initialize this matrix using columns. + void Set(const b2Vec2& c1, const b2Vec2& c2) + { + ex = c1; + ey = c2; + } + + /// Set this to the identity matrix. + void SetIdentity() + { + ex.x = 1.0f; ey.x = 0.0f; + ex.y = 0.0f; ey.y = 1.0f; + } + + /// Set this matrix to all zeros. + void SetZero() + { + ex.x = 0.0f; ey.x = 0.0f; + ex.y = 0.0f; ey.y = 0.0f; + } + + b2Mat22 GetInverse() const + { + float32 a = ex.x, b = ey.x, c = ex.y, d = ey.y; + b2Mat22 B; + float32 det = a * d - b * c; + if (det != 0.0f) + { + det = 1.0f / det; + } + B.ex.x = det * d; B.ey.x = -det * b; + B.ex.y = -det * c; B.ey.y = det * a; + return B; + } + + /// Solve A * x = b, where b is a column vector. This is more efficient + /// than computing the inverse in one-shot cases. + b2Vec2 Solve(const b2Vec2& b) const + { + float32 a11 = ex.x, a12 = ey.x, a21 = ex.y, a22 = ey.y; + float32 det = a11 * a22 - a12 * a21; + if (det != 0.0f) + { + det = 1.0f / det; + } + b2Vec2 x; + x.x = det * (a22 * b.x - a12 * b.y); + x.y = det * (a11 * b.y - a21 * b.x); + return x; + } + + b2Vec2 ex, ey; +}; + +/// A 3-by-3 matrix. Stored in column-major order. +struct b2Mat33 +{ + /// The default constructor does nothing (for performance). + b2Mat33() {} + + /// Construct this matrix using columns. + b2Mat33(const b2Vec3& c1, const b2Vec3& c2, const b2Vec3& c3) + { + ex = c1; + ey = c2; + ez = c3; + } + + /// Set this matrix to all zeros. + void SetZero() + { + ex.SetZero(); + ey.SetZero(); + ez.SetZero(); + } + + /// Solve A * x = b, where b is a column vector. This is more efficient + /// than computing the inverse in one-shot cases. + b2Vec3 Solve33(const b2Vec3& b) const; + + /// Solve A * x = b, where b is a column vector. This is more efficient + /// than computing the inverse in one-shot cases. Solve only the upper + /// 2-by-2 matrix equation. + b2Vec2 Solve22(const b2Vec2& b) const; + + /// Get the inverse of this matrix as a 2-by-2. + /// Returns the zero matrix if singular. + void GetInverse22(b2Mat33* M) const; + + /// Get the symmetric inverse of this matrix as a 3-by-3. + /// Returns the zero matrix if singular. + void GetSymInverse33(b2Mat33* M) const; + + b2Vec3 ex, ey, ez; +}; + +/// Rotation +struct b2Rot +{ + b2Rot() {} + + /// Initialize from an angle in radians + explicit b2Rot(float32 angle) + { + /// TODO_ERIN optimize + s = sinf(angle); + c = cosf(angle); + } + + /// Set using an angle in radians. + void Set(float32 angle) + { + /// TODO_ERIN optimize + s = sinf(angle); + c = cosf(angle); + } + + /// Set to the identity rotation + void SetIdentity() + { + s = 0.0f; + c = 1.0f; + } + + /// Get the angle in radians + float32 GetAngle() const + { + return b2Atan2(s, c); + } + + /// Get the x-axis + b2Vec2 GetXAxis() const + { + return b2Vec2(c, s); + } + + /// Get the u-axis + b2Vec2 GetYAxis() const + { + return b2Vec2(-s, c); + } + + /// Sine and cosine + float32 s, c; +}; + +/// A transform contains translation and rotation. It is used to represent +/// the position and orientation of rigid frames. +struct b2Transform +{ + /// The default constructor does nothing. + b2Transform() {} + + /// Initialize using a position vector and a rotation. + b2Transform(const b2Vec2& position, const b2Rot& rotation) : p(position), q(rotation) {} + + /// Set this to the identity transform. + void SetIdentity() + { + p.SetZero(); + q.SetIdentity(); + } + + /// Set this based on the position and angle. + void Set(const b2Vec2& position, float32 angle) + { + p = position; + q.Set(angle); + } + + b2Vec2 p; + b2Rot q; +}; + +/// This describes the motion of a body/shape for TOI computation. +/// Shapes are defined with respect to the body origin, which may +/// no coincide with the center of mass. However, to support dynamics +/// we must interpolate the center of mass position. +struct b2Sweep +{ + /// Get the interpolated transform at a specific time. + /// @param beta is a factor in [0,1], where 0 indicates alpha0. + void GetTransform(b2Transform* xfb, float32 beta) const; + + /// Advance the sweep forward, yielding a new initial state. + /// @param alpha the new initial time. + void Advance(float32 alpha); + + /// Normalize the angles. + void Normalize(); + + b2Vec2 localCenter; ///< local center of mass position + b2Vec2 c0, c; ///< center world positions + float32 a0, a; ///< world angles + + /// Fraction of the current time step in the range [0,1] + /// c0 and a0 are the positions at alpha0. + float32 alpha0; +}; + +/// Useful constant +extern const b2Vec2 b2Vec2_zero; + +/// Perform the dot product on two vectors. +inline float32 b2Dot(const b2Vec2& a, const b2Vec2& b) +{ + return a.x * b.x + a.y * b.y; +} + +/// Perform the cross product on two vectors. In 2D this produces a scalar. +inline float32 b2Cross(const b2Vec2& a, const b2Vec2& b) +{ + return a.x * b.y - a.y * b.x; +} + +/// Perform the cross product on a vector and a scalar. In 2D this produces +/// a vector. +inline b2Vec2 b2Cross(const b2Vec2& a, float32 s) +{ + return b2Vec2(s * a.y, -s * a.x); +} + +/// Perform the cross product on a scalar and a vector. In 2D this produces +/// a vector. +inline b2Vec2 b2Cross(float32 s, const b2Vec2& a) +{ + return b2Vec2(-s * a.y, s * a.x); +} + +/// Multiply a matrix times a vector. If a rotation matrix is provided, +/// then this transforms the vector from one frame to another. +inline b2Vec2 b2Mul(const b2Mat22& A, const b2Vec2& v) +{ + return b2Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y); +} + +/// Multiply a matrix transpose times a vector. If a rotation matrix is provided, +/// then this transforms the vector from one frame to another (inverse transform). +inline b2Vec2 b2MulT(const b2Mat22& A, const b2Vec2& v) +{ + return b2Vec2(b2Dot(v, A.ex), b2Dot(v, A.ey)); +} + +/// Add two vectors component-wise. +inline b2Vec2 operator + (const b2Vec2& a, const b2Vec2& b) +{ + return b2Vec2(a.x + b.x, a.y + b.y); +} + +/// Subtract two vectors component-wise. +inline b2Vec2 operator - (const b2Vec2& a, const b2Vec2& b) +{ + return b2Vec2(a.x - b.x, a.y - b.y); +} + +inline b2Vec2 operator * (float32 s, const b2Vec2& a) +{ + return b2Vec2(s * a.x, s * a.y); +} + +inline bool operator == (const b2Vec2& a, const b2Vec2& b) +{ + return a.x == b.x && a.y == b.y; +} + +inline float32 b2Distance(const b2Vec2& a, const b2Vec2& b) +{ + b2Vec2 c = a - b; + return c.Length(); +} + +inline float32 b2DistanceSquared(const b2Vec2& a, const b2Vec2& b) +{ + b2Vec2 c = a - b; + return b2Dot(c, c); +} + +inline b2Vec3 operator * (float32 s, const b2Vec3& a) +{ + return b2Vec3(s * a.x, s * a.y, s * a.z); +} + +/// Add two vectors component-wise. +inline b2Vec3 operator + (const b2Vec3& a, const b2Vec3& b) +{ + return b2Vec3(a.x + b.x, a.y + b.y, a.z + b.z); +} + +/// Subtract two vectors component-wise. +inline b2Vec3 operator - (const b2Vec3& a, const b2Vec3& b) +{ + return b2Vec3(a.x - b.x, a.y - b.y, a.z - b.z); +} + +/// Perform the dot product on two vectors. +inline float32 b2Dot(const b2Vec3& a, const b2Vec3& b) +{ + return a.x * b.x + a.y * b.y + a.z * b.z; +} + +/// Perform the cross product on two vectors. +inline b2Vec3 b2Cross(const b2Vec3& a, const b2Vec3& b) +{ + return b2Vec3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); +} + +inline b2Mat22 operator + (const b2Mat22& A, const b2Mat22& B) +{ + return b2Mat22(A.ex + B.ex, A.ey + B.ey); +} + +// A * B +inline b2Mat22 b2Mul(const b2Mat22& A, const b2Mat22& B) +{ + return b2Mat22(b2Mul(A, B.ex), b2Mul(A, B.ey)); +} + +// A^T * B +inline b2Mat22 b2MulT(const b2Mat22& A, const b2Mat22& B) +{ + b2Vec2 c1(b2Dot(A.ex, B.ex), b2Dot(A.ey, B.ex)); + b2Vec2 c2(b2Dot(A.ex, B.ey), b2Dot(A.ey, B.ey)); + return b2Mat22(c1, c2); +} + +/// Multiply a matrix times a vector. +inline b2Vec3 b2Mul(const b2Mat33& A, const b2Vec3& v) +{ + return v.x * A.ex + v.y * A.ey + v.z * A.ez; +} + +/// Multiply a matrix times a vector. +inline b2Vec2 b2Mul22(const b2Mat33& A, const b2Vec2& v) +{ + return b2Vec2(A.ex.x * v.x + A.ey.x * v.y, A.ex.y * v.x + A.ey.y * v.y); +} + +/// Multiply two rotations: q * r +inline b2Rot b2Mul(const b2Rot& q, const b2Rot& r) +{ + // [qc -qs] * [rc -rs] = [qc*rc-qs*rs -qc*rs-qs*rc] + // [qs qc] [rs rc] [qs*rc+qc*rs -qs*rs+qc*rc] + // s = qs * rc + qc * rs + // c = qc * rc - qs * rs + b2Rot qr; + qr.s = q.s * r.c + q.c * r.s; + qr.c = q.c * r.c - q.s * r.s; + return qr; +} + +/// Transpose multiply two rotations: qT * r +inline b2Rot b2MulT(const b2Rot& q, const b2Rot& r) +{ + // [ qc qs] * [rc -rs] = [qc*rc+qs*rs -qc*rs+qs*rc] + // [-qs qc] [rs rc] [-qs*rc+qc*rs qs*rs+qc*rc] + // s = qc * rs - qs * rc + // c = qc * rc + qs * rs + b2Rot qr; + qr.s = q.c * r.s - q.s * r.c; + qr.c = q.c * r.c + q.s * r.s; + return qr; +} + +/// Rotate a vector +inline b2Vec2 b2Mul(const b2Rot& q, const b2Vec2& v) +{ + return b2Vec2(q.c * v.x - q.s * v.y, q.s * v.x + q.c * v.y); +} + +/// Inverse rotate a vector +inline b2Vec2 b2MulT(const b2Rot& q, const b2Vec2& v) +{ + return b2Vec2(q.c * v.x + q.s * v.y, -q.s * v.x + q.c * v.y); +} + +inline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v) +{ + float32 x = (T.q.c * v.x - T.q.s * v.y) + T.p.x; + float32 y = (T.q.s * v.x + T.q.c * v.y) + T.p.y; + + return b2Vec2(x, y); +} + +inline b2Vec2 b2MulT(const b2Transform& T, const b2Vec2& v) +{ + float32 px = v.x - T.p.x; + float32 py = v.y - T.p.y; + float32 x = (T.q.c * px + T.q.s * py); + float32 y = (-T.q.s * px + T.q.c * py); + + return b2Vec2(x, y); +} + +// v2 = A.q.Rot(B.q.Rot(v1) + B.p) + A.p +// = (A.q * B.q).Rot(v1) + A.q.Rot(B.p) + A.p +inline b2Transform b2Mul(const b2Transform& A, const b2Transform& B) +{ + b2Transform C; + C.q = b2Mul(A.q, B.q); + C.p = b2Mul(A.q, B.p) + A.p; + return C; +} + +// v2 = A.q' * (B.q * v1 + B.p - A.p) +// = A.q' * B.q * v1 + A.q' * (B.p - A.p) +inline b2Transform b2MulT(const b2Transform& A, const b2Transform& B) +{ + b2Transform C; + C.q = b2MulT(A.q, B.q); + C.p = b2MulT(A.q, B.p - A.p); + return C; +} + +template +inline T b2Abs(T a) +{ + return a > T(0) ? a : -a; +} + +inline b2Vec2 b2Abs(const b2Vec2& a) +{ + return b2Vec2(b2Abs(a.x), b2Abs(a.y)); +} + +inline b2Mat22 b2Abs(const b2Mat22& A) +{ + return b2Mat22(b2Abs(A.ex), b2Abs(A.ey)); +} + +template +inline T b2Min(T a, T b) +{ + return a < b ? a : b; +} + +inline b2Vec2 b2Min(const b2Vec2& a, const b2Vec2& b) +{ + return b2Vec2(b2Min(a.x, b.x), b2Min(a.y, b.y)); +} + +template +inline T b2Max(T a, T b) +{ + return a > b ? a : b; +} + +inline b2Vec2 b2Max(const b2Vec2& a, const b2Vec2& b) +{ + return b2Vec2(b2Max(a.x, b.x), b2Max(a.y, b.y)); +} + +template +inline T b2Clamp(T a, T low, T high) +{ + return b2Max(low, b2Min(a, high)); +} + +inline b2Vec2 b2Clamp(const b2Vec2& a, const b2Vec2& low, const b2Vec2& high) +{ + return b2Max(low, b2Min(a, high)); +} + +template inline void b2Swap(T& a, T& b) +{ + T tmp = a; + a = b; + b = tmp; +} + +/// "Next Largest Power of 2 +/// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm +/// that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with +/// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next +/// largest power of 2. For a 32-bit value:" +inline uint32 b2NextPowerOfTwo(uint32 x) +{ + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; +} + +inline bool b2IsPowerOfTwo(uint32 x) +{ + bool result = x > 0 && (x & (x - 1)) == 0; + return result; +} + +inline void b2Sweep::GetTransform(b2Transform* xf, float32 beta) const +{ + xf->p = (1.0f - beta) * c0 + beta * c; + float32 angle = (1.0f - beta) * a0 + beta * a; + xf->q.Set(angle); + + // Shift to origin + xf->p -= b2Mul(xf->q, localCenter); +} + +inline void b2Sweep::Advance(float32 alpha) +{ + b2Assert(alpha0 < 1.0f); + float32 beta = (alpha - alpha0) / (1.0f - alpha0); + c0 += beta * (c - c0); + a0 += beta * (a - a0); + alpha0 = alpha; +} + +/// Normalize an angle in radians to be between -pi and pi +inline void b2Sweep::Normalize() +{ + float32 twoPi = 2.0f * b2_pi; + float32 d = twoPi * floorf(a0 / twoPi); + a0 -= d; + a -= d; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Common/b2Settings.cpp b/jni/love/src/libraries/Box2D/Common/b2Settings.cpp new file mode 100755 index 00000000..e2ceefc1 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2Settings.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include + +#include "common/Exception.h" + +b2Version b2_version = {2, 3, 0}; + +// Memory allocators. Modify these to use your own allocator. +void* b2Alloc(int32 size) +{ + return malloc(size); +} + +void b2Free(void* mem) +{ + free(mem); +} + +// You can modify this to use your logging facility. +void b2Log(const char* string, ...) +{ + va_list args; + va_start(args, string); + vprintf(string, args); + va_end(args); +} + +void loveAssert(bool test, const char *teststr) +{ + if (!test) + throw love::Exception("Box2D assertion failed: %s", teststr); +} diff --git a/jni/love/src/libraries/Box2D/Common/b2Settings.h b/jni/love/src/libraries/Box2D/Common/b2Settings.h new file mode 100755 index 00000000..beaa1d47 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2Settings.h @@ -0,0 +1,154 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_SETTINGS_H +#define B2_SETTINGS_H + +#include +#include +#include + +void loveAssert(bool test, const char *teststr); + +#define B2_NOT_USED(x) ((void)(x)) +//#define b2Assert(A) assert(A) +#define b2Assert(A) loveAssert((A), #A) + +typedef signed char int8; +typedef signed short int16; +typedef signed int int32; +typedef unsigned char uint8; +typedef unsigned short uint16; +typedef unsigned int uint32; +typedef float float32; +typedef double float64; + +#define b2_maxFloat FLT_MAX +#define b2_epsilon FLT_EPSILON +#define b2_pi 3.14159265359f + +/// @file +/// Global tuning constants based on meters-kilograms-seconds (MKS) units. +/// + +// Collision + +/// The maximum number of contact points between two convex shapes. Do +/// not change this value. +#define b2_maxManifoldPoints 2 + +/// The maximum number of vertices on a convex polygon. You cannot increase +/// this too much because b2BlockAllocator has a maximum object size. +#define b2_maxPolygonVertices 8 + +/// This is used to fatten AABBs in the dynamic tree. This allows proxies +/// to move by a small amount without triggering a tree adjustment. +/// This is in meters. +#define b2_aabbExtension 0.1f + +/// This is used to fatten AABBs in the dynamic tree. This is used to predict +/// the future position based on the current displacement. +/// This is a dimensionless multiplier. +#define b2_aabbMultiplier 2.0f + +/// A small length used as a collision and constraint tolerance. Usually it is +/// chosen to be numerically significant, but visually insignificant. +#define b2_linearSlop 0.005f + +/// A small angle used as a collision and constraint tolerance. Usually it is +/// chosen to be numerically significant, but visually insignificant. +#define b2_angularSlop (2.0f / 180.0f * b2_pi) + +/// The radius of the polygon/edge shape skin. This should not be modified. Making +/// this smaller means polygons will have an insufficient buffer for continuous collision. +/// Making it larger may create artifacts for vertex collision. +#define b2_polygonRadius (2.0f * b2_linearSlop) + +/// Maximum number of sub-steps per contact in continuous physics simulation. +#define b2_maxSubSteps 8 + + +// Dynamics + +/// Maximum number of contacts to be handled to solve a TOI impact. +#define b2_maxTOIContacts 32 + +/// A velocity threshold for elastic collisions. Any collision with a relative linear +/// velocity below this threshold will be treated as inelastic. +#define b2_velocityThreshold 1.0f + +/// The maximum linear position correction used when solving constraints. This helps to +/// prevent overshoot. +#define b2_maxLinearCorrection 0.2f + +/// The maximum angular position correction used when solving constraints. This helps to +/// prevent overshoot. +#define b2_maxAngularCorrection (8.0f / 180.0f * b2_pi) + +/// The maximum linear velocity of a body. This limit is very large and is used +/// to prevent numerical problems. You shouldn't need to adjust this. +#define b2_maxTranslation 2.0f +#define b2_maxTranslationSquared (b2_maxTranslation * b2_maxTranslation) + +/// The maximum angular velocity of a body. This limit is very large and is used +/// to prevent numerical problems. You shouldn't need to adjust this. +#define b2_maxRotation (0.5f * b2_pi) +#define b2_maxRotationSquared (b2_maxRotation * b2_maxRotation) + +/// This scale factor controls how fast overlap is resolved. Ideally this would be 1 so +/// that overlap is removed in one time step. However using values close to 1 often lead +/// to overshoot. +#define b2_baumgarte 0.2f +#define b2_toiBaugarte 0.75f + + +// Sleep + +/// The time that a body must be still before it will go to sleep. +#define b2_timeToSleep 0.5f + +/// A body cannot sleep if its linear velocity is above this tolerance. +#define b2_linearSleepTolerance 0.01f + +/// A body cannot sleep if its angular velocity is above this tolerance. +#define b2_angularSleepTolerance (2.0f / 180.0f * b2_pi) + +// Memory Allocation + +/// Implement this function to use your own memory allocator. +void* b2Alloc(int32 size); + +/// If you implement b2Alloc, you should also implement this function. +void b2Free(void* mem); + +/// Logging function. +void b2Log(const char* string, ...); + +/// Version numbering scheme. +/// See http://en.wikipedia.org/wiki/Software_versioning +struct b2Version +{ + int32 major; ///< significant changes + int32 minor; ///< incremental changes + int32 revision; ///< bug fixes +}; + +/// Current version. +extern b2Version b2_version; + +#endif diff --git a/jni/love/src/libraries/Box2D/Common/b2StackAllocator.cpp b/jni/love/src/libraries/Box2D/Common/b2StackAllocator.cpp new file mode 100755 index 00000000..321cabb2 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2StackAllocator.cpp @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include + +b2StackAllocator::b2StackAllocator() +{ + m_index = 0; + m_allocation = 0; + m_maxAllocation = 0; + m_entryCount = 0; +} + +b2StackAllocator::~b2StackAllocator() +{ + b2Assert(m_index == 0); + b2Assert(m_entryCount == 0); +} + +void* b2StackAllocator::Allocate(int32 size) +{ + b2Assert(m_entryCount < b2_maxStackEntries); + + b2StackEntry* entry = m_entries + m_entryCount; + entry->size = size; + if (m_index + size > b2_stackSize) + { + entry->data = (char*)b2Alloc(size); + entry->usedMalloc = true; + } + else + { + entry->data = m_data + m_index; + entry->usedMalloc = false; + m_index += size; + } + + m_allocation += size; + m_maxAllocation = b2Max(m_maxAllocation, m_allocation); + ++m_entryCount; + + return entry->data; +} + +void b2StackAllocator::Free(void* p) +{ + b2Assert(m_entryCount > 0); + b2StackEntry* entry = m_entries + m_entryCount - 1; + b2Assert(p == entry->data); + if (entry->usedMalloc) + { + b2Free(p); + } + else + { + m_index -= entry->size; + } + m_allocation -= entry->size; + --m_entryCount; + + p = NULL; +} + +int32 b2StackAllocator::GetMaxAllocation() const +{ + return m_maxAllocation; +} diff --git a/jni/love/src/libraries/Box2D/Common/b2StackAllocator.h b/jni/love/src/libraries/Box2D/Common/b2StackAllocator.h new file mode 100755 index 00000000..bb87a7ed --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2StackAllocator.h @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_STACK_ALLOCATOR_H +#define B2_STACK_ALLOCATOR_H + +#include + +const int32 b2_stackSize = 100 * 1024; // 100k +const int32 b2_maxStackEntries = 32; + +struct b2StackEntry +{ + char* data; + int32 size; + bool usedMalloc; +}; + +// This is a stack allocator used for fast per step allocations. +// You must nest allocate/free pairs. The code will assert +// if you try to interleave multiple allocate/free pairs. +class b2StackAllocator +{ +public: + b2StackAllocator(); + ~b2StackAllocator(); + + void* Allocate(int32 size); + void Free(void* p); + + int32 GetMaxAllocation() const; + +private: + + char m_data[b2_stackSize]; + int32 m_index; + + int32 m_allocation; + int32 m_maxAllocation; + + b2StackEntry m_entries[b2_maxStackEntries]; + int32 m_entryCount; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Common/b2Timer.cpp b/jni/love/src/libraries/Box2D/Common/b2Timer.cpp new file mode 100755 index 00000000..cbea5309 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2Timer.cpp @@ -0,0 +1,101 @@ +/* +* Copyright (c) 2011 Erin Catto http://box2d.org +* +* 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 + +#if defined(_WIN32) + +float64 b2Timer::s_invFrequency = 0.0f; + +#define WIN32_LEAN_AND_MEAN +#include + +b2Timer::b2Timer() +{ + LARGE_INTEGER largeInteger; + + if (s_invFrequency == 0.0f) + { + QueryPerformanceFrequency(&largeInteger); + s_invFrequency = float64(largeInteger.QuadPart); + if (s_invFrequency > 0.0f) + { + s_invFrequency = 1000.0f / s_invFrequency; + } + } + + QueryPerformanceCounter(&largeInteger); + m_start = float64(largeInteger.QuadPart); +} + +void b2Timer::Reset() +{ + LARGE_INTEGER largeInteger; + QueryPerformanceCounter(&largeInteger); + m_start = float64(largeInteger.QuadPart); +} + +float32 b2Timer::GetMilliseconds() const +{ + LARGE_INTEGER largeInteger; + QueryPerformanceCounter(&largeInteger); + float64 count = float64(largeInteger.QuadPart); + float32 ms = float32(s_invFrequency * (count - m_start)); + return ms; +} + +#elif defined(__linux__) || defined (__APPLE__) + +#include + +b2Timer::b2Timer() +{ + Reset(); +} + +void b2Timer::Reset() +{ + timeval t; + gettimeofday(&t, 0); + m_start_sec = t.tv_sec; + m_start_usec = t.tv_usec; +} + +float32 b2Timer::GetMilliseconds() const +{ + timeval t; + gettimeofday(&t, 0); + return 1000.0f * (t.tv_sec - m_start_sec) + 0.001f * (t.tv_usec - m_start_usec); +} + +#else + +b2Timer::b2Timer() +{ +} + +void b2Timer::Reset() +{ +} + +float32 b2Timer::GetMilliseconds() const +{ + return 0.0f; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Common/b2Timer.h b/jni/love/src/libraries/Box2D/Common/b2Timer.h new file mode 100755 index 00000000..edf1ca45 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Common/b2Timer.h @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2011 Erin Catto http://box2d.org +* +* 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 B2_TIMER_H +#define B2_TIMER_H + +#include + +/// Timer for profiling. This has platform specific code and may +/// not work on every platform. +class b2Timer +{ +public: + + /// Constructor + b2Timer(); + + /// Reset the timer. + void Reset(); + + /// Get the time since construction or the last reset. + float32 GetMilliseconds() const; + +private: + +#if defined(_WIN32) + float64 m_start; + static float64 s_invFrequency; +#elif defined(__linux__) || defined (__APPLE__) + unsigned long m_start_sec; + unsigned long m_start_usec; +#endif +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp new file mode 100755 index 00000000..01c921f3 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include + +#include + +b2Contact* b2ChainAndCircleContact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2ChainAndCircleContact)); + return new (mem) b2ChainAndCircleContact(fixtureA, indexA, fixtureB, indexB); +} + +void b2ChainAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2ChainAndCircleContact*)contact)->~b2ChainAndCircleContact(); + allocator->Free(contact, sizeof(b2ChainAndCircleContact)); +} + +b2ChainAndCircleContact::b2ChainAndCircleContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB) +: b2Contact(fixtureA, indexA, fixtureB, indexB) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_chain); + b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); +} + +void b2ChainAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2ChainShape* chain = (b2ChainShape*)m_fixtureA->GetShape(); + b2EdgeShape edge; + chain->GetChildEdge(&edge, m_indexA); + b2CollideEdgeAndCircle( manifold, &edge, xfA, + (b2CircleShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h new file mode 100755 index 00000000..b93c30ed --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_CHAIN_AND_CIRCLE_CONTACT_H +#define B2_CHAIN_AND_CIRCLE_CONTACT_H + +#include + +class b2BlockAllocator; + +class b2ChainAndCircleContact : public b2Contact +{ +public: + static b2Contact* Create( b2Fixture* fixtureA, int32 indexA, + b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2ChainAndCircleContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB); + ~b2ChainAndCircleContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp new file mode 100755 index 00000000..4642fa46 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include + +#include + +b2Contact* b2ChainAndPolygonContact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2ChainAndPolygonContact)); + return new (mem) b2ChainAndPolygonContact(fixtureA, indexA, fixtureB, indexB); +} + +void b2ChainAndPolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2ChainAndPolygonContact*)contact)->~b2ChainAndPolygonContact(); + allocator->Free(contact, sizeof(b2ChainAndPolygonContact)); +} + +b2ChainAndPolygonContact::b2ChainAndPolygonContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB) +: b2Contact(fixtureA, indexA, fixtureB, indexB) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_chain); + b2Assert(m_fixtureB->GetType() == b2Shape::e_polygon); +} + +void b2ChainAndPolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2ChainShape* chain = (b2ChainShape*)m_fixtureA->GetShape(); + b2EdgeShape edge; + chain->GetChildEdge(&edge, m_indexA); + b2CollideEdgeAndPolygon( manifold, &edge, xfA, + (b2PolygonShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h new file mode 100755 index 00000000..0c09af68 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_CHAIN_AND_POLYGON_CONTACT_H +#define B2_CHAIN_AND_POLYGON_CONTACT_H + +#include + +class b2BlockAllocator; + +class b2ChainAndPolygonContact : public b2Contact +{ +public: + static b2Contact* Create( b2Fixture* fixtureA, int32 indexA, + b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2ChainAndPolygonContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB); + ~b2ChainAndPolygonContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.cpp new file mode 100755 index 00000000..b47f35ae --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include +#include + +#include + +b2Contact* b2CircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2CircleContact)); + return new (mem) b2CircleContact(fixtureA, fixtureB); +} + +void b2CircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2CircleContact*)contact)->~b2CircleContact(); + allocator->Free(contact, sizeof(b2CircleContact)); +} + +b2CircleContact::b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) + : b2Contact(fixtureA, 0, fixtureB, 0) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_circle); + b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); +} + +void b2CircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2CollideCircles(manifold, + (b2CircleShape*)m_fixtureA->GetShape(), xfA, + (b2CircleShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.h new file mode 100755 index 00000000..079d3abc --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2CircleContact.h @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_CIRCLE_CONTACT_H +#define B2_CIRCLE_CONTACT_H + +#include + +class b2BlockAllocator; + +class b2CircleContact : public b2Contact +{ +public: + static b2Contact* Create( b2Fixture* fixtureA, int32 indexA, + b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2CircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2CircleContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2Contact.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2Contact.cpp new file mode 100755 index 00000000..d9f1021e --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2Contact.cpp @@ -0,0 +1,247 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +b2ContactRegister b2Contact::s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount]; +bool b2Contact::s_initialized = false; + +void b2Contact::InitializeRegisters() +{ + AddType(b2CircleContact::Create, b2CircleContact::Destroy, b2Shape::e_circle, b2Shape::e_circle); + AddType(b2PolygonAndCircleContact::Create, b2PolygonAndCircleContact::Destroy, b2Shape::e_polygon, b2Shape::e_circle); + AddType(b2PolygonContact::Create, b2PolygonContact::Destroy, b2Shape::e_polygon, b2Shape::e_polygon); + AddType(b2EdgeAndCircleContact::Create, b2EdgeAndCircleContact::Destroy, b2Shape::e_edge, b2Shape::e_circle); + AddType(b2EdgeAndPolygonContact::Create, b2EdgeAndPolygonContact::Destroy, b2Shape::e_edge, b2Shape::e_polygon); + AddType(b2ChainAndCircleContact::Create, b2ChainAndCircleContact::Destroy, b2Shape::e_chain, b2Shape::e_circle); + AddType(b2ChainAndPolygonContact::Create, b2ChainAndPolygonContact::Destroy, b2Shape::e_chain, b2Shape::e_polygon); +} + +void b2Contact::AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destoryFcn, + b2Shape::Type type1, b2Shape::Type type2) +{ + b2Assert(0 <= type1 && type1 < b2Shape::e_typeCount); + b2Assert(0 <= type2 && type2 < b2Shape::e_typeCount); + + s_registers[type1][type2].createFcn = createFcn; + s_registers[type1][type2].destroyFcn = destoryFcn; + s_registers[type1][type2].primary = true; + + if (type1 != type2) + { + s_registers[type2][type1].createFcn = createFcn; + s_registers[type2][type1].destroyFcn = destoryFcn; + s_registers[type2][type1].primary = false; + } +} + +b2Contact* b2Contact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator) +{ + if (s_initialized == false) + { + InitializeRegisters(); + s_initialized = true; + } + + b2Shape::Type type1 = fixtureA->GetType(); + b2Shape::Type type2 = fixtureB->GetType(); + + b2Assert(0 <= type1 && type1 < b2Shape::e_typeCount); + b2Assert(0 <= type2 && type2 < b2Shape::e_typeCount); + + b2ContactCreateFcn* createFcn = s_registers[type1][type2].createFcn; + if (createFcn) + { + if (s_registers[type1][type2].primary) + { + return createFcn(fixtureA, indexA, fixtureB, indexB, allocator); + } + else + { + return createFcn(fixtureB, indexB, fixtureA, indexA, allocator); + } + } + else + { + return NULL; + } +} + +void b2Contact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + b2Assert(s_initialized == true); + + b2Fixture* fixtureA = contact->m_fixtureA; + b2Fixture* fixtureB = contact->m_fixtureB; + + if (contact->m_manifold.pointCount > 0 && + fixtureA->IsSensor() == false && + fixtureB->IsSensor() == false) + { + fixtureA->GetBody()->SetAwake(true); + fixtureB->GetBody()->SetAwake(true); + } + + b2Shape::Type typeA = fixtureA->GetType(); + b2Shape::Type typeB = fixtureB->GetType(); + + b2Assert(0 <= typeA && typeB < b2Shape::e_typeCount); + b2Assert(0 <= typeA && typeB < b2Shape::e_typeCount); + + b2ContactDestroyFcn* destroyFcn = s_registers[typeA][typeB].destroyFcn; + destroyFcn(contact, allocator); +} + +b2Contact::b2Contact(b2Fixture* fA, int32 indexA, b2Fixture* fB, int32 indexB) +{ + m_flags = e_enabledFlag; + + m_fixtureA = fA; + m_fixtureB = fB; + + m_indexA = indexA; + m_indexB = indexB; + + m_manifold.pointCount = 0; + + m_prev = NULL; + m_next = NULL; + + m_nodeA.contact = NULL; + m_nodeA.prev = NULL; + m_nodeA.next = NULL; + m_nodeA.other = NULL; + + m_nodeB.contact = NULL; + m_nodeB.prev = NULL; + m_nodeB.next = NULL; + m_nodeB.other = NULL; + + m_toiCount = 0; + + m_friction = b2MixFriction(m_fixtureA->m_friction, m_fixtureB->m_friction); + m_restitution = b2MixRestitution(m_fixtureA->m_restitution, m_fixtureB->m_restitution); + + m_tangentSpeed = 0.0f; +} + +// Update the contact manifold and touching status. +// Note: do not assume the fixture AABBs are overlapping or are valid. +void b2Contact::Update(b2ContactListener* listener) +{ + b2Manifold oldManifold = m_manifold; + + // Re-enable this contact. + m_flags |= e_enabledFlag; + + bool touching = false; + bool wasTouching = (m_flags & e_touchingFlag) == e_touchingFlag; + + bool sensorA = m_fixtureA->IsSensor(); + bool sensorB = m_fixtureB->IsSensor(); + bool sensor = sensorA || sensorB; + + b2Body* bodyA = m_fixtureA->GetBody(); + b2Body* bodyB = m_fixtureB->GetBody(); + const b2Transform& xfA = bodyA->GetTransform(); + const b2Transform& xfB = bodyB->GetTransform(); + + // Is this contact a sensor? + if (sensor) + { + const b2Shape* shapeA = m_fixtureA->GetShape(); + const b2Shape* shapeB = m_fixtureB->GetShape(); + touching = b2TestOverlap(shapeA, m_indexA, shapeB, m_indexB, xfA, xfB); + + // Sensors don't generate manifolds. + m_manifold.pointCount = 0; + } + else + { + Evaluate(&m_manifold, xfA, xfB); + touching = m_manifold.pointCount > 0; + + // Match old contact ids to new contact ids and copy the + // stored impulses to warm start the solver. + for (int32 i = 0; i < m_manifold.pointCount; ++i) + { + b2ManifoldPoint* mp2 = m_manifold.points + i; + mp2->normalImpulse = 0.0f; + mp2->tangentImpulse = 0.0f; + b2ContactID id2 = mp2->id; + + for (int32 j = 0; j < oldManifold.pointCount; ++j) + { + b2ManifoldPoint* mp1 = oldManifold.points + j; + + if (mp1->id.key == id2.key) + { + mp2->normalImpulse = mp1->normalImpulse; + mp2->tangentImpulse = mp1->tangentImpulse; + break; + } + } + } + + if (touching != wasTouching) + { + bodyA->SetAwake(true); + bodyB->SetAwake(true); + } + } + + if (touching) + { + m_flags |= e_touchingFlag; + } + else + { + m_flags &= ~e_touchingFlag; + } + + if (wasTouching == false && touching == true && listener) + { + listener->BeginContact(this); + } + + if (wasTouching == true && touching == false && listener) + { + listener->EndContact(this); + } + + if (sensor == false && touching && listener) + { + listener->PreSolve(this, &oldManifold); + } +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2Contact.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2Contact.h new file mode 100755 index 00000000..36e31e25 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2Contact.h @@ -0,0 +1,349 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_CONTACT_H +#define B2_CONTACT_H + +#include +#include +#include +#include + +class b2Body; +class b2Contact; +class b2Fixture; +class b2World; +class b2BlockAllocator; +class b2StackAllocator; +class b2ContactListener; + +/// Friction mixing law. The idea is to allow either fixture to drive the restitution to zero. +/// For example, anything slides on ice. +inline float32 b2MixFriction(float32 friction1, float32 friction2) +{ + return b2Sqrt(friction1 * friction2); +} + +/// Restitution mixing law. The idea is allow for anything to bounce off an inelastic surface. +/// For example, a superball bounces on anything. +inline float32 b2MixRestitution(float32 restitution1, float32 restitution2) +{ + return restitution1 > restitution2 ? restitution1 : restitution2; +} + +typedef b2Contact* b2ContactCreateFcn( b2Fixture* fixtureA, int32 indexA, + b2Fixture* fixtureB, int32 indexB, + b2BlockAllocator* allocator); +typedef void b2ContactDestroyFcn(b2Contact* contact, b2BlockAllocator* allocator); + +struct b2ContactRegister +{ + b2ContactCreateFcn* createFcn; + b2ContactDestroyFcn* destroyFcn; + bool primary; +}; + +/// A contact edge is used to connect bodies and contacts together +/// in a contact graph where each body is a node and each contact +/// is an edge. A contact edge belongs to a doubly linked list +/// maintained in each attached body. Each contact has two contact +/// nodes, one for each attached body. +struct b2ContactEdge +{ + b2Body* other; ///< provides quick access to the other body attached. + b2Contact* contact; ///< the contact + b2ContactEdge* prev; ///< the previous contact edge in the body's contact list + b2ContactEdge* next; ///< the next contact edge in the body's contact list +}; + +/// The class manages contact between two shapes. A contact exists for each overlapping +/// AABB in the broad-phase (except if filtered). Therefore a contact object may exist +/// that has no contact points. +class b2Contact +{ +public: + + /// Get the contact manifold. Do not modify the manifold unless you understand the + /// internals of Box2D. + b2Manifold* GetManifold(); + const b2Manifold* GetManifold() const; + + /// Get the world manifold. + void GetWorldManifold(b2WorldManifold* worldManifold) const; + + /// Is this contact touching? + bool IsTouching() const; + + /// Enable/disable this contact. This can be used inside the pre-solve + /// contact listener. The contact is only disabled for the current + /// time step (or sub-step in continuous collisions). + void SetEnabled(bool flag); + + /// Has this contact been disabled? + bool IsEnabled() const; + + /// Get the next contact in the world's contact list. + b2Contact* GetNext(); + const b2Contact* GetNext() const; + + /// Get fixture A in this contact. + b2Fixture* GetFixtureA(); + const b2Fixture* GetFixtureA() const; + + /// Get the child primitive index for fixture A. + int32 GetChildIndexA() const; + + /// Get fixture B in this contact. + b2Fixture* GetFixtureB(); + const b2Fixture* GetFixtureB() const; + + /// Get the child primitive index for fixture B. + int32 GetChildIndexB() const; + + /// Override the default friction mixture. You can call this in b2ContactListener::PreSolve. + /// This value persists until set or reset. + void SetFriction(float32 friction); + + /// Get the friction. + float32 GetFriction() const; + + /// Reset the friction mixture to the default value. + void ResetFriction(); + + /// Override the default restitution mixture. You can call this in b2ContactListener::PreSolve. + /// The value persists until you set or reset. + void SetRestitution(float32 restitution); + + /// Get the restitution. + float32 GetRestitution() const; + + /// Reset the restitution to the default value. + void ResetRestitution(); + + /// Set the desired tangent speed for a conveyor belt behavior. In meters per second. + void SetTangentSpeed(float32 speed); + + /// Get the desired tangent speed. In meters per second. + float32 GetTangentSpeed() const; + + /// Evaluate this contact with your own manifold and transforms. + virtual void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) = 0; + +protected: + friend class b2ContactManager; + friend class b2World; + friend class b2ContactSolver; + friend class b2Body; + friend class b2Fixture; + + // Flags stored in m_flags + enum + { + // Used when crawling contact graph when forming islands. + e_islandFlag = 0x0001, + + // Set when the shapes are touching. + e_touchingFlag = 0x0002, + + // This contact can be disabled (by user) + e_enabledFlag = 0x0004, + + // This contact needs filtering because a fixture filter was changed. + e_filterFlag = 0x0008, + + // This bullet contact had a TOI event + e_bulletHitFlag = 0x0010, + + // This contact has a valid TOI in m_toi + e_toiFlag = 0x0020 + }; + + /// Flag this contact for filtering. Filtering will occur the next time step. + void FlagForFiltering(); + + static void AddType(b2ContactCreateFcn* createFcn, b2ContactDestroyFcn* destroyFcn, + b2Shape::Type typeA, b2Shape::Type typeB); + static void InitializeRegisters(); + static b2Contact* Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2Shape::Type typeA, b2Shape::Type typeB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2Contact() : m_fixtureA(NULL), m_fixtureB(NULL) {} + b2Contact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB); + virtual ~b2Contact() {} + + void Update(b2ContactListener* listener); + + static b2ContactRegister s_registers[b2Shape::e_typeCount][b2Shape::e_typeCount]; + static bool s_initialized; + + uint32 m_flags; + + // World pool and list pointers. + b2Contact* m_prev; + b2Contact* m_next; + + // Nodes for connecting bodies. + b2ContactEdge m_nodeA; + b2ContactEdge m_nodeB; + + b2Fixture* m_fixtureA; + b2Fixture* m_fixtureB; + + int32 m_indexA; + int32 m_indexB; + + b2Manifold m_manifold; + + int32 m_toiCount; + float32 m_toi; + + float32 m_friction; + float32 m_restitution; + + float32 m_tangentSpeed; +}; + +inline b2Manifold* b2Contact::GetManifold() +{ + return &m_manifold; +} + +inline const b2Manifold* b2Contact::GetManifold() const +{ + return &m_manifold; +} + +inline void b2Contact::GetWorldManifold(b2WorldManifold* worldManifold) const +{ + const b2Body* bodyA = m_fixtureA->GetBody(); + const b2Body* bodyB = m_fixtureB->GetBody(); + const b2Shape* shapeA = m_fixtureA->GetShape(); + const b2Shape* shapeB = m_fixtureB->GetShape(); + + worldManifold->Initialize(&m_manifold, bodyA->GetTransform(), shapeA->m_radius, bodyB->GetTransform(), shapeB->m_radius); +} + +inline void b2Contact::SetEnabled(bool flag) +{ + if (flag) + { + m_flags |= e_enabledFlag; + } + else + { + m_flags &= ~e_enabledFlag; + } +} + +inline bool b2Contact::IsEnabled() const +{ + return (m_flags & e_enabledFlag) == e_enabledFlag; +} + +inline bool b2Contact::IsTouching() const +{ + return (m_flags & e_touchingFlag) == e_touchingFlag; +} + +inline b2Contact* b2Contact::GetNext() +{ + return m_next; +} + +inline const b2Contact* b2Contact::GetNext() const +{ + return m_next; +} + +inline b2Fixture* b2Contact::GetFixtureA() +{ + return m_fixtureA; +} + +inline const b2Fixture* b2Contact::GetFixtureA() const +{ + return m_fixtureA; +} + +inline b2Fixture* b2Contact::GetFixtureB() +{ + return m_fixtureB; +} + +inline int32 b2Contact::GetChildIndexA() const +{ + return m_indexA; +} + +inline const b2Fixture* b2Contact::GetFixtureB() const +{ + return m_fixtureB; +} + +inline int32 b2Contact::GetChildIndexB() const +{ + return m_indexB; +} + +inline void b2Contact::FlagForFiltering() +{ + m_flags |= e_filterFlag; +} + +inline void b2Contact::SetFriction(float32 friction) +{ + m_friction = friction; +} + +inline float32 b2Contact::GetFriction() const +{ + return m_friction; +} + +inline void b2Contact::ResetFriction() +{ + m_friction = b2MixFriction(m_fixtureA->m_friction, m_fixtureB->m_friction); +} + +inline void b2Contact::SetRestitution(float32 restitution) +{ + m_restitution = restitution; +} + +inline float32 b2Contact::GetRestitution() const +{ + return m_restitution; +} + +inline void b2Contact::ResetRestitution() +{ + m_restitution = b2MixRestitution(m_fixtureA->m_restitution, m_fixtureB->m_restitution); +} + +inline void b2Contact::SetTangentSpeed(float32 speed) +{ + m_tangentSpeed = speed; +} + +inline float32 b2Contact::GetTangentSpeed() const +{ + return m_tangentSpeed; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.cpp new file mode 100755 index 00000000..8224fdc2 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.cpp @@ -0,0 +1,833 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 + +#include +#include +#include +#include +#include + +#define B2_DEBUG_SOLVER 0 + +struct b2ContactPositionConstraint +{ + b2Vec2 localPoints[b2_maxManifoldPoints]; + b2Vec2 localNormal; + b2Vec2 localPoint; + int32 indexA; + int32 indexB; + float32 invMassA, invMassB; + b2Vec2 localCenterA, localCenterB; + float32 invIA, invIB; + b2Manifold::Type type; + float32 radiusA, radiusB; + int32 pointCount; +}; + +b2ContactSolver::b2ContactSolver(b2ContactSolverDef* def) +{ + m_step = def->step; + m_allocator = def->allocator; + m_count = def->count; + m_positionConstraints = (b2ContactPositionConstraint*)m_allocator->Allocate(m_count * sizeof(b2ContactPositionConstraint)); + m_velocityConstraints = (b2ContactVelocityConstraint*)m_allocator->Allocate(m_count * sizeof(b2ContactVelocityConstraint)); + m_positions = def->positions; + m_velocities = def->velocities; + m_contacts = def->contacts; + + // Initialize position independent portions of the constraints. + for (int32 i = 0; i < m_count; ++i) + { + b2Contact* contact = m_contacts[i]; + + b2Fixture* fixtureA = contact->m_fixtureA; + b2Fixture* fixtureB = contact->m_fixtureB; + b2Shape* shapeA = fixtureA->GetShape(); + b2Shape* shapeB = fixtureB->GetShape(); + float32 radiusA = shapeA->m_radius; + float32 radiusB = shapeB->m_radius; + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + b2Manifold* manifold = contact->GetManifold(); + + int32 pointCount = manifold->pointCount; + b2Assert(pointCount > 0); + + b2ContactVelocityConstraint* vc = m_velocityConstraints + i; + vc->friction = contact->m_friction; + vc->restitution = contact->m_restitution; + vc->tangentSpeed = contact->m_tangentSpeed; + vc->indexA = bodyA->m_islandIndex; + vc->indexB = bodyB->m_islandIndex; + vc->invMassA = bodyA->m_invMass; + vc->invMassB = bodyB->m_invMass; + vc->invIA = bodyA->m_invI; + vc->invIB = bodyB->m_invI; + vc->contactIndex = i; + vc->pointCount = pointCount; + vc->K.SetZero(); + vc->normalMass.SetZero(); + + b2ContactPositionConstraint* pc = m_positionConstraints + i; + pc->indexA = bodyA->m_islandIndex; + pc->indexB = bodyB->m_islandIndex; + pc->invMassA = bodyA->m_invMass; + pc->invMassB = bodyB->m_invMass; + pc->localCenterA = bodyA->m_sweep.localCenter; + pc->localCenterB = bodyB->m_sweep.localCenter; + pc->invIA = bodyA->m_invI; + pc->invIB = bodyB->m_invI; + pc->localNormal = manifold->localNormal; + pc->localPoint = manifold->localPoint; + pc->pointCount = pointCount; + pc->radiusA = radiusA; + pc->radiusB = radiusB; + pc->type = manifold->type; + + for (int32 j = 0; j < pointCount; ++j) + { + b2ManifoldPoint* cp = manifold->points + j; + b2VelocityConstraintPoint* vcp = vc->points + j; + + if (m_step.warmStarting) + { + vcp->normalImpulse = m_step.dtRatio * cp->normalImpulse; + vcp->tangentImpulse = m_step.dtRatio * cp->tangentImpulse; + } + else + { + vcp->normalImpulse = 0.0f; + vcp->tangentImpulse = 0.0f; + } + + vcp->rA.SetZero(); + vcp->rB.SetZero(); + vcp->normalMass = 0.0f; + vcp->tangentMass = 0.0f; + vcp->velocityBias = 0.0f; + + pc->localPoints[j] = cp->localPoint; + } + } +} + +b2ContactSolver::~b2ContactSolver() +{ + m_allocator->Free(m_velocityConstraints); + m_allocator->Free(m_positionConstraints); +} + +// Initialize position dependent portions of the velocity constraints. +void b2ContactSolver::InitializeVelocityConstraints() +{ + for (int32 i = 0; i < m_count; ++i) + { + b2ContactVelocityConstraint* vc = m_velocityConstraints + i; + b2ContactPositionConstraint* pc = m_positionConstraints + i; + + float32 radiusA = pc->radiusA; + float32 radiusB = pc->radiusB; + b2Manifold* manifold = m_contacts[vc->contactIndex]->GetManifold(); + + int32 indexA = vc->indexA; + int32 indexB = vc->indexB; + + float32 mA = vc->invMassA; + float32 mB = vc->invMassB; + float32 iA = vc->invIA; + float32 iB = vc->invIB; + b2Vec2 localCenterA = pc->localCenterA; + b2Vec2 localCenterB = pc->localCenterB; + + b2Vec2 cA = m_positions[indexA].c; + float32 aA = m_positions[indexA].a; + b2Vec2 vA = m_velocities[indexA].v; + float32 wA = m_velocities[indexA].w; + + b2Vec2 cB = m_positions[indexB].c; + float32 aB = m_positions[indexB].a; + b2Vec2 vB = m_velocities[indexB].v; + float32 wB = m_velocities[indexB].w; + + b2Assert(manifold->pointCount > 0); + + b2Transform xfA, xfB; + xfA.q.Set(aA); + xfB.q.Set(aB); + xfA.p = cA - b2Mul(xfA.q, localCenterA); + xfB.p = cB - b2Mul(xfB.q, localCenterB); + + b2WorldManifold worldManifold; + worldManifold.Initialize(manifold, xfA, radiusA, xfB, radiusB); + + vc->normal = worldManifold.normal; + + int32 pointCount = vc->pointCount; + for (int32 j = 0; j < pointCount; ++j) + { + b2VelocityConstraintPoint* vcp = vc->points + j; + + vcp->rA = worldManifold.points[j] - cA; + vcp->rB = worldManifold.points[j] - cB; + + float32 rnA = b2Cross(vcp->rA, vc->normal); + float32 rnB = b2Cross(vcp->rB, vc->normal); + + float32 kNormal = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + + vcp->normalMass = kNormal > 0.0f ? 1.0f / kNormal : 0.0f; + + b2Vec2 tangent = b2Cross(vc->normal, 1.0f); + + float32 rtA = b2Cross(vcp->rA, tangent); + float32 rtB = b2Cross(vcp->rB, tangent); + + float32 kTangent = mA + mB + iA * rtA * rtA + iB * rtB * rtB; + + vcp->tangentMass = kTangent > 0.0f ? 1.0f / kTangent : 0.0f; + + // Setup a velocity bias for restitution. + vcp->velocityBias = 0.0f; + float32 vRel = b2Dot(vc->normal, vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA)); + if (vRel < -b2_velocityThreshold) + { + vcp->velocityBias = -vc->restitution * vRel; + } + } + + // If we have two points, then prepare the block solver. + if (vc->pointCount == 2) + { + b2VelocityConstraintPoint* vcp1 = vc->points + 0; + b2VelocityConstraintPoint* vcp2 = vc->points + 1; + + float32 rn1A = b2Cross(vcp1->rA, vc->normal); + float32 rn1B = b2Cross(vcp1->rB, vc->normal); + float32 rn2A = b2Cross(vcp2->rA, vc->normal); + float32 rn2B = b2Cross(vcp2->rB, vc->normal); + + float32 k11 = mA + mB + iA * rn1A * rn1A + iB * rn1B * rn1B; + float32 k22 = mA + mB + iA * rn2A * rn2A + iB * rn2B * rn2B; + float32 k12 = mA + mB + iA * rn1A * rn2A + iB * rn1B * rn2B; + + // Ensure a reasonable condition number. + const float32 k_maxConditionNumber = 1000.0f; + if (k11 * k11 < k_maxConditionNumber * (k11 * k22 - k12 * k12)) + { + // K is safe to invert. + vc->K.ex.Set(k11, k12); + vc->K.ey.Set(k12, k22); + vc->normalMass = vc->K.GetInverse(); + } + else + { + // The constraints are redundant, just use one. + // TODO_ERIN use deepest? + vc->pointCount = 1; + } + } + } +} + +void b2ContactSolver::WarmStart() +{ + // Warm start. + for (int32 i = 0; i < m_count; ++i) + { + b2ContactVelocityConstraint* vc = m_velocityConstraints + i; + + int32 indexA = vc->indexA; + int32 indexB = vc->indexB; + float32 mA = vc->invMassA; + float32 iA = vc->invIA; + float32 mB = vc->invMassB; + float32 iB = vc->invIB; + int32 pointCount = vc->pointCount; + + b2Vec2 vA = m_velocities[indexA].v; + float32 wA = m_velocities[indexA].w; + b2Vec2 vB = m_velocities[indexB].v; + float32 wB = m_velocities[indexB].w; + + b2Vec2 normal = vc->normal; + b2Vec2 tangent = b2Cross(normal, 1.0f); + + for (int32 j = 0; j < pointCount; ++j) + { + b2VelocityConstraintPoint* vcp = vc->points + j; + b2Vec2 P = vcp->normalImpulse * normal + vcp->tangentImpulse * tangent; + wA -= iA * b2Cross(vcp->rA, P); + vA -= mA * P; + wB += iB * b2Cross(vcp->rB, P); + vB += mB * P; + } + + m_velocities[indexA].v = vA; + m_velocities[indexA].w = wA; + m_velocities[indexB].v = vB; + m_velocities[indexB].w = wB; + } +} + +void b2ContactSolver::SolveVelocityConstraints() +{ + for (int32 i = 0; i < m_count; ++i) + { + b2ContactVelocityConstraint* vc = m_velocityConstraints + i; + + int32 indexA = vc->indexA; + int32 indexB = vc->indexB; + float32 mA = vc->invMassA; + float32 iA = vc->invIA; + float32 mB = vc->invMassB; + float32 iB = vc->invIB; + int32 pointCount = vc->pointCount; + + b2Vec2 vA = m_velocities[indexA].v; + float32 wA = m_velocities[indexA].w; + b2Vec2 vB = m_velocities[indexB].v; + float32 wB = m_velocities[indexB].w; + + b2Vec2 normal = vc->normal; + b2Vec2 tangent = b2Cross(normal, 1.0f); + float32 friction = vc->friction; + + b2Assert(pointCount == 1 || pointCount == 2); + + // Solve tangent constraints first because non-penetration is more important + // than friction. + for (int32 j = 0; j < pointCount; ++j) + { + b2VelocityConstraintPoint* vcp = vc->points + j; + + // Relative velocity at contact + b2Vec2 dv = vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA); + + // Compute tangent force + float32 vt = b2Dot(dv, tangent) - vc->tangentSpeed; + float32 lambda = vcp->tangentMass * (-vt); + + // b2Clamp the accumulated force + float32 maxFriction = friction * vcp->normalImpulse; + float32 newImpulse = b2Clamp(vcp->tangentImpulse + lambda, -maxFriction, maxFriction); + lambda = newImpulse - vcp->tangentImpulse; + vcp->tangentImpulse = newImpulse; + + // Apply contact impulse + b2Vec2 P = lambda * tangent; + + vA -= mA * P; + wA -= iA * b2Cross(vcp->rA, P); + + vB += mB * P; + wB += iB * b2Cross(vcp->rB, P); + } + + // Solve normal constraints + if (vc->pointCount == 1) + { + b2VelocityConstraintPoint* vcp = vc->points + 0; + + // Relative velocity at contact + b2Vec2 dv = vB + b2Cross(wB, vcp->rB) - vA - b2Cross(wA, vcp->rA); + + // Compute normal impulse + float32 vn = b2Dot(dv, normal); + float32 lambda = -vcp->normalMass * (vn - vcp->velocityBias); + + // b2Clamp the accumulated impulse + float32 newImpulse = b2Max(vcp->normalImpulse + lambda, 0.0f); + lambda = newImpulse - vcp->normalImpulse; + vcp->normalImpulse = newImpulse; + + // Apply contact impulse + b2Vec2 P = lambda * normal; + vA -= mA * P; + wA -= iA * b2Cross(vcp->rA, P); + + vB += mB * P; + wB += iB * b2Cross(vcp->rB, P); + } + else + { + // Block solver developed in collaboration with Dirk Gregorius (back in 01/07 on Box2D_Lite). + // Build the mini LCP for this contact patch + // + // vn = A * x + b, vn >= 0, , vn >= 0, x >= 0 and vn_i * x_i = 0 with i = 1..2 + // + // A = J * W * JT and J = ( -n, -r1 x n, n, r2 x n ) + // b = vn0 - velocityBias + // + // The system is solved using the "Total enumeration method" (s. Murty). The complementary constraint vn_i * x_i + // implies that we must have in any solution either vn_i = 0 or x_i = 0. So for the 2D contact problem the cases + // vn1 = 0 and vn2 = 0, x1 = 0 and x2 = 0, x1 = 0 and vn2 = 0, x2 = 0 and vn1 = 0 need to be tested. The first valid + // solution that satisfies the problem is chosen. + // + // In order to account of the accumulated impulse 'a' (because of the iterative nature of the solver which only requires + // that the accumulated impulse is clamped and not the incremental impulse) we change the impulse variable (x_i). + // + // Substitute: + // + // x = a + d + // + // a := old total impulse + // x := new total impulse + // d := incremental impulse + // + // For the current iteration we extend the formula for the incremental impulse + // to compute the new total impulse: + // + // vn = A * d + b + // = A * (x - a) + b + // = A * x + b - A * a + // = A * x + b' + // b' = b - A * a; + + b2VelocityConstraintPoint* cp1 = vc->points + 0; + b2VelocityConstraintPoint* cp2 = vc->points + 1; + + b2Vec2 a(cp1->normalImpulse, cp2->normalImpulse); + b2Assert(a.x >= 0.0f && a.y >= 0.0f); + + // Relative velocity at contact + b2Vec2 dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); + b2Vec2 dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); + + // Compute normal velocity + float32 vn1 = b2Dot(dv1, normal); + float32 vn2 = b2Dot(dv2, normal); + + b2Vec2 b; + b.x = vn1 - cp1->velocityBias; + b.y = vn2 - cp2->velocityBias; + + // Compute b' + b -= b2Mul(vc->K, a); + + const float32 k_errorTol = 1e-3f; + B2_NOT_USED(k_errorTol); + + for (;;) + { + // + // Case 1: vn = 0 + // + // 0 = A * x + b' + // + // Solve for x: + // + // x = - inv(A) * b' + // + b2Vec2 x = - b2Mul(vc->normalMass, b); + + if (x.x >= 0.0f && x.y >= 0.0f) + { + // Get the incremental impulse + b2Vec2 d = x - a; + + // Apply incremental impulse + b2Vec2 P1 = d.x * normal; + b2Vec2 P2 = d.y * normal; + vA -= mA * (P1 + P2); + wA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += mB * (P1 + P2); + wB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + + // Accumulate + cp1->normalImpulse = x.x; + cp2->normalImpulse = x.y; + +#if B2_DEBUG_SOLVER == 1 + // Postconditions + dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); + dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); + + // Compute normal velocity + vn1 = b2Dot(dv1, normal); + vn2 = b2Dot(dv2, normal); + + b2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol); + b2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol); +#endif + break; + } + + // + // Case 2: vn1 = 0 and x2 = 0 + // + // 0 = a11 * x1 + a12 * 0 + b1' + // vn2 = a21 * x1 + a22 * 0 + b2' + // + x.x = - cp1->normalMass * b.x; + x.y = 0.0f; + vn1 = 0.0f; + vn2 = vc->K.ex.y * x.x + b.y; + + if (x.x >= 0.0f && vn2 >= 0.0f) + { + // Get the incremental impulse + b2Vec2 d = x - a; + + // Apply incremental impulse + b2Vec2 P1 = d.x * normal; + b2Vec2 P2 = d.y * normal; + vA -= mA * (P1 + P2); + wA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += mB * (P1 + P2); + wB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + + // Accumulate + cp1->normalImpulse = x.x; + cp2->normalImpulse = x.y; + +#if B2_DEBUG_SOLVER == 1 + // Postconditions + dv1 = vB + b2Cross(wB, cp1->rB) - vA - b2Cross(wA, cp1->rA); + + // Compute normal velocity + vn1 = b2Dot(dv1, normal); + + b2Assert(b2Abs(vn1 - cp1->velocityBias) < k_errorTol); +#endif + break; + } + + + // + // Case 3: vn2 = 0 and x1 = 0 + // + // vn1 = a11 * 0 + a12 * x2 + b1' + // 0 = a21 * 0 + a22 * x2 + b2' + // + x.x = 0.0f; + x.y = - cp2->normalMass * b.y; + vn1 = vc->K.ey.x * x.y + b.x; + vn2 = 0.0f; + + if (x.y >= 0.0f && vn1 >= 0.0f) + { + // Resubstitute for the incremental impulse + b2Vec2 d = x - a; + + // Apply incremental impulse + b2Vec2 P1 = d.x * normal; + b2Vec2 P2 = d.y * normal; + vA -= mA * (P1 + P2); + wA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += mB * (P1 + P2); + wB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + + // Accumulate + cp1->normalImpulse = x.x; + cp2->normalImpulse = x.y; + +#if B2_DEBUG_SOLVER == 1 + // Postconditions + dv2 = vB + b2Cross(wB, cp2->rB) - vA - b2Cross(wA, cp2->rA); + + // Compute normal velocity + vn2 = b2Dot(dv2, normal); + + b2Assert(b2Abs(vn2 - cp2->velocityBias) < k_errorTol); +#endif + break; + } + + // + // Case 4: x1 = 0 and x2 = 0 + // + // vn1 = b1 + // vn2 = b2; + x.x = 0.0f; + x.y = 0.0f; + vn1 = b.x; + vn2 = b.y; + + if (vn1 >= 0.0f && vn2 >= 0.0f ) + { + // Resubstitute for the incremental impulse + b2Vec2 d = x - a; + + // Apply incremental impulse + b2Vec2 P1 = d.x * normal; + b2Vec2 P2 = d.y * normal; + vA -= mA * (P1 + P2); + wA -= iA * (b2Cross(cp1->rA, P1) + b2Cross(cp2->rA, P2)); + + vB += mB * (P1 + P2); + wB += iB * (b2Cross(cp1->rB, P1) + b2Cross(cp2->rB, P2)); + + // Accumulate + cp1->normalImpulse = x.x; + cp2->normalImpulse = x.y; + + break; + } + + // No solution, give up. This is hit sometimes, but it doesn't seem to matter. + break; + } + } + + m_velocities[indexA].v = vA; + m_velocities[indexA].w = wA; + m_velocities[indexB].v = vB; + m_velocities[indexB].w = wB; + } +} + +void b2ContactSolver::StoreImpulses() +{ + for (int32 i = 0; i < m_count; ++i) + { + b2ContactVelocityConstraint* vc = m_velocityConstraints + i; + b2Manifold* manifold = m_contacts[vc->contactIndex]->GetManifold(); + + for (int32 j = 0; j < vc->pointCount; ++j) + { + manifold->points[j].normalImpulse = vc->points[j].normalImpulse; + manifold->points[j].tangentImpulse = vc->points[j].tangentImpulse; + } + } +} + +struct b2PositionSolverManifold +{ + void Initialize(b2ContactPositionConstraint* pc, const b2Transform& xfA, const b2Transform& xfB, int32 index) + { + b2Assert(pc->pointCount > 0); + + switch (pc->type) + { + case b2Manifold::e_circles: + { + b2Vec2 pointA = b2Mul(xfA, pc->localPoint); + b2Vec2 pointB = b2Mul(xfB, pc->localPoints[0]); + normal = pointB - pointA; + normal.Normalize(); + point = 0.5f * (pointA + pointB); + separation = b2Dot(pointB - pointA, normal) - pc->radiusA - pc->radiusB; + } + break; + + case b2Manifold::e_faceA: + { + normal = b2Mul(xfA.q, pc->localNormal); + b2Vec2 planePoint = b2Mul(xfA, pc->localPoint); + + b2Vec2 clipPoint = b2Mul(xfB, pc->localPoints[index]); + separation = b2Dot(clipPoint - planePoint, normal) - pc->radiusA - pc->radiusB; + point = clipPoint; + } + break; + + case b2Manifold::e_faceB: + { + normal = b2Mul(xfB.q, pc->localNormal); + b2Vec2 planePoint = b2Mul(xfB, pc->localPoint); + + b2Vec2 clipPoint = b2Mul(xfA, pc->localPoints[index]); + separation = b2Dot(clipPoint - planePoint, normal) - pc->radiusA - pc->radiusB; + point = clipPoint; + + // Ensure normal points from A to B + normal = -normal; + } + break; + } + } + + b2Vec2 normal; + b2Vec2 point; + float32 separation; +}; + +// Sequential solver. +bool b2ContactSolver::SolvePositionConstraints() +{ + float32 minSeparation = 0.0f; + + for (int32 i = 0; i < m_count; ++i) + { + b2ContactPositionConstraint* pc = m_positionConstraints + i; + + int32 indexA = pc->indexA; + int32 indexB = pc->indexB; + b2Vec2 localCenterA = pc->localCenterA; + float32 mA = pc->invMassA; + float32 iA = pc->invIA; + b2Vec2 localCenterB = pc->localCenterB; + float32 mB = pc->invMassB; + float32 iB = pc->invIB; + int32 pointCount = pc->pointCount; + + b2Vec2 cA = m_positions[indexA].c; + float32 aA = m_positions[indexA].a; + + b2Vec2 cB = m_positions[indexB].c; + float32 aB = m_positions[indexB].a; + + // Solve normal constraints + for (int32 j = 0; j < pointCount; ++j) + { + b2Transform xfA, xfB; + xfA.q.Set(aA); + xfB.q.Set(aB); + xfA.p = cA - b2Mul(xfA.q, localCenterA); + xfB.p = cB - b2Mul(xfB.q, localCenterB); + + b2PositionSolverManifold psm; + psm.Initialize(pc, xfA, xfB, j); + b2Vec2 normal = psm.normal; + + b2Vec2 point = psm.point; + float32 separation = psm.separation; + + b2Vec2 rA = point - cA; + b2Vec2 rB = point - cB; + + // Track max constraint error. + minSeparation = b2Min(minSeparation, separation); + + // Prevent large corrections and allow slop. + float32 C = b2Clamp(b2_baumgarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); + + // Compute the effective mass. + float32 rnA = b2Cross(rA, normal); + float32 rnB = b2Cross(rB, normal); + float32 K = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + + // Compute normal impulse + float32 impulse = K > 0.0f ? - C / K : 0.0f; + + b2Vec2 P = impulse * normal; + + cA -= mA * P; + aA -= iA * b2Cross(rA, P); + + cB += mB * P; + aB += iB * b2Cross(rB, P); + } + + m_positions[indexA].c = cA; + m_positions[indexA].a = aA; + + m_positions[indexB].c = cB; + m_positions[indexB].a = aB; + } + + // We can't expect minSpeparation >= -b2_linearSlop because we don't + // push the separation above -b2_linearSlop. + return minSeparation >= -3.0f * b2_linearSlop; +} + +// Sequential position solver for position constraints. +bool b2ContactSolver::SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB) +{ + float32 minSeparation = 0.0f; + + for (int32 i = 0; i < m_count; ++i) + { + b2ContactPositionConstraint* pc = m_positionConstraints + i; + + int32 indexA = pc->indexA; + int32 indexB = pc->indexB; + b2Vec2 localCenterA = pc->localCenterA; + b2Vec2 localCenterB = pc->localCenterB; + int32 pointCount = pc->pointCount; + + float32 mA = 0.0f; + float32 iA = 0.0f; + if (indexA == toiIndexA || indexA == toiIndexB) + { + mA = pc->invMassA; + iA = pc->invIA; + } + + float32 mB = 0.0f; + float32 iB = 0.; + if (indexB == toiIndexA || indexB == toiIndexB) + { + mB = pc->invMassB; + iB = pc->invIB; + } + + b2Vec2 cA = m_positions[indexA].c; + float32 aA = m_positions[indexA].a; + + b2Vec2 cB = m_positions[indexB].c; + float32 aB = m_positions[indexB].a; + + // Solve normal constraints + for (int32 j = 0; j < pointCount; ++j) + { + b2Transform xfA, xfB; + xfA.q.Set(aA); + xfB.q.Set(aB); + xfA.p = cA - b2Mul(xfA.q, localCenterA); + xfB.p = cB - b2Mul(xfB.q, localCenterB); + + b2PositionSolverManifold psm; + psm.Initialize(pc, xfA, xfB, j); + b2Vec2 normal = psm.normal; + + b2Vec2 point = psm.point; + float32 separation = psm.separation; + + b2Vec2 rA = point - cA; + b2Vec2 rB = point - cB; + + // Track max constraint error. + minSeparation = b2Min(minSeparation, separation); + + // Prevent large corrections and allow slop. + float32 C = b2Clamp(b2_toiBaugarte * (separation + b2_linearSlop), -b2_maxLinearCorrection, 0.0f); + + // Compute the effective mass. + float32 rnA = b2Cross(rA, normal); + float32 rnB = b2Cross(rB, normal); + float32 K = mA + mB + iA * rnA * rnA + iB * rnB * rnB; + + // Compute normal impulse + float32 impulse = K > 0.0f ? - C / K : 0.0f; + + b2Vec2 P = impulse * normal; + + cA -= mA * P; + aA -= iA * b2Cross(rA, P); + + cB += mB * P; + aB += iB * b2Cross(rB, P); + } + + m_positions[indexA].c = cA; + m_positions[indexA].a = aA; + + m_positions[indexB].c = cB; + m_positions[indexB].a = aB; + } + + // We can't expect minSpeparation >= -b2_linearSlop because we don't + // push the separation above -b2_linearSlop. + return minSeparation >= -1.5f * b2_linearSlop; +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.h new file mode 100755 index 00000000..a622e30d --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2ContactSolver.h @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_CONTACT_SOLVER_H +#define B2_CONTACT_SOLVER_H + +#include +#include +#include + +class b2Contact; +class b2Body; +class b2StackAllocator; +struct b2ContactPositionConstraint; + +struct b2VelocityConstraintPoint +{ + b2Vec2 rA; + b2Vec2 rB; + float32 normalImpulse; + float32 tangentImpulse; + float32 normalMass; + float32 tangentMass; + float32 velocityBias; +}; + +struct b2ContactVelocityConstraint +{ + b2VelocityConstraintPoint points[b2_maxManifoldPoints]; + b2Vec2 normal; + b2Mat22 normalMass; + b2Mat22 K; + int32 indexA; + int32 indexB; + float32 invMassA, invMassB; + float32 invIA, invIB; + float32 friction; + float32 restitution; + float32 tangentSpeed; + int32 pointCount; + int32 contactIndex; +}; + +struct b2ContactSolverDef +{ + b2TimeStep step; + b2Contact** contacts; + int32 count; + b2Position* positions; + b2Velocity* velocities; + b2StackAllocator* allocator; +}; + +class b2ContactSolver +{ +public: + b2ContactSolver(b2ContactSolverDef* def); + ~b2ContactSolver(); + + void InitializeVelocityConstraints(); + + void WarmStart(); + void SolveVelocityConstraints(); + void StoreImpulses(); + + bool SolvePositionConstraints(); + bool SolveTOIPositionConstraints(int32 toiIndexA, int32 toiIndexB); + + b2TimeStep m_step; + b2Position* m_positions; + b2Velocity* m_velocities; + b2StackAllocator* m_allocator; + b2ContactPositionConstraint* m_positionConstraints; + b2ContactVelocityConstraint* m_velocityConstraints; + b2Contact** m_contacts; + int m_count; +}; + +#endif + diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp new file mode 100755 index 00000000..d1fd3295 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.cpp @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +#include + +b2Contact* b2EdgeAndCircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2EdgeAndCircleContact)); + return new (mem) b2EdgeAndCircleContact(fixtureA, fixtureB); +} + +void b2EdgeAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2EdgeAndCircleContact*)contact)->~b2EdgeAndCircleContact(); + allocator->Free(contact, sizeof(b2EdgeAndCircleContact)); +} + +b2EdgeAndCircleContact::b2EdgeAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) +: b2Contact(fixtureA, 0, fixtureB, 0) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_edge); + b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); +} + +void b2EdgeAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2CollideEdgeAndCircle( manifold, + (b2EdgeShape*)m_fixtureA->GetShape(), xfA, + (b2CircleShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h new file mode 100755 index 00000000..e7a34553 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndCircleContact.h @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_EDGE_AND_CIRCLE_CONTACT_H +#define B2_EDGE_AND_CIRCLE_CONTACT_H + +#include + +class b2BlockAllocator; + +class b2EdgeAndCircleContact : public b2Contact +{ +public: + static b2Contact* Create( b2Fixture* fixtureA, int32 indexA, + b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2EdgeAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2EdgeAndCircleContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp new file mode 100755 index 00000000..ba536bc3 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.cpp @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +#include + +b2Contact* b2EdgeAndPolygonContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2EdgeAndPolygonContact)); + return new (mem) b2EdgeAndPolygonContact(fixtureA, fixtureB); +} + +void b2EdgeAndPolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2EdgeAndPolygonContact*)contact)->~b2EdgeAndPolygonContact(); + allocator->Free(contact, sizeof(b2EdgeAndPolygonContact)); +} + +b2EdgeAndPolygonContact::b2EdgeAndPolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB) +: b2Contact(fixtureA, 0, fixtureB, 0) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_edge); + b2Assert(m_fixtureB->GetType() == b2Shape::e_polygon); +} + +void b2EdgeAndPolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2CollideEdgeAndPolygon( manifold, + (b2EdgeShape*)m_fixtureA->GetShape(), xfA, + (b2PolygonShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h new file mode 100755 index 00000000..3b40f121 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2EdgeAndPolygonContact.h @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_EDGE_AND_POLYGON_CONTACT_H +#define B2_EDGE_AND_POLYGON_CONTACT_H + +#include + +class b2BlockAllocator; + +class b2EdgeAndPolygonContact : public b2Contact +{ +public: + static b2Contact* Create( b2Fixture* fixtureA, int32 indexA, + b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2EdgeAndPolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2EdgeAndPolygonContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp new file mode 100755 index 00000000..7c9cbcc9 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.cpp @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +#include + +b2Contact* b2PolygonAndCircleContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2PolygonAndCircleContact)); + return new (mem) b2PolygonAndCircleContact(fixtureA, fixtureB); +} + +void b2PolygonAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2PolygonAndCircleContact*)contact)->~b2PolygonAndCircleContact(); + allocator->Free(contact, sizeof(b2PolygonAndCircleContact)); +} + +b2PolygonAndCircleContact::b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB) +: b2Contact(fixtureA, 0, fixtureB, 0) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); + b2Assert(m_fixtureB->GetType() == b2Shape::e_circle); +} + +void b2PolygonAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2CollidePolygonAndCircle( manifold, + (b2PolygonShape*)m_fixtureA->GetShape(), xfA, + (b2CircleShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h new file mode 100755 index 00000000..fe0645e0 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonAndCircleContact.h @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_POLYGON_AND_CIRCLE_CONTACT_H +#define B2_POLYGON_AND_CIRCLE_CONTACT_H + +#include + +class b2BlockAllocator; + +class b2PolygonAndCircleContact : public b2Contact +{ +public: + static b2Contact* Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2PolygonAndCircleContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2PolygonAndCircleContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.cpp b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.cpp new file mode 100755 index 00000000..b5706ca1 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.cpp @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include +#include + +#include + +b2Contact* b2PolygonContact::Create(b2Fixture* fixtureA, int32, b2Fixture* fixtureB, int32, b2BlockAllocator* allocator) +{ + void* mem = allocator->Allocate(sizeof(b2PolygonContact)); + return new (mem) b2PolygonContact(fixtureA, fixtureB); +} + +void b2PolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator) +{ + ((b2PolygonContact*)contact)->~b2PolygonContact(); + allocator->Free(contact, sizeof(b2PolygonContact)); +} + +b2PolygonContact::b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB) + : b2Contact(fixtureA, 0, fixtureB, 0) +{ + b2Assert(m_fixtureA->GetType() == b2Shape::e_polygon); + b2Assert(m_fixtureB->GetType() == b2Shape::e_polygon); +} + +void b2PolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB) +{ + b2CollidePolygons( manifold, + (b2PolygonShape*)m_fixtureA->GetShape(), xfA, + (b2PolygonShape*)m_fixtureB->GetShape(), xfB); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.h b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.h new file mode 100755 index 00000000..434e6c92 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Contacts/b2PolygonContact.h @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_POLYGON_CONTACT_H +#define B2_POLYGON_CONTACT_H + +#include + +class b2BlockAllocator; + +class b2PolygonContact : public b2Contact +{ +public: + static b2Contact* Create( b2Fixture* fixtureA, int32 indexA, + b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator); + static void Destroy(b2Contact* contact, b2BlockAllocator* allocator); + + b2PolygonContact(b2Fixture* fixtureA, b2Fixture* fixtureB); + ~b2PolygonContact() {} + + void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB); +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.cpp new file mode 100755 index 00000000..ba2b6c00 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.cpp @@ -0,0 +1,260 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// 1-D constrained system +// m (v2 - v1) = lambda +// v2 + (beta/h) * x1 + gamma * lambda = 0, gamma has units of inverse mass. +// x2 = x1 + h * v2 + +// 1-D mass-damper-spring system +// m (v2 - v1) + h * d * v2 + h * k * + +// C = norm(p2 - p1) - L +// u = (p2 - p1) / norm(p2 - p1) +// Cdot = dot(u, v2 + cross(w2, r2) - v1 - cross(w1, r1)) +// J = [-u -cross(r1, u) u cross(r2, u)] +// K = J * invM * JT +// = invMass1 + invI1 * cross(r1, u)^2 + invMass2 + invI2 * cross(r2, u)^2 + +void b2DistanceJointDef::Initialize(b2Body* b1, b2Body* b2, + const b2Vec2& anchor1, const b2Vec2& anchor2) +{ + bodyA = b1; + bodyB = b2; + localAnchorA = bodyA->GetLocalPoint(anchor1); + localAnchorB = bodyB->GetLocalPoint(anchor2); + b2Vec2 d = anchor2 - anchor1; + length = d.Length(); +} + +b2DistanceJoint::b2DistanceJoint(const b2DistanceJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + m_length = def->length; + m_frequencyHz = def->frequencyHz; + m_dampingRatio = def->dampingRatio; + m_impulse = 0.0f; + m_gamma = 0.0f; + m_bias = 0.0f; +} + +void b2DistanceJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + m_rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + m_rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + m_u = cB + m_rB - cA - m_rA; + + // Handle singularity. + float32 length = m_u.Length(); + if (length > b2_linearSlop) + { + m_u *= 1.0f / length; + } + else + { + m_u.Set(0.0f, 0.0f); + } + + float32 crAu = b2Cross(m_rA, m_u); + float32 crBu = b2Cross(m_rB, m_u); + float32 invMass = m_invMassA + m_invIA * crAu * crAu + m_invMassB + m_invIB * crBu * crBu; + + // Compute the effective mass matrix. + m_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f; + + if (m_frequencyHz > 0.0f) + { + float32 C = length - m_length; + + // Frequency + float32 omega = 2.0f * b2_pi * m_frequencyHz; + + // Damping coefficient + float32 d = 2.0f * m_mass * m_dampingRatio * omega; + + // Spring stiffness + float32 k = m_mass * omega * omega; + + // magic formulas + float32 h = data.step.dt; + m_gamma = h * (d + h * k); + m_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f; + m_bias = C * h * k * m_gamma; + + invMass += m_gamma; + m_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f; + } + else + { + m_gamma = 0.0f; + m_bias = 0.0f; + } + + if (data.step.warmStarting) + { + // Scale the impulse to support a variable time step. + m_impulse *= data.step.dtRatio; + + b2Vec2 P = m_impulse * m_u; + vA -= m_invMassA * P; + wA -= m_invIA * b2Cross(m_rA, P); + vB += m_invMassB * P; + wB += m_invIB * b2Cross(m_rB, P); + } + else + { + m_impulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2DistanceJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + // Cdot = dot(u, v + cross(w, r)) + b2Vec2 vpA = vA + b2Cross(wA, m_rA); + b2Vec2 vpB = vB + b2Cross(wB, m_rB); + float32 Cdot = b2Dot(m_u, vpB - vpA); + + float32 impulse = -m_mass * (Cdot + m_bias + m_gamma * m_impulse); + m_impulse += impulse; + + b2Vec2 P = impulse * m_u; + vA -= m_invMassA * P; + wA -= m_invIA * b2Cross(m_rA, P); + vB += m_invMassB * P; + wB += m_invIB * b2Cross(m_rB, P); + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2DistanceJoint::SolvePositionConstraints(const b2SolverData& data) +{ + if (m_frequencyHz > 0.0f) + { + // There is no position correction for soft distance constraints. + return true; + } + + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + + b2Rot qA(aA), qB(aB); + + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + b2Vec2 u = cB + rB - cA - rA; + + float32 length = u.Normalize(); + float32 C = length - m_length; + C = b2Clamp(C, -b2_maxLinearCorrection, b2_maxLinearCorrection); + + float32 impulse = -m_mass * C; + b2Vec2 P = impulse * u; + + cA -= m_invMassA * P; + aA -= m_invIA * b2Cross(rA, P); + cB += m_invMassB * P; + aB += m_invIB * b2Cross(rB, P); + + data.positions[m_indexA].c = cA; + data.positions[m_indexA].a = aA; + data.positions[m_indexB].c = cB; + data.positions[m_indexB].a = aB; + + return b2Abs(C) < b2_linearSlop; +} + +b2Vec2 b2DistanceJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2DistanceJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2DistanceJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 F = (inv_dt * m_impulse) * m_u; + return F; +} + +float32 b2DistanceJoint::GetReactionTorque(float32 inv_dt) const +{ + B2_NOT_USED(inv_dt); + return 0.0f; +} + +void b2DistanceJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2DistanceJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.localAnchorA.Set(%.15lef, %.15lef);\n", m_localAnchorA.x, m_localAnchorA.y); + b2Log(" jd.localAnchorB.Set(%.15lef, %.15lef);\n", m_localAnchorB.x, m_localAnchorB.y); + b2Log(" jd.length = %.15lef;\n", m_length); + b2Log(" jd.frequencyHz = %.15lef;\n", m_frequencyHz); + b2Log(" jd.dampingRatio = %.15lef;\n", m_dampingRatio); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.h new file mode 100755 index 00000000..2faba9d4 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2DistanceJoint.h @@ -0,0 +1,169 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org +* +* 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 B2_DISTANCE_JOINT_H +#define B2_DISTANCE_JOINT_H + +#include + +/// Distance joint definition. This requires defining an +/// anchor point on both bodies and the non-zero length of the +/// distance joint. The definition uses local anchor points +/// so that the initial configuration can violate the constraint +/// slightly. This helps when saving and loading a game. +/// @warning Do not use a zero or short length. +struct b2DistanceJointDef : public b2JointDef +{ + b2DistanceJointDef() + { + type = e_distanceJoint; + localAnchorA.Set(0.0f, 0.0f); + localAnchorB.Set(0.0f, 0.0f); + length = 1.0f; + frequencyHz = 0.0f; + dampingRatio = 0.0f; + } + + /// Initialize the bodies, anchors, and length using the world + /// anchors. + void Initialize(b2Body* bodyA, b2Body* bodyB, + const b2Vec2& anchorA, const b2Vec2& anchorB); + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The natural length between the anchor points. + float32 length; + + /// The mass-spring-damper frequency in Hertz. A value of 0 + /// disables softness. + float32 frequencyHz; + + /// The damping ratio. 0 = no damping, 1 = critical damping. + float32 dampingRatio; +}; + +/// A distance joint constrains two points on two bodies +/// to remain at a fixed distance from each other. You can view +/// this as a massless, rigid rod. +class b2DistanceJoint : public b2Joint +{ +public: + + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + /// Get the reaction force given the inverse time step. + /// Unit is N. + b2Vec2 GetReactionForce(float32 inv_dt) const; + + /// Get the reaction torque given the inverse time step. + /// Unit is N*m. This is always zero for a distance joint. + float32 GetReactionTorque(float32 inv_dt) const; + + /// The local anchor point relative to bodyA's origin. + const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } + + /// The local anchor point relative to bodyB's origin. + const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; } + + /// Set/get the natural length. + /// Manipulating the length can lead to non-physical behavior when the frequency is zero. + void SetLength(float32 length); + float32 GetLength() const; + + /// Set/get frequency in Hz. + void SetFrequency(float32 hz); + float32 GetFrequency() const; + + /// Set/get damping ratio. + void SetDampingRatio(float32 ratio); + float32 GetDampingRatio() const; + + /// Dump joint to dmLog + void Dump(); + +protected: + + friend class b2Joint; + b2DistanceJoint(const b2DistanceJointDef* data); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + float32 m_frequencyHz; + float32 m_dampingRatio; + float32 m_bias; + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + float32 m_gamma; + float32 m_impulse; + float32 m_length; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_u; + b2Vec2 m_rA; + b2Vec2 m_rB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + float32 m_mass; +}; + +inline void b2DistanceJoint::SetLength(float32 length) +{ + m_length = length; +} + +inline float32 b2DistanceJoint::GetLength() const +{ + return m_length; +} + +inline void b2DistanceJoint::SetFrequency(float32 hz) +{ + m_frequencyHz = hz; +} + +inline float32 b2DistanceJoint::GetFrequency() const +{ + return m_frequencyHz; +} + +inline void b2DistanceJoint::SetDampingRatio(float32 ratio) +{ + m_dampingRatio = ratio; +} + +inline float32 b2DistanceJoint::GetDampingRatio() const +{ + return m_dampingRatio; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.cpp new file mode 100755 index 00000000..412d257a --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.cpp @@ -0,0 +1,251 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// Point-to-point constraint +// Cdot = v2 - v1 +// = v2 + cross(w2, r2) - v1 - cross(w1, r1) +// J = [-I -r1_skew I r2_skew ] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +// Angle constraint +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// K = invI1 + invI2 + +void b2FrictionJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor) +{ + bodyA = bA; + bodyB = bB; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); +} + +b2FrictionJoint::b2FrictionJoint(const b2FrictionJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + + m_linearImpulse.SetZero(); + m_angularImpulse = 0.0f; + + m_maxForce = def->maxForce; + m_maxTorque = def->maxTorque; +} + +void b2FrictionJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + // Compute the effective mass matrix. + m_rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + m_rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + b2Mat22 K; + K.ex.x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y; + K.ex.y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x; + + m_linearMass = K.GetInverse(); + + m_angularMass = iA + iB; + if (m_angularMass > 0.0f) + { + m_angularMass = 1.0f / m_angularMass; + } + + if (data.step.warmStarting) + { + // Scale impulses to support a variable time step. + m_linearImpulse *= data.step.dtRatio; + m_angularImpulse *= data.step.dtRatio; + + b2Vec2 P(m_linearImpulse.x, m_linearImpulse.y); + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + m_angularImpulse); + vB += mB * P; + wB += iB * (b2Cross(m_rB, P) + m_angularImpulse); + } + else + { + m_linearImpulse.SetZero(); + m_angularImpulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2FrictionJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + float32 h = data.step.dt; + + // Solve angular friction + { + float32 Cdot = wB - wA; + float32 impulse = -m_angularMass * Cdot; + + float32 oldImpulse = m_angularImpulse; + float32 maxImpulse = h * m_maxTorque; + m_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_angularImpulse - oldImpulse; + + wA -= iA * impulse; + wB += iB * impulse; + } + + // Solve linear friction + { + b2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA); + + b2Vec2 impulse = -b2Mul(m_linearMass, Cdot); + b2Vec2 oldImpulse = m_linearImpulse; + m_linearImpulse += impulse; + + float32 maxImpulse = h * m_maxForce; + + if (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse) + { + m_linearImpulse.Normalize(); + m_linearImpulse *= maxImpulse; + } + + impulse = m_linearImpulse - oldImpulse; + + vA -= mA * impulse; + wA -= iA * b2Cross(m_rA, impulse); + + vB += mB * impulse; + wB += iB * b2Cross(m_rB, impulse); + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2FrictionJoint::SolvePositionConstraints(const b2SolverData& data) +{ + B2_NOT_USED(data); + + return true; +} + +b2Vec2 b2FrictionJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2FrictionJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2FrictionJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * m_linearImpulse; +} + +float32 b2FrictionJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_angularImpulse; +} + +void b2FrictionJoint::SetMaxForce(float32 force) +{ + b2Assert(b2IsValid(force) && force >= 0.0f); + m_maxForce = force; +} + +float32 b2FrictionJoint::GetMaxForce() const +{ + return m_maxForce; +} + +void b2FrictionJoint::SetMaxTorque(float32 torque) +{ + b2Assert(b2IsValid(torque) && torque >= 0.0f); + m_maxTorque = torque; +} + +float32 b2FrictionJoint::GetMaxTorque() const +{ + return m_maxTorque; +} + +void b2FrictionJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2FrictionJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.localAnchorA.Set(%.15lef, %.15lef);\n", m_localAnchorA.x, m_localAnchorA.y); + b2Log(" jd.localAnchorB.Set(%.15lef, %.15lef);\n", m_localAnchorB.x, m_localAnchorB.y); + b2Log(" jd.maxForce = %.15lef;\n", m_maxForce); + b2Log(" jd.maxTorque = %.15lef;\n", m_maxTorque); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.h new file mode 100755 index 00000000..d57abe80 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2FrictionJoint.h @@ -0,0 +1,119 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org +* +* 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 B2_FRICTION_JOINT_H +#define B2_FRICTION_JOINT_H + +#include + +/// Friction joint definition. +struct b2FrictionJointDef : public b2JointDef +{ + b2FrictionJointDef() + { + type = e_frictionJoint; + localAnchorA.SetZero(); + localAnchorB.SetZero(); + maxForce = 0.0f; + maxTorque = 0.0f; + } + + /// Initialize the bodies, anchors, axis, and reference angle using the world + /// anchor and world axis. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The maximum friction force in N. + float32 maxForce; + + /// The maximum friction torque in N-m. + float32 maxTorque; +}; + +/// Friction joint. This is used for top-down friction. +/// It provides 2D translational friction and angular friction. +class b2FrictionJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// The local anchor point relative to bodyA's origin. + const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } + + /// The local anchor point relative to bodyB's origin. + const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; } + + /// Set the maximum friction force in N. + void SetMaxForce(float32 force); + + /// Get the maximum friction force in N. + float32 GetMaxForce() const; + + /// Set the maximum friction torque in N*m. + void SetMaxTorque(float32 torque); + + /// Get the maximum friction torque in N*m. + float32 GetMaxTorque() const; + + /// Dump joint to dmLog + void Dump(); + +protected: + + friend class b2Joint; + + b2FrictionJoint(const b2FrictionJointDef* def); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + + // Solver shared + b2Vec2 m_linearImpulse; + float32 m_angularImpulse; + float32 m_maxForce; + float32 m_maxTorque; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_rA; + b2Vec2 m_rB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + b2Mat22 m_linearMass; + float32 m_angularMass; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.cpp new file mode 100755 index 00000000..155eb0c1 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.cpp @@ -0,0 +1,419 @@ +/* +* Copyright (c) 2007-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include + +// Gear Joint: +// C0 = (coordinate1 + ratio * coordinate2)_initial +// C = (coordinate1 + ratio * coordinate2) - C0 = 0 +// J = [J1 ratio * J2] +// K = J * invM * JT +// = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T +// +// Revolute: +// coordinate = rotation +// Cdot = angularVelocity +// J = [0 0 1] +// K = J * invM * JT = invI +// +// Prismatic: +// coordinate = dot(p - pg, ug) +// Cdot = dot(v + cross(w, r), ug) +// J = [ug cross(r, ug)] +// K = J * invM * JT = invMass + invI * cross(r, ug)^2 + +b2GearJoint::b2GearJoint(const b2GearJointDef* def) +: b2Joint(def) +{ + m_joint1 = def->joint1; + m_joint2 = def->joint2; + + m_typeA = m_joint1->GetType(); + m_typeB = m_joint2->GetType(); + + b2Assert(m_typeA == e_revoluteJoint || m_typeA == e_prismaticJoint); + b2Assert(m_typeB == e_revoluteJoint || m_typeB == e_prismaticJoint); + + float32 coordinateA, coordinateB; + + // TODO_ERIN there might be some problem with the joint edges in b2Joint. + + m_bodyC = m_joint1->GetBodyA(); + m_bodyA = m_joint1->GetBodyB(); + + // Get geometry of joint1 + b2Transform xfA = m_bodyA->m_xf; + float32 aA = m_bodyA->m_sweep.a; + b2Transform xfC = m_bodyC->m_xf; + float32 aC = m_bodyC->m_sweep.a; + + if (m_typeA == e_revoluteJoint) + { + b2RevoluteJoint* revolute = (b2RevoluteJoint*)def->joint1; + m_localAnchorC = revolute->m_localAnchorA; + m_localAnchorA = revolute->m_localAnchorB; + m_referenceAngleA = revolute->m_referenceAngle; + m_localAxisC.SetZero(); + + coordinateA = aA - aC - m_referenceAngleA; + } + else + { + b2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint1; + m_localAnchorC = prismatic->m_localAnchorA; + m_localAnchorA = prismatic->m_localAnchorB; + m_referenceAngleA = prismatic->m_referenceAngle; + m_localAxisC = prismatic->m_localXAxisA; + + b2Vec2 pC = m_localAnchorC; + b2Vec2 pA = b2MulT(xfC.q, b2Mul(xfA.q, m_localAnchorA) + (xfA.p - xfC.p)); + coordinateA = b2Dot(pA - pC, m_localAxisC); + } + + m_bodyD = m_joint2->GetBodyA(); + m_bodyB = m_joint2->GetBodyB(); + + // Get geometry of joint2 + b2Transform xfB = m_bodyB->m_xf; + float32 aB = m_bodyB->m_sweep.a; + b2Transform xfD = m_bodyD->m_xf; + float32 aD = m_bodyD->m_sweep.a; + + if (m_typeB == e_revoluteJoint) + { + b2RevoluteJoint* revolute = (b2RevoluteJoint*)def->joint2; + m_localAnchorD = revolute->m_localAnchorA; + m_localAnchorB = revolute->m_localAnchorB; + m_referenceAngleB = revolute->m_referenceAngle; + m_localAxisD.SetZero(); + + coordinateB = aB - aD - m_referenceAngleB; + } + else + { + b2PrismaticJoint* prismatic = (b2PrismaticJoint*)def->joint2; + m_localAnchorD = prismatic->m_localAnchorA; + m_localAnchorB = prismatic->m_localAnchorB; + m_referenceAngleB = prismatic->m_referenceAngle; + m_localAxisD = prismatic->m_localXAxisA; + + b2Vec2 pD = m_localAnchorD; + b2Vec2 pB = b2MulT(xfD.q, b2Mul(xfB.q, m_localAnchorB) + (xfB.p - xfD.p)); + coordinateB = b2Dot(pB - pD, m_localAxisD); + } + + m_ratio = def->ratio; + + m_constant = coordinateA + m_ratio * coordinateB; + + m_impulse = 0.0f; +} + +void b2GearJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_indexC = m_bodyC->m_islandIndex; + m_indexD = m_bodyD->m_islandIndex; + m_lcA = m_bodyA->m_sweep.localCenter; + m_lcB = m_bodyB->m_sweep.localCenter; + m_lcC = m_bodyC->m_sweep.localCenter; + m_lcD = m_bodyD->m_sweep.localCenter; + m_mA = m_bodyA->m_invMass; + m_mB = m_bodyB->m_invMass; + m_mC = m_bodyC->m_invMass; + m_mD = m_bodyD->m_invMass; + m_iA = m_bodyA->m_invI; + m_iB = m_bodyB->m_invI; + m_iC = m_bodyC->m_invI; + m_iD = m_bodyD->m_invI; + + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + float32 aC = data.positions[m_indexC].a; + b2Vec2 vC = data.velocities[m_indexC].v; + float32 wC = data.velocities[m_indexC].w; + + float32 aD = data.positions[m_indexD].a; + b2Vec2 vD = data.velocities[m_indexD].v; + float32 wD = data.velocities[m_indexD].w; + + b2Rot qA(aA), qB(aB), qC(aC), qD(aD); + + m_mass = 0.0f; + + if (m_typeA == e_revoluteJoint) + { + m_JvAC.SetZero(); + m_JwA = 1.0f; + m_JwC = 1.0f; + m_mass += m_iA + m_iC; + } + else + { + b2Vec2 u = b2Mul(qC, m_localAxisC); + b2Vec2 rC = b2Mul(qC, m_localAnchorC - m_lcC); + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_lcA); + m_JvAC = u; + m_JwC = b2Cross(rC, u); + m_JwA = b2Cross(rA, u); + m_mass += m_mC + m_mA + m_iC * m_JwC * m_JwC + m_iA * m_JwA * m_JwA; + } + + if (m_typeB == e_revoluteJoint) + { + m_JvBD.SetZero(); + m_JwB = m_ratio; + m_JwD = m_ratio; + m_mass += m_ratio * m_ratio * (m_iB + m_iD); + } + else + { + b2Vec2 u = b2Mul(qD, m_localAxisD); + b2Vec2 rD = b2Mul(qD, m_localAnchorD - m_lcD); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_lcB); + m_JvBD = m_ratio * u; + m_JwD = m_ratio * b2Cross(rD, u); + m_JwB = m_ratio * b2Cross(rB, u); + m_mass += m_ratio * m_ratio * (m_mD + m_mB) + m_iD * m_JwD * m_JwD + m_iB * m_JwB * m_JwB; + } + + // Compute effective mass. + m_mass = m_mass > 0.0f ? 1.0f / m_mass : 0.0f; + + if (data.step.warmStarting) + { + vA += (m_mA * m_impulse) * m_JvAC; + wA += m_iA * m_impulse * m_JwA; + vB += (m_mB * m_impulse) * m_JvBD; + wB += m_iB * m_impulse * m_JwB; + vC -= (m_mC * m_impulse) * m_JvAC; + wC -= m_iC * m_impulse * m_JwC; + vD -= (m_mD * m_impulse) * m_JvBD; + wD -= m_iD * m_impulse * m_JwD; + } + else + { + m_impulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; + data.velocities[m_indexC].v = vC; + data.velocities[m_indexC].w = wC; + data.velocities[m_indexD].v = vD; + data.velocities[m_indexD].w = wD; +} + +void b2GearJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + b2Vec2 vC = data.velocities[m_indexC].v; + float32 wC = data.velocities[m_indexC].w; + b2Vec2 vD = data.velocities[m_indexD].v; + float32 wD = data.velocities[m_indexD].w; + + float32 Cdot = b2Dot(m_JvAC, vA - vC) + b2Dot(m_JvBD, vB - vD); + Cdot += (m_JwA * wA - m_JwC * wC) + (m_JwB * wB - m_JwD * wD); + + float32 impulse = -m_mass * Cdot; + m_impulse += impulse; + + vA += (m_mA * impulse) * m_JvAC; + wA += m_iA * impulse * m_JwA; + vB += (m_mB * impulse) * m_JvBD; + wB += m_iB * impulse * m_JwB; + vC -= (m_mC * impulse) * m_JvAC; + wC -= m_iC * impulse * m_JwC; + vD -= (m_mD * impulse) * m_JvBD; + wD -= m_iD * impulse * m_JwD; + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; + data.velocities[m_indexC].v = vC; + data.velocities[m_indexC].w = wC; + data.velocities[m_indexD].v = vD; + data.velocities[m_indexD].w = wD; +} + +bool b2GearJoint::SolvePositionConstraints(const b2SolverData& data) +{ + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + b2Vec2 cC = data.positions[m_indexC].c; + float32 aC = data.positions[m_indexC].a; + b2Vec2 cD = data.positions[m_indexD].c; + float32 aD = data.positions[m_indexD].a; + + b2Rot qA(aA), qB(aB), qC(aC), qD(aD); + + float32 linearError = 0.0f; + + float32 coordinateA, coordinateB; + + b2Vec2 JvAC, JvBD; + float32 JwA, JwB, JwC, JwD; + float32 mass = 0.0f; + + if (m_typeA == e_revoluteJoint) + { + JvAC.SetZero(); + JwA = 1.0f; + JwC = 1.0f; + mass += m_iA + m_iC; + + coordinateA = aA - aC - m_referenceAngleA; + } + else + { + b2Vec2 u = b2Mul(qC, m_localAxisC); + b2Vec2 rC = b2Mul(qC, m_localAnchorC - m_lcC); + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_lcA); + JvAC = u; + JwC = b2Cross(rC, u); + JwA = b2Cross(rA, u); + mass += m_mC + m_mA + m_iC * JwC * JwC + m_iA * JwA * JwA; + + b2Vec2 pC = m_localAnchorC - m_lcC; + b2Vec2 pA = b2MulT(qC, rA + (cA - cC)); + coordinateA = b2Dot(pA - pC, m_localAxisC); + } + + if (m_typeB == e_revoluteJoint) + { + JvBD.SetZero(); + JwB = m_ratio; + JwD = m_ratio; + mass += m_ratio * m_ratio * (m_iB + m_iD); + + coordinateB = aB - aD - m_referenceAngleB; + } + else + { + b2Vec2 u = b2Mul(qD, m_localAxisD); + b2Vec2 rD = b2Mul(qD, m_localAnchorD - m_lcD); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_lcB); + JvBD = m_ratio * u; + JwD = m_ratio * b2Cross(rD, u); + JwB = m_ratio * b2Cross(rB, u); + mass += m_ratio * m_ratio * (m_mD + m_mB) + m_iD * JwD * JwD + m_iB * JwB * JwB; + + b2Vec2 pD = m_localAnchorD - m_lcD; + b2Vec2 pB = b2MulT(qD, rB + (cB - cD)); + coordinateB = b2Dot(pB - pD, m_localAxisD); + } + + float32 C = (coordinateA + m_ratio * coordinateB) - m_constant; + + float32 impulse = 0.0f; + if (mass > 0.0f) + { + impulse = -C / mass; + } + + cA += m_mA * impulse * JvAC; + aA += m_iA * impulse * JwA; + cB += m_mB * impulse * JvBD; + aB += m_iB * impulse * JwB; + cC -= m_mC * impulse * JvAC; + aC -= m_iC * impulse * JwC; + cD -= m_mD * impulse * JvBD; + aD -= m_iD * impulse * JwD; + + data.positions[m_indexA].c = cA; + data.positions[m_indexA].a = aA; + data.positions[m_indexB].c = cB; + data.positions[m_indexB].a = aB; + data.positions[m_indexC].c = cC; + data.positions[m_indexC].a = aC; + data.positions[m_indexD].c = cD; + data.positions[m_indexD].a = aD; + + // TODO_ERIN not implemented + return linearError < b2_linearSlop; +} + +b2Vec2 b2GearJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2GearJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2GearJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 P = m_impulse * m_JvAC; + return inv_dt * P; +} + +float32 b2GearJoint::GetReactionTorque(float32 inv_dt) const +{ + float32 L = m_impulse * m_JwA; + return inv_dt * L; +} + +void b2GearJoint::SetRatio(float32 ratio) +{ + b2Assert(b2IsValid(ratio)); + m_ratio = ratio; +} + +float32 b2GearJoint::GetRatio() const +{ + return m_ratio; +} + +void b2GearJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + int32 index1 = m_joint1->m_index; + int32 index2 = m_joint2->m_index; + + b2Log(" b2GearJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.joint1 = joints[%d];\n", index1); + b2Log(" jd.joint2 = joints[%d];\n", index2); + b2Log(" jd.ratio = %.15lef;\n", m_ratio); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.h new file mode 100755 index 00000000..fd3d7b2f --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2GearJoint.h @@ -0,0 +1,125 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_GEAR_JOINT_H +#define B2_GEAR_JOINT_H + +#include + +/// Gear joint definition. This definition requires two existing +/// revolute or prismatic joints (any combination will work). +struct b2GearJointDef : public b2JointDef +{ + b2GearJointDef() + { + type = e_gearJoint; + joint1 = NULL; + joint2 = NULL; + ratio = 1.0f; + } + + /// The first revolute/prismatic joint attached to the gear joint. + b2Joint* joint1; + + /// The second revolute/prismatic joint attached to the gear joint. + b2Joint* joint2; + + /// The gear ratio. + /// @see b2GearJoint for explanation. + float32 ratio; +}; + +/// A gear joint is used to connect two joints together. Either joint +/// can be a revolute or prismatic joint. You specify a gear ratio +/// to bind the motions together: +/// coordinate1 + ratio * coordinate2 = constant +/// The ratio can be negative or positive. If one joint is a revolute joint +/// and the other joint is a prismatic joint, then the ratio will have units +/// of length or units of 1/length. +/// @warning You have to manually destroy the gear joint if joint1 or joint2 +/// is destroyed. +class b2GearJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Get the first joint. + b2Joint* GetJoint1() { return m_joint1; } + + /// Get the second joint. + b2Joint* GetJoint2() { return m_joint2; } + + /// Set/Get the gear ratio. + void SetRatio(float32 ratio); + float32 GetRatio() const; + + /// Dump joint to dmLog + void Dump(); + +protected: + + friend class b2Joint; + b2GearJoint(const b2GearJointDef* data); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + b2Joint* m_joint1; + b2Joint* m_joint2; + + b2JointType m_typeA; + b2JointType m_typeB; + + // Body A is connected to body C + // Body B is connected to body D + b2Body* m_bodyC; + b2Body* m_bodyD; + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + b2Vec2 m_localAnchorC; + b2Vec2 m_localAnchorD; + + b2Vec2 m_localAxisC; + b2Vec2 m_localAxisD; + + float32 m_referenceAngleA; + float32 m_referenceAngleB; + + float32 m_constant; + float32 m_ratio; + + float32 m_impulse; + + // Solver temp + int32 m_indexA, m_indexB, m_indexC, m_indexD; + b2Vec2 m_lcA, m_lcB, m_lcC, m_lcD; + float32 m_mA, m_mB, m_mC, m_mD; + float32 m_iA, m_iB, m_iC, m_iD; + b2Vec2 m_JvAC, m_JvBD; + float32 m_JwA, m_JwB, m_JwC, m_JwD; + float32 m_mass; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2Joint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2Joint.cpp new file mode 100755 index 00000000..dd55be94 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2Joint.cpp @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +b2Joint* b2Joint::Create(const b2JointDef* def, b2BlockAllocator* allocator) +{ + b2Joint* joint = NULL; + + switch (def->type) + { + case e_distanceJoint: + { + void* mem = allocator->Allocate(sizeof(b2DistanceJoint)); + joint = new (mem) b2DistanceJoint(static_cast(def)); + } + break; + + case e_mouseJoint: + { + void* mem = allocator->Allocate(sizeof(b2MouseJoint)); + joint = new (mem) b2MouseJoint(static_cast(def)); + } + break; + + case e_prismaticJoint: + { + void* mem = allocator->Allocate(sizeof(b2PrismaticJoint)); + joint = new (mem) b2PrismaticJoint(static_cast(def)); + } + break; + + case e_revoluteJoint: + { + void* mem = allocator->Allocate(sizeof(b2RevoluteJoint)); + joint = new (mem) b2RevoluteJoint(static_cast(def)); + } + break; + + case e_pulleyJoint: + { + void* mem = allocator->Allocate(sizeof(b2PulleyJoint)); + joint = new (mem) b2PulleyJoint(static_cast(def)); + } + break; + + case e_gearJoint: + { + void* mem = allocator->Allocate(sizeof(b2GearJoint)); + joint = new (mem) b2GearJoint(static_cast(def)); + } + break; + + case e_wheelJoint: + { + void* mem = allocator->Allocate(sizeof(b2WheelJoint)); + joint = new (mem) b2WheelJoint(static_cast(def)); + } + break; + + case e_weldJoint: + { + void* mem = allocator->Allocate(sizeof(b2WeldJoint)); + joint = new (mem) b2WeldJoint(static_cast(def)); + } + break; + + case e_frictionJoint: + { + void* mem = allocator->Allocate(sizeof(b2FrictionJoint)); + joint = new (mem) b2FrictionJoint(static_cast(def)); + } + break; + + case e_ropeJoint: + { + void* mem = allocator->Allocate(sizeof(b2RopeJoint)); + joint = new (mem) b2RopeJoint(static_cast(def)); + } + break; + + case e_motorJoint: + { + void* mem = allocator->Allocate(sizeof(b2MotorJoint)); + joint = new (mem) b2MotorJoint(static_cast(def)); + } + break; + + default: + b2Assert(false); + break; + } + + return joint; +} + +void b2Joint::Destroy(b2Joint* joint, b2BlockAllocator* allocator) +{ + joint->~b2Joint(); + switch (joint->m_type) + { + case e_distanceJoint: + allocator->Free(joint, sizeof(b2DistanceJoint)); + break; + + case e_mouseJoint: + allocator->Free(joint, sizeof(b2MouseJoint)); + break; + + case e_prismaticJoint: + allocator->Free(joint, sizeof(b2PrismaticJoint)); + break; + + case e_revoluteJoint: + allocator->Free(joint, sizeof(b2RevoluteJoint)); + break; + + case e_pulleyJoint: + allocator->Free(joint, sizeof(b2PulleyJoint)); + break; + + case e_gearJoint: + allocator->Free(joint, sizeof(b2GearJoint)); + break; + + case e_wheelJoint: + allocator->Free(joint, sizeof(b2WheelJoint)); + break; + + case e_weldJoint: + allocator->Free(joint, sizeof(b2WeldJoint)); + break; + + case e_frictionJoint: + allocator->Free(joint, sizeof(b2FrictionJoint)); + break; + + case e_ropeJoint: + allocator->Free(joint, sizeof(b2RopeJoint)); + break; + + case e_motorJoint: + allocator->Free(joint, sizeof(b2MotorJoint)); + break; + + default: + b2Assert(false); + break; + } +} + +b2Joint::b2Joint(const b2JointDef* def) +{ + b2Assert(def->bodyA != def->bodyB); + + m_type = def->type; + m_prev = NULL; + m_next = NULL; + m_bodyA = def->bodyA; + m_bodyB = def->bodyB; + m_index = 0; + m_collideConnected = def->collideConnected; + m_islandFlag = false; + m_userData = def->userData; + + m_edgeA.joint = NULL; + m_edgeA.other = NULL; + m_edgeA.prev = NULL; + m_edgeA.next = NULL; + + m_edgeB.joint = NULL; + m_edgeB.other = NULL; + m_edgeB.prev = NULL; + m_edgeB.next = NULL; +} + +bool b2Joint::IsActive() const +{ + return m_bodyA->IsActive() && m_bodyB->IsActive(); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2Joint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2Joint.h new file mode 100755 index 00000000..dd076b6b --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2Joint.h @@ -0,0 +1,226 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org +* +* 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 B2_JOINT_H +#define B2_JOINT_H + +#include + +class b2Body; +class b2Joint; +struct b2SolverData; +class b2BlockAllocator; + +enum b2JointType +{ + e_unknownJoint, + e_revoluteJoint, + e_prismaticJoint, + e_distanceJoint, + e_pulleyJoint, + e_mouseJoint, + e_gearJoint, + e_wheelJoint, + e_weldJoint, + e_frictionJoint, + e_ropeJoint, + e_motorJoint +}; + +enum b2LimitState +{ + e_inactiveLimit, + e_atLowerLimit, + e_atUpperLimit, + e_equalLimits +}; + +struct b2Jacobian +{ + b2Vec2 linear; + float32 angularA; + float32 angularB; +}; + +/// A joint edge is used to connect bodies and joints together +/// in a joint graph where each body is a node and each joint +/// is an edge. A joint edge belongs to a doubly linked list +/// maintained in each attached body. Each joint has two joint +/// nodes, one for each attached body. +struct b2JointEdge +{ + b2Body* other; ///< provides quick access to the other body attached. + b2Joint* joint; ///< the joint + b2JointEdge* prev; ///< the previous joint edge in the body's joint list + b2JointEdge* next; ///< the next joint edge in the body's joint list +}; + +/// Joint definitions are used to construct joints. +struct b2JointDef +{ + b2JointDef() + { + type = e_unknownJoint; + userData = NULL; + bodyA = NULL; + bodyB = NULL; + collideConnected = false; + } + + /// The joint type is set automatically for concrete joint types. + b2JointType type; + + /// Use this to attach application specific data to your joints. + void* userData; + + /// The first attached body. + b2Body* bodyA; + + /// The second attached body. + b2Body* bodyB; + + /// Set this flag to true if the attached bodies should collide. + bool collideConnected; +}; + +/// The base joint class. Joints are used to constraint two bodies together in +/// various fashions. Some joints also feature limits and motors. +class b2Joint +{ +public: + + /// Get the type of the concrete joint. + b2JointType GetType() const; + + /// Get the first body attached to this joint. + b2Body* GetBodyA(); + + /// Get the second body attached to this joint. + b2Body* GetBodyB(); + + /// Get the anchor point on bodyA in world coordinates. + virtual b2Vec2 GetAnchorA() const = 0; + + /// Get the anchor point on bodyB in world coordinates. + virtual b2Vec2 GetAnchorB() const = 0; + + /// Get the reaction force on bodyB at the joint anchor in Newtons. + virtual b2Vec2 GetReactionForce(float32 inv_dt) const = 0; + + /// Get the reaction torque on bodyB in N*m. + virtual float32 GetReactionTorque(float32 inv_dt) const = 0; + + /// Get the next joint the world joint list. + b2Joint* GetNext(); + const b2Joint* GetNext() const; + + /// Get the user data pointer. + void* GetUserData() const; + + /// Set the user data pointer. + void SetUserData(void* data); + + /// Short-cut function to determine if either body is inactive. + bool IsActive() const; + + /// Get collide connected. + /// Note: modifying the collide connect flag won't work correctly because + /// the flag is only checked when fixture AABBs begin to overlap. + bool GetCollideConnected() const; + + /// Dump this joint to the log file. + virtual void Dump() { b2Log("// Dump is not supported for this joint type.\n"); } + + /// Shift the origin for any points stored in world coordinates. + virtual void ShiftOrigin(const b2Vec2& newOrigin) { B2_NOT_USED(newOrigin); } + +protected: + friend class b2World; + friend class b2Body; + friend class b2Island; + friend class b2GearJoint; + + static b2Joint* Create(const b2JointDef* def, b2BlockAllocator* allocator); + static void Destroy(b2Joint* joint, b2BlockAllocator* allocator); + + b2Joint(const b2JointDef* def); + virtual ~b2Joint() {} + + virtual void InitVelocityConstraints(const b2SolverData& data) = 0; + virtual void SolveVelocityConstraints(const b2SolverData& data) = 0; + + // This returns true if the position errors are within tolerance. + virtual bool SolvePositionConstraints(const b2SolverData& data) = 0; + + b2JointType m_type; + b2Joint* m_prev; + b2Joint* m_next; + b2JointEdge m_edgeA; + b2JointEdge m_edgeB; + b2Body* m_bodyA; + b2Body* m_bodyB; + + int32 m_index; + + bool m_islandFlag; + bool m_collideConnected; + + void* m_userData; +}; + +inline b2JointType b2Joint::GetType() const +{ + return m_type; +} + +inline b2Body* b2Joint::GetBodyA() +{ + return m_bodyA; +} + +inline b2Body* b2Joint::GetBodyB() +{ + return m_bodyB; +} + +inline b2Joint* b2Joint::GetNext() +{ + return m_next; +} + +inline const b2Joint* b2Joint::GetNext() const +{ + return m_next; +} + +inline void* b2Joint::GetUserData() const +{ + return m_userData; +} + +inline void b2Joint::SetUserData(void* data) +{ + m_userData = data; +} + +inline bool b2Joint::GetCollideConnected() const +{ + return m_collideConnected; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.cpp new file mode 100755 index 00000000..e5bbcb16 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.cpp @@ -0,0 +1,304 @@ +/* +* Copyright (c) 2006-2012 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// Point-to-point constraint +// Cdot = v2 - v1 +// = v2 + cross(w2, r2) - v1 - cross(w1, r1) +// J = [-I -r1_skew I r2_skew ] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +// Angle constraint +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// K = invI1 + invI2 + +void b2MotorJointDef::Initialize(b2Body* bA, b2Body* bB) +{ + bodyA = bA; + bodyB = bB; + b2Vec2 xB = bodyB->GetPosition(); + linearOffset = bodyA->GetLocalPoint(xB); + + float32 angleA = bodyA->GetAngle(); + float32 angleB = bodyB->GetAngle(); + angularOffset = angleB - angleA; +} + +b2MotorJoint::b2MotorJoint(const b2MotorJointDef* def) +: b2Joint(def) +{ + m_linearOffset = def->linearOffset; + m_angularOffset = def->angularOffset; + + m_linearImpulse.SetZero(); + m_angularImpulse = 0.0f; + + m_maxForce = def->maxForce; + m_maxTorque = def->maxTorque; + m_correctionFactor = def->correctionFactor; +} + +void b2MotorJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + // Compute the effective mass matrix. + m_rA = b2Mul(qA, -m_localCenterA); + m_rB = b2Mul(qB, -m_localCenterB); + + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + b2Mat22 K; + K.ex.x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y; + K.ex.y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x; + + m_linearMass = K.GetInverse(); + + m_angularMass = iA + iB; + if (m_angularMass > 0.0f) + { + m_angularMass = 1.0f / m_angularMass; + } + + m_linearError = cB + m_rB - cA - m_rA - b2Mul(qA, m_linearOffset); + m_angularError = aB - aA - m_angularOffset; + + if (data.step.warmStarting) + { + // Scale impulses to support a variable time step. + m_linearImpulse *= data.step.dtRatio; + m_angularImpulse *= data.step.dtRatio; + + b2Vec2 P(m_linearImpulse.x, m_linearImpulse.y); + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + m_angularImpulse); + vB += mB * P; + wB += iB * (b2Cross(m_rB, P) + m_angularImpulse); + } + else + { + m_linearImpulse.SetZero(); + m_angularImpulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2MotorJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + float32 h = data.step.dt; + float32 inv_h = data.step.inv_dt; + + // Solve angular friction + { + float32 Cdot = wB - wA + inv_h * m_correctionFactor * m_angularError; + float32 impulse = -m_angularMass * Cdot; + + float32 oldImpulse = m_angularImpulse; + float32 maxImpulse = h * m_maxTorque; + m_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_angularImpulse - oldImpulse; + + wA -= iA * impulse; + wB += iB * impulse; + } + + // Solve linear friction + { + b2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA) + inv_h * m_correctionFactor * m_linearError; + + b2Vec2 impulse = -b2Mul(m_linearMass, Cdot); + b2Vec2 oldImpulse = m_linearImpulse; + m_linearImpulse += impulse; + + float32 maxImpulse = h * m_maxForce; + + if (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse) + { + m_linearImpulse.Normalize(); + m_linearImpulse *= maxImpulse; + } + + impulse = m_linearImpulse - oldImpulse; + + vA -= mA * impulse; + wA -= iA * b2Cross(m_rA, impulse); + + vB += mB * impulse; + wB += iB * b2Cross(m_rB, impulse); + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2MotorJoint::SolvePositionConstraints(const b2SolverData& data) +{ + B2_NOT_USED(data); + + return true; +} + +b2Vec2 b2MotorJoint::GetAnchorA() const +{ + return m_bodyA->GetPosition(); +} + +b2Vec2 b2MotorJoint::GetAnchorB() const +{ + return m_bodyB->GetPosition(); +} + +b2Vec2 b2MotorJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * m_linearImpulse; +} + +float32 b2MotorJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_angularImpulse; +} + +void b2MotorJoint::SetMaxForce(float32 force) +{ + b2Assert(b2IsValid(force) && force >= 0.0f); + m_maxForce = force; +} + +float32 b2MotorJoint::GetMaxForce() const +{ + return m_maxForce; +} + +void b2MotorJoint::SetMaxTorque(float32 torque) +{ + b2Assert(b2IsValid(torque) && torque >= 0.0f); + m_maxTorque = torque; +} + +float32 b2MotorJoint::GetMaxTorque() const +{ + return m_maxTorque; +} + +void b2MotorJoint::SetCorrectionFactor(float32 factor) +{ + b2Assert(b2IsValid(factor) && 0.0f <= factor && factor <= 1.0f); + m_correctionFactor = factor; +} + +float32 b2MotorJoint::GetCorrectionFactor() const +{ + return m_correctionFactor; +} + +void b2MotorJoint::SetLinearOffset(const b2Vec2& linearOffset) +{ + if (linearOffset.x != m_linearOffset.x || linearOffset.y != m_linearOffset.y) + { + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_linearOffset = linearOffset; + } +} + +const b2Vec2& b2MotorJoint::GetLinearOffset() const +{ + return m_linearOffset; +} + +void b2MotorJoint::SetAngularOffset(float32 angularOffset) +{ + if (angularOffset != m_angularOffset) + { + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_angularOffset = angularOffset; + } +} + +float32 b2MotorJoint::GetAngularOffset() const +{ + return m_angularOffset; +} + +void b2MotorJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2MotorJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.linearOffset.Set(%.15lef, %.15lef);\n", m_linearOffset.x, m_linearOffset.y); + b2Log(" jd.angularOffset = %.15lef;\n", m_angularOffset); + b2Log(" jd.maxForce = %.15lef;\n", m_maxForce); + b2Log(" jd.maxTorque = %.15lef;\n", m_maxTorque); + b2Log(" jd.correctionFactor = %.15lef;\n", m_correctionFactor); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.h new file mode 100755 index 00000000..0b76d6fe --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MotorJoint.h @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2006-2012 Erin Catto http://www.box2d.org +* +* 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 B2_MOTOR_JOINT_H +#define B2_MOTOR_JOINT_H + +#include + +/// Motor joint definition. +struct b2MotorJointDef : public b2JointDef +{ + b2MotorJointDef() + { + type = e_motorJoint; + linearOffset.SetZero(); + angularOffset = 0.0f; + maxForce = 1.0f; + maxTorque = 1.0f; + correctionFactor = 0.3f; + } + + /// Initialize the bodies and offsets using the current transforms. + void Initialize(b2Body* bodyA, b2Body* bodyB); + + /// Position of bodyB minus the position of bodyA, in bodyA's frame, in meters. + b2Vec2 linearOffset; + + /// The bodyB angle minus bodyA angle in radians. + float32 angularOffset; + + /// The maximum motor force in N. + float32 maxForce; + + /// The maximum motor torque in N-m. + float32 maxTorque; + + /// Position correction factor in the range [0,1]. + float32 correctionFactor; +}; + +/// A motor joint is used to control the relative motion +/// between two bodies. A typical usage is to control the movement +/// of a dynamic body with respect to the ground. +class b2MotorJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Set/get the target linear offset, in frame A, in meters. + void SetLinearOffset(const b2Vec2& linearOffset); + const b2Vec2& GetLinearOffset() const; + + /// Set/get the target angular offset, in radians. + void SetAngularOffset(float32 angularOffset); + float32 GetAngularOffset() const; + + /// Set the maximum friction force in N. + void SetMaxForce(float32 force); + + /// Get the maximum friction force in N. + float32 GetMaxForce() const; + + /// Set the maximum friction torque in N*m. + void SetMaxTorque(float32 torque); + + /// Get the maximum friction torque in N*m. + float32 GetMaxTorque() const; + + /// Set the position correction factor in the range [0,1]. + void SetCorrectionFactor(float32 factor); + + /// Get the position correction factor in the range [0,1]. + float32 GetCorrectionFactor() const; + + /// Dump to b2Log + void Dump(); + +protected: + + friend class b2Joint; + + b2MotorJoint(const b2MotorJointDef* def); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + // Solver shared + b2Vec2 m_linearOffset; + float32 m_angularOffset; + b2Vec2 m_linearImpulse; + float32 m_angularImpulse; + float32 m_maxForce; + float32 m_maxTorque; + float32 m_correctionFactor; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_rA; + b2Vec2 m_rB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + b2Vec2 m_linearError; + float32 m_angularError; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + b2Mat22 m_linearMass; + float32 m_angularMass; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.cpp new file mode 100755 index 00000000..ea96edde --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.cpp @@ -0,0 +1,222 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// p = attached point, m = mouse point +// C = p - m +// Cdot = v +// = v + cross(w, r) +// J = [I r_skew] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +b2MouseJoint::b2MouseJoint(const b2MouseJointDef* def) +: b2Joint(def) +{ + b2Assert(def->target.IsValid()); + b2Assert(b2IsValid(def->maxForce) && def->maxForce >= 0.0f); + b2Assert(b2IsValid(def->frequencyHz) && def->frequencyHz >= 0.0f); + b2Assert(b2IsValid(def->dampingRatio) && def->dampingRatio >= 0.0f); + + m_targetA = def->target; + m_localAnchorB = b2MulT(m_bodyB->GetTransform(), m_targetA); + + m_maxForce = def->maxForce; + m_impulse.SetZero(); + + m_frequencyHz = def->frequencyHz; + m_dampingRatio = def->dampingRatio; + + m_beta = 0.0f; + m_gamma = 0.0f; +} + +void b2MouseJoint::SetTarget(const b2Vec2& target) +{ + if (m_bodyB->IsAwake() == false) + { + m_bodyB->SetAwake(true); + } + m_targetA = target; +} + +const b2Vec2& b2MouseJoint::GetTarget() const +{ + return m_targetA; +} + +void b2MouseJoint::SetMaxForce(float32 force) +{ + m_maxForce = force; +} + +float32 b2MouseJoint::GetMaxForce() const +{ + return m_maxForce; +} + +void b2MouseJoint::SetFrequency(float32 hz) +{ + m_frequencyHz = hz; +} + +float32 b2MouseJoint::GetFrequency() const +{ + return m_frequencyHz; +} + +void b2MouseJoint::SetDampingRatio(float32 ratio) +{ + m_dampingRatio = ratio; +} + +float32 b2MouseJoint::GetDampingRatio() const +{ + return m_dampingRatio; +} + +void b2MouseJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexB = m_bodyB->m_islandIndex; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassB = m_bodyB->m_invMass; + m_invIB = m_bodyB->m_invI; + + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qB(aB); + + float32 mass = m_bodyB->GetMass(); + + // Frequency + float32 omega = 2.0f * b2_pi * m_frequencyHz; + + // Damping coefficient + float32 d = 2.0f * mass * m_dampingRatio * omega; + + // Spring stiffness + float32 k = mass * (omega * omega); + + // magic formulas + // gamma has units of inverse mass. + // beta has units of inverse time. + float32 h = data.step.dt; + b2Assert(d + h * k > b2_epsilon); + m_gamma = h * (d + h * k); + if (m_gamma != 0.0f) + { + m_gamma = 1.0f / m_gamma; + } + m_beta = h * k * m_gamma; + + // Compute the effective mass matrix. + m_rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + + // K = [(1/m1 + 1/m2) * eye(2) - skew(r1) * invI1 * skew(r1) - skew(r2) * invI2 * skew(r2)] + // = [1/m1+1/m2 0 ] + invI1 * [r1.y*r1.y -r1.x*r1.y] + invI2 * [r1.y*r1.y -r1.x*r1.y] + // [ 0 1/m1+1/m2] [-r1.x*r1.y r1.x*r1.x] [-r1.x*r1.y r1.x*r1.x] + b2Mat22 K; + K.ex.x = m_invMassB + m_invIB * m_rB.y * m_rB.y + m_gamma; + K.ex.y = -m_invIB * m_rB.x * m_rB.y; + K.ey.x = K.ex.y; + K.ey.y = m_invMassB + m_invIB * m_rB.x * m_rB.x + m_gamma; + + m_mass = K.GetInverse(); + + m_C = cB + m_rB - m_targetA; + m_C *= m_beta; + + // Cheat with some damping + wB *= 0.98f; + + if (data.step.warmStarting) + { + m_impulse *= data.step.dtRatio; + vB += m_invMassB * m_impulse; + wB += m_invIB * b2Cross(m_rB, m_impulse); + } + else + { + m_impulse.SetZero(); + } + + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2MouseJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + // Cdot = v + cross(w, r) + b2Vec2 Cdot = vB + b2Cross(wB, m_rB); + b2Vec2 impulse = b2Mul(m_mass, -(Cdot + m_C + m_gamma * m_impulse)); + + b2Vec2 oldImpulse = m_impulse; + m_impulse += impulse; + float32 maxImpulse = data.step.dt * m_maxForce; + if (m_impulse.LengthSquared() > maxImpulse * maxImpulse) + { + m_impulse *= maxImpulse / m_impulse.Length(); + } + impulse = m_impulse - oldImpulse; + + vB += m_invMassB * impulse; + wB += m_invIB * b2Cross(m_rB, impulse); + + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2MouseJoint::SolvePositionConstraints(const b2SolverData& data) +{ + B2_NOT_USED(data); + return true; +} + +b2Vec2 b2MouseJoint::GetAnchorA() const +{ + return m_targetA; +} + +b2Vec2 b2MouseJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2MouseJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * m_impulse; +} + +float32 b2MouseJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * 0.0f; +} + +void b2MouseJoint::ShiftOrigin(const b2Vec2& newOrigin) +{ + m_targetA -= newOrigin; +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.h new file mode 100755 index 00000000..8b50a0e1 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2MouseJoint.h @@ -0,0 +1,129 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org +* +* 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 B2_MOUSE_JOINT_H +#define B2_MOUSE_JOINT_H + +#include + +/// Mouse joint definition. This requires a world target point, +/// tuning parameters, and the time step. +struct b2MouseJointDef : public b2JointDef +{ + b2MouseJointDef() + { + type = e_mouseJoint; + target.Set(0.0f, 0.0f); + maxForce = 0.0f; + frequencyHz = 5.0f; + dampingRatio = 0.7f; + } + + /// The initial world target point. This is assumed + /// to coincide with the body anchor initially. + b2Vec2 target; + + /// The maximum constraint force that can be exerted + /// to move the candidate body. Usually you will express + /// as some multiple of the weight (multiplier * mass * gravity). + float32 maxForce; + + /// The response speed. + float32 frequencyHz; + + /// The damping ratio. 0 = no damping, 1 = critical damping. + float32 dampingRatio; +}; + +/// A mouse joint is used to make a point on a body track a +/// specified world point. This a soft constraint with a maximum +/// force. This allows the constraint to stretch and without +/// applying huge forces. +/// NOTE: this joint is not documented in the manual because it was +/// developed to be used in the testbed. If you want to learn how to +/// use the mouse joint, look at the testbed. +class b2MouseJoint : public b2Joint +{ +public: + + /// Implements b2Joint. + b2Vec2 GetAnchorA() const; + + /// Implements b2Joint. + b2Vec2 GetAnchorB() const; + + /// Implements b2Joint. + b2Vec2 GetReactionForce(float32 inv_dt) const; + + /// Implements b2Joint. + float32 GetReactionTorque(float32 inv_dt) const; + + /// Use this to update the target point. + void SetTarget(const b2Vec2& target); + const b2Vec2& GetTarget() const; + + /// Set/get the maximum force in Newtons. + void SetMaxForce(float32 force); + float32 GetMaxForce() const; + + /// Set/get the frequency in Hertz. + void SetFrequency(float32 hz); + float32 GetFrequency() const; + + /// Set/get the damping ratio (dimensionless). + void SetDampingRatio(float32 ratio); + float32 GetDampingRatio() const; + + /// The mouse joint does not support dumping. + void Dump() { b2Log("Mouse joint dumping is not supported.\n"); } + + /// Implement b2Joint::ShiftOrigin + void ShiftOrigin(const b2Vec2& newOrigin); + +protected: + friend class b2Joint; + + b2MouseJoint(const b2MouseJointDef* def); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + b2Vec2 m_localAnchorB; + b2Vec2 m_targetA; + float32 m_frequencyHz; + float32 m_dampingRatio; + float32 m_beta; + + // Solver shared + b2Vec2 m_impulse; + float32 m_maxForce; + float32 m_gamma; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_rB; + b2Vec2 m_localCenterB; + float32 m_invMassB; + float32 m_invIB; + b2Mat22 m_mass; + b2Vec2 m_C; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp new file mode 100755 index 00000000..26f53968 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.cpp @@ -0,0 +1,626 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// Linear constraint (point-to-line) +// d = p2 - p1 = x2 + r2 - x1 - r1 +// C = dot(perp, d) +// Cdot = dot(d, cross(w1, perp)) + dot(perp, v2 + cross(w2, r2) - v1 - cross(w1, r1)) +// = -dot(perp, v1) - dot(cross(d + r1, perp), w1) + dot(perp, v2) + dot(cross(r2, perp), v2) +// J = [-perp, -cross(d + r1, perp), perp, cross(r2,perp)] +// +// Angular constraint +// C = a2 - a1 + a_initial +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// +// K = J * invM * JT +// +// J = [-a -s1 a s2] +// [0 -1 0 1] +// a = perp +// s1 = cross(d + r1, a) = cross(p2 - x1, a) +// s2 = cross(r2, a) = cross(p2 - x2, a) + + +// Motor/Limit linear constraint +// C = dot(ax1, d) +// Cdot = = -dot(ax1, v1) - dot(cross(d + r1, ax1), w1) + dot(ax1, v2) + dot(cross(r2, ax1), v2) +// J = [-ax1 -cross(d+r1,ax1) ax1 cross(r2,ax1)] + +// Block Solver +// We develop a block solver that includes the joint limit. This makes the limit stiff (inelastic) even +// when the mass has poor distribution (leading to large torques about the joint anchor points). +// +// The Jacobian has 3 rows: +// J = [-uT -s1 uT s2] // linear +// [0 -1 0 1] // angular +// [-vT -a1 vT a2] // limit +// +// u = perp +// v = axis +// s1 = cross(d + r1, u), s2 = cross(r2, u) +// a1 = cross(d + r1, v), a2 = cross(r2, v) + +// M * (v2 - v1) = JT * df +// J * v2 = bias +// +// v2 = v1 + invM * JT * df +// J * (v1 + invM * JT * df) = bias +// K * df = bias - J * v1 = -Cdot +// K = J * invM * JT +// Cdot = J * v1 - bias +// +// Now solve for f2. +// df = f2 - f1 +// K * (f2 - f1) = -Cdot +// f2 = invK * (-Cdot) + f1 +// +// Clamp accumulated limit impulse. +// lower: f2(3) = max(f2(3), 0) +// upper: f2(3) = min(f2(3), 0) +// +// Solve for correct f2(1:2) +// K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:3) * f1 +// = -Cdot(1:2) - K(1:2,3) * f2(3) + K(1:2,1:2) * f1(1:2) + K(1:2,3) * f1(3) +// K(1:2, 1:2) * f2(1:2) = -Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3)) + K(1:2,1:2) * f1(1:2) +// f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + f1(1:2) +// +// Now compute impulse to be applied: +// df = f2 - f1 + +void b2PrismaticJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor, const b2Vec2& axis) +{ + bodyA = bA; + bodyB = bB; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + localAxisA = bodyA->GetLocalVector(axis); + referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); +} + +b2PrismaticJoint::b2PrismaticJoint(const b2PrismaticJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + m_localXAxisA = def->localAxisA; + m_localXAxisA.Normalize(); + m_localYAxisA = b2Cross(1.0f, m_localXAxisA); + m_referenceAngle = def->referenceAngle; + + m_impulse.SetZero(); + m_motorMass = 0.0f; + m_motorImpulse = 0.0f; + + m_lowerTranslation = def->lowerTranslation; + m_upperTranslation = def->upperTranslation; + m_maxMotorForce = def->maxMotorForce; + m_motorSpeed = def->motorSpeed; + m_enableLimit = def->enableLimit; + m_enableMotor = def->enableMotor; + m_limitState = e_inactiveLimit; + + m_axis.SetZero(); + m_perp.SetZero(); +} + +void b2PrismaticJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + // Compute the effective masses. + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + b2Vec2 d = (cB - cA) + rB - rA; + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + // Compute motor Jacobian and effective mass. + { + m_axis = b2Mul(qA, m_localXAxisA); + m_a1 = b2Cross(d + rA, m_axis); + m_a2 = b2Cross(rB, m_axis); + + m_motorMass = mA + mB + iA * m_a1 * m_a1 + iB * m_a2 * m_a2; + if (m_motorMass > 0.0f) + { + m_motorMass = 1.0f / m_motorMass; + } + } + + // Prismatic constraint. + { + m_perp = b2Mul(qA, m_localYAxisA); + + m_s1 = b2Cross(d + rA, m_perp); + m_s2 = b2Cross(rB, m_perp); + + float32 k11 = mA + mB + iA * m_s1 * m_s1 + iB * m_s2 * m_s2; + float32 k12 = iA * m_s1 + iB * m_s2; + float32 k13 = iA * m_s1 * m_a1 + iB * m_s2 * m_a2; + float32 k22 = iA + iB; + if (k22 == 0.0f) + { + // For bodies with fixed rotation. + k22 = 1.0f; + } + float32 k23 = iA * m_a1 + iB * m_a2; + float32 k33 = mA + mB + iA * m_a1 * m_a1 + iB * m_a2 * m_a2; + + m_K.ex.Set(k11, k12, k13); + m_K.ey.Set(k12, k22, k23); + m_K.ez.Set(k13, k23, k33); + } + + // Compute motor and limit terms. + if (m_enableLimit) + { + float32 jointTranslation = b2Dot(m_axis, d); + if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) + { + m_limitState = e_equalLimits; + } + else if (jointTranslation <= m_lowerTranslation) + { + if (m_limitState != e_atLowerLimit) + { + m_limitState = e_atLowerLimit; + m_impulse.z = 0.0f; + } + } + else if (jointTranslation >= m_upperTranslation) + { + if (m_limitState != e_atUpperLimit) + { + m_limitState = e_atUpperLimit; + m_impulse.z = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + m_impulse.z = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + m_impulse.z = 0.0f; + } + + if (m_enableMotor == false) + { + m_motorImpulse = 0.0f; + } + + if (data.step.warmStarting) + { + // Account for variable time step. + m_impulse *= data.step.dtRatio; + m_motorImpulse *= data.step.dtRatio; + + b2Vec2 P = m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis; + float32 LA = m_impulse.x * m_s1 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a1; + float32 LB = m_impulse.x * m_s2 + m_impulse.y + (m_motorImpulse + m_impulse.z) * m_a2; + + vA -= mA * P; + wA -= iA * LA; + + vB += mB * P; + wB += iB * LB; + } + else + { + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2PrismaticJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + // Solve linear motor constraint. + if (m_enableMotor && m_limitState != e_equalLimits) + { + float32 Cdot = b2Dot(m_axis, vB - vA) + m_a2 * wB - m_a1 * wA; + float32 impulse = m_motorMass * (m_motorSpeed - Cdot); + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = data.step.dt * m_maxMotorForce; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + b2Vec2 P = impulse * m_axis; + float32 LA = impulse * m_a1; + float32 LB = impulse * m_a2; + + vA -= mA * P; + wA -= iA * LA; + + vB += mB * P; + wB += iB * LB; + } + + b2Vec2 Cdot1; + Cdot1.x = b2Dot(m_perp, vB - vA) + m_s2 * wB - m_s1 * wA; + Cdot1.y = wB - wA; + + if (m_enableLimit && m_limitState != e_inactiveLimit) + { + // Solve prismatic and limit constraint in block form. + float32 Cdot2; + Cdot2 = b2Dot(m_axis, vB - vA) + m_a2 * wB - m_a1 * wA; + b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); + + b2Vec3 f1 = m_impulse; + b2Vec3 df = m_K.Solve33(-Cdot); + m_impulse += df; + + if (m_limitState == e_atLowerLimit) + { + m_impulse.z = b2Max(m_impulse.z, 0.0f); + } + else if (m_limitState == e_atUpperLimit) + { + m_impulse.z = b2Min(m_impulse.z, 0.0f); + } + + // f2(1:2) = invK(1:2,1:2) * (-Cdot(1:2) - K(1:2,3) * (f2(3) - f1(3))) + f1(1:2) + b2Vec2 b = -Cdot1 - (m_impulse.z - f1.z) * b2Vec2(m_K.ez.x, m_K.ez.y); + b2Vec2 f2r = m_K.Solve22(b) + b2Vec2(f1.x, f1.y); + m_impulse.x = f2r.x; + m_impulse.y = f2r.y; + + df = m_impulse - f1; + + b2Vec2 P = df.x * m_perp + df.z * m_axis; + float32 LA = df.x * m_s1 + df.y + df.z * m_a1; + float32 LB = df.x * m_s2 + df.y + df.z * m_a2; + + vA -= mA * P; + wA -= iA * LA; + + vB += mB * P; + wB += iB * LB; + } + else + { + // Limit is inactive, just solve the prismatic constraint in block form. + b2Vec2 df = m_K.Solve22(-Cdot1); + m_impulse.x += df.x; + m_impulse.y += df.y; + + b2Vec2 P = df.x * m_perp; + float32 LA = df.x * m_s1 + df.y; + float32 LB = df.x * m_s2 + df.y; + + vA -= mA * P; + wA -= iA * LA; + + vB += mB * P; + wB += iB * LB; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2PrismaticJoint::SolvePositionConstraints(const b2SolverData& data) +{ + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + + b2Rot qA(aA), qB(aB); + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + // Compute fresh Jacobians + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + b2Vec2 d = cB + rB - cA - rA; + + b2Vec2 axis = b2Mul(qA, m_localXAxisA); + float32 a1 = b2Cross(d + rA, axis); + float32 a2 = b2Cross(rB, axis); + b2Vec2 perp = b2Mul(qA, m_localYAxisA); + + float32 s1 = b2Cross(d + rA, perp); + float32 s2 = b2Cross(rB, perp); + + b2Vec3 impulse; + b2Vec2 C1; + C1.x = b2Dot(perp, d); + C1.y = aB - aA - m_referenceAngle; + + float32 linearError = b2Abs(C1.x); + float32 angularError = b2Abs(C1.y); + + bool active = false; + float32 C2 = 0.0f; + if (m_enableLimit) + { + float32 translation = b2Dot(axis, d); + if (b2Abs(m_upperTranslation - m_lowerTranslation) < 2.0f * b2_linearSlop) + { + // Prevent large angular corrections + C2 = b2Clamp(translation, -b2_maxLinearCorrection, b2_maxLinearCorrection); + linearError = b2Max(linearError, b2Abs(translation)); + active = true; + } + else if (translation <= m_lowerTranslation) + { + // Prevent large linear corrections and allow some slop. + C2 = b2Clamp(translation - m_lowerTranslation + b2_linearSlop, -b2_maxLinearCorrection, 0.0f); + linearError = b2Max(linearError, m_lowerTranslation - translation); + active = true; + } + else if (translation >= m_upperTranslation) + { + // Prevent large linear corrections and allow some slop. + C2 = b2Clamp(translation - m_upperTranslation - b2_linearSlop, 0.0f, b2_maxLinearCorrection); + linearError = b2Max(linearError, translation - m_upperTranslation); + active = true; + } + } + + if (active) + { + float32 k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; + float32 k12 = iA * s1 + iB * s2; + float32 k13 = iA * s1 * a1 + iB * s2 * a2; + float32 k22 = iA + iB; + if (k22 == 0.0f) + { + // For fixed rotation + k22 = 1.0f; + } + float32 k23 = iA * a1 + iB * a2; + float32 k33 = mA + mB + iA * a1 * a1 + iB * a2 * a2; + + b2Mat33 K; + K.ex.Set(k11, k12, k13); + K.ey.Set(k12, k22, k23); + K.ez.Set(k13, k23, k33); + + b2Vec3 C; + C.x = C1.x; + C.y = C1.y; + C.z = C2; + + impulse = K.Solve33(-C); + } + else + { + float32 k11 = mA + mB + iA * s1 * s1 + iB * s2 * s2; + float32 k12 = iA * s1 + iB * s2; + float32 k22 = iA + iB; + if (k22 == 0.0f) + { + k22 = 1.0f; + } + + b2Mat22 K; + K.ex.Set(k11, k12); + K.ey.Set(k12, k22); + + b2Vec2 impulse1 = K.Solve(-C1); + impulse.x = impulse1.x; + impulse.y = impulse1.y; + impulse.z = 0.0f; + } + + b2Vec2 P = impulse.x * perp + impulse.z * axis; + float32 LA = impulse.x * s1 + impulse.y + impulse.z * a1; + float32 LB = impulse.x * s2 + impulse.y + impulse.z * a2; + + cA -= mA * P; + aA -= iA * LA; + cB += mB * P; + aB += iB * LB; + + data.positions[m_indexA].c = cA; + data.positions[m_indexA].a = aA; + data.positions[m_indexB].c = cB; + data.positions[m_indexB].a = aB; + + return linearError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2PrismaticJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2PrismaticJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2PrismaticJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * (m_impulse.x * m_perp + (m_motorImpulse + m_impulse.z) * m_axis); +} + +float32 b2PrismaticJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_impulse.y; +} + +float32 b2PrismaticJoint::GetJointTranslation() const +{ + b2Vec2 pA = m_bodyA->GetWorldPoint(m_localAnchorA); + b2Vec2 pB = m_bodyB->GetWorldPoint(m_localAnchorB); + b2Vec2 d = pB - pA; + b2Vec2 axis = m_bodyA->GetWorldVector(m_localXAxisA); + + float32 translation = b2Dot(d, axis); + return translation; +} + +float32 b2PrismaticJoint::GetJointSpeed() const +{ + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + b2Vec2 rA = b2Mul(bA->m_xf.q, m_localAnchorA - bA->m_sweep.localCenter); + b2Vec2 rB = b2Mul(bB->m_xf.q, m_localAnchorB - bB->m_sweep.localCenter); + b2Vec2 p1 = bA->m_sweep.c + rA; + b2Vec2 p2 = bB->m_sweep.c + rB; + b2Vec2 d = p2 - p1; + b2Vec2 axis = b2Mul(bA->m_xf.q, m_localXAxisA); + + b2Vec2 vA = bA->m_linearVelocity; + b2Vec2 vB = bB->m_linearVelocity; + float32 wA = bA->m_angularVelocity; + float32 wB = bB->m_angularVelocity; + + float32 speed = b2Dot(d, b2Cross(wA, axis)) + b2Dot(axis, vB + b2Cross(wB, rB) - vA - b2Cross(wA, rA)); + return speed; +} + +bool b2PrismaticJoint::IsLimitEnabled() const +{ + return m_enableLimit; +} + +void b2PrismaticJoint::EnableLimit(bool flag) +{ + if (flag != m_enableLimit) + { + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableLimit = flag; + m_impulse.z = 0.0f; + } +} + +float32 b2PrismaticJoint::GetLowerLimit() const +{ + return m_lowerTranslation; +} + +float32 b2PrismaticJoint::GetUpperLimit() const +{ + return m_upperTranslation; +} + +void b2PrismaticJoint::SetLimits(float32 lower, float32 upper) +{ + b2Assert(lower <= upper); + if (lower != m_lowerTranslation || upper != m_upperTranslation) + { + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_lowerTranslation = lower; + m_upperTranslation = upper; + m_impulse.z = 0.0f; + } +} + +bool b2PrismaticJoint::IsMotorEnabled() const +{ + return m_enableMotor; +} + +void b2PrismaticJoint::EnableMotor(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableMotor = flag; +} + +void b2PrismaticJoint::SetMotorSpeed(float32 speed) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_motorSpeed = speed; +} + +void b2PrismaticJoint::SetMaxMotorForce(float32 force) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_maxMotorForce = force; +} + +float32 b2PrismaticJoint::GetMotorForce(float32 inv_dt) const +{ + return inv_dt * m_motorImpulse; +} + +void b2PrismaticJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2PrismaticJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.localAnchorA.Set(%.15lef, %.15lef);\n", m_localAnchorA.x, m_localAnchorA.y); + b2Log(" jd.localAnchorB.Set(%.15lef, %.15lef);\n", m_localAnchorB.x, m_localAnchorB.y); + b2Log(" jd.localAxisA.Set(%.15lef, %.15lef);\n", m_localXAxisA.x, m_localXAxisA.y); + b2Log(" jd.referenceAngle = %.15lef;\n", m_referenceAngle); + b2Log(" jd.enableLimit = bool(%d);\n", m_enableLimit); + b2Log(" jd.lowerTranslation = %.15lef;\n", m_lowerTranslation); + b2Log(" jd.upperTranslation = %.15lef;\n", m_upperTranslation); + b2Log(" jd.enableMotor = bool(%d);\n", m_enableMotor); + b2Log(" jd.motorSpeed = %.15lef;\n", m_motorSpeed); + b2Log(" jd.maxMotorForce = %.15lef;\n", m_maxMotorForce); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.h new file mode 100755 index 00000000..6ef5d3ec --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PrismaticJoint.h @@ -0,0 +1,196 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_PRISMATIC_JOINT_H +#define B2_PRISMATIC_JOINT_H + +#include + +/// Prismatic joint definition. This requires defining a line of +/// motion using an axis and an anchor point. The definition uses local +/// anchor points and a local axis so that the initial configuration +/// can violate the constraint slightly. The joint translation is zero +/// when the local anchor points coincide in world space. Using local +/// anchors and a local axis helps when saving and loading a game. +struct b2PrismaticJointDef : public b2JointDef +{ + b2PrismaticJointDef() + { + type = e_prismaticJoint; + localAnchorA.SetZero(); + localAnchorB.SetZero(); + localAxisA.Set(1.0f, 0.0f); + referenceAngle = 0.0f; + enableLimit = false; + lowerTranslation = 0.0f; + upperTranslation = 0.0f; + enableMotor = false; + maxMotorForce = 0.0f; + motorSpeed = 0.0f; + } + + /// Initialize the bodies, anchors, axis, and reference angle using the world + /// anchor and unit world axis. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The local translation unit axis in bodyA. + b2Vec2 localAxisA; + + /// The constrained angle between the bodies: bodyB_angle - bodyA_angle. + float32 referenceAngle; + + /// Enable/disable the joint limit. + bool enableLimit; + + /// The lower translation limit, usually in meters. + float32 lowerTranslation; + + /// The upper translation limit, usually in meters. + float32 upperTranslation; + + /// Enable/disable the joint motor. + bool enableMotor; + + /// The maximum motor torque, usually in N-m. + float32 maxMotorForce; + + /// The desired motor speed in radians per second. + float32 motorSpeed; +}; + +/// A prismatic joint. This joint provides one degree of freedom: translation +/// along an axis fixed in bodyA. Relative rotation is prevented. You can +/// use a joint limit to restrict the range of motion and a joint motor to +/// drive the motion or to model joint friction. +class b2PrismaticJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// The local anchor point relative to bodyA's origin. + const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } + + /// The local anchor point relative to bodyB's origin. + const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; } + + /// The local joint axis relative to bodyA. + const b2Vec2& GetLocalAxisA() const { return m_localXAxisA; } + + /// Get the reference angle. + float32 GetReferenceAngle() const { return m_referenceAngle; } + + /// Get the current joint translation, usually in meters. + float32 GetJointTranslation() const; + + /// Get the current joint translation speed, usually in meters per second. + float32 GetJointSpeed() const; + + /// Is the joint limit enabled? + bool IsLimitEnabled() const; + + /// Enable/disable the joint limit. + void EnableLimit(bool flag); + + /// Get the lower joint limit, usually in meters. + float32 GetLowerLimit() const; + + /// Get the upper joint limit, usually in meters. + float32 GetUpperLimit() const; + + /// Set the joint limits, usually in meters. + void SetLimits(float32 lower, float32 upper); + + /// Is the joint motor enabled? + bool IsMotorEnabled() const; + + /// Enable/disable the joint motor. + void EnableMotor(bool flag); + + /// Set the motor speed, usually in meters per second. + void SetMotorSpeed(float32 speed); + + /// Get the motor speed, usually in meters per second. + float32 GetMotorSpeed() const; + + /// Set the maximum motor force, usually in N. + void SetMaxMotorForce(float32 force); + float32 GetMaxMotorForce() const { return m_maxMotorForce; } + + /// Get the current motor force given the inverse time step, usually in N. + float32 GetMotorForce(float32 inv_dt) const; + + /// Dump to b2Log + void Dump(); + +protected: + friend class b2Joint; + friend class b2GearJoint; + b2PrismaticJoint(const b2PrismaticJointDef* def); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + b2Vec2 m_localXAxisA; + b2Vec2 m_localYAxisA; + float32 m_referenceAngle; + b2Vec3 m_impulse; + float32 m_motorImpulse; + float32 m_lowerTranslation; + float32 m_upperTranslation; + float32 m_maxMotorForce; + float32 m_motorSpeed; + bool m_enableLimit; + bool m_enableMotor; + b2LimitState m_limitState; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + b2Vec2 m_axis, m_perp; + float32 m_s1, m_s2; + float32 m_a1, m_a2; + b2Mat33 m_K; + float32 m_motorMass; +}; + +inline float32 b2PrismaticJoint::GetMotorSpeed() const +{ + return m_motorSpeed; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.cpp new file mode 100755 index 00000000..9cd340f1 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.cpp @@ -0,0 +1,348 @@ +/* +* Copyright (c) 2007 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// Pulley: +// length1 = norm(p1 - s1) +// length2 = norm(p2 - s2) +// C0 = (length1 + ratio * length2)_initial +// C = C0 - (length1 + ratio * length2) +// u1 = (p1 - s1) / norm(p1 - s1) +// u2 = (p2 - s2) / norm(p2 - s2) +// Cdot = -dot(u1, v1 + cross(w1, r1)) - ratio * dot(u2, v2 + cross(w2, r2)) +// J = -[u1 cross(r1, u1) ratio * u2 ratio * cross(r2, u2)] +// K = J * invM * JT +// = invMass1 + invI1 * cross(r1, u1)^2 + ratio^2 * (invMass2 + invI2 * cross(r2, u2)^2) + +void b2PulleyJointDef::Initialize(b2Body* bA, b2Body* bB, + const b2Vec2& groundA, const b2Vec2& groundB, + const b2Vec2& anchorA, const b2Vec2& anchorB, + float32 r) +{ + bodyA = bA; + bodyB = bB; + groundAnchorA = groundA; + groundAnchorB = groundB; + localAnchorA = bodyA->GetLocalPoint(anchorA); + localAnchorB = bodyB->GetLocalPoint(anchorB); + b2Vec2 dA = anchorA - groundA; + lengthA = dA.Length(); + b2Vec2 dB = anchorB - groundB; + lengthB = dB.Length(); + ratio = r; + b2Assert(ratio > b2_epsilon); +} + +b2PulleyJoint::b2PulleyJoint(const b2PulleyJointDef* def) +: b2Joint(def) +{ + m_groundAnchorA = def->groundAnchorA; + m_groundAnchorB = def->groundAnchorB; + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + + m_lengthA = def->lengthA; + m_lengthB = def->lengthB; + + b2Assert(def->ratio != 0.0f); + m_ratio = def->ratio; + + m_constant = def->lengthA + m_ratio * def->lengthB; + + m_impulse = 0.0f; +} + +void b2PulleyJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + m_rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + m_rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + + // Get the pulley axes. + m_uA = cA + m_rA - m_groundAnchorA; + m_uB = cB + m_rB - m_groundAnchorB; + + float32 lengthA = m_uA.Length(); + float32 lengthB = m_uB.Length(); + + if (lengthA > 10.0f * b2_linearSlop) + { + m_uA *= 1.0f / lengthA; + } + else + { + m_uA.SetZero(); + } + + if (lengthB > 10.0f * b2_linearSlop) + { + m_uB *= 1.0f / lengthB; + } + else + { + m_uB.SetZero(); + } + + // Compute effective mass. + float32 ruA = b2Cross(m_rA, m_uA); + float32 ruB = b2Cross(m_rB, m_uB); + + float32 mA = m_invMassA + m_invIA * ruA * ruA; + float32 mB = m_invMassB + m_invIB * ruB * ruB; + + m_mass = mA + m_ratio * m_ratio * mB; + + if (m_mass > 0.0f) + { + m_mass = 1.0f / m_mass; + } + + if (data.step.warmStarting) + { + // Scale impulses to support variable time steps. + m_impulse *= data.step.dtRatio; + + // Warm starting. + b2Vec2 PA = -(m_impulse) * m_uA; + b2Vec2 PB = (-m_ratio * m_impulse) * m_uB; + + vA += m_invMassA * PA; + wA += m_invIA * b2Cross(m_rA, PA); + vB += m_invMassB * PB; + wB += m_invIB * b2Cross(m_rB, PB); + } + else + { + m_impulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2PulleyJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Vec2 vpA = vA + b2Cross(wA, m_rA); + b2Vec2 vpB = vB + b2Cross(wB, m_rB); + + float32 Cdot = -b2Dot(m_uA, vpA) - m_ratio * b2Dot(m_uB, vpB); + float32 impulse = -m_mass * Cdot; + m_impulse += impulse; + + b2Vec2 PA = -impulse * m_uA; + b2Vec2 PB = -m_ratio * impulse * m_uB; + vA += m_invMassA * PA; + wA += m_invIA * b2Cross(m_rA, PA); + vB += m_invMassB * PB; + wB += m_invIB * b2Cross(m_rB, PB); + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2PulleyJoint::SolvePositionConstraints(const b2SolverData& data) +{ + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + + b2Rot qA(aA), qB(aB); + + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + + // Get the pulley axes. + b2Vec2 uA = cA + rA - m_groundAnchorA; + b2Vec2 uB = cB + rB - m_groundAnchorB; + + float32 lengthA = uA.Length(); + float32 lengthB = uB.Length(); + + if (lengthA > 10.0f * b2_linearSlop) + { + uA *= 1.0f / lengthA; + } + else + { + uA.SetZero(); + } + + if (lengthB > 10.0f * b2_linearSlop) + { + uB *= 1.0f / lengthB; + } + else + { + uB.SetZero(); + } + + // Compute effective mass. + float32 ruA = b2Cross(rA, uA); + float32 ruB = b2Cross(rB, uB); + + float32 mA = m_invMassA + m_invIA * ruA * ruA; + float32 mB = m_invMassB + m_invIB * ruB * ruB; + + float32 mass = mA + m_ratio * m_ratio * mB; + + if (mass > 0.0f) + { + mass = 1.0f / mass; + } + + float32 C = m_constant - lengthA - m_ratio * lengthB; + float32 linearError = b2Abs(C); + + float32 impulse = -mass * C; + + b2Vec2 PA = -impulse * uA; + b2Vec2 PB = -m_ratio * impulse * uB; + + cA += m_invMassA * PA; + aA += m_invIA * b2Cross(rA, PA); + cB += m_invMassB * PB; + aB += m_invIB * b2Cross(rB, PB); + + data.positions[m_indexA].c = cA; + data.positions[m_indexA].a = aA; + data.positions[m_indexB].c = cB; + data.positions[m_indexB].a = aB; + + return linearError < b2_linearSlop; +} + +b2Vec2 b2PulleyJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2PulleyJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2PulleyJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 P = m_impulse * m_uB; + return inv_dt * P; +} + +float32 b2PulleyJoint::GetReactionTorque(float32 inv_dt) const +{ + B2_NOT_USED(inv_dt); + return 0.0f; +} + +b2Vec2 b2PulleyJoint::GetGroundAnchorA() const +{ + return m_groundAnchorA; +} + +b2Vec2 b2PulleyJoint::GetGroundAnchorB() const +{ + return m_groundAnchorB; +} + +float32 b2PulleyJoint::GetLengthA() const +{ + return m_lengthA; +} + +float32 b2PulleyJoint::GetLengthB() const +{ + return m_lengthB; +} + +float32 b2PulleyJoint::GetRatio() const +{ + return m_ratio; +} + +float32 b2PulleyJoint::GetCurrentLengthA() const +{ + b2Vec2 p = m_bodyA->GetWorldPoint(m_localAnchorA); + b2Vec2 s = m_groundAnchorA; + b2Vec2 d = p - s; + return d.Length(); +} + +float32 b2PulleyJoint::GetCurrentLengthB() const +{ + b2Vec2 p = m_bodyB->GetWorldPoint(m_localAnchorB); + b2Vec2 s = m_groundAnchorB; + b2Vec2 d = p - s; + return d.Length(); +} + +void b2PulleyJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2PulleyJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.groundAnchorA.Set(%.15lef, %.15lef);\n", m_groundAnchorA.x, m_groundAnchorA.y); + b2Log(" jd.groundAnchorB.Set(%.15lef, %.15lef);\n", m_groundAnchorB.x, m_groundAnchorB.y); + b2Log(" jd.localAnchorA.Set(%.15lef, %.15lef);\n", m_localAnchorA.x, m_localAnchorA.y); + b2Log(" jd.localAnchorB.Set(%.15lef, %.15lef);\n", m_localAnchorB.x, m_localAnchorB.y); + b2Log(" jd.lengthA = %.15lef;\n", m_lengthA); + b2Log(" jd.lengthB = %.15lef;\n", m_lengthB); + b2Log(" jd.ratio = %.15lef;\n", m_ratio); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} + +void b2PulleyJoint::ShiftOrigin(const b2Vec2& newOrigin) +{ + m_groundAnchorA -= newOrigin; + m_groundAnchorB -= newOrigin; +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.h new file mode 100755 index 00000000..44843e7b --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2PulleyJoint.h @@ -0,0 +1,152 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_PULLEY_JOINT_H +#define B2_PULLEY_JOINT_H + +#include + +const float32 b2_minPulleyLength = 2.0f; + +/// Pulley joint definition. This requires two ground anchors, +/// two dynamic body anchor points, and a pulley ratio. +struct b2PulleyJointDef : public b2JointDef +{ + b2PulleyJointDef() + { + type = e_pulleyJoint; + groundAnchorA.Set(-1.0f, 1.0f); + groundAnchorB.Set(1.0f, 1.0f); + localAnchorA.Set(-1.0f, 0.0f); + localAnchorB.Set(1.0f, 0.0f); + lengthA = 0.0f; + lengthB = 0.0f; + ratio = 1.0f; + collideConnected = true; + } + + /// Initialize the bodies, anchors, lengths, max lengths, and ratio using the world anchors. + void Initialize(b2Body* bodyA, b2Body* bodyB, + const b2Vec2& groundAnchorA, const b2Vec2& groundAnchorB, + const b2Vec2& anchorA, const b2Vec2& anchorB, + float32 ratio); + + /// The first ground anchor in world coordinates. This point never moves. + b2Vec2 groundAnchorA; + + /// The second ground anchor in world coordinates. This point never moves. + b2Vec2 groundAnchorB; + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The a reference length for the segment attached to bodyA. + float32 lengthA; + + /// The a reference length for the segment attached to bodyB. + float32 lengthB; + + /// The pulley ratio, used to simulate a block-and-tackle. + float32 ratio; +}; + +/// The pulley joint is connected to two bodies and two fixed ground points. +/// The pulley supports a ratio such that: +/// length1 + ratio * length2 <= constant +/// Yes, the force transmitted is scaled by the ratio. +/// Warning: the pulley joint can get a bit squirrelly by itself. They often +/// work better when combined with prismatic joints. You should also cover the +/// the anchor points with static shapes to prevent one side from going to +/// zero length. +class b2PulleyJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// Get the first ground anchor. + b2Vec2 GetGroundAnchorA() const; + + /// Get the second ground anchor. + b2Vec2 GetGroundAnchorB() const; + + /// Get the current length of the segment attached to bodyA. + float32 GetLengthA() const; + + /// Get the current length of the segment attached to bodyB. + float32 GetLengthB() const; + + /// Get the pulley ratio. + float32 GetRatio() const; + + /// Get the current length of the segment attached to bodyA. + float32 GetCurrentLengthA() const; + + /// Get the current length of the segment attached to bodyB. + float32 GetCurrentLengthB() const; + + /// Dump joint to dmLog + void Dump(); + + /// Implement b2Joint::ShiftOrigin + void ShiftOrigin(const b2Vec2& newOrigin); + +protected: + + friend class b2Joint; + b2PulleyJoint(const b2PulleyJointDef* data); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + b2Vec2 m_groundAnchorA; + b2Vec2 m_groundAnchorB; + float32 m_lengthA; + float32 m_lengthB; + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + float32 m_constant; + float32 m_ratio; + float32 m_impulse; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_uA; + b2Vec2 m_uB; + b2Vec2 m_rA; + b2Vec2 m_rB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + float32 m_mass; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp new file mode 100755 index 00000000..64bd1907 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.cpp @@ -0,0 +1,502 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// Point-to-point constraint +// C = p2 - p1 +// Cdot = v2 - v1 +// = v2 + cross(w2, r2) - v1 - cross(w1, r1) +// J = [-I -r1_skew I r2_skew ] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +// Motor constraint +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// K = invI1 + invI2 + +void b2RevoluteJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor) +{ + bodyA = bA; + bodyB = bB; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); +} + +b2RevoluteJoint::b2RevoluteJoint(const b2RevoluteJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + m_referenceAngle = def->referenceAngle; + + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + + m_lowerAngle = def->lowerAngle; + m_upperAngle = def->upperAngle; + m_maxMotorTorque = def->maxMotorTorque; + m_motorSpeed = def->motorSpeed; + m_enableLimit = def->enableLimit; + m_enableMotor = def->enableMotor; + m_limitState = e_inactiveLimit; +} + +void b2RevoluteJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + m_rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + m_rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + bool fixedRotation = (iA + iB == 0.0f); + + m_mass.ex.x = mA + mB + m_rA.y * m_rA.y * iA + m_rB.y * m_rB.y * iB; + m_mass.ey.x = -m_rA.y * m_rA.x * iA - m_rB.y * m_rB.x * iB; + m_mass.ez.x = -m_rA.y * iA - m_rB.y * iB; + m_mass.ex.y = m_mass.ey.x; + m_mass.ey.y = mA + mB + m_rA.x * m_rA.x * iA + m_rB.x * m_rB.x * iB; + m_mass.ez.y = m_rA.x * iA + m_rB.x * iB; + m_mass.ex.z = m_mass.ez.x; + m_mass.ey.z = m_mass.ez.y; + m_mass.ez.z = iA + iB; + + m_motorMass = iA + iB; + if (m_motorMass > 0.0f) + { + m_motorMass = 1.0f / m_motorMass; + } + + if (m_enableMotor == false || fixedRotation) + { + m_motorImpulse = 0.0f; + } + + if (m_enableLimit && fixedRotation == false) + { + float32 jointAngle = aB - aA - m_referenceAngle; + if (b2Abs(m_upperAngle - m_lowerAngle) < 2.0f * b2_angularSlop) + { + m_limitState = e_equalLimits; + } + else if (jointAngle <= m_lowerAngle) + { + if (m_limitState != e_atLowerLimit) + { + m_impulse.z = 0.0f; + } + m_limitState = e_atLowerLimit; + } + else if (jointAngle >= m_upperAngle) + { + if (m_limitState != e_atUpperLimit) + { + m_impulse.z = 0.0f; + } + m_limitState = e_atUpperLimit; + } + else + { + m_limitState = e_inactiveLimit; + m_impulse.z = 0.0f; + } + } + else + { + m_limitState = e_inactiveLimit; + } + + if (data.step.warmStarting) + { + // Scale impulses to support a variable time step. + m_impulse *= data.step.dtRatio; + m_motorImpulse *= data.step.dtRatio; + + b2Vec2 P(m_impulse.x, m_impulse.y); + + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + m_motorImpulse + m_impulse.z); + + vB += mB * P; + wB += iB * (b2Cross(m_rB, P) + m_motorImpulse + m_impulse.z); + } + else + { + m_impulse.SetZero(); + m_motorImpulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2RevoluteJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + bool fixedRotation = (iA + iB == 0.0f); + + // Solve motor constraint. + if (m_enableMotor && m_limitState != e_equalLimits && fixedRotation == false) + { + float32 Cdot = wB - wA - m_motorSpeed; + float32 impulse = -m_motorMass * Cdot; + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = data.step.dt * m_maxMotorTorque; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + wA -= iA * impulse; + wB += iB * impulse; + } + + // Solve limit constraint. + if (m_enableLimit && m_limitState != e_inactiveLimit && fixedRotation == false) + { + b2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA); + float32 Cdot2 = wB - wA; + b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); + + b2Vec3 impulse = -m_mass.Solve33(Cdot); + + if (m_limitState == e_equalLimits) + { + m_impulse += impulse; + } + else if (m_limitState == e_atLowerLimit) + { + float32 newImpulse = m_impulse.z + impulse.z; + if (newImpulse < 0.0f) + { + b2Vec2 rhs = -Cdot1 + m_impulse.z * b2Vec2(m_mass.ez.x, m_mass.ez.y); + b2Vec2 reduced = m_mass.Solve22(rhs); + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -m_impulse.z; + m_impulse.x += reduced.x; + m_impulse.y += reduced.y; + m_impulse.z = 0.0f; + } + else + { + m_impulse += impulse; + } + } + else if (m_limitState == e_atUpperLimit) + { + float32 newImpulse = m_impulse.z + impulse.z; + if (newImpulse > 0.0f) + { + b2Vec2 rhs = -Cdot1 + m_impulse.z * b2Vec2(m_mass.ez.x, m_mass.ez.y); + b2Vec2 reduced = m_mass.Solve22(rhs); + impulse.x = reduced.x; + impulse.y = reduced.y; + impulse.z = -m_impulse.z; + m_impulse.x += reduced.x; + m_impulse.y += reduced.y; + m_impulse.z = 0.0f; + } + else + { + m_impulse += impulse; + } + } + + b2Vec2 P(impulse.x, impulse.y); + + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + impulse.z); + + vB += mB * P; + wB += iB * (b2Cross(m_rB, P) + impulse.z); + } + else + { + // Solve point-to-point constraint + b2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA); + b2Vec2 impulse = m_mass.Solve22(-Cdot); + + m_impulse.x += impulse.x; + m_impulse.y += impulse.y; + + vA -= mA * impulse; + wA -= iA * b2Cross(m_rA, impulse); + + vB += mB * impulse; + wB += iB * b2Cross(m_rB, impulse); + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2RevoluteJoint::SolvePositionConstraints(const b2SolverData& data) +{ + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + + b2Rot qA(aA), qB(aB); + + float32 angularError = 0.0f; + float32 positionError = 0.0f; + + bool fixedRotation = (m_invIA + m_invIB == 0.0f); + + // Solve angular limit constraint. + if (m_enableLimit && m_limitState != e_inactiveLimit && fixedRotation == false) + { + float32 angle = aB - aA - m_referenceAngle; + float32 limitImpulse = 0.0f; + + if (m_limitState == e_equalLimits) + { + // Prevent large angular corrections + float32 C = b2Clamp(angle - m_lowerAngle, -b2_maxAngularCorrection, b2_maxAngularCorrection); + limitImpulse = -m_motorMass * C; + angularError = b2Abs(C); + } + else if (m_limitState == e_atLowerLimit) + { + float32 C = angle - m_lowerAngle; + angularError = -C; + + // Prevent large angular corrections and allow some slop. + C = b2Clamp(C + b2_angularSlop, -b2_maxAngularCorrection, 0.0f); + limitImpulse = -m_motorMass * C; + } + else if (m_limitState == e_atUpperLimit) + { + float32 C = angle - m_upperAngle; + angularError = C; + + // Prevent large angular corrections and allow some slop. + C = b2Clamp(C - b2_angularSlop, 0.0f, b2_maxAngularCorrection); + limitImpulse = -m_motorMass * C; + } + + aA -= m_invIA * limitImpulse; + aB += m_invIB * limitImpulse; + } + + // Solve point-to-point constraint. + { + qA.Set(aA); + qB.Set(aB); + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + + b2Vec2 C = cB + rB - cA - rA; + positionError = C.Length(); + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + b2Mat22 K; + K.ex.x = mA + mB + iA * rA.y * rA.y + iB * rB.y * rB.y; + K.ex.y = -iA * rA.x * rA.y - iB * rB.x * rB.y; + K.ey.x = K.ex.y; + K.ey.y = mA + mB + iA * rA.x * rA.x + iB * rB.x * rB.x; + + b2Vec2 impulse = -K.Solve(C); + + cA -= mA * impulse; + aA -= iA * b2Cross(rA, impulse); + + cB += mB * impulse; + aB += iB * b2Cross(rB, impulse); + } + + data.positions[m_indexA].c = cA; + data.positions[m_indexA].a = aA; + data.positions[m_indexB].c = cB; + data.positions[m_indexB].a = aB; + + return positionError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2RevoluteJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2RevoluteJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2RevoluteJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 P(m_impulse.x, m_impulse.y); + return inv_dt * P; +} + +float32 b2RevoluteJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_impulse.z; +} + +float32 b2RevoluteJoint::GetJointAngle() const +{ + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + return bB->m_sweep.a - bA->m_sweep.a - m_referenceAngle; +} + +float32 b2RevoluteJoint::GetJointSpeed() const +{ + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + return bB->m_angularVelocity - bA->m_angularVelocity; +} + +bool b2RevoluteJoint::IsMotorEnabled() const +{ + return m_enableMotor; +} + +void b2RevoluteJoint::EnableMotor(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableMotor = flag; +} + +float32 b2RevoluteJoint::GetMotorTorque(float32 inv_dt) const +{ + return inv_dt * m_motorImpulse; +} + +void b2RevoluteJoint::SetMotorSpeed(float32 speed) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_motorSpeed = speed; +} + +void b2RevoluteJoint::SetMaxMotorTorque(float32 torque) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_maxMotorTorque = torque; +} + +bool b2RevoluteJoint::IsLimitEnabled() const +{ + return m_enableLimit; +} + +void b2RevoluteJoint::EnableLimit(bool flag) +{ + if (flag != m_enableLimit) + { + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableLimit = flag; + m_impulse.z = 0.0f; + } +} + +float32 b2RevoluteJoint::GetLowerLimit() const +{ + return m_lowerAngle; +} + +float32 b2RevoluteJoint::GetUpperLimit() const +{ + return m_upperAngle; +} + +void b2RevoluteJoint::SetLimits(float32 lower, float32 upper) +{ + b2Assert(lower <= upper); + + if (lower != m_lowerAngle || upper != m_upperAngle) + { + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_impulse.z = 0.0f; + m_lowerAngle = lower; + m_upperAngle = upper; + } +} + +void b2RevoluteJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2RevoluteJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.localAnchorA.Set(%.15lef, %.15lef);\n", m_localAnchorA.x, m_localAnchorA.y); + b2Log(" jd.localAnchorB.Set(%.15lef, %.15lef);\n", m_localAnchorB.x, m_localAnchorB.y); + b2Log(" jd.referenceAngle = %.15lef;\n", m_referenceAngle); + b2Log(" jd.enableLimit = bool(%d);\n", m_enableLimit); + b2Log(" jd.lowerAngle = %.15lef;\n", m_lowerAngle); + b2Log(" jd.upperAngle = %.15lef;\n", m_upperAngle); + b2Log(" jd.enableMotor = bool(%d);\n", m_enableMotor); + b2Log(" jd.motorSpeed = %.15lef;\n", m_motorSpeed); + b2Log(" jd.maxMotorTorque = %.15lef;\n", m_maxMotorTorque); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.h new file mode 100755 index 00000000..bbed4a6c --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RevoluteJoint.h @@ -0,0 +1,204 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_REVOLUTE_JOINT_H +#define B2_REVOLUTE_JOINT_H + +#include + +/// Revolute joint definition. This requires defining an +/// anchor point where the bodies are joined. The definition +/// uses local anchor points so that the initial configuration +/// can violate the constraint slightly. You also need to +/// specify the initial relative angle for joint limits. This +/// helps when saving and loading a game. +/// The local anchor points are measured from the body's origin +/// rather than the center of mass because: +/// 1. you might not know where the center of mass will be. +/// 2. if you add/remove shapes from a body and recompute the mass, +/// the joints will be broken. +struct b2RevoluteJointDef : public b2JointDef +{ + b2RevoluteJointDef() + { + type = e_revoluteJoint; + localAnchorA.Set(0.0f, 0.0f); + localAnchorB.Set(0.0f, 0.0f); + referenceAngle = 0.0f; + lowerAngle = 0.0f; + upperAngle = 0.0f; + maxMotorTorque = 0.0f; + motorSpeed = 0.0f; + enableLimit = false; + enableMotor = false; + } + + /// Initialize the bodies, anchors, and reference angle using a world + /// anchor point. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The bodyB angle minus bodyA angle in the reference state (radians). + float32 referenceAngle; + + /// A flag to enable joint limits. + bool enableLimit; + + /// The lower angle for the joint limit (radians). + float32 lowerAngle; + + /// The upper angle for the joint limit (radians). + float32 upperAngle; + + /// A flag to enable the joint motor. + bool enableMotor; + + /// The desired motor speed. Usually in radians per second. + float32 motorSpeed; + + /// The maximum motor torque used to achieve the desired motor speed. + /// Usually in N-m. + float32 maxMotorTorque; +}; + +/// A revolute joint constrains two bodies to share a common point while they +/// are free to rotate about the point. The relative rotation about the shared +/// point is the joint angle. You can limit the relative rotation with +/// a joint limit that specifies a lower and upper angle. You can use a motor +/// to drive the relative rotation about the shared point. A maximum motor torque +/// is provided so that infinite forces are not generated. +class b2RevoluteJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + /// The local anchor point relative to bodyA's origin. + const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } + + /// The local anchor point relative to bodyB's origin. + const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; } + + /// Get the reference angle. + float32 GetReferenceAngle() const { return m_referenceAngle; } + + /// Get the current joint angle in radians. + float32 GetJointAngle() const; + + /// Get the current joint angle speed in radians per second. + float32 GetJointSpeed() const; + + /// Is the joint limit enabled? + bool IsLimitEnabled() const; + + /// Enable/disable the joint limit. + void EnableLimit(bool flag); + + /// Get the lower joint limit in radians. + float32 GetLowerLimit() const; + + /// Get the upper joint limit in radians. + float32 GetUpperLimit() const; + + /// Set the joint limits in radians. + void SetLimits(float32 lower, float32 upper); + + /// Is the joint motor enabled? + bool IsMotorEnabled() const; + + /// Enable/disable the joint motor. + void EnableMotor(bool flag); + + /// Set the motor speed in radians per second. + void SetMotorSpeed(float32 speed); + + /// Get the motor speed in radians per second. + float32 GetMotorSpeed() const; + + /// Set the maximum motor torque, usually in N-m. + void SetMaxMotorTorque(float32 torque); + float32 GetMaxMotorTorque() const { return m_maxMotorTorque; } + + /// Get the reaction force given the inverse time step. + /// Unit is N. + b2Vec2 GetReactionForce(float32 inv_dt) const; + + /// Get the reaction torque due to the joint limit given the inverse time step. + /// Unit is N*m. + float32 GetReactionTorque(float32 inv_dt) const; + + /// Get the current motor torque given the inverse time step. + /// Unit is N*m. + float32 GetMotorTorque(float32 inv_dt) const; + + /// Dump to b2Log. + void Dump(); + +protected: + + friend class b2Joint; + friend class b2GearJoint; + + b2RevoluteJoint(const b2RevoluteJointDef* def); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + b2Vec3 m_impulse; + float32 m_motorImpulse; + + bool m_enableMotor; + float32 m_maxMotorTorque; + float32 m_motorSpeed; + + bool m_enableLimit; + float32 m_referenceAngle; + float32 m_lowerAngle; + float32 m_upperAngle; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_rA; + b2Vec2 m_rB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + b2Mat33 m_mass; // effective mass for point-to-point constraint. + float32 m_motorMass; // effective mass for motor/limit angular constraint. + b2LimitState m_limitState; +}; + +inline float32 b2RevoluteJoint::GetMotorSpeed() const +{ + return m_motorSpeed; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.cpp new file mode 100755 index 00000000..952ee7a3 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.cpp @@ -0,0 +1,241 @@ +/* +* Copyright (c) 2007-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + + +// Limit: +// C = norm(pB - pA) - L +// u = (pB - pA) / norm(pB - pA) +// Cdot = dot(u, vB + cross(wB, rB) - vA - cross(wA, rA)) +// J = [-u -cross(rA, u) u cross(rB, u)] +// K = J * invM * JT +// = invMassA + invIA * cross(rA, u)^2 + invMassB + invIB * cross(rB, u)^2 + +b2RopeJoint::b2RopeJoint(const b2RopeJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + + m_maxLength = def->maxLength; + + m_mass = 0.0f; + m_impulse = 0.0f; + m_state = e_inactiveLimit; + m_length = 0.0f; +} + +void b2RopeJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + m_rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + m_rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + m_u = cB + m_rB - cA - m_rA; + + m_length = m_u.Length(); + + float32 C = m_length - m_maxLength; + if (C > 0.0f) + { + m_state = e_atUpperLimit; + } + else + { + m_state = e_inactiveLimit; + } + + if (m_length > b2_linearSlop) + { + m_u *= 1.0f / m_length; + } + else + { + m_u.SetZero(); + m_mass = 0.0f; + m_impulse = 0.0f; + return; + } + + // Compute effective mass. + float32 crA = b2Cross(m_rA, m_u); + float32 crB = b2Cross(m_rB, m_u); + float32 invMass = m_invMassA + m_invIA * crA * crA + m_invMassB + m_invIB * crB * crB; + + m_mass = invMass != 0.0f ? 1.0f / invMass : 0.0f; + + if (data.step.warmStarting) + { + // Scale the impulse to support a variable time step. + m_impulse *= data.step.dtRatio; + + b2Vec2 P = m_impulse * m_u; + vA -= m_invMassA * P; + wA -= m_invIA * b2Cross(m_rA, P); + vB += m_invMassB * P; + wB += m_invIB * b2Cross(m_rB, P); + } + else + { + m_impulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2RopeJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + // Cdot = dot(u, v + cross(w, r)) + b2Vec2 vpA = vA + b2Cross(wA, m_rA); + b2Vec2 vpB = vB + b2Cross(wB, m_rB); + float32 C = m_length - m_maxLength; + float32 Cdot = b2Dot(m_u, vpB - vpA); + + // Predictive constraint. + if (C < 0.0f) + { + Cdot += data.step.inv_dt * C; + } + + float32 impulse = -m_mass * Cdot; + float32 oldImpulse = m_impulse; + m_impulse = b2Min(0.0f, m_impulse + impulse); + impulse = m_impulse - oldImpulse; + + b2Vec2 P = impulse * m_u; + vA -= m_invMassA * P; + wA -= m_invIA * b2Cross(m_rA, P); + vB += m_invMassB * P; + wB += m_invIB * b2Cross(m_rB, P); + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2RopeJoint::SolvePositionConstraints(const b2SolverData& data) +{ + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + + b2Rot qA(aA), qB(aB); + + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + b2Vec2 u = cB + rB - cA - rA; + + float32 length = u.Normalize(); + float32 C = length - m_maxLength; + + C = b2Clamp(C, 0.0f, b2_maxLinearCorrection); + + float32 impulse = -m_mass * C; + b2Vec2 P = impulse * u; + + cA -= m_invMassA * P; + aA -= m_invIA * b2Cross(rA, P); + cB += m_invMassB * P; + aB += m_invIB * b2Cross(rB, P); + + data.positions[m_indexA].c = cA; + data.positions[m_indexA].a = aA; + data.positions[m_indexB].c = cB; + data.positions[m_indexB].a = aB; + + return length - m_maxLength < b2_linearSlop; +} + +b2Vec2 b2RopeJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2RopeJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2RopeJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 F = (inv_dt * m_impulse) * m_u; + return F; +} + +float32 b2RopeJoint::GetReactionTorque(float32 inv_dt) const +{ + B2_NOT_USED(inv_dt); + return 0.0f; +} + +float32 b2RopeJoint::GetMaxLength() const +{ + return m_maxLength; +} + +b2LimitState b2RopeJoint::GetLimitState() const +{ + return m_state; +} + +void b2RopeJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2RopeJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.localAnchorA.Set(%.15lef, %.15lef);\n", m_localAnchorA.x, m_localAnchorA.y); + b2Log(" jd.localAnchorB.Set(%.15lef, %.15lef);\n", m_localAnchorB.x, m_localAnchorB.y); + b2Log(" jd.maxLength = %.15lef;\n", m_maxLength); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.h new file mode 100755 index 00000000..eaca575d --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2RopeJoint.h @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_ROPE_JOINT_H +#define B2_ROPE_JOINT_H + +#include + +/// Rope joint definition. This requires two body anchor points and +/// a maximum lengths. +/// Note: by default the connected objects will not collide. +/// see collideConnected in b2JointDef. +struct b2RopeJointDef : public b2JointDef +{ + b2RopeJointDef() + { + type = e_ropeJoint; + localAnchorA.Set(-1.0f, 0.0f); + localAnchorB.Set(1.0f, 0.0f); + maxLength = 0.0f; + } + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The maximum length of the rope. + /// Warning: this must be larger than b2_linearSlop or + /// the joint will have no effect. + float32 maxLength; +}; + +/// A rope joint enforces a maximum distance between two points +/// on two bodies. It has no other effect. +/// Warning: if you attempt to change the maximum length during +/// the simulation you will get some non-physical behavior. +/// A model that would allow you to dynamically modify the length +/// would have some sponginess, so I chose not to implement it +/// that way. See b2DistanceJoint if you want to dynamically +/// control length. +class b2RopeJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// The local anchor point relative to bodyA's origin. + const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } + + /// The local anchor point relative to bodyB's origin. + const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; } + + /// Set/Get the maximum length of the rope. + void SetMaxLength(float32 length) { m_maxLength = length; } + float32 GetMaxLength() const; + + b2LimitState GetLimitState() const; + + /// Dump joint to dmLog + void Dump(); + +protected: + + friend class b2Joint; + b2RopeJoint(const b2RopeJointDef* data); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + float32 m_maxLength; + float32 m_length; + float32 m_impulse; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_u; + b2Vec2 m_rA; + b2Vec2 m_rB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + float32 m_mass; + b2LimitState m_state; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.cpp new file mode 100755 index 00000000..253f7216 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.cpp @@ -0,0 +1,328 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// Point-to-point constraint +// C = p2 - p1 +// Cdot = v2 - v1 +// = v2 + cross(w2, r2) - v1 - cross(w1, r1) +// J = [-I -r1_skew I r2_skew ] +// Identity used: +// w k % (rx i + ry j) = w * (-ry i + rx j) + +// Angle constraint +// C = angle2 - angle1 - referenceAngle +// Cdot = w2 - w1 +// J = [0 0 -1 0 0 1] +// K = invI1 + invI2 + +void b2WeldJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor) +{ + bodyA = bA; + bodyB = bB; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + referenceAngle = bodyB->GetAngle() - bodyA->GetAngle(); +} + +b2WeldJoint::b2WeldJoint(const b2WeldJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + m_referenceAngle = def->referenceAngle; + m_frequencyHz = def->frequencyHz; + m_dampingRatio = def->dampingRatio; + + m_impulse.SetZero(); +} + +void b2WeldJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + m_rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + m_rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + + // J = [-I -r1_skew I r2_skew] + // [ 0 -1 0 1] + // r_skew = [-ry; rx] + + // Matlab + // K = [ mA+r1y^2*iA+mB+r2y^2*iB, -r1y*iA*r1x-r2y*iB*r2x, -r1y*iA-r2y*iB] + // [ -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB, r1x*iA+r2x*iB] + // [ -r1y*iA-r2y*iB, r1x*iA+r2x*iB, iA+iB] + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + b2Mat33 K; + K.ex.x = mA + mB + m_rA.y * m_rA.y * iA + m_rB.y * m_rB.y * iB; + K.ey.x = -m_rA.y * m_rA.x * iA - m_rB.y * m_rB.x * iB; + K.ez.x = -m_rA.y * iA - m_rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + m_rA.x * m_rA.x * iA + m_rB.x * m_rB.x * iB; + K.ez.y = m_rA.x * iA + m_rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + + if (m_frequencyHz > 0.0f) + { + K.GetInverse22(&m_mass); + + float32 invM = iA + iB; + float32 m = invM > 0.0f ? 1.0f / invM : 0.0f; + + float32 C = aB - aA - m_referenceAngle; + + // Frequency + float32 omega = 2.0f * b2_pi * m_frequencyHz; + + // Damping coefficient + float32 d = 2.0f * m * m_dampingRatio * omega; + + // Spring stiffness + float32 k = m * omega * omega; + + // magic formulas + float32 h = data.step.dt; + m_gamma = h * (d + h * k); + m_gamma = m_gamma != 0.0f ? 1.0f / m_gamma : 0.0f; + m_bias = C * h * k * m_gamma; + + invM += m_gamma; + m_mass.ez.z = invM != 0.0f ? 1.0f / invM : 0.0f; + } + else + { + K.GetSymInverse33(&m_mass); + m_gamma = 0.0f; + m_bias = 0.0f; + } + + if (data.step.warmStarting) + { + // Scale impulses to support a variable time step. + m_impulse *= data.step.dtRatio; + + b2Vec2 P(m_impulse.x, m_impulse.y); + + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + m_impulse.z); + + vB += mB * P; + wB += iB * (b2Cross(m_rB, P) + m_impulse.z); + } + else + { + m_impulse.SetZero(); + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2WeldJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + if (m_frequencyHz > 0.0f) + { + float32 Cdot2 = wB - wA; + + float32 impulse2 = -m_mass.ez.z * (Cdot2 + m_bias + m_gamma * m_impulse.z); + m_impulse.z += impulse2; + + wA -= iA * impulse2; + wB += iB * impulse2; + + b2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA); + + b2Vec2 impulse1 = -b2Mul22(m_mass, Cdot1); + m_impulse.x += impulse1.x; + m_impulse.y += impulse1.y; + + b2Vec2 P = impulse1; + + vA -= mA * P; + wA -= iA * b2Cross(m_rA, P); + + vB += mB * P; + wB += iB * b2Cross(m_rB, P); + } + else + { + b2Vec2 Cdot1 = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA); + float32 Cdot2 = wB - wA; + b2Vec3 Cdot(Cdot1.x, Cdot1.y, Cdot2); + + b2Vec3 impulse = -b2Mul(m_mass, Cdot); + m_impulse += impulse; + + b2Vec2 P(impulse.x, impulse.y); + + vA -= mA * P; + wA -= iA * (b2Cross(m_rA, P) + impulse.z); + + vB += mB * P; + wB += iB * (b2Cross(m_rB, P) + impulse.z); + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2WeldJoint::SolvePositionConstraints(const b2SolverData& data) +{ + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + + b2Rot qA(aA), qB(aB); + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + + float32 positionError, angularError; + + b2Mat33 K; + K.ex.x = mA + mB + rA.y * rA.y * iA + rB.y * rB.y * iB; + K.ey.x = -rA.y * rA.x * iA - rB.y * rB.x * iB; + K.ez.x = -rA.y * iA - rB.y * iB; + K.ex.y = K.ey.x; + K.ey.y = mA + mB + rA.x * rA.x * iA + rB.x * rB.x * iB; + K.ez.y = rA.x * iA + rB.x * iB; + K.ex.z = K.ez.x; + K.ey.z = K.ez.y; + K.ez.z = iA + iB; + + if (m_frequencyHz > 0.0f) + { + b2Vec2 C1 = cB + rB - cA - rA; + + positionError = C1.Length(); + angularError = 0.0f; + + b2Vec2 P = -K.Solve22(C1); + + cA -= mA * P; + aA -= iA * b2Cross(rA, P); + + cB += mB * P; + aB += iB * b2Cross(rB, P); + } + else + { + b2Vec2 C1 = cB + rB - cA - rA; + float32 C2 = aB - aA - m_referenceAngle; + + positionError = C1.Length(); + angularError = b2Abs(C2); + + b2Vec3 C(C1.x, C1.y, C2); + + b2Vec3 impulse = -K.Solve33(C); + b2Vec2 P(impulse.x, impulse.y); + + cA -= mA * P; + aA -= iA * (b2Cross(rA, P) + impulse.z); + + cB += mB * P; + aB += iB * (b2Cross(rB, P) + impulse.z); + } + + data.positions[m_indexA].c = cA; + data.positions[m_indexA].a = aA; + data.positions[m_indexB].c = cB; + data.positions[m_indexB].a = aB; + + return positionError <= b2_linearSlop && angularError <= b2_angularSlop; +} + +b2Vec2 b2WeldJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2WeldJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2WeldJoint::GetReactionForce(float32 inv_dt) const +{ + b2Vec2 P(m_impulse.x, m_impulse.y); + return inv_dt * P; +} + +float32 b2WeldJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_impulse.z; +} + +void b2WeldJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2WeldJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.localAnchorA.Set(%.15lef, %.15lef);\n", m_localAnchorA.x, m_localAnchorA.y); + b2Log(" jd.localAnchorB.Set(%.15lef, %.15lef);\n", m_localAnchorB.x, m_localAnchorB.y); + b2Log(" jd.referenceAngle = %.15lef;\n", m_referenceAngle); + b2Log(" jd.frequencyHz = %.15lef;\n", m_frequencyHz); + b2Log(" jd.dampingRatio = %.15lef;\n", m_dampingRatio); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.h new file mode 100755 index 00000000..eed9bc10 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WeldJoint.h @@ -0,0 +1,126 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_WELD_JOINT_H +#define B2_WELD_JOINT_H + +#include + +/// Weld joint definition. You need to specify local anchor points +/// where they are attached and the relative body angle. The position +/// of the anchor points is important for computing the reaction torque. +struct b2WeldJointDef : public b2JointDef +{ + b2WeldJointDef() + { + type = e_weldJoint; + localAnchorA.Set(0.0f, 0.0f); + localAnchorB.Set(0.0f, 0.0f); + referenceAngle = 0.0f; + frequencyHz = 0.0f; + dampingRatio = 0.0f; + } + + /// Initialize the bodies, anchors, and reference angle using a world + /// anchor point. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor); + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The bodyB angle minus bodyA angle in the reference state (radians). + float32 referenceAngle; + + /// The mass-spring-damper frequency in Hertz. Rotation only. + /// Disable softness with a value of 0. + float32 frequencyHz; + + /// The damping ratio. 0 = no damping, 1 = critical damping. + float32 dampingRatio; +}; + +/// A weld joint essentially glues two bodies together. A weld joint may +/// distort somewhat because the island constraint solver is approximate. +class b2WeldJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// The local anchor point relative to bodyA's origin. + const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } + + /// The local anchor point relative to bodyB's origin. + const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; } + + /// Get the reference angle. + float32 GetReferenceAngle() const { return m_referenceAngle; } + + /// Set/get frequency in Hz. + void SetFrequency(float32 hz) { m_frequencyHz = hz; } + float32 GetFrequency() const { return m_frequencyHz; } + + /// Set/get damping ratio. + void SetDampingRatio(float32 ratio) { m_dampingRatio = ratio; } + float32 GetDampingRatio() const { return m_dampingRatio; } + + /// Dump to b2Log + void Dump(); + +protected: + + friend class b2Joint; + + b2WeldJoint(const b2WeldJointDef* def); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + float32 m_frequencyHz; + float32 m_dampingRatio; + float32 m_bias; + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + float32 m_referenceAngle; + float32 m_gamma; + b2Vec3 m_impulse; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_rA; + b2Vec2 m_rB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + b2Mat33 m_mass; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.cpp b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.cpp new file mode 100755 index 00000000..c9f6de60 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.cpp @@ -0,0 +1,419 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org +* +* 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 +#include +#include + +// Linear constraint (point-to-line) +// d = pB - pA = xB + rB - xA - rA +// C = dot(ay, d) +// Cdot = dot(d, cross(wA, ay)) + dot(ay, vB + cross(wB, rB) - vA - cross(wA, rA)) +// = -dot(ay, vA) - dot(cross(d + rA, ay), wA) + dot(ay, vB) + dot(cross(rB, ay), vB) +// J = [-ay, -cross(d + rA, ay), ay, cross(rB, ay)] + +// Spring linear constraint +// C = dot(ax, d) +// Cdot = = -dot(ax, vA) - dot(cross(d + rA, ax), wA) + dot(ax, vB) + dot(cross(rB, ax), vB) +// J = [-ax -cross(d+rA, ax) ax cross(rB, ax)] + +// Motor rotational constraint +// Cdot = wB - wA +// J = [0 0 -1 0 0 1] + +void b2WheelJointDef::Initialize(b2Body* bA, b2Body* bB, const b2Vec2& anchor, const b2Vec2& axis) +{ + bodyA = bA; + bodyB = bB; + localAnchorA = bodyA->GetLocalPoint(anchor); + localAnchorB = bodyB->GetLocalPoint(anchor); + localAxisA = bodyA->GetLocalVector(axis); +} + +b2WheelJoint::b2WheelJoint(const b2WheelJointDef* def) +: b2Joint(def) +{ + m_localAnchorA = def->localAnchorA; + m_localAnchorB = def->localAnchorB; + m_localXAxisA = def->localAxisA; + m_localYAxisA = b2Cross(1.0f, m_localXAxisA); + + m_mass = 0.0f; + m_impulse = 0.0f; + m_motorMass = 0.0f; + m_motorImpulse = 0.0f; + m_springMass = 0.0f; + m_springImpulse = 0.0f; + + m_maxMotorTorque = def->maxMotorTorque; + m_motorSpeed = def->motorSpeed; + m_enableMotor = def->enableMotor; + + m_frequencyHz = def->frequencyHz; + m_dampingRatio = def->dampingRatio; + + m_bias = 0.0f; + m_gamma = 0.0f; + + m_ax.SetZero(); + m_ay.SetZero(); +} + +void b2WheelJoint::InitVelocityConstraints(const b2SolverData& data) +{ + m_indexA = m_bodyA->m_islandIndex; + m_indexB = m_bodyB->m_islandIndex; + m_localCenterA = m_bodyA->m_sweep.localCenter; + m_localCenterB = m_bodyB->m_sweep.localCenter; + m_invMassA = m_bodyA->m_invMass; + m_invMassB = m_bodyB->m_invMass; + m_invIA = m_bodyA->m_invI; + m_invIB = m_bodyB->m_invI; + + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + b2Rot qA(aA), qB(aB); + + // Compute the effective masses. + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + b2Vec2 d = cB + rB - cA - rA; + + // Point to line constraint + { + m_ay = b2Mul(qA, m_localYAxisA); + m_sAy = b2Cross(d + rA, m_ay); + m_sBy = b2Cross(rB, m_ay); + + m_mass = mA + mB + iA * m_sAy * m_sAy + iB * m_sBy * m_sBy; + + if (m_mass > 0.0f) + { + m_mass = 1.0f / m_mass; + } + } + + // Spring constraint + m_springMass = 0.0f; + m_bias = 0.0f; + m_gamma = 0.0f; + if (m_frequencyHz > 0.0f) + { + m_ax = b2Mul(qA, m_localXAxisA); + m_sAx = b2Cross(d + rA, m_ax); + m_sBx = b2Cross(rB, m_ax); + + float32 invMass = mA + mB + iA * m_sAx * m_sAx + iB * m_sBx * m_sBx; + + if (invMass > 0.0f) + { + m_springMass = 1.0f / invMass; + + float32 C = b2Dot(d, m_ax); + + // Frequency + float32 omega = 2.0f * b2_pi * m_frequencyHz; + + // Damping coefficient + float32 d = 2.0f * m_springMass * m_dampingRatio * omega; + + // Spring stiffness + float32 k = m_springMass * omega * omega; + + // magic formulas + float32 h = data.step.dt; + m_gamma = h * (d + h * k); + if (m_gamma > 0.0f) + { + m_gamma = 1.0f / m_gamma; + } + + m_bias = C * h * k * m_gamma; + + m_springMass = invMass + m_gamma; + if (m_springMass > 0.0f) + { + m_springMass = 1.0f / m_springMass; + } + } + } + else + { + m_springImpulse = 0.0f; + } + + // Rotational motor + if (m_enableMotor) + { + m_motorMass = iA + iB; + if (m_motorMass > 0.0f) + { + m_motorMass = 1.0f / m_motorMass; + } + } + else + { + m_motorMass = 0.0f; + m_motorImpulse = 0.0f; + } + + if (data.step.warmStarting) + { + // Account for variable time step. + m_impulse *= data.step.dtRatio; + m_springImpulse *= data.step.dtRatio; + m_motorImpulse *= data.step.dtRatio; + + b2Vec2 P = m_impulse * m_ay + m_springImpulse * m_ax; + float32 LA = m_impulse * m_sAy + m_springImpulse * m_sAx + m_motorImpulse; + float32 LB = m_impulse * m_sBy + m_springImpulse * m_sBx + m_motorImpulse; + + vA -= m_invMassA * P; + wA -= m_invIA * LA; + + vB += m_invMassB * P; + wB += m_invIB * LB; + } + else + { + m_impulse = 0.0f; + m_springImpulse = 0.0f; + m_motorImpulse = 0.0f; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +void b2WheelJoint::SolveVelocityConstraints(const b2SolverData& data) +{ + float32 mA = m_invMassA, mB = m_invMassB; + float32 iA = m_invIA, iB = m_invIB; + + b2Vec2 vA = data.velocities[m_indexA].v; + float32 wA = data.velocities[m_indexA].w; + b2Vec2 vB = data.velocities[m_indexB].v; + float32 wB = data.velocities[m_indexB].w; + + // Solve spring constraint + { + float32 Cdot = b2Dot(m_ax, vB - vA) + m_sBx * wB - m_sAx * wA; + float32 impulse = -m_springMass * (Cdot + m_bias + m_gamma * m_springImpulse); + m_springImpulse += impulse; + + b2Vec2 P = impulse * m_ax; + float32 LA = impulse * m_sAx; + float32 LB = impulse * m_sBx; + + vA -= mA * P; + wA -= iA * LA; + + vB += mB * P; + wB += iB * LB; + } + + // Solve rotational motor constraint + { + float32 Cdot = wB - wA - m_motorSpeed; + float32 impulse = -m_motorMass * Cdot; + + float32 oldImpulse = m_motorImpulse; + float32 maxImpulse = data.step.dt * m_maxMotorTorque; + m_motorImpulse = b2Clamp(m_motorImpulse + impulse, -maxImpulse, maxImpulse); + impulse = m_motorImpulse - oldImpulse; + + wA -= iA * impulse; + wB += iB * impulse; + } + + // Solve point to line constraint + { + float32 Cdot = b2Dot(m_ay, vB - vA) + m_sBy * wB - m_sAy * wA; + float32 impulse = -m_mass * Cdot; + m_impulse += impulse; + + b2Vec2 P = impulse * m_ay; + float32 LA = impulse * m_sAy; + float32 LB = impulse * m_sBy; + + vA -= mA * P; + wA -= iA * LA; + + vB += mB * P; + wB += iB * LB; + } + + data.velocities[m_indexA].v = vA; + data.velocities[m_indexA].w = wA; + data.velocities[m_indexB].v = vB; + data.velocities[m_indexB].w = wB; +} + +bool b2WheelJoint::SolvePositionConstraints(const b2SolverData& data) +{ + b2Vec2 cA = data.positions[m_indexA].c; + float32 aA = data.positions[m_indexA].a; + b2Vec2 cB = data.positions[m_indexB].c; + float32 aB = data.positions[m_indexB].a; + + b2Rot qA(aA), qB(aB); + + b2Vec2 rA = b2Mul(qA, m_localAnchorA - m_localCenterA); + b2Vec2 rB = b2Mul(qB, m_localAnchorB - m_localCenterB); + b2Vec2 d = (cB - cA) + rB - rA; + + b2Vec2 ay = b2Mul(qA, m_localYAxisA); + + float32 sAy = b2Cross(d + rA, ay); + float32 sBy = b2Cross(rB, ay); + + float32 C = b2Dot(d, ay); + + float32 k = m_invMassA + m_invMassB + m_invIA * m_sAy * m_sAy + m_invIB * m_sBy * m_sBy; + + float32 impulse; + if (k != 0.0f) + { + impulse = - C / k; + } + else + { + impulse = 0.0f; + } + + b2Vec2 P = impulse * ay; + float32 LA = impulse * sAy; + float32 LB = impulse * sBy; + + cA -= m_invMassA * P; + aA -= m_invIA * LA; + cB += m_invMassB * P; + aB += m_invIB * LB; + + data.positions[m_indexA].c = cA; + data.positions[m_indexA].a = aA; + data.positions[m_indexB].c = cB; + data.positions[m_indexB].a = aB; + + return b2Abs(C) <= b2_linearSlop; +} + +b2Vec2 b2WheelJoint::GetAnchorA() const +{ + return m_bodyA->GetWorldPoint(m_localAnchorA); +} + +b2Vec2 b2WheelJoint::GetAnchorB() const +{ + return m_bodyB->GetWorldPoint(m_localAnchorB); +} + +b2Vec2 b2WheelJoint::GetReactionForce(float32 inv_dt) const +{ + return inv_dt * (m_impulse * m_ay + m_springImpulse * m_ax); +} + +float32 b2WheelJoint::GetReactionTorque(float32 inv_dt) const +{ + return inv_dt * m_motorImpulse; +} + +float32 b2WheelJoint::GetJointTranslation() const +{ + b2Body* bA = m_bodyA; + b2Body* bB = m_bodyB; + + b2Vec2 pA = bA->GetWorldPoint(m_localAnchorA); + b2Vec2 pB = bB->GetWorldPoint(m_localAnchorB); + b2Vec2 d = pB - pA; + b2Vec2 axis = bA->GetWorldVector(m_localXAxisA); + + float32 translation = b2Dot(d, axis); + return translation; +} + +float32 b2WheelJoint::GetJointSpeed() const +{ + float32 wA = m_bodyA->m_angularVelocity; + float32 wB = m_bodyB->m_angularVelocity; + return wB - wA; +} + +bool b2WheelJoint::IsMotorEnabled() const +{ + return m_enableMotor; +} + +void b2WheelJoint::EnableMotor(bool flag) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_enableMotor = flag; +} + +void b2WheelJoint::SetMotorSpeed(float32 speed) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_motorSpeed = speed; +} + +void b2WheelJoint::SetMaxMotorTorque(float32 torque) +{ + m_bodyA->SetAwake(true); + m_bodyB->SetAwake(true); + m_maxMotorTorque = torque; +} + +float32 b2WheelJoint::GetMotorTorque(float32 inv_dt) const +{ + return inv_dt * m_motorImpulse; +} + +void b2WheelJoint::Dump() +{ + int32 indexA = m_bodyA->m_islandIndex; + int32 indexB = m_bodyB->m_islandIndex; + + b2Log(" b2WheelJointDef jd;\n"); + b2Log(" jd.bodyA = bodies[%d];\n", indexA); + b2Log(" jd.bodyB = bodies[%d];\n", indexB); + b2Log(" jd.collideConnected = bool(%d);\n", m_collideConnected); + b2Log(" jd.localAnchorA.Set(%.15lef, %.15lef);\n", m_localAnchorA.x, m_localAnchorA.y); + b2Log(" jd.localAnchorB.Set(%.15lef, %.15lef);\n", m_localAnchorB.x, m_localAnchorB.y); + b2Log(" jd.localAxisA.Set(%.15lef, %.15lef);\n", m_localXAxisA.x, m_localXAxisA.y); + b2Log(" jd.enableMotor = bool(%d);\n", m_enableMotor); + b2Log(" jd.motorSpeed = %.15lef;\n", m_motorSpeed); + b2Log(" jd.maxMotorTorque = %.15lef;\n", m_maxMotorTorque); + b2Log(" jd.frequencyHz = %.15lef;\n", m_frequencyHz); + b2Log(" jd.dampingRatio = %.15lef;\n", m_dampingRatio); + b2Log(" joints[%d] = m_world->CreateJoint(&jd);\n", m_index); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.h b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.h new file mode 100755 index 00000000..ca59d7a6 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/Joints/b2WheelJoint.h @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_WHEEL_JOINT_H +#define B2_WHEEL_JOINT_H + +#include + +/// Wheel joint definition. This requires defining a line of +/// motion using an axis and an anchor point. The definition uses local +/// anchor points and a local axis so that the initial configuration +/// can violate the constraint slightly. The joint translation is zero +/// when the local anchor points coincide in world space. Using local +/// anchors and a local axis helps when saving and loading a game. +struct b2WheelJointDef : public b2JointDef +{ + b2WheelJointDef() + { + type = e_wheelJoint; + localAnchorA.SetZero(); + localAnchorB.SetZero(); + localAxisA.Set(1.0f, 0.0f); + enableMotor = false; + maxMotorTorque = 0.0f; + motorSpeed = 0.0f; + frequencyHz = 2.0f; + dampingRatio = 0.7f; + } + + /// Initialize the bodies, anchors, axis, and reference angle using the world + /// anchor and world axis. + void Initialize(b2Body* bodyA, b2Body* bodyB, const b2Vec2& anchor, const b2Vec2& axis); + + /// The local anchor point relative to bodyA's origin. + b2Vec2 localAnchorA; + + /// The local anchor point relative to bodyB's origin. + b2Vec2 localAnchorB; + + /// The local translation axis in bodyA. + b2Vec2 localAxisA; + + /// Enable/disable the joint motor. + bool enableMotor; + + /// The maximum motor torque, usually in N-m. + float32 maxMotorTorque; + + /// The desired motor speed in radians per second. + float32 motorSpeed; + + /// Suspension frequency, zero indicates no suspension + float32 frequencyHz; + + /// Suspension damping ratio, one indicates critical damping + float32 dampingRatio; +}; + +/// A wheel joint. This joint provides two degrees of freedom: translation +/// along an axis fixed in bodyA and rotation in the plane. You can use a +/// joint limit to restrict the range of motion and a joint motor to drive +/// the rotation or to model rotational friction. +/// This joint is designed for vehicle suspensions. +class b2WheelJoint : public b2Joint +{ +public: + b2Vec2 GetAnchorA() const; + b2Vec2 GetAnchorB() const; + + b2Vec2 GetReactionForce(float32 inv_dt) const; + float32 GetReactionTorque(float32 inv_dt) const; + + /// The local anchor point relative to bodyA's origin. + const b2Vec2& GetLocalAnchorA() const { return m_localAnchorA; } + + /// The local anchor point relative to bodyB's origin. + const b2Vec2& GetLocalAnchorB() const { return m_localAnchorB; } + + /// The local joint axis relative to bodyA. + const b2Vec2& GetLocalAxisA() const { return m_localXAxisA; } + + /// Get the current joint translation, usually in meters. + float32 GetJointTranslation() const; + + /// Get the current joint translation speed, usually in meters per second. + float32 GetJointSpeed() const; + + /// Is the joint motor enabled? + bool IsMotorEnabled() const; + + /// Enable/disable the joint motor. + void EnableMotor(bool flag); + + /// Set the motor speed, usually in radians per second. + void SetMotorSpeed(float32 speed); + + /// Get the motor speed, usually in radians per second. + float32 GetMotorSpeed() const; + + /// Set/Get the maximum motor force, usually in N-m. + void SetMaxMotorTorque(float32 torque); + float32 GetMaxMotorTorque() const; + + /// Get the current motor torque given the inverse time step, usually in N-m. + float32 GetMotorTorque(float32 inv_dt) const; + + /// Set/Get the spring frequency in hertz. Setting the frequency to zero disables the spring. + void SetSpringFrequencyHz(float32 hz); + float32 GetSpringFrequencyHz() const; + + /// Set/Get the spring damping ratio + void SetSpringDampingRatio(float32 ratio); + float32 GetSpringDampingRatio() const; + + /// Dump to b2Log + void Dump(); + +protected: + + friend class b2Joint; + b2WheelJoint(const b2WheelJointDef* def); + + void InitVelocityConstraints(const b2SolverData& data); + void SolveVelocityConstraints(const b2SolverData& data); + bool SolvePositionConstraints(const b2SolverData& data); + + float32 m_frequencyHz; + float32 m_dampingRatio; + + // Solver shared + b2Vec2 m_localAnchorA; + b2Vec2 m_localAnchorB; + b2Vec2 m_localXAxisA; + b2Vec2 m_localYAxisA; + + float32 m_impulse; + float32 m_motorImpulse; + float32 m_springImpulse; + + float32 m_maxMotorTorque; + float32 m_motorSpeed; + bool m_enableMotor; + + // Solver temp + int32 m_indexA; + int32 m_indexB; + b2Vec2 m_localCenterA; + b2Vec2 m_localCenterB; + float32 m_invMassA; + float32 m_invMassB; + float32 m_invIA; + float32 m_invIB; + + b2Vec2 m_ax, m_ay; + float32 m_sAx, m_sBx; + float32 m_sAy, m_sBy; + + float32 m_mass; + float32 m_motorMass; + float32 m_springMass; + + float32 m_bias; + float32 m_gamma; +}; + +inline float32 b2WheelJoint::GetMotorSpeed() const +{ + return m_motorSpeed; +} + +inline float32 b2WheelJoint::GetMaxMotorTorque() const +{ + return m_maxMotorTorque; +} + +inline void b2WheelJoint::SetSpringFrequencyHz(float32 hz) +{ + m_frequencyHz = hz; +} + +inline float32 b2WheelJoint::GetSpringFrequencyHz() const +{ + return m_frequencyHz; +} + +inline void b2WheelJoint::SetSpringDampingRatio(float32 ratio) +{ + m_dampingRatio = ratio; +} + +inline float32 b2WheelJoint::GetSpringDampingRatio() const +{ + return m_dampingRatio; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2Body.cpp b/jni/love/src/libraries/Box2D/Dynamics/b2Body.cpp new file mode 100755 index 00000000..b6550531 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2Body.cpp @@ -0,0 +1,549 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include + +b2Body::b2Body(const b2BodyDef* bd, b2World* world) +{ + b2Assert(bd->position.IsValid()); + b2Assert(bd->linearVelocity.IsValid()); + b2Assert(b2IsValid(bd->angle)); + b2Assert(b2IsValid(bd->angularVelocity)); + b2Assert(b2IsValid(bd->angularDamping) && bd->angularDamping >= 0.0f); + b2Assert(b2IsValid(bd->linearDamping) && bd->linearDamping >= 0.0f); + + m_flags = 0; + + if (bd->bullet) + { + m_flags |= e_bulletFlag; + } + if (bd->fixedRotation) + { + m_flags |= e_fixedRotationFlag; + } + if (bd->allowSleep) + { + m_flags |= e_autoSleepFlag; + } + if (bd->awake) + { + m_flags |= e_awakeFlag; + } + if (bd->active) + { + m_flags |= e_activeFlag; + } + + m_world = world; + + m_xf.p = bd->position; + m_xf.q.Set(bd->angle); + + m_sweep.localCenter.SetZero(); + m_sweep.c0 = m_xf.p; + m_sweep.c = m_xf.p; + m_sweep.a0 = bd->angle; + m_sweep.a = bd->angle; + m_sweep.alpha0 = 0.0f; + + m_jointList = NULL; + m_contactList = NULL; + m_prev = NULL; + m_next = NULL; + + m_linearVelocity = bd->linearVelocity; + m_angularVelocity = bd->angularVelocity; + + m_linearDamping = bd->linearDamping; + m_angularDamping = bd->angularDamping; + m_gravityScale = bd->gravityScale; + + m_force.SetZero(); + m_torque = 0.0f; + + m_sleepTime = 0.0f; + + m_type = bd->type; + + if (m_type == b2_dynamicBody) + { + m_mass = 1.0f; + m_invMass = 1.0f; + } + else + { + m_mass = 0.0f; + m_invMass = 0.0f; + } + + m_I = 0.0f; + m_invI = 0.0f; + + m_userData = bd->userData; + + m_fixtureList = NULL; + m_fixtureCount = 0; +} + +b2Body::~b2Body() +{ + // shapes and joints are destroyed in b2World::Destroy +} + +void b2Body::SetType(b2BodyType type) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return; + } + + if (m_type == type) + { + return; + } + + m_type = type; + + ResetMassData(); + + if (m_type == b2_staticBody) + { + m_linearVelocity.SetZero(); + m_angularVelocity = 0.0f; + m_sweep.a0 = m_sweep.a; + m_sweep.c0 = m_sweep.c; + SynchronizeFixtures(); + } + + SetAwake(true); + + m_force.SetZero(); + m_torque = 0.0f; + + // Delete the attached contacts. + b2ContactEdge* ce = m_contactList; + while (ce) + { + b2ContactEdge* ce0 = ce; + ce = ce->next; + m_world->m_contactManager.Destroy(ce0->contact); + } + m_contactList = NULL; + + // Touch the proxies so that new contacts will be created (when appropriate) + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + int32 proxyCount = f->m_proxyCount; + for (int32 i = 0; i < proxyCount; ++i) + { + broadPhase->TouchProxy(f->m_proxies[i].proxyId); + } + } +} + +b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return NULL; + } + + b2BlockAllocator* allocator = &m_world->m_blockAllocator; + + void* memory = allocator->Allocate(sizeof(b2Fixture)); + b2Fixture* fixture = new (memory) b2Fixture; + fixture->Create(allocator, this, def); + + if (m_flags & e_activeFlag) + { + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + fixture->CreateProxies(broadPhase, m_xf); + } + + fixture->m_next = m_fixtureList; + m_fixtureList = fixture; + ++m_fixtureCount; + + fixture->m_body = this; + + // Adjust mass properties if needed. + if (fixture->m_density > 0.0f) + { + ResetMassData(); + } + + // Let the world know we have a new fixture. This will cause new contacts + // to be created at the beginning of the next time step. + m_world->m_flags |= b2World::e_newFixture; + + return fixture; +} + +b2Fixture* b2Body::CreateFixture(const b2Shape* shape, float32 density) +{ + b2FixtureDef def; + def.shape = shape; + def.density = density; + + return CreateFixture(&def); +} + +void b2Body::DestroyFixture(b2Fixture* fixture) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return; + } + + b2Assert(fixture->m_body == this); + + // Remove the fixture from this body's singly linked list. + b2Assert(m_fixtureCount > 0); + b2Fixture** node = &m_fixtureList; + bool found = false; + while (*node != NULL) + { + if (*node == fixture) + { + *node = fixture->m_next; + found = true; + break; + } + + node = &(*node)->m_next; + } + + // You tried to remove a shape that is not attached to this body. + b2Assert(found); + + // Destroy any contacts associated with the fixture. + b2ContactEdge* edge = m_contactList; + while (edge) + { + b2Contact* c = edge->contact; + edge = edge->next; + + b2Fixture* fixtureA = c->GetFixtureA(); + b2Fixture* fixtureB = c->GetFixtureB(); + + if (fixture == fixtureA || fixture == fixtureB) + { + // This destroys the contact and removes it from + // this body's contact list. + m_world->m_contactManager.Destroy(c); + } + } + + b2BlockAllocator* allocator = &m_world->m_blockAllocator; + + if (m_flags & e_activeFlag) + { + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + fixture->DestroyProxies(broadPhase); + } + + fixture->Destroy(allocator); + fixture->m_body = NULL; + fixture->m_next = NULL; + fixture->~b2Fixture(); + allocator->Free(fixture, sizeof(b2Fixture)); + + --m_fixtureCount; + + // Reset the mass data. + ResetMassData(); +} + +void b2Body::ResetMassData() +{ + // Compute mass data from shapes. Each shape has its own density. + m_mass = 0.0f; + m_invMass = 0.0f; + m_I = 0.0f; + m_invI = 0.0f; + m_sweep.localCenter.SetZero(); + + // Static and kinematic bodies have zero mass. + if (m_type == b2_staticBody || m_type == b2_kinematicBody) + { + m_sweep.c0 = m_xf.p; + m_sweep.c = m_xf.p; + m_sweep.a0 = m_sweep.a; + return; + } + + b2Assert(m_type == b2_dynamicBody); + + // Accumulate mass over all fixtures. + b2Vec2 localCenter = b2Vec2_zero; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + if (f->m_density == 0.0f) + { + continue; + } + + b2MassData massData; + f->GetMassData(&massData); + m_mass += massData.mass; + localCenter += massData.mass * massData.center; + m_I += massData.I; + } + + // Compute center of mass. + if (m_mass > 0.0f) + { + m_invMass = 1.0f / m_mass; + localCenter *= m_invMass; + } + else + { + // Force all dynamic bodies to have a positive mass. + m_mass = 1.0f; + m_invMass = 1.0f; + } + + if (m_I > 0.0f && (m_flags & e_fixedRotationFlag) == 0) + { + // Center the inertia about the center of mass. + m_I -= m_mass * b2Dot(localCenter, localCenter); + b2Assert(m_I > 0.0f); + m_invI = 1.0f / m_I; + + } + else + { + m_I = 0.0f; + m_invI = 0.0f; + } + + // Move center of mass. + b2Vec2 oldCenter = m_sweep.c; + m_sweep.localCenter = localCenter; + m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + + // Update center of mass velocity. + m_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter); +} + +void b2Body::SetMassData(const b2MassData* massData) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return; + } + + if (m_type != b2_dynamicBody) + { + return; + } + + m_invMass = 0.0f; + m_I = 0.0f; + m_invI = 0.0f; + + m_mass = massData->mass; + if (m_mass <= 0.0f) + { + m_mass = 1.0f; + } + + m_invMass = 1.0f / m_mass; + + if (massData->I > 0.0f && (m_flags & b2Body::e_fixedRotationFlag) == 0) + { + m_I = massData->I - m_mass * b2Dot(massData->center, massData->center); + b2Assert(m_I > 0.0f); + m_invI = 1.0f / m_I; + } + + // Move center of mass. + b2Vec2 oldCenter = m_sweep.c; + m_sweep.localCenter = massData->center; + m_sweep.c0 = m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + + // Update center of mass velocity. + m_linearVelocity += b2Cross(m_angularVelocity, m_sweep.c - oldCenter); +} + +bool b2Body::ShouldCollide(const b2Body* other) const +{ + // At least one body should be dynamic. + if (m_type != b2_dynamicBody && other->m_type != b2_dynamicBody) + { + return false; + } + + // Does a joint prevent collision? + for (b2JointEdge* jn = m_jointList; jn; jn = jn->next) + { + if (jn->other == other) + { + if (jn->joint->m_collideConnected == false) + { + return false; + } + } + } + + return true; +} + +void b2Body::SetTransform(const b2Vec2& position, float32 angle) +{ + b2Assert(m_world->IsLocked() == false); + if (m_world->IsLocked() == true) + { + return; + } + + m_xf.q.Set(angle); + m_xf.p = position; + + m_sweep.c = b2Mul(m_xf, m_sweep.localCenter); + m_sweep.a = angle; + + m_sweep.c0 = m_sweep.c; + m_sweep.a0 = angle; + + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + f->Synchronize(broadPhase, m_xf, m_xf); + } +} + +void b2Body::SynchronizeFixtures() +{ + b2Transform xf1; + xf1.q.Set(m_sweep.a0); + xf1.p = m_sweep.c0 - b2Mul(xf1.q, m_sweep.localCenter); + + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + f->Synchronize(broadPhase, xf1, m_xf); + } +} + +void b2Body::SetActive(bool flag) +{ + b2Assert(m_world->IsLocked() == false); + + if (flag == IsActive()) + { + return; + } + + if (flag) + { + m_flags |= e_activeFlag; + + // Create all proxies. + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + f->CreateProxies(broadPhase, m_xf); + } + + // Contacts are created the next time step. + } + else + { + m_flags &= ~e_activeFlag; + + // Destroy all proxies. + b2BroadPhase* broadPhase = &m_world->m_contactManager.m_broadPhase; + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + f->DestroyProxies(broadPhase); + } + + // Destroy the attached contacts. + b2ContactEdge* ce = m_contactList; + while (ce) + { + b2ContactEdge* ce0 = ce; + ce = ce->next; + m_world->m_contactManager.Destroy(ce0->contact); + } + m_contactList = NULL; + } +} + +void b2Body::SetFixedRotation(bool flag) +{ + bool status = (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag; + if (status == flag) + { + return; + } + + if (flag) + { + m_flags |= e_fixedRotationFlag; + } + else + { + m_flags &= ~e_fixedRotationFlag; + } + + m_angularVelocity = 0.0f; + + ResetMassData(); +} + +void b2Body::Dump() +{ + int32 bodyIndex = m_islandIndex; + + b2Log("{\n"); + b2Log(" b2BodyDef bd;\n"); + b2Log(" bd.type = b2BodyType(%d);\n", m_type); + b2Log(" bd.position.Set(%.15lef, %.15lef);\n", m_xf.p.x, m_xf.p.y); + b2Log(" bd.angle = %.15lef;\n", m_sweep.a); + b2Log(" bd.linearVelocity.Set(%.15lef, %.15lef);\n", m_linearVelocity.x, m_linearVelocity.y); + b2Log(" bd.angularVelocity = %.15lef;\n", m_angularVelocity); + b2Log(" bd.linearDamping = %.15lef;\n", m_linearDamping); + b2Log(" bd.angularDamping = %.15lef;\n", m_angularDamping); + b2Log(" bd.allowSleep = bool(%d);\n", m_flags & e_autoSleepFlag); + b2Log(" bd.awake = bool(%d);\n", m_flags & e_awakeFlag); + b2Log(" bd.fixedRotation = bool(%d);\n", m_flags & e_fixedRotationFlag); + b2Log(" bd.bullet = bool(%d);\n", m_flags & e_bulletFlag); + b2Log(" bd.active = bool(%d);\n", m_flags & e_activeFlag); + b2Log(" bd.gravityScale = %.15lef;\n", m_gravityScale); + b2Log(" bodies[%d] = m_world->CreateBody(&bd);\n", m_islandIndex); + b2Log("\n"); + for (b2Fixture* f = m_fixtureList; f; f = f->m_next) + { + b2Log(" {\n"); + f->Dump(bodyIndex); + b2Log(" }\n"); + } + b2Log("}\n"); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2Body.h b/jni/love/src/libraries/Box2D/Dynamics/b2Body.h new file mode 100755 index 00000000..24bae640 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2Body.h @@ -0,0 +1,860 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_BODY_H +#define B2_BODY_H + +#include +#include +#include + +class b2Fixture; +class b2Joint; +class b2Contact; +class b2Controller; +class b2World; +struct b2FixtureDef; +struct b2JointEdge; +struct b2ContactEdge; + +/// The body type. +/// static: zero mass, zero velocity, may be manually moved +/// kinematic: zero mass, non-zero velocity set by user, moved by solver +/// dynamic: positive mass, non-zero velocity determined by forces, moved by solver +enum b2BodyType +{ + b2_staticBody = 0, + b2_kinematicBody, + b2_dynamicBody + + // TODO_ERIN + //b2_bulletBody, +}; + +/// A body definition holds all the data needed to construct a rigid body. +/// You can safely re-use body definitions. Shapes are added to a body after construction. +struct b2BodyDef +{ + /// This constructor sets the body definition default values. + b2BodyDef() + { + userData = NULL; + position.Set(0.0f, 0.0f); + angle = 0.0f; + linearVelocity.Set(0.0f, 0.0f); + angularVelocity = 0.0f; + linearDamping = 0.0f; + angularDamping = 0.0f; + allowSleep = true; + awake = true; + fixedRotation = false; + bullet = false; + type = b2_staticBody; + active = true; + gravityScale = 1.0f; + } + + /// The body type: static, kinematic, or dynamic. + /// Note: if a dynamic body would have zero mass, the mass is set to one. + b2BodyType type; + + /// The world position of the body. Avoid creating bodies at the origin + /// since this can lead to many overlapping shapes. + b2Vec2 position; + + /// The world angle of the body in radians. + float32 angle; + + /// The linear velocity of the body's origin in world co-ordinates. + b2Vec2 linearVelocity; + + /// The angular velocity of the body. + float32 angularVelocity; + + /// Linear damping is use to reduce the linear velocity. The damping parameter + /// can be larger than 1.0f but the damping effect becomes sensitive to the + /// time step when the damping parameter is large. + float32 linearDamping; + + /// Angular damping is use to reduce the angular velocity. The damping parameter + /// can be larger than 1.0f but the damping effect becomes sensitive to the + /// time step when the damping parameter is large. + float32 angularDamping; + + /// Set this flag to false if this body should never fall asleep. Note that + /// this increases CPU usage. + bool allowSleep; + + /// Is this body initially awake or sleeping? + bool awake; + + /// Should this body be prevented from rotating? Useful for characters. + bool fixedRotation; + + /// Is this a fast moving body that should be prevented from tunneling through + /// other moving bodies? Note that all bodies are prevented from tunneling through + /// kinematic and static bodies. This setting is only considered on dynamic bodies. + /// @warning You should use this flag sparingly since it increases processing time. + bool bullet; + + /// Does this body start out active? + bool active; + + /// Use this to store application specific body data. + void* userData; + + /// Scale the gravity applied to this body. + float32 gravityScale; +}; + +/// A rigid body. These are created via b2World::CreateBody. +class b2Body +{ +public: + /// Creates a fixture and attach it to this body. Use this function if you need + /// to set some fixture parameters, like friction. Otherwise you can create the + /// fixture directly from a shape. + /// If the density is non-zero, this function automatically updates the mass of the body. + /// Contacts are not created until the next time step. + /// @param def the fixture definition. + /// @warning This function is locked during callbacks. + b2Fixture* CreateFixture(const b2FixtureDef* def); + + /// Creates a fixture from a shape and attach it to this body. + /// This is a convenience function. Use b2FixtureDef if you need to set parameters + /// like friction, restitution, user data, or filtering. + /// If the density is non-zero, this function automatically updates the mass of the body. + /// @param shape the shape to be cloned. + /// @param density the shape density (set to zero for static bodies). + /// @warning This function is locked during callbacks. + b2Fixture* CreateFixture(const b2Shape* shape, float32 density); + + /// Destroy a fixture. This removes the fixture from the broad-phase and + /// destroys all contacts associated with this fixture. This will + /// automatically adjust the mass of the body if the body is dynamic and the + /// fixture has positive density. + /// All fixtures attached to a body are implicitly destroyed when the body is destroyed. + /// @param fixture the fixture to be removed. + /// @warning This function is locked during callbacks. + void DestroyFixture(b2Fixture* fixture); + + /// Set the position of the body's origin and rotation. + /// Manipulating a body's transform may cause non-physical behavior. + /// Note: contacts are updated on the next call to b2World::Step. + /// @param position the world position of the body's local origin. + /// @param angle the world rotation in radians. + void SetTransform(const b2Vec2& position, float32 angle); + + /// Get the body transform for the body's origin. + /// @return the world transform of the body's origin. + const b2Transform& GetTransform() const; + + /// Get the world body origin position. + /// @return the world position of the body's origin. + const b2Vec2& GetPosition() const; + + /// Get the angle in radians. + /// @return the current world rotation angle in radians. + float32 GetAngle() const; + + /// Get the world position of the center of mass. + const b2Vec2& GetWorldCenter() const; + + /// Get the local position of the center of mass. + const b2Vec2& GetLocalCenter() const; + + /// Set the linear velocity of the center of mass. + /// @param v the new linear velocity of the center of mass. + void SetLinearVelocity(const b2Vec2& v); + + /// Get the linear velocity of the center of mass. + /// @return the linear velocity of the center of mass. + const b2Vec2& GetLinearVelocity() const; + + /// Set the angular velocity. + /// @param omega the new angular velocity in radians/second. + void SetAngularVelocity(float32 omega); + + /// Get the angular velocity. + /// @return the angular velocity in radians/second. + float32 GetAngularVelocity() const; + + /// Apply a force at a world point. If the force is not + /// applied at the center of mass, it will generate a torque and + /// affect the angular velocity. This wakes up the body. + /// @param force the world force vector, usually in Newtons (N). + /// @param point the world position of the point of application. + /// @param wake also wake up the body + void ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake); + + /// Apply a force to the center of mass. This wakes up the body. + /// @param force the world force vector, usually in Newtons (N). + /// @param wake also wake up the body + void ApplyForceToCenter(const b2Vec2& force, bool wake); + + /// Apply a torque. This affects the angular velocity + /// without affecting the linear velocity of the center of mass. + /// This wakes up the body. + /// @param torque about the z-axis (out of the screen), usually in N-m. + /// @param wake also wake up the body + void ApplyTorque(float32 torque, bool wake); + + /// Apply an impulse at a point. This immediately modifies the velocity. + /// It also modifies the angular velocity if the point of application + /// is not at the center of mass. This wakes up the body. + /// @param impulse the world impulse vector, usually in N-seconds or kg-m/s. + /// @param point the world position of the point of application. + /// @param wake also wake up the body + void ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake); + + /// Apply an angular impulse. + /// @param impulse the angular impulse in units of kg*m*m/s + /// @param wake also wake up the body + void ApplyAngularImpulse(float32 impulse, bool wake); + + /// Get the total mass of the body. + /// @return the mass, usually in kilograms (kg). + float32 GetMass() const; + + /// Get the rotational inertia of the body about the local origin. + /// @return the rotational inertia, usually in kg-m^2. + float32 GetInertia() const; + + /// Get the mass data of the body. + /// @return a struct containing the mass, inertia and center of the body. + void GetMassData(b2MassData* data) const; + + /// Set the mass properties to override the mass properties of the fixtures. + /// Note that this changes the center of mass position. + /// Note that creating or destroying fixtures can also alter the mass. + /// This function has no effect if the body isn't dynamic. + /// @param massData the mass properties. + void SetMassData(const b2MassData* data); + + /// This resets the mass properties to the sum of the mass properties of the fixtures. + /// This normally does not need to be called unless you called SetMassData to override + /// the mass and you later want to reset the mass. + void ResetMassData(); + + /// Get the world coordinates of a point given the local coordinates. + /// @param localPoint a point on the body measured relative the the body's origin. + /// @return the same point expressed in world coordinates. + b2Vec2 GetWorldPoint(const b2Vec2& localPoint) const; + + /// Get the world coordinates of a vector given the local coordinates. + /// @param localVector a vector fixed in the body. + /// @return the same vector expressed in world coordinates. + b2Vec2 GetWorldVector(const b2Vec2& localVector) const; + + /// Gets a local point relative to the body's origin given a world point. + /// @param a point in world coordinates. + /// @return the corresponding local point relative to the body's origin. + b2Vec2 GetLocalPoint(const b2Vec2& worldPoint) const; + + /// Gets a local vector given a world vector. + /// @param a vector in world coordinates. + /// @return the corresponding local vector. + b2Vec2 GetLocalVector(const b2Vec2& worldVector) const; + + /// Get the world linear velocity of a world point attached to this body. + /// @param a point in world coordinates. + /// @return the world velocity of a point. + b2Vec2 GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const; + + /// Get the world velocity of a local point. + /// @param a point in local coordinates. + /// @return the world velocity of a point. + b2Vec2 GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const; + + /// Get the linear damping of the body. + float32 GetLinearDamping() const; + + /// Set the linear damping of the body. + void SetLinearDamping(float32 linearDamping); + + /// Get the angular damping of the body. + float32 GetAngularDamping() const; + + /// Set the angular damping of the body. + void SetAngularDamping(float32 angularDamping); + + /// Get the gravity scale of the body. + float32 GetGravityScale() const; + + /// Set the gravity scale of the body. + void SetGravityScale(float32 scale); + + /// Set the type of this body. This may alter the mass and velocity. + void SetType(b2BodyType type); + + /// Get the type of this body. + b2BodyType GetType() const; + + /// Should this body be treated like a bullet for continuous collision detection? + void SetBullet(bool flag); + + /// Is this body treated like a bullet for continuous collision detection? + bool IsBullet() const; + + /// You can disable sleeping on this body. If you disable sleeping, the + /// body will be woken. + void SetSleepingAllowed(bool flag); + + /// Is this body allowed to sleep + bool IsSleepingAllowed() const; + + /// Set the sleep state of the body. A sleeping body has very + /// low CPU cost. + /// @param flag set to true to wake the body, false to put it to sleep. + void SetAwake(bool flag); + + /// Get the sleeping state of this body. + /// @return true if the body is awake. + bool IsAwake() const; + + /// Set the active state of the body. An inactive body is not + /// simulated and cannot be collided with or woken up. + /// If you pass a flag of true, all fixtures will be added to the + /// broad-phase. + /// If you pass a flag of false, all fixtures will be removed from + /// the broad-phase and all contacts will be destroyed. + /// Fixtures and joints are otherwise unaffected. You may continue + /// to create/destroy fixtures and joints on inactive bodies. + /// Fixtures on an inactive body are implicitly inactive and will + /// not participate in collisions, ray-casts, or queries. + /// Joints connected to an inactive body are implicitly inactive. + /// An inactive body is still owned by a b2World object and remains + /// in the body list. + void SetActive(bool flag); + + /// Get the active state of the body. + bool IsActive() const; + + /// Set this body to have fixed rotation. This causes the mass + /// to be reset. + void SetFixedRotation(bool flag); + + /// Does this body have fixed rotation? + bool IsFixedRotation() const; + + /// Get the list of all fixtures attached to this body. + b2Fixture* GetFixtureList(); + const b2Fixture* GetFixtureList() const; + + /// Get the list of all joints attached to this body. + b2JointEdge* GetJointList(); + const b2JointEdge* GetJointList() const; + + /// Get the list of all contacts attached to this body. + /// @warning this list changes during the time step and you may + /// miss some collisions if you don't use b2ContactListener. + b2ContactEdge* GetContactList(); + const b2ContactEdge* GetContactList() const; + + /// Get the next body in the world's body list. + b2Body* GetNext(); + const b2Body* GetNext() const; + + /// Get the user data pointer that was provided in the body definition. + void* GetUserData() const; + + /// Set the user data. Use this to store your application specific data. + void SetUserData(void* data); + + /// Get the parent world of this body. + b2World* GetWorld(); + const b2World* GetWorld() const; + + /// Dump this body to a log file + void Dump(); + +private: + + friend class b2World; + friend class b2Island; + friend class b2ContactManager; + friend class b2ContactSolver; + friend class b2Contact; + + friend class b2DistanceJoint; + friend class b2FrictionJoint; + friend class b2GearJoint; + friend class b2MotorJoint; + friend class b2MouseJoint; + friend class b2PrismaticJoint; + friend class b2PulleyJoint; + friend class b2RevoluteJoint; + friend class b2RopeJoint; + friend class b2WeldJoint; + friend class b2WheelJoint; + + // m_flags + enum + { + e_islandFlag = 0x0001, + e_awakeFlag = 0x0002, + e_autoSleepFlag = 0x0004, + e_bulletFlag = 0x0008, + e_fixedRotationFlag = 0x0010, + e_activeFlag = 0x0020, + e_toiFlag = 0x0040 + }; + + b2Body(const b2BodyDef* bd, b2World* world); + ~b2Body(); + + void SynchronizeFixtures(); + void SynchronizeTransform(); + + // This is used to prevent connected bodies from colliding. + // It may lie, depending on the collideConnected flag. + bool ShouldCollide(const b2Body* other) const; + + void Advance(float32 t); + + b2BodyType m_type; + + uint16 m_flags; + + int32 m_islandIndex; + + b2Transform m_xf; // the body origin transform + b2Sweep m_sweep; // the swept motion for CCD + + b2Vec2 m_linearVelocity; + float32 m_angularVelocity; + + b2Vec2 m_force; + float32 m_torque; + + b2World* m_world; + b2Body* m_prev; + b2Body* m_next; + + b2Fixture* m_fixtureList; + int32 m_fixtureCount; + + b2JointEdge* m_jointList; + b2ContactEdge* m_contactList; + + float32 m_mass, m_invMass; + + // Rotational inertia about the center of mass. + float32 m_I, m_invI; + + float32 m_linearDamping; + float32 m_angularDamping; + float32 m_gravityScale; + + float32 m_sleepTime; + + void* m_userData; +}; + +inline b2BodyType b2Body::GetType() const +{ + return m_type; +} + +inline const b2Transform& b2Body::GetTransform() const +{ + return m_xf; +} + +inline const b2Vec2& b2Body::GetPosition() const +{ + return m_xf.p; +} + +inline float32 b2Body::GetAngle() const +{ + return m_sweep.a; +} + +inline const b2Vec2& b2Body::GetWorldCenter() const +{ + return m_sweep.c; +} + +inline const b2Vec2& b2Body::GetLocalCenter() const +{ + return m_sweep.localCenter; +} + +inline void b2Body::SetLinearVelocity(const b2Vec2& v) +{ + if (m_type == b2_staticBody) + { + return; + } + + if (b2Dot(v,v) > 0.0f) + { + SetAwake(true); + } + + m_linearVelocity = v; +} + +inline const b2Vec2& b2Body::GetLinearVelocity() const +{ + return m_linearVelocity; +} + +inline void b2Body::SetAngularVelocity(float32 w) +{ + if (m_type == b2_staticBody) + { + return; + } + + if (w * w > 0.0f) + { + SetAwake(true); + } + + m_angularVelocity = w; +} + +inline float32 b2Body::GetAngularVelocity() const +{ + return m_angularVelocity; +} + +inline float32 b2Body::GetMass() const +{ + return m_mass; +} + +inline float32 b2Body::GetInertia() const +{ + return m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter); +} + +inline void b2Body::GetMassData(b2MassData* data) const +{ + data->mass = m_mass; + data->I = m_I + m_mass * b2Dot(m_sweep.localCenter, m_sweep.localCenter); + data->center = m_sweep.localCenter; +} + +inline b2Vec2 b2Body::GetWorldPoint(const b2Vec2& localPoint) const +{ + return b2Mul(m_xf, localPoint); +} + +inline b2Vec2 b2Body::GetWorldVector(const b2Vec2& localVector) const +{ + return b2Mul(m_xf.q, localVector); +} + +inline b2Vec2 b2Body::GetLocalPoint(const b2Vec2& worldPoint) const +{ + return b2MulT(m_xf, worldPoint); +} + +inline b2Vec2 b2Body::GetLocalVector(const b2Vec2& worldVector) const +{ + return b2MulT(m_xf.q, worldVector); +} + +inline b2Vec2 b2Body::GetLinearVelocityFromWorldPoint(const b2Vec2& worldPoint) const +{ + return m_linearVelocity + b2Cross(m_angularVelocity, worldPoint - m_sweep.c); +} + +inline b2Vec2 b2Body::GetLinearVelocityFromLocalPoint(const b2Vec2& localPoint) const +{ + return GetLinearVelocityFromWorldPoint(GetWorldPoint(localPoint)); +} + +inline float32 b2Body::GetLinearDamping() const +{ + return m_linearDamping; +} + +inline void b2Body::SetLinearDamping(float32 linearDamping) +{ + m_linearDamping = linearDamping; +} + +inline float32 b2Body::GetAngularDamping() const +{ + return m_angularDamping; +} + +inline void b2Body::SetAngularDamping(float32 angularDamping) +{ + m_angularDamping = angularDamping; +} + +inline float32 b2Body::GetGravityScale() const +{ + return m_gravityScale; +} + +inline void b2Body::SetGravityScale(float32 scale) +{ + m_gravityScale = scale; +} + +inline void b2Body::SetBullet(bool flag) +{ + if (flag) + { + m_flags |= e_bulletFlag; + } + else + { + m_flags &= ~e_bulletFlag; + } +} + +inline bool b2Body::IsBullet() const +{ + return (m_flags & e_bulletFlag) == e_bulletFlag; +} + +inline void b2Body::SetAwake(bool flag) +{ + if (flag) + { + if ((m_flags & e_awakeFlag) == 0) + { + m_flags |= e_awakeFlag; + m_sleepTime = 0.0f; + } + } + else + { + m_flags &= ~e_awakeFlag; + m_sleepTime = 0.0f; + m_linearVelocity.SetZero(); + m_angularVelocity = 0.0f; + m_force.SetZero(); + m_torque = 0.0f; + } +} + +inline bool b2Body::IsAwake() const +{ + return (m_flags & e_awakeFlag) == e_awakeFlag; +} + +inline bool b2Body::IsActive() const +{ + return (m_flags & e_activeFlag) == e_activeFlag; +} + +inline bool b2Body::IsFixedRotation() const +{ + return (m_flags & e_fixedRotationFlag) == e_fixedRotationFlag; +} + +inline void b2Body::SetSleepingAllowed(bool flag) +{ + if (flag) + { + m_flags |= e_autoSleepFlag; + } + else + { + m_flags &= ~e_autoSleepFlag; + SetAwake(true); + } +} + +inline bool b2Body::IsSleepingAllowed() const +{ + return (m_flags & e_autoSleepFlag) == e_autoSleepFlag; +} + +inline b2Fixture* b2Body::GetFixtureList() +{ + return m_fixtureList; +} + +inline const b2Fixture* b2Body::GetFixtureList() const +{ + return m_fixtureList; +} + +inline b2JointEdge* b2Body::GetJointList() +{ + return m_jointList; +} + +inline const b2JointEdge* b2Body::GetJointList() const +{ + return m_jointList; +} + +inline b2ContactEdge* b2Body::GetContactList() +{ + return m_contactList; +} + +inline const b2ContactEdge* b2Body::GetContactList() const +{ + return m_contactList; +} + +inline b2Body* b2Body::GetNext() +{ + return m_next; +} + +inline const b2Body* b2Body::GetNext() const +{ + return m_next; +} + +inline void b2Body::SetUserData(void* data) +{ + m_userData = data; +} + +inline void* b2Body::GetUserData() const +{ + return m_userData; +} + +inline void b2Body::ApplyForce(const b2Vec2& force, const b2Vec2& point, bool wake) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (wake && (m_flags & e_awakeFlag) == 0) + { + SetAwake(true); + } + + // Don't accumulate a force if the body is sleeping. + if (m_flags & e_awakeFlag) + { + m_force += force; + m_torque += b2Cross(point - m_sweep.c, force); + } +} + +inline void b2Body::ApplyForceToCenter(const b2Vec2& force, bool wake) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (wake && (m_flags & e_awakeFlag) == 0) + { + SetAwake(true); + } + + // Don't accumulate a force if the body is sleeping + if (m_flags & e_awakeFlag) + { + m_force += force; + } +} + +inline void b2Body::ApplyTorque(float32 torque, bool wake) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (wake && (m_flags & e_awakeFlag) == 0) + { + SetAwake(true); + } + + // Don't accumulate a force if the body is sleeping + if (m_flags & e_awakeFlag) + { + m_torque += torque; + } +} + +inline void b2Body::ApplyLinearImpulse(const b2Vec2& impulse, const b2Vec2& point, bool wake) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (wake && (m_flags & e_awakeFlag) == 0) + { + SetAwake(true); + } + + // Don't accumulate velocity if the body is sleeping + if (m_flags & e_awakeFlag) + { + m_linearVelocity += m_invMass * impulse; + m_angularVelocity += m_invI * b2Cross(point - m_sweep.c, impulse); + } +} + +inline void b2Body::ApplyAngularImpulse(float32 impulse, bool wake) +{ + if (m_type != b2_dynamicBody) + { + return; + } + + if (wake && (m_flags & e_awakeFlag) == 0) + { + SetAwake(true); + } + + // Don't accumulate velocity if the body is sleeping + if (m_flags & e_awakeFlag) + { + m_angularVelocity += m_invI * impulse; + } +} + +inline void b2Body::SynchronizeTransform() +{ + m_xf.q.Set(m_sweep.a); + m_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter); +} + +inline void b2Body::Advance(float32 alpha) +{ + // Advance to the new safe time. This doesn't sync the broad-phase. + m_sweep.Advance(alpha); + m_sweep.c = m_sweep.c0; + m_sweep.a = m_sweep.a0; + m_xf.q.Set(m_sweep.a); + m_xf.p = m_sweep.c - b2Mul(m_xf.q, m_sweep.localCenter); +} + +inline b2World* b2Body::GetWorld() +{ + return m_world; +} + +inline const b2World* b2Body::GetWorld() const +{ + return m_world; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2ContactManager.cpp b/jni/love/src/libraries/Box2D/Dynamics/b2ContactManager.cpp new file mode 100755 index 00000000..d8a189b7 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2ContactManager.cpp @@ -0,0 +1,296 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include + +b2ContactFilter b2_defaultFilter; +b2ContactListener b2_defaultListener; + +b2ContactManager::b2ContactManager() +{ + m_contactList = NULL; + m_contactCount = 0; + m_contactFilter = &b2_defaultFilter; + m_contactListener = &b2_defaultListener; + m_allocator = NULL; +} + +void b2ContactManager::Destroy(b2Contact* c) +{ + b2Fixture* fixtureA = c->GetFixtureA(); + b2Fixture* fixtureB = c->GetFixtureB(); + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + + if (m_contactListener && c->IsTouching()) + { + m_contactListener->EndContact(c); + } + + // Remove from the world. + if (c->m_prev) + { + c->m_prev->m_next = c->m_next; + } + + if (c->m_next) + { + c->m_next->m_prev = c->m_prev; + } + + if (c == m_contactList) + { + m_contactList = c->m_next; + } + + // Remove from body 1 + if (c->m_nodeA.prev) + { + c->m_nodeA.prev->next = c->m_nodeA.next; + } + + if (c->m_nodeA.next) + { + c->m_nodeA.next->prev = c->m_nodeA.prev; + } + + if (&c->m_nodeA == bodyA->m_contactList) + { + bodyA->m_contactList = c->m_nodeA.next; + } + + // Remove from body 2 + if (c->m_nodeB.prev) + { + c->m_nodeB.prev->next = c->m_nodeB.next; + } + + if (c->m_nodeB.next) + { + c->m_nodeB.next->prev = c->m_nodeB.prev; + } + + if (&c->m_nodeB == bodyB->m_contactList) + { + bodyB->m_contactList = c->m_nodeB.next; + } + + // Call the factory. + b2Contact::Destroy(c, m_allocator); + --m_contactCount; +} + +// This is the top level collision call for the time step. Here +// all the narrow phase collision is processed for the world +// contact list. +void b2ContactManager::Collide() +{ + // Update awake contacts. + b2Contact* c = m_contactList; + while (c) + { + b2Fixture* fixtureA = c->GetFixtureA(); + b2Fixture* fixtureB = c->GetFixtureB(); + int32 indexA = c->GetChildIndexA(); + int32 indexB = c->GetChildIndexB(); + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + + // Is this contact flagged for filtering? + if (c->m_flags & b2Contact::e_filterFlag) + { + // Should these bodies collide? + if (bodyB->ShouldCollide(bodyA) == false) + { + b2Contact* cNuke = c; + c = cNuke->GetNext(); + Destroy(cNuke); + continue; + } + + // Check user filtering. + if (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false) + { + b2Contact* cNuke = c; + c = cNuke->GetNext(); + Destroy(cNuke); + continue; + } + + // Clear the filtering flag. + c->m_flags &= ~b2Contact::e_filterFlag; + } + + bool activeA = bodyA->IsAwake() && bodyA->m_type != b2_staticBody; + bool activeB = bodyB->IsAwake() && bodyB->m_type != b2_staticBody; + + // At least one body must be awake and it must be dynamic or kinematic. + if (activeA == false && activeB == false) + { + c = c->GetNext(); + continue; + } + + int32 proxyIdA = fixtureA->m_proxies[indexA].proxyId; + int32 proxyIdB = fixtureB->m_proxies[indexB].proxyId; + bool overlap = m_broadPhase.TestOverlap(proxyIdA, proxyIdB); + + // Here we destroy contacts that cease to overlap in the broad-phase. + if (overlap == false) + { + b2Contact* cNuke = c; + c = cNuke->GetNext(); + Destroy(cNuke); + continue; + } + + // The contact persists. + c->Update(m_contactListener); + c = c->GetNext(); + } +} + +void b2ContactManager::FindNewContacts() +{ + m_broadPhase.UpdatePairs(this); +} + +void b2ContactManager::AddPair(void* proxyUserDataA, void* proxyUserDataB) +{ + b2FixtureProxy* proxyA = (b2FixtureProxy*)proxyUserDataA; + b2FixtureProxy* proxyB = (b2FixtureProxy*)proxyUserDataB; + + b2Fixture* fixtureA = proxyA->fixture; + b2Fixture* fixtureB = proxyB->fixture; + + int32 indexA = proxyA->childIndex; + int32 indexB = proxyB->childIndex; + + b2Body* bodyA = fixtureA->GetBody(); + b2Body* bodyB = fixtureB->GetBody(); + + // Are the fixtures on the same body? + if (bodyA == bodyB) + { + return; + } + + // TODO_ERIN use a hash table to remove a potential bottleneck when both + // bodies have a lot of contacts. + // Does a contact already exist? + b2ContactEdge* edge = bodyB->GetContactList(); + while (edge) + { + if (edge->other == bodyA) + { + b2Fixture* fA = edge->contact->GetFixtureA(); + b2Fixture* fB = edge->contact->GetFixtureB(); + int32 iA = edge->contact->GetChildIndexA(); + int32 iB = edge->contact->GetChildIndexB(); + + if (fA == fixtureA && fB == fixtureB && iA == indexA && iB == indexB) + { + // A contact already exists. + return; + } + + if (fA == fixtureB && fB == fixtureA && iA == indexB && iB == indexA) + { + // A contact already exists. + return; + } + } + + edge = edge->next; + } + + // Does a joint override collision? Is at least one body dynamic? + if (bodyB->ShouldCollide(bodyA) == false) + { + return; + } + + // Check user filtering. + if (m_contactFilter && m_contactFilter->ShouldCollide(fixtureA, fixtureB) == false) + { + return; + } + + // Call the factory. + b2Contact* c = b2Contact::Create(fixtureA, indexA, fixtureB, indexB, m_allocator); + if (c == NULL) + { + return; + } + + // Contact creation may swap fixtures. + fixtureA = c->GetFixtureA(); + fixtureB = c->GetFixtureB(); + indexA = c->GetChildIndexA(); + indexB = c->GetChildIndexB(); + bodyA = fixtureA->GetBody(); + bodyB = fixtureB->GetBody(); + + // Insert into the world. + c->m_prev = NULL; + c->m_next = m_contactList; + if (m_contactList != NULL) + { + m_contactList->m_prev = c; + } + m_contactList = c; + + // Connect to island graph. + + // Connect to body A + c->m_nodeA.contact = c; + c->m_nodeA.other = bodyB; + + c->m_nodeA.prev = NULL; + c->m_nodeA.next = bodyA->m_contactList; + if (bodyA->m_contactList != NULL) + { + bodyA->m_contactList->prev = &c->m_nodeA; + } + bodyA->m_contactList = &c->m_nodeA; + + // Connect to body B + c->m_nodeB.contact = c; + c->m_nodeB.other = bodyA; + + c->m_nodeB.prev = NULL; + c->m_nodeB.next = bodyB->m_contactList; + if (bodyB->m_contactList != NULL) + { + bodyB->m_contactList->prev = &c->m_nodeB; + } + bodyB->m_contactList = &c->m_nodeB; + + // Wake up the bodies + if (fixtureA->IsSensor() == false && fixtureB->IsSensor() == false) + { + bodyA->SetAwake(true); + bodyB->SetAwake(true); + } + + ++m_contactCount; +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2ContactManager.h b/jni/love/src/libraries/Box2D/Dynamics/b2ContactManager.h new file mode 100755 index 00000000..6a1d072a --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2ContactManager.h @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_CONTACT_MANAGER_H +#define B2_CONTACT_MANAGER_H + +#include + +class b2Contact; +class b2ContactFilter; +class b2ContactListener; +class b2BlockAllocator; + +// Delegate of b2World. +class b2ContactManager +{ +public: + b2ContactManager(); + + // Broad-phase callback. + void AddPair(void* proxyUserDataA, void* proxyUserDataB); + + void FindNewContacts(); + + void Destroy(b2Contact* c); + + void Collide(); + + b2BroadPhase m_broadPhase; + b2Contact* m_contactList; + int32 m_contactCount; + b2ContactFilter* m_contactFilter; + b2ContactListener* m_contactListener; + b2BlockAllocator* m_allocator; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2Fixture.cpp b/jni/love/src/libraries/Box2D/Dynamics/b2Fixture.cpp new file mode 100755 index 00000000..fb17f0a3 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2Fixture.cpp @@ -0,0 +1,303 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +b2Fixture::b2Fixture() +{ + m_userData = NULL; + m_body = NULL; + m_next = NULL; + m_proxies = NULL; + m_proxyCount = 0; + m_shape = NULL; + m_density = 0.0f; +} + +void b2Fixture::Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def) +{ + m_userData = def->userData; + m_friction = def->friction; + m_restitution = def->restitution; + + m_body = body; + m_next = NULL; + + m_filter = def->filter; + + m_isSensor = def->isSensor; + + m_shape = def->shape->Clone(allocator); + + // Reserve proxy space + int32 childCount = m_shape->GetChildCount(); + m_proxies = (b2FixtureProxy*)allocator->Allocate(childCount * sizeof(b2FixtureProxy)); + for (int32 i = 0; i < childCount; ++i) + { + m_proxies[i].fixture = NULL; + m_proxies[i].proxyId = b2BroadPhase::e_nullProxy; + } + m_proxyCount = 0; + + m_density = def->density; +} + +void b2Fixture::Destroy(b2BlockAllocator* allocator) +{ + // The proxies must be destroyed before calling this. + b2Assert(m_proxyCount == 0); + + // Free the proxy array. + int32 childCount = m_shape->GetChildCount(); + allocator->Free(m_proxies, childCount * sizeof(b2FixtureProxy)); + m_proxies = NULL; + + // Free the child shape. + switch (m_shape->m_type) + { + case b2Shape::e_circle: + { + b2CircleShape* s = (b2CircleShape*)m_shape; + s->~b2CircleShape(); + allocator->Free(s, sizeof(b2CircleShape)); + } + break; + + case b2Shape::e_edge: + { + b2EdgeShape* s = (b2EdgeShape*)m_shape; + s->~b2EdgeShape(); + allocator->Free(s, sizeof(b2EdgeShape)); + } + break; + + case b2Shape::e_polygon: + { + b2PolygonShape* s = (b2PolygonShape*)m_shape; + s->~b2PolygonShape(); + allocator->Free(s, sizeof(b2PolygonShape)); + } + break; + + case b2Shape::e_chain: + { + b2ChainShape* s = (b2ChainShape*)m_shape; + s->~b2ChainShape(); + allocator->Free(s, sizeof(b2ChainShape)); + } + break; + + default: + b2Assert(false); + break; + } + + m_shape = NULL; +} + +void b2Fixture::CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf) +{ + b2Assert(m_proxyCount == 0); + + // Create proxies in the broad-phase. + m_proxyCount = m_shape->GetChildCount(); + + for (int32 i = 0; i < m_proxyCount; ++i) + { + b2FixtureProxy* proxy = m_proxies + i; + m_shape->ComputeAABB(&proxy->aabb, xf, i); + proxy->proxyId = broadPhase->CreateProxy(proxy->aabb, proxy); + proxy->fixture = this; + proxy->childIndex = i; + } +} + +void b2Fixture::DestroyProxies(b2BroadPhase* broadPhase) +{ + // Destroy proxies in the broad-phase. + for (int32 i = 0; i < m_proxyCount; ++i) + { + b2FixtureProxy* proxy = m_proxies + i; + broadPhase->DestroyProxy(proxy->proxyId); + proxy->proxyId = b2BroadPhase::e_nullProxy; + } + + m_proxyCount = 0; +} + +void b2Fixture::Synchronize(b2BroadPhase* broadPhase, const b2Transform& transform1, const b2Transform& transform2) +{ + if (m_proxyCount == 0) + { + return; + } + + for (int32 i = 0; i < m_proxyCount; ++i) + { + b2FixtureProxy* proxy = m_proxies + i; + + // Compute an AABB that covers the swept shape (may miss some rotation effect). + b2AABB aabb1, aabb2; + m_shape->ComputeAABB(&aabb1, transform1, proxy->childIndex); + m_shape->ComputeAABB(&aabb2, transform2, proxy->childIndex); + + proxy->aabb.Combine(aabb1, aabb2); + + b2Vec2 displacement = transform2.p - transform1.p; + + broadPhase->MoveProxy(proxy->proxyId, proxy->aabb, displacement); + } +} + +void b2Fixture::SetFilterData(const b2Filter& filter) +{ + m_filter = filter; + + Refilter(); +} + +void b2Fixture::Refilter() +{ + if (m_body == NULL) + { + return; + } + + // Flag associated contacts for filtering. + b2ContactEdge* edge = m_body->GetContactList(); + while (edge) + { + b2Contact* contact = edge->contact; + b2Fixture* fixtureA = contact->GetFixtureA(); + b2Fixture* fixtureB = contact->GetFixtureB(); + if (fixtureA == this || fixtureB == this) + { + contact->FlagForFiltering(); + } + + edge = edge->next; + } + + b2World* world = m_body->GetWorld(); + + if (world == NULL) + { + return; + } + + // Touch each proxy so that new pairs may be created + b2BroadPhase* broadPhase = &world->m_contactManager.m_broadPhase; + for (int32 i = 0; i < m_proxyCount; ++i) + { + broadPhase->TouchProxy(m_proxies[i].proxyId); + } +} + +void b2Fixture::SetSensor(bool sensor) +{ + if (sensor != m_isSensor) + { + m_body->SetAwake(true); + m_isSensor = sensor; + } +} + +void b2Fixture::Dump(int32 bodyIndex) +{ + b2Log(" b2FixtureDef fd;\n"); + b2Log(" fd.friction = %.15lef;\n", m_friction); + b2Log(" fd.restitution = %.15lef;\n", m_restitution); + b2Log(" fd.density = %.15lef;\n", m_density); + b2Log(" fd.isSensor = bool(%d);\n", m_isSensor); + b2Log(" fd.filter.categoryBits = uint16(%d);\n", m_filter.categoryBits); + b2Log(" fd.filter.maskBits = uint16(%d);\n", m_filter.maskBits); + b2Log(" fd.filter.groupIndex = int16(%d);\n", m_filter.groupIndex); + + switch (m_shape->m_type) + { + case b2Shape::e_circle: + { + b2CircleShape* s = (b2CircleShape*)m_shape; + b2Log(" b2CircleShape shape;\n"); + b2Log(" shape.m_radius = %.15lef;\n", s->m_radius); + b2Log(" shape.m_p.Set(%.15lef, %.15lef);\n", s->m_p.x, s->m_p.y); + } + break; + + case b2Shape::e_edge: + { + b2EdgeShape* s = (b2EdgeShape*)m_shape; + b2Log(" b2EdgeShape shape;\n"); + b2Log(" shape.m_radius = %.15lef;\n", s->m_radius); + b2Log(" shape.m_vertex0.Set(%.15lef, %.15lef);\n", s->m_vertex0.x, s->m_vertex0.y); + b2Log(" shape.m_vertex1.Set(%.15lef, %.15lef);\n", s->m_vertex1.x, s->m_vertex1.y); + b2Log(" shape.m_vertex2.Set(%.15lef, %.15lef);\n", s->m_vertex2.x, s->m_vertex2.y); + b2Log(" shape.m_vertex3.Set(%.15lef, %.15lef);\n", s->m_vertex3.x, s->m_vertex3.y); + b2Log(" shape.m_hasVertex0 = bool(%d);\n", s->m_hasVertex0); + b2Log(" shape.m_hasVertex3 = bool(%d);\n", s->m_hasVertex3); + } + break; + + case b2Shape::e_polygon: + { + b2PolygonShape* s = (b2PolygonShape*)m_shape; + b2Log(" b2PolygonShape shape;\n"); + b2Log(" b2Vec2 vs[%d];\n", b2_maxPolygonVertices); + for (int32 i = 0; i < s->m_count; ++i) + { + b2Log(" vs[%d].Set(%.15lef, %.15lef);\n", i, s->m_vertices[i].x, s->m_vertices[i].y); + } + b2Log(" shape.Set(vs, %d);\n", s->m_count); + } + break; + + case b2Shape::e_chain: + { + b2ChainShape* s = (b2ChainShape*)m_shape; + b2Log(" b2ChainShape shape;\n"); + b2Log(" b2Vec2 vs[%d];\n", s->m_count); + for (int32 i = 0; i < s->m_count; ++i) + { + b2Log(" vs[%d].Set(%.15lef, %.15lef);\n", i, s->m_vertices[i].x, s->m_vertices[i].y); + } + b2Log(" shape.CreateChain(vs, %d);\n", s->m_count); + b2Log(" shape.m_prevVertex.Set(%.15lef, %.15lef);\n", s->m_prevVertex.x, s->m_prevVertex.y); + b2Log(" shape.m_nextVertex.Set(%.15lef, %.15lef);\n", s->m_nextVertex.x, s->m_nextVertex.y); + b2Log(" shape.m_hasPrevVertex = bool(%d);\n", s->m_hasPrevVertex); + b2Log(" shape.m_hasNextVertex = bool(%d);\n", s->m_hasNextVertex); + } + break; + + default: + return; + } + + b2Log("\n"); + b2Log(" fd.shape = &shape;\n"); + b2Log("\n"); + b2Log(" bodies[%d]->CreateFixture(&fd);\n", bodyIndex); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2Fixture.h b/jni/love/src/libraries/Box2D/Dynamics/b2Fixture.h new file mode 100755 index 00000000..753127fb --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2Fixture.h @@ -0,0 +1,345 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_FIXTURE_H +#define B2_FIXTURE_H + +#include +#include +#include + +class b2BlockAllocator; +class b2Body; +class b2BroadPhase; +class b2Fixture; + +/// This holds contact filtering data. +struct b2Filter +{ + b2Filter() + { + categoryBits = 0x0001; + maskBits = 0xFFFF; + groupIndex = 0; + } + + /// The collision category bits. Normally you would just set one bit. + uint16 categoryBits; + + /// The collision mask bits. This states the categories that this + /// shape would accept for collision. + uint16 maskBits; + + /// Collision groups allow a certain group of objects to never collide (negative) + /// or always collide (positive). Zero means no collision group. Non-zero group + /// filtering always wins against the mask bits. + int16 groupIndex; +}; + +/// A fixture definition is used to create a fixture. This class defines an +/// abstract fixture definition. You can reuse fixture definitions safely. +struct b2FixtureDef +{ + /// The constructor sets the default fixture definition values. + b2FixtureDef() + { + shape = NULL; + userData = NULL; + friction = 0.2f; + restitution = 0.0f; + density = 0.0f; + isSensor = false; + } + + /// The shape, this must be set. The shape will be cloned, so you + /// can create the shape on the stack. + const b2Shape* shape; + + /// Use this to store application specific fixture data. + void* userData; + + /// The friction coefficient, usually in the range [0,1]. + float32 friction; + + /// The restitution (elasticity) usually in the range [0,1]. + float32 restitution; + + /// The density, usually in kg/m^2. + float32 density; + + /// A sensor shape collects contact information but never generates a collision + /// response. + bool isSensor; + + /// Contact filtering data. + b2Filter filter; +}; + +/// This proxy is used internally to connect fixtures to the broad-phase. +struct b2FixtureProxy +{ + b2AABB aabb; + b2Fixture* fixture; + int32 childIndex; + int32 proxyId; +}; + +/// A fixture is used to attach a shape to a body for collision detection. A fixture +/// inherits its transform from its parent. Fixtures hold additional non-geometric data +/// such as friction, collision filters, etc. +/// Fixtures are created via b2Body::CreateFixture. +/// @warning you cannot reuse fixtures. +class b2Fixture +{ +public: + /// Get the type of the child shape. You can use this to down cast to the concrete shape. + /// @return the shape type. + b2Shape::Type GetType() const; + + /// Get the child shape. You can modify the child shape, however you should not change the + /// number of vertices because this will crash some collision caching mechanisms. + /// Manipulating the shape may lead to non-physical behavior. + b2Shape* GetShape(); + const b2Shape* GetShape() const; + + /// Set if this fixture is a sensor. + void SetSensor(bool sensor); + + /// Is this fixture a sensor (non-solid)? + /// @return the true if the shape is a sensor. + bool IsSensor() const; + + /// Set the contact filtering data. This will not update contacts until the next time + /// step when either parent body is active and awake. + /// This automatically calls Refilter. + void SetFilterData(const b2Filter& filter); + + /// Get the contact filtering data. + const b2Filter& GetFilterData() const; + + /// Call this if you want to establish collision that was previously disabled by b2ContactFilter::ShouldCollide. + void Refilter(); + + /// Get the parent body of this fixture. This is NULL if the fixture is not attached. + /// @return the parent body. + b2Body* GetBody(); + const b2Body* GetBody() const; + + /// Get the next fixture in the parent body's fixture list. + /// @return the next shape. + b2Fixture* GetNext(); + const b2Fixture* GetNext() const; + + /// Get the user data that was assigned in the fixture definition. Use this to + /// store your application specific data. + void* GetUserData() const; + + /// Set the user data. Use this to store your application specific data. + void SetUserData(void* data); + + /// Test a point for containment in this fixture. + /// @param p a point in world coordinates. + bool TestPoint(const b2Vec2& p) const; + + /// Cast a ray against this shape. + /// @param output the ray-cast results. + /// @param input the ray-cast input parameters. + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const; + + /// Get the mass data for this fixture. The mass data is based on the density and + /// the shape. The rotational inertia is about the shape's origin. This operation + /// may be expensive. + void GetMassData(b2MassData* massData) const; + + /// Set the density of this fixture. This will _not_ automatically adjust the mass + /// of the body. You must call b2Body::ResetMassData to update the body's mass. + void SetDensity(float32 density); + + /// Get the density of this fixture. + float32 GetDensity() const; + + /// Get the coefficient of friction. + float32 GetFriction() const; + + /// Set the coefficient of friction. This will _not_ change the friction of + /// existing contacts. + void SetFriction(float32 friction); + + /// Get the coefficient of restitution. + float32 GetRestitution() const; + + /// Set the coefficient of restitution. This will _not_ change the restitution of + /// existing contacts. + void SetRestitution(float32 restitution); + + /// Get the fixture's AABB. This AABB may be enlarge and/or stale. + /// If you need a more accurate AABB, compute it using the shape and + /// the body transform. + const b2AABB& GetAABB(int32 childIndex) const; + + /// Dump this fixture to the log file. + void Dump(int32 bodyIndex); + +protected: + + friend class b2Body; + friend class b2World; + friend class b2Contact; + friend class b2ContactManager; + + b2Fixture(); + + // We need separation create/destroy functions from the constructor/destructor because + // the destructor cannot access the allocator (no destructor arguments allowed by C++). + void Create(b2BlockAllocator* allocator, b2Body* body, const b2FixtureDef* def); + void Destroy(b2BlockAllocator* allocator); + + // These support body activation/deactivation. + void CreateProxies(b2BroadPhase* broadPhase, const b2Transform& xf); + void DestroyProxies(b2BroadPhase* broadPhase); + + void Synchronize(b2BroadPhase* broadPhase, const b2Transform& xf1, const b2Transform& xf2); + + float32 m_density; + + b2Fixture* m_next; + b2Body* m_body; + + b2Shape* m_shape; + + float32 m_friction; + float32 m_restitution; + + b2FixtureProxy* m_proxies; + int32 m_proxyCount; + + b2Filter m_filter; + + bool m_isSensor; + + void* m_userData; +}; + +inline b2Shape::Type b2Fixture::GetType() const +{ + return m_shape->GetType(); +} + +inline b2Shape* b2Fixture::GetShape() +{ + return m_shape; +} + +inline const b2Shape* b2Fixture::GetShape() const +{ + return m_shape; +} + +inline bool b2Fixture::IsSensor() const +{ + return m_isSensor; +} + +inline const b2Filter& b2Fixture::GetFilterData() const +{ + return m_filter; +} + +inline void* b2Fixture::GetUserData() const +{ + return m_userData; +} + +inline void b2Fixture::SetUserData(void* data) +{ + m_userData = data; +} + +inline b2Body* b2Fixture::GetBody() +{ + return m_body; +} + +inline const b2Body* b2Fixture::GetBody() const +{ + return m_body; +} + +inline b2Fixture* b2Fixture::GetNext() +{ + return m_next; +} + +inline const b2Fixture* b2Fixture::GetNext() const +{ + return m_next; +} + +inline void b2Fixture::SetDensity(float32 density) +{ + b2Assert(b2IsValid(density) && density >= 0.0f); + m_density = density; +} + +inline float32 b2Fixture::GetDensity() const +{ + return m_density; +} + +inline float32 b2Fixture::GetFriction() const +{ + return m_friction; +} + +inline void b2Fixture::SetFriction(float32 friction) +{ + m_friction = friction; +} + +inline float32 b2Fixture::GetRestitution() const +{ + return m_restitution; +} + +inline void b2Fixture::SetRestitution(float32 restitution) +{ + m_restitution = restitution; +} + +inline bool b2Fixture::TestPoint(const b2Vec2& p) const +{ + return m_shape->TestPoint(m_body->GetTransform(), p); +} + +inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const +{ + return m_shape->RayCast(output, input, m_body->GetTransform(), childIndex); +} + +inline void b2Fixture::GetMassData(b2MassData* massData) const +{ + m_shape->ComputeMass(massData, m_density); +} + +inline const b2AABB& b2Fixture::GetAABB(int32 childIndex) const +{ + b2Assert(0 <= childIndex && childIndex < m_proxyCount); + return m_proxies[childIndex].aabb; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2Island.cpp b/jni/love/src/libraries/Box2D/Dynamics/b2Island.cpp new file mode 100755 index 00000000..d46589de --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2Island.cpp @@ -0,0 +1,539 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* +Position Correction Notes +========================= +I tried the several algorithms for position correction of the 2D revolute joint. +I looked at these systems: +- simple pendulum (1m diameter sphere on massless 5m stick) with initial angular velocity of 100 rad/s. +- suspension bridge with 30 1m long planks of length 1m. +- multi-link chain with 30 1m long links. + +Here are the algorithms: + +Baumgarte - A fraction of the position error is added to the velocity error. There is no +separate position solver. + +Pseudo Velocities - After the velocity solver and position integration, +the position error, Jacobian, and effective mass are recomputed. Then +the velocity constraints are solved with pseudo velocities and a fraction +of the position error is added to the pseudo velocity error. The pseudo +velocities are initialized to zero and there is no warm-starting. After +the position solver, the pseudo velocities are added to the positions. +This is also called the First Order World method or the Position LCP method. + +Modified Nonlinear Gauss-Seidel (NGS) - Like Pseudo Velocities except the +position error is re-computed for each constraint and the positions are updated +after the constraint is solved. The radius vectors (aka Jacobians) are +re-computed too (otherwise the algorithm has horrible instability). The pseudo +velocity states are not needed because they are effectively zero at the beginning +of each iteration. Since we have the current position error, we allow the +iterations to terminate early if the error becomes smaller than b2_linearSlop. + +Full NGS or just NGS - Like Modified NGS except the effective mass are re-computed +each time a constraint is solved. + +Here are the results: +Baumgarte - this is the cheapest algorithm but it has some stability problems, +especially with the bridge. The chain links separate easily close to the root +and they jitter as they struggle to pull together. This is one of the most common +methods in the field. The big drawback is that the position correction artificially +affects the momentum, thus leading to instabilities and false bounce. I used a +bias factor of 0.2. A larger bias factor makes the bridge less stable, a smaller +factor makes joints and contacts more spongy. + +Pseudo Velocities - the is more stable than the Baumgarte method. The bridge is +stable. However, joints still separate with large angular velocities. Drag the +simple pendulum in a circle quickly and the joint will separate. The chain separates +easily and does not recover. I used a bias factor of 0.2. A larger value lead to +the bridge collapsing when a heavy cube drops on it. + +Modified NGS - this algorithm is better in some ways than Baumgarte and Pseudo +Velocities, but in other ways it is worse. The bridge and chain are much more +stable, but the simple pendulum goes unstable at high angular velocities. + +Full NGS - stable in all tests. The joints display good stiffness. The bridge +still sags, but this is better than infinite forces. + +Recommendations +Pseudo Velocities are not really worthwhile because the bridge and chain cannot +recover from joint separation. In other cases the benefit over Baumgarte is small. + +Modified NGS is not a robust method for the revolute joint due to the violent +instability seen in the simple pendulum. Perhaps it is viable with other constraint +types, especially scalar constraints where the effective mass is a scalar. + +This leaves Baumgarte and Full NGS. Baumgarte has small, but manageable instabilities +and is very fast. I don't think we can escape Baumgarte, especially in highly +demanding cases where high constraint fidelity is not needed. + +Full NGS is robust and easy on the eyes. I recommend this as an option for +higher fidelity simulation and certainly for suspension bridges and long chains. +Full NGS might be a good choice for ragdolls, especially motorized ragdolls where +joint separation can be problematic. The number of NGS iterations can be reduced +for better performance without harming robustness much. + +Each joint in a can be handled differently in the position solver. So I recommend +a system where the user can select the algorithm on a per joint basis. I would +probably default to the slower Full NGS and let the user select the faster +Baumgarte method in performance critical scenarios. +*/ + +/* +Cache Performance + +The Box2D solvers are dominated by cache misses. Data structures are designed +to increase the number of cache hits. Much of misses are due to random access +to body data. The constraint structures are iterated over linearly, which leads +to few cache misses. + +The bodies are not accessed during iteration. Instead read only data, such as +the mass values are stored with the constraints. The mutable data are the constraint +impulses and the bodies velocities/positions. The impulses are held inside the +constraint structures. The body velocities/positions are held in compact, temporary +arrays to increase the number of cache hits. Linear and angular velocity are +stored in a single array since multiple arrays lead to multiple misses. +*/ + +/* +2D Rotation + +R = [cos(theta) -sin(theta)] + [sin(theta) cos(theta) ] + +thetaDot = omega + +Let q1 = cos(theta), q2 = sin(theta). +R = [q1 -q2] + [q2 q1] + +q1Dot = -thetaDot * q2 +q2Dot = thetaDot * q1 + +q1_new = q1_old - dt * w * q2 +q2_new = q2_old + dt * w * q1 +then normalize. + +This might be faster than computing sin+cos. +However, we can compute sin+cos of the same angle fast. +*/ + +b2Island::b2Island( + int32 bodyCapacity, + int32 contactCapacity, + int32 jointCapacity, + b2StackAllocator* allocator, + b2ContactListener* listener) +{ + m_bodyCapacity = bodyCapacity; + m_contactCapacity = contactCapacity; + m_jointCapacity = jointCapacity; + m_bodyCount = 0; + m_contactCount = 0; + m_jointCount = 0; + + m_allocator = allocator; + m_listener = listener; + + m_bodies = (b2Body**)m_allocator->Allocate(bodyCapacity * sizeof(b2Body*)); + m_contacts = (b2Contact**)m_allocator->Allocate(contactCapacity * sizeof(b2Contact*)); + m_joints = (b2Joint**)m_allocator->Allocate(jointCapacity * sizeof(b2Joint*)); + + m_velocities = (b2Velocity*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Velocity)); + m_positions = (b2Position*)m_allocator->Allocate(m_bodyCapacity * sizeof(b2Position)); +} + +b2Island::~b2Island() +{ + // Warning: the order should reverse the constructor order. + m_allocator->Free(m_positions); + m_allocator->Free(m_velocities); + m_allocator->Free(m_joints); + m_allocator->Free(m_contacts); + m_allocator->Free(m_bodies); +} + +void b2Island::Solve(b2Profile* profile, const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep) +{ + b2Timer timer; + + float32 h = step.dt; + + // Integrate velocities and apply damping. Initialize the body state. + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* b = m_bodies[i]; + + b2Vec2 c = b->m_sweep.c; + float32 a = b->m_sweep.a; + b2Vec2 v = b->m_linearVelocity; + float32 w = b->m_angularVelocity; + + // Store positions for continuous collision. + b->m_sweep.c0 = b->m_sweep.c; + b->m_sweep.a0 = b->m_sweep.a; + + if (b->m_type == b2_dynamicBody) + { + // Integrate velocities. + v += h * (b->m_gravityScale * gravity + b->m_invMass * b->m_force); + w += h * b->m_invI * b->m_torque; + + // Apply damping. + // ODE: dv/dt + c * v = 0 + // Solution: v(t) = v0 * exp(-c * t) + // Time step: v(t + dt) = v0 * exp(-c * (t + dt)) = v0 * exp(-c * t) * exp(-c * dt) = v * exp(-c * dt) + // v2 = exp(-c * dt) * v1 + // Pade approximation: + // v2 = v1 * 1 / (1 + c * dt) + v *= 1.0f / (1.0f + h * b->m_linearDamping); + w *= 1.0f / (1.0f + h * b->m_angularDamping); + } + + m_positions[i].c = c; + m_positions[i].a = a; + m_velocities[i].v = v; + m_velocities[i].w = w; + } + + timer.Reset(); + + // Solver data + b2SolverData solverData; + solverData.step = step; + solverData.positions = m_positions; + solverData.velocities = m_velocities; + + // Initialize velocity constraints. + b2ContactSolverDef contactSolverDef; + contactSolverDef.step = step; + contactSolverDef.contacts = m_contacts; + contactSolverDef.count = m_contactCount; + contactSolverDef.positions = m_positions; + contactSolverDef.velocities = m_velocities; + contactSolverDef.allocator = m_allocator; + + b2ContactSolver contactSolver(&contactSolverDef); + contactSolver.InitializeVelocityConstraints(); + + if (step.warmStarting) + { + contactSolver.WarmStart(); + } + + for (int32 i = 0; i < m_jointCount; ++i) + { + m_joints[i]->InitVelocityConstraints(solverData); + } + + profile->solveInit = timer.GetMilliseconds(); + + // Solve velocity constraints + timer.Reset(); + for (int32 i = 0; i < step.velocityIterations; ++i) + { + for (int32 j = 0; j < m_jointCount; ++j) + { + m_joints[j]->SolveVelocityConstraints(solverData); + } + + contactSolver.SolveVelocityConstraints(); + } + + // Store impulses for warm starting + contactSolver.StoreImpulses(); + profile->solveVelocity = timer.GetMilliseconds(); + + // Integrate positions + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Vec2 c = m_positions[i].c; + float32 a = m_positions[i].a; + b2Vec2 v = m_velocities[i].v; + float32 w = m_velocities[i].w; + + // Check for large velocities + b2Vec2 translation = h * v; + if (b2Dot(translation, translation) > b2_maxTranslationSquared) + { + float32 ratio = b2_maxTranslation / translation.Length(); + v *= ratio; + } + + float32 rotation = h * w; + if (rotation * rotation > b2_maxRotationSquared) + { + float32 ratio = b2_maxRotation / b2Abs(rotation); + w *= ratio; + } + + // Integrate + c += h * v; + a += h * w; + + m_positions[i].c = c; + m_positions[i].a = a; + m_velocities[i].v = v; + m_velocities[i].w = w; + } + + // Solve position constraints + timer.Reset(); + bool positionSolved = false; + for (int32 i = 0; i < step.positionIterations; ++i) + { + bool contactsOkay = contactSolver.SolvePositionConstraints(); + + bool jointsOkay = true; + for (int32 i = 0; i < m_jointCount; ++i) + { + bool jointOkay = m_joints[i]->SolvePositionConstraints(solverData); + jointsOkay = jointsOkay && jointOkay; + } + + if (contactsOkay && jointsOkay) + { + // Exit early if the position errors are small. + positionSolved = true; + break; + } + } + + // Copy state buffers back to the bodies + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* body = m_bodies[i]; + body->m_sweep.c = m_positions[i].c; + body->m_sweep.a = m_positions[i].a; + body->m_linearVelocity = m_velocities[i].v; + body->m_angularVelocity = m_velocities[i].w; + body->SynchronizeTransform(); + } + + profile->solvePosition = timer.GetMilliseconds(); + + Report(contactSolver.m_velocityConstraints); + + if (allowSleep) + { + float32 minSleepTime = b2_maxFloat; + + const float32 linTolSqr = b2_linearSleepTolerance * b2_linearSleepTolerance; + const float32 angTolSqr = b2_angularSleepTolerance * b2_angularSleepTolerance; + + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* b = m_bodies[i]; + if (b->GetType() == b2_staticBody) + { + continue; + } + + if ((b->m_flags & b2Body::e_autoSleepFlag) == 0 || + b->m_angularVelocity * b->m_angularVelocity > angTolSqr || + b2Dot(b->m_linearVelocity, b->m_linearVelocity) > linTolSqr) + { + b->m_sleepTime = 0.0f; + minSleepTime = 0.0f; + } + else + { + b->m_sleepTime += h; + minSleepTime = b2Min(minSleepTime, b->m_sleepTime); + } + } + + if (minSleepTime >= b2_timeToSleep && positionSolved) + { + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* b = m_bodies[i]; + b->SetAwake(false); + } + } + } +} + +void b2Island::SolveTOI(const b2TimeStep& subStep, int32 toiIndexA, int32 toiIndexB) +{ + b2Assert(toiIndexA < m_bodyCount); + b2Assert(toiIndexB < m_bodyCount); + + // Initialize the body state. + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Body* b = m_bodies[i]; + m_positions[i].c = b->m_sweep.c; + m_positions[i].a = b->m_sweep.a; + m_velocities[i].v = b->m_linearVelocity; + m_velocities[i].w = b->m_angularVelocity; + } + + b2ContactSolverDef contactSolverDef; + contactSolverDef.contacts = m_contacts; + contactSolverDef.count = m_contactCount; + contactSolverDef.allocator = m_allocator; + contactSolverDef.step = subStep; + contactSolverDef.positions = m_positions; + contactSolverDef.velocities = m_velocities; + b2ContactSolver contactSolver(&contactSolverDef); + + // Solve position constraints. + for (int32 i = 0; i < subStep.positionIterations; ++i) + { + bool contactsOkay = contactSolver.SolveTOIPositionConstraints(toiIndexA, toiIndexB); + if (contactsOkay) + { + break; + } + } + +#if 0 + // Is the new position really safe? + for (int32 i = 0; i < m_contactCount; ++i) + { + b2Contact* c = m_contacts[i]; + b2Fixture* fA = c->GetFixtureA(); + b2Fixture* fB = c->GetFixtureB(); + + b2Body* bA = fA->GetBody(); + b2Body* bB = fB->GetBody(); + + int32 indexA = c->GetChildIndexA(); + int32 indexB = c->GetChildIndexB(); + + b2DistanceInput input; + input.proxyA.Set(fA->GetShape(), indexA); + input.proxyB.Set(fB->GetShape(), indexB); + input.transformA = bA->GetTransform(); + input.transformB = bB->GetTransform(); + input.useRadii = false; + + b2DistanceOutput output; + b2SimplexCache cache; + cache.count = 0; + b2Distance(&output, &cache, &input); + + if (output.distance == 0 || cache.count == 3) + { + cache.count += 0; + } + } +#endif + + // Leap of faith to new safe state. + m_bodies[toiIndexA]->m_sweep.c0 = m_positions[toiIndexA].c; + m_bodies[toiIndexA]->m_sweep.a0 = m_positions[toiIndexA].a; + m_bodies[toiIndexB]->m_sweep.c0 = m_positions[toiIndexB].c; + m_bodies[toiIndexB]->m_sweep.a0 = m_positions[toiIndexB].a; + + // No warm starting is needed for TOI events because warm + // starting impulses were applied in the discrete solver. + contactSolver.InitializeVelocityConstraints(); + + // Solve velocity constraints. + for (int32 i = 0; i < subStep.velocityIterations; ++i) + { + contactSolver.SolveVelocityConstraints(); + } + + // Don't store the TOI contact forces for warm starting + // because they can be quite large. + + float32 h = subStep.dt; + + // Integrate positions + for (int32 i = 0; i < m_bodyCount; ++i) + { + b2Vec2 c = m_positions[i].c; + float32 a = m_positions[i].a; + b2Vec2 v = m_velocities[i].v; + float32 w = m_velocities[i].w; + + // Check for large velocities + b2Vec2 translation = h * v; + if (b2Dot(translation, translation) > b2_maxTranslationSquared) + { + float32 ratio = b2_maxTranslation / translation.Length(); + v *= ratio; + } + + float32 rotation = h * w; + if (rotation * rotation > b2_maxRotationSquared) + { + float32 ratio = b2_maxRotation / b2Abs(rotation); + w *= ratio; + } + + // Integrate + c += h * v; + a += h * w; + + m_positions[i].c = c; + m_positions[i].a = a; + m_velocities[i].v = v; + m_velocities[i].w = w; + + // Sync bodies + b2Body* body = m_bodies[i]; + body->m_sweep.c = c; + body->m_sweep.a = a; + body->m_linearVelocity = v; + body->m_angularVelocity = w; + body->SynchronizeTransform(); + } + + Report(contactSolver.m_velocityConstraints); +} + +void b2Island::Report(const b2ContactVelocityConstraint* constraints) +{ + if (m_listener == NULL) + { + return; + } + + for (int32 i = 0; i < m_contactCount; ++i) + { + b2Contact* c = m_contacts[i]; + + const b2ContactVelocityConstraint* vc = constraints + i; + + b2ContactImpulse impulse; + impulse.count = vc->pointCount; + for (int32 j = 0; j < vc->pointCount; ++j) + { + impulse.normalImpulses[j] = vc->points[j].normalImpulse; + impulse.tangentImpulses[j] = vc->points[j].tangentImpulse; + } + + m_listener->PostSolve(c, &impulse); + } +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2Island.h b/jni/love/src/libraries/Box2D/Dynamics/b2Island.h new file mode 100755 index 00000000..4a814c46 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2Island.h @@ -0,0 +1,93 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_ISLAND_H +#define B2_ISLAND_H + +#include +#include +#include + +class b2Contact; +class b2Joint; +class b2StackAllocator; +class b2ContactListener; +struct b2ContactVelocityConstraint; +struct b2Profile; + +/// This is an internal class. +class b2Island +{ +public: + b2Island(int32 bodyCapacity, int32 contactCapacity, int32 jointCapacity, + b2StackAllocator* allocator, b2ContactListener* listener); + ~b2Island(); + + void Clear() + { + m_bodyCount = 0; + m_contactCount = 0; + m_jointCount = 0; + } + + void Solve(b2Profile* profile, const b2TimeStep& step, const b2Vec2& gravity, bool allowSleep); + + void SolveTOI(const b2TimeStep& subStep, int32 toiIndexA, int32 toiIndexB); + + void Add(b2Body* body) + { + b2Assert(m_bodyCount < m_bodyCapacity); + body->m_islandIndex = m_bodyCount; + m_bodies[m_bodyCount] = body; + ++m_bodyCount; + } + + void Add(b2Contact* contact) + { + b2Assert(m_contactCount < m_contactCapacity); + m_contacts[m_contactCount++] = contact; + } + + void Add(b2Joint* joint) + { + b2Assert(m_jointCount < m_jointCapacity); + m_joints[m_jointCount++] = joint; + } + + void Report(const b2ContactVelocityConstraint* constraints); + + b2StackAllocator* m_allocator; + b2ContactListener* m_listener; + + b2Body** m_bodies; + b2Contact** m_contacts; + b2Joint** m_joints; + + b2Position* m_positions; + b2Velocity* m_velocities; + + int32 m_bodyCount; + int32 m_jointCount; + int32 m_contactCount; + + int32 m_bodyCapacity; + int32 m_contactCapacity; + int32 m_jointCapacity; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2TimeStep.h b/jni/love/src/libraries/Box2D/Dynamics/b2TimeStep.h new file mode 100755 index 00000000..a3727624 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2TimeStep.h @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_TIME_STEP_H +#define B2_TIME_STEP_H + +#include + +/// Profiling data. Times are in milliseconds. +struct b2Profile +{ + float32 step; + float32 collide; + float32 solve; + float32 solveInit; + float32 solveVelocity; + float32 solvePosition; + float32 broadphase; + float32 solveTOI; +}; + +/// This is an internal structure. +struct b2TimeStep +{ + float32 dt; // time step + float32 inv_dt; // inverse time step (0 if dt == 0). + float32 dtRatio; // dt * inv_dt0 + int32 velocityIterations; + int32 positionIterations; + bool warmStarting; +}; + +/// This is an internal structure. +struct b2Position +{ + b2Vec2 c; + float32 a; +}; + +/// This is an internal structure. +struct b2Velocity +{ + b2Vec2 v; + float32 w; +}; + +/// Solver Data +struct b2SolverData +{ + b2TimeStep step; + b2Position* positions; + b2Velocity* velocities; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2World.cpp b/jni/love/src/libraries/Box2D/Dynamics/b2World.cpp new file mode 100755 index 00000000..a3a6a1e4 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2World.cpp @@ -0,0 +1,1339 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +b2World::b2World(const b2Vec2& gravity) +{ + m_destructionListener = NULL; + m_debugDraw = NULL; + + m_bodyList = NULL; + m_jointList = NULL; + + m_bodyCount = 0; + m_jointCount = 0; + + m_warmStarting = true; + m_continuousPhysics = true; + m_subStepping = false; + + m_stepComplete = true; + + m_allowSleep = true; + m_gravity = gravity; + + m_flags = e_clearForces; + + m_inv_dt0 = 0.0f; + + m_contactManager.m_allocator = &m_blockAllocator; + + memset(&m_profile, 0, sizeof(b2Profile)); +} + +b2World::~b2World() +{ + // Some shapes allocate using b2Alloc. + b2Body* b = m_bodyList; + while (b) + { + b2Body* bNext = b->m_next; + + b2Fixture* f = b->m_fixtureList; + while (f) + { + b2Fixture* fNext = f->m_next; + f->m_proxyCount = 0; + f->Destroy(&m_blockAllocator); + f = fNext; + } + + b = bNext; + } +} + +void b2World::SetDestructionListener(b2DestructionListener* listener) +{ + m_destructionListener = listener; +} + +void b2World::SetContactFilter(b2ContactFilter* filter) +{ + m_contactManager.m_contactFilter = filter; +} + +void b2World::SetContactListener(b2ContactListener* listener) +{ + m_contactManager.m_contactListener = listener; +} + +void b2World::SetDebugDraw(b2Draw* debugDraw) +{ + m_debugDraw = debugDraw; +} + +b2Body* b2World::CreateBody(const b2BodyDef* def) +{ + b2Assert(IsLocked() == false); + if (IsLocked()) + { + return NULL; + } + + void* mem = m_blockAllocator.Allocate(sizeof(b2Body)); + b2Body* b = new (mem) b2Body(def, this); + + // Add to world doubly linked list. + b->m_prev = NULL; + b->m_next = m_bodyList; + if (m_bodyList) + { + m_bodyList->m_prev = b; + } + m_bodyList = b; + ++m_bodyCount; + + return b; +} + +void b2World::DestroyBody(b2Body* b) +{ + b2Assert(m_bodyCount > 0); + b2Assert(IsLocked() == false); + if (IsLocked()) + { + return; + } + + // Delete the attached joints. + b2JointEdge* je = b->m_jointList; + while (je) + { + b2JointEdge* je0 = je; + je = je->next; + + if (m_destructionListener) + { + m_destructionListener->SayGoodbye(je0->joint); + } + + DestroyJoint(je0->joint); + + b->m_jointList = je; + } + b->m_jointList = NULL; + + // Delete the attached contacts. + b2ContactEdge* ce = b->m_contactList; + while (ce) + { + b2ContactEdge* ce0 = ce; + ce = ce->next; + m_contactManager.Destroy(ce0->contact); + } + b->m_contactList = NULL; + + // Delete the attached fixtures. This destroys broad-phase proxies. + b2Fixture* f = b->m_fixtureList; + while (f) + { + b2Fixture* f0 = f; + f = f->m_next; + + if (m_destructionListener) + { + m_destructionListener->SayGoodbye(f0); + } + + f0->DestroyProxies(&m_contactManager.m_broadPhase); + f0->Destroy(&m_blockAllocator); + f0->~b2Fixture(); + m_blockAllocator.Free(f0, sizeof(b2Fixture)); + + b->m_fixtureList = f; + b->m_fixtureCount -= 1; + } + b->m_fixtureList = NULL; + b->m_fixtureCount = 0; + + // Remove world body list. + if (b->m_prev) + { + b->m_prev->m_next = b->m_next; + } + + if (b->m_next) + { + b->m_next->m_prev = b->m_prev; + } + + if (b == m_bodyList) + { + m_bodyList = b->m_next; + } + + --m_bodyCount; + b->~b2Body(); + m_blockAllocator.Free(b, sizeof(b2Body)); +} + +b2Joint* b2World::CreateJoint(const b2JointDef* def) +{ + b2Assert(IsLocked() == false); + if (IsLocked()) + { + return NULL; + } + + b2Joint* j = b2Joint::Create(def, &m_blockAllocator); + + // Connect to the world list. + j->m_prev = NULL; + j->m_next = m_jointList; + if (m_jointList) + { + m_jointList->m_prev = j; + } + m_jointList = j; + ++m_jointCount; + + // Connect to the bodies' doubly linked lists. + j->m_edgeA.joint = j; + j->m_edgeA.other = j->m_bodyB; + j->m_edgeA.prev = NULL; + j->m_edgeA.next = j->m_bodyA->m_jointList; + if (j->m_bodyA->m_jointList) j->m_bodyA->m_jointList->prev = &j->m_edgeA; + j->m_bodyA->m_jointList = &j->m_edgeA; + + j->m_edgeB.joint = j; + j->m_edgeB.other = j->m_bodyA; + j->m_edgeB.prev = NULL; + j->m_edgeB.next = j->m_bodyB->m_jointList; + if (j->m_bodyB->m_jointList) j->m_bodyB->m_jointList->prev = &j->m_edgeB; + j->m_bodyB->m_jointList = &j->m_edgeB; + + b2Body* bodyA = def->bodyA; + b2Body* bodyB = def->bodyB; + + // If the joint prevents collisions, then flag any contacts for filtering. + if (def->collideConnected == false) + { + b2ContactEdge* edge = bodyB->GetContactList(); + while (edge) + { + if (edge->other == bodyA) + { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge->contact->FlagForFiltering(); + } + + edge = edge->next; + } + } + + // Note: creating a joint doesn't wake the bodies. + + return j; +} + +void b2World::DestroyJoint(b2Joint* j) +{ + b2Assert(IsLocked() == false); + if (IsLocked()) + { + return; + } + + bool collideConnected = j->m_collideConnected; + + // Remove from the doubly linked list. + if (j->m_prev) + { + j->m_prev->m_next = j->m_next; + } + + if (j->m_next) + { + j->m_next->m_prev = j->m_prev; + } + + if (j == m_jointList) + { + m_jointList = j->m_next; + } + + // Disconnect from island graph. + b2Body* bodyA = j->m_bodyA; + b2Body* bodyB = j->m_bodyB; + + // Wake up connected bodies. + bodyA->SetAwake(true); + bodyB->SetAwake(true); + + // Remove from body 1. + if (j->m_edgeA.prev) + { + j->m_edgeA.prev->next = j->m_edgeA.next; + } + + if (j->m_edgeA.next) + { + j->m_edgeA.next->prev = j->m_edgeA.prev; + } + + if (&j->m_edgeA == bodyA->m_jointList) + { + bodyA->m_jointList = j->m_edgeA.next; + } + + j->m_edgeA.prev = NULL; + j->m_edgeA.next = NULL; + + // Remove from body 2 + if (j->m_edgeB.prev) + { + j->m_edgeB.prev->next = j->m_edgeB.next; + } + + if (j->m_edgeB.next) + { + j->m_edgeB.next->prev = j->m_edgeB.prev; + } + + if (&j->m_edgeB == bodyB->m_jointList) + { + bodyB->m_jointList = j->m_edgeB.next; + } + + j->m_edgeB.prev = NULL; + j->m_edgeB.next = NULL; + + b2Joint::Destroy(j, &m_blockAllocator); + + b2Assert(m_jointCount > 0); + --m_jointCount; + + // If the joint prevents collisions, then flag any contacts for filtering. + if (collideConnected == false) + { + b2ContactEdge* edge = bodyB->GetContactList(); + while (edge) + { + if (edge->other == bodyA) + { + // Flag the contact for filtering at the next time step (where either + // body is awake). + edge->contact->FlagForFiltering(); + } + + edge = edge->next; + } + } +} + +// +void b2World::SetAllowSleeping(bool flag) +{ + if (flag == m_allowSleep) + { + return; + } + + m_allowSleep = flag; + if (m_allowSleep == false) + { + for (b2Body* b = m_bodyList; b; b = b->m_next) + { + b->SetAwake(true); + } + } +} + +// Find islands, integrate and solve constraints, solve position constraints +void b2World::Solve(const b2TimeStep& step) +{ + m_profile.solveInit = 0.0f; + m_profile.solveVelocity = 0.0f; + m_profile.solvePosition = 0.0f; + + // Size the island for the worst case. + b2Island island(m_bodyCount, + m_contactManager.m_contactCount, + m_jointCount, + &m_stackAllocator, + m_contactManager.m_contactListener); + + // Clear all the island flags. + for (b2Body* b = m_bodyList; b; b = b->m_next) + { + b->m_flags &= ~b2Body::e_islandFlag; + } + for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) + { + c->m_flags &= ~b2Contact::e_islandFlag; + } + for (b2Joint* j = m_jointList; j; j = j->m_next) + { + j->m_islandFlag = false; + } + + // Build and simulate all awake islands. + int32 stackSize = m_bodyCount; + b2Body** stack = (b2Body**)m_stackAllocator.Allocate(stackSize * sizeof(b2Body*)); + for (b2Body* seed = m_bodyList; seed; seed = seed->m_next) + { + if (seed->m_flags & b2Body::e_islandFlag) + { + continue; + } + + if (seed->IsAwake() == false || seed->IsActive() == false) + { + continue; + } + + // The seed can be dynamic or kinematic. + if (seed->GetType() == b2_staticBody) + { + continue; + } + + // Reset island and stack. + island.Clear(); + int32 stackCount = 0; + stack[stackCount++] = seed; + seed->m_flags |= b2Body::e_islandFlag; + + // Perform a depth first search (DFS) on the constraint graph. + while (stackCount > 0) + { + // Grab the next body off the stack and add it to the island. + b2Body* b = stack[--stackCount]; + b2Assert(b->IsActive() == true); + island.Add(b); + + // Make sure the body is awake. + b->SetAwake(true); + + // To keep islands as small as possible, we don't + // propagate islands across static bodies. + if (b->GetType() == b2_staticBody) + { + continue; + } + + // Search all contacts connected to this body. + for (b2ContactEdge* ce = b->m_contactList; ce; ce = ce->next) + { + b2Contact* contact = ce->contact; + + // Has this contact already been added to an island? + if (contact->m_flags & b2Contact::e_islandFlag) + { + continue; + } + + // Is this contact solid and touching? + if (contact->IsEnabled() == false || + contact->IsTouching() == false) + { + continue; + } + + // Skip sensors. + bool sensorA = contact->m_fixtureA->m_isSensor; + bool sensorB = contact->m_fixtureB->m_isSensor; + if (sensorA || sensorB) + { + continue; + } + + island.Add(contact); + contact->m_flags |= b2Contact::e_islandFlag; + + b2Body* other = ce->other; + + // Was the other body already added to this island? + if (other->m_flags & b2Body::e_islandFlag) + { + continue; + } + + b2Assert(stackCount < stackSize); + stack[stackCount++] = other; + other->m_flags |= b2Body::e_islandFlag; + } + + // Search all joints connect to this body. + for (b2JointEdge* je = b->m_jointList; je; je = je->next) + { + if (je->joint->m_islandFlag == true) + { + continue; + } + + b2Body* other = je->other; + + // Don't simulate joints connected to inactive bodies. + if (other->IsActive() == false) + { + continue; + } + + island.Add(je->joint); + je->joint->m_islandFlag = true; + + if (other->m_flags & b2Body::e_islandFlag) + { + continue; + } + + b2Assert(stackCount < stackSize); + stack[stackCount++] = other; + other->m_flags |= b2Body::e_islandFlag; + } + } + + b2Profile profile; + island.Solve(&profile, step, m_gravity, m_allowSleep); + m_profile.solveInit += profile.solveInit; + m_profile.solveVelocity += profile.solveVelocity; + m_profile.solvePosition += profile.solvePosition; + + // Post solve cleanup. + for (int32 i = 0; i < island.m_bodyCount; ++i) + { + // Allow static bodies to participate in other islands. + b2Body* b = island.m_bodies[i]; + if (b->GetType() == b2_staticBody) + { + b->m_flags &= ~b2Body::e_islandFlag; + } + } + } + + m_stackAllocator.Free(stack); + + { + b2Timer timer; + // Synchronize fixtures, check for out of range bodies. + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + // If a body was not in an island then it did not move. + if ((b->m_flags & b2Body::e_islandFlag) == 0) + { + continue; + } + + if (b->GetType() == b2_staticBody) + { + continue; + } + + // Update fixtures (for broad-phase). + b->SynchronizeFixtures(); + } + + // Look for new contacts. + m_contactManager.FindNewContacts(); + m_profile.broadphase = timer.GetMilliseconds(); + } +} + +// Find TOI contacts and solve them. +void b2World::SolveTOI(const b2TimeStep& step) +{ + b2Island island(2 * b2_maxTOIContacts, b2_maxTOIContacts, 0, &m_stackAllocator, m_contactManager.m_contactListener); + + if (m_stepComplete) + { + for (b2Body* b = m_bodyList; b; b = b->m_next) + { + b->m_flags &= ~b2Body::e_islandFlag; + b->m_sweep.alpha0 = 0.0f; + } + + for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) + { + // Invalidate TOI + c->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag); + c->m_toiCount = 0; + c->m_toi = 1.0f; + } + } + + // Find TOI events and solve them. + for (;;) + { + // Find the first TOI. + b2Contact* minContact = NULL; + float32 minAlpha = 1.0f; + + for (b2Contact* c = m_contactManager.m_contactList; c; c = c->m_next) + { + // Is this contact disabled? + if (c->IsEnabled() == false) + { + continue; + } + + // Prevent excessive sub-stepping. + if (c->m_toiCount > b2_maxSubSteps) + { + continue; + } + + float32 alpha = 1.0f; + if (c->m_flags & b2Contact::e_toiFlag) + { + // This contact has a valid cached TOI. + alpha = c->m_toi; + } + else + { + b2Fixture* fA = c->GetFixtureA(); + b2Fixture* fB = c->GetFixtureB(); + + // Is there a sensor? + if (fA->IsSensor() || fB->IsSensor()) + { + continue; + } + + b2Body* bA = fA->GetBody(); + b2Body* bB = fB->GetBody(); + + b2BodyType typeA = bA->m_type; + b2BodyType typeB = bB->m_type; + b2Assert(typeA == b2_dynamicBody || typeB == b2_dynamicBody); + + bool activeA = bA->IsAwake() && typeA != b2_staticBody; + bool activeB = bB->IsAwake() && typeB != b2_staticBody; + + // Is at least one body active (awake and dynamic or kinematic)? + if (activeA == false && activeB == false) + { + continue; + } + + bool collideA = bA->IsBullet() || typeA != b2_dynamicBody; + bool collideB = bB->IsBullet() || typeB != b2_dynamicBody; + + // Are these two non-bullet dynamic bodies? + if (collideA == false && collideB == false) + { + continue; + } + + // Compute the TOI for this contact. + // Put the sweeps onto the same time interval. + float32 alpha0 = bA->m_sweep.alpha0; + + if (bA->m_sweep.alpha0 < bB->m_sweep.alpha0) + { + alpha0 = bB->m_sweep.alpha0; + bA->m_sweep.Advance(alpha0); + } + else if (bB->m_sweep.alpha0 < bA->m_sweep.alpha0) + { + alpha0 = bA->m_sweep.alpha0; + bB->m_sweep.Advance(alpha0); + } + + b2Assert(alpha0 < 1.0f); + + int32 indexA = c->GetChildIndexA(); + int32 indexB = c->GetChildIndexB(); + + // Compute the time of impact in interval [0, minTOI] + b2TOIInput input; + input.proxyA.Set(fA->GetShape(), indexA); + input.proxyB.Set(fB->GetShape(), indexB); + input.sweepA = bA->m_sweep; + input.sweepB = bB->m_sweep; + input.tMax = 1.0f; + + b2TOIOutput output; + b2TimeOfImpact(&output, &input); + + // Beta is the fraction of the remaining portion of the . + float32 beta = output.t; + if (output.state == b2TOIOutput::e_touching) + { + alpha = b2Min(alpha0 + (1.0f - alpha0) * beta, 1.0f); + } + else + { + alpha = 1.0f; + } + + c->m_toi = alpha; + c->m_flags |= b2Contact::e_toiFlag; + } + + if (alpha < minAlpha) + { + // This is the minimum TOI found so far. + minContact = c; + minAlpha = alpha; + } + } + + if (minContact == NULL || 1.0f - 10.0f * b2_epsilon < minAlpha) + { + // No more TOI events. Done! + m_stepComplete = true; + break; + } + + // Advance the bodies to the TOI. + b2Fixture* fA = minContact->GetFixtureA(); + b2Fixture* fB = minContact->GetFixtureB(); + b2Body* bA = fA->GetBody(); + b2Body* bB = fB->GetBody(); + + b2Sweep backup1 = bA->m_sweep; + b2Sweep backup2 = bB->m_sweep; + + bA->Advance(minAlpha); + bB->Advance(minAlpha); + + // The TOI contact likely has some new contact points. + minContact->Update(m_contactManager.m_contactListener); + minContact->m_flags &= ~b2Contact::e_toiFlag; + ++minContact->m_toiCount; + + // Is the contact solid? + if (minContact->IsEnabled() == false || minContact->IsTouching() == false) + { + // Restore the sweeps. + minContact->SetEnabled(false); + bA->m_sweep = backup1; + bB->m_sweep = backup2; + bA->SynchronizeTransform(); + bB->SynchronizeTransform(); + continue; + } + + bA->SetAwake(true); + bB->SetAwake(true); + + // Build the island + island.Clear(); + island.Add(bA); + island.Add(bB); + island.Add(minContact); + + bA->m_flags |= b2Body::e_islandFlag; + bB->m_flags |= b2Body::e_islandFlag; + minContact->m_flags |= b2Contact::e_islandFlag; + + // Get contacts on bodyA and bodyB. + b2Body* bodies[2] = {bA, bB}; + for (int32 i = 0; i < 2; ++i) + { + b2Body* body = bodies[i]; + if (body->m_type == b2_dynamicBody) + { + for (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next) + { + if (island.m_bodyCount == island.m_bodyCapacity) + { + break; + } + + if (island.m_contactCount == island.m_contactCapacity) + { + break; + } + + b2Contact* contact = ce->contact; + + // Has this contact already been added to the island? + if (contact->m_flags & b2Contact::e_islandFlag) + { + continue; + } + + // Only add static, kinematic, or bullet bodies. + b2Body* other = ce->other; + if (other->m_type == b2_dynamicBody && + body->IsBullet() == false && other->IsBullet() == false) + { + continue; + } + + // Skip sensors. + bool sensorA = contact->m_fixtureA->m_isSensor; + bool sensorB = contact->m_fixtureB->m_isSensor; + if (sensorA || sensorB) + { + continue; + } + + // Tentatively advance the body to the TOI. + b2Sweep backup = other->m_sweep; + if ((other->m_flags & b2Body::e_islandFlag) == 0) + { + other->Advance(minAlpha); + } + + // Update the contact points + contact->Update(m_contactManager.m_contactListener); + + // Was the contact disabled by the user? + if (contact->IsEnabled() == false) + { + other->m_sweep = backup; + other->SynchronizeTransform(); + continue; + } + + // Are there contact points? + if (contact->IsTouching() == false) + { + other->m_sweep = backup; + other->SynchronizeTransform(); + continue; + } + + // Add the contact to the island + contact->m_flags |= b2Contact::e_islandFlag; + island.Add(contact); + + // Has the other body already been added to the island? + if (other->m_flags & b2Body::e_islandFlag) + { + continue; + } + + // Add the other body to the island. + other->m_flags |= b2Body::e_islandFlag; + + if (other->m_type != b2_staticBody) + { + other->SetAwake(true); + } + + island.Add(other); + } + } + } + + b2TimeStep subStep; + subStep.dt = (1.0f - minAlpha) * step.dt; + subStep.inv_dt = 1.0f / subStep.dt; + subStep.dtRatio = 1.0f; + subStep.positionIterations = 20; + subStep.velocityIterations = step.velocityIterations; + subStep.warmStarting = false; + island.SolveTOI(subStep, bA->m_islandIndex, bB->m_islandIndex); + + // Reset island flags and synchronize broad-phase proxies. + for (int32 i = 0; i < island.m_bodyCount; ++i) + { + b2Body* body = island.m_bodies[i]; + body->m_flags &= ~b2Body::e_islandFlag; + + if (body->m_type != b2_dynamicBody) + { + continue; + } + + body->SynchronizeFixtures(); + + // Invalidate all contact TOIs on this displaced body. + for (b2ContactEdge* ce = body->m_contactList; ce; ce = ce->next) + { + ce->contact->m_flags &= ~(b2Contact::e_toiFlag | b2Contact::e_islandFlag); + } + } + + // Commit fixture proxy movements to the broad-phase so that new contacts are created. + // Also, some contacts can be destroyed. + m_contactManager.FindNewContacts(); + + if (m_subStepping) + { + m_stepComplete = false; + break; + } + } +} + +void b2World::Step(float32 dt, int32 velocityIterations, int32 positionIterations) +{ + b2Timer stepTimer; + + // If new fixtures were added, we need to find the new contacts. + if (m_flags & e_newFixture) + { + m_contactManager.FindNewContacts(); + m_flags &= ~e_newFixture; + } + + m_flags |= e_locked; + + b2TimeStep step; + step.dt = dt; + step.velocityIterations = velocityIterations; + step.positionIterations = positionIterations; + if (dt > 0.0f) + { + step.inv_dt = 1.0f / dt; + } + else + { + step.inv_dt = 0.0f; + } + + step.dtRatio = m_inv_dt0 * dt; + + step.warmStarting = m_warmStarting; + + // Update contacts. This is where some contacts are destroyed. + { + b2Timer timer; + m_contactManager.Collide(); + m_profile.collide = timer.GetMilliseconds(); + } + + // Integrate velocities, solve velocity constraints, and integrate positions. + if (m_stepComplete && step.dt > 0.0f) + { + b2Timer timer; + Solve(step); + m_profile.solve = timer.GetMilliseconds(); + } + + // Handle TOI events. + if (m_continuousPhysics && step.dt > 0.0f) + { + b2Timer timer; + SolveTOI(step); + m_profile.solveTOI = timer.GetMilliseconds(); + } + + if (step.dt > 0.0f) + { + m_inv_dt0 = step.inv_dt; + } + + if (m_flags & e_clearForces) + { + ClearForces(); + } + + m_flags &= ~e_locked; + + m_profile.step = stepTimer.GetMilliseconds(); +} + +void b2World::ClearForces() +{ + for (b2Body* body = m_bodyList; body; body = body->GetNext()) + { + body->m_force.SetZero(); + body->m_torque = 0.0f; + } +} + +struct b2WorldQueryWrapper +{ + bool QueryCallback(int32 proxyId) + { + b2FixtureProxy* proxy = (b2FixtureProxy*)broadPhase->GetUserData(proxyId); + return callback->ReportFixture(proxy->fixture); + } + + const b2BroadPhase* broadPhase; + b2QueryCallback* callback; +}; + +void b2World::QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const +{ + b2WorldQueryWrapper wrapper; + wrapper.broadPhase = &m_contactManager.m_broadPhase; + wrapper.callback = callback; + m_contactManager.m_broadPhase.Query(&wrapper, aabb); +} + +struct b2WorldRayCastWrapper +{ + float32 RayCastCallback(const b2RayCastInput& input, int32 proxyId) + { + void* userData = broadPhase->GetUserData(proxyId); + b2FixtureProxy* proxy = (b2FixtureProxy*)userData; + b2Fixture* fixture = proxy->fixture; + int32 index = proxy->childIndex; + b2RayCastOutput output; + bool hit = fixture->RayCast(&output, input, index); + + if (hit) + { + float32 fraction = output.fraction; + b2Vec2 point = (1.0f - fraction) * input.p1 + fraction * input.p2; + return callback->ReportFixture(fixture, point, output.normal, fraction); + } + + return input.maxFraction; + } + + const b2BroadPhase* broadPhase; + b2RayCastCallback* callback; +}; + +void b2World::RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const +{ + b2WorldRayCastWrapper wrapper; + wrapper.broadPhase = &m_contactManager.m_broadPhase; + wrapper.callback = callback; + b2RayCastInput input; + input.maxFraction = 1.0f; + input.p1 = point1; + input.p2 = point2; + m_contactManager.m_broadPhase.RayCast(&wrapper, input); +} + +void b2World::DrawShape(b2Fixture* fixture, const b2Transform& xf, const b2Color& color) +{ + switch (fixture->GetType()) + { + case b2Shape::e_circle: + { + b2CircleShape* circle = (b2CircleShape*)fixture->GetShape(); + + b2Vec2 center = b2Mul(xf, circle->m_p); + float32 radius = circle->m_radius; + b2Vec2 axis = b2Mul(xf.q, b2Vec2(1.0f, 0.0f)); + + m_debugDraw->DrawSolidCircle(center, radius, axis, color); + } + break; + + case b2Shape::e_edge: + { + b2EdgeShape* edge = (b2EdgeShape*)fixture->GetShape(); + b2Vec2 v1 = b2Mul(xf, edge->m_vertex1); + b2Vec2 v2 = b2Mul(xf, edge->m_vertex2); + m_debugDraw->DrawSegment(v1, v2, color); + } + break; + + case b2Shape::e_chain: + { + b2ChainShape* chain = (b2ChainShape*)fixture->GetShape(); + int32 count = chain->m_count; + const b2Vec2* vertices = chain->m_vertices; + + b2Vec2 v1 = b2Mul(xf, vertices[0]); + for (int32 i = 1; i < count; ++i) + { + b2Vec2 v2 = b2Mul(xf, vertices[i]); + m_debugDraw->DrawSegment(v1, v2, color); + m_debugDraw->DrawCircle(v1, 0.05f, color); + v1 = v2; + } + } + break; + + case b2Shape::e_polygon: + { + b2PolygonShape* poly = (b2PolygonShape*)fixture->GetShape(); + int32 vertexCount = poly->m_count; + b2Assert(vertexCount <= b2_maxPolygonVertices); + b2Vec2 vertices[b2_maxPolygonVertices]; + + for (int32 i = 0; i < vertexCount; ++i) + { + vertices[i] = b2Mul(xf, poly->m_vertices[i]); + } + + m_debugDraw->DrawSolidPolygon(vertices, vertexCount, color); + } + break; + + default: + break; + } +} + +void b2World::DrawJoint(b2Joint* joint) +{ + b2Body* bodyA = joint->GetBodyA(); + b2Body* bodyB = joint->GetBodyB(); + const b2Transform& xf1 = bodyA->GetTransform(); + const b2Transform& xf2 = bodyB->GetTransform(); + b2Vec2 x1 = xf1.p; + b2Vec2 x2 = xf2.p; + b2Vec2 p1 = joint->GetAnchorA(); + b2Vec2 p2 = joint->GetAnchorB(); + + b2Color color(0.5f, 0.8f, 0.8f); + + switch (joint->GetType()) + { + case e_distanceJoint: + m_debugDraw->DrawSegment(p1, p2, color); + break; + + case e_pulleyJoint: + { + b2PulleyJoint* pulley = (b2PulleyJoint*)joint; + b2Vec2 s1 = pulley->GetGroundAnchorA(); + b2Vec2 s2 = pulley->GetGroundAnchorB(); + m_debugDraw->DrawSegment(s1, p1, color); + m_debugDraw->DrawSegment(s2, p2, color); + m_debugDraw->DrawSegment(s1, s2, color); + } + break; + + case e_mouseJoint: + // don't draw this + break; + + default: + m_debugDraw->DrawSegment(x1, p1, color); + m_debugDraw->DrawSegment(p1, p2, color); + m_debugDraw->DrawSegment(x2, p2, color); + } +} + +void b2World::DrawDebugData() +{ + if (m_debugDraw == NULL) + { + return; + } + + uint32 flags = m_debugDraw->GetFlags(); + + if (flags & b2Draw::e_shapeBit) + { + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + const b2Transform& xf = b->GetTransform(); + for (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext()) + { + if (b->IsActive() == false) + { + DrawShape(f, xf, b2Color(0.5f, 0.5f, 0.3f)); + } + else if (b->GetType() == b2_staticBody) + { + DrawShape(f, xf, b2Color(0.5f, 0.9f, 0.5f)); + } + else if (b->GetType() == b2_kinematicBody) + { + DrawShape(f, xf, b2Color(0.5f, 0.5f, 0.9f)); + } + else if (b->IsAwake() == false) + { + DrawShape(f, xf, b2Color(0.6f, 0.6f, 0.6f)); + } + else + { + DrawShape(f, xf, b2Color(0.9f, 0.7f, 0.7f)); + } + } + } + } + + if (flags & b2Draw::e_jointBit) + { + for (b2Joint* j = m_jointList; j; j = j->GetNext()) + { + DrawJoint(j); + } + } + + if (flags & b2Draw::e_pairBit) + { + b2Color color(0.3f, 0.9f, 0.9f); + for (b2Contact* c = m_contactManager.m_contactList; c; c = c->GetNext()) + { + //b2Fixture* fixtureA = c->GetFixtureA(); + //b2Fixture* fixtureB = c->GetFixtureB(); + + //b2Vec2 cA = fixtureA->GetAABB().GetCenter(); + //b2Vec2 cB = fixtureB->GetAABB().GetCenter(); + + //m_debugDraw->DrawSegment(cA, cB, color); + } + } + + if (flags & b2Draw::e_aabbBit) + { + b2Color color(0.9f, 0.3f, 0.9f); + b2BroadPhase* bp = &m_contactManager.m_broadPhase; + + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + if (b->IsActive() == false) + { + continue; + } + + for (b2Fixture* f = b->GetFixtureList(); f; f = f->GetNext()) + { + for (int32 i = 0; i < f->m_proxyCount; ++i) + { + b2FixtureProxy* proxy = f->m_proxies + i; + b2AABB aabb = bp->GetFatAABB(proxy->proxyId); + b2Vec2 vs[4]; + vs[0].Set(aabb.lowerBound.x, aabb.lowerBound.y); + vs[1].Set(aabb.upperBound.x, aabb.lowerBound.y); + vs[2].Set(aabb.upperBound.x, aabb.upperBound.y); + vs[3].Set(aabb.lowerBound.x, aabb.upperBound.y); + + m_debugDraw->DrawPolygon(vs, 4, color); + } + } + } + } + + if (flags & b2Draw::e_centerOfMassBit) + { + for (b2Body* b = m_bodyList; b; b = b->GetNext()) + { + b2Transform xf = b->GetTransform(); + xf.p = b->GetWorldCenter(); + m_debugDraw->DrawTransform(xf); + } + } +} + +int32 b2World::GetProxyCount() const +{ + return m_contactManager.m_broadPhase.GetProxyCount(); +} + +int32 b2World::GetTreeHeight() const +{ + return m_contactManager.m_broadPhase.GetTreeHeight(); +} + +int32 b2World::GetTreeBalance() const +{ + return m_contactManager.m_broadPhase.GetTreeBalance(); +} + +float32 b2World::GetTreeQuality() const +{ + return m_contactManager.m_broadPhase.GetTreeQuality(); +} + +void b2World::ShiftOrigin(const b2Vec2& newOrigin) +{ + b2Assert((m_flags & e_locked) == 0); + if ((m_flags & e_locked) == e_locked) + { + return; + } + + for (b2Body* b = m_bodyList; b; b = b->m_next) + { + b->m_xf.p -= newOrigin; + b->m_sweep.c0 -= newOrigin; + b->m_sweep.c -= newOrigin; + } + + for (b2Joint* j = m_jointList; j; j = j->m_next) + { + j->ShiftOrigin(newOrigin); + } + + m_contactManager.m_broadPhase.ShiftOrigin(newOrigin); +} + +void b2World::Dump() +{ + if ((m_flags & e_locked) == e_locked) + { + return; + } + + b2Log("b2Vec2 g(%.15lef, %.15lef);\n", m_gravity.x, m_gravity.y); + b2Log("m_world->SetGravity(g);\n"); + + b2Log("b2Body** bodies = (b2Body**)b2Alloc(%d * sizeof(b2Body*));\n", m_bodyCount); + b2Log("b2Joint** joints = (b2Joint**)b2Alloc(%d * sizeof(b2Joint*));\n", m_jointCount); + int32 i = 0; + for (b2Body* b = m_bodyList; b; b = b->m_next) + { + b->m_islandIndex = i; + b->Dump(); + ++i; + } + + i = 0; + for (b2Joint* j = m_jointList; j; j = j->m_next) + { + j->m_index = i; + ++i; + } + + // First pass on joints, skip gear joints. + for (b2Joint* j = m_jointList; j; j = j->m_next) + { + if (j->m_type == e_gearJoint) + { + continue; + } + + b2Log("{\n"); + j->Dump(); + b2Log("}\n"); + } + + // Second pass on joints, only gear joints. + for (b2Joint* j = m_jointList; j; j = j->m_next) + { + if (j->m_type != e_gearJoint) + { + continue; + } + + b2Log("{\n"); + j->Dump(); + b2Log("}\n"); + } + + b2Log("b2Free(joints);\n"); + b2Log("b2Free(bodies);\n"); + b2Log("joints = NULL;\n"); + b2Log("bodies = NULL;\n"); +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2World.h b/jni/love/src/libraries/Box2D/Dynamics/b2World.h new file mode 100755 index 00000000..4f94f6ef --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2World.h @@ -0,0 +1,354 @@ +/* +* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org +* +* 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 B2_WORLD_H +#define B2_WORLD_H + +#include +#include +#include +#include +#include +#include + +struct b2AABB; +struct b2BodyDef; +struct b2Color; +struct b2JointDef; +class b2Body; +class b2Draw; +class b2Fixture; +class b2Joint; + +/// The world class manages all physics entities, dynamic simulation, +/// and asynchronous queries. The world also contains efficient memory +/// management facilities. +class b2World +{ +public: + /// Construct a world object. + /// @param gravity the world gravity vector. + b2World(const b2Vec2& gravity); + + /// Destruct the world. All physics entities are destroyed and all heap memory is released. + ~b2World(); + + /// Register a destruction listener. The listener is owned by you and must + /// remain in scope. + void SetDestructionListener(b2DestructionListener* listener); + + /// Register a contact filter to provide specific control over collision. + /// Otherwise the default filter is used (b2_defaultFilter). The listener is + /// owned by you and must remain in scope. + void SetContactFilter(b2ContactFilter* filter); + + /// Register a contact event listener. The listener is owned by you and must + /// remain in scope. + void SetContactListener(b2ContactListener* listener); + + /// Register a routine for debug drawing. The debug draw functions are called + /// inside with b2World::DrawDebugData method. The debug draw object is owned + /// by you and must remain in scope. + void SetDebugDraw(b2Draw* debugDraw); + + /// Create a rigid body given a definition. No reference to the definition + /// is retained. + /// @warning This function is locked during callbacks. + b2Body* CreateBody(const b2BodyDef* def); + + /// Destroy a rigid body given a definition. No reference to the definition + /// is retained. This function is locked during callbacks. + /// @warning This automatically deletes all associated shapes and joints. + /// @warning This function is locked during callbacks. + void DestroyBody(b2Body* body); + + /// Create a joint to constrain bodies together. No reference to the definition + /// is retained. This may cause the connected bodies to cease colliding. + /// @warning This function is locked during callbacks. + b2Joint* CreateJoint(const b2JointDef* def); + + /// Destroy a joint. This may cause the connected bodies to begin colliding. + /// @warning This function is locked during callbacks. + void DestroyJoint(b2Joint* joint); + + /// Take a time step. This performs collision detection, integration, + /// and constraint solution. + /// @param timeStep the amount of time to simulate, this should not vary. + /// @param velocityIterations for the velocity constraint solver. + /// @param positionIterations for the position constraint solver. + void Step( float32 timeStep, + int32 velocityIterations, + int32 positionIterations); + + /// Manually clear the force buffer on all bodies. By default, forces are cleared automatically + /// after each call to Step. The default behavior is modified by calling SetAutoClearForces. + /// The purpose of this function is to support sub-stepping. Sub-stepping is often used to maintain + /// a fixed sized time step under a variable frame-rate. + /// When you perform sub-stepping you will disable auto clearing of forces and instead call + /// ClearForces after all sub-steps are complete in one pass of your game loop. + /// @see SetAutoClearForces + void ClearForces(); + + /// Call this to draw shapes and other debug draw data. This is intentionally non-const. + void DrawDebugData(); + + /// Query the world for all fixtures that potentially overlap the + /// provided AABB. + /// @param callback a user implemented callback class. + /// @param aabb the query box. + void QueryAABB(b2QueryCallback* callback, const b2AABB& aabb) const; + + /// Ray-cast the world for all fixtures in the path of the ray. Your callback + /// controls whether you get the closest point, any point, or n-points. + /// The ray-cast ignores shapes that contain the starting point. + /// @param callback a user implemented callback class. + /// @param point1 the ray starting point + /// @param point2 the ray ending point + void RayCast(b2RayCastCallback* callback, const b2Vec2& point1, const b2Vec2& point2) const; + + /// Get the world body list. With the returned body, use b2Body::GetNext to get + /// the next body in the world list. A NULL body indicates the end of the list. + /// @return the head of the world body list. + b2Body* GetBodyList(); + const b2Body* GetBodyList() const; + + /// Get the world joint list. With the returned joint, use b2Joint::GetNext to get + /// the next joint in the world list. A NULL joint indicates the end of the list. + /// @return the head of the world joint list. + b2Joint* GetJointList(); + const b2Joint* GetJointList() const; + + /// Get the world contact list. With the returned contact, use b2Contact::GetNext to get + /// the next contact in the world list. A NULL contact indicates the end of the list. + /// @return the head of the world contact list. + /// @warning contacts are created and destroyed in the middle of a time step. + /// Use b2ContactListener to avoid missing contacts. + b2Contact* GetContactList(); + const b2Contact* GetContactList() const; + + /// Enable/disable sleep. + void SetAllowSleeping(bool flag); + bool GetAllowSleeping() const { return m_allowSleep; } + + /// Enable/disable warm starting. For testing. + void SetWarmStarting(bool flag) { m_warmStarting = flag; } + bool GetWarmStarting() const { return m_warmStarting; } + + /// Enable/disable continuous physics. For testing. + void SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; } + bool GetContinuousPhysics() const { return m_continuousPhysics; } + + /// Enable/disable single stepped continuous physics. For testing. + void SetSubStepping(bool flag) { m_subStepping = flag; } + bool GetSubStepping() const { return m_subStepping; } + + /// Get the number of broad-phase proxies. + int32 GetProxyCount() const; + + /// Get the number of bodies. + int32 GetBodyCount() const; + + /// Get the number of joints. + int32 GetJointCount() const; + + /// Get the number of contacts (each may have 0 or more contact points). + int32 GetContactCount() const; + + /// Get the height of the dynamic tree. + int32 GetTreeHeight() const; + + /// Get the balance of the dynamic tree. + int32 GetTreeBalance() const; + + /// Get the quality metric of the dynamic tree. The smaller the better. + /// The minimum is 1. + float32 GetTreeQuality() const; + + /// Change the global gravity vector. + void SetGravity(const b2Vec2& gravity); + + /// Get the global gravity vector. + b2Vec2 GetGravity() const; + + /// Is the world locked (in the middle of a time step). + bool IsLocked() const; + + /// Set flag to control automatic clearing of forces after each time step. + void SetAutoClearForces(bool flag); + + /// Get the flag that controls automatic clearing of forces after each time step. + bool GetAutoClearForces() const; + + /// Shift the world origin. Useful for large worlds. + /// The body shift formula is: position -= newOrigin + /// @param newOrigin the new origin with respect to the old origin + void ShiftOrigin(const b2Vec2& newOrigin); + + /// Get the contact manager for testing. + const b2ContactManager& GetContactManager() const; + + /// Get the current profile. + const b2Profile& GetProfile() const; + + /// Dump the world into the log file. + /// @warning this should be called outside of a time step. + void Dump(); + +private: + + // m_flags + enum + { + e_newFixture = 0x0001, + e_locked = 0x0002, + e_clearForces = 0x0004 + }; + + friend class b2Body; + friend class b2Fixture; + friend class b2ContactManager; + friend class b2Controller; + + void Solve(const b2TimeStep& step); + void SolveTOI(const b2TimeStep& step); + + void DrawJoint(b2Joint* joint); + void DrawShape(b2Fixture* shape, const b2Transform& xf, const b2Color& color); + + b2BlockAllocator m_blockAllocator; + b2StackAllocator m_stackAllocator; + + int32 m_flags; + + b2ContactManager m_contactManager; + + b2Body* m_bodyList; + b2Joint* m_jointList; + + int32 m_bodyCount; + int32 m_jointCount; + + b2Vec2 m_gravity; + bool m_allowSleep; + + b2DestructionListener* m_destructionListener; + b2Draw* m_debugDraw; + + // This is used to compute the time step ratio to + // support a variable time step. + float32 m_inv_dt0; + + // These are for debugging the solver. + bool m_warmStarting; + bool m_continuousPhysics; + bool m_subStepping; + + bool m_stepComplete; + + b2Profile m_profile; +}; + +inline b2Body* b2World::GetBodyList() +{ + return m_bodyList; +} + +inline const b2Body* b2World::GetBodyList() const +{ + return m_bodyList; +} + +inline b2Joint* b2World::GetJointList() +{ + return m_jointList; +} + +inline const b2Joint* b2World::GetJointList() const +{ + return m_jointList; +} + +inline b2Contact* b2World::GetContactList() +{ + return m_contactManager.m_contactList; +} + +inline const b2Contact* b2World::GetContactList() const +{ + return m_contactManager.m_contactList; +} + +inline int32 b2World::GetBodyCount() const +{ + return m_bodyCount; +} + +inline int32 b2World::GetJointCount() const +{ + return m_jointCount; +} + +inline int32 b2World::GetContactCount() const +{ + return m_contactManager.m_contactCount; +} + +inline void b2World::SetGravity(const b2Vec2& gravity) +{ + m_gravity = gravity; +} + +inline b2Vec2 b2World::GetGravity() const +{ + return m_gravity; +} + +inline bool b2World::IsLocked() const +{ + return (m_flags & e_locked) == e_locked; +} + +inline void b2World::SetAutoClearForces(bool flag) +{ + if (flag) + { + m_flags |= e_clearForces; + } + else + { + m_flags &= ~e_clearForces; + } +} + +/// Get the flag that controls automatic clearing of forces after each time step. +inline bool b2World::GetAutoClearForces() const +{ + return (m_flags & e_clearForces) == e_clearForces; +} + +inline const b2ContactManager& b2World::GetContactManager() const +{ + return m_contactManager; +} + +inline const b2Profile& b2World::GetProfile() const +{ + return m_profile; +} + +#endif diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2WorldCallbacks.cpp b/jni/love/src/libraries/Box2D/Dynamics/b2WorldCallbacks.cpp new file mode 100755 index 00000000..0f4b9c53 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2WorldCallbacks.cpp @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 +#include + +// Return true if contact calculations should be performed between these two shapes. +// If you implement your own collision filter you may want to build from this implementation. +bool b2ContactFilter::ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB) +{ + const b2Filter& filterA = fixtureA->GetFilterData(); + const b2Filter& filterB = fixtureB->GetFilterData(); + + if (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0) + { + return filterA.groupIndex > 0; + } + + bool collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0; + return collide; +} diff --git a/jni/love/src/libraries/Box2D/Dynamics/b2WorldCallbacks.h b/jni/love/src/libraries/Box2D/Dynamics/b2WorldCallbacks.h new file mode 100755 index 00000000..82ffc022 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Dynamics/b2WorldCallbacks.h @@ -0,0 +1,155 @@ +/* +* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* +* 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 B2_WORLD_CALLBACKS_H +#define B2_WORLD_CALLBACKS_H + +#include + +struct b2Vec2; +struct b2Transform; +class b2Fixture; +class b2Body; +class b2Joint; +class b2Contact; +struct b2ContactResult; +struct b2Manifold; + +/// Joints and fixtures are destroyed when their associated +/// body is destroyed. Implement this listener so that you +/// may nullify references to these joints and shapes. +class b2DestructionListener +{ +public: + virtual ~b2DestructionListener() {} + + /// Called when any joint is about to be destroyed due + /// to the destruction of one of its attached bodies. + virtual void SayGoodbye(b2Joint* joint) = 0; + + /// Called when any fixture is about to be destroyed due + /// to the destruction of its parent body. + virtual void SayGoodbye(b2Fixture* fixture) = 0; +}; + +/// Implement this class to provide collision filtering. In other words, you can implement +/// this class if you want finer control over contact creation. +class b2ContactFilter +{ +public: + virtual ~b2ContactFilter() {} + + /// Return true if contact calculations should be performed between these two shapes. + /// @warning for performance reasons this is only called when the AABBs begin to overlap. + virtual bool ShouldCollide(b2Fixture* fixtureA, b2Fixture* fixtureB); +}; + +/// Contact impulses for reporting. Impulses are used instead of forces because +/// sub-step forces may approach infinity for rigid body collisions. These +/// match up one-to-one with the contact points in b2Manifold. +struct b2ContactImpulse +{ + float32 normalImpulses[b2_maxManifoldPoints]; + float32 tangentImpulses[b2_maxManifoldPoints]; + int32 count; +}; + +/// Implement this class to get contact information. You can use these results for +/// things like sounds and game logic. You can also get contact results by +/// traversing the contact lists after the time step. However, you might miss +/// some contacts because continuous physics leads to sub-stepping. +/// Additionally you may receive multiple callbacks for the same contact in a +/// single time step. +/// You should strive to make your callbacks efficient because there may be +/// many callbacks per time step. +/// @warning You cannot create/destroy Box2D entities inside these callbacks. +class b2ContactListener +{ +public: + virtual ~b2ContactListener() {} + + /// Called when two fixtures begin to touch. + virtual void BeginContact(b2Contact* contact) { B2_NOT_USED(contact); } + + /// Called when two fixtures cease to touch. + virtual void EndContact(b2Contact* contact) { B2_NOT_USED(contact); } + + /// This is called after a contact is updated. This allows you to inspect a + /// contact before it goes to the solver. If you are careful, you can modify the + /// contact manifold (e.g. disable contact). + /// A copy of the old manifold is provided so that you can detect changes. + /// Note: this is called only for awake bodies. + /// Note: this is called even when the number of contact points is zero. + /// Note: this is not called for sensors. + /// Note: if you set the number of contact points to zero, you will not + /// get an EndContact callback. However, you may get a BeginContact callback + /// the next step. + virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) + { + B2_NOT_USED(contact); + B2_NOT_USED(oldManifold); + } + + /// This lets you inspect a contact after the solver is finished. This is useful + /// for inspecting impulses. + /// Note: the contact manifold does not include time of impact impulses, which can be + /// arbitrarily large if the sub-step is small. Hence the impulse is provided explicitly + /// in a separate data structure. + /// Note: this is only called for contacts that are touching, solid, and awake. + virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) + { + B2_NOT_USED(contact); + B2_NOT_USED(impulse); + } +}; + +/// Callback class for AABB queries. +/// See b2World::Query +class b2QueryCallback +{ +public: + virtual ~b2QueryCallback() {} + + /// Called for each fixture found in the query AABB. + /// @return false to terminate the query. + virtual bool ReportFixture(b2Fixture* fixture) = 0; +}; + +/// Callback class for ray casts. +/// See b2World::RayCast +class b2RayCastCallback +{ +public: + virtual ~b2RayCastCallback() {} + + /// Called for each fixture found in the query. You control how the ray cast + /// proceeds by returning a float: + /// return -1: ignore this fixture and continue + /// return 0: terminate the ray cast + /// return fraction: clip the ray to this point + /// return 1: don't clip the ray and continue + /// @param fixture the fixture hit by the ray + /// @param point the point of initial intersection + /// @param normal the normal vector at the point of intersection + /// @return -1 to filter, 0 to terminate, fraction to clip the ray for + /// closest hit, 1 to continue + virtual float32 ReportFixture( b2Fixture* fixture, const b2Vec2& point, + const b2Vec2& normal, float32 fraction) = 0; +}; + +#endif diff --git a/jni/love/src/libraries/Box2D/README.MODIFIED b/jni/love/src/libraries/Box2D/README.MODIFIED new file mode 100644 index 00000000..71388bce --- /dev/null +++ b/jni/love/src/libraries/Box2D/README.MODIFIED @@ -0,0 +1 @@ +PLEASE NOTE, this version of Box2D is NOT original, it has been MODIFIED by the LÖVE Development Team. diff --git a/jni/love/src/libraries/Box2D/Rope/b2Rope.cpp b/jni/love/src/libraries/Box2D/Rope/b2Rope.cpp new file mode 100755 index 00000000..7af3a6cf --- /dev/null +++ b/jni/love/src/libraries/Box2D/Rope/b2Rope.cpp @@ -0,0 +1,259 @@ +/* +* Copyright (c) 2011 Erin Catto http://box2d.org +* +* 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 +#include + +b2Rope::b2Rope() +{ + m_count = 0; + m_ps = NULL; + m_p0s = NULL; + m_vs = NULL; + m_ims = NULL; + m_Ls = NULL; + m_as = NULL; + m_gravity.SetZero(); + m_k2 = 1.0f; + m_k3 = 0.1f; +} + +b2Rope::~b2Rope() +{ + b2Free(m_ps); + b2Free(m_p0s); + b2Free(m_vs); + b2Free(m_ims); + b2Free(m_Ls); + b2Free(m_as); +} + +void b2Rope::Initialize(const b2RopeDef* def) +{ + b2Assert(def->count >= 3); + m_count = def->count; + m_ps = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2)); + m_p0s = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2)); + m_vs = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2)); + m_ims = (float32*)b2Alloc(m_count * sizeof(float32)); + + for (int32 i = 0; i < m_count; ++i) + { + m_ps[i] = def->vertices[i]; + m_p0s[i] = def->vertices[i]; + m_vs[i].SetZero(); + + float32 m = def->masses[i]; + if (m > 0.0f) + { + m_ims[i] = 1.0f / m; + } + else + { + m_ims[i] = 0.0f; + } + } + + int32 count2 = m_count - 1; + int32 count3 = m_count - 2; + m_Ls = (float32*)b2Alloc(count2 * sizeof(float32)); + m_as = (float32*)b2Alloc(count3 * sizeof(float32)); + + for (int32 i = 0; i < count2; ++i) + { + b2Vec2 p1 = m_ps[i]; + b2Vec2 p2 = m_ps[i+1]; + m_Ls[i] = b2Distance(p1, p2); + } + + for (int32 i = 0; i < count3; ++i) + { + b2Vec2 p1 = m_ps[i]; + b2Vec2 p2 = m_ps[i + 1]; + b2Vec2 p3 = m_ps[i + 2]; + + b2Vec2 d1 = p2 - p1; + b2Vec2 d2 = p3 - p2; + + float32 a = b2Cross(d1, d2); + float32 b = b2Dot(d1, d2); + + m_as[i] = b2Atan2(a, b); + } + + m_gravity = def->gravity; + m_damping = def->damping; + m_k2 = def->k2; + m_k3 = def->k3; +} + +void b2Rope::Step(float32 h, int32 iterations) +{ + if (h == 0.0) + { + return; + } + + float32 d = expf(- h * m_damping); + + for (int32 i = 0; i < m_count; ++i) + { + m_p0s[i] = m_ps[i]; + if (m_ims[i] > 0.0f) + { + m_vs[i] += h * m_gravity; + } + m_vs[i] *= d; + m_ps[i] += h * m_vs[i]; + + } + + for (int32 i = 0; i < iterations; ++i) + { + SolveC2(); + SolveC3(); + SolveC2(); + } + + float32 inv_h = 1.0f / h; + for (int32 i = 0; i < m_count; ++i) + { + m_vs[i] = inv_h * (m_ps[i] - m_p0s[i]); + } +} + +void b2Rope::SolveC2() +{ + int32 count2 = m_count - 1; + + for (int32 i = 0; i < count2; ++i) + { + b2Vec2 p1 = m_ps[i]; + b2Vec2 p2 = m_ps[i + 1]; + + b2Vec2 d = p2 - p1; + float32 L = d.Normalize(); + + float32 im1 = m_ims[i]; + float32 im2 = m_ims[i + 1]; + + if (im1 + im2 == 0.0f) + { + continue; + } + + float32 s1 = im1 / (im1 + im2); + float32 s2 = im2 / (im1 + im2); + + p1 -= m_k2 * s1 * (m_Ls[i] - L) * d; + p2 += m_k2 * s2 * (m_Ls[i] - L) * d; + + m_ps[i] = p1; + m_ps[i + 1] = p2; + } +} + +void b2Rope::SetAngle(float32 angle) +{ + int32 count3 = m_count - 2; + for (int32 i = 0; i < count3; ++i) + { + m_as[i] = angle; + } +} + +void b2Rope::SolveC3() +{ + int32 count3 = m_count - 2; + + for (int32 i = 0; i < count3; ++i) + { + b2Vec2 p1 = m_ps[i]; + b2Vec2 p2 = m_ps[i + 1]; + b2Vec2 p3 = m_ps[i + 2]; + + float32 m1 = m_ims[i]; + float32 m2 = m_ims[i + 1]; + float32 m3 = m_ims[i + 2]; + + b2Vec2 d1 = p2 - p1; + b2Vec2 d2 = p3 - p2; + + float32 L1sqr = d1.LengthSquared(); + float32 L2sqr = d2.LengthSquared(); + + if (L1sqr * L2sqr == 0.0f) + { + continue; + } + + float32 a = b2Cross(d1, d2); + float32 b = b2Dot(d1, d2); + + float32 angle = b2Atan2(a, b); + + b2Vec2 Jd1 = (-1.0f / L1sqr) * d1.Skew(); + b2Vec2 Jd2 = (1.0f / L2sqr) * d2.Skew(); + + b2Vec2 J1 = -Jd1; + b2Vec2 J2 = Jd1 - Jd2; + b2Vec2 J3 = Jd2; + + float32 mass = m1 * b2Dot(J1, J1) + m2 * b2Dot(J2, J2) + m3 * b2Dot(J3, J3); + if (mass == 0.0f) + { + continue; + } + + mass = 1.0f / mass; + + float32 C = angle - m_as[i]; + + while (C > b2_pi) + { + angle -= 2 * b2_pi; + C = angle - m_as[i]; + } + + while (C < -b2_pi) + { + angle += 2.0f * b2_pi; + C = angle - m_as[i]; + } + + float32 impulse = - m_k3 * mass * C; + + p1 += (m1 * impulse) * J1; + p2 += (m2 * impulse) * J2; + p3 += (m3 * impulse) * J3; + + m_ps[i] = p1; + m_ps[i + 1] = p2; + m_ps[i + 2] = p3; + } +} + +void b2Rope::Draw(b2Draw* draw) const +{ + b2Color c(0.4f, 0.5f, 0.7f); + + for (int32 i = 0; i < m_count - 1; ++i) + { + draw->DrawSegment(m_ps[i], m_ps[i+1], c); + } +} diff --git a/jni/love/src/libraries/Box2D/Rope/b2Rope.h b/jni/love/src/libraries/Box2D/Rope/b2Rope.h new file mode 100755 index 00000000..246cf923 --- /dev/null +++ b/jni/love/src/libraries/Box2D/Rope/b2Rope.h @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2011 Erin Catto http://www.box2d.org +* +* 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 B2_ROPE_H +#define B2_ROPE_H + +#include + +class b2Draw; + +/// +struct b2RopeDef +{ + b2RopeDef() + { + vertices = NULL; + count = 0; + masses = NULL; + gravity.SetZero(); + damping = 0.1f; + k2 = 0.9f; + k3 = 0.1f; + } + + /// + b2Vec2* vertices; + + /// + int32 count; + + /// + float32* masses; + + /// + b2Vec2 gravity; + + /// + float32 damping; + + /// Stretching stiffness + float32 k2; + + /// Bending stiffness. Values above 0.5 can make the simulation blow up. + float32 k3; +}; + +/// +class b2Rope +{ +public: + b2Rope(); + ~b2Rope(); + + /// + void Initialize(const b2RopeDef* def); + + /// + void Step(float32 timeStep, int32 iterations); + + /// + int32 GetVertexCount() const + { + return m_count; + } + + /// + const b2Vec2* GetVertices() const + { + return m_ps; + } + + /// + void Draw(b2Draw* draw) const; + + /// + void SetAngle(float32 angle); + +private: + + void SolveC2(); + void SolveC3(); + + int32 m_count; + b2Vec2* m_ps; + b2Vec2* m_p0s; + b2Vec2* m_vs; + + float32* m_ims; + + float32* m_Ls; + float32* m_as; + + b2Vec2 m_gravity; + float32 m_damping; + + float32 m_k2; + float32 m_k3; +}; + +#endif diff --git a/jni/love/src/libraries/Wuff/wuff.c b/jni/love/src/libraries/Wuff/wuff.c new file mode 100644 index 00000000..f3597333 --- /dev/null +++ b/jni/love/src/libraries/Wuff/wuff.c @@ -0,0 +1,203 @@ +#include + +#include "wuff_config.h" +#include "wuff.h" +#include "wuff_internal.h" + + +wuff_sint32 wuff_open(struct wuff_handle ** handle_pointer, struct wuff_callback * callback, void * userdata) +{ + struct wuff_handle * handle; + wuff_sint32 wuff_status; + + if (handle_pointer == NULL || callback == NULL) + return WUFF_INVALID_PARAM; + + handle = wuff_alloc(sizeof(struct wuff_handle)); + if (handle == NULL) + return WUFF_MEMALLOC_ERROR; + + memset(handle, 0, sizeof(struct wuff_handle)); + handle->buffer.data = NULL; + handle->callback = callback; + handle->userdata = userdata; + + wuff_status = wuff_setup(handle); + if (wuff_status < 0) + { + wuff_cleanup(handle); + return wuff_status; + } + + *handle_pointer = handle; + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_close(struct wuff_handle * handle) +{ + wuff_sint32 wuff_status; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + + wuff_status = wuff_cleanup(handle); + WUFF_STATUS_BAIL() + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_seek(struct wuff_handle * handle, wuff_uint64 offset) +{ + wuff_sint32 wuff_status; + wuff_uint64 seek_offset; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + + /* Clamp offset to stream length. */ + offset = offset <= handle->stream.length ? offset : handle->stream.length; + seek_offset = offset * handle->stream.header.block_size; + wuff_status = handle->callback->seek(handle->userdata, handle->stream.data.offset + seek_offset); + WUFF_STATUS_BAIL() + + handle->stream.position = offset; + handle->output.block_offset = 0; + + /* A new position requires an empty buffer. */ + wuff_status = wuff_buffer_clear(handle); + WUFF_STATUS_BAIL() + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_tell(struct wuff_handle * handle, wuff_uint64 * offset) +{ + if (handle == NULL) + return WUFF_INVALID_PARAM; + + *offset = handle->stream.position; + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_stream_info(struct wuff_handle * handle, struct wuff_info * info) +{ + if (handle == NULL || info == NULL) + return WUFF_INVALID_PARAM; + + info->format = handle->stream.format; + info->channels = handle->stream.header.channels; + info->sample_rate = handle->stream.header.sample_rate; + info->bits_per_sample = handle->stream.header.bits_per_sample; + info->length = handle->stream.length; + /* Think about adding channel mapping and perhaps other things. */ + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_format(struct wuff_handle * handle, wuff_uint16 format) +{ + wuff_sint32 wuff_status; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + else if (format >= WUFF_FORMAT_MAX) + return WUFF_FORMAT_UNSUPPORTED; + + /* A format change resets the position to the start of the block. */ + wuff_status = wuff_seek(handle, handle->stream.position); + WUFF_STATUS_BAIL() + + wuff_status = wuff_set_output_format(handle, format); + WUFF_STATUS_BAIL() + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_read(struct wuff_handle * handle, wuff_uint8 * out_buffer, size_t * out_size) +{ + size_t current_offset; + size_t r_samples, num_samples; + wuff_uint8 head_offset, head, tail, sample_size; + wuff_uint8 * in_buffer; + wuff_sint32 wuff_status; + + if (handle == NULL || out_buffer == NULL || out_size == NULL) + return WUFF_INVALID_PARAM; + + if (*out_size == 0) + return WUFF_SUCCESS; + + sample_size = (wuff_uint8)handle->output.bytes_per_sample; + + /* Calculating the number of samples that fit into the application buffer. */ + /* The first and last sample may be truncated. */ + current_offset = handle->output.block_offset; + head_offset = current_offset % sample_size; + head = head_offset == 0 ? 0 : sample_size - head_offset; + num_samples = wuff_calculate_samples(*out_size, sample_size, &head, &tail); + + /* Requesting the number of samples from the buffer. */ + /* Calculate the new sample count if necessary and write the output. */ + r_samples = num_samples; + wuff_status = wuff_buffer_request(handle, &in_buffer, &r_samples); + WUFF_STATUS_BAIL() + else if (r_samples == 0) + { + /* Possible EOF. */ + *out_size = 0; + } + else + { + if (r_samples == 1 && head != 0) + { + /* Only the first truncated sample fits. */ + /* I really hope nobody will use small buffers like this. */ + num_samples = 0; + tail = 0; + } + else + { + /* At this point the first (possibly truncated) sample will be fully written. */ + /* Subtract the first and last sample from the count if they're truncated. */ + if (r_samples < num_samples) + tail = 0; + num_samples = r_samples - !!head - !!tail; + } + + handle->output.function(out_buffer, in_buffer, num_samples, head_offset, head, tail); + + /* Report the number of bytes written. */ + *out_size = num_samples * sample_size + head + tail; + + /* Adjust the block offset and sample position. */ + current_offset += *out_size; + if (current_offset >= handle->output.block_size) + { + handle->stream.position += current_offset / handle->output.block_size; + handle->output.block_offset = current_offset % handle->output.block_size; + } + else + { + handle->output.block_offset = current_offset; + } + + /* Release the fully processed samples from the buffer. */ + wuff_status = wuff_buffer_release(handle, head_offset + head == sample_size ? num_samples + 1 : num_samples); + WUFF_STATUS_BAIL() + } + + return WUFF_SUCCESS; +} + +void wuff_version(struct wuff_version * version) +{ + if (version == NULL) + return; + + version->major = WUFF_VERSION_MAJOR; + version->minor = WUFF_VERSION_MINOR; + version->build = WUFF_VERSION_BUILD; + version->revision = WUFF_VERSION_REVISION; +} diff --git a/jni/love/src/libraries/Wuff/wuff.h b/jni/love/src/libraries/Wuff/wuff.h new file mode 100644 index 00000000..c7cc1092 --- /dev/null +++ b/jni/love/src/libraries/Wuff/wuff.h @@ -0,0 +1,274 @@ +/* + * Wuff - A very basic WAVE reader + */ + +#ifndef WUFF_H +#define WUFF_H + +#ifdef __cplusplus +extern "C" { +#endif + + +#define WUFF_VERSION_MAJOR 0 +#define WUFF_VERSION_MINOR 0 +#define WUFF_VERSION_BUILD 0 +#define WUFF_VERSION_REVISION 2 + + +#ifndef WUFF_API_OVERRIDE + #if defined(_WIN32) && defined(WUFF_DYNAMIC_LIB) + #define WUFF_EXPORT __declspec(dllexport) + #define WUFF_IMPORT __declspec(dllimport) + #else + #define WUFF_EXPORT + #define WUFF_IMPORT + #endif +#endif + +#ifdef WUFF_BUILDING_CORE + #define WUFF_API WUFF_EXPORT +#else + #define WUFF_API WUFF_IMPORT +#endif + + +#ifdef WUFF_FORCE_STDINT_H + #include +typedef uint8_t wuff_uint8; +typedef int8_t wuff_sint8; +typedef uint16_t wuff_uint16; +typedef int16_t wuff_sint16; +typedef uint32_t wuff_uint32; +typedef int32_t wuff_sint32; + #ifdef WUFF_NO_64BIT_TYPE +typedef uint32_t wuff_uint64; +typedef int32_t wuff_sint64; + #else +typedef uint64_t wuff_uint64; +typedef int64_t wuff_sint64; + #endif +#elif _MSC_VER +typedef unsigned __int8 wuff_uint8; +typedef signed __int8 wuff_sint8; +typedef unsigned __int16 wuff_uint16; +typedef signed __int16 wuff_sint16; +typedef unsigned __int32 wuff_uint32; +typedef signed __int32 wuff_sint32; +typedef unsigned __int64 wuff_uint64; +typedef signed __int64 wuff_sint64; +#else +typedef unsigned char wuff_uint8; +typedef signed char wuff_sint8; +typedef unsigned short wuff_uint16; +typedef signed short wuff_sint16; +typedef unsigned int wuff_uint32; +typedef signed int wuff_sint32; + #ifdef WUFF_NO_64BIT_TYPE +typedef unsigned long wuff_uint64; +typedef signed long wuff_sint64; + #else +typedef unsigned long long wuff_uint64; +typedef signed long long wuff_sint64; + #endif +#endif + +/** @file */ +/** + * Opaque structure used to identify the open Wuff streams. + */ +struct wuff_handle; + +/** + * Callbacks that control the delivery of the data of the WAVE file. + * + * The return values of the functions indicate their status. A zero or positive + * value means success and a negative value failure. The macros WUFF_SUCCESS and + * WUFF_ERROR, or a value equal or below WUFF_USER_ERROR can be used. The error + * value will be returned by the function called by the application. + */ +struct wuff_callback +{ + /** + * The read callback requests the linking application to write at least + * 'size' bytes into the memory where 'buffer' is pointing to. The value + * pointed to by 'size' must be update to the actual number of bytes + * written. Zero will be interepreted as the end-of-file. + * + * @param userdata The userdata set with wuff_open. + * @param buffer A pointer to the memory where the data can be written to. + * @param size A pointer to the size of the buffer and the bytes written. + */ + wuff_sint32 (* read)(void * userdata, wuff_uint8 * buffer, size_t * size); + + /** + * The seek callback requests the linking application to seek to a new byte + * offset in the WAVE data. The next call to the read callback must then + * write data starting from this position. The offset is always relative + * to the beginning of the WAVE data. + * + * @param userdata The userdata set with wuff_open. + * @param offset The new offset. + */ + wuff_sint32 (* seek)(void * userdata, wuff_uint64 offset); + + /** + * The tell callback requests the linking application to write the current + * byte position to the integer pointed to by 'offset'. + * + * @param userdata The userdata set with wuff_open. + * @param offset A pointer to an integer where the current position can be written to. + */ + wuff_sint32 (* tell)(void * userdata, wuff_uint64 * offset); +}; + + +/** + * Stream information structure. + */ +struct wuff_info +{ + wuff_uint16 format; /**< The format of the stream. + * See "Wuff raw sample formats" below. */ + wuff_uint16 channels; /**< The number of channels in the stream. */ + wuff_uint32 sample_rate; /**< The sample rate in hertz. */ + wuff_uint16 bits_per_sample; /**< The number of bits per sample. */ + wuff_uint64 length; /**< The length of the stream in samples. */ +}; + + +/** + * Version information structure. + */ +struct wuff_version +{ + wuff_uint16 major; + wuff_uint16 minor; + wuff_uint16 build; + wuff_uint16 revision; +}; + + +/** + * Opens a new Wuff stream. This will read from the callbacks immediately, make + * sure they're ready. It will check if the WAVE file is supported. + * + * @param handle A pointer to pointer of a wuff_handle that will be + * initialized if the function succeeds. + * @param callback The callbacks for the data of the WAVE file. + * @param userdata A void pointer that will be passed to the callbacks. + * @return Returns a negative value if an error occured. + */ +WUFF_API wuff_sint32 wuff_open(struct wuff_handle ** handle, struct wuff_callback * callback, void * userdata); + +/** + * Closes a Wuff stream. + * + * @param handle The Wuff stream handle. + * @return Returns a negative value if an error occured. + */ +WUFF_API wuff_sint32 wuff_close(struct wuff_handle * handle); + +/** + * Fills the wuff_info struct with information about the stream. + * + * @param handle The Wuff stream handle. + * @param info A pointer to a wuff_info struct. + * @return Returns a negative value if an error occured. + */ +WUFF_API wuff_sint32 wuff_stream_info(struct wuff_handle * handle, struct wuff_info * info); + +/** + * Sets the output format of the decoder. A new format resets the decoder output + * to the beginning of the current block (the sample of the first channel). + * + * @param handle The Wuff stream handle. + * @param format The new output format. + * @return Returns a negative value if an error occured. + */ +WUFF_API wuff_sint32 wuff_format(struct wuff_handle * handle, wuff_uint16 format); + +/** + * Decodes samples to the passed memory location. The size_t pointer points to + * the maximum number of bytes that can be written to the buffer. This count + * will be adjusted to the number of bytes written to the buffer. + * + * @param handle The Wuff stream handle. + * @param buffer The buffer to write to. + * @param size The maximum number of bytes to write to the buffer. + * @return Returns a negative value if an error occured. + */ +WUFF_API wuff_sint32 wuff_read(struct wuff_handle * handle, wuff_uint8 * buffer, size_t * size); + +/** + * Seeks to a sample location. + * The next call to wuff_read will return samples starting from this position. + * + * @param handle The Wuff stream handle. + * @param offset The sample offset to seek to. + * @return Returns a negative value if an error occured. + */ +WUFF_API wuff_sint32 wuff_seek(struct wuff_handle * handle, wuff_uint64 offset); + +/** + * Sets the current position. + * + * @param handle The Wuff stream handle. + * @param offset A pointer to a integer that will receive the sample offset. + * @return Returns a negative value if an error occured. + */ +WUFF_API wuff_sint32 wuff_tell(struct wuff_handle * handle, wuff_uint64 * offset); + +/** + * Copies the Wuff version of the binary into the struct. + * For compile-time version information use the WUFF_VERSION_MAJOR, + * WUFF_VERSION_MINOR, WUFF_VERSION_BUILD, and WUFF_VERSION_REVISION macros. + * + * @param version A pointer to a wuff_version struct that will receive the + * version information. + */ +WUFF_API void wuff_version(struct wuff_version * version); + + +/* Wuff raw sample formats. */ +#define WUFF_FORMAT_PCM_U8 0 +#define WUFF_FORMAT_PCM_S16 1 +#define WUFF_FORMAT_PCM_S24 2 +#define WUFF_FORMAT_PCM_S32 3 +#define WUFF_FORMAT_IEEE_FLOAT_32 4 +#define WUFF_FORMAT_IEEE_FLOAT_64 5 +#define WUFF_FORMAT_MAX 6 + + +/* Success and error return values for all functions. */ +#define WUFF_STREAM_EOF 100 + +#define WUFF_SUCCESS 0 + +#define WUFF_ERROR -1 +#define WUFF_INVALID_PARAM -2 +#define WUFF_MEMALLOC_ERROR -3 + +#define WUFF_STREAM_NOT_RIFF -100 +#define WUFF_STREAM_NOT_WAVE -101 +#define WUFF_STREAM_INVALID -102 +#define WUFF_STREAM_ZERO_CHANNELS -103 +#define WUFF_STREAM_ZERO_SAMPLE_RATE -104 +#define WUFF_STREAM_ZERO_BITS_PER_SAMPLE -105 +#define WUFF_STREAM_FORMAT_CHUNK_MISSING -106 +#define WUFF_STREAM_DATA_CHUNK_MISSING -107 +#define WUFF_STREAM_CHUNK_NOT_FOUND -108 + +#define WUFF_FORMAT_UNSUPPORTED -200 + +#define WUFF_BUFFER_INVALID_SIZE -300 +#define WUFF_BUFFER_INVALID_STREAM_POSITION -301 + +#define WUFF_USER_ERROR -10000 + + +#ifdef __cplusplus +} +#endif + +#endif /* WUFF_H */ diff --git a/jni/love/src/libraries/Wuff/wuff_config.h b/jni/love/src/libraries/Wuff/wuff_config.h new file mode 100644 index 00000000..ed17005f --- /dev/null +++ b/jni/love/src/libraries/Wuff/wuff_config.h @@ -0,0 +1,50 @@ +#ifndef WUFF_CONFIG_H +#define WUFF_CONFIG_H + +/* Defines that the internal code is being built. */ +/* The wuff.h header uses this to change export and import macros. */ +#define WUFF_BUILDING_CORE + +#ifndef WUFF_INLINE_OVERRIDE + #ifdef __cplusplus + #define WUFF_INLINE inline + #else + #ifdef _MSC_VER + #define WUFF_INLINE __inline + #elif __GNUC__ + #define WUFF_INLINE __inline__ + #else + #define WUFF_INLINE + #endif + #endif +#endif + + +#ifndef WUFF_GCC_VISIBILITY_OVERRIDE + #if __GNUC__ >= 4 + #define WUFF_INTERN_API __attribute__((visibility("hidden"))) + #else + #define WUFF_INTERN_API + #endif +#endif + + +#ifdef WUFF_MEMALLOC_OVERRIDE + #ifdef __cplusplus +extern "C" { + #endif + + /* Define your own memory allocator. */ + void * wuff_alloc(size_t size); + void wuff_free(void * mem); + + #ifdef __cplusplus +} + #endif +#else +WUFF_INTERN_API void * wuff_alloc(size_t size); +WUFF_INTERN_API void wuff_free(void * mem); +#endif + + +#endif /* WUFF_CONFIG_H */ diff --git a/jni/love/src/libraries/Wuff/wuff_convert.c b/jni/love/src/libraries/Wuff/wuff_convert.c new file mode 100644 index 00000000..9e60ff5d --- /dev/null +++ b/jni/love/src/libraries/Wuff/wuff_convert.c @@ -0,0 +1,827 @@ +#include + +#include "wuff_config.h" +#include "wuff.h" +#include "wuff_convert.h" + +/* + * int8 functions. + */ + +WUFF_CONV_FUNC(wuff_int8_to_int8) +{ + (void)offset; + memcpy(dst, src, samples + head + tail); +} + +WUFF_CONV_FUNC(wuff_int8_to_int16) +{ + wuff_sint16 i16; + size_t i; + + if (head != 0) + { + i16 = (src[0] - 128) << 8; + memcpy(dst, (wuff_uint8 *)&i16 + offset, head); + src += 1; + dst += head; + } + + for (i = 0; i < samples; i++) + { + i16 = (src[i] - 128) << 8; + memcpy(dst + i * 2, &i16, 2); + } + + if (tail != 0) + { + i16 = (src[samples] - 128) << 8; + memcpy(dst + samples * 2, &i16, tail); + } +} + +WUFF_CONV_FUNC(wuff_int8_to_int24) +{ + wuff_sint32 i24; + size_t i; + + if (head != 0) + { + i24 = (src[0] - 128) << 24; + memcpy(dst, (wuff_uint8 *)&i24 + 1 + offset, head); + src += 1; + dst += head; + } + + for (i = 0; i < samples; i++) + { + i24 = (src[i] - 128) << 24; + memcpy(dst + i * 3, (wuff_uint8 *)&i24 + 1, 3); + } + + if (tail != 0) + { + i24 = (src[samples] - 128) << 24; + memcpy(dst + samples * 3, (wuff_uint8 *)&i24 + 1, tail); + } +} + +WUFF_CONV_FUNC(wuff_int8_to_int32) +{ + wuff_sint32 i32; + size_t i; + + if (head != 0) + { + i32 = (src[0] - 128) << 24; + memcpy(dst, (wuff_uint8 *)&i32 + offset, head); + src += 1; + dst += head; + } + + for (i = 0; i < samples; i++) + { + i32 = (src[i] - 128) << 24; + memcpy(dst + i * 4, &i32, 4); + } + + if (tail != 0) + { + i32 = (src[samples] - 128) << 24; + memcpy(dst + samples * 4, &i32, tail); + } +} + +WUFF_CONV_FUNC(wuff_int8_to_float32) +{ + float f32; + size_t i; + + if (head != 0) + { + f32 = (float)(src[0] - 128) / 128.0f; + memcpy(dst, (wuff_uint8 *)&f32 + offset, head); + src += 1; + dst += head; + } + + for (i = 0; i < samples; i++) + { + f32 = (float)(src[i] - 128) / 128.0f; + memcpy(dst + i * 4, &f32, 4); + } + + if (tail != 0) + { + f32 = (float)(src[samples] - 128) / 128.0f; + memcpy(dst + samples * 4, &f32, tail); + } +} + +WUFF_CONV_FUNC(wuff_int8_to_float64) +{ + double f64; + size_t i; + + if (head != 0) + { + f64 = (double)(src[0] - 128) / 128.0; + memcpy(dst, (wuff_uint8 *)&f64 + offset, head); + src += 1; + dst += head; + } + + for (i = 0; i < samples; i++) + { + f64 = (double)(src[i] - 128) / 128.0; + memcpy(dst + i * 8, &f64, 8); + } + + if (tail != 0) + { + f64 = (double)(src[samples] - 128) / 128.0; + memcpy(dst + samples * 8, &f64, tail); + } +} + +/* + * int16 functions. + */ + +WUFF_CONV_FUNC(wuff_int16_to_int8) +{ + wuff_sint16 i16; + size_t i; + (void)offset; (void)head; (void)tail; + + for (i = 0; i < samples; i++) + { + memcpy(&i16, src + i * 2, 2); + dst[i] = (i16 >> 8) + 128; + } +} + +WUFF_CONV_FUNC(wuff_int16_to_int16) +{ + memcpy(dst, src + offset, samples * 2 + head + tail); +} + +WUFF_CONV_FUNC(wuff_int16_to_int24) +{ + wuff_sint16 i16; + wuff_sint32 i24; + size_t i; + + if (head != 0) + { + memcpy(&i16, src, 2); + i24 = i16 << 16; + memcpy(dst, (wuff_uint8 *)&i24 + 1 + offset, head); + src += 2; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&i16, src + i * 2, 2); + i24 = i16 << 16; + memcpy(dst + i * 3, (wuff_uint8 *)&i24 + 1, 3); + } + + if (tail != 0) + { + memcpy(&i16, src + samples * 2, 2); + i24 = i16 << 16; + memcpy(dst + samples * 3, (wuff_uint8 *)&i24 + 1, tail); + } +} + +WUFF_CONV_FUNC(wuff_int16_to_int32) +{ + wuff_sint16 i16; + wuff_sint32 i32; + size_t i; + + if (head != 0) + { + memcpy(&i16, src, 2); + i32 = i16 << 16; + memcpy(dst, (wuff_uint8 *)&i32 + offset, head); + src += 2; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&i16, src + i * 2, 2); + i32 = i16 << 16; + memcpy(dst + i * 4, &i32, 4); + } + + if (tail != 0) + { + memcpy(&i16, src + samples * 2, 2); + i32 = i16 << 16; + memcpy(dst + samples * 4, &i32, tail); + } +} + +WUFF_CONV_FUNC(wuff_int16_to_float32) +{ + wuff_sint16 i16; + float f32; + size_t i; + + if (head != 0) + { + memcpy(&i16, src, 2); + f32 = (float)i16 / 32768.0f; + memcpy(dst, (wuff_uint8 *)&f32 + offset, head); + src += 2; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&i16, src + i * 2, 2); + f32 = (float)i16 / 32768.0f; + memcpy(dst + i * 4, &f32, 4); + } + + if (tail != 0) + { + memcpy(&i16, src + samples * 2, 2); + f32 = (float)i16 / 32768.0f; + memcpy(dst + samples * 4, &f32, tail); + } +} + +WUFF_CONV_FUNC(wuff_int16_to_float64) +{ + wuff_sint16 i16; + double f64; + size_t i; + + if (head != 0) + { + memcpy(&i16, src, 2); + f64 = (double)i16 / 32768.0; + memcpy(dst, (wuff_uint8 *)&f64 + offset, head); + src += 2; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&i16, src + i * 2, 2); + f64 = (double)i16 / 32768.0; + memcpy(dst + i * 8, &f64, 8); + } + + if (tail != 0) + { + memcpy(&i16, src + samples * 2, 2); + f64 = (double)i16 / 32768.0; + memcpy(dst + samples * 8, &f64, tail); + } +} + +/* + * int24 functions. + */ + +WUFF_CONV_FUNC(wuff_int24_to_int8) +{ + wuff_sint32 i24 = 0; + size_t i; + (void)offset; (void)head; (void)tail; + + for (i = 0; i < samples; i++) + { + memcpy((wuff_uint8 *)&i24 + 1, src + i * 3, 3); + dst[i] = (wuff_uint8)((i24 >> 16) + 128); + } +} + +WUFF_CONV_FUNC(wuff_int24_to_int16) +{ + size_t i; + + if (head != 0) + { + memcpy(dst, src + 1 + offset, head); + src += 3; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(dst + i * 2, src + 1 + i * 3, 2); + } + + if (tail != 0) + { + memcpy(dst + samples * 2, src + 1 + samples * 3, tail); + } +} + +WUFF_CONV_FUNC(wuff_int24_to_int24) +{ + memcpy(dst, src + offset, samples * 3 + head + tail); +} + +WUFF_CONV_FUNC(wuff_int24_to_int32) +{ + wuff_sint32 i32 = 0; + size_t i; + + if (head != 0) + { + memcpy((wuff_uint8 *)&i32 + 1, src, 3); + memcpy(dst, (wuff_uint8 *)&i32 + offset, head); + src += 3; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy((wuff_uint8 *)&i32 + 1, src + i * 3, 3); + memcpy(dst + i * 4, &i32, 4); + } + + if (tail != 0) + { + memcpy((wuff_uint8 *)&i32 + 1, src + samples * 3, 3); + memcpy(dst + samples * 4, &i32, tail); + } +} + +WUFF_CONV_FUNC(wuff_int24_to_float32) +{ + wuff_sint32 i24 = 0; + float f32; + size_t i; + + if (head != 0) + { + memcpy((wuff_uint8 *)&i24 + 1, src, 3); + f32 = (float)((double)i24 / 2147483648.0); + memcpy(dst, (wuff_uint8 *)&f32 + offset, head); + src += 3; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy((wuff_uint8 *)&i24 + 1, src + i * 3, 3); + f32 = (float)((double)i24 / 2147483648.0); + memcpy(dst + i * 4, &f32, 4); + } + + if (tail != 0) + { + memcpy((wuff_uint8 *)&i24 + 1, src + samples * 3, 3); + f32 = (float)((double)i24 / 2147483648.0); + memcpy(dst + samples * 4, &f32, tail); + } +} + +WUFF_CONV_FUNC(wuff_int24_to_float64) +{ + wuff_sint32 i24 = 0; + double f64; + size_t i; + + if (head != 0) + { + memcpy((wuff_uint8 *)&i24 + 1, src, 3); + f64 = (double)i24 / 2147483648.0; + memcpy(dst, (wuff_uint8 *)&f64 + offset, head); + src += 3; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy((wuff_uint8 *)&i24 + 1, src + i * 3, 3); + f64 = (double)i24 / 2147483648.0; + memcpy(dst + i * 8, &f64, 8); + } + + if (tail != 0) + { + memcpy((wuff_uint8 *)&i24 + 1, src + samples * 3, 3); + f64 = (double)i24 / 2147483648.0; + memcpy(dst + samples * 8, &f64, tail); + } +} + +/* + * int32 functions. + */ + +WUFF_CONV_FUNC(wuff_int32_to_int8) +{ + wuff_sint32 i32 = 0; + size_t i; + (void)offset; (void)head; (void)tail; + + for (i = 0; i < samples; i++) + { + memcpy(&i32, src + i * 4, 4); + dst[i] = (i32 >> 24) + 128; + } +} + +WUFF_CONV_FUNC(wuff_int32_to_int16) +{ + size_t i; + + if (head != 0) + { + memcpy(dst, src + 2 + offset, head); + src += 4; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(dst + i * 2, src + 2 + i * 4, 2); + } + + if (tail != 0) + { + memcpy(dst + samples * 2, src + 2 + samples * 4, tail); + } +} + +WUFF_CONV_FUNC(wuff_int32_to_int24) +{ + size_t i; + + if (head != 0) + { + memcpy(dst, src + 1 + offset, head); + src += 4; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(dst + i * 3, src + 1 + i * 4, 3); + } + + if (tail != 0) + { + memcpy(dst + samples * 3, src + 1 + samples * 4, tail); + } +} + +WUFF_CONV_FUNC(wuff_int32_to_int32) +{ + memcpy(dst, src + offset, samples * 4 + head + tail); +} + +WUFF_CONV_FUNC(wuff_int32_to_float32) +{ + wuff_sint32 i32; + float f32; + size_t i; + + if (head != 0) + { + memcpy(&i32, src, 4); + f32 = (float)((double)i32 / 2147483648.0); + memcpy(dst, (wuff_uint8 *)&f32 + offset, head); + src += 4; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&i32, src + i * 4, 4); + f32 = (float)((double)i32 / 2147483648.0); + memcpy(dst + i * 4, &f32, 4); + } + + if (tail != 0) + { + memcpy(&i32, src + samples * 4, 4); + f32 = (float)((double)i32 / 2147483648.0); + memcpy(dst + samples * 4, &f32, tail); + } +} + +WUFF_CONV_FUNC(wuff_int32_to_float64) +{ + wuff_sint32 i32; + double f64; + size_t i; + + if (head != 0) + { + memcpy(&i32, src, 4); + f64 = (double)i32 / 2147483648.0; + memcpy(dst, (wuff_uint8 *)&f64 + offset, head); + src += 4; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&i32, src + i * 4, 4); + f64 = (double)i32 / 2147483648.0; + memcpy(dst + i * 8, &f64, 8); + } + + if (tail != 0) + { + memcpy(&i32, src + samples * 4, 4); + f64 = (double)i32 / 2147483648.0; + memcpy(dst + samples * 8, &f64, tail); + } +} + +/* + * float32 functions. + */ + +WUFF_CONV_FUNC(wuff_float32_to_int8) +{ + float f32; + size_t i; + (void)offset; (void)head; (void)tail; + + for (i = 0; i < samples; i++) + { + memcpy(&f32, src + i * 4, 4); + dst[i] = (wuff_uint8)((f32 * 127.5f) + 128.0f); + } +} + +WUFF_CONV_FUNC(wuff_float32_to_int16) +{ + float f32; + wuff_sint16 i16; + size_t i; + + if (head != 0) + { + memcpy(&f32, src, 4); + i16 = (wuff_sint16)(f32 * 32767.5f); + memcpy(dst, (wuff_uint8 *)&i16 + offset, head); + src += 4; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&f32, src + i * 4, 4); + i16 = (wuff_sint16)(f32 * 32767.5f); + memcpy(dst + i * 2, &i16, 2); + } + + if (tail != 0) + { + memcpy(&f32, src + i * 4, 4); + i16 = (wuff_sint16)(f32 * 32767.5f); + memcpy(dst + i * 2, &i16, tail); + } +} + +WUFF_CONV_FUNC(wuff_float32_to_int24) +{ + float f32; + wuff_sint32 i24; + size_t i; + + if (head != 0) + { + memcpy(&f32, src, 4); + i24 = (wuff_sint32)((double)f32 * 2147483647.5); + memcpy(dst, (wuff_uint8 *)&i24 + 1 + offset, head); + src += 4; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&f32, src + i * 4, 4); + i24 = (wuff_sint32)((double)f32 * 2147483647.5); + memcpy(dst + i * 3, (wuff_uint8 *)&i24 + 1, 3); + } + + if (tail != 0) + { + memcpy(&f32, src + samples * 4, 4); + i24 = (wuff_sint32)((double)f32 * 2147483647.5); + memcpy(dst + samples * 3, (wuff_uint8 *)&i24 + 1, tail); + } +} + +WUFF_CONV_FUNC(wuff_float32_to_int32) +{ + float f32; + wuff_sint32 i32; + size_t i; + + if (head != 0) + { + memcpy(&f32, src, 4); + i32 = (wuff_sint32)((double)f32 * 2147483647.5); + memcpy(dst, (wuff_uint8 *)&i32 + offset, head); + src += 4; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&f32, src + i * 4, 4); + i32 = (wuff_sint32)((double)f32 * 2147483647.5); + memcpy(dst + i * 4, &i32, 4); + } + + if (tail != 0) + { + memcpy(&f32, src + samples * 4, 4); + i32 = (wuff_sint32)((double)f32 * 2147483647.5); + memcpy(dst + samples * 4, &i32, tail); + } +} + +WUFF_CONV_FUNC(wuff_float32_to_float32) +{ + memcpy(dst, src + offset, samples * 4 + head + tail); +} + +WUFF_CONV_FUNC(wuff_float32_to_float64) +{ + float f32; + double f64; + size_t i; + + if (head != 0) + { + memcpy(&f32, src, 4); + f64 = f32; + memcpy(dst, (wuff_uint8 *)&f64 + offset, head); + src += 4; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&f32, src + i * 4, 4); + f64 = f32; + memcpy(dst + i * 8, &f64, 8); + } + + if (tail != 0) + { + memcpy(&f32, src + samples * 4, 4); + f64 = f32; + memcpy(dst + samples * 8, &f64, tail); + } +} + +/* + * float64 functions. + */ + +WUFF_CONV_FUNC(wuff_float64_to_int8) +{ + double f64; + size_t i; + (void)offset; (void)head; (void)tail; + + for (i = 0; i < samples; i++) + { + memcpy(&f64, src + i * 8, 8); + dst[i] = (wuff_uint8)((f64 * 127.5) + 128.0); + } +} + +WUFF_CONV_FUNC(wuff_float64_to_int16) +{ + double f64; + wuff_sint16 i16; + size_t i; + + if (head != 0) + { + memcpy(&f64, src, 8); + i16 = (wuff_sint16)(f64 * 32767.5); + memcpy(dst, (wuff_uint8 *)&i16 + offset, head); + src += 8; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&f64, src + i * 8, 8); + i16 = (wuff_sint16)(f64 * 32767.5); + memcpy(dst + i * 2, &i16, 2); + } + + if (tail != 0) + { + memcpy(&f64, src + i * 8, 8); + i16 = (wuff_sint16)(f64 * 32767.5); + memcpy(dst + i * 2, &i16, tail); + } +} + +WUFF_CONV_FUNC(wuff_float64_to_int24) +{ + double f64; + wuff_sint32 i24; + size_t i; + + if (head != 0) + { + memcpy(&f64, src, 8); + i24 = (wuff_sint32)(f64 * 2147483647.5); + memcpy(dst, (wuff_uint8 *)&i24 + 1 + offset, head); + src += 8; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&f64, src + i * 8, 8); + i24 = (wuff_sint32)(f64 * 2147483647.5); + memcpy(dst + i * 3, (wuff_uint8 *)&i24 + 1, 3); + } + + if (tail != 0) + { + memcpy(&f64, src + samples * 8, 8); + i24 = (wuff_sint32)(f64 * 2147483647.5); + memcpy(dst + samples * 3, (wuff_uint8 *)&i24 + 1, tail); + } +} + +WUFF_CONV_FUNC(wuff_float64_to_int32) +{ + double f64; + wuff_sint32 i32; + size_t i; + + if (head != 0) + { + memcpy(&f64, src, 8); + i32 = (wuff_sint32)(f64 * 2147483647.5); + memcpy(dst, (wuff_uint8 *)&i32 + offset, head); + src += 8; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&f64, src + i * 8, 8); + i32 = (wuff_sint32)(f64 * 2147483647.5); + memcpy(dst + i * 4, &i32, 4); + } + + if (tail != 0) + { + memcpy(&f64, src + samples * 8, 8); + i32 = (wuff_sint32)(f64 * 2147483647.5); + memcpy(dst + samples * 4, &i32, tail); + } +} + +WUFF_CONV_FUNC(wuff_float64_to_float32) +{ + double f64; + float f32; + size_t i; + + if (head != 0) + { + memcpy(&f64, src, 8); + f32 = (float)f64; + memcpy(dst, (wuff_uint8 *)&f32 + offset, head); + src += 8; + dst += head; + } + + for (i = 0; i < samples; i++) + { + memcpy(&f64, src + i * 8, 8); + f32 = (float)f64; + memcpy(dst + i * 4, &f32, 4); + } + + if (tail != 0) + { + memcpy(&f64, src + samples * 8, 8); + f32 = (float)f64; + memcpy(dst + samples * 4, &f32, tail); + } +} + +WUFF_CONV_FUNC(wuff_float64_to_float64) +{ + memcpy(dst, src + offset, samples * 8 + head + tail); +} diff --git a/jni/love/src/libraries/Wuff/wuff_convert.h b/jni/love/src/libraries/Wuff/wuff_convert.h new file mode 100644 index 00000000..280973d2 --- /dev/null +++ b/jni/love/src/libraries/Wuff/wuff_convert.h @@ -0,0 +1,48 @@ +#ifndef WUFF_CONVERT_H +#define WUFF_CONVERT_H + +#define WUFF_CONV_FUNC(name) WUFF_INTERN_API void name(wuff_uint8 * dst, wuff_uint8 * src, size_t samples, wuff_uint8 offset, wuff_uint8 head, wuff_uint8 tail) + +WUFF_CONV_FUNC(wuff_int8_to_int8); +WUFF_CONV_FUNC(wuff_int8_to_int16); +WUFF_CONV_FUNC(wuff_int8_to_int24); +WUFF_CONV_FUNC(wuff_int8_to_int32); +WUFF_CONV_FUNC(wuff_int8_to_float32); +WUFF_CONV_FUNC(wuff_int8_to_float64); + +WUFF_CONV_FUNC(wuff_int16_to_int8); +WUFF_CONV_FUNC(wuff_int16_to_int16); +WUFF_CONV_FUNC(wuff_int16_to_int24); +WUFF_CONV_FUNC(wuff_int16_to_int32); +WUFF_CONV_FUNC(wuff_int16_to_float32); +WUFF_CONV_FUNC(wuff_int16_to_float64); + +WUFF_CONV_FUNC(wuff_int24_to_int8); +WUFF_CONV_FUNC(wuff_int24_to_int16); +WUFF_CONV_FUNC(wuff_int24_to_int24); +WUFF_CONV_FUNC(wuff_int24_to_int32); +WUFF_CONV_FUNC(wuff_int24_to_float32); +WUFF_CONV_FUNC(wuff_int24_to_float64); + +WUFF_CONV_FUNC(wuff_int32_to_int8); +WUFF_CONV_FUNC(wuff_int32_to_int16); +WUFF_CONV_FUNC(wuff_int32_to_int24); +WUFF_CONV_FUNC(wuff_int32_to_int32); +WUFF_CONV_FUNC(wuff_int32_to_float32); +WUFF_CONV_FUNC(wuff_int32_to_float64); + +WUFF_CONV_FUNC(wuff_float32_to_int8); +WUFF_CONV_FUNC(wuff_float32_to_int16); +WUFF_CONV_FUNC(wuff_float32_to_int24); +WUFF_CONV_FUNC(wuff_float32_to_int32); +WUFF_CONV_FUNC(wuff_float32_to_float32); +WUFF_CONV_FUNC(wuff_float32_to_float64); + +WUFF_CONV_FUNC(wuff_float64_to_int8); +WUFF_CONV_FUNC(wuff_float64_to_int16); +WUFF_CONV_FUNC(wuff_float64_to_int24); +WUFF_CONV_FUNC(wuff_float64_to_int32); +WUFF_CONV_FUNC(wuff_float64_to_float32); +WUFF_CONV_FUNC(wuff_float64_to_float64); + +#endif /* WUFF_CONVERT_H */ diff --git a/jni/love/src/libraries/Wuff/wuff_internal.c b/jni/love/src/libraries/Wuff/wuff_internal.c new file mode 100644 index 00000000..e4813329 --- /dev/null +++ b/jni/love/src/libraries/Wuff/wuff_internal.c @@ -0,0 +1,540 @@ +#include +#include + +#include "wuff_config.h" +#include "wuff.h" +#include "wuff_internal.h" +#include "wuff_convert.h" + + +wuff_sint32 wuff_setup(struct wuff_handle * handle) +{ + wuff_sint32 wuff_status; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + + wuff_status = wuff_init_stream(handle); + WUFF_STATUS_BAIL() + + /* Allocating the buffer for the handle requires information from the stream. */ + wuff_status = wuff_buffer_alloc(handle); + WUFF_STATUS_BAIL() + + /* The output format defaults to the stream format. */ + wuff_status = wuff_format(handle, handle->stream.format); + WUFF_STATUS_BAIL() + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_cleanup(struct wuff_handle * handle) +{ + if (handle == NULL) + return WUFF_INVALID_PARAM; + + if (handle->buffer.data != NULL) + wuff_free(handle->buffer.data); + wuff_free(handle); + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_set_output_format(struct wuff_handle * handle, wuff_uint16 format) +{ + wuff_uint16 bits; + wuff_uint16 stream_format; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + else if (format >= WUFF_FORMAT_MAX) + return WUFF_FORMAT_UNSUPPORTED; + + stream_format = handle->stream.format; + + switch (format) + { + case WUFF_FORMAT_PCM_U8: + bits = 8; + switch (stream_format) + { + case WUFF_FORMAT_PCM_U8: + handle->output.function = wuff_int8_to_int8; + break; + case WUFF_FORMAT_PCM_S16: + handle->output.function = wuff_int16_to_int8; + break; + case WUFF_FORMAT_PCM_S24: + handle->output.function = wuff_int24_to_int8; + break; + case WUFF_FORMAT_PCM_S32: + handle->output.function = wuff_int32_to_int8; + break; + case WUFF_FORMAT_IEEE_FLOAT_32: + handle->output.function = wuff_float32_to_int8; + break; + case WUFF_FORMAT_IEEE_FLOAT_64: + handle->output.function = wuff_float64_to_int8; + break; + } + break; + case WUFF_FORMAT_PCM_S16: + bits = 16; + switch (stream_format) + { + case WUFF_FORMAT_PCM_U8: + handle->output.function = wuff_int8_to_int16; + break; + case WUFF_FORMAT_PCM_S16: + handle->output.function = wuff_int16_to_int16; + break; + case WUFF_FORMAT_PCM_S24: + handle->output.function = wuff_int24_to_int16; + break; + case WUFF_FORMAT_PCM_S32: + handle->output.function = wuff_int32_to_int16; + break; + case WUFF_FORMAT_IEEE_FLOAT_32: + handle->output.function = wuff_float32_to_int16; + break; + case WUFF_FORMAT_IEEE_FLOAT_64: + handle->output.function = wuff_float64_to_int16; + break; + } + break; + case WUFF_FORMAT_PCM_S24: + bits = 24; + switch (stream_format) + { + case WUFF_FORMAT_PCM_U8: + handle->output.function = wuff_int8_to_int24; + break; + case WUFF_FORMAT_PCM_S16: + handle->output.function = wuff_int16_to_int24; + break; + case WUFF_FORMAT_PCM_S24: + handle->output.function = wuff_int24_to_int24; + break; + case WUFF_FORMAT_PCM_S32: + handle->output.function = wuff_int32_to_int24; + break; + case WUFF_FORMAT_IEEE_FLOAT_32: + handle->output.function = wuff_float32_to_int24; + break; + case WUFF_FORMAT_IEEE_FLOAT_64: + handle->output.function = wuff_float64_to_int24; + break; + } + break; + case WUFF_FORMAT_PCM_S32: + bits = 32; + switch (stream_format) + { + case WUFF_FORMAT_PCM_U8: + handle->output.function = wuff_int8_to_int32; + break; + case WUFF_FORMAT_PCM_S16: + handle->output.function = wuff_int16_to_int32; + break; + case WUFF_FORMAT_PCM_S24: + handle->output.function = wuff_int24_to_int32; + break; + case WUFF_FORMAT_PCM_S32: + handle->output.function = wuff_int32_to_int32; + break; + case WUFF_FORMAT_IEEE_FLOAT_32: + handle->output.function = wuff_float32_to_int32; + break; + case WUFF_FORMAT_IEEE_FLOAT_64: + handle->output.function = wuff_float64_to_int32; + break; + } + break; + case WUFF_FORMAT_IEEE_FLOAT_32: + bits = 32; + switch (stream_format) + { + case WUFF_FORMAT_PCM_U8: + handle->output.function = wuff_int8_to_float32; + break; + case WUFF_FORMAT_PCM_S16: + handle->output.function = wuff_int16_to_float32; + break; + case WUFF_FORMAT_PCM_S24: + handle->output.function = wuff_int24_to_float32; + break; + case WUFF_FORMAT_PCM_S32: + handle->output.function = wuff_int32_to_float32; + break; + case WUFF_FORMAT_IEEE_FLOAT_32: + handle->output.function = wuff_float32_to_float32; + break; + case WUFF_FORMAT_IEEE_FLOAT_64: + handle->output.function = wuff_float64_to_float32; + break; + } + break; + case WUFF_FORMAT_IEEE_FLOAT_64: + bits = 64; + switch (stream_format) + { + case WUFF_FORMAT_PCM_U8: + handle->output.function = wuff_int8_to_float64; + break; + case WUFF_FORMAT_PCM_S16: + handle->output.function = wuff_int16_to_float64; + break; + case WUFF_FORMAT_PCM_S24: + handle->output.function = wuff_int24_to_float64; + break; + case WUFF_FORMAT_PCM_S32: + handle->output.function = wuff_int32_to_float64; + break; + case WUFF_FORMAT_IEEE_FLOAT_32: + handle->output.function = wuff_float32_to_float64; + break; + case WUFF_FORMAT_IEEE_FLOAT_64: + handle->output.function = wuff_float64_to_float64; + break; + } + break; + default: + return WUFF_FORMAT_UNSUPPORTED; + } + + handle->output.format = format; + handle->output.bytes_per_sample = bits / 8; + handle->output.block_size = handle->stream.header.channels * (bits / 8); + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_check_bits(wuff_uint16 bits, wuff_uint16 * format) +{ + if (*format == WUFF_FORMAT_PCM) + { + switch (bits) + { + case 8: + *format = WUFF_FORMAT_PCM_U8; + break; + case 16: + *format = WUFF_FORMAT_PCM_S16; + break; + case 24: + *format = WUFF_FORMAT_PCM_S24; + break; + case 32: + *format = WUFF_FORMAT_PCM_S32; + break; + default: + return WUFF_FORMAT_UNSUPPORTED; + } + } + else if (*format == WUFF_FORMAT_IEEE_FLOAT) + { + switch (bits) + { + case 32: + *format = WUFF_FORMAT_IEEE_FLOAT_32; + break; + case 64: + *format = WUFF_FORMAT_IEEE_FLOAT_64; + break; + default: + return WUFF_FORMAT_UNSUPPORTED; + } + } + else + { + return WUFF_FORMAT_UNSUPPORTED; + } + + return WUFF_SUCCESS; +} + +size_t wuff_calculate_samples(size_t target_size, wuff_uint8 sample_size, wuff_uint8 * head, wuff_uint8 * tail) +{ + size_t samples = 0; + + if (*head != 0) + { + if (target_size <= *head) + { + *head = (wuff_uint8)target_size; + *tail = 0; + return 1; + } + target_size -= *head; + ++samples; + } + + samples = target_size / sample_size; + *tail = target_size % sample_size; + if (*tail != 0) + ++samples; + return samples; +} + +wuff_sint32 wuff_init_stream(struct wuff_handle * handle) +{ + /* Allocate some space on the stack. */ + /* No need to do dynamic allocation for simple header probing. */ + wuff_uint8 buffer[WUFF_HEADER_FETCH_SIZE]; + size_t buffer_size = WUFF_HEADER_FETCH_SIZE; + wuff_uint64 search_offset; + struct wuff_chunk_header chunk; + wuff_sint32 wuff_status; + + wuff_status = handle->callback->read(handle->userdata, buffer, &buffer_size); + WUFF_STATUS_BAIL() + else if (buffer_size < WUFF_STREAM_MIN_SIZE) + return WUFF_STREAM_NOT_RIFF; + + /* Check for RIFF signature. */ + wuff_copy_chunk_header_data(&chunk, buffer); + if (chunk.id != WUFF_RIFF_CHUNK_ID) + return WUFF_STREAM_NOT_RIFF; + handle->stream.size = chunk.size; + + /* Check for WAVE format. */ + wuff_copy_chunk_header_data(&chunk, buffer + 8); + if (chunk.id != WUFF_WAVE_CHUNK_ID) + return WUFF_STREAM_NOT_WAVE; + + /* Search fmt chunk. */ + wuff_copy_chunk_header_data(&chunk, buffer + 12); + search_offset = 12; + if (chunk.id != WUFF_FORMAT_CHUNK_ID) + { + chunk.id = 0; + /* The fmt chunk must appear before the data chunk. */ + wuff_status = wuff_search_chunk(handle, &chunk, &search_offset, WUFF_FORMAT_CHUNK_ID, WUFF_DATA_CHUNK_ID); + if (wuff_status == WUFF_STREAM_CHUNK_NOT_FOUND) + return WUFF_STREAM_FORMAT_CHUNK_MISSING; + else WUFF_STATUS_BAIL() + + /* In case the fmt chunk is not the first chunk, align it on the stack buffer as if it were. */ + buffer_size = WUFF_HEADER_FETCH_SIZE - 20; + wuff_status = handle->callback->read(handle->userdata, buffer + 20, &buffer_size); + WUFF_STATUS_BAIL() + /* EOF bail. */ + else if (buffer_size < WUFF_HEADER_MIN_SIZE) + return WUFF_STREAM_INVALID; + } + + /* Extract header information. */ + handle->stream.header.size = chunk.size; + handle->stream.header.offset = search_offset + 8; + handle->stream.header.format = wuff_get_uint16(buffer + 20); + handle->stream.header.channels = wuff_get_uint16(buffer + 22); + handle->stream.header.sample_rate = wuff_get_uint32(buffer + 24); + handle->stream.header.bits_per_sample = wuff_get_uint16(buffer + 34); + handle->stream.header.bytes_per_sample = handle->stream.header.bits_per_sample / 8; + handle->stream.header.block_size = handle->stream.header.channels * handle->stream.header.bytes_per_sample; + + /* Bail on invalid streams. */ + if (handle->stream.header.channels == 0) + return WUFF_STREAM_ZERO_CHANNELS; + else if (handle->stream.header.sample_rate == 0) + return WUFF_STREAM_ZERO_SAMPLE_RATE; + else if (handle->stream.header.bits_per_sample == 0) + return WUFF_STREAM_ZERO_BITS_PER_SAMPLE; + + /* Grab the format from the extended header. */ + if (handle->stream.header.size > WUFF_HEADER_MIN_SIZE && wuff_get_uint16(buffer + 36) == 22) + { + if (handle->stream.header.format == WUFF_FORMAT_EXTENSIBLE) + handle->stream.header.format = wuff_get_uint16(buffer + 44); + } + + /* The check if this format is actually supported. */ + handle->stream.format = handle->stream.header.format; + wuff_status = wuff_check_bits(handle->stream.header.bits_per_sample, &handle->stream.format); + WUFF_STATUS_BAIL() + + /* The search for the data chunk begins. */ + wuff_copy_chunk_header_data(&chunk, buffer + 20 + handle->stream.header.size); + search_offset = handle->stream.header.offset + handle->stream.header.size; + wuff_status = wuff_search_chunk(handle, &chunk, &search_offset, WUFF_DATA_CHUNK_ID, 0); + if (wuff_status == WUFF_STREAM_CHUNK_NOT_FOUND) + return WUFF_STREAM_DATA_CHUNK_MISSING; + else WUFF_STATUS_BAIL() + + handle->stream.data.size = chunk.size; + handle->stream.data.offset = search_offset + 8; + handle->stream.length = handle->stream.data.size / handle->stream.header.channels / handle->stream.header.bytes_per_sample; + handle->stream.position = 0; + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_search_chunk(struct wuff_handle * handle, struct wuff_chunk_header * chunk, wuff_uint64 * offset, wuff_uint32 id, wuff_uint32 stop_id) +{ + wuff_uint8 buffer[8]; + wuff_uint64 search_offset; + size_t buffer_size; + wuff_sint32 wuff_status = 0; + + if (chunk->id != 0 && chunk->id == id) + return WUFF_SUCCESS; + + /* Copy the current file position. */ + search_offset = *offset; + + while (wuff_status >= 0) + { + search_offset += 8 + chunk->size; + /* FIXME: Non-compliant RIFFs may not pad to WORD alignment. What now? */ + if (search_offset & 1) + search_offset++; + + wuff_status = handle->callback->seek(handle->userdata, search_offset); + WUFF_STATUS_BAIL() + /*else if (wuff_status == WUFF_CALLBACK_EOF) + return WUFF_STREAM_CHUNK_NOT_FOUND;*/ + + buffer_size = 8; + wuff_status = handle->callback->read(handle->userdata, buffer, &buffer_size); + WUFF_STATUS_BAIL() + + wuff_copy_chunk_header_data(chunk, buffer); + /* Bail if we're at the EOF or the stop id. */ + if (buffer_size < 8 || (stop_id != 0 && chunk->id == stop_id)) + return WUFF_STREAM_CHUNK_NOT_FOUND; + else if (chunk->id == id) + break; + } + + /* Report chunk offset. */ + *offset = search_offset; + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_buffer_alloc(struct wuff_handle * handle) +{ + wuff_sint32 wuff_status; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + + /* Try to allocate a buffer for 0.25 seconds, but clamp at some minimum and maximum value. */ + handle->buffer.size = handle->stream.header.sample_rate * handle->stream.header.block_size / 4; + if (handle->buffer.size < WUFF_BUFFER_MIN_SIZE) + handle->buffer.size = WUFF_BUFFER_MIN_SIZE; + else if (handle->buffer.size > WUFF_BUFFER_MAX_SIZE) + handle->buffer.size = WUFF_BUFFER_MAX_SIZE; + + handle->buffer.data = wuff_alloc(handle->buffer.size); + if (handle->buffer.data == NULL) + return WUFF_MEMALLOC_ERROR; + + /* Just in case, let's null the offsets. */ + wuff_status = wuff_buffer_clear(handle); + WUFF_STATUS_BAIL() + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_buffer_clear(struct wuff_handle * handle) +{ + wuff_uint64 position; + wuff_sint32 wuff_status; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + + wuff_status = handle->callback->tell(handle->userdata, &position); + WUFF_STATUS_BAIL() + + if (position < handle->stream.data.offset || position > handle->stream.data.offset + handle->stream.data.size) + return WUFF_BUFFER_INVALID_STREAM_POSITION; + + handle->buffer.bytes_left = handle->stream.data.size - (position - handle->stream.data.offset); + handle->buffer.offset = 0; + handle->buffer.end = 0; + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_buffer_fill(struct wuff_handle * handle) +{ + size_t bytes_in_buffer; + size_t bytes_to_read; + wuff_sint32 wuff_status; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + + /* Check if there are bytes in the buffer and move them to the start of the buffer. */ + /* Probably not the most efficient way. Think on it some more! */ + bytes_in_buffer = handle->buffer.end - handle->buffer.offset; + + if (bytes_in_buffer == handle->buffer.size) + return WUFF_SUCCESS; + else if (bytes_in_buffer > 0) + memmove(handle->buffer.data, handle->buffer.data + handle->buffer.offset, bytes_in_buffer); + + bytes_to_read = handle->buffer.size - bytes_in_buffer; + if (bytes_to_read > handle->buffer.bytes_left) + bytes_to_read = (size_t)handle->buffer.bytes_left; + + wuff_status = handle->callback->read(handle->userdata, handle->buffer.data + bytes_in_buffer, &bytes_to_read); + WUFF_STATUS_BAIL() + + handle->buffer.offset = 0; + handle->buffer.end = bytes_in_buffer + bytes_to_read; + handle->buffer.bytes_left -= bytes_to_read; + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_buffer_release(struct wuff_handle * handle, size_t samples) +{ + size_t size; + + if (handle == NULL) + return WUFF_INVALID_PARAM; + + size = samples * handle->stream.header.bytes_per_sample; + + /* Check for an attempt to release more samples than the buffer could hold. */ + /* "This should never happen." Let's throw an error anyway in case.*/ + if (size > handle->buffer.end - handle->buffer.offset) + return WUFF_BUFFER_INVALID_SIZE; + + handle->buffer.offset += size; + + return WUFF_SUCCESS; +} + +wuff_sint32 wuff_buffer_request(struct wuff_handle * handle, wuff_uint8 ** buffer, size_t * samples) +{ + size_t request_samples = *samples; + size_t buffer_samples, size; + size_t bps = handle->stream.header.bytes_per_sample; + wuff_sint32 wuff_status; + + if (handle == NULL || buffer == NULL || samples == NULL) + return WUFF_INVALID_PARAM; + + /* Fill the buffer some more if the requested size is bigger than the current data in the buffer. */ + size = request_samples * bps; + if (size > handle->buffer.end - handle->buffer.offset) + { + wuff_status = wuff_buffer_fill(handle); + WUFF_STATUS_BAIL() + } + + buffer_samples = (handle->buffer.end - handle->buffer.offset) / bps; + + /* Report sample count change. */ + if (buffer_samples < request_samples) + *samples = buffer_samples; + + /* Report sample buffer start. */ + *buffer = handle->buffer.data + handle->buffer.offset; + + return WUFF_SUCCESS; +} diff --git a/jni/love/src/libraries/Wuff/wuff_internal.h b/jni/love/src/libraries/Wuff/wuff_internal.h new file mode 100644 index 00000000..2679cdbc --- /dev/null +++ b/jni/love/src/libraries/Wuff/wuff_internal.h @@ -0,0 +1,171 @@ +#ifndef WUFF_INTERNAL_H +#define WUFF_INTERNAL_H + +#define WUFF_BUFFER_MIN_SIZE 4096 +#define WUFF_BUFFER_MAX_SIZE 2097152 +#define WUFF_STREAM_MIN_SIZE 36 +#define WUFF_HEADER_MIN_SIZE 16 +#define WUFF_HEADER_FETCH_SIZE 80 + +#define WUFF_FORMAT_PCM 1 +#define WUFF_FORMAT_IEEE_FLOAT 3 +#define WUFF_FORMAT_EXTENSIBLE 0xFFFE + + +#define WUFF_RIFF_CHUNK_ID wuff_get_chunk_id("RIFF") +#define WUFF_WAVE_CHUNK_ID wuff_get_chunk_id("WAVE") +#define WUFF_FORMAT_CHUNK_ID wuff_get_chunk_id("fmt ") +#define WUFF_DATA_CHUNK_ID wuff_get_chunk_id("data") + +#define WUFF_STATUS_BAIL() if (wuff_status < 0) return wuff_status; + + +static WUFF_INLINE wuff_uint32 wuff_get_uint32(wuff_uint8 * data) +{ + return data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24); +} + +static WUFF_INLINE wuff_uint16 wuff_get_uint16(wuff_uint8 * data) +{ + return data[0] + (data[1] << 8); +} + +struct wuff_chunk_header +{ + wuff_uint32 id; + wuff_uint32 size; +}; + +static WUFF_INLINE wuff_uint32 wuff_get_chunk_id(const char txt[5]) +{ + const wuff_uint8 * id = (wuff_uint8*) txt; + wuff_uint32 int_id; + wuff_uint8 * id_bytes = (wuff_uint8 *)&int_id; + id_bytes[0] = id[0]; + id_bytes[1] = id[1]; + id_bytes[2] = id[2]; + id_bytes[3] = id[3]; + + return int_id; +} + +static WUFF_INLINE void wuff_copy_chunk_header_data(struct wuff_chunk_header * chunk, wuff_uint8 * data) +{ + wuff_uint8 * id = (wuff_uint8 *)&chunk->id; + id[0] = data[0]; + id[1] = data[1]; + id[2] = data[2]; + id[3] = data[3]; + + chunk->size = wuff_get_uint32(data + 4); +} + +struct wuff_stream_header +{ + wuff_uint64 size; + wuff_uint64 offset; + + wuff_uint16 format; + wuff_uint16 channels; + wuff_uint32 sample_rate; + wuff_uint16 bits_per_sample; + wuff_uint16 bytes_per_sample; + size_t block_size; +}; + +struct wuff_stream_data +{ + wuff_uint64 size; + wuff_uint64 offset; +}; + +struct wuff_buffer +{ + wuff_uint8 * data; + wuff_uint64 bytes_left; + size_t size; + size_t offset; + size_t end; +}; + +struct wuff_output +{ + wuff_uint16 format; + size_t bytes_per_sample; + size_t block_size; + size_t block_offset; + void (* function)(wuff_uint8 *, wuff_uint8 *, size_t, wuff_uint8, wuff_uint8, wuff_uint8); +}; + +struct wuff_stream +{ + wuff_uint64 size; + wuff_uint64 length; + wuff_uint16 format; + + wuff_uint64 position; + + struct wuff_stream_header header; + struct wuff_stream_data data; +}; + +struct wuff_handle +{ + struct wuff_stream stream; + struct wuff_buffer buffer; + struct wuff_output output; + struct wuff_callback * callback; + void * userdata; +}; + + +/* Initializes the stream, allocates the buffer, and sets the output format. */ +/* Expects a nulled wuff_handle and the callbacks set and ready. */ +WUFF_INTERN_API wuff_sint32 wuff_setup(struct wuff_handle * handle); + +/* Cleans the stream up, frees the buffer and the wuff_handle. */ +WUFF_INTERN_API wuff_sint32 wuff_cleanup(struct wuff_handle * handle); + +/* Called by wuff_setup. Initializes the stream by reading the data from the */ +/* callbacks, searching for headers and stream information. */ +WUFF_INTERN_API wuff_sint32 wuff_init_stream(struct wuff_handle * handle); + +/* Searches for a specific chunk id and stops before another if it's not 0. */ +/* If the id in wuff_chunk_header is not 0, it will be checked too and if */ +/* they match, then the function will return immediately. */ +/* Expects offset to point to the file position of a chunk and */ +/* wuff_chunk_header to have the size of this chunk. */ +WUFF_INTERN_API wuff_sint32 wuff_search_chunk(struct wuff_handle * handle, struct wuff_chunk_header * chunk, wuff_uint64 * offset, wuff_uint32 id, wuff_uint32 stop_id); + +/* Sets the output struct of the stream to the new format. */ +WUFF_INTERN_API wuff_sint32 wuff_set_output_format(struct wuff_handle * handle, wuff_uint16); + +/* Checks if the number of bits per samples is supported and writes the */ +/* output identifier to the 16-bit integer. */ +WUFF_INTERN_API wuff_sint32 wuff_check_bits(wuff_uint16 bits, wuff_uint16 * format); + +/* Calculates the number of samples that have to be requested from the buffer */ +/* by also taking the truncated samples at the start and end into account. */ +/* The return value is the number of samples needed. */ +WUFF_INTERN_API size_t wuff_calculate_samples(size_t target_size, wuff_uint8 sample_size, wuff_uint8 * head, wuff_uint8 * tail); + + +/* Allocates the buffer for the input stream. */ +/* Expects the stream to be initialized, as format information is needed. */ +WUFF_INTERN_API wuff_sint32 wuff_buffer_alloc(struct wuff_handle * handle); + +/* Fills the buffer with new data. */ +WUFF_INTERN_API wuff_sint32 wuff_buffer_fill(struct wuff_handle * handle); + +/* Marks all bytes in the buffer as free. */ +WUFF_INTERN_API wuff_sint32 wuff_buffer_clear(struct wuff_handle * handle); + +/* Requests samples and a pointer to them. */ +/* The number of samples may be lower than requested. */ +WUFF_INTERN_API wuff_sint32 wuff_buffer_request(struct wuff_handle * handle, wuff_uint8 ** buffer, size_t * samples); + +/* Releases the number of samples from the buffer. */ +WUFF_INTERN_API wuff_sint32 wuff_buffer_release(struct wuff_handle * handle, size_t samples); + + +#endif /* WUFF_INTERNAL_H */ diff --git a/jni/love/src/libraries/Wuff/wuff_memory.c b/jni/love/src/libraries/Wuff/wuff_memory.c new file mode 100644 index 00000000..eaffa4e6 --- /dev/null +++ b/jni/love/src/libraries/Wuff/wuff_memory.c @@ -0,0 +1,17 @@ +#include + +#include "wuff_config.h" + +/* Default memory allocators. */ +/* They can be overridden with custom functions at build time. */ +#ifndef WUFF_MEMALLOC_OVERRIDE +void * wuff_alloc(size_t size) +{ + return malloc(size); +} + +void wuff_free(void * mem) +{ + free(mem); +} +#endif diff --git a/jni/love/src/libraries/ddsparse/ddsinfo.h b/jni/love/src/libraries/ddsparse/ddsinfo.h new file mode 100644 index 00000000..59760d0f --- /dev/null +++ b/jni/love/src/libraries/ddsparse/ddsinfo.h @@ -0,0 +1,235 @@ +/** + * Simple DDS data parser for compressed 2D textures. + * + * Copyright (c) 2013 Alexander Szpakowski. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * + * Enums and structs copied from Microsoft. + * http://msdn.microsoft.com/en-us/library/bb943991.aspx + **/ + +#ifndef DDS_INFO_H +#define DDS_INFO_H + +#include + +namespace dds +{ +namespace dxinfo +{ + +enum DDPF +{ + DDPF_ALPHAPIXELS = 0x000001, + DDPF_ALPHA = 0x000002, + DDPF_FOURCC = 0x000004, + DDPF_RGB = 0x000040, + DDPF_YUV = 0x000200, + DDPF_LUMINANCE = 0x020000 +}; + +enum D3D10ResourceDimension +{ + D3D10_RESOURCE_DIMENSION_UNKNOWN = 0, + D3D10_RESOURCE_DIMENSION_BUFFER = 1, + D3D10_RESOURCE_DIMENSION_TEXTURE1D = 2, + D3D10_RESOURCE_DIMENSION_TEXTURE2D = 3, + D3D10_RESOURCE_DIMENSION_TEXTURE3D = 4 +}; + +enum DXGIFormat +{ + DXGI_FORMAT_UNKNOWN = 0, + + DXGI_FORMAT_R32G32B32A32_TYPELESS = 1, + DXGI_FORMAT_R32G32B32A32_FLOAT = 2, + DXGI_FORMAT_R32G32B32A32_UINT = 3, + DXGI_FORMAT_R32G32B32A32_SINT = 4, + + DXGI_FORMAT_R32G32B32_TYPELESS = 5, + DXGI_FORMAT_R32G32B32_FLOAT = 6, + DXGI_FORMAT_R32G32B32_UINT = 7, + DXGI_FORMAT_R32G32B32_SINT = 8, + + DXGI_FORMAT_R16G16B16A16_TYPELESS = 9, + DXGI_FORMAT_R16G16B16A16_FLOAT = 10, + DXGI_FORMAT_R16G16B16A16_UNORM = 11, + DXGI_FORMAT_R16G16B16A16_UINT = 12, + DXGI_FORMAT_R16G16B16A16_SNORM = 13, + DXGI_FORMAT_R16G16B16A16_SINT = 14, + + DXGI_FORMAT_R32G32_TYPELESS = 15, + DXGI_FORMAT_R32G32_FLOAT = 16, + DXGI_FORMAT_R32G32_UINT = 17, + DXGI_FORMAT_R32G32_SINT = 18, + + DXGI_FORMAT_R32G8X24_TYPELESS = 19, + DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20, + DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21, + DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22, + + DXGI_FORMAT_R10G10B10A2_TYPELESS = 23, + DXGI_FORMAT_R10G10B10A2_UNORM = 24, + DXGI_FORMAT_R10G10B10A2_UINT = 25, + + DXGI_FORMAT_R11G11B10_FLOAT = 26, + + DXGI_FORMAT_R8G8B8A8_TYPELESS = 27, + DXGI_FORMAT_R8G8B8A8_UNORM = 28, + DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29, + DXGI_FORMAT_R8G8B8A8_UINT = 30, + DXGI_FORMAT_R8G8B8A8_SNORM = 31, + DXGI_FORMAT_R8G8B8A8_SINT = 32, + + DXGI_FORMAT_R16G16_TYPELESS = 33, + DXGI_FORMAT_R16G16_FLOAT = 34, + DXGI_FORMAT_R16G16_UNORM = 35, + DXGI_FORMAT_R16G16_UINT = 36, + DXGI_FORMAT_R16G16_SNORM = 37, + DXGI_FORMAT_R16G16_SINT = 38, + + DXGI_FORMAT_R32_TYPELESS = 39, + DXGI_FORMAT_D32_FLOAT = 40, + DXGI_FORMAT_R32_FLOAT = 41, + DXGI_FORMAT_R32_UINT = 42, + DXGI_FORMAT_R32_SINT = 43, + + DXGI_FORMAT_R24G8_TYPELESS = 44, + DXGI_FORMAT_D24_UNORM_S8_UINT = 45, + DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46, + DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47, + + DXGI_FORMAT_R8G8_TYPELESS = 48, + DXGI_FORMAT_R8G8_UNORM = 49, + DXGI_FORMAT_R8G8_UINT = 50, + DXGI_FORMAT_R8G8_SNORM = 51, + DXGI_FORMAT_R8G8_SINT = 52, + + DXGI_FORMAT_R16_TYPELESS = 53, + DXGI_FORMAT_R16_FLOAT = 54, + DXGI_FORMAT_D16_UNORM = 55, + DXGI_FORMAT_R16_UNORM = 56, + DXGI_FORMAT_R16_UINT = 57, + DXGI_FORMAT_R16_SNORM = 58, + DXGI_FORMAT_R16_SINT = 59, + + DXGI_FORMAT_R8_TYPELESS = 60, + DXGI_FORMAT_R8_UNORM = 61, + DXGI_FORMAT_R8_UINT = 62, + DXGI_FORMAT_R8_SNORM = 63, + DXGI_FORMAT_R8_SINT = 64, + DXGI_FORMAT_A8_UNORM = 65, + + DXGI_FORMAT_R1_UNORM = 66, + + DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67, + + DXGI_FORMAT_R8G8_B8G8_UNORM = 68, + DXGI_FORMAT_G8R8_G8B8_UNORM = 69, + + DXGI_FORMAT_BC1_TYPELESS = 70, + DXGI_FORMAT_BC1_UNORM = 71, + DXGI_FORMAT_BC1_UNORM_SRGB = 72, + + DXGI_FORMAT_BC2_TYPELESS = 73, + DXGI_FORMAT_BC2_UNORM = 74, + DXGI_FORMAT_BC2_UNORM_SRGB = 75, + + DXGI_FORMAT_BC3_TYPELESS = 76, + DXGI_FORMAT_BC3_UNORM = 77, + DXGI_FORMAT_BC3_UNORM_SRGB = 78, + + DXGI_FORMAT_BC4_TYPELESS = 79, + DXGI_FORMAT_BC4_UNORM = 80, + DXGI_FORMAT_BC4_SNORM = 81, + + DXGI_FORMAT_BC5_TYPELESS = 82, + DXGI_FORMAT_BC5_UNORM = 83, + DXGI_FORMAT_BC5_SNORM = 84, + + DXGI_FORMAT_B5G6R5_UNORM = 85, + DXGI_FORMAT_B5G5R5A1_UNORM = 86, + DXGI_FORMAT_B8G8R8A8_UNORM = 87, + DXGI_FORMAT_B8G8R8X8_UNORM = 88, + + DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89, + DXGI_FORMAT_B8G8R8A8_TYPELESS = 90, + DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91, + DXGI_FORMAT_B8G8R8X8_TYPELESS = 92, + DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93, + + DXGI_FORMAT_BC6H_TYPELESS = 94, + DXGI_FORMAT_BC6H_UF16 = 95, + DXGI_FORMAT_BC6H_SF16 = 96, + + DXGI_FORMAT_BC7_TYPELESS = 97, + DXGI_FORMAT_BC7_UNORM = 98, + DXGI_FORMAT_BC7_UNORM_SRGB = 99, + + DXGI_FORMAT_FORCE_UINT = 0xffffffffUL +}; + +struct DDSPixelFormat +{ + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t rgbBitCount; + uint32_t rBitMask; + uint32_t gBitMask; + uint32_t bBitMask; + uint32_t aBitMask; +}; + +struct DDSHeader +{ + uint32_t size; + uint32_t flags; + uint32_t height; + uint32_t width; + uint32_t pitchOrLinearSize; + uint32_t depth; + uint32_t mipMapCount; + uint32_t reserved[11]; + + DDSPixelFormat format; + + uint32_t caps1; + uint32_t caps2; + uint32_t caps3; + uint32_t caps4; + uint32_t reserved2; +}; + +struct DDSHeader10 +{ + DXGIFormat dxgiFormat; + D3D10ResourceDimension resourceDimension; + + uint32_t miscFlag; + uint32_t arraySize; + uint32_t reserved; +}; + +} // dxinfo +} // dds + +#endif // DDS_INFO_H diff --git a/jni/love/src/libraries/ddsparse/ddsparse.cpp b/jni/love/src/libraries/ddsparse/ddsparse.cpp new file mode 100644 index 00000000..590d665c --- /dev/null +++ b/jni/love/src/libraries/ddsparse/ddsparse.cpp @@ -0,0 +1,356 @@ +/** + * Simple DDS data parser for compressed 2D textures. + * + * Copyright (c) 2013 Alexander Szpakowski. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + **/ + +#include "ddsparse.h" +#include "ddsinfo.h" + +#include + +namespace dds +{ + +using namespace dds::dxinfo; + +// Creates a packed uint representation of a FourCC code. +#define MakeFourCC(a, b, c, d) ((uint32_t) (((d)<<24) | ((c)<<16) | ((b)<<8) | (a))) + +// Translate the old DDS format to our own. +static Format parseDDSFormat(const DDSPixelFormat &fmt) +{ + if ((fmt.flags & DDPF_FOURCC) == 0) + return FORMAT_UNKNOWN; + + Format f = FORMAT_UNKNOWN; + + switch (fmt.fourCC) + { + case MakeFourCC('D','X','T','1'): + f = FORMAT_DXT1; + break; + case MakeFourCC('D','X','T','3'): + f = FORMAT_DXT3; + break; + case MakeFourCC('D','X','T','5'): + f = FORMAT_DXT5; + break; + case MakeFourCC('A','T','I','1'): + case MakeFourCC('B','C','4','U'): + f = FORMAT_BC4; + break; + case MakeFourCC('B','C','4','S'): + f = FORMAT_BC4s; + break; + case MakeFourCC('A','T','I','2'): + case MakeFourCC('B','C','5','U'): + f = FORMAT_BC5; + break; + case MakeFourCC('B','C','5','S'): + f = FORMAT_BC5s; + break; + default: + break; + } + + return f; +} + +// Translate the new DX10 formats to our own. +static Format parseDX10Format(DXGIFormat fmt) +{ + Format f = FORMAT_UNKNOWN; + + switch (fmt) + { + case DXGI_FORMAT_BC1_TYPELESS: + case DXGI_FORMAT_BC1_UNORM: + case DXGI_FORMAT_BC1_UNORM_SRGB: + f = FORMAT_DXT1; + break; + case DXGI_FORMAT_BC2_TYPELESS: + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: + f = FORMAT_DXT3; + break; + case DXGI_FORMAT_BC3_TYPELESS: + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: + f = FORMAT_DXT5; + break; + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_UNORM: + f = FORMAT_BC4; + break; + case DXGI_FORMAT_BC4_SNORM: + f = FORMAT_BC4s; + break; + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_UNORM: + f = FORMAT_BC5; + break; + case DXGI_FORMAT_BC5_SNORM: + f = FORMAT_BC5s; + break; + case DXGI_FORMAT_BC6H_TYPELESS: + case DXGI_FORMAT_BC6H_UF16: + f = FORMAT_BC6H; + break; + case DXGI_FORMAT_BC6H_SF16: + f = FORAMT_BC6Hs; + break; + case DXGI_FORMAT_BC7_TYPELESS: + case DXGI_FORMAT_BC7_UNORM: + f = FORMAT_BC7; + break; + case DXGI_FORMAT_BC7_UNORM_SRGB: + f = FORMAT_BC7srgb; + break; + default: + break; + } + + return f; +} + +bool isDDS(const void *data, size_t dataSize) +{ + const uint8_t *readData = (const uint8_t *) data; + ptrdiff_t offset = 0; + + // Is the data large enough to hold the DDS header? + if(dataSize < sizeof(uint32_t) + sizeof(DDSHeader)) + return false; + + // All DDS files start with "DDS ". + if((*(uint32_t *) readData) != MakeFourCC('D','D','S',' ')) + return false; + + offset += sizeof(uint32_t); + + DDSHeader *header = (DDSHeader *) &readData[offset]; + + + // Verify header to validate DDS data. + if (header->size != sizeof(DDSHeader) || header->format.size != sizeof(DDSPixelFormat)) + return false; + + offset += sizeof(DDSHeader); + + // Check for DX10 extension. + if ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == MakeFourCC('D','X','1','0'))) + { + // Data must be big enough for both headers plus the magic value. + if (dataSize < (sizeof(uint32_t) + sizeof(DDSHeader) + sizeof(DDSHeader10))) + return false; + } + + return true; +} + +bool isCompressedDDS(const void *data, size_t dataSize) +{ + if (!isDDS(data, dataSize)) + return false; + + const uint8_t *readData = (const uint8_t *) data; + ptrdiff_t offset = sizeof(uint32_t); + + DDSHeader *header = (DDSHeader *) &readData[offset]; + offset += sizeof(DDSHeader); + + // Check for DX10 extension. + if ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == MakeFourCC('D','X','1','0'))) + { + DDSHeader10 *header10 = (DDSHeader10 *) &readData[offset]; + return parseDX10Format(header10->dxgiFormat) != FORMAT_UNKNOWN; + } + + return parseDDSFormat(header->format) != FORMAT_UNKNOWN; +} + +Parser::Parser(const void *data, size_t dataSize) + : format(FORMAT_UNKNOWN) +{ + parseData(data, dataSize); +} + +Parser::Parser(const Parser &other) + : texData(other.texData) + , format(other.format) +{ +} + +Parser::Parser() + : format(FORMAT_UNKNOWN) +{ +} + +Parser &Parser::operator = (const Parser &other) +{ + texData = other.texData; + format = other.format; + + return *this; +} + +Parser::~Parser() +{ +} + +Format Parser::getFormat() const +{ + return format; +} + +const Image *Parser::getImageData(size_t miplevel) const +{ + if (miplevel >= texData.size()) + return 0; + + return &texData[miplevel]; +} + +size_t Parser::getMipmapCount() const +{ + return texData.size(); +} + +size_t Parser::parseImageSize(Format fmt, int width, int height) const +{ + size_t size = 0; + + switch (fmt) + { + case FORMAT_DXT1: + case FORMAT_DXT3: + case FORMAT_DXT5: + case FORMAT_BC5s: + case FORMAT_BC5: + case FORMAT_BC7: + case FORMAT_BC7srgb: + { + int numBlocksWide = 0; + if (width > 0) + numBlocksWide = std::max(1, (width + 3) / 4); + + int numBlocksHigh = 0; + if (height > 0) + numBlocksHigh = std::max(1, (height + 3) / 4); + + int numBytesPerBlock = (fmt == FORMAT_DXT1 ? 8 : 16); + + size = numBlocksWide * numBytesPerBlock * numBlocksHigh; + } + break; + default: + break; + } + + return size; +} + +bool Parser::parseTexData(const uint8_t *data, size_t dataSize, Format fmt, int w, int h, int mips) +{ + size_t offset = 0; + std::vector newTexData; + + for (int i = 0; i < mips; i++) + { + Image img; + img.width = w; + img.height = h; + + img.dataSize = parseImageSize(fmt, img.width, img.height); + + // Make sure the data size is valid. + if (img.dataSize == 0 || (offset + img.dataSize) > dataSize) + return false; + + // Store the memory address of the data representing this mip level. + img.data = &data[offset]; + + newTexData.push_back(img); + + // Move to the next mip level. + offset += img.dataSize; + + w = std::max(w / 2, 1); + h = std::max(h / 2, 1); + } + + texData = newTexData; + + return true; +} + +bool Parser::parseData(const void *data, size_t dataSize) +{ + if (!isDDS(data, dataSize)) + return false; + + const uint8_t *readData = (const uint8_t *) data; + ptrdiff_t offset = sizeof(uint32_t); + + DDSHeader *header = (DDSHeader *) &readData[offset]; + offset += sizeof(DDSHeader); + + + // Check for DX10 extension. + if ((header->format.flags & DDPF_FOURCC) && (header->format.fourCC == MakeFourCC('D','X','1','0'))) + { + DDSHeader10 *header10 = (DDSHeader10 *) &readData[offset]; + offset += sizeof(DDSHeader10); + + // We can't deal with 1D/3D textures. + switch (header10->resourceDimension) + { + case D3D10_RESOURCE_DIMENSION_TEXTURE2D: + case D3D10_RESOURCE_DIMENSION_UNKNOWN: + break; + default: + return false; + } + + // We also can't deal with texture arrays and cubemaps. + if (header10->arraySize > 1) + return false; + + format = parseDX10Format(header10->dxgiFormat); + } + else + format = parseDDSFormat(header->format); + + + if (format == FORMAT_UNKNOWN) + return false; + + + int w = header->width; + int h = header->height; + + int mips = std::max((int) header->mipMapCount, 1); + + return parseTexData(&readData[offset], dataSize - offset, format, w, h, mips); +} + +} // dds diff --git a/jni/love/src/libraries/ddsparse/ddsparse.h b/jni/love/src/libraries/ddsparse/ddsparse.h new file mode 100644 index 00000000..82c2c41c --- /dev/null +++ b/jni/love/src/libraries/ddsparse/ddsparse.h @@ -0,0 +1,137 @@ +/** + * Simple DDS data parser for compressed 2D textures. + * + * Copyright (c) 2013 Alexander Szpakowski. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + **/ + +#ifndef DDS_PARSE_H +#define DDS_PARSE_H + +#include +#include + +#include + +namespace dds +{ + +// Supported DDS formats. +// Formats with an 's' suffix have signed data. +enum Format +{ + FORMAT_DXT1, + FORMAT_DXT3, + FORMAT_DXT5, + FORMAT_BC4, + FORMAT_BC4s, + FORMAT_BC5, + FORMAT_BC5s, + FORMAT_BC6H, + FORAMT_BC6Hs, + FORMAT_BC7, + FORMAT_BC7srgb, // sRGB color space. + FORMAT_UNKNOWN +}; + +// Represents a single mipmap level of a texture. +struct Image +{ + int width; + int height; + size_t dataSize; + const uint8_t *data; + + Image() : width(0), height(0), dataSize(0), data(0) + {}; +}; + +/** + * Determines whether the input byte data represents a valid DDS file. + * Does not take into account whether the texture format is supported. + * + * @param data The byte data to parse. + * @param dataSize The size in bytes of the data. + **/ +bool isDDS(const void *data, size_t dataSize); + +/** + * Determines whether the input byte data represents a valid compressed DDS + * file. Takes into account texture format, but not type (3D textures, etc.) + * + * @param data The byte data to parse. + * @param dataSize The size in bytes of the data. + **/ +bool isCompressedDDS(const void *data, size_t dataSize); + +class Parser +{ +public: + + /** + * Constructor. + * Attempts to parse byte data as a compressed DDS file. + * + * @param data The byte data to parse. + * @param dataSize The size in bytes of the data. + **/ + Parser(const void *data, size_t dataSize); + Parser(const Parser &other); + Parser(); + + Parser &operator = (const Parser &other); + + ~Parser(); + + /** + * Gets the format of this texture. + **/ + Format getFormat() const; + + /** + * Gets the data of this texture at a mipmap level. Mipmap level 0 + * represents the base image. + * + * @param miplevel The mipmap level to get the data of. + * @return Pointer to the image data, or NULL if miplevel is not within the + * range of [0, numMipmaps). + **/ + const Image *getImageData(size_t miplevel = 0) const; + + /** + * Gets the number of mipmap levels in this texture. + * Includes the base mip level. + **/ + size_t getMipmapCount() const; + +private: + + size_t parseImageSize(Format fmt, int width, int height) const; + bool parseTexData(const uint8_t *data, size_t dataSize, Format fmt, int w, int h, int mips); + bool parseData(const void *data, size_t dataSize); + + std::vector texData; + Format format; + +}; // Parser + +} // dds + +#endif // DDS_PARSE_H diff --git a/jni/love/src/libraries/enet/enet.cpp b/jni/love/src/libraries/enet/enet.cpp new file mode 100644 index 00000000..836c166c --- /dev/null +++ b/jni/love/src/libraries/enet/enet.cpp @@ -0,0 +1,756 @@ +/** + * + * Copyright (C) 2011 by Leaf Corcoran + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include + +extern "C" { +#define LUA_COMPAT_ALL +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +#include +} + +#define check_host(l, idx)\ + *(ENetHost**)luaL_checkudata(l, idx, "enet_host") + +#define check_peer(l, idx)\ + *(ENetPeer**)luaL_checkudata(l, idx, "enet_peer") + +/** + * Parse address string, eg: + * *:5959 + * 127.0.0.1:* + * website.com:8080 + */ +static void parse_address(lua_State *l, const char *addr_str, ENetAddress *address) { + int host_i = 0, port_i = 0; + char host_str[128] = {0}; + char port_str[32] = {0}; + int scanning_port = 0; + + char *c = (char *)addr_str; + + while (*c != 0) { + if (host_i >= 128 || port_i >= 32 ) luaL_error(l, "Hostname too long"); + if (scanning_port) { + port_str[port_i++] = *c; + } else { + if (*c == ':') { + scanning_port = 1; + } else { + host_str[host_i++] = *c; + } + } + c++; + } + host_str[host_i] = '\0'; + port_str[port_i] = '\0'; + + if (host_i == 0) luaL_error(l, "Failed to parse address"); + if (port_i == 0) luaL_error(l, "Missing port in address"); + + if (strcmp("*", host_str) == 0) { + address->host = ENET_HOST_ANY; + } else { + if (enet_address_set_host(address, host_str) != 0) { + luaL_error(l, "Failed to resolve host name"); + } + } + + if (strcmp("*", port_str) == 0) { + address->port = ENET_PORT_ANY; + } else { + address->port = atoi(port_str); + } +} + +/** + * Find the index of a given peer for which we only have the pointer. + */ +size_t find_peer_index (lua_State *l, ENetHost *enet_host, ENetPeer *peer) { + size_t peer_index; + for (peer_index = 0; peer_index < enet_host->peerCount; peer_index++) { + if (peer == &(enet_host->peers[peer_index])) + return peer_index; + } + + luaL_error (l, "enet: could not find peer id!"); + + return peer_index; +} + +static void push_peer(lua_State *l, ENetPeer *peer) { + // try to find in peer table + lua_getfield(l, LUA_REGISTRYINDEX, "enet_peers"); + lua_pushlightuserdata(l, peer); + lua_gettable(l, -2); + + if (lua_isnil(l, -1)) { + // printf("creating new peer\n"); + lua_pop(l, 1); + + *(ENetPeer**)lua_newuserdata(l, sizeof(void*)) = peer; + luaL_getmetatable(l, "enet_peer"); + lua_setmetatable(l, -2); + + lua_pushlightuserdata(l, peer); + lua_pushvalue(l, -2); + + lua_settable(l, -4); + } + lua_remove(l, -2); // remove enet_peers +} + +static void push_event(lua_State *l, ENetEvent *event) { + lua_newtable(l); // event table + + if (event->peer) { + push_peer(l, event->peer); + lua_setfield(l, -2, "peer"); + } + + switch (event->type) { + case ENET_EVENT_TYPE_CONNECT: + lua_pushinteger(l, event->data); + lua_setfield(l, -2, "data"); + + lua_pushstring(l, "connect"); + break; + case ENET_EVENT_TYPE_DISCONNECT: + lua_pushinteger(l, event->data); + lua_setfield(l, -2, "data"); + + lua_pushstring(l, "disconnect"); + break; + case ENET_EVENT_TYPE_RECEIVE: + lua_pushlstring(l, (const char *)event->packet->data, event->packet->dataLength); + lua_setfield(l, -2, "data"); + + lua_pushinteger(l, event->channelID); + lua_setfield(l, -2, "channel"); + + lua_pushstring(l, "receive"); + + enet_packet_destroy(event->packet); + break; + case ENET_EVENT_TYPE_NONE: + lua_pushstring(l, "none"); + break; + } + + lua_setfield(l, -2, "type"); +} + +/** + * Read a packet off the stack as a string + * idx is position of string + */ +static ENetPacket *read_packet(lua_State *l, int idx, enet_uint8 *channel_id) { + size_t size; + int argc = lua_gettop(l); + const void *data = luaL_checklstring(l, idx, &size); + ENetPacket *packet; + + enet_uint32 flags = ENET_PACKET_FLAG_RELIABLE; + *channel_id = 0; + + if (argc >= idx+2 && !lua_isnil(l, idx+2)) { + const char *flag_str = luaL_checkstring(l, idx+2); + if (strcmp("unsequenced", flag_str) == 0) { + flags = ENET_PACKET_FLAG_UNSEQUENCED; + } else if (strcmp("reliable", flag_str) == 0) { + flags = ENET_PACKET_FLAG_RELIABLE; + } else if (strcmp("unreliable", flag_str) == 0) { + flags = 0; + } else { + luaL_error(l, "Unknown packet flag: %s", flag_str); + } + } + + if (argc >= idx+1 && !lua_isnil(l, idx+1)) { + *channel_id = luaL_checkint(l, idx+1); + } + + packet = enet_packet_create(data, size, flags); + if (packet == NULL) { + luaL_error(l, "Failed to create packet"); + } + + return packet; +} + +/** + * Create a new host + * Args: + * address (nil for client) + * [peer_count = 64] + * [channel_count = 1] + * [in_bandwidth = 0] + * [out_bandwidth = 0] + */ +static int host_create(lua_State *l) { + ENetHost *host; + size_t peer_count = 64, channel_count = 1; + enet_uint32 in_bandwidth = 0, out_bandwidth = 0; + + int have_address = 1; + ENetAddress address; + + if (lua_gettop(l) == 0 || lua_isnil(l, 1)) { + have_address = 0; + } else { + parse_address(l, luaL_checkstring(l, 1), &address); + } + + switch (lua_gettop(l)) { + case 5: + if (!lua_isnil(l, 5)) out_bandwidth = luaL_checkint(l, 5); + case 4: + if (!lua_isnil(l, 4)) in_bandwidth = luaL_checkint(l, 4); + case 3: + if (!lua_isnil(l, 3)) channel_count = luaL_checkint(l, 3); + case 2: + if (!lua_isnil(l, 2)) peer_count = luaL_checkint(l, 2); + } + + // printf("host create, peers=%d, channels=%d, in=%d, out=%d\n", + // peer_count, channel_count, in_bandwidth, out_bandwidth); + host = enet_host_create(have_address ? &address : NULL, peer_count, + channel_count, in_bandwidth, out_bandwidth); + + if (host == NULL) { + lua_pushnil (l); + lua_pushstring(l, "enet: failed to create host (already listening?)"); + return 2; + } + + *(ENetHost**)lua_newuserdata(l, sizeof(void*)) = host; + luaL_getmetatable(l, "enet_host"); + lua_setmetatable(l, -2); + + return 1; +} + +static int linked_version(lua_State *l) { + lua_pushfstring(l, "%d.%d.%d", + ENET_VERSION_GET_MAJOR(enet_linked_version()), + ENET_VERSION_GET_MINOR(enet_linked_version()), + ENET_VERSION_GET_PATCH(enet_linked_version())); + return 1; +} + +/** + * Serice a host + * Args: + * timeout + * + * Return + * nil on no event + * an event table on event + */ +static int host_service(lua_State *l) { + ENetHost *host = check_host(l, 1); + ENetEvent event; + int timeout = 0, out; + + if (lua_gettop(l) > 1) + timeout = luaL_checkint(l, 2); + + out = enet_host_service(host, &event, timeout); + if (out == 0) return 0; + if (out < 0) return luaL_error(l, "Error during service"); + + push_event(l, &event); + return 1; +} + +/** + * Dispatch a single event if available + */ +static int host_check_events(lua_State *l) { + ENetHost *host = check_host(l, 1); + ENetEvent event; + int out = enet_host_check_events(host, &event); + if (out == 0) return 0; + if (out < 0) return luaL_error(l, "Error checking event"); + + push_event(l, &event); + return 1; +} + +/** + * Enables an adaptive order-2 PPM range coder for the transmitted data of + * all peers. + */ +static int host_compress_with_range_coder(lua_State *l) { + ENetHost *host = check_host(l, 1); + + int result = enet_host_compress_with_range_coder (host); + if (result == 0) { + lua_pushboolean (l, 1); + } else { + lua_pushboolean (l, 0); + } + + return 1; +} + +/** + * Connect a host to an address + * Args: + * the address + * [channel_count = 1] + * [data = 0] + */ +static int host_connect(lua_State *l) { + ENetHost *host = check_host(l, 1); + ENetAddress address; + ENetPeer *peer; + + enet_uint32 data = 0; + size_t channel_count = 1; + + parse_address(l, luaL_checkstring(l, 2), &address); + + switch (lua_gettop(l)) { + case 4: + if (!lua_isnil(l, 4)) data = luaL_checkint(l, 4); + case 3: + if (!lua_isnil(l, 3)) channel_count = luaL_checkint(l, 3); + } + + // printf("host connect, channels=%d, data=%d\n", channel_count, data); + peer = enet_host_connect(host, &address, channel_count, data); + + if (peer == NULL) { + return luaL_error(l, "Failed to create peer"); + } + + push_peer(l, peer); + + return 1; +} + +static int host_flush(lua_State *l) { + ENetHost *host = check_host(l, 1); + enet_host_flush(host); + return 0; +} + +static int host_broadcast(lua_State *l) { + ENetHost *host = check_host(l, 1); + + enet_uint8 channel_id; + ENetPacket *packet = read_packet(l, 2, &channel_id); + enet_host_broadcast(host, channel_id, packet); + return 0; +} + +// Args: limit:number +static int host_channel_limit(lua_State *l) { + ENetHost *host = check_host(l, 1); + int limit = luaL_checkint(l, 2); + enet_host_channel_limit(host, limit); + return 0; +} + +static int host_bandwidth_limit(lua_State *l) { + ENetHost *host = check_host(l, 1); + enet_uint32 in_bandwidth = luaL_checkint(l, 2); + enet_uint32 out_bandwidth = luaL_checkint(l, 2); + enet_host_bandwidth_limit(host, in_bandwidth, out_bandwidth); + return 0; +} + +static int host_socket_get_address(lua_State *l) { + ENetHost *host = check_host(l, 1); + ENetAddress address; + enet_socket_get_address (host->socket, &address); + + lua_pushfstring(l, "%d.%d.%d.%d:%d", + ((address.host) & 0xFF), + ((address.host >> 8) & 0xFF), + ((address.host >> 16) & 0xFF), + (address.host >> 24& 0xFF), + address.port); + return 1; +} +static int host_total_sent_data(lua_State *l) { + ENetHost *host = check_host(l, 1); + + lua_pushinteger (l, host->totalSentData); + + return 1; +} + +static int host_total_received_data(lua_State *l) { + ENetHost *host = check_host(l, 1); + + lua_pushinteger (l, host->totalReceivedData); + + return 1; +} +static int host_service_time(lua_State *l) { + ENetHost *host = check_host(l, 1); + + lua_pushinteger (l, host->serviceTime); + + return 1; +} + +static int host_peer_count(lua_State *l) { + ENetHost *host = check_host(l, 1); + + lua_pushinteger (l, host->peerCount); + + return 1; +} + +static int host_get_peer(lua_State *l) { + ENetHost *host = check_host(l, 1); + + int peer_index = luaL_checkint(l, 2) - 1; + + if (peer_index < 0 || ((size_t) peer_index) >= host->peerCount) { + luaL_argerror (l, 2, "Invalid peer index"); + } + + ENetPeer *peer = &(host->peers[peer_index]); + + push_peer (l, peer); + return 1; +} + +static int host_gc(lua_State *l) { + ENetHost *host = check_host(l, 1); + enet_host_destroy(host); + return 0; +} + +static int peer_tostring(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + char host_str[128]; + enet_address_get_host_ip(&peer->address, host_str, 128); + + lua_pushstring(l, host_str); + lua_pushstring(l, ":"); + lua_pushinteger(l, peer->address.port); + lua_concat(l, 3); + return 1; +} + +static int peer_ping(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + enet_peer_ping(peer); + return 0; +} + +static int peer_throttle_configure(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + enet_uint32 interval = luaL_checkint(l, 2); + enet_uint32 acceleration = luaL_checkint(l, 3); + enet_uint32 deceleration = luaL_checkint(l, 4); + + enet_peer_throttle_configure(peer, interval, acceleration, deceleration); + return 0; +} + +static int peer_round_trip_time(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + if (lua_gettop(l) > 1) { + enet_uint32 round_trip_time = luaL_checkint(l, 2); + peer->roundTripTime = round_trip_time; + } + + lua_pushinteger (l, peer->roundTripTime); + + return 1; +} + +static int peer_last_round_trip_time(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + if (lua_gettop(l) > 1) { + enet_uint32 round_trip_time = luaL_checkint(l, 2); + peer->lastRoundTripTime = round_trip_time; + } + lua_pushinteger (l, peer->lastRoundTripTime); + + return 1; +} + +static int peer_ping_interval(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + if (lua_gettop(l) > 1) { + enet_uint32 interval = luaL_checkint(l, 2); + enet_peer_ping_interval (peer, interval); + } + + lua_pushinteger (l, peer->pingInterval); + + return 1; +} + +static int peer_timeout(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + enet_uint32 timeout_limit = 0; + enet_uint32 timeout_minimum = 0; + enet_uint32 timeout_maximum = 0; + + switch (lua_gettop(l)) { + case 4: + if (!lua_isnil(l, 4)) timeout_maximum = luaL_checkint(l, 4); + case 3: + if (!lua_isnil(l, 3)) timeout_minimum = luaL_checkint(l, 3); + case 2: + if (!lua_isnil(l, 2)) timeout_limit = luaL_checkint(l, 2); + } + + enet_peer_timeout (peer, timeout_limit, timeout_minimum, timeout_maximum); + + lua_pushinteger (l, peer->timeoutLimit); + lua_pushinteger (l, peer->timeoutMinimum); + lua_pushinteger (l, peer->timeoutMaximum); + + return 3; +} + +static int peer_disconnect(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + enet_uint32 data = lua_gettop(l) > 1 ? luaL_checkint(l, 2) : 0; + enet_peer_disconnect(peer, data); + return 0; +} + +static int peer_disconnect_now(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + enet_uint32 data = lua_gettop(l) > 1 ? luaL_checkint(l, 2) : 0; + enet_peer_disconnect_now(peer, data); + return 0; +} + +static int peer_disconnect_later(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + enet_uint32 data = lua_gettop(l) > 1 ? luaL_checkint(l, 2) : 0; + enet_peer_disconnect_later(peer, data); + return 0; +} + +static int peer_index(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + size_t peer_index = find_peer_index (l, peer->host, peer); + lua_pushinteger (l, peer_index + 1); + + return 1; +} + +static int peer_state(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + switch (peer->state) { + case (ENET_PEER_STATE_DISCONNECTED): + lua_pushstring (l, "disconnected"); + break; + case (ENET_PEER_STATE_CONNECTING): + lua_pushstring (l, "connecting"); + break; + case (ENET_PEER_STATE_ACKNOWLEDGING_CONNECT): + lua_pushstring (l, "acknowledging_connect"); + break; + case (ENET_PEER_STATE_CONNECTION_PENDING): + lua_pushstring (l, "connection_pending"); + break; + case (ENET_PEER_STATE_CONNECTION_SUCCEEDED): + lua_pushstring (l, "connection_succeeded"); + break; + case (ENET_PEER_STATE_CONNECTED): + lua_pushstring (l, "connected"); + break; + case (ENET_PEER_STATE_DISCONNECT_LATER): + lua_pushstring (l, "disconnect_later"); + break; + case (ENET_PEER_STATE_DISCONNECTING): + lua_pushstring (l, "disconnecting"); + break; + case (ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT): + lua_pushstring (l, "acknowledging_disconnect"); + break; + case (ENET_PEER_STATE_ZOMBIE): + lua_pushstring (l, "zombie"); + break; + default: + lua_pushstring (l, "unknown"); + } + + return 1; +} + +static int peer_connect_id(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + lua_pushinteger (l, peer->connectID); + + return 1; +} + + +static int peer_reset(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + enet_peer_reset(peer); + return 0; +} + +static int peer_receive(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + ENetPacket *packet; + enet_uint8 channel_id = 0; + + if (lua_gettop(l) > 1) { + channel_id = luaL_checkint(l, 2); + } + + packet = enet_peer_receive(peer, &channel_id); + if (packet == NULL) return 0; + + lua_pushlstring(l, (const char *)packet->data, packet->dataLength); + lua_pushinteger(l, channel_id); + + enet_packet_destroy(packet); + return 2; +} + + +/** + * Send a lua string to a peer + * Args: + * packet data, string + * channel id + * flags ["reliable", nil] + * + */ +static int peer_send(lua_State *l) { + ENetPeer *peer = check_peer(l, 1); + + enet_uint8 channel_id; + ENetPacket *packet = read_packet(l, 2, &channel_id); + + // printf("sending, channel_id=%d\n", channel_id); + enet_peer_send(peer, channel_id, packet); + return 0; +} + +static const struct luaL_Reg enet_funcs [] = { + {"host_create", host_create}, + {"linked_version", linked_version}, + {NULL, NULL} +}; + +static const struct luaL_Reg enet_host_funcs [] = { + {"service", host_service}, + {"check_events", host_check_events}, + {"compress_with_range_coder", host_compress_with_range_coder}, + {"connect", host_connect}, + {"flush", host_flush}, + {"broadcast", host_broadcast}, + {"channel_limit", host_channel_limit}, + {"bandwidth_limit", host_bandwidth_limit}, + {"socket_get_address", host_socket_get_address}, + + // additional convenience functions (mostly accessors) + {"total_sent_data", host_total_sent_data}, + {"total_received_data", host_total_received_data}, + {"service_time", host_service_time}, + {"peer_count", host_peer_count}, + {"get_peer", host_get_peer}, + {NULL, NULL} +}; + +static const struct luaL_Reg enet_peer_funcs [] = { + {"disconnect", peer_disconnect}, + {"disconnect_now", peer_disconnect_now}, + {"disconnect_later", peer_disconnect_later}, + {"reset", peer_reset}, + {"ping", peer_ping}, + {"receive", peer_receive}, + {"send", peer_send}, + {"throttle_configure", peer_throttle_configure}, + {"ping_interval", peer_ping_interval}, + {"timeout", peer_timeout}, + + // additional convenience functions to member variables + {"index", peer_index}, + {"state", peer_state}, + {"connect_id", peer_connect_id}, + {"round_trip_time", peer_round_trip_time}, + {"last_round_trip_time", peer_last_round_trip_time}, + {NULL, NULL} +}; + +static const struct luaL_Reg enet_event_funcs [] = { + {NULL, NULL} +}; + +int luaopen_enet(lua_State *l) { + enet_initialize(); + atexit(enet_deinitialize); + + // create metatables + luaL_newmetatable(l, "enet_host"); + lua_newtable(l); // index + luaL_register(l, NULL, enet_host_funcs); + lua_setfield(l, -2, "__index"); + lua_pushcfunction(l, host_gc); + lua_setfield(l, -2, "__gc"); + + luaL_newmetatable(l, "enet_peer"); + lua_newtable(l); + luaL_register(l, NULL, enet_peer_funcs); + lua_setfield(l, -2, "__index"); + lua_pushcfunction(l, peer_tostring); + lua_setfield(l, -2, "__tostring"); + + // set up peer table + lua_newtable(l); + + lua_newtable(l); // metatable + lua_pushstring(l, "v"); + lua_setfield(l, -2, "__mode"); + lua_setmetatable(l, -2); + + lua_setfield(l, LUA_REGISTRYINDEX, "enet_peers"); + + luaL_register(l, "enet", enet_funcs); + + // return the enet table created with luaL_register + return 1; +} diff --git a/jni/love/src/libraries/enet/libenet/ChangeLog b/jni/love/src/libraries/enet/libenet/ChangeLog new file mode 100644 index 00000000..c8f91a09 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/ChangeLog @@ -0,0 +1,159 @@ +ENet 1.3.10 (October 23, 2013); + +* doubled maximum reliable window size +* fixed RCVTIMEO/SNDTIMEO socket options and also added NODELAY + +ENet 1.3.9 (August 19, 2013): + +* added duplicatePeers option to ENetHost which can limit the number of peers from duplicate IPs +* added enet_socket_get_option() and ENET_SOCKOPT_ERROR +* added enet_host_random_seed() platform stub + +ENet 1.3.8 (June 2, 2013): + +* added enet_linked_version() for checking the linked version +* added enet_socket_get_address() for querying the local address of a socket +* silenced some debugging prints unless ENET_DEBUG is defined during compilation +* handle EINTR in enet_socket_wait() so that enet_host_service() doesn't propagate errors from signals +* optimized enet_host_bandwidth_throttle() to be less expensive for large numbers of peers + +ENet 1.3.7 (March 6, 2013): + +* added ENET_PACKET_FLAG_SENT to indicate that a packet is being freed because it has been sent +* added userData field to ENetPacket +* changed how random seed is generated on Windows to avoid import warnings +* fixed case where disconnects could be generated with no preceding connect event + +ENet 1.3.6 (December 11, 2012): + +* added support for intercept callback in ENetHost that can be used to process raw packets before ENet +* added enet_socket_shutdown() for issuing shutdown on a socket +* fixed enet_socket_connect() to not error on non-blocking connects +* fixed bug in MTU negotiation during connections + +ENet 1.3.5 (July 31, 2012): + +* fixed bug in unreliable packet fragment queuing + +ENet 1.3.4 (May 29, 2012): + +* added enet_peer_ping_interval() for configuring per-peer ping intervals +* added enet_peer_timeout() for configuring per-peer timeouts +* added protocol packet size limits + +ENet 1.3.3 (June 28, 2011): + +* fixed bug with simultaneous disconnects not dispatching events + +ENet 1.3.2 (May 31, 2011): + +* added support for unreliable packet fragmenting via the packet flag +ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT +* fixed regression in unreliable packet queuing +* added check against received port to limit some forms of IP-spoofing + +ENet 1.3.1 (February 10, 2011): + +* fixed bug in tracking of reliable data in transit +* reliable data window size now scales with the throttle +* fixed bug in fragment length calculation when checksums are used + +ENet 1.3.0 (June 5, 2010): + +* enet_host_create() now requires the channel limit to be specified as +a parameter +* enet_host_connect() now accepts a data parameter which is supplied +to the receiving receiving host in the event data field for a connect event +* added an adaptive order-2 PPM range coder as a built-in compressor option +which can be set with enet_host_compress_with_range_coder() +* added support for packet compression configurable with a callback +* improved session number handling to not rely on the packet checksum +field, saving 4 bytes per packet unless the checksum option is used +* removed the dependence on the rand callback for session number handling + +Caveats: This version is not protocol compatible with the 1.2 series or +earlier. The enet_host_connect and enet_host_create API functions require +supplying additional parameters. + +ENet 1.2.5 (June 28, 2011): + +* fixed bug with simultaneous disconnects not dispatching events + +ENet 1.2.4 (May 31, 2011): + +* fixed regression in unreliable packet queuing +* added check against received port to limit some forms of IP-spoofing + +ENet 1.2.3 (February 10, 2011): + +* fixed bug in tracking reliable data in transit + +ENet 1.2.2 (June 5, 2010): + +* checksum functionality is now enabled by setting a checksum callback +inside ENetHost instead of being a configure script option +* added totalSentData, totalSentPackets, totalReceivedData, and +totalReceivedPackets counters inside ENetHost for getting usage +statistics +* added enet_host_channel_limit() for limiting the maximum number of +channels allowed by connected peers +* now uses dispatch queues for event dispatch rather than potentially +unscalable array walking +* added no_memory callback that is called when a malloc attempt fails, +such that if no_memory returns rather than aborts (the default behavior), +then the error is propagated to the return value of the API calls +* now uses packed attribute for protocol structures on platforms with +strange alignment rules +* improved autoconf build system contributed by Nathan Brink allowing +for easier building as a shared library + +Caveats: If you were using the compile-time option that enabled checksums, +make sure to set the checksum callback inside ENetHost to enet_crc32 to +regain the old behavior. The ENetCallbacks structure has added new fields, +so make sure to clear the structure to zero before use if +using enet_initialize_with_callbacks(). + +ENet 1.2.1 (November 12, 2009): + +* fixed bug that could cause disconnect events to be dropped +* added thin wrapper around select() for portable usage +* added ENET_SOCKOPT_REUSEADDR socket option +* factored enet_socket_bind()/enet_socket_listen() out of enet_socket_create() +* added contributed Code::Blocks build file + +ENet 1.2 (February 12, 2008): + +* fixed bug in VERIFY_CONNECT acknowledgement that could cause connect +attempts to occasionally timeout +* fixed acknowledgements to check both the outgoing and sent queues +when removing acknowledged packets +* fixed accidental bit rot in the MSVC project file +* revised sequence number overflow handling to address some possible +disconnect bugs +* added enet_host_check_events() for getting only local queued events +* factored out socket option setting into enet_socket_set_option() so +that socket options are now set separately from enet_socket_create() + +Caveats: While this release is superficially protocol compatible with 1.1, +differences in the sequence number overflow handling can potentially cause +random disconnects. + +ENet 1.1 (June 6, 2007): + +* optional CRC32 just in case someone needs a stronger checksum than UDP +provides (--enable-crc32 configure option) +* the size of packet headers are half the size they used to be (so less +overhead when sending small packets) +* enet_peer_disconnect_later() that waits till all queued outgoing +packets get sent before issuing an actual disconnect +* freeCallback field in individual packets for notification of when a +packet is about to be freed +* ENET_PACKET_FLAG_NO_ALLOCATE for supplying pre-allocated data to a +packet (can be used in concert with freeCallback to support some custom +allocation schemes that the normal memory allocation callbacks would +normally not allow) +* enet_address_get_host_ip() for printing address numbers +* promoted the enet_socket_*() functions to be part of the API now +* a few stability/crash fixes + + diff --git a/jni/love/src/libraries/enet/libenet/LICENSE b/jni/love/src/libraries/enet/libenet/LICENSE new file mode 100644 index 00000000..87961d3b --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2002-2013 Lee Salzman + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/jni/love/src/libraries/enet/libenet/README b/jni/love/src/libraries/enet/libenet/README new file mode 100644 index 00000000..54b2d213 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/README @@ -0,0 +1,15 @@ +Please visit the ENet homepage at http://enet.bespin.org for installation +and usage instructions. + +If you obtained this package from github, the quick description on how to build +is: + +# Generate the build system. + +autoreconf -vfi + +# Compile and install the library. + +./configure && make && make install + + diff --git a/jni/love/src/libraries/enet/libenet/callbacks.c b/jni/love/src/libraries/enet/libenet/callbacks.c new file mode 100644 index 00000000..b3990af1 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/callbacks.c @@ -0,0 +1,53 @@ +/** + @file callbacks.c + @brief ENet callback functions +*/ +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +static ENetCallbacks callbacks = { malloc, free, abort }; + +int +enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits) +{ + if (version < ENET_VERSION_CREATE (1, 3, 0)) + return -1; + + if (inits -> malloc != NULL || inits -> free != NULL) + { + if (inits -> malloc == NULL || inits -> free == NULL) + return -1; + + callbacks.malloc = inits -> malloc; + callbacks.free = inits -> free; + } + + if (inits -> no_memory != NULL) + callbacks.no_memory = inits -> no_memory; + + return enet_initialize (); +} + +ENetVersion +enet_linked_version (void) +{ + return ENET_VERSION; +} + +void * +enet_malloc (size_t size) +{ + void * memory = callbacks.malloc (size); + + if (memory == NULL) + callbacks.no_memory (); + + return memory; +} + +void +enet_free (void * memory) +{ + callbacks.free (memory); +} + diff --git a/jni/love/src/libraries/enet/libenet/compress.c b/jni/love/src/libraries/enet/libenet/compress.c new file mode 100644 index 00000000..784489a7 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/compress.c @@ -0,0 +1,654 @@ +/** + @file compress.c + @brief An adaptive order-2 PPM range coder +*/ +#define ENET_BUILDING_LIB 1 +#include +#include "enet/enet.h" + +typedef struct _ENetSymbol +{ + /* binary indexed tree of symbols */ + enet_uint8 value; + enet_uint8 count; + enet_uint16 under; + enet_uint16 left, right; + + /* context defined by this symbol */ + enet_uint16 symbols; + enet_uint16 escapes; + enet_uint16 total; + enet_uint16 parent; +} ENetSymbol; + +/* adaptation constants tuned aggressively for small packet sizes rather than large file compression */ +enum +{ + ENET_RANGE_CODER_TOP = 1<<24, + ENET_RANGE_CODER_BOTTOM = 1<<16, + + ENET_CONTEXT_SYMBOL_DELTA = 3, + ENET_CONTEXT_SYMBOL_MINIMUM = 1, + ENET_CONTEXT_ESCAPE_MINIMUM = 1, + + ENET_SUBCONTEXT_ORDER = 2, + ENET_SUBCONTEXT_SYMBOL_DELTA = 2, + ENET_SUBCONTEXT_ESCAPE_DELTA = 5 +}; + +/* context exclusion roughly halves compression speed, so disable for now */ +#undef ENET_CONTEXT_EXCLUSION + +typedef struct _ENetRangeCoder +{ + /* only allocate enough symbols for reasonable MTUs, would need to be larger for large file compression */ + ENetSymbol symbols[4096]; +} ENetRangeCoder; + +void * +enet_range_coder_create (void) +{ + ENetRangeCoder * rangeCoder = (ENetRangeCoder *) enet_malloc (sizeof (ENetRangeCoder)); + if (rangeCoder == NULL) + return NULL; + + return rangeCoder; +} + +void +enet_range_coder_destroy (void * context) +{ + ENetRangeCoder * rangeCoder = (ENetRangeCoder *) context; + if (rangeCoder == NULL) + return; + + enet_free (rangeCoder); +} + +#define ENET_SYMBOL_CREATE(symbol, value_, count_) \ +{ \ + symbol = & rangeCoder -> symbols [nextSymbol ++]; \ + symbol -> value = value_; \ + symbol -> count = count_; \ + symbol -> under = count_; \ + symbol -> left = 0; \ + symbol -> right = 0; \ + symbol -> symbols = 0; \ + symbol -> escapes = 0; \ + symbol -> total = 0; \ + symbol -> parent = 0; \ +} + +#define ENET_CONTEXT_CREATE(context, escapes_, minimum) \ +{ \ + ENET_SYMBOL_CREATE (context, 0, 0); \ + (context) -> escapes = escapes_; \ + (context) -> total = escapes_ + 256*minimum; \ + (context) -> symbols = 0; \ +} + +static enet_uint16 +enet_symbol_rescale (ENetSymbol * symbol) +{ + enet_uint16 total = 0; + for (;;) + { + symbol -> count -= symbol->count >> 1; + symbol -> under = symbol -> count; + if (symbol -> left) + symbol -> under += enet_symbol_rescale (symbol + symbol -> left); + total += symbol -> under; + if (! symbol -> right) break; + symbol += symbol -> right; + } + return total; +} + +#define ENET_CONTEXT_RESCALE(context, minimum) \ +{ \ + (context) -> total = (context) -> symbols ? enet_symbol_rescale ((context) + (context) -> symbols) : 0; \ + (context) -> escapes -= (context) -> escapes >> 1; \ + (context) -> total += (context) -> escapes + 256*minimum; \ +} + +#define ENET_RANGE_CODER_OUTPUT(value) \ +{ \ + if (outData >= outEnd) \ + return 0; \ + * outData ++ = value; \ +} + +#define ENET_RANGE_CODER_ENCODE(under, count, total) \ +{ \ + encodeRange /= (total); \ + encodeLow += (under) * encodeRange; \ + encodeRange *= (count); \ + for (;;) \ + { \ + if((encodeLow ^ (encodeLow + encodeRange)) >= ENET_RANGE_CODER_TOP) \ + { \ + if(encodeRange >= ENET_RANGE_CODER_BOTTOM) break; \ + encodeRange = -encodeLow & (ENET_RANGE_CODER_BOTTOM - 1); \ + } \ + ENET_RANGE_CODER_OUTPUT (encodeLow >> 24); \ + encodeRange <<= 8; \ + encodeLow <<= 8; \ + } \ +} + +#define ENET_RANGE_CODER_FLUSH \ +{ \ + while (encodeLow) \ + { \ + ENET_RANGE_CODER_OUTPUT (encodeLow >> 24); \ + encodeLow <<= 8; \ + } \ +} + +#define ENET_RANGE_CODER_FREE_SYMBOLS \ +{ \ + if (nextSymbol >= sizeof (rangeCoder -> symbols) / sizeof (ENetSymbol) - ENET_SUBCONTEXT_ORDER ) \ + { \ + nextSymbol = 0; \ + ENET_CONTEXT_CREATE (root, ENET_CONTEXT_ESCAPE_MINIMUM, ENET_CONTEXT_SYMBOL_MINIMUM); \ + predicted = 0; \ + order = 0; \ + } \ +} + +#define ENET_CONTEXT_ENCODE(context, symbol_, value_, under_, count_, update, minimum) \ +{ \ + under_ = value*minimum; \ + count_ = minimum; \ + if (! (context) -> symbols) \ + { \ + ENET_SYMBOL_CREATE (symbol_, value_, update); \ + (context) -> symbols = symbol_ - (context); \ + } \ + else \ + { \ + ENetSymbol * node = (context) + (context) -> symbols; \ + for (;;) \ + { \ + if (value_ < node -> value) \ + { \ + node -> under += update; \ + if (node -> left) { node += node -> left; continue; } \ + ENET_SYMBOL_CREATE (symbol_, value_, update); \ + node -> left = symbol_ - node; \ + } \ + else \ + if (value_ > node -> value) \ + { \ + under_ += node -> under; \ + if (node -> right) { node += node -> right; continue; } \ + ENET_SYMBOL_CREATE (symbol_, value_, update); \ + node -> right = symbol_ - node; \ + } \ + else \ + { \ + count_ += node -> count; \ + under_ += node -> under - node -> count; \ + node -> under += update; \ + node -> count += update; \ + symbol_ = node; \ + } \ + break; \ + } \ + } \ +} + +#ifdef ENET_CONTEXT_EXCLUSION +static const ENetSymbol emptyContext = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +#define ENET_CONTEXT_WALK(context, body) \ +{ \ + const ENetSymbol * node = (context) + (context) -> symbols; \ + const ENetSymbol * stack [256]; \ + size_t stackSize = 0; \ + while (node -> left) \ + { \ + stack [stackSize ++] = node; \ + node += node -> left; \ + } \ + for (;;) \ + { \ + body; \ + if (node -> right) \ + { \ + node += node -> right; \ + while (node -> left) \ + { \ + stack [stackSize ++] = node; \ + node += node -> left; \ + } \ + } \ + else \ + if (stackSize <= 0) \ + break; \ + else \ + node = stack [-- stackSize]; \ + } \ +} + +#define ENET_CONTEXT_ENCODE_EXCLUDE(context, value_, under, total, minimum) \ +ENET_CONTEXT_WALK(context, { \ + if (node -> value != value_) \ + { \ + enet_uint16 parentCount = rangeCoder -> symbols [node -> parent].count + minimum; \ + if (node -> value < value_) \ + under -= parentCount; \ + total -= parentCount; \ + } \ +}) +#endif + +size_t +enet_range_coder_compress (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit) +{ + ENetRangeCoder * rangeCoder = (ENetRangeCoder *) context; + enet_uint8 * outStart = outData, * outEnd = & outData [outLimit]; + const enet_uint8 * inData, * inEnd; + enet_uint32 encodeLow = 0, encodeRange = ~0; + ENetSymbol * root; + enet_uint16 predicted = 0; + size_t order = 0, nextSymbol = 0; + + if (rangeCoder == NULL || inBufferCount <= 0 || inLimit <= 0) + return 0; + + inData = (const enet_uint8 *) inBuffers -> data; + inEnd = & inData [inBuffers -> dataLength]; + inBuffers ++; + inBufferCount --; + + ENET_CONTEXT_CREATE (root, ENET_CONTEXT_ESCAPE_MINIMUM, ENET_CONTEXT_SYMBOL_MINIMUM); + + for (;;) + { + ENetSymbol * subcontext, * symbol; +#ifdef ENET_CONTEXT_EXCLUSION + const ENetSymbol * childContext = & emptyContext; +#endif + enet_uint8 value; + enet_uint16 count, under, * parent = & predicted, total; + if (inData >= inEnd) + { + if (inBufferCount <= 0) + break; + inData = (const enet_uint8 *) inBuffers -> data; + inEnd = & inData [inBuffers -> dataLength]; + inBuffers ++; + inBufferCount --; + } + value = * inData ++; + + for (subcontext = & rangeCoder -> symbols [predicted]; + subcontext != root; +#ifdef ENET_CONTEXT_EXCLUSION + childContext = subcontext, +#endif + subcontext = & rangeCoder -> symbols [subcontext -> parent]) + { + ENET_CONTEXT_ENCODE (subcontext, symbol, value, under, count, ENET_SUBCONTEXT_SYMBOL_DELTA, 0); + * parent = symbol - rangeCoder -> symbols; + parent = & symbol -> parent; + total = subcontext -> total; +#ifdef ENET_CONTEXT_EXCLUSION + if (childContext -> total > ENET_SUBCONTEXT_SYMBOL_DELTA + ENET_SUBCONTEXT_ESCAPE_DELTA) + ENET_CONTEXT_ENCODE_EXCLUDE (childContext, value, under, total, 0); +#endif + if (count > 0) + { + ENET_RANGE_CODER_ENCODE (subcontext -> escapes + under, count, total); + } + else + { + if (subcontext -> escapes > 0 && subcontext -> escapes < total) + ENET_RANGE_CODER_ENCODE (0, subcontext -> escapes, total); + subcontext -> escapes += ENET_SUBCONTEXT_ESCAPE_DELTA; + subcontext -> total += ENET_SUBCONTEXT_ESCAPE_DELTA; + } + subcontext -> total += ENET_SUBCONTEXT_SYMBOL_DELTA; + if (count > 0xFF - 2*ENET_SUBCONTEXT_SYMBOL_DELTA || subcontext -> total > ENET_RANGE_CODER_BOTTOM - 0x100) + ENET_CONTEXT_RESCALE (subcontext, 0); + if (count > 0) goto nextInput; + } + + ENET_CONTEXT_ENCODE (root, symbol, value, under, count, ENET_CONTEXT_SYMBOL_DELTA, ENET_CONTEXT_SYMBOL_MINIMUM); + * parent = symbol - rangeCoder -> symbols; + parent = & symbol -> parent; + total = root -> total; +#ifdef ENET_CONTEXT_EXCLUSION + if (childContext -> total > ENET_SUBCONTEXT_SYMBOL_DELTA + ENET_SUBCONTEXT_ESCAPE_DELTA) + ENET_CONTEXT_ENCODE_EXCLUDE (childContext, value, under, total, ENET_CONTEXT_SYMBOL_MINIMUM); +#endif + ENET_RANGE_CODER_ENCODE (root -> escapes + under, count, total); + root -> total += ENET_CONTEXT_SYMBOL_DELTA; + if (count > 0xFF - 2*ENET_CONTEXT_SYMBOL_DELTA + ENET_CONTEXT_SYMBOL_MINIMUM || root -> total > ENET_RANGE_CODER_BOTTOM - 0x100) + ENET_CONTEXT_RESCALE (root, ENET_CONTEXT_SYMBOL_MINIMUM); + + nextInput: + if (order >= ENET_SUBCONTEXT_ORDER) + predicted = rangeCoder -> symbols [predicted].parent; + else + order ++; + ENET_RANGE_CODER_FREE_SYMBOLS; + } + + ENET_RANGE_CODER_FLUSH; + + return (size_t) (outData - outStart); +} + +#define ENET_RANGE_CODER_SEED \ +{ \ + if (inData < inEnd) decodeCode |= * inData ++ << 24; \ + if (inData < inEnd) decodeCode |= * inData ++ << 16; \ + if (inData < inEnd) decodeCode |= * inData ++ << 8; \ + if (inData < inEnd) decodeCode |= * inData ++; \ +} + +#define ENET_RANGE_CODER_READ(total) ((decodeCode - decodeLow) / (decodeRange /= (total))) + +#define ENET_RANGE_CODER_DECODE(under, count, total) \ +{ \ + decodeLow += (under) * decodeRange; \ + decodeRange *= (count); \ + for (;;) \ + { \ + if((decodeLow ^ (decodeLow + decodeRange)) >= ENET_RANGE_CODER_TOP) \ + { \ + if(decodeRange >= ENET_RANGE_CODER_BOTTOM) break; \ + decodeRange = -decodeLow & (ENET_RANGE_CODER_BOTTOM - 1); \ + } \ + decodeCode <<= 8; \ + if (inData < inEnd) \ + decodeCode |= * inData ++; \ + decodeRange <<= 8; \ + decodeLow <<= 8; \ + } \ +} + +#define ENET_CONTEXT_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, createRoot, visitNode, createRight, createLeft) \ +{ \ + under_ = 0; \ + count_ = minimum; \ + if (! (context) -> symbols) \ + { \ + createRoot; \ + } \ + else \ + { \ + ENetSymbol * node = (context) + (context) -> symbols; \ + for (;;) \ + { \ + enet_uint16 after = under_ + node -> under + (node -> value + 1)*minimum, before = node -> count + minimum; \ + visitNode; \ + if (code >= after) \ + { \ + under_ += node -> under; \ + if (node -> right) { node += node -> right; continue; } \ + createRight; \ + } \ + else \ + if (code < after - before) \ + { \ + node -> under += update; \ + if (node -> left) { node += node -> left; continue; } \ + createLeft; \ + } \ + else \ + { \ + value_ = node -> value; \ + count_ += node -> count; \ + under_ = after - before; \ + node -> under += update; \ + node -> count += update; \ + symbol_ = node; \ + } \ + break; \ + } \ + } \ +} + +#define ENET_CONTEXT_TRY_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, exclude) \ +ENET_CONTEXT_DECODE (context, symbol_, code, value_, under_, count_, update, minimum, return 0, exclude (node -> value, after, before), return 0, return 0) + +#define ENET_CONTEXT_ROOT_DECODE(context, symbol_, code, value_, under_, count_, update, minimum, exclude) \ +ENET_CONTEXT_DECODE (context, symbol_, code, value_, under_, count_, update, minimum, \ + { \ + value_ = code / minimum; \ + under_ = code - code%minimum; \ + ENET_SYMBOL_CREATE (symbol_, value_, update); \ + (context) -> symbols = symbol_ - (context); \ + }, \ + exclude (node -> value, after, before), \ + { \ + value_ = node->value + 1 + (code - after)/minimum; \ + under_ = code - (code - after)%minimum; \ + ENET_SYMBOL_CREATE (symbol_, value_, update); \ + node -> right = symbol_ - node; \ + }, \ + { \ + value_ = node->value - 1 - (after - before - code - 1)/minimum; \ + under_ = code - (after - before - code - 1)%minimum; \ + ENET_SYMBOL_CREATE (symbol_, value_, update); \ + node -> left = symbol_ - node; \ + }) \ + +#ifdef ENET_CONTEXT_EXCLUSION +typedef struct _ENetExclude +{ + enet_uint8 value; + enet_uint16 under; +} ENetExclude; + +#define ENET_CONTEXT_DECODE_EXCLUDE(context, total, minimum) \ +{ \ + enet_uint16 under = 0; \ + nextExclude = excludes; \ + ENET_CONTEXT_WALK (context, { \ + under += rangeCoder -> symbols [node -> parent].count + minimum; \ + nextExclude -> value = node -> value; \ + nextExclude -> under = under; \ + nextExclude ++; \ + }); \ + total -= under; \ +} + +#define ENET_CONTEXT_EXCLUDED(value_, after, before) \ +{ \ + size_t low = 0, high = nextExclude - excludes; \ + for(;;) \ + { \ + size_t mid = (low + high) >> 1; \ + const ENetExclude * exclude = & excludes [mid]; \ + if (value_ < exclude -> value) \ + { \ + if (low + 1 < high) \ + { \ + high = mid; \ + continue; \ + } \ + if (exclude > excludes) \ + after -= exclude [-1].under; \ + } \ + else \ + { \ + if (value_ > exclude -> value) \ + { \ + if (low + 1 < high) \ + { \ + low = mid; \ + continue; \ + } \ + } \ + else \ + before = 0; \ + after -= exclude -> under; \ + } \ + break; \ + } \ +} +#endif + +#define ENET_CONTEXT_NOT_EXCLUDED(value_, after, before) + +size_t +enet_range_coder_decompress (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit) +{ + ENetRangeCoder * rangeCoder = (ENetRangeCoder *) context; + enet_uint8 * outStart = outData, * outEnd = & outData [outLimit]; + const enet_uint8 * inEnd = & inData [inLimit]; + enet_uint32 decodeLow = 0, decodeCode = 0, decodeRange = ~0; + ENetSymbol * root; + enet_uint16 predicted = 0; + size_t order = 0, nextSymbol = 0; +#ifdef ENET_CONTEXT_EXCLUSION + ENetExclude excludes [256]; + ENetExclude * nextExclude = excludes; +#endif + + if (rangeCoder == NULL || inLimit <= 0) + return 0; + + ENET_CONTEXT_CREATE (root, ENET_CONTEXT_ESCAPE_MINIMUM, ENET_CONTEXT_SYMBOL_MINIMUM); + + ENET_RANGE_CODER_SEED; + + for (;;) + { + ENetSymbol * subcontext, * symbol, * patch; +#ifdef ENET_CONTEXT_EXCLUSION + const ENetSymbol * childContext = & emptyContext; +#endif + enet_uint8 value = 0; + enet_uint16 code, under, count, bottom, * parent = & predicted, total; + + for (subcontext = & rangeCoder -> symbols [predicted]; + subcontext != root; +#ifdef ENET_CONTEXT_EXCLUSION + childContext = subcontext, +#endif + subcontext = & rangeCoder -> symbols [subcontext -> parent]) + { + if (subcontext -> escapes <= 0) + continue; + total = subcontext -> total; +#ifdef ENET_CONTEXT_EXCLUSION + if (childContext -> total > 0) + ENET_CONTEXT_DECODE_EXCLUDE (childContext, total, 0); +#endif + if (subcontext -> escapes >= total) + continue; + code = ENET_RANGE_CODER_READ (total); + if (code < subcontext -> escapes) + { + ENET_RANGE_CODER_DECODE (0, subcontext -> escapes, total); + continue; + } + code -= subcontext -> escapes; +#ifdef ENET_CONTEXT_EXCLUSION + if (childContext -> total > 0) + { + ENET_CONTEXT_TRY_DECODE (subcontext, symbol, code, value, under, count, ENET_SUBCONTEXT_SYMBOL_DELTA, 0, ENET_CONTEXT_EXCLUDED); + } + else +#endif + { + ENET_CONTEXT_TRY_DECODE (subcontext, symbol, code, value, under, count, ENET_SUBCONTEXT_SYMBOL_DELTA, 0, ENET_CONTEXT_NOT_EXCLUDED); + } + bottom = symbol - rangeCoder -> symbols; + ENET_RANGE_CODER_DECODE (subcontext -> escapes + under, count, total); + subcontext -> total += ENET_SUBCONTEXT_SYMBOL_DELTA; + if (count > 0xFF - 2*ENET_SUBCONTEXT_SYMBOL_DELTA || subcontext -> total > ENET_RANGE_CODER_BOTTOM - 0x100) + ENET_CONTEXT_RESCALE (subcontext, 0); + goto patchContexts; + } + + total = root -> total; +#ifdef ENET_CONTEXT_EXCLUSION + if (childContext -> total > 0) + ENET_CONTEXT_DECODE_EXCLUDE (childContext, total, ENET_CONTEXT_SYMBOL_MINIMUM); +#endif + code = ENET_RANGE_CODER_READ (total); + if (code < root -> escapes) + { + ENET_RANGE_CODER_DECODE (0, root -> escapes, total); + break; + } + code -= root -> escapes; +#ifdef ENET_CONTEXT_EXCLUSION + if (childContext -> total > 0) + { + ENET_CONTEXT_ROOT_DECODE (root, symbol, code, value, under, count, ENET_CONTEXT_SYMBOL_DELTA, ENET_CONTEXT_SYMBOL_MINIMUM, ENET_CONTEXT_EXCLUDED); + } + else +#endif + { + ENET_CONTEXT_ROOT_DECODE (root, symbol, code, value, under, count, ENET_CONTEXT_SYMBOL_DELTA, ENET_CONTEXT_SYMBOL_MINIMUM, ENET_CONTEXT_NOT_EXCLUDED); + } + bottom = symbol - rangeCoder -> symbols; + ENET_RANGE_CODER_DECODE (root -> escapes + under, count, total); + root -> total += ENET_CONTEXT_SYMBOL_DELTA; + if (count > 0xFF - 2*ENET_CONTEXT_SYMBOL_DELTA + ENET_CONTEXT_SYMBOL_MINIMUM || root -> total > ENET_RANGE_CODER_BOTTOM - 0x100) + ENET_CONTEXT_RESCALE (root, ENET_CONTEXT_SYMBOL_MINIMUM); + + patchContexts: + for (patch = & rangeCoder -> symbols [predicted]; + patch != subcontext; + patch = & rangeCoder -> symbols [patch -> parent]) + { + ENET_CONTEXT_ENCODE (patch, symbol, value, under, count, ENET_SUBCONTEXT_SYMBOL_DELTA, 0); + * parent = symbol - rangeCoder -> symbols; + parent = & symbol -> parent; + if (count <= 0) + { + patch -> escapes += ENET_SUBCONTEXT_ESCAPE_DELTA; + patch -> total += ENET_SUBCONTEXT_ESCAPE_DELTA; + } + patch -> total += ENET_SUBCONTEXT_SYMBOL_DELTA; + if (count > 0xFF - 2*ENET_SUBCONTEXT_SYMBOL_DELTA || patch -> total > ENET_RANGE_CODER_BOTTOM - 0x100) + ENET_CONTEXT_RESCALE (patch, 0); + } + * parent = bottom; + + ENET_RANGE_CODER_OUTPUT (value); + + if (order >= ENET_SUBCONTEXT_ORDER) + predicted = rangeCoder -> symbols [predicted].parent; + else + order ++; + ENET_RANGE_CODER_FREE_SYMBOLS; + } + + return (size_t) (outData - outStart); +} + +/** @defgroup host ENet host functions + @{ +*/ + +/** Sets the packet compressor the host should use to the default range coder. + @param host host to enable the range coder for + @returns 0 on success, < 0 on failure +*/ +int +enet_host_compress_with_range_coder (ENetHost * host) +{ + ENetCompressor compressor; + memset (& compressor, 0, sizeof (compressor)); + compressor.context = enet_range_coder_create(); + if (compressor.context == NULL) + return -1; + compressor.compress = enet_range_coder_compress; + compressor.decompress = enet_range_coder_decompress; + compressor.destroy = enet_range_coder_destroy; + enet_host_compress (host, & compressor); + return 0; +} + +/** @} */ + + diff --git a/jni/love/src/libraries/enet/libenet/host.c b/jni/love/src/libraries/enet/libenet/host.c new file mode 100644 index 00000000..fc57f741 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/host.c @@ -0,0 +1,490 @@ +/** + @file host.c + @brief ENet host management functions +*/ +#define ENET_BUILDING_LIB 1 +#include +#include "enet/enet.h" + +/** @defgroup host ENet host functions + @{ +*/ + +/** Creates a host for communicating to peers. + + @param address the address at which other peers may connect to this host. If NULL, then no peers may connect to the host. + @param peerCount the maximum number of peers that should be allocated for the host. + @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT + @param incomingBandwidth downstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth. + @param outgoingBandwidth upstream bandwidth of the host in bytes/second; if 0, ENet will assume unlimited bandwidth. + + @returns the host on success and NULL on failure + + @remarks ENet will strategically drop packets on specific sides of a connection between hosts + to ensure the host's bandwidth is not overwhelmed. The bandwidth parameters also determine + the window size of a connection which limits the amount of reliable packets that may be in transit + at any given time. +*/ +ENetHost * +enet_host_create (const ENetAddress * address, size_t peerCount, size_t channelLimit, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth) +{ + ENetHost * host; + ENetPeer * currentPeer; + + if (peerCount > ENET_PROTOCOL_MAXIMUM_PEER_ID) + return NULL; + + host = (ENetHost *) enet_malloc (sizeof (ENetHost)); + if (host == NULL) + return NULL; + memset (host, 0, sizeof (ENetHost)); + + host -> peers = (ENetPeer *) enet_malloc (peerCount * sizeof (ENetPeer)); + if (host -> peers == NULL) + { + enet_free (host); + + return NULL; + } + memset (host -> peers, 0, peerCount * sizeof (ENetPeer)); + + host -> socket = enet_socket_create (ENET_SOCKET_TYPE_DATAGRAM); + if (host -> socket == ENET_SOCKET_NULL || (address != NULL && enet_socket_bind (host -> socket, address) < 0)) + { + if (host -> socket != ENET_SOCKET_NULL) + enet_socket_destroy (host -> socket); + + enet_free (host -> peers); + enet_free (host); + + return NULL; + } + + enet_socket_set_option (host -> socket, ENET_SOCKOPT_NONBLOCK, 1); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_BROADCAST, 1); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_RCVBUF, ENET_HOST_RECEIVE_BUFFER_SIZE); + enet_socket_set_option (host -> socket, ENET_SOCKOPT_SNDBUF, ENET_HOST_SEND_BUFFER_SIZE); + + if (address != NULL && enet_socket_get_address (host -> socket, & host -> address) < 0) + host -> address = * address; + + if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + else + if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + + host -> randomSeed = (enet_uint32) (size_t) host; + host -> randomSeed += enet_host_random_seed (); + host -> randomSeed = (host -> randomSeed << 16) | (host -> randomSeed >> 16); + host -> channelLimit = channelLimit; + host -> incomingBandwidth = incomingBandwidth; + host -> outgoingBandwidth = outgoingBandwidth; + host -> bandwidthThrottleEpoch = 0; + host -> recalculateBandwidthLimits = 0; + host -> mtu = ENET_HOST_DEFAULT_MTU; + host -> peerCount = peerCount; + host -> commandCount = 0; + host -> bufferCount = 0; + host -> checksum = NULL; + host -> receivedAddress.host = ENET_HOST_ANY; + host -> receivedAddress.port = 0; + host -> receivedData = NULL; + host -> receivedDataLength = 0; + + host -> totalSentData = 0; + host -> totalSentPackets = 0; + host -> totalReceivedData = 0; + host -> totalReceivedPackets = 0; + + host -> connectedPeers = 0; + host -> bandwidthLimitedPeers = 0; + host -> duplicatePeers = ENET_PROTOCOL_MAXIMUM_PEER_ID; + + host -> compressor.context = NULL; + host -> compressor.compress = NULL; + host -> compressor.decompress = NULL; + host -> compressor.destroy = NULL; + + host -> intercept = NULL; + + enet_list_clear (& host -> dispatchQueue); + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + currentPeer -> host = host; + currentPeer -> incomingPeerID = currentPeer - host -> peers; + currentPeer -> outgoingSessionID = currentPeer -> incomingSessionID = 0xFF; + currentPeer -> data = NULL; + + enet_list_clear (& currentPeer -> acknowledgements); + enet_list_clear (& currentPeer -> sentReliableCommands); + enet_list_clear (& currentPeer -> sentUnreliableCommands); + enet_list_clear (& currentPeer -> outgoingReliableCommands); + enet_list_clear (& currentPeer -> outgoingUnreliableCommands); + enet_list_clear (& currentPeer -> dispatchedCommands); + + enet_peer_reset (currentPeer); + } + + return host; +} + +/** Destroys the host and all resources associated with it. + @param host pointer to the host to destroy +*/ +void +enet_host_destroy (ENetHost * host) +{ + ENetPeer * currentPeer; + + if (host == NULL) + return; + + enet_socket_destroy (host -> socket); + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + enet_peer_reset (currentPeer); + } + + if (host -> compressor.context != NULL && host -> compressor.destroy) + (* host -> compressor.destroy) (host -> compressor.context); + + enet_free (host -> peers); + enet_free (host); +} + +/** Initiates a connection to a foreign host. + @param host host seeking the connection + @param address destination for the connection + @param channelCount number of channels to allocate + @param data user data supplied to the receiving host + @returns a peer representing the foreign host on success, NULL on failure + @remarks The peer returned will have not completed the connection until enet_host_service() + notifies of an ENET_EVENT_TYPE_CONNECT event for the peer. +*/ +ENetPeer * +enet_host_connect (ENetHost * host, const ENetAddress * address, size_t channelCount, enet_uint32 data) +{ + ENetPeer * currentPeer; + ENetChannel * channel; + ENetProtocol command; + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelCount = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + else + if (channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelCount = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED) + break; + } + + if (currentPeer >= & host -> peers [host -> peerCount]) + return NULL; + + currentPeer -> channels = (ENetChannel *) enet_malloc (channelCount * sizeof (ENetChannel)); + if (currentPeer -> channels == NULL) + return NULL; + currentPeer -> channelCount = channelCount; + currentPeer -> state = ENET_PEER_STATE_CONNECTING; + currentPeer -> address = * address; + currentPeer -> connectID = ++ host -> randomSeed; + + if (host -> outgoingBandwidth == 0) + currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + currentPeer -> windowSize = (host -> outgoingBandwidth / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (currentPeer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + currentPeer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (currentPeer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + currentPeer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + for (channel = currentPeer -> channels; + channel < & currentPeer -> channels [channelCount]; + ++ channel) + { + channel -> outgoingReliableSequenceNumber = 0; + channel -> outgoingUnreliableSequenceNumber = 0; + channel -> incomingReliableSequenceNumber = 0; + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_clear (& channel -> incomingReliableCommands); + enet_list_clear (& channel -> incomingUnreliableCommands); + + channel -> usedReliableWindows = 0; + memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows)); + } + + command.header.command = ENET_PROTOCOL_COMMAND_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + command.connect.outgoingPeerID = ENET_HOST_TO_NET_16 (currentPeer -> incomingPeerID); + command.connect.incomingSessionID = currentPeer -> incomingSessionID; + command.connect.outgoingSessionID = currentPeer -> outgoingSessionID; + command.connect.mtu = ENET_HOST_TO_NET_32 (currentPeer -> mtu); + command.connect.windowSize = ENET_HOST_TO_NET_32 (currentPeer -> windowSize); + command.connect.channelCount = ENET_HOST_TO_NET_32 (channelCount); + command.connect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth); + command.connect.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + command.connect.packetThrottleInterval = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleInterval); + command.connect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleAcceleration); + command.connect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (currentPeer -> packetThrottleDeceleration); + command.connect.connectID = currentPeer -> connectID; + command.connect.data = ENET_HOST_TO_NET_32 (data); + + enet_peer_queue_outgoing_command (currentPeer, & command, NULL, 0, 0); + + return currentPeer; +} + +/** Queues a packet to be sent to all peers associated with the host. + @param host host on which to broadcast the packet + @param channelID channel on which to broadcast + @param packet packet to broadcast +*/ +void +enet_host_broadcast (ENetHost * host, enet_uint8 channelID, ENetPacket * packet) +{ + ENetPeer * currentPeer; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state != ENET_PEER_STATE_CONNECTED) + continue; + + enet_peer_send (currentPeer, channelID, packet); + } + + if (packet -> referenceCount == 0) + enet_packet_destroy (packet); +} + +/** Sets the packet compressor the host should use to compress and decompress packets. + @param host host to enable or disable compression for + @param compressor callbacks for for the packet compressor; if NULL, then compression is disabled +*/ +void +enet_host_compress (ENetHost * host, const ENetCompressor * compressor) +{ + if (host -> compressor.context != NULL && host -> compressor.destroy) + (* host -> compressor.destroy) (host -> compressor.context); + + if (compressor) + host -> compressor = * compressor; + else + host -> compressor.context = NULL; +} + +/** Limits the maximum allowed channels of future incoming connections. + @param host host to limit + @param channelLimit the maximum number of channels allowed; if 0, then this is equivalent to ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT +*/ +void +enet_host_channel_limit (ENetHost * host, size_t channelLimit) +{ + if (! channelLimit || channelLimit > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT; + else + if (channelLimit < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT) + channelLimit = ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT; + + host -> channelLimit = channelLimit; +} + + +/** Adjusts the bandwidth limits of a host. + @param host host to adjust + @param incomingBandwidth new incoming bandwidth + @param outgoingBandwidth new outgoing bandwidth + @remarks the incoming and outgoing bandwidth parameters are identical in function to those + specified in enet_host_create(). +*/ +void +enet_host_bandwidth_limit (ENetHost * host, enet_uint32 incomingBandwidth, enet_uint32 outgoingBandwidth) +{ + host -> incomingBandwidth = incomingBandwidth; + host -> outgoingBandwidth = outgoingBandwidth; + host -> recalculateBandwidthLimits = 1; +} + +void +enet_host_bandwidth_throttle (ENetHost * host) +{ + enet_uint32 timeCurrent = enet_time_get (), + elapsedTime = timeCurrent - host -> bandwidthThrottleEpoch, + peersRemaining = (enet_uint32) host -> connectedPeers, + dataTotal = ~0, + bandwidth = ~0, + throttle = 0, + bandwidthLimit = 0; + int needsAdjustment = host -> bandwidthLimitedPeers > 0 ? 1 : 0; + ENetPeer * peer; + ENetProtocol command; + + if (elapsedTime < ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL) + return; + + host -> bandwidthThrottleEpoch = timeCurrent; + + if (peersRemaining == 0) + return; + + if (host -> outgoingBandwidth != 0) + { + dataTotal = 0; + bandwidth = (host -> outgoingBandwidth * elapsedTime) / 1000; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + continue; + + dataTotal += peer -> outgoingDataTotal; + } + } + + while (peersRemaining > 0 && needsAdjustment != 0) + { + needsAdjustment = 0; + + if (dataTotal <= bandwidth) + throttle = ENET_PEER_PACKET_THROTTLE_SCALE; + else + throttle = (bandwidth * ENET_PEER_PACKET_THROTTLE_SCALE) / dataTotal; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + enet_uint32 peerBandwidth; + + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> incomingBandwidth == 0 || + peer -> outgoingBandwidthThrottleEpoch == timeCurrent) + continue; + + peerBandwidth = (peer -> incomingBandwidth * elapsedTime) / 1000; + if ((throttle * peer -> outgoingDataTotal) / ENET_PEER_PACKET_THROTTLE_SCALE <= peerBandwidth) + continue; + + peer -> packetThrottleLimit = (peerBandwidth * + ENET_PEER_PACKET_THROTTLE_SCALE) / peer -> outgoingDataTotal; + + if (peer -> packetThrottleLimit == 0) + peer -> packetThrottleLimit = 1; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + peer -> outgoingBandwidthThrottleEpoch = timeCurrent; + + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + + needsAdjustment = 1; + -- peersRemaining; + bandwidth -= peerBandwidth; + dataTotal -= peerBandwidth; + } + } + + if (peersRemaining > 0) + { + if (dataTotal <= bandwidth) + throttle = ENET_PEER_PACKET_THROTTLE_SCALE; + else + throttle = (bandwidth * ENET_PEER_PACKET_THROTTLE_SCALE) / dataTotal; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> outgoingBandwidthThrottleEpoch == timeCurrent) + continue; + + peer -> packetThrottleLimit = throttle; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + } + } + + if (host -> recalculateBandwidthLimits) + { + host -> recalculateBandwidthLimits = 0; + + peersRemaining = (enet_uint32) host -> connectedPeers; + bandwidth = host -> incomingBandwidth; + needsAdjustment = 1; + + if (bandwidth == 0) + bandwidthLimit = 0; + else + while (peersRemaining > 0 && needsAdjustment != 0) + { + needsAdjustment = 0; + bandwidthLimit = bandwidth / peersRemaining; + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if ((peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) || + peer -> incomingBandwidthThrottleEpoch == timeCurrent) + continue; + + if (peer -> outgoingBandwidth > 0 && + peer -> outgoingBandwidth >= bandwidthLimit) + continue; + + peer -> incomingBandwidthThrottleEpoch = timeCurrent; + + needsAdjustment = 1; + -- peersRemaining; + bandwidth -= peer -> outgoingBandwidth; + } + } + + for (peer = host -> peers; + peer < & host -> peers [host -> peerCount]; + ++ peer) + { + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + continue; + + command.header.command = ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + command.bandwidthLimit.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + + if (peer -> incomingBandwidthThrottleEpoch == timeCurrent) + command.bandwidthLimit.incomingBandwidth = ENET_HOST_TO_NET_32 (peer -> outgoingBandwidth); + else + command.bandwidthLimit.incomingBandwidth = ENET_HOST_TO_NET_32 (bandwidthLimit); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + } + } +} + +/** @} */ diff --git a/jni/love/src/libraries/enet/libenet/include/enet/callbacks.h b/jni/love/src/libraries/enet/libenet/include/enet/callbacks.h new file mode 100644 index 00000000..340a4a98 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/callbacks.h @@ -0,0 +1,27 @@ +/** + @file callbacks.h + @brief ENet callbacks +*/ +#ifndef __ENET_CALLBACKS_H__ +#define __ENET_CALLBACKS_H__ + +#include + +typedef struct _ENetCallbacks +{ + void * (ENET_CALLBACK * malloc) (size_t size); + void (ENET_CALLBACK * free) (void * memory); + void (ENET_CALLBACK * no_memory) (void); +} ENetCallbacks; + +/** @defgroup callbacks ENet internal callbacks + @{ + @ingroup private +*/ +extern void * enet_malloc (size_t); +extern void enet_free (void *); + +/** @} */ + +#endif /* __ENET_CALLBACKS_H__ */ + diff --git a/jni/love/src/libraries/enet/libenet/include/enet/enet.h b/jni/love/src/libraries/enet/libenet/include/enet/enet.h new file mode 100644 index 00000000..4dda5517 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/enet.h @@ -0,0 +1,587 @@ +/** + @file enet.h + @brief ENet public header file +*/ +#ifndef __ENET_ENET_H__ +#define __ENET_ENET_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include + +#ifdef _WIN32 +#include "enet/win32.h" +#else +#include "enet/unix.h" +#endif + +#include "enet/types.h" +#include "enet/protocol.h" +#include "enet/list.h" +#include "enet/callbacks.h" + +#define ENET_VERSION_MAJOR 1 +#define ENET_VERSION_MINOR 3 +#define ENET_VERSION_PATCH 10 +#define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch)) +#define ENET_VERSION_GET_MAJOR(version) (((version)>>16)&0xFF) +#define ENET_VERSION_GET_MINOR(version) (((version)>>8)&0xFF) +#define ENET_VERSION_GET_PATCH(version) ((version)&0xFF) +#define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH) + +typedef enet_uint32 ENetVersion; + +struct _ENetHost; +struct _ENetEvent; +struct _ENetPacket; + +typedef enum _ENetSocketType +{ + ENET_SOCKET_TYPE_STREAM = 1, + ENET_SOCKET_TYPE_DATAGRAM = 2 +} ENetSocketType; + +typedef enum _ENetSocketWait +{ + ENET_SOCKET_WAIT_NONE = 0, + ENET_SOCKET_WAIT_SEND = (1 << 0), + ENET_SOCKET_WAIT_RECEIVE = (1 << 1), + ENET_SOCKET_WAIT_INTERRUPT = (1 << 2) +} ENetSocketWait; + +typedef enum _ENetSocketOption +{ + ENET_SOCKOPT_NONBLOCK = 1, + ENET_SOCKOPT_BROADCAST = 2, + ENET_SOCKOPT_RCVBUF = 3, + ENET_SOCKOPT_SNDBUF = 4, + ENET_SOCKOPT_REUSEADDR = 5, + ENET_SOCKOPT_RCVTIMEO = 6, + ENET_SOCKOPT_SNDTIMEO = 7, + ENET_SOCKOPT_ERROR = 8, + ENET_SOCKOPT_NODELAY = 9 +} ENetSocketOption; + +typedef enum _ENetSocketShutdown +{ + ENET_SOCKET_SHUTDOWN_READ = 0, + ENET_SOCKET_SHUTDOWN_WRITE = 1, + ENET_SOCKET_SHUTDOWN_READ_WRITE = 2 +} ENetSocketShutdown; + +#define ENET_HOST_ANY 0 +#define ENET_HOST_BROADCAST 0xFFFFFFFFU +#define ENET_PORT_ANY 0 + +/** + * Portable internet address structure. + * + * The host must be specified in network byte-order, and the port must be in host + * byte-order. The constant ENET_HOST_ANY may be used to specify the default + * server host. The constant ENET_HOST_BROADCAST may be used to specify the + * broadcast address (255.255.255.255). This makes sense for enet_host_connect, + * but not for enet_host_create. Once a server responds to a broadcast, the + * address is updated from ENET_HOST_BROADCAST to the server's actual IP address. + */ +typedef struct _ENetAddress +{ + enet_uint32 host; + enet_uint16 port; +} ENetAddress; + +/** + * Packet flag bit constants. + * + * The host must be specified in network byte-order, and the port must be in + * host byte-order. The constant ENET_HOST_ANY may be used to specify the + * default server host. + + @sa ENetPacket +*/ +typedef enum _ENetPacketFlag +{ + /** packet must be received by the target peer and resend attempts should be + * made until the packet is delivered */ + ENET_PACKET_FLAG_RELIABLE = (1 << 0), + /** packet will not be sequenced with other packets + * not supported for reliable packets + */ + ENET_PACKET_FLAG_UNSEQUENCED = (1 << 1), + /** packet will not allocate data, and user must supply it instead */ + ENET_PACKET_FLAG_NO_ALLOCATE = (1 << 2), + /** packet will be fragmented using unreliable (instead of reliable) sends + * if it exceeds the MTU */ + ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT = (1 << 3), + + /** whether the packet has been sent from all queues it has been entered into */ + ENET_PACKET_FLAG_SENT = (1<<8) +} ENetPacketFlag; + +typedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *); + +/** + * ENet packet structure. + * + * An ENet data packet that may be sent to or received from a peer. The shown + * fields should only be read and never modified. The data field contains the + * allocated data for the packet. The dataLength fields specifies the length + * of the allocated data. The flags field is either 0 (specifying no flags), + * or a bitwise-or of any combination of the following flags: + * + * ENET_PACKET_FLAG_RELIABLE - packet must be received by the target peer + * and resend attempts should be made until the packet is delivered + * + * ENET_PACKET_FLAG_UNSEQUENCED - packet will not be sequenced with other packets + * (not supported for reliable packets) + * + * ENET_PACKET_FLAG_NO_ALLOCATE - packet will not allocate data, and user must supply it instead + + @sa ENetPacketFlag + */ +typedef struct _ENetPacket +{ + size_t referenceCount; /**< internal use only */ + enet_uint32 flags; /**< bitwise-or of ENetPacketFlag constants */ + enet_uint8 * data; /**< allocated data for packet */ + size_t dataLength; /**< length of data */ + ENetPacketFreeCallback freeCallback; /**< function to be called when the packet is no longer in use */ + void * userData; /**< application private data, may be freely modified */ +} ENetPacket; + +typedef struct _ENetAcknowledgement +{ + ENetListNode acknowledgementList; + enet_uint32 sentTime; + ENetProtocol command; +} ENetAcknowledgement; + +typedef struct _ENetOutgoingCommand +{ + ENetListNode outgoingCommandList; + enet_uint16 reliableSequenceNumber; + enet_uint16 unreliableSequenceNumber; + enet_uint32 sentTime; + enet_uint32 roundTripTimeout; + enet_uint32 roundTripTimeoutLimit; + enet_uint32 fragmentOffset; + enet_uint16 fragmentLength; + enet_uint16 sendAttempts; + ENetProtocol command; + ENetPacket * packet; +} ENetOutgoingCommand; + +typedef struct _ENetIncomingCommand +{ + ENetListNode incomingCommandList; + enet_uint16 reliableSequenceNumber; + enet_uint16 unreliableSequenceNumber; + ENetProtocol command; + enet_uint32 fragmentCount; + enet_uint32 fragmentsRemaining; + enet_uint32 * fragments; + ENetPacket * packet; +} ENetIncomingCommand; + +typedef enum _ENetPeerState +{ + ENET_PEER_STATE_DISCONNECTED = 0, + ENET_PEER_STATE_CONNECTING = 1, + ENET_PEER_STATE_ACKNOWLEDGING_CONNECT = 2, + ENET_PEER_STATE_CONNECTION_PENDING = 3, + ENET_PEER_STATE_CONNECTION_SUCCEEDED = 4, + ENET_PEER_STATE_CONNECTED = 5, + ENET_PEER_STATE_DISCONNECT_LATER = 6, + ENET_PEER_STATE_DISCONNECTING = 7, + ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT = 8, + ENET_PEER_STATE_ZOMBIE = 9 +} ENetPeerState; + +#ifndef ENET_BUFFER_MAXIMUM +#define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS) +#endif + +enum +{ + ENET_HOST_RECEIVE_BUFFER_SIZE = 256 * 1024, + ENET_HOST_SEND_BUFFER_SIZE = 256 * 1024, + ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL = 1000, + ENET_HOST_DEFAULT_MTU = 1400, + + ENET_PEER_DEFAULT_ROUND_TRIP_TIME = 500, + ENET_PEER_DEFAULT_PACKET_THROTTLE = 32, + ENET_PEER_PACKET_THROTTLE_SCALE = 32, + ENET_PEER_PACKET_THROTTLE_COUNTER = 7, + ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2, + ENET_PEER_PACKET_THROTTLE_DECELERATION = 2, + ENET_PEER_PACKET_THROTTLE_INTERVAL = 5000, + ENET_PEER_PACKET_LOSS_SCALE = (1 << 16), + ENET_PEER_PACKET_LOSS_INTERVAL = 10000, + ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024, + ENET_PEER_TIMEOUT_LIMIT = 32, + ENET_PEER_TIMEOUT_MINIMUM = 5000, + ENET_PEER_TIMEOUT_MAXIMUM = 30000, + ENET_PEER_PING_INTERVAL = 500, + ENET_PEER_UNSEQUENCED_WINDOWS = 64, + ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024, + ENET_PEER_FREE_UNSEQUENCED_WINDOWS = 32, + ENET_PEER_RELIABLE_WINDOWS = 16, + ENET_PEER_RELIABLE_WINDOW_SIZE = 0x1000, + ENET_PEER_FREE_RELIABLE_WINDOWS = 8 +}; + +typedef struct _ENetChannel +{ + enet_uint16 outgoingReliableSequenceNumber; + enet_uint16 outgoingUnreliableSequenceNumber; + enet_uint16 usedReliableWindows; + enet_uint16 reliableWindows [ENET_PEER_RELIABLE_WINDOWS]; + enet_uint16 incomingReliableSequenceNumber; + enet_uint16 incomingUnreliableSequenceNumber; + ENetList incomingReliableCommands; + ENetList incomingUnreliableCommands; +} ENetChannel; + +/** + * An ENet peer which data packets may be sent or received from. + * + * No fields should be modified unless otherwise specified. + */ +typedef struct _ENetPeer +{ + ENetListNode dispatchList; + struct _ENetHost * host; + enet_uint16 outgoingPeerID; + enet_uint16 incomingPeerID; + enet_uint32 connectID; + enet_uint8 outgoingSessionID; + enet_uint8 incomingSessionID; + ENetAddress address; /**< Internet address of the peer */ + void * data; /**< Application private data, may be freely modified */ + ENetPeerState state; + ENetChannel * channels; + size_t channelCount; /**< Number of channels allocated for communication with peer */ + enet_uint32 incomingBandwidth; /**< Downstream bandwidth of the client in bytes/second */ + enet_uint32 outgoingBandwidth; /**< Upstream bandwidth of the client in bytes/second */ + enet_uint32 incomingBandwidthThrottleEpoch; + enet_uint32 outgoingBandwidthThrottleEpoch; + enet_uint32 incomingDataTotal; + enet_uint32 outgoingDataTotal; + enet_uint32 lastSendTime; + enet_uint32 lastReceiveTime; + enet_uint32 nextTimeout; + enet_uint32 earliestTimeout; + enet_uint32 packetLossEpoch; + enet_uint32 packetsSent; + enet_uint32 packetsLost; + enet_uint32 packetLoss; /**< mean packet loss of reliable packets as a ratio with respect to the constant ENET_PEER_PACKET_LOSS_SCALE */ + enet_uint32 packetLossVariance; + enet_uint32 packetThrottle; + enet_uint32 packetThrottleLimit; + enet_uint32 packetThrottleCounter; + enet_uint32 packetThrottleEpoch; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 packetThrottleInterval; + enet_uint32 pingInterval; + enet_uint32 timeoutLimit; + enet_uint32 timeoutMinimum; + enet_uint32 timeoutMaximum; + enet_uint32 lastRoundTripTime; + enet_uint32 lowestRoundTripTime; + enet_uint32 lastRoundTripTimeVariance; + enet_uint32 highestRoundTripTimeVariance; + enet_uint32 roundTripTime; /**< mean round trip time (RTT), in milliseconds, between sending a reliable packet and receiving its acknowledgement */ + enet_uint32 roundTripTimeVariance; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 reliableDataInTransit; + enet_uint16 outgoingReliableSequenceNumber; + ENetList acknowledgements; + ENetList sentReliableCommands; + ENetList sentUnreliableCommands; + ENetList outgoingReliableCommands; + ENetList outgoingUnreliableCommands; + ENetList dispatchedCommands; + int needsDispatch; + enet_uint16 incomingUnsequencedGroup; + enet_uint16 outgoingUnsequencedGroup; + enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32]; + enet_uint32 eventData; +} ENetPeer; + +/** An ENet packet compressor for compressing UDP packets before socket sends or receives. + */ +typedef struct _ENetCompressor +{ + /** Context data for the compressor. Must be non-NULL. */ + void * context; + /** Compresses from inBuffers[0:inBufferCount-1], containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ + size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit); + /** Decompresses from inData, containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ + size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit); + /** Destroys the context when compression is disabled or the host is destroyed. May be NULL. */ + void (ENET_CALLBACK * destroy) (void * context); +} ENetCompressor; + +/** Callback that computes the checksum of the data held in buffers[0:bufferCount-1] */ +typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount); + +/** Callback for intercepting received raw UDP packets. Should return 1 to intercept, 0 to ignore, or -1 to propagate an error. */ +typedef int (ENET_CALLBACK * ENetInterceptCallback) (struct _ENetHost * host, struct _ENetEvent * event); + +/** An ENet host for communicating with peers. + * + * No fields should be modified unless otherwise stated. + + @sa enet_host_create() + @sa enet_host_destroy() + @sa enet_host_connect() + @sa enet_host_service() + @sa enet_host_flush() + @sa enet_host_broadcast() + @sa enet_host_compress() + @sa enet_host_compress_with_range_coder() + @sa enet_host_channel_limit() + @sa enet_host_bandwidth_limit() + @sa enet_host_bandwidth_throttle() + */ +typedef struct _ENetHost +{ + ENetSocket socket; + ENetAddress address; /**< Internet address of the host */ + enet_uint32 incomingBandwidth; /**< downstream bandwidth of the host */ + enet_uint32 outgoingBandwidth; /**< upstream bandwidth of the host */ + enet_uint32 bandwidthThrottleEpoch; + enet_uint32 mtu; + enet_uint32 randomSeed; + int recalculateBandwidthLimits; + ENetPeer * peers; /**< array of peers allocated for this host */ + size_t peerCount; /**< number of peers allocated for this host */ + size_t channelLimit; /**< maximum number of channels allowed for connected peers */ + enet_uint32 serviceTime; + ENetList dispatchQueue; + int continueSending; + size_t packetSize; + enet_uint16 headerFlags; + ENetProtocol commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS]; + size_t commandCount; + ENetBuffer buffers [ENET_BUFFER_MAXIMUM]; + size_t bufferCount; + ENetChecksumCallback checksum; /**< callback the user can set to enable packet checksums for this host */ + ENetCompressor compressor; + enet_uint8 packetData [2][ENET_PROTOCOL_MAXIMUM_MTU]; + ENetAddress receivedAddress; + enet_uint8 * receivedData; + size_t receivedDataLength; + enet_uint32 totalSentData; /**< total data sent, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalSentPackets; /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalReceivedData; /**< total data received, user should reset to 0 as needed to prevent overflow */ + enet_uint32 totalReceivedPackets; /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */ + ENetInterceptCallback intercept; /**< callback the user can set to intercept received raw UDP packets */ + size_t connectedPeers; + size_t bandwidthLimitedPeers; + size_t duplicatePeers; /**< optional number of allowed peers from duplicate IPs, defaults to ENET_PROTOCOL_MAXIMUM_PEER_ID */ +} ENetHost; + +/** + * An ENet event type, as specified in @ref ENetEvent. + */ +typedef enum _ENetEventType +{ + /** no event occurred within the specified time limit */ + ENET_EVENT_TYPE_NONE = 0, + + /** a connection request initiated by enet_host_connect has completed. + * The peer field contains the peer which successfully connected. + */ + ENET_EVENT_TYPE_CONNECT = 1, + + /** a peer has disconnected. This event is generated on a successful + * completion of a disconnect initiated by enet_pper_disconnect, if + * a peer has timed out, or if a connection request intialized by + * enet_host_connect has timed out. The peer field contains the peer + * which disconnected. The data field contains user supplied data + * describing the disconnection, or 0, if none is available. + */ + ENET_EVENT_TYPE_DISCONNECT = 2, + + /** a packet has been received from a peer. The peer field specifies the + * peer which sent the packet. The channelID field specifies the channel + * number upon which the packet was received. The packet field contains + * the packet that was received; this packet must be destroyed with + * enet_packet_destroy after use. + */ + ENET_EVENT_TYPE_RECEIVE = 3 +} ENetEventType; + +/** + * An ENet event as returned by enet_host_service(). + + @sa enet_host_service + */ +typedef struct _ENetEvent +{ + ENetEventType type; /**< type of the event */ + ENetPeer * peer; /**< peer that generated a connect, disconnect or receive event */ + enet_uint8 channelID; /**< channel on the peer that generated the event, if appropriate */ + enet_uint32 data; /**< data associated with the event, if appropriate */ + ENetPacket * packet; /**< packet associated with the event, if appropriate */ +} ENetEvent; + +/** @defgroup global ENet global functions + @{ +*/ + +/** + Initializes ENet globally. Must be called prior to using any functions in + ENet. + @returns 0 on success, < 0 on failure +*/ +ENET_API int enet_initialize (void); + +/** + Initializes ENet globally and supplies user-overridden callbacks. Must be called prior to using any functions in ENet. Do not use enet_initialize() if you use this variant. Make sure the ENetCallbacks structure is zeroed out so that any additional callbacks added in future versions will be properly ignored. + + @param version the constant ENET_VERSION should be supplied so ENet knows which version of ENetCallbacks struct to use + @param inits user-overriden callbacks where any NULL callbacks will use ENet's defaults + @returns 0 on success, < 0 on failure +*/ +ENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits); + +/** + Shuts down ENet globally. Should be called when a program that has + initialized ENet exits. +*/ +ENET_API void enet_deinitialize (void); + +/** + Gives the linked version of the ENet library. + @returns the version number +*/ +ENET_API ENetVersion enet_linked_version (void); + +/** @} */ + +/** @defgroup private ENet private implementation functions */ + +/** + Returns the wall-time in milliseconds. Its initial value is unspecified + unless otherwise set. + */ +ENET_API enet_uint32 enet_time_get (void); +/** + Sets the current wall-time in milliseconds. + */ +ENET_API void enet_time_set (enet_uint32); + +/** @defgroup socket ENet socket functions + @{ +*/ +ENET_API ENetSocket enet_socket_create (ENetSocketType); +ENET_API int enet_socket_bind (ENetSocket, const ENetAddress *); +ENET_API int enet_socket_get_address (ENetSocket, ENetAddress *); +ENET_API int enet_socket_listen (ENetSocket, int); +ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *); +ENET_API int enet_socket_connect (ENetSocket, const ENetAddress *); +ENET_API int enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t); +ENET_API int enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t); +ENET_API int enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32); +ENET_API int enet_socket_set_option (ENetSocket, ENetSocketOption, int); +ENET_API int enet_socket_get_option (ENetSocket, ENetSocketOption, int *); +ENET_API int enet_socket_shutdown (ENetSocket, ENetSocketShutdown); +ENET_API void enet_socket_destroy (ENetSocket); +ENET_API int enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32); + +/** @} */ + +/** @defgroup Address ENet address functions + @{ +*/ +/** Attempts to resolve the host named by the parameter hostName and sets + the host field in the address parameter if successful. + @param address destination to store resolved address + @param hostName host name to lookup + @retval 0 on success + @retval < 0 on failure + @returns the address of the given hostName in address on success +*/ +ENET_API int enet_address_set_host (ENetAddress * address, const char * hostName); + +/** Gives the printable form of the ip address specified in the address parameter. + @param address address printed + @param hostName destination for name, must not be NULL + @param nameLength maximum length of hostName. + @returns the null-terminated name of the host in hostName on success + @retval 0 on success + @retval < 0 on failure +*/ +ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength); + +/** Attempts to do a reverse lookup of the host field in the address parameter. + @param address address used for reverse lookup + @param hostName destination for name, must not be NULL + @param nameLength maximum length of hostName. + @returns the null-terminated name of the host in hostName on success + @retval 0 on success + @retval < 0 on failure +*/ +ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength); + +/** @} */ + +ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32); +ENET_API void enet_packet_destroy (ENetPacket *); +ENET_API int enet_packet_resize (ENetPacket *, size_t); +ENET_API enet_uint32 enet_crc32 (const ENetBuffer *, size_t); + +ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32); +ENET_API void enet_host_destroy (ENetHost *); +ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32); +ENET_API int enet_host_check_events (ENetHost *, ENetEvent *); +ENET_API int enet_host_service (ENetHost *, ENetEvent *, enet_uint32); +ENET_API void enet_host_flush (ENetHost *); +ENET_API void enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *); +ENET_API void enet_host_compress (ENetHost *, const ENetCompressor *); +ENET_API int enet_host_compress_with_range_coder (ENetHost * host); +ENET_API void enet_host_channel_limit (ENetHost *, size_t); +ENET_API void enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32); +extern void enet_host_bandwidth_throttle (ENetHost *); +extern enet_uint32 enet_host_random_seed (void); + +ENET_API int enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *); +ENET_API ENetPacket * enet_peer_receive (ENetPeer *, enet_uint8 * channelID); +ENET_API void enet_peer_ping (ENetPeer *); +ENET_API void enet_peer_ping_interval (ENetPeer *, enet_uint32); +ENET_API void enet_peer_timeout (ENetPeer *, enet_uint32, enet_uint32, enet_uint32); +ENET_API void enet_peer_reset (ENetPeer *); +ENET_API void enet_peer_disconnect (ENetPeer *, enet_uint32); +ENET_API void enet_peer_disconnect_now (ENetPeer *, enet_uint32); +ENET_API void enet_peer_disconnect_later (ENetPeer *, enet_uint32); +ENET_API void enet_peer_throttle_configure (ENetPeer *, enet_uint32, enet_uint32, enet_uint32); +extern int enet_peer_throttle (ENetPeer *, enet_uint32); +extern void enet_peer_reset_queues (ENetPeer *); +extern void enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *); +extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16); +extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32); +extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16); +extern void enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *); +extern void enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *); +extern void enet_peer_on_connect (ENetPeer *); +extern void enet_peer_on_disconnect (ENetPeer *); + +ENET_API void * enet_range_coder_create (void); +ENET_API void enet_range_coder_destroy (void *); +ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t); +ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t); + +extern size_t enet_protocol_command_size (enet_uint8); + +#ifdef __cplusplus +} +#endif + +#endif /* __ENET_ENET_H__ */ + diff --git a/jni/love/src/libraries/enet/libenet/include/enet/list.h b/jni/love/src/libraries/enet/libenet/include/enet/list.h new file mode 100644 index 00000000..d7b26008 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/list.h @@ -0,0 +1,43 @@ +/** + @file list.h + @brief ENet list management +*/ +#ifndef __ENET_LIST_H__ +#define __ENET_LIST_H__ + +#include + +typedef struct _ENetListNode +{ + struct _ENetListNode * next; + struct _ENetListNode * previous; +} ENetListNode; + +typedef ENetListNode * ENetListIterator; + +typedef struct _ENetList +{ + ENetListNode sentinel; +} ENetList; + +extern void enet_list_clear (ENetList *); + +extern ENetListIterator enet_list_insert (ENetListIterator, void *); +extern void * enet_list_remove (ENetListIterator); +extern ENetListIterator enet_list_move (ENetListIterator, void *, void *); + +extern size_t enet_list_size (ENetList *); + +#define enet_list_begin(list) ((list) -> sentinel.next) +#define enet_list_end(list) (& (list) -> sentinel) + +#define enet_list_empty(list) (enet_list_begin (list) == enet_list_end (list)) + +#define enet_list_next(iterator) ((iterator) -> next) +#define enet_list_previous(iterator) ((iterator) -> previous) + +#define enet_list_front(list) ((void *) (list) -> sentinel.next) +#define enet_list_back(list) ((void *) (list) -> sentinel.previous) + +#endif /* __ENET_LIST_H__ */ + diff --git a/jni/love/src/libraries/enet/libenet/include/enet/protocol.h b/jni/love/src/libraries/enet/libenet/include/enet/protocol.h new file mode 100644 index 00000000..b8f84162 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/protocol.h @@ -0,0 +1,199 @@ +/** + @file protocol.h + @brief ENet protocol +*/ +#ifndef __ENET_PROTOCOL_H__ +#define __ENET_PROTOCOL_H__ + +#include "enet/types.h" + +enum +{ + ENET_PROTOCOL_MINIMUM_MTU = 576, + ENET_PROTOCOL_MAXIMUM_MTU = 4096, + ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS = 32, + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE = 4096, + ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE = 65536, + ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT = 1, + ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT = 255, + ENET_PROTOCOL_MAXIMUM_PEER_ID = 0xFFF, + ENET_PROTOCOL_MAXIMUM_PACKET_SIZE = 1024 * 1024 * 1024, + ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT = 1024 * 1024 +}; + +typedef enum _ENetProtocolCommand +{ + ENET_PROTOCOL_COMMAND_NONE = 0, + ENET_PROTOCOL_COMMAND_ACKNOWLEDGE = 1, + ENET_PROTOCOL_COMMAND_CONNECT = 2, + ENET_PROTOCOL_COMMAND_VERIFY_CONNECT = 3, + ENET_PROTOCOL_COMMAND_DISCONNECT = 4, + ENET_PROTOCOL_COMMAND_PING = 5, + ENET_PROTOCOL_COMMAND_SEND_RELIABLE = 6, + ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE = 7, + ENET_PROTOCOL_COMMAND_SEND_FRAGMENT = 8, + ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED = 9, + ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT = 10, + ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE = 11, + ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT = 12, + ENET_PROTOCOL_COMMAND_COUNT = 13, + + ENET_PROTOCOL_COMMAND_MASK = 0x0F +} ENetProtocolCommand; + +typedef enum _ENetProtocolFlag +{ + ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE = (1 << 7), + ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED = (1 << 6), + + ENET_PROTOCOL_HEADER_FLAG_COMPRESSED = (1 << 14), + ENET_PROTOCOL_HEADER_FLAG_SENT_TIME = (1 << 15), + ENET_PROTOCOL_HEADER_FLAG_MASK = ENET_PROTOCOL_HEADER_FLAG_COMPRESSED | ENET_PROTOCOL_HEADER_FLAG_SENT_TIME, + + ENET_PROTOCOL_HEADER_SESSION_MASK = (3 << 12), + ENET_PROTOCOL_HEADER_SESSION_SHIFT = 12 +} ENetProtocolFlag; + +#ifdef _MSC_VER_ +#pragma pack(push, 1) +#define ENET_PACKED +#elif defined(__GNUC__) || defined(__clang__) +#define ENET_PACKED __attribute__ ((packed)) +#else +#define ENET_PACKED +#endif + +typedef struct _ENetProtocolHeader +{ + enet_uint16 peerID; + enet_uint16 sentTime; +} ENET_PACKED ENetProtocolHeader; + +typedef struct _ENetProtocolCommandHeader +{ + enet_uint8 command; + enet_uint8 channelID; + enet_uint16 reliableSequenceNumber; +} ENET_PACKED ENetProtocolCommandHeader; + +typedef struct _ENetProtocolAcknowledge +{ + ENetProtocolCommandHeader header; + enet_uint16 receivedReliableSequenceNumber; + enet_uint16 receivedSentTime; +} ENET_PACKED ENetProtocolAcknowledge; + +typedef struct _ENetProtocolConnect +{ + ENetProtocolCommandHeader header; + enet_uint16 outgoingPeerID; + enet_uint8 incomingSessionID; + enet_uint8 outgoingSessionID; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 channelCount; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 connectID; + enet_uint32 data; +} ENET_PACKED ENetProtocolConnect; + +typedef struct _ENetProtocolVerifyConnect +{ + ENetProtocolCommandHeader header; + enet_uint16 outgoingPeerID; + enet_uint8 incomingSessionID; + enet_uint8 outgoingSessionID; + enet_uint32 mtu; + enet_uint32 windowSize; + enet_uint32 channelCount; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; + enet_uint32 connectID; +} ENET_PACKED ENetProtocolVerifyConnect; + +typedef struct _ENetProtocolBandwidthLimit +{ + ENetProtocolCommandHeader header; + enet_uint32 incomingBandwidth; + enet_uint32 outgoingBandwidth; +} ENET_PACKED ENetProtocolBandwidthLimit; + +typedef struct _ENetProtocolThrottleConfigure +{ + ENetProtocolCommandHeader header; + enet_uint32 packetThrottleInterval; + enet_uint32 packetThrottleAcceleration; + enet_uint32 packetThrottleDeceleration; +} ENET_PACKED ENetProtocolThrottleConfigure; + +typedef struct _ENetProtocolDisconnect +{ + ENetProtocolCommandHeader header; + enet_uint32 data; +} ENET_PACKED ENetProtocolDisconnect; + +typedef struct _ENetProtocolPing +{ + ENetProtocolCommandHeader header; +} ENET_PACKED ENetProtocolPing; + +typedef struct _ENetProtocolSendReliable +{ + ENetProtocolCommandHeader header; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendReliable; + +typedef struct _ENetProtocolSendUnreliable +{ + ENetProtocolCommandHeader header; + enet_uint16 unreliableSequenceNumber; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendUnreliable; + +typedef struct _ENetProtocolSendUnsequenced +{ + ENetProtocolCommandHeader header; + enet_uint16 unsequencedGroup; + enet_uint16 dataLength; +} ENET_PACKED ENetProtocolSendUnsequenced; + +typedef struct _ENetProtocolSendFragment +{ + ENetProtocolCommandHeader header; + enet_uint16 startSequenceNumber; + enet_uint16 dataLength; + enet_uint32 fragmentCount; + enet_uint32 fragmentNumber; + enet_uint32 totalLength; + enet_uint32 fragmentOffset; +} ENET_PACKED ENetProtocolSendFragment; + +typedef union _ENetProtocol +{ + ENetProtocolCommandHeader header; + ENetProtocolAcknowledge acknowledge; + ENetProtocolConnect connect; + ENetProtocolVerifyConnect verifyConnect; + ENetProtocolDisconnect disconnect; + ENetProtocolPing ping; + ENetProtocolSendReliable sendReliable; + ENetProtocolSendUnreliable sendUnreliable; + ENetProtocolSendUnsequenced sendUnsequenced; + ENetProtocolSendFragment sendFragment; + ENetProtocolBandwidthLimit bandwidthLimit; + ENetProtocolThrottleConfigure throttleConfigure; +} ENET_PACKED ENetProtocol; + +#ifdef _MSC_VER_ +#pragma pack(pop) +#endif + +#endif /* __ENET_PROTOCOL_H__ */ + diff --git a/jni/love/src/libraries/enet/libenet/include/enet/time.h b/jni/love/src/libraries/enet/libenet/include/enet/time.h new file mode 100644 index 00000000..c82a5460 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/time.h @@ -0,0 +1,18 @@ +/** + @file time.h + @brief ENet time constants and macros +*/ +#ifndef __ENET_TIME_H__ +#define __ENET_TIME_H__ + +#define ENET_TIME_OVERFLOW 86400000 + +#define ENET_TIME_LESS(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW) +#define ENET_TIME_GREATER(a, b) ((b) - (a) >= ENET_TIME_OVERFLOW) +#define ENET_TIME_LESS_EQUAL(a, b) (! ENET_TIME_GREATER (a, b)) +#define ENET_TIME_GREATER_EQUAL(a, b) (! ENET_TIME_LESS (a, b)) + +#define ENET_TIME_DIFFERENCE(a, b) ((a) - (b) >= ENET_TIME_OVERFLOW ? (b) - (a) : (a) - (b)) + +#endif /* __ENET_TIME_H__ */ + diff --git a/jni/love/src/libraries/enet/libenet/include/enet/types.h b/jni/love/src/libraries/enet/libenet/include/enet/types.h new file mode 100644 index 00000000..ab010a4b --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/types.h @@ -0,0 +1,13 @@ +/** + @file types.h + @brief type definitions for ENet +*/ +#ifndef __ENET_TYPES_H__ +#define __ENET_TYPES_H__ + +typedef unsigned char enet_uint8; /**< unsigned 8-bit type */ +typedef unsigned short enet_uint16; /**< unsigned 16-bit type */ +typedef unsigned int enet_uint32; /**< unsigned 32-bit type */ + +#endif /* __ENET_TYPES_H__ */ + diff --git a/jni/love/src/libraries/enet/libenet/include/enet/unix.h b/jni/love/src/libraries/enet/libenet/include/enet/unix.h new file mode 100644 index 00000000..9683c09b --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/unix.h @@ -0,0 +1,47 @@ +/** + @file unix.h + @brief ENet Unix header +*/ +#ifndef __ENET_UNIX_H__ +#define __ENET_UNIX_H__ + +#include +#include +#include +#include +#include +#include + +#ifdef MSG_MAXIOVLEN +#define ENET_BUFFER_MAXIMUM MSG_MAXIOVLEN +#endif + +typedef int ENetSocket; + +#define ENET_SOCKET_NULL -1 + +#define ENET_HOST_TO_NET_16(value) (htons (value)) /**< macro that converts host to net byte-order of a 16-bit value */ +#define ENET_HOST_TO_NET_32(value) (htonl (value)) /**< macro that converts host to net byte-order of a 32-bit value */ + +#define ENET_NET_TO_HOST_16(value) (ntohs (value)) /**< macro that converts net to host byte-order of a 16-bit value */ +#define ENET_NET_TO_HOST_32(value) (ntohl (value)) /**< macro that converts net to host byte-order of a 32-bit value */ + +typedef struct +{ + void * data; + size_t dataLength; +} ENetBuffer; + +#define ENET_CALLBACK + +#define ENET_API extern + +typedef fd_set ENetSocketSet; + +#define ENET_SOCKETSET_EMPTY(sockset) FD_ZERO (& (sockset)) +#define ENET_SOCKETSET_ADD(sockset, socket) FD_SET (socket, & (sockset)) +#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLEAR (socket, & (sockset)) +#define ENET_SOCKETSET_CHECK(sockset, socket) FD_ISSET (socket, & (sockset)) + +#endif /* __ENET_UNIX_H__ */ + diff --git a/jni/love/src/libraries/enet/libenet/include/enet/utility.h b/jni/love/src/libraries/enet/libenet/include/enet/utility.h new file mode 100644 index 00000000..e48a476b --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/utility.h @@ -0,0 +1,12 @@ +/** + @file utility.h + @brief ENet utility header +*/ +#ifndef __ENET_UTILITY_H__ +#define __ENET_UTILITY_H__ + +#define ENET_MAX(x, y) ((x) > (y) ? (x) : (y)) +#define ENET_MIN(x, y) ((x) < (y) ? (x) : (y)) + +#endif /* __ENET_UTILITY_H__ */ + diff --git a/jni/love/src/libraries/enet/libenet/include/enet/win32.h b/jni/love/src/libraries/enet/libenet/include/enet/win32.h new file mode 100644 index 00000000..197dfc04 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/include/enet/win32.h @@ -0,0 +1,58 @@ +/** + @file win32.h + @brief ENet Win32 header +*/ +#ifndef __ENET_WIN32_H__ +#define __ENET_WIN32_H__ + +#ifdef _MSC_VER +#ifdef ENET_BUILDING_LIB +#pragma warning (disable: 4996) // 'strncpy' was declared deprecated +#pragma warning (disable: 4267) // size_t to int conversion +#pragma warning (disable: 4244) // 64bit to 32bit int +#pragma warning (disable: 4018) // signed/unsigned mismatch +#pragma warning (disable: 4146) // unary minus operator applied to unsigned type +#endif +#endif + +#include +#include + +typedef SOCKET ENetSocket; + +#define ENET_SOCKET_NULL INVALID_SOCKET + +#define ENET_HOST_TO_NET_16(value) (htons (value)) +#define ENET_HOST_TO_NET_32(value) (htonl (value)) + +#define ENET_NET_TO_HOST_16(value) (ntohs (value)) +#define ENET_NET_TO_HOST_32(value) (ntohl (value)) + +typedef struct +{ + size_t dataLength; + void * data; +} ENetBuffer; + +#define ENET_CALLBACK __cdecl + +#ifdef ENET_DLL +#ifdef ENET_BUILDING_LIB +#define ENET_API __declspec( dllexport ) +#else +#define ENET_API __declspec( dllimport ) +#endif /* ENET_BUILDING_LIB */ +#else /* !ENET_DLL */ +#define ENET_API extern +#endif /* ENET_DLL */ + +typedef fd_set ENetSocketSet; + +#define ENET_SOCKETSET_EMPTY(sockset) FD_ZERO (& (sockset)) +#define ENET_SOCKETSET_ADD(sockset, socket) FD_SET (socket, & (sockset)) +#define ENET_SOCKETSET_REMOVE(sockset, socket) FD_CLEAR (socket, & (sockset)) +#define ENET_SOCKETSET_CHECK(sockset, socket) FD_ISSET (socket, & (sockset)) + +#endif /* __ENET_WIN32_H__ */ + + diff --git a/jni/love/src/libraries/enet/libenet/list.c b/jni/love/src/libraries/enet/libenet/list.c new file mode 100644 index 00000000..1c1a8dfa --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/list.c @@ -0,0 +1,75 @@ +/** + @file list.c + @brief ENet linked list functions +*/ +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** + @defgroup list ENet linked list utility functions + @ingroup private + @{ +*/ +void +enet_list_clear (ENetList * list) +{ + list -> sentinel.next = & list -> sentinel; + list -> sentinel.previous = & list -> sentinel; +} + +ENetListIterator +enet_list_insert (ENetListIterator position, void * data) +{ + ENetListIterator result = (ENetListIterator) data; + + result -> previous = position -> previous; + result -> next = position; + + result -> previous -> next = result; + position -> previous = result; + + return result; +} + +void * +enet_list_remove (ENetListIterator position) +{ + position -> previous -> next = position -> next; + position -> next -> previous = position -> previous; + + return position; +} + +ENetListIterator +enet_list_move (ENetListIterator position, void * dataFirst, void * dataLast) +{ + ENetListIterator first = (ENetListIterator) dataFirst, + last = (ENetListIterator) dataLast; + + first -> previous -> next = last -> next; + last -> next -> previous = first -> previous; + + first -> previous = position -> previous; + last -> next = position; + + first -> previous -> next = first; + position -> previous = last; + + return first; +} + +size_t +enet_list_size (ENetList * list) +{ + size_t size = 0; + ENetListIterator position; + + for (position = enet_list_begin (list); + position != enet_list_end (list); + position = enet_list_next (position)) + ++ size; + + return size; +} + +/** @} */ diff --git a/jni/love/src/libraries/enet/libenet/packet.c b/jni/love/src/libraries/enet/libenet/packet.c new file mode 100644 index 00000000..9a997be4 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/packet.c @@ -0,0 +1,165 @@ +/** + @file packet.c + @brief ENet packet management functions +*/ +#include +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** @defgroup Packet ENet packet functions + @{ +*/ + +/** Creates a packet that may be sent to a peer. + @param dataContents initial contents of the packet's data; the packet's data will remain uninitialized if dataContents is NULL. + @param dataLength size of the data allocated for this packet + @param flags flags for this packet as described for the ENetPacket structure. + @returns the packet on success, NULL on failure +*/ +ENetPacket * +enet_packet_create (const void * data, size_t dataLength, enet_uint32 flags) +{ + ENetPacket * packet = (ENetPacket *) enet_malloc (sizeof (ENetPacket)); + if (packet == NULL) + return NULL; + + if (flags & ENET_PACKET_FLAG_NO_ALLOCATE) + packet -> data = (enet_uint8 *) data; + else + if (dataLength <= 0) + packet -> data = NULL; + else + { + packet -> data = (enet_uint8 *) enet_malloc (dataLength); + if (packet -> data == NULL) + { + enet_free (packet); + return NULL; + } + + if (data != NULL) + memcpy (packet -> data, data, dataLength); + } + + packet -> referenceCount = 0; + packet -> flags = flags; + packet -> dataLength = dataLength; + packet -> freeCallback = NULL; + packet -> userData = NULL; + + return packet; +} + +/** Destroys the packet and deallocates its data. + @param packet packet to be destroyed +*/ +void +enet_packet_destroy (ENetPacket * packet) +{ + if (packet == NULL) + return; + + if (packet -> freeCallback != NULL) + (* packet -> freeCallback) (packet); + if (! (packet -> flags & ENET_PACKET_FLAG_NO_ALLOCATE) && + packet -> data != NULL) + enet_free (packet -> data); + enet_free (packet); +} + +/** Attempts to resize the data in the packet to length specified in the + dataLength parameter + @param packet packet to resize + @param dataLength new size for the packet data + @returns 0 on success, < 0 on failure +*/ +int +enet_packet_resize (ENetPacket * packet, size_t dataLength) +{ + enet_uint8 * newData; + + if (dataLength <= packet -> dataLength || (packet -> flags & ENET_PACKET_FLAG_NO_ALLOCATE)) + { + packet -> dataLength = dataLength; + + return 0; + } + + newData = (enet_uint8 *) enet_malloc (dataLength); + if (newData == NULL) + return -1; + + memcpy (newData, packet -> data, packet -> dataLength); + enet_free (packet -> data); + + packet -> data = newData; + packet -> dataLength = dataLength; + + return 0; +} + +static int initializedCRC32 = 0; +static enet_uint32 crcTable [256]; + +static enet_uint32 +reflect_crc (int val, int bits) +{ + int result = 0, bit; + + for (bit = 0; bit < bits; bit ++) + { + if(val & 1) result |= 1 << (bits - 1 - bit); + val >>= 1; + } + + return result; +} + +static void +initialize_crc32 (void) +{ + int byte; + + for (byte = 0; byte < 256; ++ byte) + { + enet_uint32 crc = reflect_crc (byte, 8) << 24; + int offset; + + for(offset = 0; offset < 8; ++ offset) + { + if (crc & 0x80000000) + crc = (crc << 1) ^ 0x04c11db7; + else + crc <<= 1; + } + + crcTable [byte] = reflect_crc (crc, 32); + } + + initializedCRC32 = 1; +} + +enet_uint32 +enet_crc32 (const ENetBuffer * buffers, size_t bufferCount) +{ + enet_uint32 crc = 0xFFFFFFFF; + + if (! initializedCRC32) initialize_crc32 (); + + while (bufferCount -- > 0) + { + const enet_uint8 * data = (const enet_uint8 *) buffers -> data, + * dataEnd = & data [buffers -> dataLength]; + + while (data < dataEnd) + { + crc = (crc >> 8) ^ crcTable [(crc & 0xFF) ^ *data++]; + } + + ++ buffers; + } + + return ENET_HOST_TO_NET_32 (~ crc); +} + +/** @} */ diff --git a/jni/love/src/libraries/enet/libenet/peer.c b/jni/love/src/libraries/enet/libenet/peer.c new file mode 100644 index 00000000..318f2c25 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/peer.c @@ -0,0 +1,989 @@ +/** + @file peer.c + @brief ENet peer management functions +*/ +#include +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +/** @defgroup peer ENet peer functions + @{ +*/ + +/** Configures throttle parameter for a peer. + + Unreliable packets are dropped by ENet in response to the varying conditions + of the Internet connection to the peer. The throttle represents a probability + that an unreliable packet should not be dropped and thus sent by ENet to the peer. + The lowest mean round trip time from the sending of a reliable packet to the + receipt of its acknowledgement is measured over an amount of time specified by + the interval parameter in milliseconds. If a measured round trip time happens to + be significantly less than the mean round trip time measured over the interval, + then the throttle probability is increased to allow more traffic by an amount + specified in the acceleration parameter, which is a ratio to the ENET_PEER_PACKET_THROTTLE_SCALE + constant. If a measured round trip time happens to be significantly greater than + the mean round trip time measured over the interval, then the throttle probability + is decreased to limit traffic by an amount specified in the deceleration parameter, which + is a ratio to the ENET_PEER_PACKET_THROTTLE_SCALE constant. When the throttle has + a value of ENET_PEER_PACKET_THROTTLE_SCALE, no unreliable packets are dropped by + ENet, and so 100% of all unreliable packets will be sent. When the throttle has a + value of 0, all unreliable packets are dropped by ENet, and so 0% of all unreliable + packets will be sent. Intermediate values for the throttle represent intermediate + probabilities between 0% and 100% of unreliable packets being sent. The bandwidth + limits of the local and foreign hosts are taken into account to determine a + sensible limit for the throttle probability above which it should not raise even in + the best of conditions. + + @param peer peer to configure + @param interval interval, in milliseconds, over which to measure lowest mean RTT; the default value is ENET_PEER_PACKET_THROTTLE_INTERVAL. + @param acceleration rate at which to increase the throttle probability as mean RTT declines + @param deceleration rate at which to decrease the throttle probability as mean RTT increases +*/ +void +enet_peer_throttle_configure (ENetPeer * peer, enet_uint32 interval, enet_uint32 acceleration, enet_uint32 deceleration) +{ + ENetProtocol command; + + peer -> packetThrottleInterval = interval; + peer -> packetThrottleAcceleration = acceleration; + peer -> packetThrottleDeceleration = deceleration; + + command.header.command = ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + + command.throttleConfigure.packetThrottleInterval = ENET_HOST_TO_NET_32 (interval); + command.throttleConfigure.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (acceleration); + command.throttleConfigure.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (deceleration); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); +} + +int +enet_peer_throttle (ENetPeer * peer, enet_uint32 rtt) +{ + if (peer -> lastRoundTripTime <= peer -> lastRoundTripTimeVariance) + { + peer -> packetThrottle = peer -> packetThrottleLimit; + } + else + if (rtt < peer -> lastRoundTripTime) + { + peer -> packetThrottle += peer -> packetThrottleAcceleration; + + if (peer -> packetThrottle > peer -> packetThrottleLimit) + peer -> packetThrottle = peer -> packetThrottleLimit; + + return 1; + } + else + if (rtt > peer -> lastRoundTripTime + 2 * peer -> lastRoundTripTimeVariance) + { + if (peer -> packetThrottle > peer -> packetThrottleDeceleration) + peer -> packetThrottle -= peer -> packetThrottleDeceleration; + else + peer -> packetThrottle = 0; + + return -1; + } + + return 0; +} + +/** Queues a packet to be sent. + @param peer destination for the packet + @param channelID channel on which to send + @param packet packet to send + @retval 0 on success + @retval < 0 on failure +*/ +int +enet_peer_send (ENetPeer * peer, enet_uint8 channelID, ENetPacket * packet) +{ + ENetChannel * channel = & peer -> channels [channelID]; + ENetProtocol command; + size_t fragmentLength; + + if (peer -> state != ENET_PEER_STATE_CONNECTED || + channelID >= peer -> channelCount || + packet -> dataLength > ENET_PROTOCOL_MAXIMUM_PACKET_SIZE) + return -1; + + fragmentLength = peer -> mtu - sizeof (ENetProtocolHeader) - sizeof (ENetProtocolSendFragment); + if (peer -> host -> checksum != NULL) + fragmentLength -= sizeof(enet_uint32); + + if (packet -> dataLength > fragmentLength) + { + enet_uint32 fragmentCount = (packet -> dataLength + fragmentLength - 1) / fragmentLength, + fragmentNumber, + fragmentOffset; + enet_uint8 commandNumber; + enet_uint16 startSequenceNumber; + ENetList fragments; + ENetOutgoingCommand * fragment; + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT) + return -1; + + if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT)) == ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT && + channel -> outgoingUnreliableSequenceNumber < 0xFFFF) + { + commandNumber = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT; + startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingUnreliableSequenceNumber + 1); + } + else + { + commandNumber = ENET_PROTOCOL_COMMAND_SEND_FRAGMENT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingReliableSequenceNumber + 1); + } + + enet_list_clear (& fragments); + + for (fragmentNumber = 0, + fragmentOffset = 0; + fragmentOffset < packet -> dataLength; + ++ fragmentNumber, + fragmentOffset += fragmentLength) + { + if (packet -> dataLength - fragmentOffset < fragmentLength) + fragmentLength = packet -> dataLength - fragmentOffset; + + fragment = (ENetOutgoingCommand *) enet_malloc (sizeof (ENetOutgoingCommand)); + if (fragment == NULL) + { + while (! enet_list_empty (& fragments)) + { + fragment = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (& fragments)); + + enet_free (fragment); + } + + return -1; + } + + fragment -> fragmentOffset = fragmentOffset; + fragment -> fragmentLength = fragmentLength; + fragment -> packet = packet; + fragment -> command.header.command = commandNumber; + fragment -> command.header.channelID = channelID; + fragment -> command.sendFragment.startSequenceNumber = startSequenceNumber; + fragment -> command.sendFragment.dataLength = ENET_HOST_TO_NET_16 (fragmentLength); + fragment -> command.sendFragment.fragmentCount = ENET_HOST_TO_NET_32 (fragmentCount); + fragment -> command.sendFragment.fragmentNumber = ENET_HOST_TO_NET_32 (fragmentNumber); + fragment -> command.sendFragment.totalLength = ENET_HOST_TO_NET_32 (packet -> dataLength); + fragment -> command.sendFragment.fragmentOffset = ENET_NET_TO_HOST_32 (fragmentOffset); + + enet_list_insert (enet_list_end (& fragments), fragment); + } + + packet -> referenceCount += fragmentNumber; + + while (! enet_list_empty (& fragments)) + { + fragment = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (& fragments)); + + enet_peer_setup_outgoing_command (peer, fragment); + } + + return 0; + } + + command.header.channelID = channelID; + + if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNSEQUENCED)) == ENET_PACKET_FLAG_UNSEQUENCED) + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + command.sendUnsequenced.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + else + if (packet -> flags & ENET_PACKET_FLAG_RELIABLE || channel -> outgoingUnreliableSequenceNumber >= 0xFFFF) + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_RELIABLE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.sendReliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + else + { + command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE; + command.sendUnreliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength); + } + + if (enet_peer_queue_outgoing_command (peer, & command, packet, 0, packet -> dataLength) == NULL) + return -1; + + return 0; +} + +/** Attempts to dequeue any incoming queued packet. + @param peer peer to dequeue packets from + @param channelID holds the channel ID of the channel the packet was received on success + @returns a pointer to the packet, or NULL if there are no available incoming queued packets +*/ +ENetPacket * +enet_peer_receive (ENetPeer * peer, enet_uint8 * channelID) +{ + ENetIncomingCommand * incomingCommand; + ENetPacket * packet; + + if (enet_list_empty (& peer -> dispatchedCommands)) + return NULL; + + incomingCommand = (ENetIncomingCommand *) enet_list_remove (enet_list_begin (& peer -> dispatchedCommands)); + + if (channelID != NULL) + * channelID = incomingCommand -> command.header.channelID; + + packet = incomingCommand -> packet; + + -- packet -> referenceCount; + + if (incomingCommand -> fragments != NULL) + enet_free (incomingCommand -> fragments); + + enet_free (incomingCommand); + + return packet; +} + +static void +enet_peer_reset_outgoing_commands (ENetList * queue) +{ + ENetOutgoingCommand * outgoingCommand; + + while (! enet_list_empty (queue)) + { + outgoingCommand = (ENetOutgoingCommand *) enet_list_remove (enet_list_begin (queue)); + + if (outgoingCommand -> packet != NULL) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (outgoingCommand -> packet); + } + + enet_free (outgoingCommand); + } +} + +static void +enet_peer_remove_incoming_commands (ENetList * queue, ENetListIterator startCommand, ENetListIterator endCommand) +{ + ENetListIterator currentCommand; + + for (currentCommand = startCommand; currentCommand != endCommand; ) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + currentCommand = enet_list_next (currentCommand); + + enet_list_remove (& incomingCommand -> incomingCommandList); + + if (incomingCommand -> packet != NULL) + { + -- incomingCommand -> packet -> referenceCount; + + if (incomingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (incomingCommand -> packet); + } + + if (incomingCommand -> fragments != NULL) + enet_free (incomingCommand -> fragments); + + enet_free (incomingCommand); + } +} + +static void +enet_peer_reset_incoming_commands (ENetList * queue) +{ + enet_peer_remove_incoming_commands(queue, enet_list_begin (queue), enet_list_end (queue)); +} + +void +enet_peer_reset_queues (ENetPeer * peer) +{ + ENetChannel * channel; + + if (peer -> needsDispatch) + { + enet_list_remove (& peer -> dispatchList); + + peer -> needsDispatch = 0; + } + + while (! enet_list_empty (& peer -> acknowledgements)) + enet_free (enet_list_remove (enet_list_begin (& peer -> acknowledgements))); + + enet_peer_reset_outgoing_commands (& peer -> sentReliableCommands); + enet_peer_reset_outgoing_commands (& peer -> sentUnreliableCommands); + enet_peer_reset_outgoing_commands (& peer -> outgoingReliableCommands); + enet_peer_reset_outgoing_commands (& peer -> outgoingUnreliableCommands); + enet_peer_reset_incoming_commands (& peer -> dispatchedCommands); + + if (peer -> channels != NULL && peer -> channelCount > 0) + { + for (channel = peer -> channels; + channel < & peer -> channels [peer -> channelCount]; + ++ channel) + { + enet_peer_reset_incoming_commands (& channel -> incomingReliableCommands); + enet_peer_reset_incoming_commands (& channel -> incomingUnreliableCommands); + } + + enet_free (peer -> channels); + } + + peer -> channels = NULL; + peer -> channelCount = 0; +} + +void +enet_peer_on_connect (ENetPeer * peer) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> incomingBandwidth != 0) + ++ peer -> host -> bandwidthLimitedPeers; + + ++ peer -> host -> connectedPeers; + } +} + +void +enet_peer_on_disconnect (ENetPeer * peer) +{ + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> incomingBandwidth != 0) + -- peer -> host -> bandwidthLimitedPeers; + + -- peer -> host -> connectedPeers; + } +} + +/** Forcefully disconnects a peer. + @param peer peer to forcefully disconnect + @remarks The foreign host represented by the peer is not notified of the disconnection and will timeout + on its connection to the local host. +*/ +void +enet_peer_reset (ENetPeer * peer) +{ + enet_peer_on_disconnect (peer); + + peer -> outgoingPeerID = ENET_PROTOCOL_MAXIMUM_PEER_ID; + peer -> connectID = 0; + + peer -> state = ENET_PEER_STATE_DISCONNECTED; + + peer -> incomingBandwidth = 0; + peer -> outgoingBandwidth = 0; + peer -> incomingBandwidthThrottleEpoch = 0; + peer -> outgoingBandwidthThrottleEpoch = 0; + peer -> incomingDataTotal = 0; + peer -> outgoingDataTotal = 0; + peer -> lastSendTime = 0; + peer -> lastReceiveTime = 0; + peer -> nextTimeout = 0; + peer -> earliestTimeout = 0; + peer -> packetLossEpoch = 0; + peer -> packetsSent = 0; + peer -> packetsLost = 0; + peer -> packetLoss = 0; + peer -> packetLossVariance = 0; + peer -> packetThrottle = ENET_PEER_DEFAULT_PACKET_THROTTLE; + peer -> packetThrottleLimit = ENET_PEER_PACKET_THROTTLE_SCALE; + peer -> packetThrottleCounter = 0; + peer -> packetThrottleEpoch = 0; + peer -> packetThrottleAcceleration = ENET_PEER_PACKET_THROTTLE_ACCELERATION; + peer -> packetThrottleDeceleration = ENET_PEER_PACKET_THROTTLE_DECELERATION; + peer -> packetThrottleInterval = ENET_PEER_PACKET_THROTTLE_INTERVAL; + peer -> pingInterval = ENET_PEER_PING_INTERVAL; + peer -> timeoutLimit = ENET_PEER_TIMEOUT_LIMIT; + peer -> timeoutMinimum = ENET_PEER_TIMEOUT_MINIMUM; + peer -> timeoutMaximum = ENET_PEER_TIMEOUT_MAXIMUM; + peer -> lastRoundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> lowestRoundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> lastRoundTripTimeVariance = 0; + peer -> highestRoundTripTimeVariance = 0; + peer -> roundTripTime = ENET_PEER_DEFAULT_ROUND_TRIP_TIME; + peer -> roundTripTimeVariance = 0; + peer -> mtu = peer -> host -> mtu; + peer -> reliableDataInTransit = 0; + peer -> outgoingReliableSequenceNumber = 0; + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + peer -> incomingUnsequencedGroup = 0; + peer -> outgoingUnsequencedGroup = 0; + peer -> eventData = 0; + + memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow)); + + enet_peer_reset_queues (peer); +} + +/** Sends a ping request to a peer. + @param peer destination for the ping request + @remarks ping requests factor into the mean round trip time as designated by the + roundTripTime field in the ENetPeer structure. Enet automatically pings all connected + peers at regular intervals, however, this function may be called to ensure more + frequent ping requests. +*/ +void +enet_peer_ping (ENetPeer * peer) +{ + ENetProtocol command; + + if (peer -> state != ENET_PEER_STATE_CONNECTED) + return; + + command.header.command = ENET_PROTOCOL_COMMAND_PING | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + command.header.channelID = 0xFF; + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); +} + +/** Sets the interval at which pings will be sent to a peer. + + Pings are used both to monitor the liveness of the connection and also to dynamically + adjust the throttle during periods of low traffic so that the throttle has reasonable + responsiveness during traffic spikes. + + @param peer the peer to adjust + @param pingInterval the interval at which to send pings; defaults to ENET_PEER_PING_INTERVAL if 0 +*/ +void +enet_peer_ping_interval (ENetPeer * peer, enet_uint32 pingInterval) +{ + peer -> pingInterval = pingInterval ? pingInterval : ENET_PEER_PING_INTERVAL; +} + +/** Sets the timeout parameters for a peer. + + The timeout parameter control how and when a peer will timeout from a failure to acknowledge + reliable traffic. Timeout values use an exponential backoff mechanism, where if a reliable + packet is not acknowledge within some multiple of the average RTT plus a variance tolerance, + the timeout will be doubled until it reaches a set limit. If the timeout is thus at this + limit and reliable packets have been sent but not acknowledged within a certain minimum time + period, the peer will be disconnected. Alternatively, if reliable packets have been sent + but not acknowledged for a certain maximum time period, the peer will be disconnected regardless + of the current timeout limit value. + + @param peer the peer to adjust + @param timeoutLimit the timeout limit; defaults to ENET_PEER_TIMEOUT_LIMIT if 0 + @param timeoutMinimum the timeout minimum; defaults to ENET_PEER_TIMEOUT_MINIMUM if 0 + @param timeoutMaximum the timeout maximum; defaults to ENET_PEER_TIMEOUT_MAXIMUM if 0 +*/ + +void +enet_peer_timeout (ENetPeer * peer, enet_uint32 timeoutLimit, enet_uint32 timeoutMinimum, enet_uint32 timeoutMaximum) +{ + peer -> timeoutLimit = timeoutLimit ? timeoutLimit : ENET_PEER_TIMEOUT_LIMIT; + peer -> timeoutMinimum = timeoutMinimum ? timeoutMinimum : ENET_PEER_TIMEOUT_MINIMUM; + peer -> timeoutMaximum = timeoutMaximum ? timeoutMaximum : ENET_PEER_TIMEOUT_MAXIMUM; +} + +/** Force an immediate disconnection from a peer. + @param peer peer to disconnect + @param data data describing the disconnection + @remarks No ENET_EVENT_DISCONNECT event will be generated. The foreign peer is not + guarenteed to receive the disconnect notification, and is reset immediately upon + return from this function. +*/ +void +enet_peer_disconnect_now (ENetPeer * peer, enet_uint32 data) +{ + ENetProtocol command; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED) + return; + + if (peer -> state != ENET_PEER_STATE_ZOMBIE && + peer -> state != ENET_PEER_STATE_DISCONNECTING) + { + enet_peer_reset_queues (peer); + + command.header.command = ENET_PROTOCOL_COMMAND_DISCONNECT | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + command.header.channelID = 0xFF; + command.disconnect.data = ENET_HOST_TO_NET_32 (data); + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + + enet_host_flush (peer -> host); + } + + enet_peer_reset (peer); +} + +/** Request a disconnection from a peer. + @param peer peer to request a disconnection + @param data data describing the disconnection + @remarks An ENET_EVENT_DISCONNECT event will be generated by enet_host_service() + once the disconnection is complete. +*/ +void +enet_peer_disconnect (ENetPeer * peer, enet_uint32 data) +{ + ENetProtocol command; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTING || + peer -> state == ENET_PEER_STATE_DISCONNECTED || + peer -> state == ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT || + peer -> state == ENET_PEER_STATE_ZOMBIE) + return; + + enet_peer_reset_queues (peer); + + command.header.command = ENET_PROTOCOL_COMMAND_DISCONNECT; + command.header.channelID = 0xFF; + command.disconnect.data = ENET_HOST_TO_NET_32 (data); + + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + command.header.command |= ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + else + command.header.command |= ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED; + + enet_peer_queue_outgoing_command (peer, & command, NULL, 0, 0); + + if (peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + { + enet_peer_on_disconnect (peer); + + peer -> state = ENET_PEER_STATE_DISCONNECTING; + } + else + { + enet_host_flush (peer -> host); + enet_peer_reset (peer); + } +} + +/** Request a disconnection from a peer, but only after all queued outgoing packets are sent. + @param peer peer to request a disconnection + @param data data describing the disconnection + @remarks An ENET_EVENT_DISCONNECT event will be generated by enet_host_service() + once the disconnection is complete. +*/ +void +enet_peer_disconnect_later (ENetPeer * peer, enet_uint32 data) +{ + if ((peer -> state == ENET_PEER_STATE_CONNECTED || peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) && + ! (enet_list_empty (& peer -> outgoingReliableCommands) && + enet_list_empty (& peer -> outgoingUnreliableCommands) && + enet_list_empty (& peer -> sentReliableCommands))) + { + peer -> state = ENET_PEER_STATE_DISCONNECT_LATER; + peer -> eventData = data; + } + else + enet_peer_disconnect (peer, data); +} + +ENetAcknowledgement * +enet_peer_queue_acknowledgement (ENetPeer * peer, const ENetProtocol * command, enet_uint16 sentTime) +{ + ENetAcknowledgement * acknowledgement; + + if (command -> header.channelID < peer -> channelCount) + { + ENetChannel * channel = & peer -> channels [command -> header.channelID]; + enet_uint16 reliableWindow = command -> header.reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE, + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (command -> header.reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1 && reliableWindow <= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS) + return NULL; + } + + acknowledgement = (ENetAcknowledgement *) enet_malloc (sizeof (ENetAcknowledgement)); + if (acknowledgement == NULL) + return NULL; + + peer -> outgoingDataTotal += sizeof (ENetProtocolAcknowledge); + + acknowledgement -> sentTime = sentTime; + acknowledgement -> command = * command; + + enet_list_insert (enet_list_end (& peer -> acknowledgements), acknowledgement); + + return acknowledgement; +} + +void +enet_peer_setup_outgoing_command (ENetPeer * peer, ENetOutgoingCommand * outgoingCommand) +{ + ENetChannel * channel = & peer -> channels [outgoingCommand -> command.header.channelID]; + + peer -> outgoingDataTotal += enet_protocol_command_size (outgoingCommand -> command.header.command) + outgoingCommand -> fragmentLength; + + if (outgoingCommand -> command.header.channelID == 0xFF) + { + ++ peer -> outgoingReliableSequenceNumber; + + outgoingCommand -> reliableSequenceNumber = peer -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + { + ++ channel -> outgoingReliableSequenceNumber; + channel -> outgoingUnreliableSequenceNumber = 0; + + outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED) + { + ++ peer -> outgoingUnsequencedGroup; + + outgoingCommand -> reliableSequenceNumber = 0; + outgoingCommand -> unreliableSequenceNumber = 0; + } + else + { + if (outgoingCommand -> fragmentOffset == 0) + ++ channel -> outgoingUnreliableSequenceNumber; + + outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber; + outgoingCommand -> unreliableSequenceNumber = channel -> outgoingUnreliableSequenceNumber; + } + + outgoingCommand -> sendAttempts = 0; + outgoingCommand -> sentTime = 0; + outgoingCommand -> roundTripTimeout = 0; + outgoingCommand -> roundTripTimeoutLimit = 0; + outgoingCommand -> command.header.reliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> reliableSequenceNumber); + + switch (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + outgoingCommand -> command.sendUnreliable.unreliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> unreliableSequenceNumber); + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + outgoingCommand -> command.sendUnsequenced.unsequencedGroup = ENET_HOST_TO_NET_16 (peer -> outgoingUnsequencedGroup); + break; + + default: + break; + } + + if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + enet_list_insert (enet_list_end (& peer -> outgoingReliableCommands), outgoingCommand); + else + enet_list_insert (enet_list_end (& peer -> outgoingUnreliableCommands), outgoingCommand); +} + +ENetOutgoingCommand * +enet_peer_queue_outgoing_command (ENetPeer * peer, const ENetProtocol * command, ENetPacket * packet, enet_uint32 offset, enet_uint16 length) +{ + ENetOutgoingCommand * outgoingCommand = (ENetOutgoingCommand *) enet_malloc (sizeof (ENetOutgoingCommand)); + if (outgoingCommand == NULL) + return NULL; + + outgoingCommand -> command = * command; + outgoingCommand -> fragmentOffset = offset; + outgoingCommand -> fragmentLength = length; + outgoingCommand -> packet = packet; + if (packet != NULL) + ++ packet -> referenceCount; + + enet_peer_setup_outgoing_command (peer, outgoingCommand); + + return outgoingCommand; +} + +void +enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * channel) +{ + ENetListIterator droppedCommand, startCommand, currentCommand; + + for (droppedCommand = startCommand = currentCommand = enet_list_begin (& channel -> incomingUnreliableCommands); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + continue; + + if (incomingCommand -> reliableSequenceNumber == channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> fragmentsRemaining <= 0) + { + channel -> incomingUnreliableSequenceNumber = incomingCommand -> unreliableSequenceNumber; + continue; + } + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! peer -> needsDispatch) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> needsDispatch = 1; + } + + droppedCommand = currentCommand; + } + else + if (droppedCommand != currentCommand) + droppedCommand = enet_list_previous (currentCommand); + } + else + { + enet_uint16 reliableWindow = incomingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE, + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + if (reliableWindow >= currentWindow && reliableWindow < currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + break; + + droppedCommand = enet_list_next (currentCommand); + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! peer -> needsDispatch) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> needsDispatch = 1; + } + } + } + + startCommand = enet_list_next (currentCommand); + } + + if (startCommand != currentCommand) + { + enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand)); + + if (! peer -> needsDispatch) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> needsDispatch = 1; + } + + droppedCommand = currentCommand; + } + + enet_peer_remove_incoming_commands (& channel -> incomingUnreliableCommands, enet_list_begin (& channel -> incomingUnreliableCommands), droppedCommand); +} + +void +enet_peer_dispatch_incoming_reliable_commands (ENetPeer * peer, ENetChannel * channel) +{ + ENetListIterator currentCommand; + + for (currentCommand = enet_list_begin (& channel -> incomingReliableCommands); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (incomingCommand -> fragmentsRemaining > 0 || + incomingCommand -> reliableSequenceNumber != (enet_uint16) (channel -> incomingReliableSequenceNumber + 1)) + break; + + channel -> incomingReliableSequenceNumber = incomingCommand -> reliableSequenceNumber; + + if (incomingCommand -> fragmentCount > 0) + channel -> incomingReliableSequenceNumber += incomingCommand -> fragmentCount - 1; + } + + if (currentCommand == enet_list_begin (& channel -> incomingReliableCommands)) + return; + + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_move (enet_list_end (& peer -> dispatchedCommands), enet_list_begin (& channel -> incomingReliableCommands), enet_list_previous (currentCommand)); + + if (! peer -> needsDispatch) + { + enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList); + + peer -> needsDispatch = 1; + } + + if (! enet_list_empty (& channel -> incomingUnreliableCommands)) + enet_peer_dispatch_incoming_unreliable_commands (peer, channel); +} + +ENetIncomingCommand * +enet_peer_queue_incoming_command (ENetPeer * peer, const ENetProtocol * command, ENetPacket * packet, enet_uint32 fragmentCount) +{ + static ENetIncomingCommand dummyCommand; + + ENetChannel * channel = & peer -> channels [command -> header.channelID]; + enet_uint32 unreliableSequenceNumber = 0, reliableSequenceNumber = 0; + enet_uint16 reliableWindow, currentWindow; + ENetIncomingCommand * incomingCommand; + ENetListIterator currentCommand; + + if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER) + goto freePacket; + + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + { + reliableSequenceNumber = command -> header.reliableSequenceNumber; + reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + goto freePacket; + } + + switch (command -> header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber) + goto freePacket; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands)); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber <= reliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + goto freePacket; + } + } + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT: + unreliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendUnreliable.unreliableSequenceNumber); + + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber && + unreliableSequenceNumber <= channel -> incomingUnreliableSequenceNumber) + goto freePacket; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands)); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + incomingCommand = (ENetIncomingCommand *) currentCommand; + + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED) + continue; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber > reliableSequenceNumber) + continue; + + if (incomingCommand -> unreliableSequenceNumber <= unreliableSequenceNumber) + { + if (incomingCommand -> unreliableSequenceNumber < unreliableSequenceNumber) + break; + + goto freePacket; + } + } + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + currentCommand = enet_list_end (& channel -> incomingUnreliableCommands); + break; + + default: + goto freePacket; + } + + incomingCommand = (ENetIncomingCommand *) enet_malloc (sizeof (ENetIncomingCommand)); + if (incomingCommand == NULL) + goto notifyError; + + incomingCommand -> reliableSequenceNumber = command -> header.reliableSequenceNumber; + incomingCommand -> unreliableSequenceNumber = unreliableSequenceNumber & 0xFFFF; + incomingCommand -> command = * command; + incomingCommand -> fragmentCount = fragmentCount; + incomingCommand -> fragmentsRemaining = fragmentCount; + incomingCommand -> packet = packet; + incomingCommand -> fragments = NULL; + + if (fragmentCount > 0) + { + if (fragmentCount <= ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT) + incomingCommand -> fragments = (enet_uint32 *) enet_malloc ((fragmentCount + 31) / 32 * sizeof (enet_uint32)); + if (incomingCommand -> fragments == NULL) + { + enet_free (incomingCommand); + + goto notifyError; + } + memset (incomingCommand -> fragments, 0, (fragmentCount + 31) / 32 * sizeof (enet_uint32)); + } + + if (packet != NULL) + ++ packet -> referenceCount; + + enet_list_insert (enet_list_next (currentCommand), incomingCommand); + + switch (command -> header.command & ENET_PROTOCOL_COMMAND_MASK) + { + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + enet_peer_dispatch_incoming_reliable_commands (peer, channel); + break; + + default: + enet_peer_dispatch_incoming_unreliable_commands (peer, channel); + break; + } + + return incomingCommand; + +freePacket: + if (fragmentCount > 0) + goto notifyError; + + if (packet != NULL && packet -> referenceCount == 0) + enet_packet_destroy (packet); + + return & dummyCommand; + +notifyError: + if (packet != NULL && packet -> referenceCount == 0) + enet_packet_destroy (packet); + + return NULL; +} + +/** @} */ diff --git a/jni/love/src/libraries/enet/libenet/protocol.c b/jni/love/src/libraries/enet/libenet/protocol.c new file mode 100644 index 00000000..3438a5da --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/protocol.c @@ -0,0 +1,1925 @@ +/** + @file protocol.c + @brief ENet protocol functions +*/ +#include +#include +#define ENET_BUILDING_LIB 1 +#include "enet/utility.h" +#include "enet/time.h" +#include "enet/enet.h" + +static size_t commandSizes [ENET_PROTOCOL_COMMAND_COUNT] = +{ + 0, + sizeof (ENetProtocolAcknowledge), + sizeof (ENetProtocolConnect), + sizeof (ENetProtocolVerifyConnect), + sizeof (ENetProtocolDisconnect), + sizeof (ENetProtocolPing), + sizeof (ENetProtocolSendReliable), + sizeof (ENetProtocolSendUnreliable), + sizeof (ENetProtocolSendFragment), + sizeof (ENetProtocolSendUnsequenced), + sizeof (ENetProtocolBandwidthLimit), + sizeof (ENetProtocolThrottleConfigure), + sizeof (ENetProtocolSendFragment) +}; + +size_t +enet_protocol_command_size (enet_uint8 commandNumber) +{ + return commandSizes [commandNumber & ENET_PROTOCOL_COMMAND_MASK]; +} + +static void +enet_protocol_change_state (ENetHost * host, ENetPeer * peer, ENetPeerState state) +{ + if (state == ENET_PEER_STATE_CONNECTED || state == ENET_PEER_STATE_DISCONNECT_LATER) + enet_peer_on_connect (peer); + else + enet_peer_on_disconnect (peer); + + peer -> state = state; +} + +static void +enet_protocol_dispatch_state (ENetHost * host, ENetPeer * peer, ENetPeerState state) +{ + enet_protocol_change_state (host, peer, state); + + if (! peer -> needsDispatch) + { + enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList); + + peer -> needsDispatch = 1; + } +} + +static int +enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event) +{ + while (! enet_list_empty (& host -> dispatchQueue)) + { + ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatchQueue)); + + peer -> needsDispatch = 0; + + switch (peer -> state) + { + case ENET_PEER_STATE_CONNECTION_PENDING: + case ENET_PEER_STATE_CONNECTION_SUCCEEDED: + enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED); + + event -> type = ENET_EVENT_TYPE_CONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + + return 1; + + case ENET_PEER_STATE_ZOMBIE: + host -> recalculateBandwidthLimits = 1; + + event -> type = ENET_EVENT_TYPE_DISCONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + + enet_peer_reset (peer); + + return 1; + + case ENET_PEER_STATE_CONNECTED: + if (enet_list_empty (& peer -> dispatchedCommands)) + continue; + + event -> packet = enet_peer_receive (peer, & event -> channelID); + if (event -> packet == NULL) + continue; + + event -> type = ENET_EVENT_TYPE_RECEIVE; + event -> peer = peer; + + if (! enet_list_empty (& peer -> dispatchedCommands)) + { + peer -> needsDispatch = 1; + + enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatchList); + } + + return 1; + + default: + break; + } + } + + return 0; +} + +static void +enet_protocol_notify_connect (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + host -> recalculateBandwidthLimits = 1; + + if (event != NULL) + { + enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED); + + event -> type = ENET_EVENT_TYPE_CONNECT; + event -> peer = peer; + event -> data = peer -> eventData; + } + else + enet_protocol_dispatch_state (host, peer, peer -> state == ENET_PEER_STATE_CONNECTING ? ENET_PEER_STATE_CONNECTION_SUCCEEDED : ENET_PEER_STATE_CONNECTION_PENDING); +} + +static void +enet_protocol_notify_disconnect (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + if (peer -> state >= ENET_PEER_STATE_CONNECTION_PENDING) + host -> recalculateBandwidthLimits = 1; + + if (peer -> state != ENET_PEER_STATE_CONNECTING && peer -> state < ENET_PEER_STATE_CONNECTION_SUCCEEDED) + enet_peer_reset (peer); + else + if (event != NULL) + { + event -> type = ENET_EVENT_TYPE_DISCONNECT; + event -> peer = peer; + event -> data = 0; + + enet_peer_reset (peer); + } + else + { + peer -> eventData = 0; + + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + } +} + +static void +enet_protocol_remove_sent_unreliable_commands (ENetPeer * peer) +{ + ENetOutgoingCommand * outgoingCommand; + + while (! enet_list_empty (& peer -> sentUnreliableCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) enet_list_front (& peer -> sentUnreliableCommands); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + { + outgoingCommand -> packet -> flags |= ENET_PACKET_FLAG_SENT; + + enet_packet_destroy (outgoingCommand -> packet); + } + } + + enet_free (outgoingCommand); + } +} + +static ENetProtocolCommand +enet_protocol_remove_sent_reliable_command (ENetPeer * peer, enet_uint16 reliableSequenceNumber, enet_uint8 channelID) +{ + ENetOutgoingCommand * outgoingCommand = NULL; + ENetListIterator currentCommand; + ENetProtocolCommand commandNumber; + int wasSent = 1; + + for (currentCommand = enet_list_begin (& peer -> sentReliableCommands); + currentCommand != enet_list_end (& peer -> sentReliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber && + outgoingCommand -> command.header.channelID == channelID) + break; + } + + if (currentCommand == enet_list_end (& peer -> sentReliableCommands)) + { + for (currentCommand = enet_list_begin (& peer -> outgoingReliableCommands); + currentCommand != enet_list_end (& peer -> outgoingReliableCommands); + currentCommand = enet_list_next (currentCommand)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + if (outgoingCommand -> sendAttempts < 1) return ENET_PROTOCOL_COMMAND_NONE; + + if (outgoingCommand -> reliableSequenceNumber == reliableSequenceNumber && + outgoingCommand -> command.header.channelID == channelID) + break; + } + + if (currentCommand == enet_list_end (& peer -> outgoingReliableCommands)) + return ENET_PROTOCOL_COMMAND_NONE; + + wasSent = 0; + } + + if (outgoingCommand == NULL) + return ENET_PROTOCOL_COMMAND_NONE; + + if (channelID < peer -> channelCount) + { + ENetChannel * channel = & peer -> channels [channelID]; + enet_uint16 reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (channel -> reliableWindows [reliableWindow] > 0) + { + -- channel -> reliableWindows [reliableWindow]; + if (! channel -> reliableWindows [reliableWindow]) + channel -> usedReliableWindows &= ~ (1 << reliableWindow); + } + } + + commandNumber = (ENetProtocolCommand) (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + { + if (wasSent) + peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; + + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + { + outgoingCommand -> packet -> flags |= ENET_PACKET_FLAG_SENT; + + enet_packet_destroy (outgoingCommand -> packet); + } + } + + enet_free (outgoingCommand); + + if (enet_list_empty (& peer -> sentReliableCommands)) + return commandNumber; + + outgoingCommand = (ENetOutgoingCommand *) enet_list_front (& peer -> sentReliableCommands); + + peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout; + + return commandNumber; +} + +static ENetPeer * +enet_protocol_handle_connect (ENetHost * host, ENetProtocolHeader * header, ENetProtocol * command) +{ + enet_uint8 incomingSessionID, outgoingSessionID; + enet_uint32 mtu, windowSize; + ENetChannel * channel; + size_t channelCount, duplicatePeers = 0; + ENetPeer * currentPeer, * peer = NULL; + ENetProtocol verifyCommand; + + channelCount = ENET_NET_TO_HOST_32 (command -> connect.channelCount); + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || + channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT) + return NULL; + + for (currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED) + { + if (peer == NULL) + peer = currentPeer; + } + else + if (currentPeer -> address.host == host -> receivedAddress.host) + { + if (currentPeer -> address.port == host -> receivedAddress.port && + currentPeer -> connectID == command -> connect.connectID) + return NULL; + + ++ duplicatePeers; + } + } + + if (peer == NULL || duplicatePeers >= host -> duplicatePeers) + return NULL; + + if (channelCount > host -> channelLimit) + channelCount = host -> channelLimit; + peer -> channels = (ENetChannel *) enet_malloc (channelCount * sizeof (ENetChannel)); + if (peer -> channels == NULL) + return NULL; + peer -> channelCount = channelCount; + peer -> state = ENET_PEER_STATE_ACKNOWLEDGING_CONNECT; + peer -> connectID = command -> connect.connectID; + peer -> address = host -> receivedAddress; + peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> connect.outgoingPeerID); + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> connect.outgoingBandwidth); + peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleInterval); + peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleAcceleration); + peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> connect.packetThrottleDeceleration); + peer -> eventData = ENET_NET_TO_HOST_32 (command -> connect.data); + + incomingSessionID = command -> connect.incomingSessionID == 0xFF ? peer -> outgoingSessionID : command -> connect.incomingSessionID; + incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + if (incomingSessionID == peer -> outgoingSessionID) + incomingSessionID = (incomingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + peer -> outgoingSessionID = incomingSessionID; + + outgoingSessionID = command -> connect.outgoingSessionID == 0xFF ? peer -> incomingSessionID : command -> connect.outgoingSessionID; + outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + if (outgoingSessionID == peer -> incomingSessionID) + outgoingSessionID = (outgoingSessionID + 1) & (ENET_PROTOCOL_HEADER_SESSION_MASK >> ENET_PROTOCOL_HEADER_SESSION_SHIFT); + peer -> incomingSessionID = outgoingSessionID; + + for (channel = peer -> channels; + channel < & peer -> channels [channelCount]; + ++ channel) + { + channel -> outgoingReliableSequenceNumber = 0; + channel -> outgoingUnreliableSequenceNumber = 0; + channel -> incomingReliableSequenceNumber = 0; + channel -> incomingUnreliableSequenceNumber = 0; + + enet_list_clear (& channel -> incomingReliableCommands); + enet_list_clear (& channel -> incomingUnreliableCommands); + + channel -> usedReliableWindows = 0; + memset (channel -> reliableWindows, 0, sizeof (channel -> reliableWindows)); + } + + mtu = ENET_NET_TO_HOST_32 (command -> connect.mtu); + + if (mtu < ENET_PROTOCOL_MINIMUM_MTU) + mtu = ENET_PROTOCOL_MINIMUM_MTU; + else + if (mtu > ENET_PROTOCOL_MAXIMUM_MTU) + mtu = ENET_PROTOCOL_MAXIMUM_MTU; + + peer -> mtu = mtu; + + if (host -> outgoingBandwidth == 0 && + peer -> incomingBandwidth == 0) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + if (host -> outgoingBandwidth == 0 || + peer -> incomingBandwidth == 0) + peer -> windowSize = (ENET_MAX (host -> outgoingBandwidth, peer -> incomingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + peer -> windowSize = (ENET_MIN (host -> outgoingBandwidth, peer -> incomingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (peer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (peer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + if (host -> incomingBandwidth == 0) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + windowSize = (host -> incomingBandwidth / ENET_PEER_WINDOW_SIZE_SCALE) * + ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (windowSize > ENET_NET_TO_HOST_32 (command -> connect.windowSize)) + windowSize = ENET_NET_TO_HOST_32 (command -> connect.windowSize); + + if (windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + verifyCommand.header.command = ENET_PROTOCOL_COMMAND_VERIFY_CONNECT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE; + verifyCommand.header.channelID = 0xFF; + verifyCommand.verifyConnect.outgoingPeerID = ENET_HOST_TO_NET_16 (peer -> incomingPeerID); + verifyCommand.verifyConnect.incomingSessionID = incomingSessionID; + verifyCommand.verifyConnect.outgoingSessionID = outgoingSessionID; + verifyCommand.verifyConnect.mtu = ENET_HOST_TO_NET_32 (peer -> mtu); + verifyCommand.verifyConnect.windowSize = ENET_HOST_TO_NET_32 (windowSize); + verifyCommand.verifyConnect.channelCount = ENET_HOST_TO_NET_32 (channelCount); + verifyCommand.verifyConnect.incomingBandwidth = ENET_HOST_TO_NET_32 (host -> incomingBandwidth); + verifyCommand.verifyConnect.outgoingBandwidth = ENET_HOST_TO_NET_32 (host -> outgoingBandwidth); + verifyCommand.verifyConnect.packetThrottleInterval = ENET_HOST_TO_NET_32 (peer -> packetThrottleInterval); + verifyCommand.verifyConnect.packetThrottleAcceleration = ENET_HOST_TO_NET_32 (peer -> packetThrottleAcceleration); + verifyCommand.verifyConnect.packetThrottleDeceleration = ENET_HOST_TO_NET_32 (peer -> packetThrottleDeceleration); + verifyCommand.verifyConnect.connectID = peer -> connectID; + + enet_peer_queue_outgoing_command (peer, & verifyCommand, NULL, 0, 0); + + return peer; +} + +static int +enet_protocol_handle_send_reliable (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + ENetPacket * packet; + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendReliable.dataLength); + * currentData += dataLength; + if (dataLength > ENET_PROTOCOL_MAXIMUM_PACKET_SIZE || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + packet = enet_packet_create ((const enet_uint8 *) command + sizeof (ENetProtocolSendReliable), + dataLength, + ENET_PACKET_FLAG_RELIABLE); + if (packet == NULL || + enet_peer_queue_incoming_command (peer, command, packet, 0) == NULL) + return -1; + + return 0; +} + +static int +enet_protocol_handle_send_unsequenced (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + ENetPacket * packet; + enet_uint32 unsequencedGroup, index; + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendUnsequenced.dataLength); + * currentData += dataLength; + if (dataLength > ENET_PROTOCOL_MAXIMUM_PACKET_SIZE || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + unsequencedGroup = ENET_NET_TO_HOST_16 (command -> sendUnsequenced.unsequencedGroup); + index = unsequencedGroup % ENET_PEER_UNSEQUENCED_WINDOW_SIZE; + + if (unsequencedGroup < peer -> incomingUnsequencedGroup) + unsequencedGroup += 0x10000; + + if (unsequencedGroup >= (enet_uint32) peer -> incomingUnsequencedGroup + ENET_PEER_FREE_UNSEQUENCED_WINDOWS * ENET_PEER_UNSEQUENCED_WINDOW_SIZE) + return 0; + + unsequencedGroup &= 0xFFFF; + + if (unsequencedGroup - index != peer -> incomingUnsequencedGroup) + { + peer -> incomingUnsequencedGroup = unsequencedGroup - index; + + memset (peer -> unsequencedWindow, 0, sizeof (peer -> unsequencedWindow)); + } + else + if (peer -> unsequencedWindow [index / 32] & (1 << (index % 32))) + return 0; + + packet = enet_packet_create ((const enet_uint8 *) command + sizeof (ENetProtocolSendUnsequenced), + dataLength, + ENET_PACKET_FLAG_UNSEQUENCED); + if (packet == NULL || + enet_peer_queue_incoming_command (peer, command, packet, 0) == NULL) + return -1; + + peer -> unsequencedWindow [index / 32] |= 1 << (index % 32); + + return 0; +} + +static int +enet_protocol_handle_send_unreliable (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + ENetPacket * packet; + size_t dataLength; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + dataLength = ENET_NET_TO_HOST_16 (command -> sendUnreliable.dataLength); + * currentData += dataLength; + if (dataLength > ENET_PROTOCOL_MAXIMUM_PACKET_SIZE || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + packet = enet_packet_create ((const enet_uint8 *) command + sizeof (ENetProtocolSendUnreliable), + dataLength, + 0); + if (packet == NULL || + enet_peer_queue_incoming_command (peer, command, packet, 0) == NULL) + return -1; + + return 0; +} + +static int +enet_protocol_handle_send_fragment (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + enet_uint32 fragmentNumber, + fragmentCount, + fragmentOffset, + fragmentLength, + startSequenceNumber, + totalLength; + ENetChannel * channel; + enet_uint16 startWindow, currentWindow; + ENetListIterator currentCommand; + ENetIncomingCommand * startCommand = NULL; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + fragmentLength = ENET_NET_TO_HOST_16 (command -> sendFragment.dataLength); + * currentData += fragmentLength; + if (fragmentLength > ENET_PROTOCOL_MAXIMUM_PACKET_SIZE || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + channel = & peer -> channels [command -> header.channelID]; + startSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendFragment.startSequenceNumber); + startWindow = startSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (startSequenceNumber < channel -> incomingReliableSequenceNumber) + startWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (startWindow < currentWindow || startWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + return 0; + + fragmentNumber = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentNumber); + fragmentCount = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentCount); + fragmentOffset = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentOffset); + totalLength = ENET_NET_TO_HOST_32 (command -> sendFragment.totalLength); + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT || + fragmentNumber >= fragmentCount || + totalLength > ENET_PROTOCOL_MAXIMUM_PACKET_SIZE || + fragmentOffset >= totalLength || + fragmentLength > totalLength - fragmentOffset) + return -1; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands)); + currentCommand != enet_list_end (& channel -> incomingReliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (startSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber <= startSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < startSequenceNumber) + break; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_FRAGMENT || + totalLength != incomingCommand -> packet -> dataLength || + fragmentCount != incomingCommand -> fragmentCount) + return -1; + + startCommand = incomingCommand; + break; + } + } + + if (startCommand == NULL) + { + ENetProtocol hostCommand = * command; + ENetPacket * packet = enet_packet_create (NULL, totalLength, ENET_PACKET_FLAG_RELIABLE); + if (packet == NULL) + return -1; + + hostCommand.header.reliableSequenceNumber = startSequenceNumber; + + startCommand = enet_peer_queue_incoming_command (peer, & hostCommand, packet, fragmentCount); + if (startCommand == NULL) + return -1; + } + + if ((startCommand -> fragments [fragmentNumber / 32] & (1 << (fragmentNumber % 32))) == 0) + { + -- startCommand -> fragmentsRemaining; + + startCommand -> fragments [fragmentNumber / 32] |= (1 << (fragmentNumber % 32)); + + if (fragmentOffset + fragmentLength > startCommand -> packet -> dataLength) + fragmentLength = startCommand -> packet -> dataLength - fragmentOffset; + + memcpy (startCommand -> packet -> data + fragmentOffset, + (enet_uint8 *) command + sizeof (ENetProtocolSendFragment), + fragmentLength); + + if (startCommand -> fragmentsRemaining <= 0) + enet_peer_dispatch_incoming_reliable_commands (peer, channel); + } + + return 0; +} + +static int +enet_protocol_handle_send_unreliable_fragment (ENetHost * host, ENetPeer * peer, const ENetProtocol * command, enet_uint8 ** currentData) +{ + enet_uint32 fragmentNumber, + fragmentCount, + fragmentOffset, + fragmentLength, + reliableSequenceNumber, + startSequenceNumber, + totalLength; + enet_uint16 reliableWindow, currentWindow; + ENetChannel * channel; + ENetListIterator currentCommand; + ENetIncomingCommand * startCommand = NULL; + + if (command -> header.channelID >= peer -> channelCount || + (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER)) + return -1; + + fragmentLength = ENET_NET_TO_HOST_16 (command -> sendFragment.dataLength); + * currentData += fragmentLength; + if (fragmentLength > ENET_PROTOCOL_MAXIMUM_PACKET_SIZE || + * currentData < host -> receivedData || + * currentData > & host -> receivedData [host -> receivedDataLength]) + return -1; + + channel = & peer -> channels [command -> header.channelID]; + reliableSequenceNumber = command -> header.reliableSequenceNumber; + startSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendFragment.startSequenceNumber); + + reliableWindow = reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + currentWindow = channel -> incomingReliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + + if (reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + reliableWindow += ENET_PEER_RELIABLE_WINDOWS; + + if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1) + return 0; + + if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber && + startSequenceNumber <= channel -> incomingUnreliableSequenceNumber) + return 0; + + fragmentNumber = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentNumber); + fragmentCount = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentCount); + fragmentOffset = ENET_NET_TO_HOST_32 (command -> sendFragment.fragmentOffset); + totalLength = ENET_NET_TO_HOST_32 (command -> sendFragment.totalLength); + + if (fragmentCount > ENET_PROTOCOL_MAXIMUM_FRAGMENT_COUNT || + fragmentNumber >= fragmentCount || + totalLength > ENET_PROTOCOL_MAXIMUM_PACKET_SIZE || + fragmentOffset >= totalLength || + fragmentLength > totalLength - fragmentOffset) + return -1; + + for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands)); + currentCommand != enet_list_end (& channel -> incomingUnreliableCommands); + currentCommand = enet_list_previous (currentCommand)) + { + ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand; + + if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + { + if (incomingCommand -> reliableSequenceNumber < channel -> incomingReliableSequenceNumber) + continue; + } + else + if (incomingCommand -> reliableSequenceNumber >= channel -> incomingReliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber < reliableSequenceNumber) + break; + + if (incomingCommand -> reliableSequenceNumber > reliableSequenceNumber) + continue; + + if (incomingCommand -> unreliableSequenceNumber <= startSequenceNumber) + { + if (incomingCommand -> unreliableSequenceNumber < startSequenceNumber) + break; + + if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT || + totalLength != incomingCommand -> packet -> dataLength || + fragmentCount != incomingCommand -> fragmentCount) + return -1; + + startCommand = incomingCommand; + break; + } + } + + if (startCommand == NULL) + { + ENetPacket * packet = enet_packet_create (NULL, totalLength, ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT); + if (packet == NULL) + return -1; + + startCommand = enet_peer_queue_incoming_command (peer, command, packet, fragmentCount); + if (startCommand == NULL) + return -1; + } + + if ((startCommand -> fragments [fragmentNumber / 32] & (1 << (fragmentNumber % 32))) == 0) + { + -- startCommand -> fragmentsRemaining; + + startCommand -> fragments [fragmentNumber / 32] |= (1 << (fragmentNumber % 32)); + + if (fragmentOffset + fragmentLength > startCommand -> packet -> dataLength) + fragmentLength = startCommand -> packet -> dataLength - fragmentOffset; + + memcpy (startCommand -> packet -> data + fragmentOffset, + (enet_uint8 *) command + sizeof (ENetProtocolSendFragment), + fragmentLength); + + if (startCommand -> fragmentsRemaining <= 0) + enet_peer_dispatch_incoming_unreliable_commands (peer, channel); + } + + return 0; +} + +static int +enet_protocol_handle_ping (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + return 0; +} + +static int +enet_protocol_handle_bandwidth_limit (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + if (peer -> incomingBandwidth != 0) + -- host -> bandwidthLimitedPeers; + + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> bandwidthLimit.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> bandwidthLimit.outgoingBandwidth); + + if (peer -> incomingBandwidth != 0) + ++ host -> bandwidthLimitedPeers; + + if (peer -> incomingBandwidth == 0 && host -> outgoingBandwidth == 0) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + else + peer -> windowSize = (ENET_MIN (peer -> incomingBandwidth, host -> outgoingBandwidth) / + ENET_PEER_WINDOW_SIZE_SCALE) * ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (peer -> windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + else + if (peer -> windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + peer -> windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + return 0; +} + +static int +enet_protocol_handle_throttle_configure (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + return -1; + + peer -> packetThrottleInterval = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleInterval); + peer -> packetThrottleAcceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleAcceleration); + peer -> packetThrottleDeceleration = ENET_NET_TO_HOST_32 (command -> throttleConfigure.packetThrottleDeceleration); + + return 0; +} + +static int +enet_protocol_handle_disconnect (ENetHost * host, ENetPeer * peer, const ENetProtocol * command) +{ + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || peer -> state == ENET_PEER_STATE_ZOMBIE || peer -> state == ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT) + return 0; + + enet_peer_reset_queues (peer); + + if (peer -> state == ENET_PEER_STATE_CONNECTION_SUCCEEDED || peer -> state == ENET_PEER_STATE_DISCONNECTING) + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + else + if (peer -> state != ENET_PEER_STATE_CONNECTED && peer -> state != ENET_PEER_STATE_DISCONNECT_LATER) + { + if (peer -> state == ENET_PEER_STATE_CONNECTION_PENDING) host -> recalculateBandwidthLimits = 1; + + enet_peer_reset (peer); + } + else + if (command -> header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) + enet_protocol_change_state (host, peer, ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT); + else + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + if (peer -> state != ENET_PEER_STATE_DISCONNECTED) + peer -> eventData = ENET_NET_TO_HOST_32 (command -> disconnect.data); + + return 0; +} + +static int +enet_protocol_handle_acknowledge (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command) +{ + enet_uint32 roundTripTime, + receivedSentTime, + receivedReliableSequenceNumber; + ENetProtocolCommand commandNumber; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || peer -> state == ENET_PEER_STATE_ZOMBIE) + return 0; + + receivedSentTime = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedSentTime); + receivedSentTime |= host -> serviceTime & 0xFFFF0000; + if ((receivedSentTime & 0x8000) > (host -> serviceTime & 0x8000)) + receivedSentTime -= 0x10000; + + if (ENET_TIME_LESS (host -> serviceTime, receivedSentTime)) + return 0; + + peer -> lastReceiveTime = host -> serviceTime; + peer -> earliestTimeout = 0; + + roundTripTime = ENET_TIME_DIFFERENCE (host -> serviceTime, receivedSentTime); + + enet_peer_throttle (peer, roundTripTime); + + peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4; + + if (roundTripTime >= peer -> roundTripTime) + { + peer -> roundTripTime += (roundTripTime - peer -> roundTripTime) / 8; + peer -> roundTripTimeVariance += (roundTripTime - peer -> roundTripTime) / 4; + } + else + { + peer -> roundTripTime -= (peer -> roundTripTime - roundTripTime) / 8; + peer -> roundTripTimeVariance += (peer -> roundTripTime - roundTripTime) / 4; + } + + if (peer -> roundTripTime < peer -> lowestRoundTripTime) + peer -> lowestRoundTripTime = peer -> roundTripTime; + + if (peer -> roundTripTimeVariance > peer -> highestRoundTripTimeVariance) + peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance; + + if (peer -> packetThrottleEpoch == 0 || + ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> packetThrottleEpoch) >= peer -> packetThrottleInterval) + { + peer -> lastRoundTripTime = peer -> lowestRoundTripTime; + peer -> lastRoundTripTimeVariance = peer -> highestRoundTripTimeVariance; + peer -> lowestRoundTripTime = peer -> roundTripTime; + peer -> highestRoundTripTimeVariance = peer -> roundTripTimeVariance; + peer -> packetThrottleEpoch = host -> serviceTime; + } + + receivedReliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> acknowledge.receivedReliableSequenceNumber); + + commandNumber = enet_protocol_remove_sent_reliable_command (peer, receivedReliableSequenceNumber, command -> header.channelID); + + switch (peer -> state) + { + case ENET_PEER_STATE_ACKNOWLEDGING_CONNECT: + if (commandNumber != ENET_PROTOCOL_COMMAND_VERIFY_CONNECT) + return -1; + + enet_protocol_notify_connect (host, peer, event); + break; + + case ENET_PEER_STATE_DISCONNECTING: + if (commandNumber != ENET_PROTOCOL_COMMAND_DISCONNECT) + return -1; + + enet_protocol_notify_disconnect (host, peer, event); + break; + + case ENET_PEER_STATE_DISCONNECT_LATER: + if (enet_list_empty (& peer -> outgoingReliableCommands) && + enet_list_empty (& peer -> outgoingUnreliableCommands) && + enet_list_empty (& peer -> sentReliableCommands)) + enet_peer_disconnect (peer, peer -> eventData); + break; + + default: + break; + } + + return 0; +} + +static int +enet_protocol_handle_verify_connect (ENetHost * host, ENetEvent * event, ENetPeer * peer, const ENetProtocol * command) +{ + enet_uint32 mtu, windowSize; + size_t channelCount; + + if (peer -> state != ENET_PEER_STATE_CONNECTING) + return 0; + + channelCount = ENET_NET_TO_HOST_32 (command -> verifyConnect.channelCount); + + if (channelCount < ENET_PROTOCOL_MINIMUM_CHANNEL_COUNT || channelCount > ENET_PROTOCOL_MAXIMUM_CHANNEL_COUNT || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleInterval) != peer -> packetThrottleInterval || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleAcceleration) != peer -> packetThrottleAcceleration || + ENET_NET_TO_HOST_32 (command -> verifyConnect.packetThrottleDeceleration) != peer -> packetThrottleDeceleration || + command -> verifyConnect.connectID != peer -> connectID) + { + peer -> eventData = 0; + + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + return -1; + } + + enet_protocol_remove_sent_reliable_command (peer, 1, 0xFF); + + if (channelCount < peer -> channelCount) + peer -> channelCount = channelCount; + + peer -> outgoingPeerID = ENET_NET_TO_HOST_16 (command -> verifyConnect.outgoingPeerID); + peer -> incomingSessionID = command -> verifyConnect.incomingSessionID; + peer -> outgoingSessionID = command -> verifyConnect.outgoingSessionID; + + mtu = ENET_NET_TO_HOST_32 (command -> verifyConnect.mtu); + + if (mtu < ENET_PROTOCOL_MINIMUM_MTU) + mtu = ENET_PROTOCOL_MINIMUM_MTU; + else + if (mtu > ENET_PROTOCOL_MAXIMUM_MTU) + mtu = ENET_PROTOCOL_MAXIMUM_MTU; + + if (mtu < peer -> mtu) + peer -> mtu = mtu; + + windowSize = ENET_NET_TO_HOST_32 (command -> verifyConnect.windowSize); + + if (windowSize < ENET_PROTOCOL_MINIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MINIMUM_WINDOW_SIZE; + + if (windowSize > ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE) + windowSize = ENET_PROTOCOL_MAXIMUM_WINDOW_SIZE; + + if (windowSize < peer -> windowSize) + peer -> windowSize = windowSize; + + peer -> incomingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.incomingBandwidth); + peer -> outgoingBandwidth = ENET_NET_TO_HOST_32 (command -> verifyConnect.outgoingBandwidth); + + enet_protocol_notify_connect (host, peer, event); + return 0; +} + +static int +enet_protocol_handle_incoming_commands (ENetHost * host, ENetEvent * event) +{ + ENetProtocolHeader * header; + ENetProtocol * command; + ENetPeer * peer; + enet_uint8 * currentData; + size_t headerSize; + enet_uint16 peerID, flags; + enet_uint8 sessionID; + + if (host -> receivedDataLength < (size_t) & ((ENetProtocolHeader *) 0) -> sentTime) + return 0; + + header = (ENetProtocolHeader *) host -> receivedData; + + peerID = ENET_NET_TO_HOST_16 (header -> peerID); + sessionID = (peerID & ENET_PROTOCOL_HEADER_SESSION_MASK) >> ENET_PROTOCOL_HEADER_SESSION_SHIFT; + flags = peerID & ENET_PROTOCOL_HEADER_FLAG_MASK; + peerID &= ~ (ENET_PROTOCOL_HEADER_FLAG_MASK | ENET_PROTOCOL_HEADER_SESSION_MASK); + + headerSize = (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME ? sizeof (ENetProtocolHeader) : (size_t) & ((ENetProtocolHeader *) 0) -> sentTime); + if (host -> checksum != NULL) + headerSize += sizeof (enet_uint32); + + if (peerID == ENET_PROTOCOL_MAXIMUM_PEER_ID) + peer = NULL; + else + if (peerID >= host -> peerCount) + return 0; + else + { + peer = & host -> peers [peerID]; + + if (peer -> state == ENET_PEER_STATE_DISCONNECTED || + peer -> state == ENET_PEER_STATE_ZOMBIE || + ((host -> receivedAddress.host != peer -> address.host || + host -> receivedAddress.port != peer -> address.port) && + peer -> address.host != ENET_HOST_BROADCAST) || + (peer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID && + sessionID != peer -> incomingSessionID)) + return 0; + } + + if (flags & ENET_PROTOCOL_HEADER_FLAG_COMPRESSED) + { + size_t originalSize; + if (host -> compressor.context == NULL || host -> compressor.decompress == NULL) + return 0; + + originalSize = host -> compressor.decompress (host -> compressor.context, + host -> receivedData + headerSize, + host -> receivedDataLength - headerSize, + host -> packetData [1] + headerSize, + sizeof (host -> packetData [1]) - headerSize); + if (originalSize <= 0 || originalSize > sizeof (host -> packetData [1]) - headerSize) + return 0; + + memcpy (host -> packetData [1], header, headerSize); + host -> receivedData = host -> packetData [1]; + host -> receivedDataLength = headerSize + originalSize; + } + + if (host -> checksum != NULL) + { + enet_uint32 * checksum = (enet_uint32 *) & host -> receivedData [headerSize - sizeof (enet_uint32)], + desiredChecksum = * checksum; + ENetBuffer buffer; + + * checksum = peer != NULL ? peer -> connectID : 0; + + buffer.data = host -> receivedData; + buffer.dataLength = host -> receivedDataLength; + + if (host -> checksum (& buffer, 1) != desiredChecksum) + return 0; + } + + if (peer != NULL) + { + peer -> address.host = host -> receivedAddress.host; + peer -> address.port = host -> receivedAddress.port; + peer -> incomingDataTotal += host -> receivedDataLength; + } + + currentData = host -> receivedData + headerSize; + + while (currentData < & host -> receivedData [host -> receivedDataLength]) + { + enet_uint8 commandNumber; + size_t commandSize; + + command = (ENetProtocol *) currentData; + + if (currentData + sizeof (ENetProtocolCommandHeader) > & host -> receivedData [host -> receivedDataLength]) + break; + + commandNumber = command -> header.command & ENET_PROTOCOL_COMMAND_MASK; + if (commandNumber >= ENET_PROTOCOL_COMMAND_COUNT) + break; + + commandSize = commandSizes [commandNumber]; + if (commandSize == 0 || currentData + commandSize > & host -> receivedData [host -> receivedDataLength]) + break; + + currentData += commandSize; + + if (peer == NULL && commandNumber != ENET_PROTOCOL_COMMAND_CONNECT) + break; + + command -> header.reliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> header.reliableSequenceNumber); + + switch (commandNumber) + { + case ENET_PROTOCOL_COMMAND_ACKNOWLEDGE: + if (enet_protocol_handle_acknowledge (host, event, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_CONNECT: + if (peer != NULL) + goto commandError; + peer = enet_protocol_handle_connect (host, header, command); + if (peer == NULL) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_VERIFY_CONNECT: + if (enet_protocol_handle_verify_connect (host, event, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_DISCONNECT: + if (enet_protocol_handle_disconnect (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_PING: + if (enet_protocol_handle_ping (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_RELIABLE: + if (enet_protocol_handle_send_reliable (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE: + if (enet_protocol_handle_send_unreliable (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED: + if (enet_protocol_handle_send_unsequenced (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT: + if (enet_protocol_handle_send_fragment (host, peer, command, & currentData)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_BANDWIDTH_LIMIT: + if (enet_protocol_handle_bandwidth_limit (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_THROTTLE_CONFIGURE: + if (enet_protocol_handle_throttle_configure (host, peer, command)) + goto commandError; + break; + + case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT: + if (enet_protocol_handle_send_unreliable_fragment (host, peer, command, & currentData)) + goto commandError; + break; + + default: + goto commandError; + } + + if (peer != NULL && + (command -> header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE) != 0) + { + enet_uint16 sentTime; + + if (! (flags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME)) + break; + + sentTime = ENET_NET_TO_HOST_16 (header -> sentTime); + + switch (peer -> state) + { + case ENET_PEER_STATE_DISCONNECTING: + case ENET_PEER_STATE_ACKNOWLEDGING_CONNECT: + case ENET_PEER_STATE_DISCONNECTED: + case ENET_PEER_STATE_ZOMBIE: + break; + + case ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT: + if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT) + enet_peer_queue_acknowledgement (peer, command, sentTime); + break; + + default: + enet_peer_queue_acknowledgement (peer, command, sentTime); + break; + } + } + } + +commandError: + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + + return 0; +} + +static int +enet_protocol_receive_incoming_commands (ENetHost * host, ENetEvent * event) +{ + for (;;) + { + int receivedLength; + ENetBuffer buffer; + + buffer.data = host -> packetData [0]; + buffer.dataLength = sizeof (host -> packetData [0]); + + receivedLength = enet_socket_receive (host -> socket, + & host -> receivedAddress, + & buffer, + 1); + + if (receivedLength < 0) + return -1; + + if (receivedLength == 0) + return 0; + + host -> receivedData = host -> packetData [0]; + host -> receivedDataLength = receivedLength; + + host -> totalReceivedData += receivedLength; + host -> totalReceivedPackets ++; + + if (host -> intercept != NULL) + { + switch (host -> intercept (host, event)) + { + case 1: + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + + continue; + + case -1: + return -1; + + default: + break; + } + } + + switch (enet_protocol_handle_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: + return -1; + + default: + break; + } + } + + return -1; +} + +static void +enet_protocol_send_acknowledgements (ENetHost * host, ENetPeer * peer) +{ + ENetProtocol * command = & host -> commands [host -> commandCount]; + ENetBuffer * buffer = & host -> buffers [host -> bufferCount]; + ENetAcknowledgement * acknowledgement; + ENetListIterator currentAcknowledgement; + enet_uint16 reliableSequenceNumber; + + currentAcknowledgement = enet_list_begin (& peer -> acknowledgements); + + while (currentAcknowledgement != enet_list_end (& peer -> acknowledgements)) + { + if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] || + buffer >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] || + peer -> mtu - host -> packetSize < sizeof (ENetProtocolAcknowledge)) + { + host -> continueSending = 1; + + break; + } + + acknowledgement = (ENetAcknowledgement *) currentAcknowledgement; + + currentAcknowledgement = enet_list_next (currentAcknowledgement); + + buffer -> data = command; + buffer -> dataLength = sizeof (ENetProtocolAcknowledge); + + host -> packetSize += buffer -> dataLength; + + reliableSequenceNumber = ENET_HOST_TO_NET_16 (acknowledgement -> command.header.reliableSequenceNumber); + + command -> header.command = ENET_PROTOCOL_COMMAND_ACKNOWLEDGE; + command -> header.channelID = acknowledgement -> command.header.channelID; + command -> header.reliableSequenceNumber = reliableSequenceNumber; + command -> acknowledge.receivedReliableSequenceNumber = reliableSequenceNumber; + command -> acknowledge.receivedSentTime = ENET_HOST_TO_NET_16 (acknowledgement -> sentTime); + + if ((acknowledgement -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT) + enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE); + + enet_list_remove (& acknowledgement -> acknowledgementList); + enet_free (acknowledgement); + + ++ command; + ++ buffer; + } + + host -> commandCount = command - host -> commands; + host -> bufferCount = buffer - host -> buffers; +} + +static void +enet_protocol_send_unreliable_outgoing_commands (ENetHost * host, ENetPeer * peer) +{ + ENetProtocol * command = & host -> commands [host -> commandCount]; + ENetBuffer * buffer = & host -> buffers [host -> bufferCount]; + ENetOutgoingCommand * outgoingCommand; + ENetListIterator currentCommand; + + currentCommand = enet_list_begin (& peer -> outgoingUnreliableCommands); + + while (currentCommand != enet_list_end (& peer -> outgoingUnreliableCommands)) + { + size_t commandSize; + + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + commandSize = commandSizes [outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK]; + + if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] || + buffer + 1 >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] || + peer -> mtu - host -> packetSize < commandSize || + (outgoingCommand -> packet != NULL && + peer -> mtu - host -> packetSize < commandSize + outgoingCommand -> fragmentLength)) + { + host -> continueSending = 1; + + break; + } + + currentCommand = enet_list_next (currentCommand); + + if (outgoingCommand -> packet != NULL && outgoingCommand -> fragmentOffset == 0) + { + peer -> packetThrottleCounter += ENET_PEER_PACKET_THROTTLE_COUNTER; + peer -> packetThrottleCounter %= ENET_PEER_PACKET_THROTTLE_SCALE; + + if (peer -> packetThrottleCounter > peer -> packetThrottle) + { + enet_uint16 reliableSequenceNumber = outgoingCommand -> reliableSequenceNumber, + unreliableSequenceNumber = outgoingCommand -> unreliableSequenceNumber; + for (;;) + { + -- outgoingCommand -> packet -> referenceCount; + + if (outgoingCommand -> packet -> referenceCount == 0) + enet_packet_destroy (outgoingCommand -> packet); + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + enet_free (outgoingCommand); + + if (currentCommand == enet_list_end (& peer -> outgoingUnreliableCommands)) + break; + + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + if (outgoingCommand -> reliableSequenceNumber != reliableSequenceNumber || + outgoingCommand -> unreliableSequenceNumber != unreliableSequenceNumber) + break; + + currentCommand = enet_list_next (currentCommand); + } + + continue; + } + } + + buffer -> data = command; + buffer -> dataLength = commandSize; + + host -> packetSize += buffer -> dataLength; + + * command = outgoingCommand -> command; + + enet_list_remove (& outgoingCommand -> outgoingCommandList); + + if (outgoingCommand -> packet != NULL) + { + ++ buffer; + + buffer -> data = outgoingCommand -> packet -> data + outgoingCommand -> fragmentOffset; + buffer -> dataLength = outgoingCommand -> fragmentLength; + + host -> packetSize += buffer -> dataLength; + + enet_list_insert (enet_list_end (& peer -> sentUnreliableCommands), outgoingCommand); + } + else + enet_free (outgoingCommand); + + ++ command; + ++ buffer; + } + + host -> commandCount = command - host -> commands; + host -> bufferCount = buffer - host -> buffers; + + if (peer -> state == ENET_PEER_STATE_DISCONNECT_LATER && + enet_list_empty (& peer -> outgoingReliableCommands) && + enet_list_empty (& peer -> outgoingUnreliableCommands) && + enet_list_empty (& peer -> sentReliableCommands)) + enet_peer_disconnect (peer, peer -> eventData); +} + +static int +enet_protocol_check_timeouts (ENetHost * host, ENetPeer * peer, ENetEvent * event) +{ + ENetOutgoingCommand * outgoingCommand; + ENetListIterator currentCommand, insertPosition; + + currentCommand = enet_list_begin (& peer -> sentReliableCommands); + insertPosition = enet_list_begin (& peer -> outgoingReliableCommands); + + while (currentCommand != enet_list_end (& peer -> sentReliableCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + currentCommand = enet_list_next (currentCommand); + + if (ENET_TIME_DIFFERENCE (host -> serviceTime, outgoingCommand -> sentTime) < outgoingCommand -> roundTripTimeout) + continue; + + if (peer -> earliestTimeout == 0 || + ENET_TIME_LESS (outgoingCommand -> sentTime, peer -> earliestTimeout)) + peer -> earliestTimeout = outgoingCommand -> sentTime; + + if (peer -> earliestTimeout != 0 && + (ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> earliestTimeout) >= peer -> timeoutMaximum || + (outgoingCommand -> roundTripTimeout >= outgoingCommand -> roundTripTimeoutLimit && + ENET_TIME_DIFFERENCE (host -> serviceTime, peer -> earliestTimeout) >= peer -> timeoutMinimum))) + { + enet_protocol_notify_disconnect (host, peer, event); + + return 1; + } + + if (outgoingCommand -> packet != NULL) + peer -> reliableDataInTransit -= outgoingCommand -> fragmentLength; + + ++ peer -> packetsLost; + + outgoingCommand -> roundTripTimeout *= 2; + + enet_list_insert (insertPosition, enet_list_remove (& outgoingCommand -> outgoingCommandList)); + + if (currentCommand == enet_list_begin (& peer -> sentReliableCommands) && + ! enet_list_empty (& peer -> sentReliableCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + peer -> nextTimeout = outgoingCommand -> sentTime + outgoingCommand -> roundTripTimeout; + } + } + + return 0; +} + +static int +enet_protocol_send_reliable_outgoing_commands (ENetHost * host, ENetPeer * peer) +{ + ENetProtocol * command = & host -> commands [host -> commandCount]; + ENetBuffer * buffer = & host -> buffers [host -> bufferCount]; + ENetOutgoingCommand * outgoingCommand; + ENetListIterator currentCommand; + ENetChannel *channel; + enet_uint16 reliableWindow; + size_t commandSize; + int windowExceeded = 0, windowWrap = 0, canPing = 1; + + currentCommand = enet_list_begin (& peer -> outgoingReliableCommands); + + while (currentCommand != enet_list_end (& peer -> outgoingReliableCommands)) + { + outgoingCommand = (ENetOutgoingCommand *) currentCommand; + + channel = outgoingCommand -> command.header.channelID < peer -> channelCount ? & peer -> channels [outgoingCommand -> command.header.channelID] : NULL; + reliableWindow = outgoingCommand -> reliableSequenceNumber / ENET_PEER_RELIABLE_WINDOW_SIZE; + if (channel != NULL) + { + if (! windowWrap && + outgoingCommand -> sendAttempts < 1 && + ! (outgoingCommand -> reliableSequenceNumber % ENET_PEER_RELIABLE_WINDOW_SIZE) && + (channel -> reliableWindows [(reliableWindow + ENET_PEER_RELIABLE_WINDOWS - 1) % ENET_PEER_RELIABLE_WINDOWS] >= ENET_PEER_RELIABLE_WINDOW_SIZE || + channel -> usedReliableWindows & ((((1 << ENET_PEER_FREE_RELIABLE_WINDOWS) - 1) << reliableWindow) | + (((1 << ENET_PEER_FREE_RELIABLE_WINDOWS) - 1) >> (ENET_PEER_RELIABLE_WINDOW_SIZE - reliableWindow))))) + windowWrap = 1; + if (windowWrap) + { + currentCommand = enet_list_next (currentCommand); + + continue; + } + } + + if (outgoingCommand -> packet != NULL) + { + if (! windowExceeded) + { + enet_uint32 windowSize = (peer -> packetThrottle * peer -> windowSize) / ENET_PEER_PACKET_THROTTLE_SCALE; + + if (peer -> reliableDataInTransit + outgoingCommand -> fragmentLength > ENET_MAX (windowSize, peer -> mtu)) + windowExceeded = 1; + } + if (windowExceeded) + { + currentCommand = enet_list_next (currentCommand); + + continue; + } + } + + canPing = 0; + + commandSize = commandSizes [outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK]; + if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)] || + buffer + 1 >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] || + peer -> mtu - host -> packetSize < commandSize || + (outgoingCommand -> packet != NULL && + (enet_uint16) (peer -> mtu - host -> packetSize) < (enet_uint16) (commandSize + outgoingCommand -> fragmentLength))) + { + host -> continueSending = 1; + + break; + } + + currentCommand = enet_list_next (currentCommand); + + if (channel != NULL && outgoingCommand -> sendAttempts < 1) + { + channel -> usedReliableWindows |= 1 << reliableWindow; + ++ channel -> reliableWindows [reliableWindow]; + } + + ++ outgoingCommand -> sendAttempts; + + if (outgoingCommand -> roundTripTimeout == 0) + { + outgoingCommand -> roundTripTimeout = peer -> roundTripTime + 4 * peer -> roundTripTimeVariance; + outgoingCommand -> roundTripTimeoutLimit = peer -> timeoutLimit * outgoingCommand -> roundTripTimeout; + } + + if (enet_list_empty (& peer -> sentReliableCommands)) + peer -> nextTimeout = host -> serviceTime + outgoingCommand -> roundTripTimeout; + + enet_list_insert (enet_list_end (& peer -> sentReliableCommands), + enet_list_remove (& outgoingCommand -> outgoingCommandList)); + + outgoingCommand -> sentTime = host -> serviceTime; + + buffer -> data = command; + buffer -> dataLength = commandSize; + + host -> packetSize += buffer -> dataLength; + host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_SENT_TIME; + + * command = outgoingCommand -> command; + + if (outgoingCommand -> packet != NULL) + { + ++ buffer; + + buffer -> data = outgoingCommand -> packet -> data + outgoingCommand -> fragmentOffset; + buffer -> dataLength = outgoingCommand -> fragmentLength; + + host -> packetSize += outgoingCommand -> fragmentLength; + + peer -> reliableDataInTransit += outgoingCommand -> fragmentLength; + } + + ++ peer -> packetsSent; + + ++ command; + ++ buffer; + } + + host -> commandCount = command - host -> commands; + host -> bufferCount = buffer - host -> buffers; + + return canPing; +} + +static int +enet_protocol_send_outgoing_commands (ENetHost * host, ENetEvent * event, int checkForTimeouts) +{ + enet_uint8 headerData [sizeof (ENetProtocolHeader) + sizeof (enet_uint32)]; + ENetProtocolHeader * header = (ENetProtocolHeader *) headerData; + ENetPeer * currentPeer; + int sentLength; + size_t shouldCompress = 0; + + host -> continueSending = 1; + + while (host -> continueSending) + for (host -> continueSending = 0, + currentPeer = host -> peers; + currentPeer < & host -> peers [host -> peerCount]; + ++ currentPeer) + { + if (currentPeer -> state == ENET_PEER_STATE_DISCONNECTED || + currentPeer -> state == ENET_PEER_STATE_ZOMBIE) + continue; + + host -> headerFlags = 0; + host -> commandCount = 0; + host -> bufferCount = 1; + host -> packetSize = sizeof (ENetProtocolHeader); + + if (! enet_list_empty (& currentPeer -> acknowledgements)) + enet_protocol_send_acknowledgements (host, currentPeer); + + if (checkForTimeouts != 0 && + ! enet_list_empty (& currentPeer -> sentReliableCommands) && + ENET_TIME_GREATER_EQUAL (host -> serviceTime, currentPeer -> nextTimeout) && + enet_protocol_check_timeouts (host, currentPeer, event) == 1) + { + if (event != NULL && event -> type != ENET_EVENT_TYPE_NONE) + return 1; + else + continue; + } + + if ((enet_list_empty (& currentPeer -> outgoingReliableCommands) || + enet_protocol_send_reliable_outgoing_commands (host, currentPeer)) && + enet_list_empty (& currentPeer -> sentReliableCommands) && + ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> lastReceiveTime) >= currentPeer -> pingInterval && + currentPeer -> mtu - host -> packetSize >= sizeof (ENetProtocolPing)) + { + enet_peer_ping (currentPeer); + enet_protocol_send_reliable_outgoing_commands (host, currentPeer); + } + + if (! enet_list_empty (& currentPeer -> outgoingUnreliableCommands)) + enet_protocol_send_unreliable_outgoing_commands (host, currentPeer); + + if (host -> commandCount == 0) + continue; + + if (currentPeer -> packetLossEpoch == 0) + currentPeer -> packetLossEpoch = host -> serviceTime; + else + if (ENET_TIME_DIFFERENCE (host -> serviceTime, currentPeer -> packetLossEpoch) >= ENET_PEER_PACKET_LOSS_INTERVAL && + currentPeer -> packetsSent > 0) + { + enet_uint32 packetLoss = currentPeer -> packetsLost * ENET_PEER_PACKET_LOSS_SCALE / currentPeer -> packetsSent; + +#ifdef ENET_DEBUG + printf ("peer %u: %f%%+-%f%% packet loss, %u+-%u ms round trip time, %f%% throttle, %u/%u outgoing, %u/%u incoming\n", currentPeer -> incomingPeerID, currentPeer -> packetLoss / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> packetLossVariance / (float) ENET_PEER_PACKET_LOSS_SCALE, currentPeer -> roundTripTime, currentPeer -> roundTripTimeVariance, currentPeer -> packetThrottle / (float) ENET_PEER_PACKET_THROTTLE_SCALE, enet_list_size (& currentPeer -> outgoingReliableCommands), enet_list_size (& currentPeer -> outgoingUnreliableCommands), currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingReliableCommands) : 0, currentPeer -> channels != NULL ? enet_list_size (& currentPeer -> channels -> incomingUnreliableCommands) : 0); +#endif + + currentPeer -> packetLossVariance -= currentPeer -> packetLossVariance / 4; + + if (packetLoss >= currentPeer -> packetLoss) + { + currentPeer -> packetLoss += (packetLoss - currentPeer -> packetLoss) / 8; + currentPeer -> packetLossVariance += (packetLoss - currentPeer -> packetLoss) / 4; + } + else + { + currentPeer -> packetLoss -= (currentPeer -> packetLoss - packetLoss) / 8; + currentPeer -> packetLossVariance += (currentPeer -> packetLoss - packetLoss) / 4; + } + + currentPeer -> packetLossEpoch = host -> serviceTime; + currentPeer -> packetsSent = 0; + currentPeer -> packetsLost = 0; + } + + host -> buffers -> data = headerData; + if (host -> headerFlags & ENET_PROTOCOL_HEADER_FLAG_SENT_TIME) + { + header -> sentTime = ENET_HOST_TO_NET_16 (host -> serviceTime & 0xFFFF); + + host -> buffers -> dataLength = sizeof (ENetProtocolHeader); + } + else + host -> buffers -> dataLength = (size_t) & ((ENetProtocolHeader *) 0) -> sentTime; + + shouldCompress = 0; + if (host -> compressor.context != NULL && host -> compressor.compress != NULL) + { + size_t originalSize = host -> packetSize - sizeof(ENetProtocolHeader), + compressedSize = host -> compressor.compress (host -> compressor.context, + & host -> buffers [1], host -> bufferCount - 1, + originalSize, + host -> packetData [1], + originalSize); + if (compressedSize > 0 && compressedSize < originalSize) + { + host -> headerFlags |= ENET_PROTOCOL_HEADER_FLAG_COMPRESSED; + shouldCompress = compressedSize; +#ifdef ENET_DEBUG_COMPRESS + printf ("peer %u: compressed %u -> %u (%u%%)\n", currentPeer -> incomingPeerID, originalSize, compressedSize, (compressedSize * 100) / originalSize); +#endif + } + } + + if (currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID) + host -> headerFlags |= currentPeer -> outgoingSessionID << ENET_PROTOCOL_HEADER_SESSION_SHIFT; + header -> peerID = ENET_HOST_TO_NET_16 (currentPeer -> outgoingPeerID | host -> headerFlags); + if (host -> checksum != NULL) + { + enet_uint32 * checksum = (enet_uint32 *) & headerData [host -> buffers -> dataLength]; + * checksum = currentPeer -> outgoingPeerID < ENET_PROTOCOL_MAXIMUM_PEER_ID ? currentPeer -> connectID : 0; + host -> buffers -> dataLength += sizeof (enet_uint32); + * checksum = host -> checksum (host -> buffers, host -> bufferCount); + } + + if (shouldCompress > 0) + { + host -> buffers [1].data = host -> packetData [1]; + host -> buffers [1].dataLength = shouldCompress; + host -> bufferCount = 2; + } + + currentPeer -> lastSendTime = host -> serviceTime; + + sentLength = enet_socket_send (host -> socket, & currentPeer -> address, host -> buffers, host -> bufferCount); + + enet_protocol_remove_sent_unreliable_commands (currentPeer); + + if (sentLength < 0) + return -1; + + host -> totalSentData += sentLength; + host -> totalSentPackets ++; + } + + return 0; +} + +/** Sends any queued packets on the host specified to its designated peers. + + @param host host to flush + @remarks this function need only be used in circumstances where one wishes to send queued packets earlier than in a call to enet_host_service(). + @ingroup host +*/ +void +enet_host_flush (ENetHost * host) +{ + host -> serviceTime = enet_time_get (); + + enet_protocol_send_outgoing_commands (host, NULL, 0); +} + +/** Checks for any queued events on the host and dispatches one if available. + + @param host host to check for events + @param event an event structure where event details will be placed if available + @retval > 0 if an event was dispatched + @retval 0 if no events are available + @retval < 0 on failure + @ingroup host +*/ +int +enet_host_check_events (ENetHost * host, ENetEvent * event) +{ + if (event == NULL) return -1; + + event -> type = ENET_EVENT_TYPE_NONE; + event -> peer = NULL; + event -> packet = NULL; + + return enet_protocol_dispatch_incoming_commands (host, event); +} + +/** Waits for events on the host specified and shuttles packets between + the host and its peers. + + @param host host to service + @param event an event structure where event details will be placed if one occurs + if event == NULL then no events will be delivered + @param timeout number of milliseconds that ENet should wait for events + @retval > 0 if an event occurred within the specified time limit + @retval 0 if no event occurred + @retval < 0 on failure + @remarks enet_host_service should be called fairly regularly for adequate performance + @ingroup host +*/ +int +enet_host_service (ENetHost * host, ENetEvent * event, enet_uint32 timeout) +{ + enet_uint32 waitCondition; + + if (event != NULL) + { + event -> type = ENET_EVENT_TYPE_NONE; + event -> peer = NULL; + event -> packet = NULL; + + switch (enet_protocol_dispatch_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error dispatching incoming packets"); +#endif + + return -1; + + default: + break; + } + } + + host -> serviceTime = enet_time_get (); + + timeout += host -> serviceTime; + + do + { + if (ENET_TIME_DIFFERENCE (host -> serviceTime, host -> bandwidthThrottleEpoch) >= ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL) + enet_host_bandwidth_throttle (host); + + switch (enet_protocol_send_outgoing_commands (host, event, 1)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error sending outgoing packets"); +#endif + + return -1; + + default: + break; + } + + switch (enet_protocol_receive_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error receiving incoming packets"); +#endif + + return -1; + + default: + break; + } + + switch (enet_protocol_send_outgoing_commands (host, event, 1)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error sending outgoing packets"); +#endif + + return -1; + + default: + break; + } + + if (event != NULL) + { + switch (enet_protocol_dispatch_incoming_commands (host, event)) + { + case 1: + return 1; + + case -1: +#ifdef ENET_DEBUG + perror ("Error dispatching incoming packets"); +#endif + + return -1; + + default: + break; + } + } + + do + { + host -> serviceTime = enet_time_get (); + + if (ENET_TIME_GREATER_EQUAL (host -> serviceTime, timeout)) + return 0; + + waitCondition = ENET_SOCKET_WAIT_RECEIVE | ENET_SOCKET_WAIT_INTERRUPT; + + if (enet_socket_wait (host -> socket, & waitCondition, ENET_TIME_DIFFERENCE (timeout, host -> serviceTime)) != 0) + return -1; + } + while (waitCondition & ENET_SOCKET_WAIT_INTERRUPT); + + host -> serviceTime = enet_time_get (); + } while (waitCondition & ENET_SOCKET_WAIT_RECEIVE); + + return 0; +} + diff --git a/jni/love/src/libraries/enet/libenet/unix.c b/jni/love/src/libraries/enet/libenet/unix.c new file mode 100644 index 00000000..111d8e66 --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/unix.c @@ -0,0 +1,548 @@ +/** + @file unix.c + @brief ENet Unix system specific functions +*/ +#ifndef _WIN32 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +#ifdef __APPLE__ +#ifdef HAS_POLL +#undef HAS_POLL +#endif +#ifndef HAS_FCNTL +#define HAS_FCNTL 1 +#endif +#ifndef HAS_INET_PTON +#define HAS_INET_PTON 1 +#endif +#ifndef HAS_INET_NTOP +#define HAS_INET_NTOP 1 +#endif +#ifndef HAS_MSGHDR_FLAGS +#define HAS_MSGHDR_FLAGS 1 +#endif +#ifndef HAS_SOCKLEN_T +#define HAS_SOCKLEN_T 1 +#endif +#endif + +#ifdef HAS_FCNTL +#include +#endif + +#ifdef HAS_POLL +#include +#endif + +#include "common/config.h" +#ifndef HAS_SOCKLEN_T +typedef int socklen_t; +#endif + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + +static enet_uint32 timeBase = 0; + +int +enet_initialize (void) +{ + return 0; +} + +void +enet_deinitialize (void) +{ +} + +enet_uint32 +enet_host_random_seed (void) +{ + return (enet_uint32) time (NULL); +} + +enet_uint32 +enet_time_get (void) +{ + struct timeval timeVal; + + gettimeofday (& timeVal, NULL); + + return timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - timeBase; +} + +void +enet_time_set (enet_uint32 newTimeBase) +{ + struct timeval timeVal; + + gettimeofday (& timeVal, NULL); + + timeBase = timeVal.tv_sec * 1000 + timeVal.tv_usec / 1000 - newTimeBase; +} + +int +enet_address_set_host (ENetAddress * address, const char * name) +{ + struct hostent * hostEntry = NULL; +#ifdef HAS_GETHOSTBYNAME_R + struct hostent hostData; + char buffer [2048]; + int errnum; + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); +#else + hostEntry = gethostbyname_r (name, & hostData, buffer, sizeof (buffer), & errnum); +#endif +#else + hostEntry = gethostbyname (name); +#endif + + if (hostEntry == NULL || + hostEntry -> h_addrtype != AF_INET) + { +#ifdef HAS_INET_PTON + if (! inet_pton (AF_INET, name, & address -> host)) +#else + if (! inet_aton (name, (struct in_addr *) & address -> host)) +#endif + return -1; + return 0; + } + + address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0]; + + return 0; +} + +int +enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength) +{ +#ifdef HAS_INET_NTOP + if (inet_ntop (AF_INET, & address -> host, name, nameLength) == NULL) +#else + char * addr = inet_ntoa (* (struct in_addr *) & address -> host); + if (addr != NULL) + strncpy (name, addr, nameLength); + else +#endif + return -1; + return 0; +} + +int +enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength) +{ + struct in_addr in; + struct hostent * hostEntry = NULL; +#ifdef HAS_GETHOSTBYADDR_R + struct hostent hostData; + char buffer [2048]; + int errnum; + + in.s_addr = address -> host; + +#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & hostEntry, & errnum); +#else + hostEntry = gethostbyaddr_r ((char *) & in, sizeof (struct in_addr), AF_INET, & hostData, buffer, sizeof (buffer), & errnum); +#endif +#else + in.s_addr = address -> host; + + hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET); +#endif + + if (hostEntry == NULL) + return enet_address_get_host_ip (address, name, nameLength); + + strncpy (name, hostEntry -> h_name, nameLength); + + return 0; +} + +int +enet_socket_bind (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + + if (address != NULL) + { + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + else + { + sin.sin_port = 0; + sin.sin_addr.s_addr = INADDR_ANY; + } + + return bind (socket, + (struct sockaddr *) & sin, + sizeof (struct sockaddr_in)); +} + +int +enet_socket_get_address (ENetSocket socket, ENetAddress * address) +{ + struct sockaddr_in sin; + socklen_t sinLength = sizeof (struct sockaddr_in); + + if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1) + return -1; + + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + + return 0; +} + +int +enet_socket_listen (ENetSocket socket, int backlog) +{ + return listen (socket, backlog < 0 ? SOMAXCONN : backlog); +} + +ENetSocket +enet_socket_create (ENetSocketType type) +{ + return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0); +} + +int +enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value) +{ + int result = -1; + switch (option) + { + case ENET_SOCKOPT_NONBLOCK: +#ifdef HAS_FCNTL + result = fcntl (socket, F_SETFL, O_NONBLOCK | fcntl (socket, F_GETFL)); +#else + result = ioctl (socket, FIONBIO, & value); +#endif + break; + + case ENET_SOCKOPT_BROADCAST: + result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_REUSEADDR: + result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVBUF: + result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDBUF: + result = setsockopt (socket, SOL_SOCKET, SO_SNDBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVTIMEO: + { + struct timeval timeVal; + timeVal.tv_sec = value / 1000; + timeVal.tv_usec = (value % 1000) * 1000; + result = setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, (char *) & timeVal, sizeof (struct timeval)); + break; + } + + case ENET_SOCKOPT_SNDTIMEO: + { + struct timeval timeVal; + timeVal.tv_sec = value / 1000; + timeVal.tv_usec = (value % 1000) * 1000; + result = setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, (char *) & timeVal, sizeof (struct timeval)); + break; + } + + case ENET_SOCKOPT_NODELAY: + result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int)); + break; + + default: + break; + } + return result == -1 ? -1 : 0; +} + +int +enet_socket_get_option (ENetSocket socket, ENetSocketOption option, int * value) +{ + int result = -1; + socklen_t len; + switch (option) + { + case ENET_SOCKOPT_ERROR: + len = sizeof (int); + result = getsockopt (socket, SOL_SOCKET, SO_ERROR, value, & len); + break; + + default: + break; + } + return result == -1 ? -1 : 0; +} + +int +enet_socket_connect (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + int result; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + result = connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in)); + if (result == -1 && errno == EINPROGRESS) + return 0; + + return result; +} + +ENetSocket +enet_socket_accept (ENetSocket socket, ENetAddress * address) +{ + int result; + struct sockaddr_in sin; + socklen_t sinLength = sizeof (struct sockaddr_in); + + result = accept (socket, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL); + + if (result == -1) + return ENET_SOCKET_NULL; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return result; +} + +int +enet_socket_shutdown (ENetSocket socket, ENetSocketShutdown how) +{ + return shutdown (socket, (int) how); +} + +void +enet_socket_destroy (ENetSocket socket) +{ + if (socket != -1) + close (socket); +} + +int +enet_socket_send (ENetSocket socket, + const ENetAddress * address, + const ENetBuffer * buffers, + size_t bufferCount) +{ + struct msghdr msgHdr; + struct sockaddr_in sin; + int sentLength; + + memset (& msgHdr, 0, sizeof (struct msghdr)); + + if (address != NULL) + { + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + msgHdr.msg_name = & sin; + msgHdr.msg_namelen = sizeof (struct sockaddr_in); + } + + msgHdr.msg_iov = (struct iovec *) buffers; + msgHdr.msg_iovlen = bufferCount; + + sentLength = sendmsg (socket, & msgHdr, MSG_NOSIGNAL); + + if (sentLength == -1) + { + if (errno == EWOULDBLOCK) + return 0; + + return -1; + } + + return sentLength; +} + +int +enet_socket_receive (ENetSocket socket, + ENetAddress * address, + ENetBuffer * buffers, + size_t bufferCount) +{ + struct msghdr msgHdr; + struct sockaddr_in sin; + int recvLength; + + memset (& msgHdr, 0, sizeof (struct msghdr)); + + if (address != NULL) + { + msgHdr.msg_name = & sin; + msgHdr.msg_namelen = sizeof (struct sockaddr_in); + } + + msgHdr.msg_iov = (struct iovec *) buffers; + msgHdr.msg_iovlen = bufferCount; + + recvLength = recvmsg (socket, & msgHdr, MSG_NOSIGNAL); + + if (recvLength == -1) + { + if (errno == EWOULDBLOCK) + return 0; + + return -1; + } + +#ifdef HAS_MSGHDR_FLAGS + if (msgHdr.msg_flags & MSG_TRUNC) + return -1; +#endif + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return recvLength; +} + +int +enet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout) +{ + struct timeval timeVal; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal); +} + +int +enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout) +{ +#ifdef HAS_POLL + struct pollfd pollSocket; + int pollCount; + + pollSocket.fd = socket; + pollSocket.events = 0; + + if (* condition & ENET_SOCKET_WAIT_SEND) + pollSocket.events |= POLLOUT; + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + pollSocket.events |= POLLIN; + + pollCount = poll (& pollSocket, 1, timeout); + + if (pollCount < 0) + { + if (errno == EINTR && * condition & ENET_SOCKET_WAIT_INTERRUPT) + { + * condition = ENET_SOCKET_WAIT_INTERRUPT; + + return 0; + } + + return -1; + } + + * condition = ENET_SOCKET_WAIT_NONE; + + if (pollCount == 0) + return 0; + + if (pollSocket.revents & POLLOUT) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (pollSocket.revents & POLLIN) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +#else + fd_set readSet, writeSet; + struct timeval timeVal; + int selectCount; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + FD_ZERO (& readSet); + FD_ZERO (& writeSet); + + if (* condition & ENET_SOCKET_WAIT_SEND) + FD_SET (socket, & writeSet); + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + FD_SET (socket, & readSet); + + selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal); + + if (selectCount < 0) + { + if (errno == EINTR && * condition & ENET_SOCKET_WAIT_INTERRUPT) + { + * condition = ENET_SOCKET_WAIT_INTERRUPT; + + return 0; + } + + return -1; + } + + * condition = ENET_SOCKET_WAIT_NONE; + + if (selectCount == 0) + return 0; + + if (FD_ISSET (socket, & writeSet)) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (FD_ISSET (socket, & readSet)) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +#endif +} + +#endif + diff --git a/jni/love/src/libraries/enet/libenet/win32.c b/jni/love/src/libraries/enet/libenet/win32.c new file mode 100644 index 00000000..c441841d --- /dev/null +++ b/jni/love/src/libraries/enet/libenet/win32.c @@ -0,0 +1,410 @@ +/** + @file win32.c + @brief ENet Win32 system specific functions +*/ +#ifdef _WIN32 + +#include +#define ENET_BUILDING_LIB 1 +#include "enet/enet.h" + +static enet_uint32 timeBase = 0; + +int +enet_initialize (void) +{ + WORD versionRequested = MAKEWORD (1, 1); + WSADATA wsaData; + + if (WSAStartup (versionRequested, & wsaData)) + return -1; + + if (LOBYTE (wsaData.wVersion) != 1|| + HIBYTE (wsaData.wVersion) != 1) + { + WSACleanup (); + + return -1; + } + + timeBeginPeriod (1); + + return 0; +} + +void +enet_deinitialize (void) +{ + timeEndPeriod (1); + + WSACleanup (); +} + +enet_uint32 +enet_host_random_seed (void) +{ + return (enet_uint32) timeGetTime (); +} + +enet_uint32 +enet_time_get (void) +{ + return (enet_uint32) timeGetTime () - timeBase; +} + +void +enet_time_set (enet_uint32 newTimeBase) +{ + timeBase = (enet_uint32) timeGetTime () - newTimeBase; +} + +int +enet_address_set_host (ENetAddress * address, const char * name) +{ + struct hostent * hostEntry; + + hostEntry = gethostbyname (name); + if (hostEntry == NULL || + hostEntry -> h_addrtype != AF_INET) + { + unsigned long host = inet_addr (name); + if (host == INADDR_NONE) + return -1; + address -> host = host; + return 0; + } + + address -> host = * (enet_uint32 *) hostEntry -> h_addr_list [0]; + + return 0; +} + +int +enet_address_get_host_ip (const ENetAddress * address, char * name, size_t nameLength) +{ + char * addr = inet_ntoa (* (struct in_addr *) & address -> host); + if (addr == NULL) + return -1; + strncpy (name, addr, nameLength); + return 0; +} + +int +enet_address_get_host (const ENetAddress * address, char * name, size_t nameLength) +{ + struct in_addr in; + struct hostent * hostEntry; + + in.s_addr = address -> host; + + hostEntry = gethostbyaddr ((char *) & in, sizeof (struct in_addr), AF_INET); + if (hostEntry == NULL) + return enet_address_get_host_ip (address, name, nameLength); + + strncpy (name, hostEntry -> h_name, nameLength); + + return 0; +} + +int +enet_socket_bind (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + + if (address != NULL) + { + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + else + { + sin.sin_port = 0; + sin.sin_addr.s_addr = INADDR_ANY; + } + + return bind (socket, + (struct sockaddr *) & sin, + sizeof (struct sockaddr_in)) == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_get_address (ENetSocket socket, ENetAddress * address) +{ + struct sockaddr_in sin; + int sinLength = sizeof (struct sockaddr_in); + + if (getsockname (socket, (struct sockaddr *) & sin, & sinLength) == -1) + return -1; + + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + + return 0; +} + +int +enet_socket_listen (ENetSocket socket, int backlog) +{ + return listen (socket, backlog < 0 ? SOMAXCONN : backlog) == SOCKET_ERROR ? -1 : 0; +} + +ENetSocket +enet_socket_create (ENetSocketType type) +{ + return socket (PF_INET, type == ENET_SOCKET_TYPE_DATAGRAM ? SOCK_DGRAM : SOCK_STREAM, 0); +} + +int +enet_socket_set_option (ENetSocket socket, ENetSocketOption option, int value) +{ + int result = SOCKET_ERROR; + switch (option) + { + case ENET_SOCKOPT_NONBLOCK: + { + u_long nonBlocking = (u_long) value; + result = ioctlsocket (socket, FIONBIO, & nonBlocking); + break; + } + + case ENET_SOCKOPT_BROADCAST: + result = setsockopt (socket, SOL_SOCKET, SO_BROADCAST, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_REUSEADDR: + result = setsockopt (socket, SOL_SOCKET, SO_REUSEADDR, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVBUF: + result = setsockopt (socket, SOL_SOCKET, SO_RCVBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDBUF: + result = setsockopt (socket, SOL_SOCKET, SO_SNDBUF, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_RCVTIMEO: + result = setsockopt (socket, SOL_SOCKET, SO_RCVTIMEO, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_SNDTIMEO: + result = setsockopt (socket, SOL_SOCKET, SO_SNDTIMEO, (char *) & value, sizeof (int)); + break; + + case ENET_SOCKOPT_NODELAY: + result = setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (char *) & value, sizeof (int)); + break; + + default: + break; + } + return result == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_get_option (ENetSocket socket, ENetSocketOption option, int * value) +{ + int result = SOCKET_ERROR, len; + switch (option) + { + case ENET_SOCKOPT_ERROR: + len = sizeof(int); + result = getsockopt (socket, SOL_SOCKET, SO_ERROR, (char *) value, & len); + break; + + default: + break; + } + return result == SOCKET_ERROR ? -1 : 0; +} + +int +enet_socket_connect (ENetSocket socket, const ENetAddress * address) +{ + struct sockaddr_in sin; + int result; + + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + + result = connect (socket, (struct sockaddr *) & sin, sizeof (struct sockaddr_in)); + if (result == SOCKET_ERROR && WSAGetLastError () != WSAEWOULDBLOCK) + return -1; + + return 0; +} + +ENetSocket +enet_socket_accept (ENetSocket socket, ENetAddress * address) +{ + SOCKET result; + struct sockaddr_in sin; + int sinLength = sizeof (struct sockaddr_in); + + result = accept (socket, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL); + + if (result == INVALID_SOCKET) + return ENET_SOCKET_NULL; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return result; +} + +int +enet_socket_shutdown (ENetSocket socket, ENetSocketShutdown how) +{ + return shutdown (socket, (int) how) == SOCKET_ERROR ? -1 : 0; +} + +void +enet_socket_destroy (ENetSocket socket) +{ + if (socket != INVALID_SOCKET) + closesocket (socket); +} + +int +enet_socket_send (ENetSocket socket, + const ENetAddress * address, + const ENetBuffer * buffers, + size_t bufferCount) +{ + struct sockaddr_in sin; + DWORD sentLength; + + if (address != NULL) + { + memset (& sin, 0, sizeof (struct sockaddr_in)); + + sin.sin_family = AF_INET; + sin.sin_port = ENET_HOST_TO_NET_16 (address -> port); + sin.sin_addr.s_addr = address -> host; + } + + if (WSASendTo (socket, + (LPWSABUF) buffers, + (DWORD) bufferCount, + & sentLength, + 0, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? sizeof (struct sockaddr_in) : 0, + NULL, + NULL) == SOCKET_ERROR) + { + if (WSAGetLastError () == WSAEWOULDBLOCK) + return 0; + + return -1; + } + + return (int) sentLength; +} + +int +enet_socket_receive (ENetSocket socket, + ENetAddress * address, + ENetBuffer * buffers, + size_t bufferCount) +{ + INT sinLength = sizeof (struct sockaddr_in); + DWORD flags = 0, + recvLength; + struct sockaddr_in sin; + + if (WSARecvFrom (socket, + (LPWSABUF) buffers, + (DWORD) bufferCount, + & recvLength, + & flags, + address != NULL ? (struct sockaddr *) & sin : NULL, + address != NULL ? & sinLength : NULL, + NULL, + NULL) == SOCKET_ERROR) + { + switch (WSAGetLastError ()) + { + case WSAEWOULDBLOCK: + case WSAECONNRESET: + return 0; + } + + return -1; + } + + if (flags & MSG_PARTIAL) + return -1; + + if (address != NULL) + { + address -> host = (enet_uint32) sin.sin_addr.s_addr; + address -> port = ENET_NET_TO_HOST_16 (sin.sin_port); + } + + return (int) recvLength; +} + +int +enet_socketset_select (ENetSocket maxSocket, ENetSocketSet * readSet, ENetSocketSet * writeSet, enet_uint32 timeout) +{ + struct timeval timeVal; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + return select (maxSocket + 1, readSet, writeSet, NULL, & timeVal); +} + +int +enet_socket_wait (ENetSocket socket, enet_uint32 * condition, enet_uint32 timeout) +{ + fd_set readSet, writeSet; + struct timeval timeVal; + int selectCount; + + timeVal.tv_sec = timeout / 1000; + timeVal.tv_usec = (timeout % 1000) * 1000; + + FD_ZERO (& readSet); + FD_ZERO (& writeSet); + + if (* condition & ENET_SOCKET_WAIT_SEND) + FD_SET (socket, & writeSet); + + if (* condition & ENET_SOCKET_WAIT_RECEIVE) + FD_SET (socket, & readSet); + + selectCount = select (socket + 1, & readSet, & writeSet, NULL, & timeVal); + + if (selectCount < 0) + return -1; + + * condition = ENET_SOCKET_WAIT_NONE; + + if (selectCount == 0) + return 0; + + if (FD_ISSET (socket, & writeSet)) + * condition |= ENET_SOCKET_WAIT_SEND; + + if (FD_ISSET (socket, & readSet)) + * condition |= ENET_SOCKET_WAIT_RECEIVE; + + return 0; +} + +#endif + diff --git a/jni/love/src/libraries/enet/lua-enet.h b/jni/love/src/libraries/enet/lua-enet.h new file mode 100644 index 00000000..37bb5dcf --- /dev/null +++ b/jni/love/src/libraries/enet/lua-enet.h @@ -0,0 +1,26 @@ +/** +* Copyright (c) 2006-2012 LOVE Development Team +* +* 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 LOVE_LUAENET_LUAENET_H +#define LOVE_LUAENET_LUAENET_H + +int luaopen_enet(lua_State * L); + +#endif // LOVE_LUAENET_LUAENET_H diff --git a/jni/love/src/libraries/glad/glad.cpp b/jni/love/src/libraries/glad/glad.cpp new file mode 100644 index 00000000..d08563b9 --- /dev/null +++ b/jni/love/src/libraries/glad/glad.cpp @@ -0,0 +1,8153 @@ +#include +#include "glad.hpp" + +#define GLAD_USE_SDL + +namespace glad { + + +#ifdef GLAD_USE_SDL +#include +#if !SDL_VERSION_ATLEAST(2,0,0) +#error SDL 2 is required! +#endif +#else +#include +#endif + +bool gladLoadGL(void) { +#ifdef GLAD_USE_SDL + return gladLoadGLLoader(SDL_GL_GetProcAddress); +#else + // generic gladLoadGL is not implemented, use gladLoadGLLoader or define GLAD_USE_SDL + assert(0); + return false; +#endif +} + +struct { + int major; + int minor; + int gles; +} GLVersion; + + +static bool has_ext(const char *ext) { + if(GLVersion.major < 3) { + const char *extensions; + const char *loc; + const char *terminator; + extensions = (const char *)fp_glGetString(GL_EXTENSIONS); + if(extensions == NULL || ext == NULL) { + return false; + } + + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return false; + } + + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return true; + } + extensions = terminator; + } + } else { + int num; + fp_glGetIntegerv(GL_NUM_EXTENSIONS, &num); + + int index; + for(index = 0; index < num; index++) { + const char *e = (const char*)fp_glGetStringi(GL_EXTENSIONS, index); + if(strcmp(e, ext) == 0) { + return true; + } + } + } + + return false; +} + +pfn_glCopyTexImage1D fp_glCopyTexImage1D; +pfn_glVertexAttribI3ui fp_glVertexAttribI3ui; +pfn_glWindowPos2s fp_glWindowPos2s; +pfn_glWindowPos2i fp_glWindowPos2i; +pfn_glWindowPos2f fp_glWindowPos2f; +pfn_glWindowPos2d fp_glWindowPos2d; +pfn_glVertex2fv fp_glVertex2fv; +pfn_glIndexi fp_glIndexi; +pfn_glFramebufferRenderbuffer fp_glFramebufferRenderbuffer; +pfn_glUniformSubroutinesuiv fp_glUniformSubroutinesuiv; +pfn_glRectdv fp_glRectdv; +pfn_glCompressedTexSubImage3D fp_glCompressedTexSubImage3D; +pfn_glEvalCoord2d fp_glEvalCoord2d; +pfn_glEvalCoord2f fp_glEvalCoord2f; +pfn_glGetDoublei_v fp_glGetDoublei_v; +pfn_glIndexd fp_glIndexd; +pfn_glVertexAttrib1sv fp_glVertexAttrib1sv; +pfn_glIndexf fp_glIndexf; +pfn_glBindSampler fp_glBindSampler; +pfn_glLineWidth fp_glLineWidth; +pfn_glColorP3uiv fp_glColorP3uiv; +pfn_glGetIntegeri_v fp_glGetIntegeri_v; +pfn_glGetMapfv fp_glGetMapfv; +pfn_glIndexs fp_glIndexs; +pfn_glCompileShader fp_glCompileShader; +pfn_glGetTransformFeedbackVarying fp_glGetTransformFeedbackVarying; +pfn_glWindowPos2iv fp_glWindowPos2iv; +pfn_glDrawTransformFeedbackStreamInstanced fp_glDrawTransformFeedbackStreamInstanced; +pfn_glIndexfv fp_glIndexfv; +pfn_glFogiv fp_glFogiv; +pfn_glStencilMaskSeparate fp_glStencilMaskSeparate; +pfn_glRasterPos2fv fp_glRasterPos2fv; +pfn_glLightModeliv fp_glLightModeliv; +pfn_glDepthRangef fp_glDepthRangef; +pfn_glColor4ui fp_glColor4ui; +pfn_glSecondaryColor3fv fp_glSecondaryColor3fv; +pfn_glMultiTexCoordP3ui fp_glMultiTexCoordP3ui; +pfn_glFogfv fp_glFogfv; +pfn_glVertexP4ui fp_glVertexP4ui; +pfn_glDrawElementsInstancedBaseInstance fp_glDrawElementsInstancedBaseInstance; +pfn_glEnablei fp_glEnablei; +pfn_glProgramUniform3dv fp_glProgramUniform3dv; +pfn_glVertex4iv fp_glVertex4iv; +pfn_glEvalCoord1fv fp_glEvalCoord1fv; +pfn_glWindowPos2sv fp_glWindowPos2sv; +pfn_glVertexAttribP4ui fp_glVertexAttribP4ui; +pfn_glCreateShader fp_glCreateShader; +pfn_glIsBuffer fp_glIsBuffer; +pfn_glGetMultisamplefv fp_glGetMultisamplefv; +pfn_glProgramUniformMatrix2dv fp_glProgramUniformMatrix2dv; +pfn_glGenRenderbuffers fp_glGenRenderbuffers; +pfn_glCopyTexSubImage2D fp_glCopyTexSubImage2D; +pfn_glCompressedTexImage2D fp_glCompressedTexImage2D; +pfn_glVertexAttrib1f fp_glVertexAttrib1f; +pfn_glBlendFuncSeparate fp_glBlendFuncSeparate; +pfn_glVertex4fv fp_glVertex4fv; +pfn_glMinSampleShading fp_glMinSampleShading; +pfn_glBindTexture fp_glBindTexture; +pfn_glVertexAttrib1s fp_glVertexAttrib1s; +pfn_glTexCoord2fv fp_glTexCoord2fv; +pfn_glSampleMaski fp_glSampleMaski; +pfn_glVertexP2ui fp_glVertexP2ui; +pfn_glDrawRangeElementsBaseVertex fp_glDrawRangeElementsBaseVertex; +pfn_glTexCoord4fv fp_glTexCoord4fv; +pfn_glUniformMatrix3x2fv fp_glUniformMatrix3x2fv; +pfn_glDebugMessageControl fp_glDebugMessageControl; +pfn_glPointSize fp_glPointSize; +pfn_glVertexAttrib2dv fp_glVertexAttrib2dv; +pfn_glDeleteProgram fp_glDeleteProgram; +pfn_glColor4bv fp_glColor4bv; +pfn_glRasterPos2f fp_glRasterPos2f; +pfn_glRasterPos2d fp_glRasterPos2d; +pfn_glLoadIdentity fp_glLoadIdentity; +pfn_glRasterPos2i fp_glRasterPos2i; +pfn_glMultiDrawArraysIndirect fp_glMultiDrawArraysIndirect; +pfn_glRenderbufferStorage fp_glRenderbufferStorage; +pfn_glUniformMatrix4x3fv fp_glUniformMatrix4x3fv; +pfn_glColor3b fp_glColor3b; +pfn_glClearBufferfv fp_glClearBufferfv; +pfn_glEdgeFlag fp_glEdgeFlag; +pfn_glDeleteSamplers fp_glDeleteSamplers; +pfn_glVertex3d fp_glVertex3d; +pfn_glVertex3f fp_glVertex3f; +pfn_glVertex3i fp_glVertex3i; +pfn_glColor3i fp_glColor3i; +pfn_glUniform3d fp_glUniform3d; +pfn_glUniform3f fp_glUniform3f; +pfn_glVertexAttrib4ubv fp_glVertexAttrib4ubv; +pfn_glColor3s fp_glColor3s; +pfn_glVertex3s fp_glVertex3s; +pfn_glTexCoordP2ui fp_glTexCoordP2ui; +pfn_glColorMaski fp_glColorMaski; +pfn_glClearBufferfi fp_glClearBufferfi; +pfn_glDrawArraysIndirect fp_glDrawArraysIndirect; +pfn_glTexCoord1iv fp_glTexCoord1iv; +pfn_glBlitFramebuffer fp_glBlitFramebuffer; +pfn_glPauseTransformFeedback fp_glPauseTransformFeedback; +pfn_glMultiTexCoordP2ui fp_glMultiTexCoordP2ui; +pfn_glProgramUniformMatrix3x2dv fp_glProgramUniformMatrix3x2dv; +pfn_glProgramUniformMatrix3x2fv fp_glProgramUniformMatrix3x2fv; +pfn_glGetSamplerParameterIiv fp_glGetSamplerParameterIiv; +pfn_glGetFragDataIndex fp_glGetFragDataIndex; +pfn_glVertexAttribL4d fp_glVertexAttribL4d; +pfn_glBindImageTexture fp_glBindImageTexture; +pfn_glVertexAttrib3f fp_glVertexAttrib3f; +pfn_glProgramUniformMatrix4fv fp_glProgramUniformMatrix4fv; +pfn_glVertex2iv fp_glVertex2iv; +pfn_glColor3sv fp_glColor3sv; +pfn_glGetVertexAttribdv fp_glGetVertexAttribdv; +pfn_glActiveShaderProgram fp_glActiveShaderProgram; +pfn_glUniformMatrix3x4fv fp_glUniformMatrix3x4fv; +pfn_glUniformMatrix3dv fp_glUniformMatrix3dv; +pfn_glNormalPointer fp_glNormalPointer; +pfn_glTexCoordP3uiv fp_glTexCoordP3uiv; +pfn_glVertex4sv fp_glVertex4sv; +pfn_glInvalidateBufferSubData fp_glInvalidateBufferSubData; +pfn_glPassThrough fp_glPassThrough; +pfn_glMultiTexCoordP4ui fp_glMultiTexCoordP4ui; +pfn_glFogi fp_glFogi; +pfn_glBegin fp_glBegin; +pfn_glEvalCoord2dv fp_glEvalCoord2dv; +pfn_glColor3ubv fp_glColor3ubv; +pfn_glVertexPointer fp_glVertexPointer; +pfn_glSecondaryColor3uiv fp_glSecondaryColor3uiv; +pfn_glDeleteFramebuffers fp_glDeleteFramebuffers; +pfn_glDrawArrays fp_glDrawArrays; +pfn_glUniform1ui fp_glUniform1ui; +pfn_glMultiTexCoord1d fp_glMultiTexCoord1d; +pfn_glMultiTexCoord1f fp_glMultiTexCoord1f; +pfn_glProgramParameteri fp_glProgramParameteri; +pfn_glLightfv fp_glLightfv; +pfn_glTexCoordP3ui fp_glTexCoordP3ui; +pfn_glVertexAttrib3d fp_glVertexAttrib3d; +pfn_glClear fp_glClear; +pfn_glMultiTexCoord1i fp_glMultiTexCoord1i; +pfn_glGetActiveUniformName fp_glGetActiveUniformName; +pfn_glMemoryBarrier fp_glMemoryBarrier; +pfn_glMultiTexCoord1s fp_glMultiTexCoord1s; +pfn_glIsEnabled fp_glIsEnabled; +pfn_glStencilOp fp_glStencilOp; +pfn_glGetQueryObjectuiv fp_glGetQueryObjectuiv; +pfn_glFramebufferTexture2D fp_glFramebufferTexture2D; +pfn_glGetFramebufferAttachmentParameteriv fp_glGetFramebufferAttachmentParameteriv; +pfn_glTranslatef fp_glTranslatef; +pfn_glVertexAttrib4Nub fp_glVertexAttrib4Nub; +pfn_glTranslated fp_glTranslated; +pfn_glTexCoord3sv fp_glTexCoord3sv; +pfn_glGetFragDataLocation fp_glGetFragDataLocation; +pfn_glTexImage1D fp_glTexImage1D; +pfn_glVertexP3uiv fp_glVertexP3uiv; +pfn_glTexParameteriv fp_glTexParameteriv; +pfn_glSecondaryColor3bv fp_glSecondaryColor3bv; +pfn_glGetMaterialfv fp_glGetMaterialfv; +pfn_glGetTexImage fp_glGetTexImage; +pfn_glFogCoordfv fp_glFogCoordfv; +pfn_glPixelMapuiv fp_glPixelMapuiv; +pfn_glGetShaderInfoLog fp_glGetShaderInfoLog; +pfn_glGetQueryObjecti64v fp_glGetQueryObjecti64v; +pfn_glGenFramebuffers fp_glGenFramebuffers; +pfn_glIndexsv fp_glIndexsv; +pfn_glClearTexSubImage fp_glClearTexSubImage; +pfn_glProgramUniformMatrix3x4dv fp_glProgramUniformMatrix3x4dv; +pfn_glGetAttachedShaders fp_glGetAttachedShaders; +pfn_glIsRenderbuffer fp_glIsRenderbuffer; +pfn_glVertex3iv fp_glVertex3iv; +pfn_glBitmap fp_glBitmap; +pfn_glGetDebugMessageLog fp_glGetDebugMessageLog; +pfn_glProgramUniform1uiv fp_glProgramUniform1uiv; +pfn_glMateriali fp_glMateriali; +pfn_glIsVertexArray fp_glIsVertexArray; +pfn_glDisableVertexAttribArray fp_glDisableVertexAttribArray; +pfn_glProgramUniform2iv fp_glProgramUniform2iv; +pfn_glGetQueryiv fp_glGetQueryiv; +pfn_glTexCoord4f fp_glTexCoord4f; +pfn_glTexCoord4d fp_glTexCoord4d; +pfn_glGetSamplerParameterfv fp_glGetSamplerParameterfv; +pfn_glTexCoord4i fp_glTexCoord4i; +pfn_glShaderStorageBlockBinding fp_glShaderStorageBlockBinding; +pfn_glMaterialf fp_glMaterialf; +pfn_glTexCoord4s fp_glTexCoord4s; +pfn_glProgramUniformMatrix4x2dv fp_glProgramUniformMatrix4x2dv; +pfn_glGetUniformIndices fp_glGetUniformIndices; +pfn_glIsShader fp_glIsShader; +pfn_glMultiTexCoord2s fp_glMultiTexCoord2s; +pfn_glVertexAttribI4ubv fp_glVertexAttribI4ubv; +pfn_glVertex3dv fp_glVertex3dv; +pfn_glGetInteger64v fp_glGetInteger64v; +pfn_glPointParameteriv fp_glPointParameteriv; +pfn_glEnable fp_glEnable; +pfn_glGetActiveUniformsiv fp_glGetActiveUniformsiv; +pfn_glColor4fv fp_glColor4fv; +pfn_glTexCoord1fv fp_glTexCoord1fv; +pfn_glPopDebugGroup fp_glPopDebugGroup; +pfn_glBlendEquationi fp_glBlendEquationi; +pfn_glTexCoord2sv fp_glTexCoord2sv; +pfn_glVertexAttrib4dv fp_glVertexAttrib4dv; +pfn_glMultiTexCoord1dv fp_glMultiTexCoord1dv; +pfn_glGetProgramInterfaceiv fp_glGetProgramInterfaceiv; +pfn_glMultiTexCoord2i fp_glMultiTexCoord2i; +pfn_glTexCoord3fv fp_glTexCoord3fv; +pfn_glSecondaryColor3usv fp_glSecondaryColor3usv; +pfn_glTexGenf fp_glTexGenf; +pfn_glMultiTexCoordP3uiv fp_glMultiTexCoordP3uiv; +pfn_glVertexAttribP3ui fp_glVertexAttribP3ui; +pfn_glVertexAttribL1dv fp_glVertexAttribL1dv; +pfn_glMultiTexCoordP1ui fp_glMultiTexCoordP1ui; +pfn_glProgramUniform3ui fp_glProgramUniform3ui; +pfn_glGetPointerv fp_glGetPointerv; +pfn_glVertexBindingDivisor fp_glVertexBindingDivisor; +pfn_glPolygonOffset fp_glPolygonOffset; +pfn_glGetUniformuiv fp_glGetUniformuiv; +pfn_glNormal3fv fp_glNormal3fv; +pfn_glSecondaryColor3s fp_glSecondaryColor3s; +pfn_glDepthRange fp_glDepthRange; +pfn_glFrustum fp_glFrustum; +pfn_glMultiTexCoord4sv fp_glMultiTexCoord4sv; +pfn_glDrawBuffer fp_glDrawBuffer; +pfn_glPushMatrix fp_glPushMatrix; +pfn_glRasterPos3fv fp_glRasterPos3fv; +pfn_glOrtho fp_glOrtho; +pfn_glDrawElementsInstanced fp_glDrawElementsInstanced; +pfn_glWindowPos3sv fp_glWindowPos3sv; +pfn_glVertexAttribL4dv fp_glVertexAttribL4dv; +pfn_glProgramUniform1i fp_glProgramUniform1i; +pfn_glUniform2dv fp_glUniform2dv; +pfn_glProgramUniform1d fp_glProgramUniform1d; +pfn_glProgramUniform1f fp_glProgramUniform1f; +pfn_glClearIndex fp_glClearIndex; +pfn_glMap1d fp_glMap1d; +pfn_glMap1f fp_glMap1f; +pfn_glFlush fp_glFlush; +pfn_glGetRenderbufferParameteriv fp_glGetRenderbufferParameteriv; +pfn_glBeginQueryIndexed fp_glBeginQueryIndexed; +pfn_glProgramUniform3iv fp_glProgramUniform3iv; +pfn_glIndexiv fp_glIndexiv; +pfn_glRasterPos3sv fp_glRasterPos3sv; +pfn_glGetVertexAttribPointerv fp_glGetVertexAttribPointerv; +pfn_glPixelZoom fp_glPixelZoom; +pfn_glFenceSync fp_glFenceSync; +pfn_glDeleteVertexArrays fp_glDeleteVertexArrays; +pfn_glColorP3ui fp_glColorP3ui; +pfn_glDrawElementsInstancedBaseVertexBaseInstance fp_glDrawElementsInstancedBaseVertexBaseInstance; +pfn_glVertexAttrib3sv fp_glVertexAttrib3sv; +pfn_glBeginConditionalRender fp_glBeginConditionalRender; +pfn_glPushDebugGroup fp_glPushDebugGroup; +pfn_glGetShaderPrecisionFormat fp_glGetShaderPrecisionFormat; +pfn_glValidateProgramPipeline fp_glValidateProgramPipeline; +pfn_glDrawElementsBaseVertex fp_glDrawElementsBaseVertex; +pfn_glGetTexLevelParameteriv fp_glGetTexLevelParameteriv; +pfn_glLighti fp_glLighti; +pfn_glMultiTexCoordP4uiv fp_glMultiTexCoordP4uiv; +pfn_glLightf fp_glLightf; +pfn_glBindVertexBuffers fp_glBindVertexBuffers; +pfn_glGetAttribLocation fp_glGetAttribLocation; +pfn_glTexStorage3DMultisample fp_glTexStorage3DMultisample; +pfn_glStencilFuncSeparate fp_glStencilFuncSeparate; +pfn_glGenSamplers fp_glGenSamplers; +pfn_glClampColor fp_glClampColor; +pfn_glUniform4iv fp_glUniform4iv; +pfn_glClearStencil fp_glClearStencil; +pfn_glTexCoordP1uiv fp_glTexCoordP1uiv; +pfn_glDrawTransformFeedbackInstanced fp_glDrawTransformFeedbackInstanced; +pfn_glMultiTexCoord3fv fp_glMultiTexCoord3fv; +pfn_glGetPixelMapuiv fp_glGetPixelMapuiv; +pfn_glGenTextures fp_glGenTextures; +pfn_glTexCoord4iv fp_glTexCoord4iv; +pfn_glDrawTransformFeedback fp_glDrawTransformFeedback; +pfn_glUniform1dv fp_glUniform1dv; +pfn_glGetTexParameterIuiv fp_glGetTexParameterIuiv; +pfn_glIndexPointer fp_glIndexPointer; +pfn_glVertexAttrib4Nbv fp_glVertexAttrib4Nbv; +pfn_glIsSync fp_glIsSync; +pfn_glVertex2f fp_glVertex2f; +pfn_glVertex2d fp_glVertex2d; +pfn_glDeleteRenderbuffers fp_glDeleteRenderbuffers; +pfn_glUniform2i fp_glUniform2i; +pfn_glMapGrid2d fp_glMapGrid2d; +pfn_glMapGrid2f fp_glMapGrid2f; +pfn_glTexCoordP4ui fp_glTexCoordP4ui; +pfn_glVertex2i fp_glVertex2i; +pfn_glVertexAttribPointer fp_glVertexAttribPointer; +pfn_glProgramUniform1ui fp_glProgramUniform1ui; +pfn_glFramebufferTextureLayer fp_glFramebufferTextureLayer; +pfn_glVertex2s fp_glVertex2s; +pfn_glGetObjectPtrLabel fp_glGetObjectPtrLabel; +pfn_glNormal3bv fp_glNormal3bv; +pfn_glVertexAttrib4Nuiv fp_glVertexAttrib4Nuiv; +pfn_glFlushMappedBufferRange fp_glFlushMappedBufferRange; +pfn_glProgramUniform2fv fp_glProgramUniform2fv; +pfn_glUniformMatrix2x3dv fp_glUniformMatrix2x3dv; +pfn_glProgramUniformMatrix4dv fp_glProgramUniformMatrix4dv; +pfn_glSecondaryColor3sv fp_glSecondaryColor3sv; +pfn_glProgramUniformMatrix2x4dv fp_glProgramUniformMatrix2x4dv; +pfn_glDispatchCompute fp_glDispatchCompute; +pfn_glVertex3sv fp_glVertex3sv; +pfn_glGenQueries fp_glGenQueries; +pfn_glGetPixelMapfv fp_glGetPixelMapfv; +pfn_glTexEnvf fp_glTexEnvf; +pfn_glVertexAttribP1ui fp_glVertexAttribP1ui; +pfn_glTexSubImage3D fp_glTexSubImage3D; +pfn_glGetInteger64i_v fp_glGetInteger64i_v; +pfn_glFogCoordd fp_glFogCoordd; +pfn_glFogCoordf fp_glFogCoordf; +pfn_glCopyTexImage2D fp_glCopyTexImage2D; +pfn_glTexEnvi fp_glTexEnvi; +pfn_glMultiTexCoord1iv fp_glMultiTexCoord1iv; +pfn_glIsEnabledi fp_glIsEnabledi; +pfn_glBindBuffersRange fp_glBindBuffersRange; +pfn_glSecondaryColorP3ui fp_glSecondaryColorP3ui; +pfn_glVertexAttribI2i fp_glVertexAttribI2i; +pfn_glBindFragDataLocationIndexed fp_glBindFragDataLocationIndexed; +pfn_glCopyImageSubData fp_glCopyImageSubData; +pfn_glMultiTexCoord2dv fp_glMultiTexCoord2dv; +pfn_glUniform2iv fp_glUniform2iv; +pfn_glVertexAttrib1fv fp_glVertexAttrib1fv; +pfn_glGetInternalformativ fp_glGetInternalformativ; +pfn_glUniform4uiv fp_glUniform4uiv; +pfn_glMatrixMode fp_glMatrixMode; +pfn_glFeedbackBuffer fp_glFeedbackBuffer; +pfn_glProgramUniform2dv fp_glProgramUniform2dv; +pfn_glEndQueryIndexed fp_glEndQueryIndexed; +pfn_glGetMapiv fp_glGetMapiv; +pfn_glFramebufferTexture1D fp_glFramebufferTexture1D; +pfn_glUniform4d fp_glUniform4d; +pfn_glGetShaderiv fp_glGetShaderiv; +pfn_glMultiTexCoord2d fp_glMultiTexCoord2d; +pfn_glMultiTexCoord2f fp_glMultiTexCoord2f; +pfn_glProgramUniformMatrix3fv fp_glProgramUniformMatrix3fv; +pfn_glObjectPtrLabel fp_glObjectPtrLabel; +pfn_glInvalidateFramebuffer fp_glInvalidateFramebuffer; +pfn_glBindTextures fp_glBindTextures; +pfn_glBindFragDataLocation fp_glBindFragDataLocation; +pfn_glScissorArrayv fp_glScissorArrayv; +pfn_glPrioritizeTextures fp_glPrioritizeTextures; +pfn_glCallList fp_glCallList; +pfn_glPatchParameterfv fp_glPatchParameterfv; +pfn_glSecondaryColor3ubv fp_glSecondaryColor3ubv; +pfn_glGetDoublev fp_glGetDoublev; +pfn_glMultiTexCoord3iv fp_glMultiTexCoord3iv; +pfn_glVertexAttrib1d fp_glVertexAttrib1d; +pfn_glUniform4dv fp_glUniform4dv; +pfn_glLightModelf fp_glLightModelf; +pfn_glGetUniformiv fp_glGetUniformiv; +pfn_glInvalidateBufferData fp_glInvalidateBufferData; +pfn_glVertex2sv fp_glVertex2sv; +pfn_glLightModeli fp_glLightModeli; +pfn_glWindowPos3iv fp_glWindowPos3iv; +pfn_glMultiTexCoordP1uiv fp_glMultiTexCoordP1uiv; +pfn_glUniform3fv fp_glUniform3fv; +pfn_glPixelStorei fp_glPixelStorei; +pfn_glGetProgramPipelineInfoLog fp_glGetProgramPipelineInfoLog; +pfn_glCallLists fp_glCallLists; +pfn_glProgramUniformMatrix3x4fv fp_glProgramUniformMatrix3x4fv; +pfn_glInvalidateSubFramebuffer fp_glInvalidateSubFramebuffer; +pfn_glMapBuffer fp_glMapBuffer; +pfn_glSecondaryColor3d fp_glSecondaryColor3d; +pfn_glTexCoord3i fp_glTexCoord3i; +pfn_glMultiTexCoord4fv fp_glMultiTexCoord4fv; +pfn_glRasterPos3i fp_glRasterPos3i; +pfn_glSecondaryColor3b fp_glSecondaryColor3b; +pfn_glRasterPos3d fp_glRasterPos3d; +pfn_glRasterPos3f fp_glRasterPos3f; +pfn_glCompressedTexImage3D fp_glCompressedTexImage3D; +pfn_glTexCoord3f fp_glTexCoord3f; +pfn_glDeleteSync fp_glDeleteSync; +pfn_glTexCoord3d fp_glTexCoord3d; +pfn_glUniformMatrix4dv fp_glUniformMatrix4dv; +pfn_glTexImage2DMultisample fp_glTexImage2DMultisample; +pfn_glGetVertexAttribiv fp_glGetVertexAttribiv; +pfn_glUniformMatrix4x2dv fp_glUniformMatrix4x2dv; +pfn_glMultiDrawElements fp_glMultiDrawElements; +pfn_glVertexAttrib3fv fp_glVertexAttrib3fv; +pfn_glTexCoord3s fp_glTexCoord3s; +pfn_glUniform3iv fp_glUniform3iv; +pfn_glRasterPos3s fp_glRasterPos3s; +pfn_glPolygonMode fp_glPolygonMode; +pfn_glDrawBuffers fp_glDrawBuffers; +pfn_glGetActiveUniformBlockiv fp_glGetActiveUniformBlockiv; +pfn_glAreTexturesResident fp_glAreTexturesResident; +pfn_glProgramUniform2d fp_glProgramUniform2d; +pfn_glProgramUniformMatrix4x3dv fp_glProgramUniformMatrix4x3dv; +pfn_glIsList fp_glIsList; +pfn_glProgramUniform4iv fp_glProgramUniform4iv; +pfn_glRasterPos2sv fp_glRasterPos2sv; +pfn_glRasterPos4sv fp_glRasterPos4sv; +pfn_glColor4s fp_glColor4s; +pfn_glGetProgramBinary fp_glGetProgramBinary; +pfn_glUseProgram fp_glUseProgram; +pfn_glLineStipple fp_glLineStipple; +pfn_glMultiTexCoord1sv fp_glMultiTexCoord1sv; +pfn_glGetProgramInfoLog fp_glGetProgramInfoLog; +pfn_glClearTexImage fp_glClearTexImage; +pfn_glGetBufferParameteriv fp_glGetBufferParameteriv; +pfn_glMultiTexCoord2iv fp_glMultiTexCoord2iv; +pfn_glUniformMatrix2x4fv fp_glUniformMatrix2x4fv; +pfn_glBindVertexArray fp_glBindVertexArray; +pfn_glColor4b fp_glColor4b; +pfn_glSecondaryColor3f fp_glSecondaryColor3f; +pfn_glColor4f fp_glColor4f; +pfn_glColor4d fp_glColor4d; +pfn_glColor4i fp_glColor4i; +pfn_glSamplerParameterIiv fp_glSamplerParameterIiv; +pfn_glMultiDrawElementsBaseVertex fp_glMultiDrawElementsBaseVertex; +pfn_glVertexAttribLFormat fp_glVertexAttribLFormat; +pfn_glRasterPos3iv fp_glRasterPos3iv; +pfn_glVertex2dv fp_glVertex2dv; +pfn_glTexCoord4sv fp_glTexCoord4sv; +pfn_glUniform2uiv fp_glUniform2uiv; +pfn_glCompressedTexSubImage1D fp_glCompressedTexSubImage1D; +pfn_glFinish fp_glFinish; +pfn_glDepthRangeIndexed fp_glDepthRangeIndexed; +pfn_glGetBooleanv fp_glGetBooleanv; +pfn_glDeleteShader fp_glDeleteShader; +pfn_glDrawElements fp_glDrawElements; +pfn_glGetInternalformati64v fp_glGetInternalformati64v; +pfn_glRasterPos2s fp_glRasterPos2s; +pfn_glGetMapdv fp_glGetMapdv; +pfn_glVertexAttrib4Nsv fp_glVertexAttrib4Nsv; +pfn_glMaterialfv fp_glMaterialfv; +pfn_glViewport fp_glViewport; +pfn_glUniform1uiv fp_glUniform1uiv; +pfn_glTransformFeedbackVaryings fp_glTransformFeedbackVaryings; +pfn_glIndexdv fp_glIndexdv; +pfn_glCopyTexSubImage3D fp_glCopyTexSubImage3D; +pfn_glTexCoord3iv fp_glTexCoord3iv; +pfn_glDebugMessageCallback fp_glDebugMessageCallback; +pfn_glVertexAttribI3i fp_glVertexAttribI3i; +pfn_glInvalidateTexImage fp_glInvalidateTexImage; +pfn_glVertexAttribFormat fp_glVertexAttribFormat; +pfn_glClearDepth fp_glClearDepth; +pfn_glVertexAttribI4usv fp_glVertexAttribI4usv; +pfn_glTexParameterf fp_glTexParameterf; +pfn_glVertexAttribBinding fp_glVertexAttribBinding; +pfn_glTexParameteri fp_glTexParameteri; +pfn_glGetActiveSubroutineUniformiv fp_glGetActiveSubroutineUniformiv; +pfn_glGetShaderSource fp_glGetShaderSource; +pfn_glTexBuffer fp_glTexBuffer; +pfn_glPopName fp_glPopName; +pfn_glValidateProgram fp_glValidateProgram; +pfn_glPixelStoref fp_glPixelStoref; +pfn_glUniform3uiv fp_glUniform3uiv; +pfn_glViewportIndexedf fp_glViewportIndexedf; +pfn_glRasterPos4fv fp_glRasterPos4fv; +pfn_glEvalCoord1dv fp_glEvalCoord1dv; +pfn_glMultiTexCoordP2uiv fp_glMultiTexCoordP2uiv; +pfn_glGenProgramPipelines fp_glGenProgramPipelines; +pfn_glRecti fp_glRecti; +pfn_glColor4ub fp_glColor4ub; +pfn_glMultTransposeMatrixf fp_glMultTransposeMatrixf; +pfn_glRectf fp_glRectf; +pfn_glRectd fp_glRectd; +pfn_glNormal3sv fp_glNormal3sv; +pfn_glNewList fp_glNewList; +pfn_glProgramUniformMatrix2x3dv fp_glProgramUniformMatrix2x3dv; +pfn_glColor4us fp_glColor4us; +pfn_glVertexAttribP1uiv fp_glVertexAttribP1uiv; +pfn_glLinkProgram fp_glLinkProgram; +pfn_glHint fp_glHint; +pfn_glRects fp_glRects; +pfn_glTexCoord2dv fp_glTexCoord2dv; +pfn_glRasterPos4iv fp_glRasterPos4iv; +pfn_glGetObjectLabel fp_glGetObjectLabel; +pfn_glProgramUniform2f fp_glProgramUniform2f; +pfn_glGetString fp_glGetString; +pfn_glVertexAttribP2uiv fp_glVertexAttribP2uiv; +pfn_glEdgeFlagv fp_glEdgeFlagv; +pfn_glDetachShader fp_glDetachShader; +pfn_glProgramUniform3i fp_glProgramUniform3i; +pfn_glScalef fp_glScalef; +pfn_glEndQuery fp_glEndQuery; +pfn_glScaled fp_glScaled; +pfn_glEdgeFlagPointer fp_glEdgeFlagPointer; +pfn_glFramebufferParameteri fp_glFramebufferParameteri; +pfn_glGetProgramResourceName fp_glGetProgramResourceName; +pfn_glUniformMatrix4x3dv fp_glUniformMatrix4x3dv; +pfn_glDepthRangeArrayv fp_glDepthRangeArrayv; +pfn_glCopyPixels fp_glCopyPixels; +pfn_glVertexAttribI2ui fp_glVertexAttribI2ui; +pfn_glGetProgramResourceLocation fp_glGetProgramResourceLocation; +pfn_glPopAttrib fp_glPopAttrib; +pfn_glDeleteTextures fp_glDeleteTextures; +pfn_glGetActiveAtomicCounterBufferiv fp_glGetActiveAtomicCounterBufferiv; +pfn_glStencilOpSeparate fp_glStencilOpSeparate; +pfn_glDeleteQueries fp_glDeleteQueries; +pfn_glNormalP3uiv fp_glNormalP3uiv; +pfn_glVertexAttrib4f fp_glVertexAttrib4f; +pfn_glVertexAttrib4d fp_glVertexAttrib4d; +pfn_glViewportIndexedfv fp_glViewportIndexedfv; +pfn_glInitNames fp_glInitNames; +pfn_glGetBufferParameteri64v fp_glGetBufferParameteri64v; +pfn_glColor3dv fp_glColor3dv; +pfn_glVertexAttribI1i fp_glVertexAttribI1i; +pfn_glGetTexParameteriv fp_glGetTexParameteriv; +pfn_glWaitSync fp_glWaitSync; +pfn_glProgramUniform1dv fp_glProgramUniform1dv; +pfn_glVertexAttrib4s fp_glVertexAttrib4s; +pfn_glColorMaterial fp_glColorMaterial; +pfn_glSampleCoverage fp_glSampleCoverage; +pfn_glSamplerParameteri fp_glSamplerParameteri; +pfn_glClearBufferSubData fp_glClearBufferSubData; +pfn_glSamplerParameterf fp_glSamplerParameterf; +pfn_glTexStorage1D fp_glTexStorage1D; +pfn_glUniform1f fp_glUniform1f; +pfn_glGetVertexAttribfv fp_glGetVertexAttribfv; +pfn_glUniform1d fp_glUniform1d; +pfn_glRenderMode fp_glRenderMode; +pfn_glGetCompressedTexImage fp_glGetCompressedTexImage; +pfn_glWindowPos2dv fp_glWindowPos2dv; +pfn_glUniform1i fp_glUniform1i; +pfn_glGetActiveAttrib fp_glGetActiveAttrib; +pfn_glUniform3i fp_glUniform3i; +pfn_glPixelTransferi fp_glPixelTransferi; +pfn_glTexSubImage2D fp_glTexSubImage2D; +pfn_glDisable fp_glDisable; +pfn_glLogicOp fp_glLogicOp; +pfn_glEvalPoint2 fp_glEvalPoint2; +pfn_glPixelTransferf fp_glPixelTransferf; +pfn_glSecondaryColor3i fp_glSecondaryColor3i; +pfn_glProgramUniform4uiv fp_glProgramUniform4uiv; +pfn_glUniform4ui fp_glUniform4ui; +pfn_glColor3f fp_glColor3f; +pfn_glBindFramebuffer fp_glBindFramebuffer; +pfn_glGetTexEnvfv fp_glGetTexEnvfv; +pfn_glRectfv fp_glRectfv; +pfn_glCullFace fp_glCullFace; +pfn_glGetLightfv fp_glGetLightfv; +pfn_glColor3d fp_glColor3d; +pfn_glProgramUniform4i fp_glProgramUniform4i; +pfn_glTexGend fp_glTexGend; +pfn_glProgramUniform4f fp_glProgramUniform4f; +pfn_glTexGeni fp_glTexGeni; +pfn_glProgramUniform4d fp_glProgramUniform4d; +pfn_glMultiTexCoord3s fp_glMultiTexCoord3s; +pfn_glGetStringi fp_glGetStringi; +pfn_glMultiTexCoord3i fp_glMultiTexCoord3i; +pfn_glMultiTexCoord3f fp_glMultiTexCoord3f; +pfn_glDrawTransformFeedbackStream fp_glDrawTransformFeedbackStream; +pfn_glMultiTexCoord3d fp_glMultiTexCoord3d; +pfn_glAttachShader fp_glAttachShader; +pfn_glFogCoorddv fp_glFogCoorddv; +pfn_glUniformMatrix2x3fv fp_glUniformMatrix2x3fv; +pfn_glGetTexGenfv fp_glGetTexGenfv; +pfn_glQueryCounter fp_glQueryCounter; +pfn_glFogCoordPointer fp_glFogCoordPointer; +pfn_glProgramUniformMatrix3dv fp_glProgramUniformMatrix3dv; +pfn_glProvokingVertex fp_glProvokingVertex; +pfn_glShaderBinary fp_glShaderBinary; +pfn_glFramebufferTexture3D fp_glFramebufferTexture3D; +pfn_glTexGeniv fp_glTexGeniv; +pfn_glRasterPos2dv fp_glRasterPos2dv; +pfn_glSecondaryColor3dv fp_glSecondaryColor3dv; +pfn_glClientActiveTexture fp_glClientActiveTexture; +pfn_glVertexAttribI4sv fp_glVertexAttribI4sv; +pfn_glSecondaryColor3us fp_glSecondaryColor3us; +pfn_glNormalP3ui fp_glNormalP3ui; +pfn_glTexEnvfv fp_glTexEnvfv; +pfn_glReadBuffer fp_glReadBuffer; +pfn_glViewportArrayv fp_glViewportArrayv; +pfn_glTexParameterIuiv fp_glTexParameterIuiv; +pfn_glDrawArraysInstanced fp_glDrawArraysInstanced; +pfn_glGenerateMipmap fp_glGenerateMipmap; +pfn_glProgramUniformMatrix2fv fp_glProgramUniformMatrix2fv; +pfn_glWindowPos3fv fp_glWindowPos3fv; +pfn_glUniformMatrix3x4dv fp_glUniformMatrix3x4dv; +pfn_glLightModelfv fp_glLightModelfv; +pfn_glSamplerParameteriv fp_glSamplerParameteriv; +pfn_glDeleteLists fp_glDeleteLists; +pfn_glGetClipPlane fp_glGetClipPlane; +pfn_glVertex4dv fp_glVertex4dv; +pfn_glTexCoord2d fp_glTexCoord2d; +pfn_glPopMatrix fp_glPopMatrix; +pfn_glTexCoord2f fp_glTexCoord2f; +pfn_glColor4iv fp_glColor4iv; +pfn_glIndexubv fp_glIndexubv; +pfn_glUnmapBuffer fp_glUnmapBuffer; +pfn_glTexCoord2i fp_glTexCoord2i; +pfn_glRasterPos4d fp_glRasterPos4d; +pfn_glRasterPos4f fp_glRasterPos4f; +pfn_glProgramUniform1iv fp_glProgramUniform1iv; +pfn_glVertexAttrib3s fp_glVertexAttrib3s; +pfn_glTexCoord2s fp_glTexCoord2s; +pfn_glBindRenderbuffer fp_glBindRenderbuffer; +pfn_glVertex3fv fp_glVertex3fv; +pfn_glTexCoord4dv fp_glTexCoord4dv; +pfn_glMaterialiv fp_glMaterialiv; +pfn_glVertexAttribP4uiv fp_glVertexAttribP4uiv; +pfn_glGetProgramStageiv fp_glGetProgramStageiv; +pfn_glIsProgram fp_glIsProgram; +pfn_glVertexAttrib4bv fp_glVertexAttrib4bv; +pfn_glVertex4s fp_glVertex4s; +pfn_glUniformMatrix3x2dv fp_glUniformMatrix3x2dv; +pfn_glVertexAttrib4fv fp_glVertexAttrib4fv; +pfn_glNormal3dv fp_glNormal3dv; +pfn_glIsTransformFeedback fp_glIsTransformFeedback; +pfn_glUniform4i fp_glUniform4i; +pfn_glActiveTexture fp_glActiveTexture; +pfn_glEnableVertexAttribArray fp_glEnableVertexAttribArray; +pfn_glRotated fp_glRotated; +pfn_glIsProgramPipeline fp_glIsProgramPipeline; +pfn_glRotatef fp_glRotatef; +pfn_glVertex4i fp_glVertex4i; +pfn_glReadPixels fp_glReadPixels; +pfn_glVertexAttribI3iv fp_glVertexAttribI3iv; +pfn_glLoadName fp_glLoadName; +pfn_glUniform4f fp_glUniform4f; +pfn_glRenderbufferStorageMultisample fp_glRenderbufferStorageMultisample; +pfn_glGenVertexArrays fp_glGenVertexArrays; +pfn_glShadeModel fp_glShadeModel; +pfn_glMapGrid1d fp_glMapGrid1d; +pfn_glGetUniformfv fp_glGetUniformfv; +pfn_glMapGrid1f fp_glMapGrid1f; +pfn_glSamplerParameterfv fp_glSamplerParameterfv; +pfn_glVertexAttribLPointer fp_glVertexAttribLPointer; +pfn_glDisableClientState fp_glDisableClientState; +pfn_glMultiTexCoord3sv fp_glMultiTexCoord3sv; +pfn_glDrawElementsInstancedBaseVertex fp_glDrawElementsInstancedBaseVertex; +pfn_glVertexAttribL2dv fp_glVertexAttribL2dv; +pfn_glMultiDrawElementsIndirect fp_glMultiDrawElementsIndirect; +pfn_glSecondaryColorPointer fp_glSecondaryColorPointer; +pfn_glAlphaFunc fp_glAlphaFunc; +pfn_glUniform1iv fp_glUniform1iv; +pfn_glCreateShaderProgramv fp_glCreateShaderProgramv; +pfn_glGetActiveSubroutineName fp_glGetActiveSubroutineName; +pfn_glMultiTexCoord4iv fp_glMultiTexCoord4iv; +pfn_glVertexAttribL2d fp_glVertexAttribL2d; +pfn_glGetQueryObjectiv fp_glGetQueryObjectiv; +pfn_glStencilFunc fp_glStencilFunc; +pfn_glMultiTexCoord1fv fp_glMultiTexCoord1fv; +pfn_glUniformBlockBinding fp_glUniformBlockBinding; +pfn_glColor4uiv fp_glColor4uiv; +pfn_glRectiv fp_glRectiv; +pfn_glColorP4ui fp_glColorP4ui; +pfn_glUseProgramStages fp_glUseProgramStages; +pfn_glRasterPos3dv fp_glRasterPos3dv; +pfn_glEvalMesh2 fp_glEvalMesh2; +pfn_glEvalMesh1 fp_glEvalMesh1; +pfn_glTexCoordPointer fp_glTexCoordPointer; +pfn_glProgramUniform3f fp_glProgramUniform3f; +pfn_glProgramUniform3d fp_glProgramUniform3d; +pfn_glVertexAttrib4Nubv fp_glVertexAttrib4Nubv; +pfn_glVertexAttribI4iv fp_glVertexAttribI4iv; +pfn_glGetProgramPipelineiv fp_glGetProgramPipelineiv; +pfn_glTexStorage3D fp_glTexStorage3D; +pfn_glEvalCoord2fv fp_glEvalCoord2fv; +pfn_glGetQueryIndexediv fp_glGetQueryIndexediv; +pfn_glColor4ubv fp_glColor4ubv; +pfn_glLoadTransposeMatrixd fp_glLoadTransposeMatrixd; +pfn_glLoadTransposeMatrixf fp_glLoadTransposeMatrixf; +pfn_glObjectLabel fp_glObjectLabel; +pfn_glVertexAttribI4i fp_glVertexAttribI4i; +pfn_glRasterPos2iv fp_glRasterPos2iv; +pfn_glGetBufferSubData fp_glGetBufferSubData; +pfn_glGetVertexAttribLdv fp_glGetVertexAttribLdv; +pfn_glTexEnviv fp_glTexEnviv; +pfn_glBlendEquationSeparate fp_glBlendEquationSeparate; +pfn_glVertexAttribI1ui fp_glVertexAttribI1ui; +pfn_glGenBuffers fp_glGenBuffers; +pfn_glSelectBuffer fp_glSelectBuffer; +pfn_glGetSubroutineIndex fp_glGetSubroutineIndex; +pfn_glVertexAttrib2sv fp_glVertexAttrib2sv; +pfn_glScissorIndexedv fp_glScissorIndexedv; +pfn_glPushAttrib fp_glPushAttrib; +pfn_glVertexAttribIPointer fp_glVertexAttribIPointer; +pfn_glBlendFunc fp_glBlendFunc; +pfn_glCreateProgram fp_glCreateProgram; +pfn_glTexImage3D fp_glTexImage3D; +pfn_glIsFramebuffer fp_glIsFramebuffer; +pfn_glLightiv fp_glLightiv; +pfn_glPrimitiveRestartIndex fp_glPrimitiveRestartIndex; +pfn_glInvalidateTexSubImage fp_glInvalidateTexSubImage; +pfn_glTexGenfv fp_glTexGenfv; +pfn_glBindImageTextures fp_glBindImageTextures; +pfn_glEnd fp_glEnd; +pfn_glDeleteBuffers fp_glDeleteBuffers; +pfn_glBindProgramPipeline fp_glBindProgramPipeline; +pfn_glScissor fp_glScissor; +pfn_glTexCoordP4uiv fp_glTexCoordP4uiv; +pfn_glClipPlane fp_glClipPlane; +pfn_glPushName fp_glPushName; +pfn_glTexGendv fp_glTexGendv; +pfn_glIndexub fp_glIndexub; +pfn_glVertexP2uiv fp_glVertexP2uiv; +pfn_glSecondaryColor3iv fp_glSecondaryColor3iv; +pfn_glRasterPos4i fp_glRasterPos4i; +pfn_glMultTransposeMatrixd fp_glMultTransposeMatrixd; +pfn_glClearColor fp_glClearColor; +pfn_glVertexAttrib4uiv fp_glVertexAttrib4uiv; +pfn_glNormal3s fp_glNormal3s; +pfn_glVertexAttrib4Niv fp_glVertexAttrib4Niv; +pfn_glProgramUniformMatrix2x3fv fp_glProgramUniformMatrix2x3fv; +pfn_glClearBufferiv fp_glClearBufferiv; +pfn_glPointParameteri fp_glPointParameteri; +pfn_glProgramUniform4dv fp_glProgramUniform4dv; +pfn_glColorP4uiv fp_glColorP4uiv; +pfn_glBlendColor fp_glBlendColor; +pfn_glWindowPos3d fp_glWindowPos3d; +pfn_glProgramUniform3fv fp_glProgramUniform3fv; +pfn_glVertexAttribI2uiv fp_glVertexAttribI2uiv; +pfn_glSamplerParameterIuiv fp_glSamplerParameterIuiv; +pfn_glUniform3ui fp_glUniform3ui; +pfn_glProgramUniform3uiv fp_glProgramUniform3uiv; +pfn_glColor4dv fp_glColor4dv; +pfn_glVertexAttribI4uiv fp_glVertexAttribI4uiv; +pfn_glPointParameterfv fp_glPointParameterfv; +pfn_glResumeTransformFeedback fp_glResumeTransformFeedback; +pfn_glUniform2fv fp_glUniform2fv; +pfn_glGetActiveSubroutineUniformName fp_glGetActiveSubroutineUniformName; +pfn_glGetProgramResourceIndex fp_glGetProgramResourceIndex; +pfn_glSecondaryColor3ub fp_glSecondaryColor3ub; +pfn_glDrawElementsIndirect fp_glDrawElementsIndirect; +pfn_glSecondaryColor3ui fp_glSecondaryColor3ui; +pfn_glTexCoord3dv fp_glTexCoord3dv; +pfn_glDispatchComputeIndirect fp_glDispatchComputeIndirect; +pfn_glGetSamplerParameterIuiv fp_glGetSamplerParameterIuiv; +pfn_glBindBufferRange fp_glBindBufferRange; +pfn_glNormal3iv fp_glNormal3iv; +pfn_glVertexAttribL3dv fp_glVertexAttribL3dv; +pfn_glGetUniformdv fp_glGetUniformdv; +pfn_glWindowPos3s fp_glWindowPos3s; +pfn_glPointParameterf fp_glPointParameterf; +pfn_glClearDepthf fp_glClearDepthf; +pfn_glGetVertexAttribIuiv fp_glGetVertexAttribIuiv; +pfn_glWindowPos3i fp_glWindowPos3i; +pfn_glMultiTexCoord4s fp_glMultiTexCoord4s; +pfn_glWindowPos3f fp_glWindowPos3f; +pfn_glGenTransformFeedbacks fp_glGenTransformFeedbacks; +pfn_glColor3us fp_glColor3us; +pfn_glColor3uiv fp_glColor3uiv; +pfn_glVertexAttrib4Nusv fp_glVertexAttrib4Nusv; +pfn_glGetLightiv fp_glGetLightiv; +pfn_glDepthFunc fp_glDepthFunc; +pfn_glCompressedTexSubImage2D fp_glCompressedTexSubImage2D; +pfn_glListBase fp_glListBase; +pfn_glMultiTexCoord4f fp_glMultiTexCoord4f; +pfn_glColor3ub fp_glColor3ub; +pfn_glMultiTexCoord4d fp_glMultiTexCoord4d; +pfn_glVertexAttribI4bv fp_glVertexAttribI4bv; +pfn_glBlendEquationSeparatei fp_glBlendEquationSeparatei; +pfn_glGetTexParameterfv fp_glGetTexParameterfv; +pfn_glColor3ui fp_glColor3ui; +pfn_glGetProgramResourceLocationIndex fp_glGetProgramResourceLocationIndex; +pfn_glMultiTexCoord4i fp_glMultiTexCoord4i; +pfn_glBufferStorage fp_glBufferStorage; +pfn_glGetPolygonStipple fp_glGetPolygonStipple; +pfn_glClientWaitSync fp_glClientWaitSync; +pfn_glVertexAttribI4ui fp_glVertexAttribI4ui; +pfn_glGetFloati_v fp_glGetFloati_v; +pfn_glMultiTexCoord4dv fp_glMultiTexCoord4dv; +pfn_glColorMask fp_glColorMask; +pfn_glTexParameterIiv fp_glTexParameterIiv; +pfn_glBlendEquation fp_glBlendEquation; +pfn_glGetUniformLocation fp_glGetUniformLocation; +pfn_glGetSamplerParameteriv fp_glGetSamplerParameteriv; +pfn_glRasterPos4s fp_glRasterPos4s; +pfn_glEndTransformFeedback fp_glEndTransformFeedback; +pfn_glVertexAttrib4usv fp_glVertexAttrib4usv; +pfn_glGetUniformSubroutineuiv fp_glGetUniformSubroutineuiv; +pfn_glMultiTexCoord3dv fp_glMultiTexCoord3dv; +pfn_glBindVertexBuffer fp_glBindVertexBuffer; +pfn_glColor4sv fp_glColor4sv; +pfn_glDebugMessageInsert fp_glDebugMessageInsert; +pfn_glPopClientAttrib fp_glPopClientAttrib; +pfn_glClearBufferData fp_glClearBufferData; +pfn_glBeginTransformFeedback fp_glBeginTransformFeedback; +pfn_glFogf fp_glFogf; +pfn_glVertexAttribI1iv fp_glVertexAttribI1iv; +pfn_glProgramBinary fp_glProgramBinary; +pfn_glIsSampler fp_glIsSampler; +pfn_glVertexP3ui fp_glVertexP3ui; +pfn_glVertexAttribDivisor fp_glVertexAttribDivisor; +pfn_glBindSamplers fp_glBindSamplers; +pfn_glColor3iv fp_glColor3iv; +pfn_glCompressedTexImage1D fp_glCompressedTexImage1D; +pfn_glDeleteTransformFeedbacks fp_glDeleteTransformFeedbacks; +pfn_glCopyTexSubImage1D fp_glCopyTexSubImage1D; +pfn_glTexCoord1i fp_glTexCoord1i; +pfn_glCheckFramebufferStatus fp_glCheckFramebufferStatus; +pfn_glTexCoord1d fp_glTexCoord1d; +pfn_glTexCoord1f fp_glTexCoord1f; +pfn_glEndConditionalRender fp_glEndConditionalRender; +pfn_glEnableClientState fp_glEnableClientState; +pfn_glBindAttribLocation fp_glBindAttribLocation; +pfn_glUniformMatrix4x2fv fp_glUniformMatrix4x2fv; +pfn_glUniformMatrix2dv fp_glUniformMatrix2dv; +pfn_glBlendFunci fp_glBlendFunci; +pfn_glMultiTexCoord2sv fp_glMultiTexCoord2sv; +pfn_glVertexAttrib1dv fp_glVertexAttrib1dv; +pfn_glDrawRangeElements fp_glDrawRangeElements; +pfn_glTexCoord1s fp_glTexCoord1s; +pfn_glBindBufferBase fp_glBindBufferBase; +pfn_glBufferSubData fp_glBufferSubData; +pfn_glVertexAttrib4iv fp_glVertexAttrib4iv; +pfn_glGenLists fp_glGenLists; +pfn_glColor3bv fp_glColor3bv; +pfn_glMapBufferRange fp_glMapBufferRange; +pfn_glFramebufferTexture fp_glFramebufferTexture; +pfn_glBlendFuncSeparatei fp_glBlendFuncSeparatei; +pfn_glProgramUniformMatrix4x2fv fp_glProgramUniformMatrix4x2fv; +pfn_glVertexAttribL1d fp_glVertexAttribL1d; +pfn_glGetTexGendv fp_glGetTexGendv; +pfn_glMultiDrawArrays fp_glMultiDrawArrays; +pfn_glEndList fp_glEndList; +pfn_glScissorIndexed fp_glScissorIndexed; +pfn_glVertexP4uiv fp_glVertexP4uiv; +pfn_glUniform2ui fp_glUniform2ui; +pfn_glVertexAttribI2iv fp_glVertexAttribI2iv; +pfn_glColor3usv fp_glColor3usv; +pfn_glWindowPos2fv fp_glWindowPos2fv; +pfn_glTextureView fp_glTextureView; +pfn_glDisablei fp_glDisablei; +pfn_glProgramUniformMatrix2x4fv fp_glProgramUniformMatrix2x4fv; +pfn_glIndexMask fp_glIndexMask; +pfn_glPushClientAttrib fp_glPushClientAttrib; +pfn_glShaderSource fp_glShaderSource; +pfn_glGetActiveUniformBlockName fp_glGetActiveUniformBlockName; +pfn_glVertexAttribI3uiv fp_glVertexAttribI3uiv; +pfn_glReleaseShaderCompiler fp_glReleaseShaderCompiler; +pfn_glVertexAttribIFormat fp_glVertexAttribIFormat; +pfn_glClearAccum fp_glClearAccum; +pfn_glGetSynciv fp_glGetSynciv; +pfn_glProgramUniform2uiv fp_glProgramUniform2uiv; +pfn_glTexCoordP2uiv fp_glTexCoordP2uiv; +pfn_glPatchParameteri fp_glPatchParameteri; +pfn_glProgramUniform2i fp_glProgramUniform2i; +pfn_glUniform2f fp_glUniform2f; +pfn_glBeginQuery fp_glBeginQuery; +pfn_glGetUniformBlockIndex fp_glGetUniformBlockIndex; +pfn_glBindBuffer fp_glBindBuffer; +pfn_glMap2d fp_glMap2d; +pfn_glMap2f fp_glMap2f; +pfn_glTexStorage2DMultisample fp_glTexStorage2DMultisample; +pfn_glUniform2d fp_glUniform2d; +pfn_glVertex4d fp_glVertex4d; +pfn_glUniformMatrix2fv fp_glUniformMatrix2fv; +pfn_glTexCoord1sv fp_glTexCoord1sv; +pfn_glBufferData fp_glBufferData; +pfn_glEvalPoint1 fp_glEvalPoint1; +pfn_glGetTexParameterIiv fp_glGetTexParameterIiv; +pfn_glTexCoord1dv fp_glTexCoord1dv; +pfn_glTexCoordP1ui fp_glTexCoordP1ui; +pfn_glGetError fp_glGetError; +pfn_glGetTexEnviv fp_glGetTexEnviv; +pfn_glGetProgramiv fp_glGetProgramiv; +pfn_glVertexAttribP2ui fp_glVertexAttribP2ui; +pfn_glGetFloatv fp_glGetFloatv; +pfn_glTexSubImage1D fp_glTexSubImage1D; +pfn_glMultiTexCoord2fv fp_glMultiTexCoord2fv; +pfn_glUniformMatrix2x4dv fp_glUniformMatrix2x4dv; +pfn_glVertexAttrib2fv fp_glVertexAttrib2fv; +pfn_glEvalCoord1d fp_glEvalCoord1d; +pfn_glGetTexLevelParameterfv fp_glGetTexLevelParameterfv; +pfn_glEvalCoord1f fp_glEvalCoord1f; +pfn_glPixelMapfv fp_glPixelMapfv; +pfn_glVertexAttribP3uiv fp_glVertexAttribP3uiv; +pfn_glGetPixelMapusv fp_glGetPixelMapusv; +pfn_glSecondaryColorP3uiv fp_glSecondaryColorP3uiv; +pfn_glGetIntegerv fp_glGetIntegerv; +pfn_glAccum fp_glAccum; +pfn_glGetBufferPointerv fp_glGetBufferPointerv; +pfn_glGetVertexAttribIiv fp_glGetVertexAttribIiv; +pfn_glRasterPos4dv fp_glRasterPos4dv; +pfn_glProgramUniform4fv fp_glProgramUniform4fv; +pfn_glTexCoord2iv fp_glTexCoord2iv; +pfn_glIsQuery fp_glIsQuery; +pfn_glProgramUniform2ui fp_glProgramUniform2ui; +pfn_glProgramUniform4ui fp_glProgramUniform4ui; +pfn_glVertexAttrib4sv fp_glVertexAttrib4sv; +pfn_glWindowPos3dv fp_glWindowPos3dv; +pfn_glTexImage2D fp_glTexImage2D; +pfn_glStencilMask fp_glStencilMask; +pfn_glDrawPixels fp_glDrawPixels; +pfn_glMultMatrixd fp_glMultMatrixd; +pfn_glMultMatrixf fp_glMultMatrixf; +pfn_glIsTexture fp_glIsTexture; +pfn_glGetMaterialiv fp_glGetMaterialiv; +pfn_glUniform1fv fp_glUniform1fv; +pfn_glLoadMatrixf fp_glLoadMatrixf; +pfn_glTexStorage2D fp_glTexStorage2D; +pfn_glLoadMatrixd fp_glLoadMatrixd; +pfn_glTexParameterfv fp_glTexParameterfv; +pfn_glUniformMatrix3fv fp_glUniformMatrix3fv; +pfn_glVertex4f fp_glVertex4f; +pfn_glRectsv fp_glRectsv; +pfn_glColor4usv fp_glColor4usv; +pfn_glUniform3dv fp_glUniform3dv; +pfn_glProgramUniformMatrix4x3fv fp_glProgramUniformMatrix4x3fv; +pfn_glPolygonStipple fp_glPolygonStipple; +pfn_glBindBuffersBase fp_glBindBuffersBase; +pfn_glInterleavedArrays fp_glInterleavedArrays; +pfn_glGetSubroutineUniformLocation fp_glGetSubroutineUniformLocation; +pfn_glNormal3i fp_glNormal3i; +pfn_glNormal3f fp_glNormal3f; +pfn_glNormal3d fp_glNormal3d; +pfn_glNormal3b fp_glNormal3b; +pfn_glGetFramebufferParameteriv fp_glGetFramebufferParameteriv; +pfn_glPixelMapusv fp_glPixelMapusv; +pfn_glGetTexGeniv fp_glGetTexGeniv; +pfn_glArrayElement fp_glArrayElement; +pfn_glCopyBufferSubData fp_glCopyBufferSubData; +pfn_glVertexAttribI1uiv fp_glVertexAttribI1uiv; +pfn_glVertexAttrib2d fp_glVertexAttrib2d; +pfn_glBindTransformFeedback fp_glBindTransformFeedback; +pfn_glVertexAttrib2f fp_glVertexAttrib2f; +pfn_glVertexAttrib3dv fp_glVertexAttrib3dv; +pfn_glGetQueryObjectui64v fp_glGetQueryObjectui64v; +pfn_glDepthMask fp_glDepthMask; +pfn_glVertexAttrib2s fp_glVertexAttrib2s; +pfn_glColor3fv fp_glColor3fv; +pfn_glTexImage3DMultisample fp_glTexImage3DMultisample; +pfn_glProgramUniform1fv fp_glProgramUniform1fv; +pfn_glUniformMatrix4fv fp_glUniformMatrix4fv; +pfn_glUniform4fv fp_glUniform4fv; +pfn_glGetActiveUniform fp_glGetActiveUniform; +pfn_glColorPointer fp_glColorPointer; +pfn_glFrontFace fp_glFrontFace; +pfn_glTexBufferRange fp_glTexBufferRange; +pfn_glDrawArraysInstancedBaseInstance fp_glDrawArraysInstancedBaseInstance; +pfn_glGetBooleani_v fp_glGetBooleani_v; +pfn_glVertexAttribL3d fp_glVertexAttribL3d; +pfn_glDeleteProgramPipelines fp_glDeleteProgramPipelines; +pfn_glClearBufferuiv fp_glClearBufferuiv; +pfn_glGetProgramResourceiv fp_glGetProgramResourceiv; +pfn_glDebugMessageControlKHR fp_glDebugMessageControlKHR; +pfn_glDebugMessageInsertKHR fp_glDebugMessageInsertKHR; +pfn_glDebugMessageCallbackKHR fp_glDebugMessageCallbackKHR; +pfn_glGetDebugMessageLogKHR fp_glGetDebugMessageLogKHR; +pfn_glPushDebugGroupKHR fp_glPushDebugGroupKHR; +pfn_glPopDebugGroupKHR fp_glPopDebugGroupKHR; +pfn_glObjectLabelKHR fp_glObjectLabelKHR; +pfn_glGetObjectLabelKHR fp_glGetObjectLabelKHR; +pfn_glObjectPtrLabelKHR fp_glObjectPtrLabelKHR; +pfn_glGetObjectPtrLabelKHR fp_glGetObjectPtrLabelKHR; +pfn_glGetPointervKHR fp_glGetPointervKHR; +pfn_glGetTextureHandleARB fp_glGetTextureHandleARB; +pfn_glGetTextureSamplerHandleARB fp_glGetTextureSamplerHandleARB; +pfn_glMakeTextureHandleResidentARB fp_glMakeTextureHandleResidentARB; +pfn_glMakeTextureHandleNonResidentARB fp_glMakeTextureHandleNonResidentARB; +pfn_glGetImageHandleARB fp_glGetImageHandleARB; +pfn_glMakeImageHandleResidentARB fp_glMakeImageHandleResidentARB; +pfn_glMakeImageHandleNonResidentARB fp_glMakeImageHandleNonResidentARB; +pfn_glUniformHandleui64ARB fp_glUniformHandleui64ARB; +pfn_glUniformHandleui64vARB fp_glUniformHandleui64vARB; +pfn_glProgramUniformHandleui64ARB fp_glProgramUniformHandleui64ARB; +pfn_glProgramUniformHandleui64vARB fp_glProgramUniformHandleui64vARB; +pfn_glIsTextureHandleResidentARB fp_glIsTextureHandleResidentARB; +pfn_glIsImageHandleResidentARB fp_glIsImageHandleResidentARB; +pfn_glVertexAttribL1ui64ARB fp_glVertexAttribL1ui64ARB; +pfn_glVertexAttribL1ui64vARB fp_glVertexAttribL1ui64vARB; +pfn_glGetVertexAttribLui64vARB fp_glGetVertexAttribLui64vARB; +pfn_glCreateSyncFromCLeventARB fp_glCreateSyncFromCLeventARB; +pfn_glClampColorARB fp_glClampColorARB; +pfn_glDispatchComputeGroupSizeARB fp_glDispatchComputeGroupSizeARB; +pfn_glDebugMessageControlARB fp_glDebugMessageControlARB; +pfn_glDebugMessageInsertARB fp_glDebugMessageInsertARB; +pfn_glDebugMessageCallbackARB fp_glDebugMessageCallbackARB; +pfn_glGetDebugMessageLogARB fp_glGetDebugMessageLogARB; +pfn_glDrawBuffersARB fp_glDrawBuffersARB; +pfn_glBlendEquationiARB fp_glBlendEquationiARB; +pfn_glBlendEquationSeparateiARB fp_glBlendEquationSeparateiARB; +pfn_glBlendFunciARB fp_glBlendFunciARB; +pfn_glBlendFuncSeparateiARB fp_glBlendFuncSeparateiARB; +pfn_glDrawArraysInstancedARB fp_glDrawArraysInstancedARB; +pfn_glDrawElementsInstancedARB fp_glDrawElementsInstancedARB; +pfn_glProgramStringARB fp_glProgramStringARB; +pfn_glBindProgramARB fp_glBindProgramARB; +pfn_glDeleteProgramsARB fp_glDeleteProgramsARB; +pfn_glGenProgramsARB fp_glGenProgramsARB; +pfn_glProgramEnvParameter4dARB fp_glProgramEnvParameter4dARB; +pfn_glProgramEnvParameter4dvARB fp_glProgramEnvParameter4dvARB; +pfn_glProgramEnvParameter4fARB fp_glProgramEnvParameter4fARB; +pfn_glProgramEnvParameter4fvARB fp_glProgramEnvParameter4fvARB; +pfn_glProgramLocalParameter4dARB fp_glProgramLocalParameter4dARB; +pfn_glProgramLocalParameter4dvARB fp_glProgramLocalParameter4dvARB; +pfn_glProgramLocalParameter4fARB fp_glProgramLocalParameter4fARB; +pfn_glProgramLocalParameter4fvARB fp_glProgramLocalParameter4fvARB; +pfn_glGetProgramEnvParameterdvARB fp_glGetProgramEnvParameterdvARB; +pfn_glGetProgramEnvParameterfvARB fp_glGetProgramEnvParameterfvARB; +pfn_glGetProgramLocalParameterdvARB fp_glGetProgramLocalParameterdvARB; +pfn_glGetProgramLocalParameterfvARB fp_glGetProgramLocalParameterfvARB; +pfn_glGetProgramivARB fp_glGetProgramivARB; +pfn_glGetProgramStringARB fp_glGetProgramStringARB; +pfn_glIsProgramARB fp_glIsProgramARB; +pfn_glProgramParameteriARB fp_glProgramParameteriARB; +pfn_glFramebufferTextureARB fp_glFramebufferTextureARB; +pfn_glFramebufferTextureLayerARB fp_glFramebufferTextureLayerARB; +pfn_glFramebufferTextureFaceARB fp_glFramebufferTextureFaceARB; +pfn_glMultiDrawArraysIndirectCountARB fp_glMultiDrawArraysIndirectCountARB; +pfn_glMultiDrawElementsIndirectCountARB fp_glMultiDrawElementsIndirectCountARB; +pfn_glVertexAttribDivisorARB fp_glVertexAttribDivisorARB; +pfn_glCurrentPaletteMatrixARB fp_glCurrentPaletteMatrixARB; +pfn_glMatrixIndexubvARB fp_glMatrixIndexubvARB; +pfn_glMatrixIndexusvARB fp_glMatrixIndexusvARB; +pfn_glMatrixIndexuivARB fp_glMatrixIndexuivARB; +pfn_glMatrixIndexPointerARB fp_glMatrixIndexPointerARB; +pfn_glSampleCoverageARB fp_glSampleCoverageARB; +pfn_glActiveTextureARB fp_glActiveTextureARB; +pfn_glClientActiveTextureARB fp_glClientActiveTextureARB; +pfn_glMultiTexCoord1dARB fp_glMultiTexCoord1dARB; +pfn_glMultiTexCoord1dvARB fp_glMultiTexCoord1dvARB; +pfn_glMultiTexCoord1fARB fp_glMultiTexCoord1fARB; +pfn_glMultiTexCoord1fvARB fp_glMultiTexCoord1fvARB; +pfn_glMultiTexCoord1iARB fp_glMultiTexCoord1iARB; +pfn_glMultiTexCoord1ivARB fp_glMultiTexCoord1ivARB; +pfn_glMultiTexCoord1sARB fp_glMultiTexCoord1sARB; +pfn_glMultiTexCoord1svARB fp_glMultiTexCoord1svARB; +pfn_glMultiTexCoord2dARB fp_glMultiTexCoord2dARB; +pfn_glMultiTexCoord2dvARB fp_glMultiTexCoord2dvARB; +pfn_glMultiTexCoord2fARB fp_glMultiTexCoord2fARB; +pfn_glMultiTexCoord2fvARB fp_glMultiTexCoord2fvARB; +pfn_glMultiTexCoord2iARB fp_glMultiTexCoord2iARB; +pfn_glMultiTexCoord2ivARB fp_glMultiTexCoord2ivARB; +pfn_glMultiTexCoord2sARB fp_glMultiTexCoord2sARB; +pfn_glMultiTexCoord2svARB fp_glMultiTexCoord2svARB; +pfn_glMultiTexCoord3dARB fp_glMultiTexCoord3dARB; +pfn_glMultiTexCoord3dvARB fp_glMultiTexCoord3dvARB; +pfn_glMultiTexCoord3fARB fp_glMultiTexCoord3fARB; +pfn_glMultiTexCoord3fvARB fp_glMultiTexCoord3fvARB; +pfn_glMultiTexCoord3iARB fp_glMultiTexCoord3iARB; +pfn_glMultiTexCoord3ivARB fp_glMultiTexCoord3ivARB; +pfn_glMultiTexCoord3sARB fp_glMultiTexCoord3sARB; +pfn_glMultiTexCoord3svARB fp_glMultiTexCoord3svARB; +pfn_glMultiTexCoord4dARB fp_glMultiTexCoord4dARB; +pfn_glMultiTexCoord4dvARB fp_glMultiTexCoord4dvARB; +pfn_glMultiTexCoord4fARB fp_glMultiTexCoord4fARB; +pfn_glMultiTexCoord4fvARB fp_glMultiTexCoord4fvARB; +pfn_glMultiTexCoord4iARB fp_glMultiTexCoord4iARB; +pfn_glMultiTexCoord4ivARB fp_glMultiTexCoord4ivARB; +pfn_glMultiTexCoord4sARB fp_glMultiTexCoord4sARB; +pfn_glMultiTexCoord4svARB fp_glMultiTexCoord4svARB; +pfn_glGenQueriesARB fp_glGenQueriesARB; +pfn_glDeleteQueriesARB fp_glDeleteQueriesARB; +pfn_glIsQueryARB fp_glIsQueryARB; +pfn_glBeginQueryARB fp_glBeginQueryARB; +pfn_glEndQueryARB fp_glEndQueryARB; +pfn_glGetQueryivARB fp_glGetQueryivARB; +pfn_glGetQueryObjectivARB fp_glGetQueryObjectivARB; +pfn_glGetQueryObjectuivARB fp_glGetQueryObjectuivARB; +pfn_glPointParameterfARB fp_glPointParameterfARB; +pfn_glPointParameterfvARB fp_glPointParameterfvARB; +pfn_glGetGraphicsResetStatusARB fp_glGetGraphicsResetStatusARB; +pfn_glGetnTexImageARB fp_glGetnTexImageARB; +pfn_glReadnPixelsARB fp_glReadnPixelsARB; +pfn_glGetnCompressedTexImageARB fp_glGetnCompressedTexImageARB; +pfn_glGetnUniformfvARB fp_glGetnUniformfvARB; +pfn_glGetnUniformivARB fp_glGetnUniformivARB; +pfn_glGetnUniformuivARB fp_glGetnUniformuivARB; +pfn_glGetnUniformdvARB fp_glGetnUniformdvARB; +pfn_glGetnMapdvARB fp_glGetnMapdvARB; +pfn_glGetnMapfvARB fp_glGetnMapfvARB; +pfn_glGetnMapivARB fp_glGetnMapivARB; +pfn_glGetnPixelMapfvARB fp_glGetnPixelMapfvARB; +pfn_glGetnPixelMapuivARB fp_glGetnPixelMapuivARB; +pfn_glGetnPixelMapusvARB fp_glGetnPixelMapusvARB; +pfn_glGetnPolygonStippleARB fp_glGetnPolygonStippleARB; +pfn_glGetnColorTableARB fp_glGetnColorTableARB; +pfn_glGetnConvolutionFilterARB fp_glGetnConvolutionFilterARB; +pfn_glGetnSeparableFilterARB fp_glGetnSeparableFilterARB; +pfn_glGetnHistogramARB fp_glGetnHistogramARB; +pfn_glGetnMinmaxARB fp_glGetnMinmaxARB; +pfn_glMinSampleShadingARB fp_glMinSampleShadingARB; +pfn_glDeleteObjectARB fp_glDeleteObjectARB; +pfn_glGetHandleARB fp_glGetHandleARB; +pfn_glDetachObjectARB fp_glDetachObjectARB; +pfn_glCreateShaderObjectARB fp_glCreateShaderObjectARB; +pfn_glShaderSourceARB fp_glShaderSourceARB; +pfn_glCompileShaderARB fp_glCompileShaderARB; +pfn_glCreateProgramObjectARB fp_glCreateProgramObjectARB; +pfn_glAttachObjectARB fp_glAttachObjectARB; +pfn_glLinkProgramARB fp_glLinkProgramARB; +pfn_glUseProgramObjectARB fp_glUseProgramObjectARB; +pfn_glValidateProgramARB fp_glValidateProgramARB; +pfn_glUniform1fARB fp_glUniform1fARB; +pfn_glUniform2fARB fp_glUniform2fARB; +pfn_glUniform3fARB fp_glUniform3fARB; +pfn_glUniform4fARB fp_glUniform4fARB; +pfn_glUniform1iARB fp_glUniform1iARB; +pfn_glUniform2iARB fp_glUniform2iARB; +pfn_glUniform3iARB fp_glUniform3iARB; +pfn_glUniform4iARB fp_glUniform4iARB; +pfn_glUniform1fvARB fp_glUniform1fvARB; +pfn_glUniform2fvARB fp_glUniform2fvARB; +pfn_glUniform3fvARB fp_glUniform3fvARB; +pfn_glUniform4fvARB fp_glUniform4fvARB; +pfn_glUniform1ivARB fp_glUniform1ivARB; +pfn_glUniform2ivARB fp_glUniform2ivARB; +pfn_glUniform3ivARB fp_glUniform3ivARB; +pfn_glUniform4ivARB fp_glUniform4ivARB; +pfn_glUniformMatrix2fvARB fp_glUniformMatrix2fvARB; +pfn_glUniformMatrix3fvARB fp_glUniformMatrix3fvARB; +pfn_glUniformMatrix4fvARB fp_glUniformMatrix4fvARB; +pfn_glGetObjectParameterfvARB fp_glGetObjectParameterfvARB; +pfn_glGetObjectParameterivARB fp_glGetObjectParameterivARB; +pfn_glGetInfoLogARB fp_glGetInfoLogARB; +pfn_glGetAttachedObjectsARB fp_glGetAttachedObjectsARB; +pfn_glGetUniformLocationARB fp_glGetUniformLocationARB; +pfn_glGetActiveUniformARB fp_glGetActiveUniformARB; +pfn_glGetUniformfvARB fp_glGetUniformfvARB; +pfn_glGetUniformivARB fp_glGetUniformivARB; +pfn_glGetShaderSourceARB fp_glGetShaderSourceARB; +pfn_glNamedStringARB fp_glNamedStringARB; +pfn_glDeleteNamedStringARB fp_glDeleteNamedStringARB; +pfn_glCompileShaderIncludeARB fp_glCompileShaderIncludeARB; +pfn_glIsNamedStringARB fp_glIsNamedStringARB; +pfn_glGetNamedStringARB fp_glGetNamedStringARB; +pfn_glGetNamedStringivARB fp_glGetNamedStringivARB; +pfn_glTexPageCommitmentARB fp_glTexPageCommitmentARB; +pfn_glTexBufferARB fp_glTexBufferARB; +pfn_glCompressedTexImage3DARB fp_glCompressedTexImage3DARB; +pfn_glCompressedTexImage2DARB fp_glCompressedTexImage2DARB; +pfn_glCompressedTexImage1DARB fp_glCompressedTexImage1DARB; +pfn_glCompressedTexSubImage3DARB fp_glCompressedTexSubImage3DARB; +pfn_glCompressedTexSubImage2DARB fp_glCompressedTexSubImage2DARB; +pfn_glCompressedTexSubImage1DARB fp_glCompressedTexSubImage1DARB; +pfn_glGetCompressedTexImageARB fp_glGetCompressedTexImageARB; +pfn_glLoadTransposeMatrixfARB fp_glLoadTransposeMatrixfARB; +pfn_glLoadTransposeMatrixdARB fp_glLoadTransposeMatrixdARB; +pfn_glMultTransposeMatrixfARB fp_glMultTransposeMatrixfARB; +pfn_glMultTransposeMatrixdARB fp_glMultTransposeMatrixdARB; +pfn_glWeightbvARB fp_glWeightbvARB; +pfn_glWeightsvARB fp_glWeightsvARB; +pfn_glWeightivARB fp_glWeightivARB; +pfn_glWeightfvARB fp_glWeightfvARB; +pfn_glWeightdvARB fp_glWeightdvARB; +pfn_glWeightubvARB fp_glWeightubvARB; +pfn_glWeightusvARB fp_glWeightusvARB; +pfn_glWeightuivARB fp_glWeightuivARB; +pfn_glWeightPointerARB fp_glWeightPointerARB; +pfn_glVertexBlendARB fp_glVertexBlendARB; +pfn_glBindBufferARB fp_glBindBufferARB; +pfn_glDeleteBuffersARB fp_glDeleteBuffersARB; +pfn_glGenBuffersARB fp_glGenBuffersARB; +pfn_glIsBufferARB fp_glIsBufferARB; +pfn_glBufferDataARB fp_glBufferDataARB; +pfn_glBufferSubDataARB fp_glBufferSubDataARB; +pfn_glGetBufferSubDataARB fp_glGetBufferSubDataARB; +pfn_glMapBufferARB fp_glMapBufferARB; +pfn_glUnmapBufferARB fp_glUnmapBufferARB; +pfn_glGetBufferParameterivARB fp_glGetBufferParameterivARB; +pfn_glGetBufferPointervARB fp_glGetBufferPointervARB; +pfn_glVertexAttrib1dARB fp_glVertexAttrib1dARB; +pfn_glVertexAttrib1dvARB fp_glVertexAttrib1dvARB; +pfn_glVertexAttrib1fARB fp_glVertexAttrib1fARB; +pfn_glVertexAttrib1fvARB fp_glVertexAttrib1fvARB; +pfn_glVertexAttrib1sARB fp_glVertexAttrib1sARB; +pfn_glVertexAttrib1svARB fp_glVertexAttrib1svARB; +pfn_glVertexAttrib2dARB fp_glVertexAttrib2dARB; +pfn_glVertexAttrib2dvARB fp_glVertexAttrib2dvARB; +pfn_glVertexAttrib2fARB fp_glVertexAttrib2fARB; +pfn_glVertexAttrib2fvARB fp_glVertexAttrib2fvARB; +pfn_glVertexAttrib2sARB fp_glVertexAttrib2sARB; +pfn_glVertexAttrib2svARB fp_glVertexAttrib2svARB; +pfn_glVertexAttrib3dARB fp_glVertexAttrib3dARB; +pfn_glVertexAttrib3dvARB fp_glVertexAttrib3dvARB; +pfn_glVertexAttrib3fARB fp_glVertexAttrib3fARB; +pfn_glVertexAttrib3fvARB fp_glVertexAttrib3fvARB; +pfn_glVertexAttrib3sARB fp_glVertexAttrib3sARB; +pfn_glVertexAttrib3svARB fp_glVertexAttrib3svARB; +pfn_glVertexAttrib4NbvARB fp_glVertexAttrib4NbvARB; +pfn_glVertexAttrib4NivARB fp_glVertexAttrib4NivARB; +pfn_glVertexAttrib4NsvARB fp_glVertexAttrib4NsvARB; +pfn_glVertexAttrib4NubARB fp_glVertexAttrib4NubARB; +pfn_glVertexAttrib4NubvARB fp_glVertexAttrib4NubvARB; +pfn_glVertexAttrib4NuivARB fp_glVertexAttrib4NuivARB; +pfn_glVertexAttrib4NusvARB fp_glVertexAttrib4NusvARB; +pfn_glVertexAttrib4bvARB fp_glVertexAttrib4bvARB; +pfn_glVertexAttrib4dARB fp_glVertexAttrib4dARB; +pfn_glVertexAttrib4dvARB fp_glVertexAttrib4dvARB; +pfn_glVertexAttrib4fARB fp_glVertexAttrib4fARB; +pfn_glVertexAttrib4fvARB fp_glVertexAttrib4fvARB; +pfn_glVertexAttrib4ivARB fp_glVertexAttrib4ivARB; +pfn_glVertexAttrib4sARB fp_glVertexAttrib4sARB; +pfn_glVertexAttrib4svARB fp_glVertexAttrib4svARB; +pfn_glVertexAttrib4ubvARB fp_glVertexAttrib4ubvARB; +pfn_glVertexAttrib4uivARB fp_glVertexAttrib4uivARB; +pfn_glVertexAttrib4usvARB fp_glVertexAttrib4usvARB; +pfn_glVertexAttribPointerARB fp_glVertexAttribPointerARB; +pfn_glEnableVertexAttribArrayARB fp_glEnableVertexAttribArrayARB; +pfn_glDisableVertexAttribArrayARB fp_glDisableVertexAttribArrayARB; +pfn_glGetVertexAttribdvARB fp_glGetVertexAttribdvARB; +pfn_glGetVertexAttribfvARB fp_glGetVertexAttribfvARB; +pfn_glGetVertexAttribivARB fp_glGetVertexAttribivARB; +pfn_glGetVertexAttribPointervARB fp_glGetVertexAttribPointervARB; +pfn_glBindAttribLocationARB fp_glBindAttribLocationARB; +pfn_glGetActiveAttribARB fp_glGetActiveAttribARB; +pfn_glGetAttribLocationARB fp_glGetAttribLocationARB; +pfn_glWindowPos2dARB fp_glWindowPos2dARB; +pfn_glWindowPos2dvARB fp_glWindowPos2dvARB; +pfn_glWindowPos2fARB fp_glWindowPos2fARB; +pfn_glWindowPos2fvARB fp_glWindowPos2fvARB; +pfn_glWindowPos2iARB fp_glWindowPos2iARB; +pfn_glWindowPos2ivARB fp_glWindowPos2ivARB; +pfn_glWindowPos2sARB fp_glWindowPos2sARB; +pfn_glWindowPos2svARB fp_glWindowPos2svARB; +pfn_glWindowPos3dARB fp_glWindowPos3dARB; +pfn_glWindowPos3dvARB fp_glWindowPos3dvARB; +pfn_glWindowPos3fARB fp_glWindowPos3fARB; +pfn_glWindowPos3fvARB fp_glWindowPos3fvARB; +pfn_glWindowPos3iARB fp_glWindowPos3iARB; +pfn_glWindowPos3ivARB fp_glWindowPos3ivARB; +pfn_glWindowPos3sARB fp_glWindowPos3sARB; +pfn_glWindowPos3svARB fp_glWindowPos3svARB; +pfn_glUniformBufferEXT fp_glUniformBufferEXT; +pfn_glGetUniformBufferSizeEXT fp_glGetUniformBufferSizeEXT; +pfn_glGetUniformOffsetEXT fp_glGetUniformOffsetEXT; +pfn_glBlendColorEXT fp_glBlendColorEXT; +pfn_glBlendEquationSeparateEXT fp_glBlendEquationSeparateEXT; +pfn_glBlendFuncSeparateEXT fp_glBlendFuncSeparateEXT; +pfn_glBlendEquationEXT fp_glBlendEquationEXT; +pfn_glColorSubTableEXT fp_glColorSubTableEXT; +pfn_glCopyColorSubTableEXT fp_glCopyColorSubTableEXT; +pfn_glLockArraysEXT fp_glLockArraysEXT; +pfn_glUnlockArraysEXT fp_glUnlockArraysEXT; +pfn_glConvolutionFilter1DEXT fp_glConvolutionFilter1DEXT; +pfn_glConvolutionFilter2DEXT fp_glConvolutionFilter2DEXT; +pfn_glConvolutionParameterfEXT fp_glConvolutionParameterfEXT; +pfn_glConvolutionParameterfvEXT fp_glConvolutionParameterfvEXT; +pfn_glConvolutionParameteriEXT fp_glConvolutionParameteriEXT; +pfn_glConvolutionParameterivEXT fp_glConvolutionParameterivEXT; +pfn_glCopyConvolutionFilter1DEXT fp_glCopyConvolutionFilter1DEXT; +pfn_glCopyConvolutionFilter2DEXT fp_glCopyConvolutionFilter2DEXT; +pfn_glGetConvolutionFilterEXT fp_glGetConvolutionFilterEXT; +pfn_glGetConvolutionParameterfvEXT fp_glGetConvolutionParameterfvEXT; +pfn_glGetConvolutionParameterivEXT fp_glGetConvolutionParameterivEXT; +pfn_glGetSeparableFilterEXT fp_glGetSeparableFilterEXT; +pfn_glSeparableFilter2DEXT fp_glSeparableFilter2DEXT; +pfn_glTangent3bEXT fp_glTangent3bEXT; +pfn_glTangent3bvEXT fp_glTangent3bvEXT; +pfn_glTangent3dEXT fp_glTangent3dEXT; +pfn_glTangent3dvEXT fp_glTangent3dvEXT; +pfn_glTangent3fEXT fp_glTangent3fEXT; +pfn_glTangent3fvEXT fp_glTangent3fvEXT; +pfn_glTangent3iEXT fp_glTangent3iEXT; +pfn_glTangent3ivEXT fp_glTangent3ivEXT; +pfn_glTangent3sEXT fp_glTangent3sEXT; +pfn_glTangent3svEXT fp_glTangent3svEXT; +pfn_glBinormal3bEXT fp_glBinormal3bEXT; +pfn_glBinormal3bvEXT fp_glBinormal3bvEXT; +pfn_glBinormal3dEXT fp_glBinormal3dEXT; +pfn_glBinormal3dvEXT fp_glBinormal3dvEXT; +pfn_glBinormal3fEXT fp_glBinormal3fEXT; +pfn_glBinormal3fvEXT fp_glBinormal3fvEXT; +pfn_glBinormal3iEXT fp_glBinormal3iEXT; +pfn_glBinormal3ivEXT fp_glBinormal3ivEXT; +pfn_glBinormal3sEXT fp_glBinormal3sEXT; +pfn_glBinormal3svEXT fp_glBinormal3svEXT; +pfn_glTangentPointerEXT fp_glTangentPointerEXT; +pfn_glBinormalPointerEXT fp_glBinormalPointerEXT; +pfn_glCullParameterdvEXT fp_glCullParameterdvEXT; +pfn_glCullParameterfvEXT fp_glCullParameterfvEXT; +pfn_glLabelObjectEXT fp_glLabelObjectEXT; +pfn_glGetObjectLabelEXT fp_glGetObjectLabelEXT; +pfn_glInsertEventMarkerEXT fp_glInsertEventMarkerEXT; +pfn_glPushGroupMarkerEXT fp_glPushGroupMarkerEXT; +pfn_glPopGroupMarkerEXT fp_glPopGroupMarkerEXT; +pfn_glDepthBoundsEXT fp_glDepthBoundsEXT; +pfn_glMatrixLoadfEXT fp_glMatrixLoadfEXT; +pfn_glMatrixLoaddEXT fp_glMatrixLoaddEXT; +pfn_glMatrixMultfEXT fp_glMatrixMultfEXT; +pfn_glMatrixMultdEXT fp_glMatrixMultdEXT; +pfn_glMatrixLoadIdentityEXT fp_glMatrixLoadIdentityEXT; +pfn_glMatrixRotatefEXT fp_glMatrixRotatefEXT; +pfn_glMatrixRotatedEXT fp_glMatrixRotatedEXT; +pfn_glMatrixScalefEXT fp_glMatrixScalefEXT; +pfn_glMatrixScaledEXT fp_glMatrixScaledEXT; +pfn_glMatrixTranslatefEXT fp_glMatrixTranslatefEXT; +pfn_glMatrixTranslatedEXT fp_glMatrixTranslatedEXT; +pfn_glMatrixFrustumEXT fp_glMatrixFrustumEXT; +pfn_glMatrixOrthoEXT fp_glMatrixOrthoEXT; +pfn_glMatrixPopEXT fp_glMatrixPopEXT; +pfn_glMatrixPushEXT fp_glMatrixPushEXT; +pfn_glClientAttribDefaultEXT fp_glClientAttribDefaultEXT; +pfn_glPushClientAttribDefaultEXT fp_glPushClientAttribDefaultEXT; +pfn_glTextureParameterfEXT fp_glTextureParameterfEXT; +pfn_glTextureParameterfvEXT fp_glTextureParameterfvEXT; +pfn_glTextureParameteriEXT fp_glTextureParameteriEXT; +pfn_glTextureParameterivEXT fp_glTextureParameterivEXT; +pfn_glTextureImage1DEXT fp_glTextureImage1DEXT; +pfn_glTextureImage2DEXT fp_glTextureImage2DEXT; +pfn_glTextureSubImage1DEXT fp_glTextureSubImage1DEXT; +pfn_glTextureSubImage2DEXT fp_glTextureSubImage2DEXT; +pfn_glCopyTextureImage1DEXT fp_glCopyTextureImage1DEXT; +pfn_glCopyTextureImage2DEXT fp_glCopyTextureImage2DEXT; +pfn_glCopyTextureSubImage1DEXT fp_glCopyTextureSubImage1DEXT; +pfn_glCopyTextureSubImage2DEXT fp_glCopyTextureSubImage2DEXT; +pfn_glGetTextureImageEXT fp_glGetTextureImageEXT; +pfn_glGetTextureParameterfvEXT fp_glGetTextureParameterfvEXT; +pfn_glGetTextureParameterivEXT fp_glGetTextureParameterivEXT; +pfn_glGetTextureLevelParameterfvEXT fp_glGetTextureLevelParameterfvEXT; +pfn_glGetTextureLevelParameterivEXT fp_glGetTextureLevelParameterivEXT; +pfn_glTextureImage3DEXT fp_glTextureImage3DEXT; +pfn_glTextureSubImage3DEXT fp_glTextureSubImage3DEXT; +pfn_glCopyTextureSubImage3DEXT fp_glCopyTextureSubImage3DEXT; +pfn_glBindMultiTextureEXT fp_glBindMultiTextureEXT; +pfn_glMultiTexCoordPointerEXT fp_glMultiTexCoordPointerEXT; +pfn_glMultiTexEnvfEXT fp_glMultiTexEnvfEXT; +pfn_glMultiTexEnvfvEXT fp_glMultiTexEnvfvEXT; +pfn_glMultiTexEnviEXT fp_glMultiTexEnviEXT; +pfn_glMultiTexEnvivEXT fp_glMultiTexEnvivEXT; +pfn_glMultiTexGendEXT fp_glMultiTexGendEXT; +pfn_glMultiTexGendvEXT fp_glMultiTexGendvEXT; +pfn_glMultiTexGenfEXT fp_glMultiTexGenfEXT; +pfn_glMultiTexGenfvEXT fp_glMultiTexGenfvEXT; +pfn_glMultiTexGeniEXT fp_glMultiTexGeniEXT; +pfn_glMultiTexGenivEXT fp_glMultiTexGenivEXT; +pfn_glGetMultiTexEnvfvEXT fp_glGetMultiTexEnvfvEXT; +pfn_glGetMultiTexEnvivEXT fp_glGetMultiTexEnvivEXT; +pfn_glGetMultiTexGendvEXT fp_glGetMultiTexGendvEXT; +pfn_glGetMultiTexGenfvEXT fp_glGetMultiTexGenfvEXT; +pfn_glGetMultiTexGenivEXT fp_glGetMultiTexGenivEXT; +pfn_glMultiTexParameteriEXT fp_glMultiTexParameteriEXT; +pfn_glMultiTexParameterivEXT fp_glMultiTexParameterivEXT; +pfn_glMultiTexParameterfEXT fp_glMultiTexParameterfEXT; +pfn_glMultiTexParameterfvEXT fp_glMultiTexParameterfvEXT; +pfn_glMultiTexImage1DEXT fp_glMultiTexImage1DEXT; +pfn_glMultiTexImage2DEXT fp_glMultiTexImage2DEXT; +pfn_glMultiTexSubImage1DEXT fp_glMultiTexSubImage1DEXT; +pfn_glMultiTexSubImage2DEXT fp_glMultiTexSubImage2DEXT; +pfn_glCopyMultiTexImage1DEXT fp_glCopyMultiTexImage1DEXT; +pfn_glCopyMultiTexImage2DEXT fp_glCopyMultiTexImage2DEXT; +pfn_glCopyMultiTexSubImage1DEXT fp_glCopyMultiTexSubImage1DEXT; +pfn_glCopyMultiTexSubImage2DEXT fp_glCopyMultiTexSubImage2DEXT; +pfn_glGetMultiTexImageEXT fp_glGetMultiTexImageEXT; +pfn_glGetMultiTexParameterfvEXT fp_glGetMultiTexParameterfvEXT; +pfn_glGetMultiTexParameterivEXT fp_glGetMultiTexParameterivEXT; +pfn_glGetMultiTexLevelParameterfvEXT fp_glGetMultiTexLevelParameterfvEXT; +pfn_glGetMultiTexLevelParameterivEXT fp_glGetMultiTexLevelParameterivEXT; +pfn_glMultiTexImage3DEXT fp_glMultiTexImage3DEXT; +pfn_glMultiTexSubImage3DEXT fp_glMultiTexSubImage3DEXT; +pfn_glCopyMultiTexSubImage3DEXT fp_glCopyMultiTexSubImage3DEXT; +pfn_glEnableClientStateIndexedEXT fp_glEnableClientStateIndexedEXT; +pfn_glDisableClientStateIndexedEXT fp_glDisableClientStateIndexedEXT; +pfn_glGetFloatIndexedvEXT fp_glGetFloatIndexedvEXT; +pfn_glGetDoubleIndexedvEXT fp_glGetDoubleIndexedvEXT; +pfn_glGetPointerIndexedvEXT fp_glGetPointerIndexedvEXT; +pfn_glEnableIndexedEXT fp_glEnableIndexedEXT; +pfn_glDisableIndexedEXT fp_glDisableIndexedEXT; +pfn_glIsEnabledIndexedEXT fp_glIsEnabledIndexedEXT; +pfn_glGetIntegerIndexedvEXT fp_glGetIntegerIndexedvEXT; +pfn_glGetBooleanIndexedvEXT fp_glGetBooleanIndexedvEXT; +pfn_glCompressedTextureImage3DEXT fp_glCompressedTextureImage3DEXT; +pfn_glCompressedTextureImage2DEXT fp_glCompressedTextureImage2DEXT; +pfn_glCompressedTextureImage1DEXT fp_glCompressedTextureImage1DEXT; +pfn_glCompressedTextureSubImage3DEXT fp_glCompressedTextureSubImage3DEXT; +pfn_glCompressedTextureSubImage2DEXT fp_glCompressedTextureSubImage2DEXT; +pfn_glCompressedTextureSubImage1DEXT fp_glCompressedTextureSubImage1DEXT; +pfn_glGetCompressedTextureImageEXT fp_glGetCompressedTextureImageEXT; +pfn_glCompressedMultiTexImage3DEXT fp_glCompressedMultiTexImage3DEXT; +pfn_glCompressedMultiTexImage2DEXT fp_glCompressedMultiTexImage2DEXT; +pfn_glCompressedMultiTexImage1DEXT fp_glCompressedMultiTexImage1DEXT; +pfn_glCompressedMultiTexSubImage3DEXT fp_glCompressedMultiTexSubImage3DEXT; +pfn_glCompressedMultiTexSubImage2DEXT fp_glCompressedMultiTexSubImage2DEXT; +pfn_glCompressedMultiTexSubImage1DEXT fp_glCompressedMultiTexSubImage1DEXT; +pfn_glGetCompressedMultiTexImageEXT fp_glGetCompressedMultiTexImageEXT; +pfn_glMatrixLoadTransposefEXT fp_glMatrixLoadTransposefEXT; +pfn_glMatrixLoadTransposedEXT fp_glMatrixLoadTransposedEXT; +pfn_glMatrixMultTransposefEXT fp_glMatrixMultTransposefEXT; +pfn_glMatrixMultTransposedEXT fp_glMatrixMultTransposedEXT; +pfn_glNamedBufferDataEXT fp_glNamedBufferDataEXT; +pfn_glNamedBufferSubDataEXT fp_glNamedBufferSubDataEXT; +pfn_glMapNamedBufferEXT fp_glMapNamedBufferEXT; +pfn_glUnmapNamedBufferEXT fp_glUnmapNamedBufferEXT; +pfn_glGetNamedBufferParameterivEXT fp_glGetNamedBufferParameterivEXT; +pfn_glGetNamedBufferPointervEXT fp_glGetNamedBufferPointervEXT; +pfn_glGetNamedBufferSubDataEXT fp_glGetNamedBufferSubDataEXT; +pfn_glProgramUniform1fEXT fp_glProgramUniform1fEXT; +pfn_glProgramUniform2fEXT fp_glProgramUniform2fEXT; +pfn_glProgramUniform3fEXT fp_glProgramUniform3fEXT; +pfn_glProgramUniform4fEXT fp_glProgramUniform4fEXT; +pfn_glProgramUniform1iEXT fp_glProgramUniform1iEXT; +pfn_glProgramUniform2iEXT fp_glProgramUniform2iEXT; +pfn_glProgramUniform3iEXT fp_glProgramUniform3iEXT; +pfn_glProgramUniform4iEXT fp_glProgramUniform4iEXT; +pfn_glProgramUniform1fvEXT fp_glProgramUniform1fvEXT; +pfn_glProgramUniform2fvEXT fp_glProgramUniform2fvEXT; +pfn_glProgramUniform3fvEXT fp_glProgramUniform3fvEXT; +pfn_glProgramUniform4fvEXT fp_glProgramUniform4fvEXT; +pfn_glProgramUniform1ivEXT fp_glProgramUniform1ivEXT; +pfn_glProgramUniform2ivEXT fp_glProgramUniform2ivEXT; +pfn_glProgramUniform3ivEXT fp_glProgramUniform3ivEXT; +pfn_glProgramUniform4ivEXT fp_glProgramUniform4ivEXT; +pfn_glProgramUniformMatrix2fvEXT fp_glProgramUniformMatrix2fvEXT; +pfn_glProgramUniformMatrix3fvEXT fp_glProgramUniformMatrix3fvEXT; +pfn_glProgramUniformMatrix4fvEXT fp_glProgramUniformMatrix4fvEXT; +pfn_glProgramUniformMatrix2x3fvEXT fp_glProgramUniformMatrix2x3fvEXT; +pfn_glProgramUniformMatrix3x2fvEXT fp_glProgramUniformMatrix3x2fvEXT; +pfn_glProgramUniformMatrix2x4fvEXT fp_glProgramUniformMatrix2x4fvEXT; +pfn_glProgramUniformMatrix4x2fvEXT fp_glProgramUniformMatrix4x2fvEXT; +pfn_glProgramUniformMatrix3x4fvEXT fp_glProgramUniformMatrix3x4fvEXT; +pfn_glProgramUniformMatrix4x3fvEXT fp_glProgramUniformMatrix4x3fvEXT; +pfn_glTextureBufferEXT fp_glTextureBufferEXT; +pfn_glMultiTexBufferEXT fp_glMultiTexBufferEXT; +pfn_glTextureParameterIivEXT fp_glTextureParameterIivEXT; +pfn_glTextureParameterIuivEXT fp_glTextureParameterIuivEXT; +pfn_glGetTextureParameterIivEXT fp_glGetTextureParameterIivEXT; +pfn_glGetTextureParameterIuivEXT fp_glGetTextureParameterIuivEXT; +pfn_glMultiTexParameterIivEXT fp_glMultiTexParameterIivEXT; +pfn_glMultiTexParameterIuivEXT fp_glMultiTexParameterIuivEXT; +pfn_glGetMultiTexParameterIivEXT fp_glGetMultiTexParameterIivEXT; +pfn_glGetMultiTexParameterIuivEXT fp_glGetMultiTexParameterIuivEXT; +pfn_glProgramUniform1uiEXT fp_glProgramUniform1uiEXT; +pfn_glProgramUniform2uiEXT fp_glProgramUniform2uiEXT; +pfn_glProgramUniform3uiEXT fp_glProgramUniform3uiEXT; +pfn_glProgramUniform4uiEXT fp_glProgramUniform4uiEXT; +pfn_glProgramUniform1uivEXT fp_glProgramUniform1uivEXT; +pfn_glProgramUniform2uivEXT fp_glProgramUniform2uivEXT; +pfn_glProgramUniform3uivEXT fp_glProgramUniform3uivEXT; +pfn_glProgramUniform4uivEXT fp_glProgramUniform4uivEXT; +pfn_glNamedProgramLocalParameters4fvEXT fp_glNamedProgramLocalParameters4fvEXT; +pfn_glNamedProgramLocalParameterI4iEXT fp_glNamedProgramLocalParameterI4iEXT; +pfn_glNamedProgramLocalParameterI4ivEXT fp_glNamedProgramLocalParameterI4ivEXT; +pfn_glNamedProgramLocalParametersI4ivEXT fp_glNamedProgramLocalParametersI4ivEXT; +pfn_glNamedProgramLocalParameterI4uiEXT fp_glNamedProgramLocalParameterI4uiEXT; +pfn_glNamedProgramLocalParameterI4uivEXT fp_glNamedProgramLocalParameterI4uivEXT; +pfn_glNamedProgramLocalParametersI4uivEXT fp_glNamedProgramLocalParametersI4uivEXT; +pfn_glGetNamedProgramLocalParameterIivEXT fp_glGetNamedProgramLocalParameterIivEXT; +pfn_glGetNamedProgramLocalParameterIuivEXT fp_glGetNamedProgramLocalParameterIuivEXT; +pfn_glEnableClientStateiEXT fp_glEnableClientStateiEXT; +pfn_glDisableClientStateiEXT fp_glDisableClientStateiEXT; +pfn_glGetFloati_vEXT fp_glGetFloati_vEXT; +pfn_glGetDoublei_vEXT fp_glGetDoublei_vEXT; +pfn_glGetPointeri_vEXT fp_glGetPointeri_vEXT; +pfn_glNamedProgramStringEXT fp_glNamedProgramStringEXT; +pfn_glNamedProgramLocalParameter4dEXT fp_glNamedProgramLocalParameter4dEXT; +pfn_glNamedProgramLocalParameter4dvEXT fp_glNamedProgramLocalParameter4dvEXT; +pfn_glNamedProgramLocalParameter4fEXT fp_glNamedProgramLocalParameter4fEXT; +pfn_glNamedProgramLocalParameter4fvEXT fp_glNamedProgramLocalParameter4fvEXT; +pfn_glGetNamedProgramLocalParameterdvEXT fp_glGetNamedProgramLocalParameterdvEXT; +pfn_glGetNamedProgramLocalParameterfvEXT fp_glGetNamedProgramLocalParameterfvEXT; +pfn_glGetNamedProgramivEXT fp_glGetNamedProgramivEXT; +pfn_glGetNamedProgramStringEXT fp_glGetNamedProgramStringEXT; +pfn_glNamedRenderbufferStorageEXT fp_glNamedRenderbufferStorageEXT; +pfn_glGetNamedRenderbufferParameterivEXT fp_glGetNamedRenderbufferParameterivEXT; +pfn_glNamedRenderbufferStorageMultisampleEXT fp_glNamedRenderbufferStorageMultisampleEXT; +pfn_glNamedRenderbufferStorageMultisampleCoverageEXT fp_glNamedRenderbufferStorageMultisampleCoverageEXT; +pfn_glCheckNamedFramebufferStatusEXT fp_glCheckNamedFramebufferStatusEXT; +pfn_glNamedFramebufferTexture1DEXT fp_glNamedFramebufferTexture1DEXT; +pfn_glNamedFramebufferTexture2DEXT fp_glNamedFramebufferTexture2DEXT; +pfn_glNamedFramebufferTexture3DEXT fp_glNamedFramebufferTexture3DEXT; +pfn_glNamedFramebufferRenderbufferEXT fp_glNamedFramebufferRenderbufferEXT; +pfn_glGetNamedFramebufferAttachmentParameterivEXT fp_glGetNamedFramebufferAttachmentParameterivEXT; +pfn_glGenerateTextureMipmapEXT fp_glGenerateTextureMipmapEXT; +pfn_glGenerateMultiTexMipmapEXT fp_glGenerateMultiTexMipmapEXT; +pfn_glFramebufferDrawBufferEXT fp_glFramebufferDrawBufferEXT; +pfn_glFramebufferDrawBuffersEXT fp_glFramebufferDrawBuffersEXT; +pfn_glFramebufferReadBufferEXT fp_glFramebufferReadBufferEXT; +pfn_glGetFramebufferParameterivEXT fp_glGetFramebufferParameterivEXT; +pfn_glNamedCopyBufferSubDataEXT fp_glNamedCopyBufferSubDataEXT; +pfn_glNamedFramebufferTextureEXT fp_glNamedFramebufferTextureEXT; +pfn_glNamedFramebufferTextureLayerEXT fp_glNamedFramebufferTextureLayerEXT; +pfn_glNamedFramebufferTextureFaceEXT fp_glNamedFramebufferTextureFaceEXT; +pfn_glTextureRenderbufferEXT fp_glTextureRenderbufferEXT; +pfn_glMultiTexRenderbufferEXT fp_glMultiTexRenderbufferEXT; +pfn_glVertexArrayVertexOffsetEXT fp_glVertexArrayVertexOffsetEXT; +pfn_glVertexArrayColorOffsetEXT fp_glVertexArrayColorOffsetEXT; +pfn_glVertexArrayEdgeFlagOffsetEXT fp_glVertexArrayEdgeFlagOffsetEXT; +pfn_glVertexArrayIndexOffsetEXT fp_glVertexArrayIndexOffsetEXT; +pfn_glVertexArrayNormalOffsetEXT fp_glVertexArrayNormalOffsetEXT; +pfn_glVertexArrayTexCoordOffsetEXT fp_glVertexArrayTexCoordOffsetEXT; +pfn_glVertexArrayMultiTexCoordOffsetEXT fp_glVertexArrayMultiTexCoordOffsetEXT; +pfn_glVertexArrayFogCoordOffsetEXT fp_glVertexArrayFogCoordOffsetEXT; +pfn_glVertexArraySecondaryColorOffsetEXT fp_glVertexArraySecondaryColorOffsetEXT; +pfn_glVertexArrayVertexAttribOffsetEXT fp_glVertexArrayVertexAttribOffsetEXT; +pfn_glVertexArrayVertexAttribIOffsetEXT fp_glVertexArrayVertexAttribIOffsetEXT; +pfn_glEnableVertexArrayEXT fp_glEnableVertexArrayEXT; +pfn_glDisableVertexArrayEXT fp_glDisableVertexArrayEXT; +pfn_glEnableVertexArrayAttribEXT fp_glEnableVertexArrayAttribEXT; +pfn_glDisableVertexArrayAttribEXT fp_glDisableVertexArrayAttribEXT; +pfn_glGetVertexArrayIntegervEXT fp_glGetVertexArrayIntegervEXT; +pfn_glGetVertexArrayPointervEXT fp_glGetVertexArrayPointervEXT; +pfn_glGetVertexArrayIntegeri_vEXT fp_glGetVertexArrayIntegeri_vEXT; +pfn_glGetVertexArrayPointeri_vEXT fp_glGetVertexArrayPointeri_vEXT; +pfn_glMapNamedBufferRangeEXT fp_glMapNamedBufferRangeEXT; +pfn_glFlushMappedNamedBufferRangeEXT fp_glFlushMappedNamedBufferRangeEXT; +pfn_glNamedBufferStorageEXT fp_glNamedBufferStorageEXT; +pfn_glClearNamedBufferDataEXT fp_glClearNamedBufferDataEXT; +pfn_glClearNamedBufferSubDataEXT fp_glClearNamedBufferSubDataEXT; +pfn_glNamedFramebufferParameteriEXT fp_glNamedFramebufferParameteriEXT; +pfn_glGetNamedFramebufferParameterivEXT fp_glGetNamedFramebufferParameterivEXT; +pfn_glProgramUniform1dEXT fp_glProgramUniform1dEXT; +pfn_glProgramUniform2dEXT fp_glProgramUniform2dEXT; +pfn_glProgramUniform3dEXT fp_glProgramUniform3dEXT; +pfn_glProgramUniform4dEXT fp_glProgramUniform4dEXT; +pfn_glProgramUniform1dvEXT fp_glProgramUniform1dvEXT; +pfn_glProgramUniform2dvEXT fp_glProgramUniform2dvEXT; +pfn_glProgramUniform3dvEXT fp_glProgramUniform3dvEXT; +pfn_glProgramUniform4dvEXT fp_glProgramUniform4dvEXT; +pfn_glProgramUniformMatrix2dvEXT fp_glProgramUniformMatrix2dvEXT; +pfn_glProgramUniformMatrix3dvEXT fp_glProgramUniformMatrix3dvEXT; +pfn_glProgramUniformMatrix4dvEXT fp_glProgramUniformMatrix4dvEXT; +pfn_glProgramUniformMatrix2x3dvEXT fp_glProgramUniformMatrix2x3dvEXT; +pfn_glProgramUniformMatrix2x4dvEXT fp_glProgramUniformMatrix2x4dvEXT; +pfn_glProgramUniformMatrix3x2dvEXT fp_glProgramUniformMatrix3x2dvEXT; +pfn_glProgramUniformMatrix3x4dvEXT fp_glProgramUniformMatrix3x4dvEXT; +pfn_glProgramUniformMatrix4x2dvEXT fp_glProgramUniformMatrix4x2dvEXT; +pfn_glProgramUniformMatrix4x3dvEXT fp_glProgramUniformMatrix4x3dvEXT; +pfn_glTextureBufferRangeEXT fp_glTextureBufferRangeEXT; +pfn_glTextureStorage1DEXT fp_glTextureStorage1DEXT; +pfn_glTextureStorage2DEXT fp_glTextureStorage2DEXT; +pfn_glTextureStorage3DEXT fp_glTextureStorage3DEXT; +pfn_glTextureStorage2DMultisampleEXT fp_glTextureStorage2DMultisampleEXT; +pfn_glTextureStorage3DMultisampleEXT fp_glTextureStorage3DMultisampleEXT; +pfn_glVertexArrayBindVertexBufferEXT fp_glVertexArrayBindVertexBufferEXT; +pfn_glVertexArrayVertexAttribFormatEXT fp_glVertexArrayVertexAttribFormatEXT; +pfn_glVertexArrayVertexAttribIFormatEXT fp_glVertexArrayVertexAttribIFormatEXT; +pfn_glVertexArrayVertexAttribLFormatEXT fp_glVertexArrayVertexAttribLFormatEXT; +pfn_glVertexArrayVertexAttribBindingEXT fp_glVertexArrayVertexAttribBindingEXT; +pfn_glVertexArrayVertexBindingDivisorEXT fp_glVertexArrayVertexBindingDivisorEXT; +pfn_glVertexArrayVertexAttribLOffsetEXT fp_glVertexArrayVertexAttribLOffsetEXT; +pfn_glTexturePageCommitmentEXT fp_glTexturePageCommitmentEXT; +pfn_glVertexArrayVertexAttribDivisorEXT fp_glVertexArrayVertexAttribDivisorEXT; +pfn_glDiscardFramebufferEXT fp_glDiscardFramebufferEXT; +pfn_glGenQueriesEXT fp_glGenQueriesEXT; +pfn_glDeleteQueriesEXT fp_glDeleteQueriesEXT; +pfn_glIsQueryEXT fp_glIsQueryEXT; +pfn_glBeginQueryEXT fp_glBeginQueryEXT; +pfn_glEndQueryEXT fp_glEndQueryEXT; +pfn_glQueryCounterEXT fp_glQueryCounterEXT; +pfn_glGetQueryivEXT fp_glGetQueryivEXT; +pfn_glGetQueryObjectivEXT fp_glGetQueryObjectivEXT; +pfn_glGetQueryObjectuivEXT fp_glGetQueryObjectuivEXT; +pfn_glGetQueryObjecti64vEXT fp_glGetQueryObjecti64vEXT; +pfn_glGetQueryObjectui64vEXT fp_glGetQueryObjectui64vEXT; +pfn_glDrawBuffersEXT fp_glDrawBuffersEXT; +pfn_glColorMaskIndexedEXT fp_glColorMaskIndexedEXT; +pfn_glDrawArraysInstancedEXT fp_glDrawArraysInstancedEXT; +pfn_glDrawElementsInstancedEXT fp_glDrawElementsInstancedEXT; +pfn_glFogCoordfEXT fp_glFogCoordfEXT; +pfn_glFogCoordfvEXT fp_glFogCoordfvEXT; +pfn_glFogCoorddEXT fp_glFogCoorddEXT; +pfn_glFogCoorddvEXT fp_glFogCoorddvEXT; +pfn_glFogCoordPointerEXT fp_glFogCoordPointerEXT; +pfn_glBlitFramebufferEXT fp_glBlitFramebufferEXT; +pfn_glRenderbufferStorageMultisampleEXT fp_glRenderbufferStorageMultisampleEXT; +pfn_glIsRenderbufferEXT fp_glIsRenderbufferEXT; +pfn_glBindRenderbufferEXT fp_glBindRenderbufferEXT; +pfn_glDeleteRenderbuffersEXT fp_glDeleteRenderbuffersEXT; +pfn_glGenRenderbuffersEXT fp_glGenRenderbuffersEXT; +pfn_glRenderbufferStorageEXT fp_glRenderbufferStorageEXT; +pfn_glGetRenderbufferParameterivEXT fp_glGetRenderbufferParameterivEXT; +pfn_glIsFramebufferEXT fp_glIsFramebufferEXT; +pfn_glBindFramebufferEXT fp_glBindFramebufferEXT; +pfn_glDeleteFramebuffersEXT fp_glDeleteFramebuffersEXT; +pfn_glGenFramebuffersEXT fp_glGenFramebuffersEXT; +pfn_glCheckFramebufferStatusEXT fp_glCheckFramebufferStatusEXT; +pfn_glFramebufferTexture1DEXT fp_glFramebufferTexture1DEXT; +pfn_glFramebufferTexture2DEXT fp_glFramebufferTexture2DEXT; +pfn_glFramebufferTexture3DEXT fp_glFramebufferTexture3DEXT; +pfn_glFramebufferRenderbufferEXT fp_glFramebufferRenderbufferEXT; +pfn_glGetFramebufferAttachmentParameterivEXT fp_glGetFramebufferAttachmentParameterivEXT; +pfn_glGenerateMipmapEXT fp_glGenerateMipmapEXT; +pfn_glProgramParameteriEXT fp_glProgramParameteriEXT; +pfn_glProgramEnvParameters4fvEXT fp_glProgramEnvParameters4fvEXT; +pfn_glProgramLocalParameters4fvEXT fp_glProgramLocalParameters4fvEXT; +pfn_glGetUniformuivEXT fp_glGetUniformuivEXT; +pfn_glBindFragDataLocationEXT fp_glBindFragDataLocationEXT; +pfn_glGetFragDataLocationEXT fp_glGetFragDataLocationEXT; +pfn_glUniform1uiEXT fp_glUniform1uiEXT; +pfn_glUniform2uiEXT fp_glUniform2uiEXT; +pfn_glUniform3uiEXT fp_glUniform3uiEXT; +pfn_glUniform4uiEXT fp_glUniform4uiEXT; +pfn_glUniform1uivEXT fp_glUniform1uivEXT; +pfn_glUniform2uivEXT fp_glUniform2uivEXT; +pfn_glUniform3uivEXT fp_glUniform3uivEXT; +pfn_glUniform4uivEXT fp_glUniform4uivEXT; +pfn_glGetHistogramEXT fp_glGetHistogramEXT; +pfn_glGetHistogramParameterfvEXT fp_glGetHistogramParameterfvEXT; +pfn_glGetHistogramParameterivEXT fp_glGetHistogramParameterivEXT; +pfn_glGetMinmaxEXT fp_glGetMinmaxEXT; +pfn_glGetMinmaxParameterfvEXT fp_glGetMinmaxParameterfvEXT; +pfn_glGetMinmaxParameterivEXT fp_glGetMinmaxParameterivEXT; +pfn_glHistogramEXT fp_glHistogramEXT; +pfn_glMinmaxEXT fp_glMinmaxEXT; +pfn_glResetHistogramEXT fp_glResetHistogramEXT; +pfn_glResetMinmaxEXT fp_glResetMinmaxEXT; +pfn_glIndexFuncEXT fp_glIndexFuncEXT; +pfn_glIndexMaterialEXT fp_glIndexMaterialEXT; +pfn_glVertexAttribDivisorEXT fp_glVertexAttribDivisorEXT; +pfn_glApplyTextureEXT fp_glApplyTextureEXT; +pfn_glTextureLightEXT fp_glTextureLightEXT; +pfn_glTextureMaterialEXT fp_glTextureMaterialEXT; +pfn_glMapBufferRangeEXT fp_glMapBufferRangeEXT; +pfn_glFlushMappedBufferRangeEXT fp_glFlushMappedBufferRangeEXT; +pfn_glMultiDrawArraysEXT fp_glMultiDrawArraysEXT; +pfn_glMultiDrawElementsEXT fp_glMultiDrawElementsEXT; +pfn_glSampleMaskEXT fp_glSampleMaskEXT; +pfn_glSamplePatternEXT fp_glSamplePatternEXT; +pfn_glFramebufferTexture2DMultisampleEXT fp_glFramebufferTexture2DMultisampleEXT; +pfn_glReadBufferIndexedEXT fp_glReadBufferIndexedEXT; +pfn_glDrawBuffersIndexedEXT fp_glDrawBuffersIndexedEXT; +pfn_glGetIntegeri_vEXT fp_glGetIntegeri_vEXT; +pfn_glColorTableEXT fp_glColorTableEXT; +pfn_glGetColorTableEXT fp_glGetColorTableEXT; +pfn_glGetColorTableParameterivEXT fp_glGetColorTableParameterivEXT; +pfn_glGetColorTableParameterfvEXT fp_glGetColorTableParameterfvEXT; +pfn_glPixelTransformParameteriEXT fp_glPixelTransformParameteriEXT; +pfn_glPixelTransformParameterfEXT fp_glPixelTransformParameterfEXT; +pfn_glPixelTransformParameterivEXT fp_glPixelTransformParameterivEXT; +pfn_glPixelTransformParameterfvEXT fp_glPixelTransformParameterfvEXT; +pfn_glGetPixelTransformParameterivEXT fp_glGetPixelTransformParameterivEXT; +pfn_glGetPixelTransformParameterfvEXT fp_glGetPixelTransformParameterfvEXT; +pfn_glPointParameterfEXT fp_glPointParameterfEXT; +pfn_glPointParameterfvEXT fp_glPointParameterfvEXT; +pfn_glProvokingVertexEXT fp_glProvokingVertexEXT; +pfn_glGetGraphicsResetStatusEXT fp_glGetGraphicsResetStatusEXT; +pfn_glReadnPixelsEXT fp_glReadnPixelsEXT; +pfn_glGetnUniformfvEXT fp_glGetnUniformfvEXT; +pfn_glGetnUniformivEXT fp_glGetnUniformivEXT; +pfn_glSecondaryColor3bEXT fp_glSecondaryColor3bEXT; +pfn_glSecondaryColor3bvEXT fp_glSecondaryColor3bvEXT; +pfn_glSecondaryColor3dEXT fp_glSecondaryColor3dEXT; +pfn_glSecondaryColor3dvEXT fp_glSecondaryColor3dvEXT; +pfn_glSecondaryColor3fEXT fp_glSecondaryColor3fEXT; +pfn_glSecondaryColor3fvEXT fp_glSecondaryColor3fvEXT; +pfn_glSecondaryColor3iEXT fp_glSecondaryColor3iEXT; +pfn_glSecondaryColor3ivEXT fp_glSecondaryColor3ivEXT; +pfn_glSecondaryColor3sEXT fp_glSecondaryColor3sEXT; +pfn_glSecondaryColor3svEXT fp_glSecondaryColor3svEXT; +pfn_glSecondaryColor3ubEXT fp_glSecondaryColor3ubEXT; +pfn_glSecondaryColor3ubvEXT fp_glSecondaryColor3ubvEXT; +pfn_glSecondaryColor3uiEXT fp_glSecondaryColor3uiEXT; +pfn_glSecondaryColor3uivEXT fp_glSecondaryColor3uivEXT; +pfn_glSecondaryColor3usEXT fp_glSecondaryColor3usEXT; +pfn_glSecondaryColor3usvEXT fp_glSecondaryColor3usvEXT; +pfn_glSecondaryColorPointerEXT fp_glSecondaryColorPointerEXT; +pfn_glUseShaderProgramEXT fp_glUseShaderProgramEXT; +pfn_glActiveProgramEXT fp_glActiveProgramEXT; +pfn_glCreateShaderProgramEXT fp_glCreateShaderProgramEXT; +pfn_glActiveShaderProgramEXT fp_glActiveShaderProgramEXT; +pfn_glBindProgramPipelineEXT fp_glBindProgramPipelineEXT; +pfn_glCreateShaderProgramvEXT fp_glCreateShaderProgramvEXT; +pfn_glDeleteProgramPipelinesEXT fp_glDeleteProgramPipelinesEXT; +pfn_glGenProgramPipelinesEXT fp_glGenProgramPipelinesEXT; +pfn_glGetProgramPipelineInfoLogEXT fp_glGetProgramPipelineInfoLogEXT; +pfn_glGetProgramPipelineivEXT fp_glGetProgramPipelineivEXT; +pfn_glIsProgramPipelineEXT fp_glIsProgramPipelineEXT; +pfn_glUseProgramStagesEXT fp_glUseProgramStagesEXT; +pfn_glValidateProgramPipelineEXT fp_glValidateProgramPipelineEXT; +pfn_glBindImageTextureEXT fp_glBindImageTextureEXT; +pfn_glMemoryBarrierEXT fp_glMemoryBarrierEXT; +pfn_glStencilClearTagEXT fp_glStencilClearTagEXT; +pfn_glActiveStencilFaceEXT fp_glActiveStencilFaceEXT; +pfn_glTexBufferEXT fp_glTexBufferEXT; +pfn_glTexParameterIivEXT fp_glTexParameterIivEXT; +pfn_glTexParameterIuivEXT fp_glTexParameterIuivEXT; +pfn_glGetTexParameterIivEXT fp_glGetTexParameterIivEXT; +pfn_glGetTexParameterIuivEXT fp_glGetTexParameterIuivEXT; +pfn_glClearColorIiEXT fp_glClearColorIiEXT; +pfn_glClearColorIuiEXT fp_glClearColorIuiEXT; +pfn_glTextureNormalEXT fp_glTextureNormalEXT; +pfn_glTexStorage1DEXT fp_glTexStorage1DEXT; +pfn_glTexStorage2DEXT fp_glTexStorage2DEXT; +pfn_glTexStorage3DEXT fp_glTexStorage3DEXT; +pfn_glBeginTransformFeedbackEXT fp_glBeginTransformFeedbackEXT; +pfn_glEndTransformFeedbackEXT fp_glEndTransformFeedbackEXT; +pfn_glBindBufferRangeEXT fp_glBindBufferRangeEXT; +pfn_glBindBufferOffsetEXT fp_glBindBufferOffsetEXT; +pfn_glBindBufferBaseEXT fp_glBindBufferBaseEXT; +pfn_glTransformFeedbackVaryingsEXT fp_glTransformFeedbackVaryingsEXT; +pfn_glGetTransformFeedbackVaryingEXT fp_glGetTransformFeedbackVaryingEXT; +pfn_glVertexAttribL1dEXT fp_glVertexAttribL1dEXT; +pfn_glVertexAttribL2dEXT fp_glVertexAttribL2dEXT; +pfn_glVertexAttribL3dEXT fp_glVertexAttribL3dEXT; +pfn_glVertexAttribL4dEXT fp_glVertexAttribL4dEXT; +pfn_glVertexAttribL1dvEXT fp_glVertexAttribL1dvEXT; +pfn_glVertexAttribL2dvEXT fp_glVertexAttribL2dvEXT; +pfn_glVertexAttribL3dvEXT fp_glVertexAttribL3dvEXT; +pfn_glVertexAttribL4dvEXT fp_glVertexAttribL4dvEXT; +pfn_glVertexAttribLPointerEXT fp_glVertexAttribLPointerEXT; +pfn_glGetVertexAttribLdvEXT fp_glGetVertexAttribLdvEXT; +pfn_glBeginVertexShaderEXT fp_glBeginVertexShaderEXT; +pfn_glEndVertexShaderEXT fp_glEndVertexShaderEXT; +pfn_glBindVertexShaderEXT fp_glBindVertexShaderEXT; +pfn_glGenVertexShadersEXT fp_glGenVertexShadersEXT; +pfn_glDeleteVertexShaderEXT fp_glDeleteVertexShaderEXT; +pfn_glShaderOp1EXT fp_glShaderOp1EXT; +pfn_glShaderOp2EXT fp_glShaderOp2EXT; +pfn_glShaderOp3EXT fp_glShaderOp3EXT; +pfn_glSwizzleEXT fp_glSwizzleEXT; +pfn_glWriteMaskEXT fp_glWriteMaskEXT; +pfn_glInsertComponentEXT fp_glInsertComponentEXT; +pfn_glExtractComponentEXT fp_glExtractComponentEXT; +pfn_glGenSymbolsEXT fp_glGenSymbolsEXT; +pfn_glSetInvariantEXT fp_glSetInvariantEXT; +pfn_glSetLocalConstantEXT fp_glSetLocalConstantEXT; +pfn_glVariantbvEXT fp_glVariantbvEXT; +pfn_glVariantsvEXT fp_glVariantsvEXT; +pfn_glVariantivEXT fp_glVariantivEXT; +pfn_glVariantfvEXT fp_glVariantfvEXT; +pfn_glVariantdvEXT fp_glVariantdvEXT; +pfn_glVariantubvEXT fp_glVariantubvEXT; +pfn_glVariantusvEXT fp_glVariantusvEXT; +pfn_glVariantuivEXT fp_glVariantuivEXT; +pfn_glVariantPointerEXT fp_glVariantPointerEXT; +pfn_glEnableVariantClientStateEXT fp_glEnableVariantClientStateEXT; +pfn_glDisableVariantClientStateEXT fp_glDisableVariantClientStateEXT; +pfn_glBindLightParameterEXT fp_glBindLightParameterEXT; +pfn_glBindMaterialParameterEXT fp_glBindMaterialParameterEXT; +pfn_glBindTexGenParameterEXT fp_glBindTexGenParameterEXT; +pfn_glBindTextureUnitParameterEXT fp_glBindTextureUnitParameterEXT; +pfn_glBindParameterEXT fp_glBindParameterEXT; +pfn_glIsVariantEnabledEXT fp_glIsVariantEnabledEXT; +pfn_glGetVariantBooleanvEXT fp_glGetVariantBooleanvEXT; +pfn_glGetVariantIntegervEXT fp_glGetVariantIntegervEXT; +pfn_glGetVariantFloatvEXT fp_glGetVariantFloatvEXT; +pfn_glGetVariantPointervEXT fp_glGetVariantPointervEXT; +pfn_glGetInvariantBooleanvEXT fp_glGetInvariantBooleanvEXT; +pfn_glGetInvariantIntegervEXT fp_glGetInvariantIntegervEXT; +pfn_glGetInvariantFloatvEXT fp_glGetInvariantFloatvEXT; +pfn_glGetLocalConstantBooleanvEXT fp_glGetLocalConstantBooleanvEXT; +pfn_glGetLocalConstantIntegervEXT fp_glGetLocalConstantIntegervEXT; +pfn_glGetLocalConstantFloatvEXT fp_glGetLocalConstantFloatvEXT; +pfn_glVertexWeightfEXT fp_glVertexWeightfEXT; +pfn_glVertexWeightfvEXT fp_glVertexWeightfvEXT; +pfn_glVertexWeightPointerEXT fp_glVertexWeightPointerEXT; +pfn_glImportSyncEXT fp_glImportSyncEXT; +pfn_glMultiTexCoord1bOES fp_glMultiTexCoord1bOES; +pfn_glMultiTexCoord1bvOES fp_glMultiTexCoord1bvOES; +pfn_glMultiTexCoord2bOES fp_glMultiTexCoord2bOES; +pfn_glMultiTexCoord2bvOES fp_glMultiTexCoord2bvOES; +pfn_glMultiTexCoord3bOES fp_glMultiTexCoord3bOES; +pfn_glMultiTexCoord3bvOES fp_glMultiTexCoord3bvOES; +pfn_glMultiTexCoord4bOES fp_glMultiTexCoord4bOES; +pfn_glMultiTexCoord4bvOES fp_glMultiTexCoord4bvOES; +pfn_glTexCoord1bOES fp_glTexCoord1bOES; +pfn_glTexCoord1bvOES fp_glTexCoord1bvOES; +pfn_glTexCoord2bOES fp_glTexCoord2bOES; +pfn_glTexCoord2bvOES fp_glTexCoord2bvOES; +pfn_glTexCoord3bOES fp_glTexCoord3bOES; +pfn_glTexCoord3bvOES fp_glTexCoord3bvOES; +pfn_glTexCoord4bOES fp_glTexCoord4bOES; +pfn_glTexCoord4bvOES fp_glTexCoord4bvOES; +pfn_glVertex2bOES fp_glVertex2bOES; +pfn_glVertex2bvOES fp_glVertex2bvOES; +pfn_glVertex3bOES fp_glVertex3bOES; +pfn_glVertex3bvOES fp_glVertex3bvOES; +pfn_glVertex4bOES fp_glVertex4bOES; +pfn_glVertex4bvOES fp_glVertex4bvOES; +pfn_glEGLImageTargetTexture2DOES fp_glEGLImageTargetTexture2DOES; +pfn_glEGLImageTargetRenderbufferStorageOES fp_glEGLImageTargetRenderbufferStorageOES; +pfn_glAlphaFuncxOES fp_glAlphaFuncxOES; +pfn_glClearColorxOES fp_glClearColorxOES; +pfn_glClearDepthxOES fp_glClearDepthxOES; +pfn_glClipPlanexOES fp_glClipPlanexOES; +pfn_glColor4xOES fp_glColor4xOES; +pfn_glDepthRangexOES fp_glDepthRangexOES; +pfn_glFogxOES fp_glFogxOES; +pfn_glFogxvOES fp_glFogxvOES; +pfn_glFrustumxOES fp_glFrustumxOES; +pfn_glGetClipPlanexOES fp_glGetClipPlanexOES; +pfn_glGetFixedvOES fp_glGetFixedvOES; +pfn_glGetTexEnvxvOES fp_glGetTexEnvxvOES; +pfn_glGetTexParameterxvOES fp_glGetTexParameterxvOES; +pfn_glLightModelxOES fp_glLightModelxOES; +pfn_glLightModelxvOES fp_glLightModelxvOES; +pfn_glLightxOES fp_glLightxOES; +pfn_glLightxvOES fp_glLightxvOES; +pfn_glLineWidthxOES fp_glLineWidthxOES; +pfn_glLoadMatrixxOES fp_glLoadMatrixxOES; +pfn_glMaterialxOES fp_glMaterialxOES; +pfn_glMaterialxvOES fp_glMaterialxvOES; +pfn_glMultMatrixxOES fp_glMultMatrixxOES; +pfn_glMultiTexCoord4xOES fp_glMultiTexCoord4xOES; +pfn_glNormal3xOES fp_glNormal3xOES; +pfn_glOrthoxOES fp_glOrthoxOES; +pfn_glPointParameterxvOES fp_glPointParameterxvOES; +pfn_glPointSizexOES fp_glPointSizexOES; +pfn_glPolygonOffsetxOES fp_glPolygonOffsetxOES; +pfn_glRotatexOES fp_glRotatexOES; +pfn_glSampleCoverageOES fp_glSampleCoverageOES; +pfn_glScalexOES fp_glScalexOES; +pfn_glTexEnvxOES fp_glTexEnvxOES; +pfn_glTexEnvxvOES fp_glTexEnvxvOES; +pfn_glTexParameterxOES fp_glTexParameterxOES; +pfn_glTexParameterxvOES fp_glTexParameterxvOES; +pfn_glTranslatexOES fp_glTranslatexOES; +pfn_glGetLightxvOES fp_glGetLightxvOES; +pfn_glGetMaterialxvOES fp_glGetMaterialxvOES; +pfn_glPointParameterxOES fp_glPointParameterxOES; +pfn_glSampleCoveragexOES fp_glSampleCoveragexOES; +pfn_glAccumxOES fp_glAccumxOES; +pfn_glBitmapxOES fp_glBitmapxOES; +pfn_glBlendColorxOES fp_glBlendColorxOES; +pfn_glClearAccumxOES fp_glClearAccumxOES; +pfn_glColor3xOES fp_glColor3xOES; +pfn_glColor3xvOES fp_glColor3xvOES; +pfn_glColor4xvOES fp_glColor4xvOES; +pfn_glConvolutionParameterxOES fp_glConvolutionParameterxOES; +pfn_glConvolutionParameterxvOES fp_glConvolutionParameterxvOES; +pfn_glEvalCoord1xOES fp_glEvalCoord1xOES; +pfn_glEvalCoord1xvOES fp_glEvalCoord1xvOES; +pfn_glEvalCoord2xOES fp_glEvalCoord2xOES; +pfn_glEvalCoord2xvOES fp_glEvalCoord2xvOES; +pfn_glFeedbackBufferxOES fp_glFeedbackBufferxOES; +pfn_glGetConvolutionParameterxvOES fp_glGetConvolutionParameterxvOES; +pfn_glGetHistogramParameterxvOES fp_glGetHistogramParameterxvOES; +pfn_glGetLightxOES fp_glGetLightxOES; +pfn_glGetMapxvOES fp_glGetMapxvOES; +pfn_glGetMaterialxOES fp_glGetMaterialxOES; +pfn_glGetPixelMapxv fp_glGetPixelMapxv; +pfn_glGetTexGenxvOES fp_glGetTexGenxvOES; +pfn_glGetTexLevelParameterxvOES fp_glGetTexLevelParameterxvOES; +pfn_glIndexxOES fp_glIndexxOES; +pfn_glIndexxvOES fp_glIndexxvOES; +pfn_glLoadTransposeMatrixxOES fp_glLoadTransposeMatrixxOES; +pfn_glMap1xOES fp_glMap1xOES; +pfn_glMap2xOES fp_glMap2xOES; +pfn_glMapGrid1xOES fp_glMapGrid1xOES; +pfn_glMapGrid2xOES fp_glMapGrid2xOES; +pfn_glMultTransposeMatrixxOES fp_glMultTransposeMatrixxOES; +pfn_glMultiTexCoord1xOES fp_glMultiTexCoord1xOES; +pfn_glMultiTexCoord1xvOES fp_glMultiTexCoord1xvOES; +pfn_glMultiTexCoord2xOES fp_glMultiTexCoord2xOES; +pfn_glMultiTexCoord2xvOES fp_glMultiTexCoord2xvOES; +pfn_glMultiTexCoord3xOES fp_glMultiTexCoord3xOES; +pfn_glMultiTexCoord3xvOES fp_glMultiTexCoord3xvOES; +pfn_glMultiTexCoord4xvOES fp_glMultiTexCoord4xvOES; +pfn_glNormal3xvOES fp_glNormal3xvOES; +pfn_glPassThroughxOES fp_glPassThroughxOES; +pfn_glPixelMapx fp_glPixelMapx; +pfn_glPixelStorex fp_glPixelStorex; +pfn_glPixelTransferxOES fp_glPixelTransferxOES; +pfn_glPixelZoomxOES fp_glPixelZoomxOES; +pfn_glPrioritizeTexturesxOES fp_glPrioritizeTexturesxOES; +pfn_glRasterPos2xOES fp_glRasterPos2xOES; +pfn_glRasterPos2xvOES fp_glRasterPos2xvOES; +pfn_glRasterPos3xOES fp_glRasterPos3xOES; +pfn_glRasterPos3xvOES fp_glRasterPos3xvOES; +pfn_glRasterPos4xOES fp_glRasterPos4xOES; +pfn_glRasterPos4xvOES fp_glRasterPos4xvOES; +pfn_glRectxOES fp_glRectxOES; +pfn_glRectxvOES fp_glRectxvOES; +pfn_glTexCoord1xOES fp_glTexCoord1xOES; +pfn_glTexCoord1xvOES fp_glTexCoord1xvOES; +pfn_glTexCoord2xOES fp_glTexCoord2xOES; +pfn_glTexCoord2xvOES fp_glTexCoord2xvOES; +pfn_glTexCoord3xOES fp_glTexCoord3xOES; +pfn_glTexCoord3xvOES fp_glTexCoord3xvOES; +pfn_glTexCoord4xOES fp_glTexCoord4xOES; +pfn_glTexCoord4xvOES fp_glTexCoord4xvOES; +pfn_glTexGenxOES fp_glTexGenxOES; +pfn_glTexGenxvOES fp_glTexGenxvOES; +pfn_glVertex2xOES fp_glVertex2xOES; +pfn_glVertex2xvOES fp_glVertex2xvOES; +pfn_glVertex3xOES fp_glVertex3xOES; +pfn_glVertex3xvOES fp_glVertex3xvOES; +pfn_glVertex4xOES fp_glVertex4xOES; +pfn_glVertex4xvOES fp_glVertex4xvOES; +pfn_glGetProgramBinaryOES fp_glGetProgramBinaryOES; +pfn_glProgramBinaryOES fp_glProgramBinaryOES; +pfn_glMapBufferOES fp_glMapBufferOES; +pfn_glUnmapBufferOES fp_glUnmapBufferOES; +pfn_glGetBufferPointervOES fp_glGetBufferPointervOES; +pfn_glQueryMatrixxOES fp_glQueryMatrixxOES; +pfn_glClearDepthfOES fp_glClearDepthfOES; +pfn_glClipPlanefOES fp_glClipPlanefOES; +pfn_glDepthRangefOES fp_glDepthRangefOES; +pfn_glFrustumfOES fp_glFrustumfOES; +pfn_glGetClipPlanefOES fp_glGetClipPlanefOES; +pfn_glOrthofOES fp_glOrthofOES; +pfn_glTexImage3DOES fp_glTexImage3DOES; +pfn_glTexSubImage3DOES fp_glTexSubImage3DOES; +pfn_glCopyTexSubImage3DOES fp_glCopyTexSubImage3DOES; +pfn_glCompressedTexImage3DOES fp_glCompressedTexImage3DOES; +pfn_glCompressedTexSubImage3DOES fp_glCompressedTexSubImage3DOES; +pfn_glFramebufferTexture3DOES fp_glFramebufferTexture3DOES; +pfn_glBindVertexArrayOES fp_glBindVertexArrayOES; +pfn_glDeleteVertexArraysOES fp_glDeleteVertexArraysOES; +pfn_glGenVertexArraysOES fp_glGenVertexArraysOES; +pfn_glIsVertexArrayOES fp_glIsVertexArrayOES; +pfn_glDebugMessageEnableAMD fp_glDebugMessageEnableAMD; +pfn_glDebugMessageInsertAMD fp_glDebugMessageInsertAMD; +pfn_glDebugMessageCallbackAMD fp_glDebugMessageCallbackAMD; +pfn_glGetDebugMessageLogAMD fp_glGetDebugMessageLogAMD; +pfn_glBlendFuncIndexedAMD fp_glBlendFuncIndexedAMD; +pfn_glBlendFuncSeparateIndexedAMD fp_glBlendFuncSeparateIndexedAMD; +pfn_glBlendEquationIndexedAMD fp_glBlendEquationIndexedAMD; +pfn_glBlendEquationSeparateIndexedAMD fp_glBlendEquationSeparateIndexedAMD; +pfn_glVertexAttribParameteriAMD fp_glVertexAttribParameteriAMD; +pfn_glMultiDrawArraysIndirectAMD fp_glMultiDrawArraysIndirectAMD; +pfn_glMultiDrawElementsIndirectAMD fp_glMultiDrawElementsIndirectAMD; +pfn_glGenNamesAMD fp_glGenNamesAMD; +pfn_glDeleteNamesAMD fp_glDeleteNamesAMD; +pfn_glIsNameAMD fp_glIsNameAMD; +pfn_glGetPerfMonitorGroupsAMD fp_glGetPerfMonitorGroupsAMD; +pfn_glGetPerfMonitorCountersAMD fp_glGetPerfMonitorCountersAMD; +pfn_glGetPerfMonitorGroupStringAMD fp_glGetPerfMonitorGroupStringAMD; +pfn_glGetPerfMonitorCounterStringAMD fp_glGetPerfMonitorCounterStringAMD; +pfn_glGetPerfMonitorCounterInfoAMD fp_glGetPerfMonitorCounterInfoAMD; +pfn_glGenPerfMonitorsAMD fp_glGenPerfMonitorsAMD; +pfn_glDeletePerfMonitorsAMD fp_glDeletePerfMonitorsAMD; +pfn_glSelectPerfMonitorCountersAMD fp_glSelectPerfMonitorCountersAMD; +pfn_glBeginPerfMonitorAMD fp_glBeginPerfMonitorAMD; +pfn_glEndPerfMonitorAMD fp_glEndPerfMonitorAMD; +pfn_glGetPerfMonitorCounterDataAMD fp_glGetPerfMonitorCounterDataAMD; +pfn_glSetMultisamplefvAMD fp_glSetMultisamplefvAMD; +pfn_glTexStorageSparseAMD fp_glTexStorageSparseAMD; +pfn_glTextureStorageSparseAMD fp_glTextureStorageSparseAMD; +pfn_glStencilOpValueAMD fp_glStencilOpValueAMD; +pfn_glTessellationFactorAMD fp_glTessellationFactorAMD; +pfn_glTessellationModeAMD fp_glTessellationModeAMD; +pfn_glBlitFramebufferANGLE fp_glBlitFramebufferANGLE; +pfn_glRenderbufferStorageMultisampleANGLE fp_glRenderbufferStorageMultisampleANGLE; +pfn_glDrawArraysInstancedANGLE fp_glDrawArraysInstancedANGLE; +pfn_glDrawElementsInstancedANGLE fp_glDrawElementsInstancedANGLE; +pfn_glVertexAttribDivisorANGLE fp_glVertexAttribDivisorANGLE; +pfn_glGetTranslatedShaderSourceANGLE fp_glGetTranslatedShaderSourceANGLE; +pfn_glCopyTextureLevelsAPPLE fp_glCopyTextureLevelsAPPLE; +pfn_glElementPointerAPPLE fp_glElementPointerAPPLE; +pfn_glDrawElementArrayAPPLE fp_glDrawElementArrayAPPLE; +pfn_glDrawRangeElementArrayAPPLE fp_glDrawRangeElementArrayAPPLE; +pfn_glMultiDrawElementArrayAPPLE fp_glMultiDrawElementArrayAPPLE; +pfn_glMultiDrawRangeElementArrayAPPLE fp_glMultiDrawRangeElementArrayAPPLE; +pfn_glGenFencesAPPLE fp_glGenFencesAPPLE; +pfn_glDeleteFencesAPPLE fp_glDeleteFencesAPPLE; +pfn_glSetFenceAPPLE fp_glSetFenceAPPLE; +pfn_glIsFenceAPPLE fp_glIsFenceAPPLE; +pfn_glTestFenceAPPLE fp_glTestFenceAPPLE; +pfn_glFinishFenceAPPLE fp_glFinishFenceAPPLE; +pfn_glTestObjectAPPLE fp_glTestObjectAPPLE; +pfn_glFinishObjectAPPLE fp_glFinishObjectAPPLE; +pfn_glBufferParameteriAPPLE fp_glBufferParameteriAPPLE; +pfn_glFlushMappedBufferRangeAPPLE fp_glFlushMappedBufferRangeAPPLE; +pfn_glRenderbufferStorageMultisampleAPPLE fp_glRenderbufferStorageMultisampleAPPLE; +pfn_glResolveMultisampleFramebufferAPPLE fp_glResolveMultisampleFramebufferAPPLE; +pfn_glObjectPurgeableAPPLE fp_glObjectPurgeableAPPLE; +pfn_glObjectUnpurgeableAPPLE fp_glObjectUnpurgeableAPPLE; +pfn_glGetObjectParameterivAPPLE fp_glGetObjectParameterivAPPLE; +pfn_glFenceSyncAPPLE fp_glFenceSyncAPPLE; +pfn_glIsSyncAPPLE fp_glIsSyncAPPLE; +pfn_glDeleteSyncAPPLE fp_glDeleteSyncAPPLE; +pfn_glClientWaitSyncAPPLE fp_glClientWaitSyncAPPLE; +pfn_glWaitSyncAPPLE fp_glWaitSyncAPPLE; +pfn_glGetInteger64vAPPLE fp_glGetInteger64vAPPLE; +pfn_glGetSyncivAPPLE fp_glGetSyncivAPPLE; +pfn_glTextureRangeAPPLE fp_glTextureRangeAPPLE; +pfn_glGetTexParameterPointervAPPLE fp_glGetTexParameterPointervAPPLE; +pfn_glBindVertexArrayAPPLE fp_glBindVertexArrayAPPLE; +pfn_glDeleteVertexArraysAPPLE fp_glDeleteVertexArraysAPPLE; +pfn_glGenVertexArraysAPPLE fp_glGenVertexArraysAPPLE; +pfn_glIsVertexArrayAPPLE fp_glIsVertexArrayAPPLE; +pfn_glVertexArrayRangeAPPLE fp_glVertexArrayRangeAPPLE; +pfn_glFlushVertexArrayRangeAPPLE fp_glFlushVertexArrayRangeAPPLE; +pfn_glVertexArrayParameteriAPPLE fp_glVertexArrayParameteriAPPLE; +pfn_glEnableVertexAttribAPPLE fp_glEnableVertexAttribAPPLE; +pfn_glDisableVertexAttribAPPLE fp_glDisableVertexAttribAPPLE; +pfn_glIsVertexAttribEnabledAPPLE fp_glIsVertexAttribEnabledAPPLE; +pfn_glMapVertexAttrib1dAPPLE fp_glMapVertexAttrib1dAPPLE; +pfn_glMapVertexAttrib1fAPPLE fp_glMapVertexAttrib1fAPPLE; +pfn_glMapVertexAttrib2dAPPLE fp_glMapVertexAttrib2dAPPLE; +pfn_glMapVertexAttrib2fAPPLE fp_glMapVertexAttrib2fAPPLE; +pfn_glDrawBuffersATI fp_glDrawBuffersATI; +pfn_glElementPointerATI fp_glElementPointerATI; +pfn_glDrawElementArrayATI fp_glDrawElementArrayATI; +pfn_glDrawRangeElementArrayATI fp_glDrawRangeElementArrayATI; +pfn_glTexBumpParameterivATI fp_glTexBumpParameterivATI; +pfn_glTexBumpParameterfvATI fp_glTexBumpParameterfvATI; +pfn_glGetTexBumpParameterivATI fp_glGetTexBumpParameterivATI; +pfn_glGetTexBumpParameterfvATI fp_glGetTexBumpParameterfvATI; +pfn_glGenFragmentShadersATI fp_glGenFragmentShadersATI; +pfn_glBindFragmentShaderATI fp_glBindFragmentShaderATI; +pfn_glDeleteFragmentShaderATI fp_glDeleteFragmentShaderATI; +pfn_glBeginFragmentShaderATI fp_glBeginFragmentShaderATI; +pfn_glEndFragmentShaderATI fp_glEndFragmentShaderATI; +pfn_glPassTexCoordATI fp_glPassTexCoordATI; +pfn_glSampleMapATI fp_glSampleMapATI; +pfn_glColorFragmentOp1ATI fp_glColorFragmentOp1ATI; +pfn_glColorFragmentOp2ATI fp_glColorFragmentOp2ATI; +pfn_glColorFragmentOp3ATI fp_glColorFragmentOp3ATI; +pfn_glAlphaFragmentOp1ATI fp_glAlphaFragmentOp1ATI; +pfn_glAlphaFragmentOp2ATI fp_glAlphaFragmentOp2ATI; +pfn_glAlphaFragmentOp3ATI fp_glAlphaFragmentOp3ATI; +pfn_glSetFragmentShaderConstantATI fp_glSetFragmentShaderConstantATI; +pfn_glMapObjectBufferATI fp_glMapObjectBufferATI; +pfn_glUnmapObjectBufferATI fp_glUnmapObjectBufferATI; +pfn_glPNTrianglesiATI fp_glPNTrianglesiATI; +pfn_glPNTrianglesfATI fp_glPNTrianglesfATI; +pfn_glStencilOpSeparateATI fp_glStencilOpSeparateATI; +pfn_glStencilFuncSeparateATI fp_glStencilFuncSeparateATI; +pfn_glNewObjectBufferATI fp_glNewObjectBufferATI; +pfn_glIsObjectBufferATI fp_glIsObjectBufferATI; +pfn_glUpdateObjectBufferATI fp_glUpdateObjectBufferATI; +pfn_glGetObjectBufferfvATI fp_glGetObjectBufferfvATI; +pfn_glGetObjectBufferivATI fp_glGetObjectBufferivATI; +pfn_glFreeObjectBufferATI fp_glFreeObjectBufferATI; +pfn_glArrayObjectATI fp_glArrayObjectATI; +pfn_glGetArrayObjectfvATI fp_glGetArrayObjectfvATI; +pfn_glGetArrayObjectivATI fp_glGetArrayObjectivATI; +pfn_glVariantArrayObjectATI fp_glVariantArrayObjectATI; +pfn_glGetVariantArrayObjectfvATI fp_glGetVariantArrayObjectfvATI; +pfn_glGetVariantArrayObjectivATI fp_glGetVariantArrayObjectivATI; +pfn_glVertexAttribArrayObjectATI fp_glVertexAttribArrayObjectATI; +pfn_glGetVertexAttribArrayObjectfvATI fp_glGetVertexAttribArrayObjectfvATI; +pfn_glGetVertexAttribArrayObjectivATI fp_glGetVertexAttribArrayObjectivATI; +pfn_glVertexStream1sATI fp_glVertexStream1sATI; +pfn_glVertexStream1svATI fp_glVertexStream1svATI; +pfn_glVertexStream1iATI fp_glVertexStream1iATI; +pfn_glVertexStream1ivATI fp_glVertexStream1ivATI; +pfn_glVertexStream1fATI fp_glVertexStream1fATI; +pfn_glVertexStream1fvATI fp_glVertexStream1fvATI; +pfn_glVertexStream1dATI fp_glVertexStream1dATI; +pfn_glVertexStream1dvATI fp_glVertexStream1dvATI; +pfn_glVertexStream2sATI fp_glVertexStream2sATI; +pfn_glVertexStream2svATI fp_glVertexStream2svATI; +pfn_glVertexStream2iATI fp_glVertexStream2iATI; +pfn_glVertexStream2ivATI fp_glVertexStream2ivATI; +pfn_glVertexStream2fATI fp_glVertexStream2fATI; +pfn_glVertexStream2fvATI fp_glVertexStream2fvATI; +pfn_glVertexStream2dATI fp_glVertexStream2dATI; +pfn_glVertexStream2dvATI fp_glVertexStream2dvATI; +pfn_glVertexStream3sATI fp_glVertexStream3sATI; +pfn_glVertexStream3svATI fp_glVertexStream3svATI; +pfn_glVertexStream3iATI fp_glVertexStream3iATI; +pfn_glVertexStream3ivATI fp_glVertexStream3ivATI; +pfn_glVertexStream3fATI fp_glVertexStream3fATI; +pfn_glVertexStream3fvATI fp_glVertexStream3fvATI; +pfn_glVertexStream3dATI fp_glVertexStream3dATI; +pfn_glVertexStream3dvATI fp_glVertexStream3dvATI; +pfn_glVertexStream4sATI fp_glVertexStream4sATI; +pfn_glVertexStream4svATI fp_glVertexStream4svATI; +pfn_glVertexStream4iATI fp_glVertexStream4iATI; +pfn_glVertexStream4ivATI fp_glVertexStream4ivATI; +pfn_glVertexStream4fATI fp_glVertexStream4fATI; +pfn_glVertexStream4fvATI fp_glVertexStream4fvATI; +pfn_glVertexStream4dATI fp_glVertexStream4dATI; +pfn_glVertexStream4dvATI fp_glVertexStream4dvATI; +pfn_glNormalStream3bATI fp_glNormalStream3bATI; +pfn_glNormalStream3bvATI fp_glNormalStream3bvATI; +pfn_glNormalStream3sATI fp_glNormalStream3sATI; +pfn_glNormalStream3svATI fp_glNormalStream3svATI; +pfn_glNormalStream3iATI fp_glNormalStream3iATI; +pfn_glNormalStream3ivATI fp_glNormalStream3ivATI; +pfn_glNormalStream3fATI fp_glNormalStream3fATI; +pfn_glNormalStream3fvATI fp_glNormalStream3fvATI; +pfn_glNormalStream3dATI fp_glNormalStream3dATI; +pfn_glNormalStream3dvATI fp_glNormalStream3dvATI; +pfn_glClientActiveVertexStreamATI fp_glClientActiveVertexStreamATI; +pfn_glVertexBlendEnviATI fp_glVertexBlendEnviATI; +pfn_glVertexBlendEnvfATI fp_glVertexBlendEnvfATI; +pfn_glFrameTerminatorGREMEDY fp_glFrameTerminatorGREMEDY; +pfn_glStringMarkerGREMEDY fp_glStringMarkerGREMEDY; +pfn_glRenderbufferStorageMultisampleIMG fp_glRenderbufferStorageMultisampleIMG; +pfn_glFramebufferTexture2DMultisampleIMG fp_glFramebufferTexture2DMultisampleIMG; +pfn_glBlendFuncSeparateINGR fp_glBlendFuncSeparateINGR; +pfn_glSyncTextureINTEL fp_glSyncTextureINTEL; +pfn_glUnmapTexture2DINTEL fp_glUnmapTexture2DINTEL; +pfn_glMapTexture2DINTEL fp_glMapTexture2DINTEL; +pfn_glVertexPointervINTEL fp_glVertexPointervINTEL; +pfn_glNormalPointervINTEL fp_glNormalPointervINTEL; +pfn_glColorPointervINTEL fp_glColorPointervINTEL; +pfn_glTexCoordPointervINTEL fp_glTexCoordPointervINTEL; +pfn_glResizeBuffersMESA fp_glResizeBuffersMESA; +pfn_glWindowPos2dMESA fp_glWindowPos2dMESA; +pfn_glWindowPos2dvMESA fp_glWindowPos2dvMESA; +pfn_glWindowPos2fMESA fp_glWindowPos2fMESA; +pfn_glWindowPos2fvMESA fp_glWindowPos2fvMESA; +pfn_glWindowPos2iMESA fp_glWindowPos2iMESA; +pfn_glWindowPos2ivMESA fp_glWindowPos2ivMESA; +pfn_glWindowPos2sMESA fp_glWindowPos2sMESA; +pfn_glWindowPos2svMESA fp_glWindowPos2svMESA; +pfn_glWindowPos3dMESA fp_glWindowPos3dMESA; +pfn_glWindowPos3dvMESA fp_glWindowPos3dvMESA; +pfn_glWindowPos3fMESA fp_glWindowPos3fMESA; +pfn_glWindowPos3fvMESA fp_glWindowPos3fvMESA; +pfn_glWindowPos3iMESA fp_glWindowPos3iMESA; +pfn_glWindowPos3ivMESA fp_glWindowPos3ivMESA; +pfn_glWindowPos3sMESA fp_glWindowPos3sMESA; +pfn_glWindowPos3svMESA fp_glWindowPos3svMESA; +pfn_glWindowPos4dMESA fp_glWindowPos4dMESA; +pfn_glWindowPos4dvMESA fp_glWindowPos4dvMESA; +pfn_glWindowPos4fMESA fp_glWindowPos4fMESA; +pfn_glWindowPos4fvMESA fp_glWindowPos4fvMESA; +pfn_glWindowPos4iMESA fp_glWindowPos4iMESA; +pfn_glWindowPos4ivMESA fp_glWindowPos4ivMESA; +pfn_glWindowPos4sMESA fp_glWindowPos4sMESA; +pfn_glWindowPos4svMESA fp_glWindowPos4svMESA; +pfn_glMultiDrawArraysIndirectBindlessNV fp_glMultiDrawArraysIndirectBindlessNV; +pfn_glMultiDrawElementsIndirectBindlessNV fp_glMultiDrawElementsIndirectBindlessNV; +pfn_glGetTextureHandleNV fp_glGetTextureHandleNV; +pfn_glGetTextureSamplerHandleNV fp_glGetTextureSamplerHandleNV; +pfn_glMakeTextureHandleResidentNV fp_glMakeTextureHandleResidentNV; +pfn_glMakeTextureHandleNonResidentNV fp_glMakeTextureHandleNonResidentNV; +pfn_glGetImageHandleNV fp_glGetImageHandleNV; +pfn_glMakeImageHandleResidentNV fp_glMakeImageHandleResidentNV; +pfn_glMakeImageHandleNonResidentNV fp_glMakeImageHandleNonResidentNV; +pfn_glUniformHandleui64NV fp_glUniformHandleui64NV; +pfn_glUniformHandleui64vNV fp_glUniformHandleui64vNV; +pfn_glProgramUniformHandleui64NV fp_glProgramUniformHandleui64NV; +pfn_glProgramUniformHandleui64vNV fp_glProgramUniformHandleui64vNV; +pfn_glIsTextureHandleResidentNV fp_glIsTextureHandleResidentNV; +pfn_glIsImageHandleResidentNV fp_glIsImageHandleResidentNV; +pfn_glBlendParameteriNV fp_glBlendParameteriNV; +pfn_glBlendBarrierNV fp_glBlendBarrierNV; +pfn_glBeginConditionalRenderNV fp_glBeginConditionalRenderNV; +pfn_glEndConditionalRenderNV fp_glEndConditionalRenderNV; +pfn_glCopyBufferSubDataNV fp_glCopyBufferSubDataNV; +pfn_glCopyImageSubDataNV fp_glCopyImageSubDataNV; +pfn_glCoverageMaskNV fp_glCoverageMaskNV; +pfn_glCoverageOperationNV fp_glCoverageOperationNV; +pfn_glDepthRangedNV fp_glDepthRangedNV; +pfn_glClearDepthdNV fp_glClearDepthdNV; +pfn_glDepthBoundsdNV fp_glDepthBoundsdNV; +pfn_glDrawBuffersNV fp_glDrawBuffersNV; +pfn_glDrawArraysInstancedNV fp_glDrawArraysInstancedNV; +pfn_glDrawElementsInstancedNV fp_glDrawElementsInstancedNV; +pfn_glDrawTextureNV fp_glDrawTextureNV; +pfn_glMapControlPointsNV fp_glMapControlPointsNV; +pfn_glMapParameterivNV fp_glMapParameterivNV; +pfn_glMapParameterfvNV fp_glMapParameterfvNV; +pfn_glGetMapControlPointsNV fp_glGetMapControlPointsNV; +pfn_glGetMapParameterivNV fp_glGetMapParameterivNV; +pfn_glGetMapParameterfvNV fp_glGetMapParameterfvNV; +pfn_glGetMapAttribParameterivNV fp_glGetMapAttribParameterivNV; +pfn_glGetMapAttribParameterfvNV fp_glGetMapAttribParameterfvNV; +pfn_glEvalMapsNV fp_glEvalMapsNV; +pfn_glGetMultisamplefvNV fp_glGetMultisamplefvNV; +pfn_glSampleMaskIndexedNV fp_glSampleMaskIndexedNV; +pfn_glTexRenderbufferNV fp_glTexRenderbufferNV; +pfn_glDeleteFencesNV fp_glDeleteFencesNV; +pfn_glGenFencesNV fp_glGenFencesNV; +pfn_glIsFenceNV fp_glIsFenceNV; +pfn_glTestFenceNV fp_glTestFenceNV; +pfn_glGetFenceivNV fp_glGetFenceivNV; +pfn_glFinishFenceNV fp_glFinishFenceNV; +pfn_glSetFenceNV fp_glSetFenceNV; +pfn_glProgramNamedParameter4fNV fp_glProgramNamedParameter4fNV; +pfn_glProgramNamedParameter4fvNV fp_glProgramNamedParameter4fvNV; +pfn_glProgramNamedParameter4dNV fp_glProgramNamedParameter4dNV; +pfn_glProgramNamedParameter4dvNV fp_glProgramNamedParameter4dvNV; +pfn_glGetProgramNamedParameterfvNV fp_glGetProgramNamedParameterfvNV; +pfn_glGetProgramNamedParameterdvNV fp_glGetProgramNamedParameterdvNV; +pfn_glBlitFramebufferNV fp_glBlitFramebufferNV; +pfn_glRenderbufferStorageMultisampleNV fp_glRenderbufferStorageMultisampleNV; +pfn_glRenderbufferStorageMultisampleCoverageNV fp_glRenderbufferStorageMultisampleCoverageNV; +pfn_glProgramVertexLimitNV fp_glProgramVertexLimitNV; +pfn_glFramebufferTextureEXT fp_glFramebufferTextureEXT; +pfn_glFramebufferTextureLayerEXT fp_glFramebufferTextureLayerEXT; +pfn_glFramebufferTextureFaceEXT fp_glFramebufferTextureFaceEXT; +pfn_glProgramLocalParameterI4iNV fp_glProgramLocalParameterI4iNV; +pfn_glProgramLocalParameterI4ivNV fp_glProgramLocalParameterI4ivNV; +pfn_glProgramLocalParametersI4ivNV fp_glProgramLocalParametersI4ivNV; +pfn_glProgramLocalParameterI4uiNV fp_glProgramLocalParameterI4uiNV; +pfn_glProgramLocalParameterI4uivNV fp_glProgramLocalParameterI4uivNV; +pfn_glProgramLocalParametersI4uivNV fp_glProgramLocalParametersI4uivNV; +pfn_glProgramEnvParameterI4iNV fp_glProgramEnvParameterI4iNV; +pfn_glProgramEnvParameterI4ivNV fp_glProgramEnvParameterI4ivNV; +pfn_glProgramEnvParametersI4ivNV fp_glProgramEnvParametersI4ivNV; +pfn_glProgramEnvParameterI4uiNV fp_glProgramEnvParameterI4uiNV; +pfn_glProgramEnvParameterI4uivNV fp_glProgramEnvParameterI4uivNV; +pfn_glProgramEnvParametersI4uivNV fp_glProgramEnvParametersI4uivNV; +pfn_glGetProgramLocalParameterIivNV fp_glGetProgramLocalParameterIivNV; +pfn_glGetProgramLocalParameterIuivNV fp_glGetProgramLocalParameterIuivNV; +pfn_glGetProgramEnvParameterIivNV fp_glGetProgramEnvParameterIivNV; +pfn_glGetProgramEnvParameterIuivNV fp_glGetProgramEnvParameterIuivNV; +pfn_glProgramSubroutineParametersuivNV fp_glProgramSubroutineParametersuivNV; +pfn_glGetProgramSubroutineParameteruivNV fp_glGetProgramSubroutineParameteruivNV; +pfn_glUniform1i64NV fp_glUniform1i64NV; +pfn_glUniform2i64NV fp_glUniform2i64NV; +pfn_glUniform3i64NV fp_glUniform3i64NV; +pfn_glUniform4i64NV fp_glUniform4i64NV; +pfn_glUniform1i64vNV fp_glUniform1i64vNV; +pfn_glUniform2i64vNV fp_glUniform2i64vNV; +pfn_glUniform3i64vNV fp_glUniform3i64vNV; +pfn_glUniform4i64vNV fp_glUniform4i64vNV; +pfn_glUniform1ui64NV fp_glUniform1ui64NV; +pfn_glUniform2ui64NV fp_glUniform2ui64NV; +pfn_glUniform3ui64NV fp_glUniform3ui64NV; +pfn_glUniform4ui64NV fp_glUniform4ui64NV; +pfn_glUniform1ui64vNV fp_glUniform1ui64vNV; +pfn_glUniform2ui64vNV fp_glUniform2ui64vNV; +pfn_glUniform3ui64vNV fp_glUniform3ui64vNV; +pfn_glUniform4ui64vNV fp_glUniform4ui64vNV; +pfn_glGetUniformi64vNV fp_glGetUniformi64vNV; +pfn_glProgramUniform1i64NV fp_glProgramUniform1i64NV; +pfn_glProgramUniform2i64NV fp_glProgramUniform2i64NV; +pfn_glProgramUniform3i64NV fp_glProgramUniform3i64NV; +pfn_glProgramUniform4i64NV fp_glProgramUniform4i64NV; +pfn_glProgramUniform1i64vNV fp_glProgramUniform1i64vNV; +pfn_glProgramUniform2i64vNV fp_glProgramUniform2i64vNV; +pfn_glProgramUniform3i64vNV fp_glProgramUniform3i64vNV; +pfn_glProgramUniform4i64vNV fp_glProgramUniform4i64vNV; +pfn_glProgramUniform1ui64NV fp_glProgramUniform1ui64NV; +pfn_glProgramUniform2ui64NV fp_glProgramUniform2ui64NV; +pfn_glProgramUniform3ui64NV fp_glProgramUniform3ui64NV; +pfn_glProgramUniform4ui64NV fp_glProgramUniform4ui64NV; +pfn_glProgramUniform1ui64vNV fp_glProgramUniform1ui64vNV; +pfn_glProgramUniform2ui64vNV fp_glProgramUniform2ui64vNV; +pfn_glProgramUniform3ui64vNV fp_glProgramUniform3ui64vNV; +pfn_glProgramUniform4ui64vNV fp_glProgramUniform4ui64vNV; +pfn_glVertex2hNV fp_glVertex2hNV; +pfn_glVertex2hvNV fp_glVertex2hvNV; +pfn_glVertex3hNV fp_glVertex3hNV; +pfn_glVertex3hvNV fp_glVertex3hvNV; +pfn_glVertex4hNV fp_glVertex4hNV; +pfn_glVertex4hvNV fp_glVertex4hvNV; +pfn_glNormal3hNV fp_glNormal3hNV; +pfn_glNormal3hvNV fp_glNormal3hvNV; +pfn_glColor3hNV fp_glColor3hNV; +pfn_glColor3hvNV fp_glColor3hvNV; +pfn_glColor4hNV fp_glColor4hNV; +pfn_glColor4hvNV fp_glColor4hvNV; +pfn_glTexCoord1hNV fp_glTexCoord1hNV; +pfn_glTexCoord1hvNV fp_glTexCoord1hvNV; +pfn_glTexCoord2hNV fp_glTexCoord2hNV; +pfn_glTexCoord2hvNV fp_glTexCoord2hvNV; +pfn_glTexCoord3hNV fp_glTexCoord3hNV; +pfn_glTexCoord3hvNV fp_glTexCoord3hvNV; +pfn_glTexCoord4hNV fp_glTexCoord4hNV; +pfn_glTexCoord4hvNV fp_glTexCoord4hvNV; +pfn_glMultiTexCoord1hNV fp_glMultiTexCoord1hNV; +pfn_glMultiTexCoord1hvNV fp_glMultiTexCoord1hvNV; +pfn_glMultiTexCoord2hNV fp_glMultiTexCoord2hNV; +pfn_glMultiTexCoord2hvNV fp_glMultiTexCoord2hvNV; +pfn_glMultiTexCoord3hNV fp_glMultiTexCoord3hNV; +pfn_glMultiTexCoord3hvNV fp_glMultiTexCoord3hvNV; +pfn_glMultiTexCoord4hNV fp_glMultiTexCoord4hNV; +pfn_glMultiTexCoord4hvNV fp_glMultiTexCoord4hvNV; +pfn_glFogCoordhNV fp_glFogCoordhNV; +pfn_glFogCoordhvNV fp_glFogCoordhvNV; +pfn_glSecondaryColor3hNV fp_glSecondaryColor3hNV; +pfn_glSecondaryColor3hvNV fp_glSecondaryColor3hvNV; +pfn_glVertexWeighthNV fp_glVertexWeighthNV; +pfn_glVertexWeighthvNV fp_glVertexWeighthvNV; +pfn_glVertexAttrib1hNV fp_glVertexAttrib1hNV; +pfn_glVertexAttrib1hvNV fp_glVertexAttrib1hvNV; +pfn_glVertexAttrib2hNV fp_glVertexAttrib2hNV; +pfn_glVertexAttrib2hvNV fp_glVertexAttrib2hvNV; +pfn_glVertexAttrib3hNV fp_glVertexAttrib3hNV; +pfn_glVertexAttrib3hvNV fp_glVertexAttrib3hvNV; +pfn_glVertexAttrib4hNV fp_glVertexAttrib4hNV; +pfn_glVertexAttrib4hvNV fp_glVertexAttrib4hvNV; +pfn_glVertexAttribs1hvNV fp_glVertexAttribs1hvNV; +pfn_glVertexAttribs2hvNV fp_glVertexAttribs2hvNV; +pfn_glVertexAttribs3hvNV fp_glVertexAttribs3hvNV; +pfn_glVertexAttribs4hvNV fp_glVertexAttribs4hvNV; +pfn_glVertexAttribDivisorNV fp_glVertexAttribDivisorNV; +pfn_glUniformMatrix2x3fvNV fp_glUniformMatrix2x3fvNV; +pfn_glUniformMatrix3x2fvNV fp_glUniformMatrix3x2fvNV; +pfn_glUniformMatrix2x4fvNV fp_glUniformMatrix2x4fvNV; +pfn_glUniformMatrix4x2fvNV fp_glUniformMatrix4x2fvNV; +pfn_glUniformMatrix3x4fvNV fp_glUniformMatrix3x4fvNV; +pfn_glUniformMatrix4x3fvNV fp_glUniformMatrix4x3fvNV; +pfn_glGenOcclusionQueriesNV fp_glGenOcclusionQueriesNV; +pfn_glDeleteOcclusionQueriesNV fp_glDeleteOcclusionQueriesNV; +pfn_glIsOcclusionQueryNV fp_glIsOcclusionQueryNV; +pfn_glBeginOcclusionQueryNV fp_glBeginOcclusionQueryNV; +pfn_glEndOcclusionQueryNV fp_glEndOcclusionQueryNV; +pfn_glGetOcclusionQueryivNV fp_glGetOcclusionQueryivNV; +pfn_glGetOcclusionQueryuivNV fp_glGetOcclusionQueryuivNV; +pfn_glProgramBufferParametersfvNV fp_glProgramBufferParametersfvNV; +pfn_glProgramBufferParametersIivNV fp_glProgramBufferParametersIivNV; +pfn_glProgramBufferParametersIuivNV fp_glProgramBufferParametersIuivNV; +pfn_glGenPathsNV fp_glGenPathsNV; +pfn_glDeletePathsNV fp_glDeletePathsNV; +pfn_glIsPathNV fp_glIsPathNV; +pfn_glPathCommandsNV fp_glPathCommandsNV; +pfn_glPathCoordsNV fp_glPathCoordsNV; +pfn_glPathSubCommandsNV fp_glPathSubCommandsNV; +pfn_glPathSubCoordsNV fp_glPathSubCoordsNV; +pfn_glPathStringNV fp_glPathStringNV; +pfn_glPathGlyphsNV fp_glPathGlyphsNV; +pfn_glPathGlyphRangeNV fp_glPathGlyphRangeNV; +pfn_glWeightPathsNV fp_glWeightPathsNV; +pfn_glCopyPathNV fp_glCopyPathNV; +pfn_glInterpolatePathsNV fp_glInterpolatePathsNV; +pfn_glTransformPathNV fp_glTransformPathNV; +pfn_glPathParameterivNV fp_glPathParameterivNV; +pfn_glPathParameteriNV fp_glPathParameteriNV; +pfn_glPathParameterfvNV fp_glPathParameterfvNV; +pfn_glPathParameterfNV fp_glPathParameterfNV; +pfn_glPathDashArrayNV fp_glPathDashArrayNV; +pfn_glPathStencilFuncNV fp_glPathStencilFuncNV; +pfn_glPathStencilDepthOffsetNV fp_glPathStencilDepthOffsetNV; +pfn_glStencilFillPathNV fp_glStencilFillPathNV; +pfn_glStencilStrokePathNV fp_glStencilStrokePathNV; +pfn_glStencilFillPathInstancedNV fp_glStencilFillPathInstancedNV; +pfn_glStencilStrokePathInstancedNV fp_glStencilStrokePathInstancedNV; +pfn_glPathCoverDepthFuncNV fp_glPathCoverDepthFuncNV; +pfn_glPathColorGenNV fp_glPathColorGenNV; +pfn_glPathTexGenNV fp_glPathTexGenNV; +pfn_glPathFogGenNV fp_glPathFogGenNV; +pfn_glCoverFillPathNV fp_glCoverFillPathNV; +pfn_glCoverStrokePathNV fp_glCoverStrokePathNV; +pfn_glCoverFillPathInstancedNV fp_glCoverFillPathInstancedNV; +pfn_glCoverStrokePathInstancedNV fp_glCoverStrokePathInstancedNV; +pfn_glGetPathParameterivNV fp_glGetPathParameterivNV; +pfn_glGetPathParameterfvNV fp_glGetPathParameterfvNV; +pfn_glGetPathCommandsNV fp_glGetPathCommandsNV; +pfn_glGetPathCoordsNV fp_glGetPathCoordsNV; +pfn_glGetPathDashArrayNV fp_glGetPathDashArrayNV; +pfn_glGetPathMetricsNV fp_glGetPathMetricsNV; +pfn_glGetPathMetricRangeNV fp_glGetPathMetricRangeNV; +pfn_glGetPathSpacingNV fp_glGetPathSpacingNV; +pfn_glGetPathColorGenivNV fp_glGetPathColorGenivNV; +pfn_glGetPathColorGenfvNV fp_glGetPathColorGenfvNV; +pfn_glGetPathTexGenivNV fp_glGetPathTexGenivNV; +pfn_glGetPathTexGenfvNV fp_glGetPathTexGenfvNV; +pfn_glIsPointInFillPathNV fp_glIsPointInFillPathNV; +pfn_glIsPointInStrokePathNV fp_glIsPointInStrokePathNV; +pfn_glGetPathLengthNV fp_glGetPathLengthNV; +pfn_glPointAlongPathNV fp_glPointAlongPathNV; +pfn_glPixelDataRangeNV fp_glPixelDataRangeNV; +pfn_glFlushPixelDataRangeNV fp_glFlushPixelDataRangeNV; +pfn_glPointParameteriNV fp_glPointParameteriNV; +pfn_glPointParameterivNV fp_glPointParameterivNV; +pfn_glPresentFrameKeyedNV fp_glPresentFrameKeyedNV; +pfn_glPresentFrameDualFillNV fp_glPresentFrameDualFillNV; +pfn_glGetVideoivNV fp_glGetVideoivNV; +pfn_glGetVideouivNV fp_glGetVideouivNV; +pfn_glGetVideoi64vNV fp_glGetVideoi64vNV; +pfn_glGetVideoui64vNV fp_glGetVideoui64vNV; +pfn_glPrimitiveRestartNV fp_glPrimitiveRestartNV; +pfn_glPrimitiveRestartIndexNV fp_glPrimitiveRestartIndexNV; +pfn_glReadBufferNV fp_glReadBufferNV; +pfn_glCombinerParameterfvNV fp_glCombinerParameterfvNV; +pfn_glCombinerParameterfNV fp_glCombinerParameterfNV; +pfn_glCombinerParameterivNV fp_glCombinerParameterivNV; +pfn_glCombinerParameteriNV fp_glCombinerParameteriNV; +pfn_glCombinerInputNV fp_glCombinerInputNV; +pfn_glCombinerOutputNV fp_glCombinerOutputNV; +pfn_glFinalCombinerInputNV fp_glFinalCombinerInputNV; +pfn_glGetCombinerInputParameterfvNV fp_glGetCombinerInputParameterfvNV; +pfn_glGetCombinerInputParameterivNV fp_glGetCombinerInputParameterivNV; +pfn_glGetCombinerOutputParameterfvNV fp_glGetCombinerOutputParameterfvNV; +pfn_glGetCombinerOutputParameterivNV fp_glGetCombinerOutputParameterivNV; +pfn_glGetFinalCombinerInputParameterfvNV fp_glGetFinalCombinerInputParameterfvNV; +pfn_glGetFinalCombinerInputParameterivNV fp_glGetFinalCombinerInputParameterivNV; +pfn_glCombinerStageParameterfvNV fp_glCombinerStageParameterfvNV; +pfn_glGetCombinerStageParameterfvNV fp_glGetCombinerStageParameterfvNV; +pfn_glMakeBufferResidentNV fp_glMakeBufferResidentNV; +pfn_glMakeBufferNonResidentNV fp_glMakeBufferNonResidentNV; +pfn_glIsBufferResidentNV fp_glIsBufferResidentNV; +pfn_glMakeNamedBufferResidentNV fp_glMakeNamedBufferResidentNV; +pfn_glMakeNamedBufferNonResidentNV fp_glMakeNamedBufferNonResidentNV; +pfn_glIsNamedBufferResidentNV fp_glIsNamedBufferResidentNV; +pfn_glGetBufferParameterui64vNV fp_glGetBufferParameterui64vNV; +pfn_glGetNamedBufferParameterui64vNV fp_glGetNamedBufferParameterui64vNV; +pfn_glGetIntegerui64vNV fp_glGetIntegerui64vNV; +pfn_glUniformui64NV fp_glUniformui64NV; +pfn_glUniformui64vNV fp_glUniformui64vNV; +pfn_glGetUniformui64vNV fp_glGetUniformui64vNV; +pfn_glProgramUniformui64NV fp_glProgramUniformui64NV; +pfn_glProgramUniformui64vNV fp_glProgramUniformui64vNV; +pfn_glTextureBarrierNV fp_glTextureBarrierNV; +pfn_glTexImage2DMultisampleCoverageNV fp_glTexImage2DMultisampleCoverageNV; +pfn_glTexImage3DMultisampleCoverageNV fp_glTexImage3DMultisampleCoverageNV; +pfn_glTextureImage2DMultisampleNV fp_glTextureImage2DMultisampleNV; +pfn_glTextureImage3DMultisampleNV fp_glTextureImage3DMultisampleNV; +pfn_glTextureImage2DMultisampleCoverageNV fp_glTextureImage2DMultisampleCoverageNV; +pfn_glTextureImage3DMultisampleCoverageNV fp_glTextureImage3DMultisampleCoverageNV; +pfn_glBeginTransformFeedbackNV fp_glBeginTransformFeedbackNV; +pfn_glEndTransformFeedbackNV fp_glEndTransformFeedbackNV; +pfn_glTransformFeedbackAttribsNV fp_glTransformFeedbackAttribsNV; +pfn_glBindBufferRangeNV fp_glBindBufferRangeNV; +pfn_glBindBufferOffsetNV fp_glBindBufferOffsetNV; +pfn_glBindBufferBaseNV fp_glBindBufferBaseNV; +pfn_glTransformFeedbackVaryingsNV fp_glTransformFeedbackVaryingsNV; +pfn_glActiveVaryingNV fp_glActiveVaryingNV; +pfn_glGetVaryingLocationNV fp_glGetVaryingLocationNV; +pfn_glGetActiveVaryingNV fp_glGetActiveVaryingNV; +pfn_glGetTransformFeedbackVaryingNV fp_glGetTransformFeedbackVaryingNV; +pfn_glTransformFeedbackStreamAttribsNV fp_glTransformFeedbackStreamAttribsNV; +pfn_glBindTransformFeedbackNV fp_glBindTransformFeedbackNV; +pfn_glDeleteTransformFeedbacksNV fp_glDeleteTransformFeedbacksNV; +pfn_glGenTransformFeedbacksNV fp_glGenTransformFeedbacksNV; +pfn_glIsTransformFeedbackNV fp_glIsTransformFeedbackNV; +pfn_glPauseTransformFeedbackNV fp_glPauseTransformFeedbackNV; +pfn_glResumeTransformFeedbackNV fp_glResumeTransformFeedbackNV; +pfn_glDrawTransformFeedbackNV fp_glDrawTransformFeedbackNV; +pfn_glVDPAUInitNV fp_glVDPAUInitNV; +pfn_glVDPAUFiniNV fp_glVDPAUFiniNV; +pfn_glVDPAURegisterVideoSurfaceNV fp_glVDPAURegisterVideoSurfaceNV; +pfn_glVDPAURegisterOutputSurfaceNV fp_glVDPAURegisterOutputSurfaceNV; +pfn_glVDPAUIsSurfaceNV fp_glVDPAUIsSurfaceNV; +pfn_glVDPAUUnregisterSurfaceNV fp_glVDPAUUnregisterSurfaceNV; +pfn_glVDPAUGetSurfaceivNV fp_glVDPAUGetSurfaceivNV; +pfn_glVDPAUSurfaceAccessNV fp_glVDPAUSurfaceAccessNV; +pfn_glVDPAUMapSurfacesNV fp_glVDPAUMapSurfacesNV; +pfn_glVDPAUUnmapSurfacesNV fp_glVDPAUUnmapSurfacesNV; +pfn_glFlushVertexArrayRangeNV fp_glFlushVertexArrayRangeNV; +pfn_glVertexArrayRangeNV fp_glVertexArrayRangeNV; +pfn_glVertexAttribL1i64NV fp_glVertexAttribL1i64NV; +pfn_glVertexAttribL2i64NV fp_glVertexAttribL2i64NV; +pfn_glVertexAttribL3i64NV fp_glVertexAttribL3i64NV; +pfn_glVertexAttribL4i64NV fp_glVertexAttribL4i64NV; +pfn_glVertexAttribL1i64vNV fp_glVertexAttribL1i64vNV; +pfn_glVertexAttribL2i64vNV fp_glVertexAttribL2i64vNV; +pfn_glVertexAttribL3i64vNV fp_glVertexAttribL3i64vNV; +pfn_glVertexAttribL4i64vNV fp_glVertexAttribL4i64vNV; +pfn_glVertexAttribL1ui64NV fp_glVertexAttribL1ui64NV; +pfn_glVertexAttribL2ui64NV fp_glVertexAttribL2ui64NV; +pfn_glVertexAttribL3ui64NV fp_glVertexAttribL3ui64NV; +pfn_glVertexAttribL4ui64NV fp_glVertexAttribL4ui64NV; +pfn_glVertexAttribL1ui64vNV fp_glVertexAttribL1ui64vNV; +pfn_glVertexAttribL2ui64vNV fp_glVertexAttribL2ui64vNV; +pfn_glVertexAttribL3ui64vNV fp_glVertexAttribL3ui64vNV; +pfn_glVertexAttribL4ui64vNV fp_glVertexAttribL4ui64vNV; +pfn_glGetVertexAttribLi64vNV fp_glGetVertexAttribLi64vNV; +pfn_glGetVertexAttribLui64vNV fp_glGetVertexAttribLui64vNV; +pfn_glVertexAttribLFormatNV fp_glVertexAttribLFormatNV; +pfn_glBufferAddressRangeNV fp_glBufferAddressRangeNV; +pfn_glVertexFormatNV fp_glVertexFormatNV; +pfn_glNormalFormatNV fp_glNormalFormatNV; +pfn_glColorFormatNV fp_glColorFormatNV; +pfn_glIndexFormatNV fp_glIndexFormatNV; +pfn_glTexCoordFormatNV fp_glTexCoordFormatNV; +pfn_glEdgeFlagFormatNV fp_glEdgeFlagFormatNV; +pfn_glSecondaryColorFormatNV fp_glSecondaryColorFormatNV; +pfn_glFogCoordFormatNV fp_glFogCoordFormatNV; +pfn_glVertexAttribFormatNV fp_glVertexAttribFormatNV; +pfn_glVertexAttribIFormatNV fp_glVertexAttribIFormatNV; +pfn_glGetIntegerui64i_vNV fp_glGetIntegerui64i_vNV; +pfn_glAreProgramsResidentNV fp_glAreProgramsResidentNV; +pfn_glBindProgramNV fp_glBindProgramNV; +pfn_glDeleteProgramsNV fp_glDeleteProgramsNV; +pfn_glExecuteProgramNV fp_glExecuteProgramNV; +pfn_glGenProgramsNV fp_glGenProgramsNV; +pfn_glGetProgramParameterdvNV fp_glGetProgramParameterdvNV; +pfn_glGetProgramParameterfvNV fp_glGetProgramParameterfvNV; +pfn_glGetProgramivNV fp_glGetProgramivNV; +pfn_glGetProgramStringNV fp_glGetProgramStringNV; +pfn_glGetTrackMatrixivNV fp_glGetTrackMatrixivNV; +pfn_glGetVertexAttribdvNV fp_glGetVertexAttribdvNV; +pfn_glGetVertexAttribfvNV fp_glGetVertexAttribfvNV; +pfn_glGetVertexAttribivNV fp_glGetVertexAttribivNV; +pfn_glGetVertexAttribPointervNV fp_glGetVertexAttribPointervNV; +pfn_glIsProgramNV fp_glIsProgramNV; +pfn_glLoadProgramNV fp_glLoadProgramNV; +pfn_glProgramParameter4dNV fp_glProgramParameter4dNV; +pfn_glProgramParameter4dvNV fp_glProgramParameter4dvNV; +pfn_glProgramParameter4fNV fp_glProgramParameter4fNV; +pfn_glProgramParameter4fvNV fp_glProgramParameter4fvNV; +pfn_glProgramParameters4dvNV fp_glProgramParameters4dvNV; +pfn_glProgramParameters4fvNV fp_glProgramParameters4fvNV; +pfn_glRequestResidentProgramsNV fp_glRequestResidentProgramsNV; +pfn_glTrackMatrixNV fp_glTrackMatrixNV; +pfn_glVertexAttribPointerNV fp_glVertexAttribPointerNV; +pfn_glVertexAttrib1dNV fp_glVertexAttrib1dNV; +pfn_glVertexAttrib1dvNV fp_glVertexAttrib1dvNV; +pfn_glVertexAttrib1fNV fp_glVertexAttrib1fNV; +pfn_glVertexAttrib1fvNV fp_glVertexAttrib1fvNV; +pfn_glVertexAttrib1sNV fp_glVertexAttrib1sNV; +pfn_glVertexAttrib1svNV fp_glVertexAttrib1svNV; +pfn_glVertexAttrib2dNV fp_glVertexAttrib2dNV; +pfn_glVertexAttrib2dvNV fp_glVertexAttrib2dvNV; +pfn_glVertexAttrib2fNV fp_glVertexAttrib2fNV; +pfn_glVertexAttrib2fvNV fp_glVertexAttrib2fvNV; +pfn_glVertexAttrib2sNV fp_glVertexAttrib2sNV; +pfn_glVertexAttrib2svNV fp_glVertexAttrib2svNV; +pfn_glVertexAttrib3dNV fp_glVertexAttrib3dNV; +pfn_glVertexAttrib3dvNV fp_glVertexAttrib3dvNV; +pfn_glVertexAttrib3fNV fp_glVertexAttrib3fNV; +pfn_glVertexAttrib3fvNV fp_glVertexAttrib3fvNV; +pfn_glVertexAttrib3sNV fp_glVertexAttrib3sNV; +pfn_glVertexAttrib3svNV fp_glVertexAttrib3svNV; +pfn_glVertexAttrib4dNV fp_glVertexAttrib4dNV; +pfn_glVertexAttrib4dvNV fp_glVertexAttrib4dvNV; +pfn_glVertexAttrib4fNV fp_glVertexAttrib4fNV; +pfn_glVertexAttrib4fvNV fp_glVertexAttrib4fvNV; +pfn_glVertexAttrib4sNV fp_glVertexAttrib4sNV; +pfn_glVertexAttrib4svNV fp_glVertexAttrib4svNV; +pfn_glVertexAttrib4ubNV fp_glVertexAttrib4ubNV; +pfn_glVertexAttrib4ubvNV fp_glVertexAttrib4ubvNV; +pfn_glVertexAttribs1dvNV fp_glVertexAttribs1dvNV; +pfn_glVertexAttribs1fvNV fp_glVertexAttribs1fvNV; +pfn_glVertexAttribs1svNV fp_glVertexAttribs1svNV; +pfn_glVertexAttribs2dvNV fp_glVertexAttribs2dvNV; +pfn_glVertexAttribs2fvNV fp_glVertexAttribs2fvNV; +pfn_glVertexAttribs2svNV fp_glVertexAttribs2svNV; +pfn_glVertexAttribs3dvNV fp_glVertexAttribs3dvNV; +pfn_glVertexAttribs3fvNV fp_glVertexAttribs3fvNV; +pfn_glVertexAttribs3svNV fp_glVertexAttribs3svNV; +pfn_glVertexAttribs4dvNV fp_glVertexAttribs4dvNV; +pfn_glVertexAttribs4fvNV fp_glVertexAttribs4fvNV; +pfn_glVertexAttribs4svNV fp_glVertexAttribs4svNV; +pfn_glVertexAttribs4ubvNV fp_glVertexAttribs4ubvNV; +pfn_glVertexAttribI1iEXT fp_glVertexAttribI1iEXT; +pfn_glVertexAttribI2iEXT fp_glVertexAttribI2iEXT; +pfn_glVertexAttribI3iEXT fp_glVertexAttribI3iEXT; +pfn_glVertexAttribI4iEXT fp_glVertexAttribI4iEXT; +pfn_glVertexAttribI1uiEXT fp_glVertexAttribI1uiEXT; +pfn_glVertexAttribI2uiEXT fp_glVertexAttribI2uiEXT; +pfn_glVertexAttribI3uiEXT fp_glVertexAttribI3uiEXT; +pfn_glVertexAttribI4uiEXT fp_glVertexAttribI4uiEXT; +pfn_glVertexAttribI1ivEXT fp_glVertexAttribI1ivEXT; +pfn_glVertexAttribI2ivEXT fp_glVertexAttribI2ivEXT; +pfn_glVertexAttribI3ivEXT fp_glVertexAttribI3ivEXT; +pfn_glVertexAttribI4ivEXT fp_glVertexAttribI4ivEXT; +pfn_glVertexAttribI1uivEXT fp_glVertexAttribI1uivEXT; +pfn_glVertexAttribI2uivEXT fp_glVertexAttribI2uivEXT; +pfn_glVertexAttribI3uivEXT fp_glVertexAttribI3uivEXT; +pfn_glVertexAttribI4uivEXT fp_glVertexAttribI4uivEXT; +pfn_glVertexAttribI4bvEXT fp_glVertexAttribI4bvEXT; +pfn_glVertexAttribI4svEXT fp_glVertexAttribI4svEXT; +pfn_glVertexAttribI4ubvEXT fp_glVertexAttribI4ubvEXT; +pfn_glVertexAttribI4usvEXT fp_glVertexAttribI4usvEXT; +pfn_glVertexAttribIPointerEXT fp_glVertexAttribIPointerEXT; +pfn_glGetVertexAttribIivEXT fp_glGetVertexAttribIivEXT; +pfn_glGetVertexAttribIuivEXT fp_glGetVertexAttribIuivEXT; +pfn_glBeginVideoCaptureNV fp_glBeginVideoCaptureNV; +pfn_glBindVideoCaptureStreamBufferNV fp_glBindVideoCaptureStreamBufferNV; +pfn_glBindVideoCaptureStreamTextureNV fp_glBindVideoCaptureStreamTextureNV; +pfn_glEndVideoCaptureNV fp_glEndVideoCaptureNV; +pfn_glGetVideoCaptureivNV fp_glGetVideoCaptureivNV; +pfn_glGetVideoCaptureStreamivNV fp_glGetVideoCaptureStreamivNV; +pfn_glGetVideoCaptureStreamfvNV fp_glGetVideoCaptureStreamfvNV; +pfn_glGetVideoCaptureStreamdvNV fp_glGetVideoCaptureStreamdvNV; +pfn_glVideoCaptureNV fp_glVideoCaptureNV; +pfn_glVideoCaptureStreamParameterivNV fp_glVideoCaptureStreamParameterivNV; +pfn_glVideoCaptureStreamParameterfvNV fp_glVideoCaptureStreamParameterfvNV; +pfn_glVideoCaptureStreamParameterdvNV fp_glVideoCaptureStreamParameterdvNV; +pfn_glBeginConditionalRenderNVX fp_glBeginConditionalRenderNVX; +pfn_glEndConditionalRenderNVX fp_glEndConditionalRenderNVX; +pfn_glHintPGI fp_glHintPGI; +pfn_glAlphaFuncQCOM fp_glAlphaFuncQCOM; +pfn_glGetDriverControlsQCOM fp_glGetDriverControlsQCOM; +pfn_glGetDriverControlStringQCOM fp_glGetDriverControlStringQCOM; +pfn_glEnableDriverControlQCOM fp_glEnableDriverControlQCOM; +pfn_glDisableDriverControlQCOM fp_glDisableDriverControlQCOM; +pfn_glExtGetTexturesQCOM fp_glExtGetTexturesQCOM; +pfn_glExtGetBuffersQCOM fp_glExtGetBuffersQCOM; +pfn_glExtGetRenderbuffersQCOM fp_glExtGetRenderbuffersQCOM; +pfn_glExtGetFramebuffersQCOM fp_glExtGetFramebuffersQCOM; +pfn_glExtGetTexLevelParameterivQCOM fp_glExtGetTexLevelParameterivQCOM; +pfn_glExtTexObjectStateOverrideiQCOM fp_glExtTexObjectStateOverrideiQCOM; +pfn_glExtGetTexSubImageQCOM fp_glExtGetTexSubImageQCOM; +pfn_glExtGetBufferPointervQCOM fp_glExtGetBufferPointervQCOM; +pfn_glExtGetShadersQCOM fp_glExtGetShadersQCOM; +pfn_glExtGetProgramsQCOM fp_glExtGetProgramsQCOM; +pfn_glExtIsProgramBinaryQCOM fp_glExtIsProgramBinaryQCOM; +pfn_glExtGetProgramBinarySourceQCOM fp_glExtGetProgramBinarySourceQCOM; +pfn_glStartTilingQCOM fp_glStartTilingQCOM; +pfn_glEndTilingQCOM fp_glEndTilingQCOM; + +GLboolean GLAD_VERSION_1_0 = GL_FALSE; +static void load_GL_VERSION_1_0(LOADER load) { + if(!GLAD_VERSION_1_0) return; + fp_glCullFace = (pfn_glCullFace)load("glCullFace"); + fp_glFrontFace = (pfn_glFrontFace)load("glFrontFace"); + fp_glHint = (pfn_glHint)load("glHint"); + fp_glLineWidth = (pfn_glLineWidth)load("glLineWidth"); + fp_glPointSize = (pfn_glPointSize)load("glPointSize"); + fp_glPolygonMode = (pfn_glPolygonMode)load("glPolygonMode"); + fp_glScissor = (pfn_glScissor)load("glScissor"); + fp_glTexParameterf = (pfn_glTexParameterf)load("glTexParameterf"); + fp_glTexParameterfv = (pfn_glTexParameterfv)load("glTexParameterfv"); + fp_glTexParameteri = (pfn_glTexParameteri)load("glTexParameteri"); + fp_glTexParameteriv = (pfn_glTexParameteriv)load("glTexParameteriv"); + fp_glTexImage1D = (pfn_glTexImage1D)load("glTexImage1D"); + fp_glTexImage2D = (pfn_glTexImage2D)load("glTexImage2D"); + fp_glDrawBuffer = (pfn_glDrawBuffer)load("glDrawBuffer"); + fp_glClear = (pfn_glClear)load("glClear"); + fp_glClearColor = (pfn_glClearColor)load("glClearColor"); + fp_glClearStencil = (pfn_glClearStencil)load("glClearStencil"); + fp_glClearDepth = (pfn_glClearDepth)load("glClearDepth"); + fp_glStencilMask = (pfn_glStencilMask)load("glStencilMask"); + fp_glColorMask = (pfn_glColorMask)load("glColorMask"); + fp_glDepthMask = (pfn_glDepthMask)load("glDepthMask"); + fp_glDisable = (pfn_glDisable)load("glDisable"); + fp_glEnable = (pfn_glEnable)load("glEnable"); + fp_glFinish = (pfn_glFinish)load("glFinish"); + fp_glFlush = (pfn_glFlush)load("glFlush"); + fp_glBlendFunc = (pfn_glBlendFunc)load("glBlendFunc"); + fp_glLogicOp = (pfn_glLogicOp)load("glLogicOp"); + fp_glStencilFunc = (pfn_glStencilFunc)load("glStencilFunc"); + fp_glStencilOp = (pfn_glStencilOp)load("glStencilOp"); + fp_glDepthFunc = (pfn_glDepthFunc)load("glDepthFunc"); + fp_glPixelStoref = (pfn_glPixelStoref)load("glPixelStoref"); + fp_glPixelStorei = (pfn_glPixelStorei)load("glPixelStorei"); + fp_glReadBuffer = (pfn_glReadBuffer)load("glReadBuffer"); + fp_glReadPixels = (pfn_glReadPixels)load("glReadPixels"); + fp_glGetBooleanv = (pfn_glGetBooleanv)load("glGetBooleanv"); + fp_glGetDoublev = (pfn_glGetDoublev)load("glGetDoublev"); + fp_glGetError = (pfn_glGetError)load("glGetError"); + fp_glGetFloatv = (pfn_glGetFloatv)load("glGetFloatv"); + fp_glGetIntegerv = (pfn_glGetIntegerv)load("glGetIntegerv"); + fp_glGetString = (pfn_glGetString)load("glGetString"); + fp_glGetTexImage = (pfn_glGetTexImage)load("glGetTexImage"); + fp_glGetTexParameterfv = (pfn_glGetTexParameterfv)load("glGetTexParameterfv"); + fp_glGetTexParameteriv = (pfn_glGetTexParameteriv)load("glGetTexParameteriv"); + fp_glGetTexLevelParameterfv = (pfn_glGetTexLevelParameterfv)load("glGetTexLevelParameterfv"); + fp_glGetTexLevelParameteriv = (pfn_glGetTexLevelParameteriv)load("glGetTexLevelParameteriv"); + fp_glIsEnabled = (pfn_glIsEnabled)load("glIsEnabled"); + fp_glDepthRange = (pfn_glDepthRange)load("glDepthRange"); + fp_glViewport = (pfn_glViewport)load("glViewport"); + fp_glNewList = (pfn_glNewList)load("glNewList"); + fp_glEndList = (pfn_glEndList)load("glEndList"); + fp_glCallList = (pfn_glCallList)load("glCallList"); + fp_glCallLists = (pfn_glCallLists)load("glCallLists"); + fp_glDeleteLists = (pfn_glDeleteLists)load("glDeleteLists"); + fp_glGenLists = (pfn_glGenLists)load("glGenLists"); + fp_glListBase = (pfn_glListBase)load("glListBase"); + fp_glBegin = (pfn_glBegin)load("glBegin"); + fp_glBitmap = (pfn_glBitmap)load("glBitmap"); + fp_glColor3b = (pfn_glColor3b)load("glColor3b"); + fp_glColor3bv = (pfn_glColor3bv)load("glColor3bv"); + fp_glColor3d = (pfn_glColor3d)load("glColor3d"); + fp_glColor3dv = (pfn_glColor3dv)load("glColor3dv"); + fp_glColor3f = (pfn_glColor3f)load("glColor3f"); + fp_glColor3fv = (pfn_glColor3fv)load("glColor3fv"); + fp_glColor3i = (pfn_glColor3i)load("glColor3i"); + fp_glColor3iv = (pfn_glColor3iv)load("glColor3iv"); + fp_glColor3s = (pfn_glColor3s)load("glColor3s"); + fp_glColor3sv = (pfn_glColor3sv)load("glColor3sv"); + fp_glColor3ub = (pfn_glColor3ub)load("glColor3ub"); + fp_glColor3ubv = (pfn_glColor3ubv)load("glColor3ubv"); + fp_glColor3ui = (pfn_glColor3ui)load("glColor3ui"); + fp_glColor3uiv = (pfn_glColor3uiv)load("glColor3uiv"); + fp_glColor3us = (pfn_glColor3us)load("glColor3us"); + fp_glColor3usv = (pfn_glColor3usv)load("glColor3usv"); + fp_glColor4b = (pfn_glColor4b)load("glColor4b"); + fp_glColor4bv = (pfn_glColor4bv)load("glColor4bv"); + fp_glColor4d = (pfn_glColor4d)load("glColor4d"); + fp_glColor4dv = (pfn_glColor4dv)load("glColor4dv"); + fp_glColor4f = (pfn_glColor4f)load("glColor4f"); + fp_glColor4fv = (pfn_glColor4fv)load("glColor4fv"); + fp_glColor4i = (pfn_glColor4i)load("glColor4i"); + fp_glColor4iv = (pfn_glColor4iv)load("glColor4iv"); + fp_glColor4s = (pfn_glColor4s)load("glColor4s"); + fp_glColor4sv = (pfn_glColor4sv)load("glColor4sv"); + fp_glColor4ub = (pfn_glColor4ub)load("glColor4ub"); + fp_glColor4ubv = (pfn_glColor4ubv)load("glColor4ubv"); + fp_glColor4ui = (pfn_glColor4ui)load("glColor4ui"); + fp_glColor4uiv = (pfn_glColor4uiv)load("glColor4uiv"); + fp_glColor4us = (pfn_glColor4us)load("glColor4us"); + fp_glColor4usv = (pfn_glColor4usv)load("glColor4usv"); + fp_glEdgeFlag = (pfn_glEdgeFlag)load("glEdgeFlag"); + fp_glEdgeFlagv = (pfn_glEdgeFlagv)load("glEdgeFlagv"); + fp_glEnd = (pfn_glEnd)load("glEnd"); + fp_glIndexd = (pfn_glIndexd)load("glIndexd"); + fp_glIndexdv = (pfn_glIndexdv)load("glIndexdv"); + fp_glIndexf = (pfn_glIndexf)load("glIndexf"); + fp_glIndexfv = (pfn_glIndexfv)load("glIndexfv"); + fp_glIndexi = (pfn_glIndexi)load("glIndexi"); + fp_glIndexiv = (pfn_glIndexiv)load("glIndexiv"); + fp_glIndexs = (pfn_glIndexs)load("glIndexs"); + fp_glIndexsv = (pfn_glIndexsv)load("glIndexsv"); + fp_glNormal3b = (pfn_glNormal3b)load("glNormal3b"); + fp_glNormal3bv = (pfn_glNormal3bv)load("glNormal3bv"); + fp_glNormal3d = (pfn_glNormal3d)load("glNormal3d"); + fp_glNormal3dv = (pfn_glNormal3dv)load("glNormal3dv"); + fp_glNormal3f = (pfn_glNormal3f)load("glNormal3f"); + fp_glNormal3fv = (pfn_glNormal3fv)load("glNormal3fv"); + fp_glNormal3i = (pfn_glNormal3i)load("glNormal3i"); + fp_glNormal3iv = (pfn_glNormal3iv)load("glNormal3iv"); + fp_glNormal3s = (pfn_glNormal3s)load("glNormal3s"); + fp_glNormal3sv = (pfn_glNormal3sv)load("glNormal3sv"); + fp_glRasterPos2d = (pfn_glRasterPos2d)load("glRasterPos2d"); + fp_glRasterPos2dv = (pfn_glRasterPos2dv)load("glRasterPos2dv"); + fp_glRasterPos2f = (pfn_glRasterPos2f)load("glRasterPos2f"); + fp_glRasterPos2fv = (pfn_glRasterPos2fv)load("glRasterPos2fv"); + fp_glRasterPos2i = (pfn_glRasterPos2i)load("glRasterPos2i"); + fp_glRasterPos2iv = (pfn_glRasterPos2iv)load("glRasterPos2iv"); + fp_glRasterPos2s = (pfn_glRasterPos2s)load("glRasterPos2s"); + fp_glRasterPos2sv = (pfn_glRasterPos2sv)load("glRasterPos2sv"); + fp_glRasterPos3d = (pfn_glRasterPos3d)load("glRasterPos3d"); + fp_glRasterPos3dv = (pfn_glRasterPos3dv)load("glRasterPos3dv"); + fp_glRasterPos3f = (pfn_glRasterPos3f)load("glRasterPos3f"); + fp_glRasterPos3fv = (pfn_glRasterPos3fv)load("glRasterPos3fv"); + fp_glRasterPos3i = (pfn_glRasterPos3i)load("glRasterPos3i"); + fp_glRasterPos3iv = (pfn_glRasterPos3iv)load("glRasterPos3iv"); + fp_glRasterPos3s = (pfn_glRasterPos3s)load("glRasterPos3s"); + fp_glRasterPos3sv = (pfn_glRasterPos3sv)load("glRasterPos3sv"); + fp_glRasterPos4d = (pfn_glRasterPos4d)load("glRasterPos4d"); + fp_glRasterPos4dv = (pfn_glRasterPos4dv)load("glRasterPos4dv"); + fp_glRasterPos4f = (pfn_glRasterPos4f)load("glRasterPos4f"); + fp_glRasterPos4fv = (pfn_glRasterPos4fv)load("glRasterPos4fv"); + fp_glRasterPos4i = (pfn_glRasterPos4i)load("glRasterPos4i"); + fp_glRasterPos4iv = (pfn_glRasterPos4iv)load("glRasterPos4iv"); + fp_glRasterPos4s = (pfn_glRasterPos4s)load("glRasterPos4s"); + fp_glRasterPos4sv = (pfn_glRasterPos4sv)load("glRasterPos4sv"); + fp_glRectd = (pfn_glRectd)load("glRectd"); + fp_glRectdv = (pfn_glRectdv)load("glRectdv"); + fp_glRectf = (pfn_glRectf)load("glRectf"); + fp_glRectfv = (pfn_glRectfv)load("glRectfv"); + fp_glRecti = (pfn_glRecti)load("glRecti"); + fp_glRectiv = (pfn_glRectiv)load("glRectiv"); + fp_glRects = (pfn_glRects)load("glRects"); + fp_glRectsv = (pfn_glRectsv)load("glRectsv"); + fp_glTexCoord1d = (pfn_glTexCoord1d)load("glTexCoord1d"); + fp_glTexCoord1dv = (pfn_glTexCoord1dv)load("glTexCoord1dv"); + fp_glTexCoord1f = (pfn_glTexCoord1f)load("glTexCoord1f"); + fp_glTexCoord1fv = (pfn_glTexCoord1fv)load("glTexCoord1fv"); + fp_glTexCoord1i = (pfn_glTexCoord1i)load("glTexCoord1i"); + fp_glTexCoord1iv = (pfn_glTexCoord1iv)load("glTexCoord1iv"); + fp_glTexCoord1s = (pfn_glTexCoord1s)load("glTexCoord1s"); + fp_glTexCoord1sv = (pfn_glTexCoord1sv)load("glTexCoord1sv"); + fp_glTexCoord2d = (pfn_glTexCoord2d)load("glTexCoord2d"); + fp_glTexCoord2dv = (pfn_glTexCoord2dv)load("glTexCoord2dv"); + fp_glTexCoord2f = (pfn_glTexCoord2f)load("glTexCoord2f"); + fp_glTexCoord2fv = (pfn_glTexCoord2fv)load("glTexCoord2fv"); + fp_glTexCoord2i = (pfn_glTexCoord2i)load("glTexCoord2i"); + fp_glTexCoord2iv = (pfn_glTexCoord2iv)load("glTexCoord2iv"); + fp_glTexCoord2s = (pfn_glTexCoord2s)load("glTexCoord2s"); + fp_glTexCoord2sv = (pfn_glTexCoord2sv)load("glTexCoord2sv"); + fp_glTexCoord3d = (pfn_glTexCoord3d)load("glTexCoord3d"); + fp_glTexCoord3dv = (pfn_glTexCoord3dv)load("glTexCoord3dv"); + fp_glTexCoord3f = (pfn_glTexCoord3f)load("glTexCoord3f"); + fp_glTexCoord3fv = (pfn_glTexCoord3fv)load("glTexCoord3fv"); + fp_glTexCoord3i = (pfn_glTexCoord3i)load("glTexCoord3i"); + fp_glTexCoord3iv = (pfn_glTexCoord3iv)load("glTexCoord3iv"); + fp_glTexCoord3s = (pfn_glTexCoord3s)load("glTexCoord3s"); + fp_glTexCoord3sv = (pfn_glTexCoord3sv)load("glTexCoord3sv"); + fp_glTexCoord4d = (pfn_glTexCoord4d)load("glTexCoord4d"); + fp_glTexCoord4dv = (pfn_glTexCoord4dv)load("glTexCoord4dv"); + fp_glTexCoord4f = (pfn_glTexCoord4f)load("glTexCoord4f"); + fp_glTexCoord4fv = (pfn_glTexCoord4fv)load("glTexCoord4fv"); + fp_glTexCoord4i = (pfn_glTexCoord4i)load("glTexCoord4i"); + fp_glTexCoord4iv = (pfn_glTexCoord4iv)load("glTexCoord4iv"); + fp_glTexCoord4s = (pfn_glTexCoord4s)load("glTexCoord4s"); + fp_glTexCoord4sv = (pfn_glTexCoord4sv)load("glTexCoord4sv"); + fp_glVertex2d = (pfn_glVertex2d)load("glVertex2d"); + fp_glVertex2dv = (pfn_glVertex2dv)load("glVertex2dv"); + fp_glVertex2f = (pfn_glVertex2f)load("glVertex2f"); + fp_glVertex2fv = (pfn_glVertex2fv)load("glVertex2fv"); + fp_glVertex2i = (pfn_glVertex2i)load("glVertex2i"); + fp_glVertex2iv = (pfn_glVertex2iv)load("glVertex2iv"); + fp_glVertex2s = (pfn_glVertex2s)load("glVertex2s"); + fp_glVertex2sv = (pfn_glVertex2sv)load("glVertex2sv"); + fp_glVertex3d = (pfn_glVertex3d)load("glVertex3d"); + fp_glVertex3dv = (pfn_glVertex3dv)load("glVertex3dv"); + fp_glVertex3f = (pfn_glVertex3f)load("glVertex3f"); + fp_glVertex3fv = (pfn_glVertex3fv)load("glVertex3fv"); + fp_glVertex3i = (pfn_glVertex3i)load("glVertex3i"); + fp_glVertex3iv = (pfn_glVertex3iv)load("glVertex3iv"); + fp_glVertex3s = (pfn_glVertex3s)load("glVertex3s"); + fp_glVertex3sv = (pfn_glVertex3sv)load("glVertex3sv"); + fp_glVertex4d = (pfn_glVertex4d)load("glVertex4d"); + fp_glVertex4dv = (pfn_glVertex4dv)load("glVertex4dv"); + fp_glVertex4f = (pfn_glVertex4f)load("glVertex4f"); + fp_glVertex4fv = (pfn_glVertex4fv)load("glVertex4fv"); + fp_glVertex4i = (pfn_glVertex4i)load("glVertex4i"); + fp_glVertex4iv = (pfn_glVertex4iv)load("glVertex4iv"); + fp_glVertex4s = (pfn_glVertex4s)load("glVertex4s"); + fp_glVertex4sv = (pfn_glVertex4sv)load("glVertex4sv"); + fp_glClipPlane = (pfn_glClipPlane)load("glClipPlane"); + fp_glColorMaterial = (pfn_glColorMaterial)load("glColorMaterial"); + fp_glFogf = (pfn_glFogf)load("glFogf"); + fp_glFogfv = (pfn_glFogfv)load("glFogfv"); + fp_glFogi = (pfn_glFogi)load("glFogi"); + fp_glFogiv = (pfn_glFogiv)load("glFogiv"); + fp_glLightf = (pfn_glLightf)load("glLightf"); + fp_glLightfv = (pfn_glLightfv)load("glLightfv"); + fp_glLighti = (pfn_glLighti)load("glLighti"); + fp_glLightiv = (pfn_glLightiv)load("glLightiv"); + fp_glLightModelf = (pfn_glLightModelf)load("glLightModelf"); + fp_glLightModelfv = (pfn_glLightModelfv)load("glLightModelfv"); + fp_glLightModeli = (pfn_glLightModeli)load("glLightModeli"); + fp_glLightModeliv = (pfn_glLightModeliv)load("glLightModeliv"); + fp_glLineStipple = (pfn_glLineStipple)load("glLineStipple"); + fp_glMaterialf = (pfn_glMaterialf)load("glMaterialf"); + fp_glMaterialfv = (pfn_glMaterialfv)load("glMaterialfv"); + fp_glMateriali = (pfn_glMateriali)load("glMateriali"); + fp_glMaterialiv = (pfn_glMaterialiv)load("glMaterialiv"); + fp_glPolygonStipple = (pfn_glPolygonStipple)load("glPolygonStipple"); + fp_glShadeModel = (pfn_glShadeModel)load("glShadeModel"); + fp_glTexEnvf = (pfn_glTexEnvf)load("glTexEnvf"); + fp_glTexEnvfv = (pfn_glTexEnvfv)load("glTexEnvfv"); + fp_glTexEnvi = (pfn_glTexEnvi)load("glTexEnvi"); + fp_glTexEnviv = (pfn_glTexEnviv)load("glTexEnviv"); + fp_glTexGend = (pfn_glTexGend)load("glTexGend"); + fp_glTexGendv = (pfn_glTexGendv)load("glTexGendv"); + fp_glTexGenf = (pfn_glTexGenf)load("glTexGenf"); + fp_glTexGenfv = (pfn_glTexGenfv)load("glTexGenfv"); + fp_glTexGeni = (pfn_glTexGeni)load("glTexGeni"); + fp_glTexGeniv = (pfn_glTexGeniv)load("glTexGeniv"); + fp_glFeedbackBuffer = (pfn_glFeedbackBuffer)load("glFeedbackBuffer"); + fp_glSelectBuffer = (pfn_glSelectBuffer)load("glSelectBuffer"); + fp_glRenderMode = (pfn_glRenderMode)load("glRenderMode"); + fp_glInitNames = (pfn_glInitNames)load("glInitNames"); + fp_glLoadName = (pfn_glLoadName)load("glLoadName"); + fp_glPassThrough = (pfn_glPassThrough)load("glPassThrough"); + fp_glPopName = (pfn_glPopName)load("glPopName"); + fp_glPushName = (pfn_glPushName)load("glPushName"); + fp_glClearAccum = (pfn_glClearAccum)load("glClearAccum"); + fp_glClearIndex = (pfn_glClearIndex)load("glClearIndex"); + fp_glIndexMask = (pfn_glIndexMask)load("glIndexMask"); + fp_glAccum = (pfn_glAccum)load("glAccum"); + fp_glPopAttrib = (pfn_glPopAttrib)load("glPopAttrib"); + fp_glPushAttrib = (pfn_glPushAttrib)load("glPushAttrib"); + fp_glMap1d = (pfn_glMap1d)load("glMap1d"); + fp_glMap1f = (pfn_glMap1f)load("glMap1f"); + fp_glMap2d = (pfn_glMap2d)load("glMap2d"); + fp_glMap2f = (pfn_glMap2f)load("glMap2f"); + fp_glMapGrid1d = (pfn_glMapGrid1d)load("glMapGrid1d"); + fp_glMapGrid1f = (pfn_glMapGrid1f)load("glMapGrid1f"); + fp_glMapGrid2d = (pfn_glMapGrid2d)load("glMapGrid2d"); + fp_glMapGrid2f = (pfn_glMapGrid2f)load("glMapGrid2f"); + fp_glEvalCoord1d = (pfn_glEvalCoord1d)load("glEvalCoord1d"); + fp_glEvalCoord1dv = (pfn_glEvalCoord1dv)load("glEvalCoord1dv"); + fp_glEvalCoord1f = (pfn_glEvalCoord1f)load("glEvalCoord1f"); + fp_glEvalCoord1fv = (pfn_glEvalCoord1fv)load("glEvalCoord1fv"); + fp_glEvalCoord2d = (pfn_glEvalCoord2d)load("glEvalCoord2d"); + fp_glEvalCoord2dv = (pfn_glEvalCoord2dv)load("glEvalCoord2dv"); + fp_glEvalCoord2f = (pfn_glEvalCoord2f)load("glEvalCoord2f"); + fp_glEvalCoord2fv = (pfn_glEvalCoord2fv)load("glEvalCoord2fv"); + fp_glEvalMesh1 = (pfn_glEvalMesh1)load("glEvalMesh1"); + fp_glEvalPoint1 = (pfn_glEvalPoint1)load("glEvalPoint1"); + fp_glEvalMesh2 = (pfn_glEvalMesh2)load("glEvalMesh2"); + fp_glEvalPoint2 = (pfn_glEvalPoint2)load("glEvalPoint2"); + fp_glAlphaFunc = (pfn_glAlphaFunc)load("glAlphaFunc"); + fp_glPixelZoom = (pfn_glPixelZoom)load("glPixelZoom"); + fp_glPixelTransferf = (pfn_glPixelTransferf)load("glPixelTransferf"); + fp_glPixelTransferi = (pfn_glPixelTransferi)load("glPixelTransferi"); + fp_glPixelMapfv = (pfn_glPixelMapfv)load("glPixelMapfv"); + fp_glPixelMapuiv = (pfn_glPixelMapuiv)load("glPixelMapuiv"); + fp_glPixelMapusv = (pfn_glPixelMapusv)load("glPixelMapusv"); + fp_glCopyPixels = (pfn_glCopyPixels)load("glCopyPixels"); + fp_glDrawPixels = (pfn_glDrawPixels)load("glDrawPixels"); + fp_glGetClipPlane = (pfn_glGetClipPlane)load("glGetClipPlane"); + fp_glGetLightfv = (pfn_glGetLightfv)load("glGetLightfv"); + fp_glGetLightiv = (pfn_glGetLightiv)load("glGetLightiv"); + fp_glGetMapdv = (pfn_glGetMapdv)load("glGetMapdv"); + fp_glGetMapfv = (pfn_glGetMapfv)load("glGetMapfv"); + fp_glGetMapiv = (pfn_glGetMapiv)load("glGetMapiv"); + fp_glGetMaterialfv = (pfn_glGetMaterialfv)load("glGetMaterialfv"); + fp_glGetMaterialiv = (pfn_glGetMaterialiv)load("glGetMaterialiv"); + fp_glGetPixelMapfv = (pfn_glGetPixelMapfv)load("glGetPixelMapfv"); + fp_glGetPixelMapuiv = (pfn_glGetPixelMapuiv)load("glGetPixelMapuiv"); + fp_glGetPixelMapusv = (pfn_glGetPixelMapusv)load("glGetPixelMapusv"); + fp_glGetPolygonStipple = (pfn_glGetPolygonStipple)load("glGetPolygonStipple"); + fp_glGetTexEnvfv = (pfn_glGetTexEnvfv)load("glGetTexEnvfv"); + fp_glGetTexEnviv = (pfn_glGetTexEnviv)load("glGetTexEnviv"); + fp_glGetTexGendv = (pfn_glGetTexGendv)load("glGetTexGendv"); + fp_glGetTexGenfv = (pfn_glGetTexGenfv)load("glGetTexGenfv"); + fp_glGetTexGeniv = (pfn_glGetTexGeniv)load("glGetTexGeniv"); + fp_glIsList = (pfn_glIsList)load("glIsList"); + fp_glFrustum = (pfn_glFrustum)load("glFrustum"); + fp_glLoadIdentity = (pfn_glLoadIdentity)load("glLoadIdentity"); + fp_glLoadMatrixf = (pfn_glLoadMatrixf)load("glLoadMatrixf"); + fp_glLoadMatrixd = (pfn_glLoadMatrixd)load("glLoadMatrixd"); + fp_glMatrixMode = (pfn_glMatrixMode)load("glMatrixMode"); + fp_glMultMatrixf = (pfn_glMultMatrixf)load("glMultMatrixf"); + fp_glMultMatrixd = (pfn_glMultMatrixd)load("glMultMatrixd"); + fp_glOrtho = (pfn_glOrtho)load("glOrtho"); + fp_glPopMatrix = (pfn_glPopMatrix)load("glPopMatrix"); + fp_glPushMatrix = (pfn_glPushMatrix)load("glPushMatrix"); + fp_glRotated = (pfn_glRotated)load("glRotated"); + fp_glRotatef = (pfn_glRotatef)load("glRotatef"); + fp_glScaled = (pfn_glScaled)load("glScaled"); + fp_glScalef = (pfn_glScalef)load("glScalef"); + fp_glTranslated = (pfn_glTranslated)load("glTranslated"); + fp_glTranslatef = (pfn_glTranslatef)load("glTranslatef"); +} + +GLboolean GLAD_VERSION_1_1 = GL_FALSE; +static void load_GL_VERSION_1_1(LOADER load) { + if(!GLAD_VERSION_1_1) return; + fp_glDrawArrays = (pfn_glDrawArrays)load("glDrawArrays"); + fp_glDrawElements = (pfn_glDrawElements)load("glDrawElements"); + fp_glGetPointerv = (pfn_glGetPointerv)load("glGetPointerv"); + fp_glPolygonOffset = (pfn_glPolygonOffset)load("glPolygonOffset"); + fp_glCopyTexImage1D = (pfn_glCopyTexImage1D)load("glCopyTexImage1D"); + fp_glCopyTexImage2D = (pfn_glCopyTexImage2D)load("glCopyTexImage2D"); + fp_glCopyTexSubImage1D = (pfn_glCopyTexSubImage1D)load("glCopyTexSubImage1D"); + fp_glCopyTexSubImage2D = (pfn_glCopyTexSubImage2D)load("glCopyTexSubImage2D"); + fp_glTexSubImage1D = (pfn_glTexSubImage1D)load("glTexSubImage1D"); + fp_glTexSubImage2D = (pfn_glTexSubImage2D)load("glTexSubImage2D"); + fp_glBindTexture = (pfn_glBindTexture)load("glBindTexture"); + fp_glDeleteTextures = (pfn_glDeleteTextures)load("glDeleteTextures"); + fp_glGenTextures = (pfn_glGenTextures)load("glGenTextures"); + fp_glIsTexture = (pfn_glIsTexture)load("glIsTexture"); + fp_glArrayElement = (pfn_glArrayElement)load("glArrayElement"); + fp_glColorPointer = (pfn_glColorPointer)load("glColorPointer"); + fp_glDisableClientState = (pfn_glDisableClientState)load("glDisableClientState"); + fp_glEdgeFlagPointer = (pfn_glEdgeFlagPointer)load("glEdgeFlagPointer"); + fp_glEnableClientState = (pfn_glEnableClientState)load("glEnableClientState"); + fp_glIndexPointer = (pfn_glIndexPointer)load("glIndexPointer"); + fp_glInterleavedArrays = (pfn_glInterleavedArrays)load("glInterleavedArrays"); + fp_glNormalPointer = (pfn_glNormalPointer)load("glNormalPointer"); + fp_glTexCoordPointer = (pfn_glTexCoordPointer)load("glTexCoordPointer"); + fp_glVertexPointer = (pfn_glVertexPointer)load("glVertexPointer"); + fp_glAreTexturesResident = (pfn_glAreTexturesResident)load("glAreTexturesResident"); + fp_glPrioritizeTextures = (pfn_glPrioritizeTextures)load("glPrioritizeTextures"); + fp_glIndexub = (pfn_glIndexub)load("glIndexub"); + fp_glIndexubv = (pfn_glIndexubv)load("glIndexubv"); + fp_glPopClientAttrib = (pfn_glPopClientAttrib)load("glPopClientAttrib"); + fp_glPushClientAttrib = (pfn_glPushClientAttrib)load("glPushClientAttrib"); +} + +GLboolean GLAD_VERSION_1_2 = GL_FALSE; +static void load_GL_VERSION_1_2(LOADER load) { + if(!GLAD_VERSION_1_2) return; + fp_glDrawRangeElements = (pfn_glDrawRangeElements)load("glDrawRangeElements"); + fp_glTexImage3D = (pfn_glTexImage3D)load("glTexImage3D"); + fp_glTexSubImage3D = (pfn_glTexSubImage3D)load("glTexSubImage3D"); + fp_glCopyTexSubImage3D = (pfn_glCopyTexSubImage3D)load("glCopyTexSubImage3D"); +} + +GLboolean GLAD_VERSION_1_3 = GL_FALSE; +static void load_GL_VERSION_1_3(LOADER load) { + if(!GLAD_VERSION_1_3) return; + fp_glActiveTexture = (pfn_glActiveTexture)load("glActiveTexture"); + fp_glSampleCoverage = (pfn_glSampleCoverage)load("glSampleCoverage"); + fp_glCompressedTexImage3D = (pfn_glCompressedTexImage3D)load("glCompressedTexImage3D"); + fp_glCompressedTexImage2D = (pfn_glCompressedTexImage2D)load("glCompressedTexImage2D"); + fp_glCompressedTexImage1D = (pfn_glCompressedTexImage1D)load("glCompressedTexImage1D"); + fp_glCompressedTexSubImage3D = (pfn_glCompressedTexSubImage3D)load("glCompressedTexSubImage3D"); + fp_glCompressedTexSubImage2D = (pfn_glCompressedTexSubImage2D)load("glCompressedTexSubImage2D"); + fp_glCompressedTexSubImage1D = (pfn_glCompressedTexSubImage1D)load("glCompressedTexSubImage1D"); + fp_glGetCompressedTexImage = (pfn_glGetCompressedTexImage)load("glGetCompressedTexImage"); + fp_glClientActiveTexture = (pfn_glClientActiveTexture)load("glClientActiveTexture"); + fp_glMultiTexCoord1d = (pfn_glMultiTexCoord1d)load("glMultiTexCoord1d"); + fp_glMultiTexCoord1dv = (pfn_glMultiTexCoord1dv)load("glMultiTexCoord1dv"); + fp_glMultiTexCoord1f = (pfn_glMultiTexCoord1f)load("glMultiTexCoord1f"); + fp_glMultiTexCoord1fv = (pfn_glMultiTexCoord1fv)load("glMultiTexCoord1fv"); + fp_glMultiTexCoord1i = (pfn_glMultiTexCoord1i)load("glMultiTexCoord1i"); + fp_glMultiTexCoord1iv = (pfn_glMultiTexCoord1iv)load("glMultiTexCoord1iv"); + fp_glMultiTexCoord1s = (pfn_glMultiTexCoord1s)load("glMultiTexCoord1s"); + fp_glMultiTexCoord1sv = (pfn_glMultiTexCoord1sv)load("glMultiTexCoord1sv"); + fp_glMultiTexCoord2d = (pfn_glMultiTexCoord2d)load("glMultiTexCoord2d"); + fp_glMultiTexCoord2dv = (pfn_glMultiTexCoord2dv)load("glMultiTexCoord2dv"); + fp_glMultiTexCoord2f = (pfn_glMultiTexCoord2f)load("glMultiTexCoord2f"); + fp_glMultiTexCoord2fv = (pfn_glMultiTexCoord2fv)load("glMultiTexCoord2fv"); + fp_glMultiTexCoord2i = (pfn_glMultiTexCoord2i)load("glMultiTexCoord2i"); + fp_glMultiTexCoord2iv = (pfn_glMultiTexCoord2iv)load("glMultiTexCoord2iv"); + fp_glMultiTexCoord2s = (pfn_glMultiTexCoord2s)load("glMultiTexCoord2s"); + fp_glMultiTexCoord2sv = (pfn_glMultiTexCoord2sv)load("glMultiTexCoord2sv"); + fp_glMultiTexCoord3d = (pfn_glMultiTexCoord3d)load("glMultiTexCoord3d"); + fp_glMultiTexCoord3dv = (pfn_glMultiTexCoord3dv)load("glMultiTexCoord3dv"); + fp_glMultiTexCoord3f = (pfn_glMultiTexCoord3f)load("glMultiTexCoord3f"); + fp_glMultiTexCoord3fv = (pfn_glMultiTexCoord3fv)load("glMultiTexCoord3fv"); + fp_glMultiTexCoord3i = (pfn_glMultiTexCoord3i)load("glMultiTexCoord3i"); + fp_glMultiTexCoord3iv = (pfn_glMultiTexCoord3iv)load("glMultiTexCoord3iv"); + fp_glMultiTexCoord3s = (pfn_glMultiTexCoord3s)load("glMultiTexCoord3s"); + fp_glMultiTexCoord3sv = (pfn_glMultiTexCoord3sv)load("glMultiTexCoord3sv"); + fp_glMultiTexCoord4d = (pfn_glMultiTexCoord4d)load("glMultiTexCoord4d"); + fp_glMultiTexCoord4dv = (pfn_glMultiTexCoord4dv)load("glMultiTexCoord4dv"); + fp_glMultiTexCoord4f = (pfn_glMultiTexCoord4f)load("glMultiTexCoord4f"); + fp_glMultiTexCoord4fv = (pfn_glMultiTexCoord4fv)load("glMultiTexCoord4fv"); + fp_glMultiTexCoord4i = (pfn_glMultiTexCoord4i)load("glMultiTexCoord4i"); + fp_glMultiTexCoord4iv = (pfn_glMultiTexCoord4iv)load("glMultiTexCoord4iv"); + fp_glMultiTexCoord4s = (pfn_glMultiTexCoord4s)load("glMultiTexCoord4s"); + fp_glMultiTexCoord4sv = (pfn_glMultiTexCoord4sv)load("glMultiTexCoord4sv"); + fp_glLoadTransposeMatrixf = (pfn_glLoadTransposeMatrixf)load("glLoadTransposeMatrixf"); + fp_glLoadTransposeMatrixd = (pfn_glLoadTransposeMatrixd)load("glLoadTransposeMatrixd"); + fp_glMultTransposeMatrixf = (pfn_glMultTransposeMatrixf)load("glMultTransposeMatrixf"); + fp_glMultTransposeMatrixd = (pfn_glMultTransposeMatrixd)load("glMultTransposeMatrixd"); +} + +GLboolean GLAD_VERSION_1_4 = GL_FALSE; +static void load_GL_VERSION_1_4(LOADER load) { + if(!GLAD_VERSION_1_4) return; + fp_glBlendFuncSeparate = (pfn_glBlendFuncSeparate)load("glBlendFuncSeparate"); + fp_glMultiDrawArrays = (pfn_glMultiDrawArrays)load("glMultiDrawArrays"); + fp_glMultiDrawElements = (pfn_glMultiDrawElements)load("glMultiDrawElements"); + fp_glPointParameterf = (pfn_glPointParameterf)load("glPointParameterf"); + fp_glPointParameterfv = (pfn_glPointParameterfv)load("glPointParameterfv"); + fp_glPointParameteri = (pfn_glPointParameteri)load("glPointParameteri"); + fp_glPointParameteriv = (pfn_glPointParameteriv)load("glPointParameteriv"); + fp_glFogCoordf = (pfn_glFogCoordf)load("glFogCoordf"); + fp_glFogCoordfv = (pfn_glFogCoordfv)load("glFogCoordfv"); + fp_glFogCoordd = (pfn_glFogCoordd)load("glFogCoordd"); + fp_glFogCoorddv = (pfn_glFogCoorddv)load("glFogCoorddv"); + fp_glFogCoordPointer = (pfn_glFogCoordPointer)load("glFogCoordPointer"); + fp_glSecondaryColor3b = (pfn_glSecondaryColor3b)load("glSecondaryColor3b"); + fp_glSecondaryColor3bv = (pfn_glSecondaryColor3bv)load("glSecondaryColor3bv"); + fp_glSecondaryColor3d = (pfn_glSecondaryColor3d)load("glSecondaryColor3d"); + fp_glSecondaryColor3dv = (pfn_glSecondaryColor3dv)load("glSecondaryColor3dv"); + fp_glSecondaryColor3f = (pfn_glSecondaryColor3f)load("glSecondaryColor3f"); + fp_glSecondaryColor3fv = (pfn_glSecondaryColor3fv)load("glSecondaryColor3fv"); + fp_glSecondaryColor3i = (pfn_glSecondaryColor3i)load("glSecondaryColor3i"); + fp_glSecondaryColor3iv = (pfn_glSecondaryColor3iv)load("glSecondaryColor3iv"); + fp_glSecondaryColor3s = (pfn_glSecondaryColor3s)load("glSecondaryColor3s"); + fp_glSecondaryColor3sv = (pfn_glSecondaryColor3sv)load("glSecondaryColor3sv"); + fp_glSecondaryColor3ub = (pfn_glSecondaryColor3ub)load("glSecondaryColor3ub"); + fp_glSecondaryColor3ubv = (pfn_glSecondaryColor3ubv)load("glSecondaryColor3ubv"); + fp_glSecondaryColor3ui = (pfn_glSecondaryColor3ui)load("glSecondaryColor3ui"); + fp_glSecondaryColor3uiv = (pfn_glSecondaryColor3uiv)load("glSecondaryColor3uiv"); + fp_glSecondaryColor3us = (pfn_glSecondaryColor3us)load("glSecondaryColor3us"); + fp_glSecondaryColor3usv = (pfn_glSecondaryColor3usv)load("glSecondaryColor3usv"); + fp_glSecondaryColorPointer = (pfn_glSecondaryColorPointer)load("glSecondaryColorPointer"); + fp_glWindowPos2d = (pfn_glWindowPos2d)load("glWindowPos2d"); + fp_glWindowPos2dv = (pfn_glWindowPos2dv)load("glWindowPos2dv"); + fp_glWindowPos2f = (pfn_glWindowPos2f)load("glWindowPos2f"); + fp_glWindowPos2fv = (pfn_glWindowPos2fv)load("glWindowPos2fv"); + fp_glWindowPos2i = (pfn_glWindowPos2i)load("glWindowPos2i"); + fp_glWindowPos2iv = (pfn_glWindowPos2iv)load("glWindowPos2iv"); + fp_glWindowPos2s = (pfn_glWindowPos2s)load("glWindowPos2s"); + fp_glWindowPos2sv = (pfn_glWindowPos2sv)load("glWindowPos2sv"); + fp_glWindowPos3d = (pfn_glWindowPos3d)load("glWindowPos3d"); + fp_glWindowPos3dv = (pfn_glWindowPos3dv)load("glWindowPos3dv"); + fp_glWindowPos3f = (pfn_glWindowPos3f)load("glWindowPos3f"); + fp_glWindowPos3fv = (pfn_glWindowPos3fv)load("glWindowPos3fv"); + fp_glWindowPos3i = (pfn_glWindowPos3i)load("glWindowPos3i"); + fp_glWindowPos3iv = (pfn_glWindowPos3iv)load("glWindowPos3iv"); + fp_glWindowPos3s = (pfn_glWindowPos3s)load("glWindowPos3s"); + fp_glWindowPos3sv = (pfn_glWindowPos3sv)load("glWindowPos3sv"); + fp_glBlendColor = (pfn_glBlendColor)load("glBlendColor"); + fp_glBlendEquation = (pfn_glBlendEquation)load("glBlendEquation"); +} + +GLboolean GLAD_VERSION_1_5 = GL_FALSE; +static void load_GL_VERSION_1_5(LOADER load) { + if(!GLAD_VERSION_1_5) return; + fp_glGenQueries = (pfn_glGenQueries)load("glGenQueries"); + fp_glDeleteQueries = (pfn_glDeleteQueries)load("glDeleteQueries"); + fp_glIsQuery = (pfn_glIsQuery)load("glIsQuery"); + fp_glBeginQuery = (pfn_glBeginQuery)load("glBeginQuery"); + fp_glEndQuery = (pfn_glEndQuery)load("glEndQuery"); + fp_glGetQueryiv = (pfn_glGetQueryiv)load("glGetQueryiv"); + fp_glGetQueryObjectiv = (pfn_glGetQueryObjectiv)load("glGetQueryObjectiv"); + fp_glGetQueryObjectuiv = (pfn_glGetQueryObjectuiv)load("glGetQueryObjectuiv"); + fp_glBindBuffer = (pfn_glBindBuffer)load("glBindBuffer"); + fp_glDeleteBuffers = (pfn_glDeleteBuffers)load("glDeleteBuffers"); + fp_glGenBuffers = (pfn_glGenBuffers)load("glGenBuffers"); + fp_glIsBuffer = (pfn_glIsBuffer)load("glIsBuffer"); + fp_glBufferData = (pfn_glBufferData)load("glBufferData"); + fp_glBufferSubData = (pfn_glBufferSubData)load("glBufferSubData"); + fp_glGetBufferSubData = (pfn_glGetBufferSubData)load("glGetBufferSubData"); + fp_glMapBuffer = (pfn_glMapBuffer)load("glMapBuffer"); + fp_glUnmapBuffer = (pfn_glUnmapBuffer)load("glUnmapBuffer"); + fp_glGetBufferParameteriv = (pfn_glGetBufferParameteriv)load("glGetBufferParameteriv"); + fp_glGetBufferPointerv = (pfn_glGetBufferPointerv)load("glGetBufferPointerv"); +} + +GLboolean GLAD_VERSION_2_0 = GL_FALSE; +static void load_GL_VERSION_2_0(LOADER load) { + if(!GLAD_VERSION_2_0) return; + fp_glBlendEquationSeparate = (pfn_glBlendEquationSeparate)load("glBlendEquationSeparate"); + fp_glDrawBuffers = (pfn_glDrawBuffers)load("glDrawBuffers"); + fp_glStencilOpSeparate = (pfn_glStencilOpSeparate)load("glStencilOpSeparate"); + fp_glStencilFuncSeparate = (pfn_glStencilFuncSeparate)load("glStencilFuncSeparate"); + fp_glStencilMaskSeparate = (pfn_glStencilMaskSeparate)load("glStencilMaskSeparate"); + fp_glAttachShader = (pfn_glAttachShader)load("glAttachShader"); + fp_glBindAttribLocation = (pfn_glBindAttribLocation)load("glBindAttribLocation"); + fp_glCompileShader = (pfn_glCompileShader)load("glCompileShader"); + fp_glCreateProgram = (pfn_glCreateProgram)load("glCreateProgram"); + fp_glCreateShader = (pfn_glCreateShader)load("glCreateShader"); + fp_glDeleteProgram = (pfn_glDeleteProgram)load("glDeleteProgram"); + fp_glDeleteShader = (pfn_glDeleteShader)load("glDeleteShader"); + fp_glDetachShader = (pfn_glDetachShader)load("glDetachShader"); + fp_glDisableVertexAttribArray = (pfn_glDisableVertexAttribArray)load("glDisableVertexAttribArray"); + fp_glEnableVertexAttribArray = (pfn_glEnableVertexAttribArray)load("glEnableVertexAttribArray"); + fp_glGetActiveAttrib = (pfn_glGetActiveAttrib)load("glGetActiveAttrib"); + fp_glGetActiveUniform = (pfn_glGetActiveUniform)load("glGetActiveUniform"); + fp_glGetAttachedShaders = (pfn_glGetAttachedShaders)load("glGetAttachedShaders"); + fp_glGetAttribLocation = (pfn_glGetAttribLocation)load("glGetAttribLocation"); + fp_glGetProgramiv = (pfn_glGetProgramiv)load("glGetProgramiv"); + fp_glGetProgramInfoLog = (pfn_glGetProgramInfoLog)load("glGetProgramInfoLog"); + fp_glGetShaderiv = (pfn_glGetShaderiv)load("glGetShaderiv"); + fp_glGetShaderInfoLog = (pfn_glGetShaderInfoLog)load("glGetShaderInfoLog"); + fp_glGetShaderSource = (pfn_glGetShaderSource)load("glGetShaderSource"); + fp_glGetUniformLocation = (pfn_glGetUniformLocation)load("glGetUniformLocation"); + fp_glGetUniformfv = (pfn_glGetUniformfv)load("glGetUniformfv"); + fp_glGetUniformiv = (pfn_glGetUniformiv)load("glGetUniformiv"); + fp_glGetVertexAttribdv = (pfn_glGetVertexAttribdv)load("glGetVertexAttribdv"); + fp_glGetVertexAttribfv = (pfn_glGetVertexAttribfv)load("glGetVertexAttribfv"); + fp_glGetVertexAttribiv = (pfn_glGetVertexAttribiv)load("glGetVertexAttribiv"); + fp_glGetVertexAttribPointerv = (pfn_glGetVertexAttribPointerv)load("glGetVertexAttribPointerv"); + fp_glIsProgram = (pfn_glIsProgram)load("glIsProgram"); + fp_glIsShader = (pfn_glIsShader)load("glIsShader"); + fp_glLinkProgram = (pfn_glLinkProgram)load("glLinkProgram"); + fp_glShaderSource = (pfn_glShaderSource)load("glShaderSource"); + fp_glUseProgram = (pfn_glUseProgram)load("glUseProgram"); + fp_glUniform1f = (pfn_glUniform1f)load("glUniform1f"); + fp_glUniform2f = (pfn_glUniform2f)load("glUniform2f"); + fp_glUniform3f = (pfn_glUniform3f)load("glUniform3f"); + fp_glUniform4f = (pfn_glUniform4f)load("glUniform4f"); + fp_glUniform1i = (pfn_glUniform1i)load("glUniform1i"); + fp_glUniform2i = (pfn_glUniform2i)load("glUniform2i"); + fp_glUniform3i = (pfn_glUniform3i)load("glUniform3i"); + fp_glUniform4i = (pfn_glUniform4i)load("glUniform4i"); + fp_glUniform1fv = (pfn_glUniform1fv)load("glUniform1fv"); + fp_glUniform2fv = (pfn_glUniform2fv)load("glUniform2fv"); + fp_glUniform3fv = (pfn_glUniform3fv)load("glUniform3fv"); + fp_glUniform4fv = (pfn_glUniform4fv)load("glUniform4fv"); + fp_glUniform1iv = (pfn_glUniform1iv)load("glUniform1iv"); + fp_glUniform2iv = (pfn_glUniform2iv)load("glUniform2iv"); + fp_glUniform3iv = (pfn_glUniform3iv)load("glUniform3iv"); + fp_glUniform4iv = (pfn_glUniform4iv)load("glUniform4iv"); + fp_glUniformMatrix2fv = (pfn_glUniformMatrix2fv)load("glUniformMatrix2fv"); + fp_glUniformMatrix3fv = (pfn_glUniformMatrix3fv)load("glUniformMatrix3fv"); + fp_glUniformMatrix4fv = (pfn_glUniformMatrix4fv)load("glUniformMatrix4fv"); + fp_glValidateProgram = (pfn_glValidateProgram)load("glValidateProgram"); + fp_glVertexAttrib1d = (pfn_glVertexAttrib1d)load("glVertexAttrib1d"); + fp_glVertexAttrib1dv = (pfn_glVertexAttrib1dv)load("glVertexAttrib1dv"); + fp_glVertexAttrib1f = (pfn_glVertexAttrib1f)load("glVertexAttrib1f"); + fp_glVertexAttrib1fv = (pfn_glVertexAttrib1fv)load("glVertexAttrib1fv"); + fp_glVertexAttrib1s = (pfn_glVertexAttrib1s)load("glVertexAttrib1s"); + fp_glVertexAttrib1sv = (pfn_glVertexAttrib1sv)load("glVertexAttrib1sv"); + fp_glVertexAttrib2d = (pfn_glVertexAttrib2d)load("glVertexAttrib2d"); + fp_glVertexAttrib2dv = (pfn_glVertexAttrib2dv)load("glVertexAttrib2dv"); + fp_glVertexAttrib2f = (pfn_glVertexAttrib2f)load("glVertexAttrib2f"); + fp_glVertexAttrib2fv = (pfn_glVertexAttrib2fv)load("glVertexAttrib2fv"); + fp_glVertexAttrib2s = (pfn_glVertexAttrib2s)load("glVertexAttrib2s"); + fp_glVertexAttrib2sv = (pfn_glVertexAttrib2sv)load("glVertexAttrib2sv"); + fp_glVertexAttrib3d = (pfn_glVertexAttrib3d)load("glVertexAttrib3d"); + fp_glVertexAttrib3dv = (pfn_glVertexAttrib3dv)load("glVertexAttrib3dv"); + fp_glVertexAttrib3f = (pfn_glVertexAttrib3f)load("glVertexAttrib3f"); + fp_glVertexAttrib3fv = (pfn_glVertexAttrib3fv)load("glVertexAttrib3fv"); + fp_glVertexAttrib3s = (pfn_glVertexAttrib3s)load("glVertexAttrib3s"); + fp_glVertexAttrib3sv = (pfn_glVertexAttrib3sv)load("glVertexAttrib3sv"); + fp_glVertexAttrib4Nbv = (pfn_glVertexAttrib4Nbv)load("glVertexAttrib4Nbv"); + fp_glVertexAttrib4Niv = (pfn_glVertexAttrib4Niv)load("glVertexAttrib4Niv"); + fp_glVertexAttrib4Nsv = (pfn_glVertexAttrib4Nsv)load("glVertexAttrib4Nsv"); + fp_glVertexAttrib4Nub = (pfn_glVertexAttrib4Nub)load("glVertexAttrib4Nub"); + fp_glVertexAttrib4Nubv = (pfn_glVertexAttrib4Nubv)load("glVertexAttrib4Nubv"); + fp_glVertexAttrib4Nuiv = (pfn_glVertexAttrib4Nuiv)load("glVertexAttrib4Nuiv"); + fp_glVertexAttrib4Nusv = (pfn_glVertexAttrib4Nusv)load("glVertexAttrib4Nusv"); + fp_glVertexAttrib4bv = (pfn_glVertexAttrib4bv)load("glVertexAttrib4bv"); + fp_glVertexAttrib4d = (pfn_glVertexAttrib4d)load("glVertexAttrib4d"); + fp_glVertexAttrib4dv = (pfn_glVertexAttrib4dv)load("glVertexAttrib4dv"); + fp_glVertexAttrib4f = (pfn_glVertexAttrib4f)load("glVertexAttrib4f"); + fp_glVertexAttrib4fv = (pfn_glVertexAttrib4fv)load("glVertexAttrib4fv"); + fp_glVertexAttrib4iv = (pfn_glVertexAttrib4iv)load("glVertexAttrib4iv"); + fp_glVertexAttrib4s = (pfn_glVertexAttrib4s)load("glVertexAttrib4s"); + fp_glVertexAttrib4sv = (pfn_glVertexAttrib4sv)load("glVertexAttrib4sv"); + fp_glVertexAttrib4ubv = (pfn_glVertexAttrib4ubv)load("glVertexAttrib4ubv"); + fp_glVertexAttrib4uiv = (pfn_glVertexAttrib4uiv)load("glVertexAttrib4uiv"); + fp_glVertexAttrib4usv = (pfn_glVertexAttrib4usv)load("glVertexAttrib4usv"); + fp_glVertexAttribPointer = (pfn_glVertexAttribPointer)load("glVertexAttribPointer"); +} + +GLboolean GLAD_VERSION_2_1 = GL_FALSE; +static void load_GL_VERSION_2_1(LOADER load) { + if(!GLAD_VERSION_2_1) return; + fp_glUniformMatrix2x3fv = (pfn_glUniformMatrix2x3fv)load("glUniformMatrix2x3fv"); + fp_glUniformMatrix3x2fv = (pfn_glUniformMatrix3x2fv)load("glUniformMatrix3x2fv"); + fp_glUniformMatrix2x4fv = (pfn_glUniformMatrix2x4fv)load("glUniformMatrix2x4fv"); + fp_glUniformMatrix4x2fv = (pfn_glUniformMatrix4x2fv)load("glUniformMatrix4x2fv"); + fp_glUniformMatrix3x4fv = (pfn_glUniformMatrix3x4fv)load("glUniformMatrix3x4fv"); + fp_glUniformMatrix4x3fv = (pfn_glUniformMatrix4x3fv)load("glUniformMatrix4x3fv"); +} + +GLboolean GLAD_VERSION_3_0 = GL_FALSE; +static void load_GL_VERSION_3_0(LOADER load) { + if(!GLAD_VERSION_3_0) return; + fp_glColorMaski = (pfn_glColorMaski)load("glColorMaski"); + fp_glGetBooleani_v = (pfn_glGetBooleani_v)load("glGetBooleani_v"); + fp_glGetIntegeri_v = (pfn_glGetIntegeri_v)load("glGetIntegeri_v"); + fp_glEnablei = (pfn_glEnablei)load("glEnablei"); + fp_glDisablei = (pfn_glDisablei)load("glDisablei"); + fp_glIsEnabledi = (pfn_glIsEnabledi)load("glIsEnabledi"); + fp_glBeginTransformFeedback = (pfn_glBeginTransformFeedback)load("glBeginTransformFeedback"); + fp_glEndTransformFeedback = (pfn_glEndTransformFeedback)load("glEndTransformFeedback"); + fp_glBindBufferRange = (pfn_glBindBufferRange)load("glBindBufferRange"); + fp_glBindBufferBase = (pfn_glBindBufferBase)load("glBindBufferBase"); + fp_glTransformFeedbackVaryings = (pfn_glTransformFeedbackVaryings)load("glTransformFeedbackVaryings"); + fp_glGetTransformFeedbackVarying = (pfn_glGetTransformFeedbackVarying)load("glGetTransformFeedbackVarying"); + fp_glClampColor = (pfn_glClampColor)load("glClampColor"); + fp_glBeginConditionalRender = (pfn_glBeginConditionalRender)load("glBeginConditionalRender"); + fp_glEndConditionalRender = (pfn_glEndConditionalRender)load("glEndConditionalRender"); + fp_glVertexAttribIPointer = (pfn_glVertexAttribIPointer)load("glVertexAttribIPointer"); + fp_glGetVertexAttribIiv = (pfn_glGetVertexAttribIiv)load("glGetVertexAttribIiv"); + fp_glGetVertexAttribIuiv = (pfn_glGetVertexAttribIuiv)load("glGetVertexAttribIuiv"); + fp_glVertexAttribI1i = (pfn_glVertexAttribI1i)load("glVertexAttribI1i"); + fp_glVertexAttribI2i = (pfn_glVertexAttribI2i)load("glVertexAttribI2i"); + fp_glVertexAttribI3i = (pfn_glVertexAttribI3i)load("glVertexAttribI3i"); + fp_glVertexAttribI4i = (pfn_glVertexAttribI4i)load("glVertexAttribI4i"); + fp_glVertexAttribI1ui = (pfn_glVertexAttribI1ui)load("glVertexAttribI1ui"); + fp_glVertexAttribI2ui = (pfn_glVertexAttribI2ui)load("glVertexAttribI2ui"); + fp_glVertexAttribI3ui = (pfn_glVertexAttribI3ui)load("glVertexAttribI3ui"); + fp_glVertexAttribI4ui = (pfn_glVertexAttribI4ui)load("glVertexAttribI4ui"); + fp_glVertexAttribI1iv = (pfn_glVertexAttribI1iv)load("glVertexAttribI1iv"); + fp_glVertexAttribI2iv = (pfn_glVertexAttribI2iv)load("glVertexAttribI2iv"); + fp_glVertexAttribI3iv = (pfn_glVertexAttribI3iv)load("glVertexAttribI3iv"); + fp_glVertexAttribI4iv = (pfn_glVertexAttribI4iv)load("glVertexAttribI4iv"); + fp_glVertexAttribI1uiv = (pfn_glVertexAttribI1uiv)load("glVertexAttribI1uiv"); + fp_glVertexAttribI2uiv = (pfn_glVertexAttribI2uiv)load("glVertexAttribI2uiv"); + fp_glVertexAttribI3uiv = (pfn_glVertexAttribI3uiv)load("glVertexAttribI3uiv"); + fp_glVertexAttribI4uiv = (pfn_glVertexAttribI4uiv)load("glVertexAttribI4uiv"); + fp_glVertexAttribI4bv = (pfn_glVertexAttribI4bv)load("glVertexAttribI4bv"); + fp_glVertexAttribI4sv = (pfn_glVertexAttribI4sv)load("glVertexAttribI4sv"); + fp_glVertexAttribI4ubv = (pfn_glVertexAttribI4ubv)load("glVertexAttribI4ubv"); + fp_glVertexAttribI4usv = (pfn_glVertexAttribI4usv)load("glVertexAttribI4usv"); + fp_glGetUniformuiv = (pfn_glGetUniformuiv)load("glGetUniformuiv"); + fp_glBindFragDataLocation = (pfn_glBindFragDataLocation)load("glBindFragDataLocation"); + fp_glGetFragDataLocation = (pfn_glGetFragDataLocation)load("glGetFragDataLocation"); + fp_glUniform1ui = (pfn_glUniform1ui)load("glUniform1ui"); + fp_glUniform2ui = (pfn_glUniform2ui)load("glUniform2ui"); + fp_glUniform3ui = (pfn_glUniform3ui)load("glUniform3ui"); + fp_glUniform4ui = (pfn_glUniform4ui)load("glUniform4ui"); + fp_glUniform1uiv = (pfn_glUniform1uiv)load("glUniform1uiv"); + fp_glUniform2uiv = (pfn_glUniform2uiv)load("glUniform2uiv"); + fp_glUniform3uiv = (pfn_glUniform3uiv)load("glUniform3uiv"); + fp_glUniform4uiv = (pfn_glUniform4uiv)load("glUniform4uiv"); + fp_glTexParameterIiv = (pfn_glTexParameterIiv)load("glTexParameterIiv"); + fp_glTexParameterIuiv = (pfn_glTexParameterIuiv)load("glTexParameterIuiv"); + fp_glGetTexParameterIiv = (pfn_glGetTexParameterIiv)load("glGetTexParameterIiv"); + fp_glGetTexParameterIuiv = (pfn_glGetTexParameterIuiv)load("glGetTexParameterIuiv"); + fp_glClearBufferiv = (pfn_glClearBufferiv)load("glClearBufferiv"); + fp_glClearBufferuiv = (pfn_glClearBufferuiv)load("glClearBufferuiv"); + fp_glClearBufferfv = (pfn_glClearBufferfv)load("glClearBufferfv"); + fp_glClearBufferfi = (pfn_glClearBufferfi)load("glClearBufferfi"); + fp_glGetStringi = (pfn_glGetStringi)load("glGetStringi"); + fp_glIsRenderbuffer = (pfn_glIsRenderbuffer)load("glIsRenderbuffer"); + fp_glBindRenderbuffer = (pfn_glBindRenderbuffer)load("glBindRenderbuffer"); + fp_glDeleteRenderbuffers = (pfn_glDeleteRenderbuffers)load("glDeleteRenderbuffers"); + fp_glGenRenderbuffers = (pfn_glGenRenderbuffers)load("glGenRenderbuffers"); + fp_glRenderbufferStorage = (pfn_glRenderbufferStorage)load("glRenderbufferStorage"); + fp_glGetRenderbufferParameteriv = (pfn_glGetRenderbufferParameteriv)load("glGetRenderbufferParameteriv"); + fp_glIsFramebuffer = (pfn_glIsFramebuffer)load("glIsFramebuffer"); + fp_glBindFramebuffer = (pfn_glBindFramebuffer)load("glBindFramebuffer"); + fp_glDeleteFramebuffers = (pfn_glDeleteFramebuffers)load("glDeleteFramebuffers"); + fp_glGenFramebuffers = (pfn_glGenFramebuffers)load("glGenFramebuffers"); + fp_glCheckFramebufferStatus = (pfn_glCheckFramebufferStatus)load("glCheckFramebufferStatus"); + fp_glFramebufferTexture1D = (pfn_glFramebufferTexture1D)load("glFramebufferTexture1D"); + fp_glFramebufferTexture2D = (pfn_glFramebufferTexture2D)load("glFramebufferTexture2D"); + fp_glFramebufferTexture3D = (pfn_glFramebufferTexture3D)load("glFramebufferTexture3D"); + fp_glFramebufferRenderbuffer = (pfn_glFramebufferRenderbuffer)load("glFramebufferRenderbuffer"); + fp_glGetFramebufferAttachmentParameteriv = (pfn_glGetFramebufferAttachmentParameteriv)load("glGetFramebufferAttachmentParameteriv"); + fp_glGenerateMipmap = (pfn_glGenerateMipmap)load("glGenerateMipmap"); + fp_glBlitFramebuffer = (pfn_glBlitFramebuffer)load("glBlitFramebuffer"); + fp_glRenderbufferStorageMultisample = (pfn_glRenderbufferStorageMultisample)load("glRenderbufferStorageMultisample"); + fp_glFramebufferTextureLayer = (pfn_glFramebufferTextureLayer)load("glFramebufferTextureLayer"); + fp_glMapBufferRange = (pfn_glMapBufferRange)load("glMapBufferRange"); + fp_glFlushMappedBufferRange = (pfn_glFlushMappedBufferRange)load("glFlushMappedBufferRange"); + fp_glBindVertexArray = (pfn_glBindVertexArray)load("glBindVertexArray"); + fp_glDeleteVertexArrays = (pfn_glDeleteVertexArrays)load("glDeleteVertexArrays"); + fp_glGenVertexArrays = (pfn_glGenVertexArrays)load("glGenVertexArrays"); + fp_glIsVertexArray = (pfn_glIsVertexArray)load("glIsVertexArray"); +} + +GLboolean GLAD_VERSION_3_1 = GL_FALSE; +static void load_GL_VERSION_3_1(LOADER load) { + if(!GLAD_VERSION_3_1) return; + fp_glDrawArraysInstanced = (pfn_glDrawArraysInstanced)load("glDrawArraysInstanced"); + fp_glDrawElementsInstanced = (pfn_glDrawElementsInstanced)load("glDrawElementsInstanced"); + fp_glTexBuffer = (pfn_glTexBuffer)load("glTexBuffer"); + fp_glPrimitiveRestartIndex = (pfn_glPrimitiveRestartIndex)load("glPrimitiveRestartIndex"); + fp_glCopyBufferSubData = (pfn_glCopyBufferSubData)load("glCopyBufferSubData"); + fp_glGetUniformIndices = (pfn_glGetUniformIndices)load("glGetUniformIndices"); + fp_glGetActiveUniformsiv = (pfn_glGetActiveUniformsiv)load("glGetActiveUniformsiv"); + fp_glGetActiveUniformName = (pfn_glGetActiveUniformName)load("glGetActiveUniformName"); + fp_glGetUniformBlockIndex = (pfn_glGetUniformBlockIndex)load("glGetUniformBlockIndex"); + fp_glGetActiveUniformBlockiv = (pfn_glGetActiveUniformBlockiv)load("glGetActiveUniformBlockiv"); + fp_glGetActiveUniformBlockName = (pfn_glGetActiveUniformBlockName)load("glGetActiveUniformBlockName"); + fp_glUniformBlockBinding = (pfn_glUniformBlockBinding)load("glUniformBlockBinding"); +} + +GLboolean GLAD_VERSION_3_2 = GL_FALSE; +static void load_GL_VERSION_3_2(LOADER load) { + if(!GLAD_VERSION_3_2) return; + fp_glDrawElementsBaseVertex = (pfn_glDrawElementsBaseVertex)load("glDrawElementsBaseVertex"); + fp_glDrawRangeElementsBaseVertex = (pfn_glDrawRangeElementsBaseVertex)load("glDrawRangeElementsBaseVertex"); + fp_glDrawElementsInstancedBaseVertex = (pfn_glDrawElementsInstancedBaseVertex)load("glDrawElementsInstancedBaseVertex"); + fp_glMultiDrawElementsBaseVertex = (pfn_glMultiDrawElementsBaseVertex)load("glMultiDrawElementsBaseVertex"); + fp_glProvokingVertex = (pfn_glProvokingVertex)load("glProvokingVertex"); + fp_glFenceSync = (pfn_glFenceSync)load("glFenceSync"); + fp_glIsSync = (pfn_glIsSync)load("glIsSync"); + fp_glDeleteSync = (pfn_glDeleteSync)load("glDeleteSync"); + fp_glClientWaitSync = (pfn_glClientWaitSync)load("glClientWaitSync"); + fp_glWaitSync = (pfn_glWaitSync)load("glWaitSync"); + fp_glGetInteger64v = (pfn_glGetInteger64v)load("glGetInteger64v"); + fp_glGetSynciv = (pfn_glGetSynciv)load("glGetSynciv"); + fp_glGetInteger64i_v = (pfn_glGetInteger64i_v)load("glGetInteger64i_v"); + fp_glGetBufferParameteri64v = (pfn_glGetBufferParameteri64v)load("glGetBufferParameteri64v"); + fp_glFramebufferTexture = (pfn_glFramebufferTexture)load("glFramebufferTexture"); + fp_glTexImage2DMultisample = (pfn_glTexImage2DMultisample)load("glTexImage2DMultisample"); + fp_glTexImage3DMultisample = (pfn_glTexImage3DMultisample)load("glTexImage3DMultisample"); + fp_glGetMultisamplefv = (pfn_glGetMultisamplefv)load("glGetMultisamplefv"); + fp_glSampleMaski = (pfn_glSampleMaski)load("glSampleMaski"); +} + +GLboolean GLAD_VERSION_3_3 = GL_FALSE; +static void load_GL_VERSION_3_3(LOADER load) { + if(!GLAD_VERSION_3_3) return; + fp_glBindFragDataLocationIndexed = (pfn_glBindFragDataLocationIndexed)load("glBindFragDataLocationIndexed"); + fp_glGetFragDataIndex = (pfn_glGetFragDataIndex)load("glGetFragDataIndex"); + fp_glGenSamplers = (pfn_glGenSamplers)load("glGenSamplers"); + fp_glDeleteSamplers = (pfn_glDeleteSamplers)load("glDeleteSamplers"); + fp_glIsSampler = (pfn_glIsSampler)load("glIsSampler"); + fp_glBindSampler = (pfn_glBindSampler)load("glBindSampler"); + fp_glSamplerParameteri = (pfn_glSamplerParameteri)load("glSamplerParameteri"); + fp_glSamplerParameteriv = (pfn_glSamplerParameteriv)load("glSamplerParameteriv"); + fp_glSamplerParameterf = (pfn_glSamplerParameterf)load("glSamplerParameterf"); + fp_glSamplerParameterfv = (pfn_glSamplerParameterfv)load("glSamplerParameterfv"); + fp_glSamplerParameterIiv = (pfn_glSamplerParameterIiv)load("glSamplerParameterIiv"); + fp_glSamplerParameterIuiv = (pfn_glSamplerParameterIuiv)load("glSamplerParameterIuiv"); + fp_glGetSamplerParameteriv = (pfn_glGetSamplerParameteriv)load("glGetSamplerParameteriv"); + fp_glGetSamplerParameterIiv = (pfn_glGetSamplerParameterIiv)load("glGetSamplerParameterIiv"); + fp_glGetSamplerParameterfv = (pfn_glGetSamplerParameterfv)load("glGetSamplerParameterfv"); + fp_glGetSamplerParameterIuiv = (pfn_glGetSamplerParameterIuiv)load("glGetSamplerParameterIuiv"); + fp_glQueryCounter = (pfn_glQueryCounter)load("glQueryCounter"); + fp_glGetQueryObjecti64v = (pfn_glGetQueryObjecti64v)load("glGetQueryObjecti64v"); + fp_glGetQueryObjectui64v = (pfn_glGetQueryObjectui64v)load("glGetQueryObjectui64v"); + fp_glVertexAttribDivisor = (pfn_glVertexAttribDivisor)load("glVertexAttribDivisor"); + fp_glVertexAttribP1ui = (pfn_glVertexAttribP1ui)load("glVertexAttribP1ui"); + fp_glVertexAttribP1uiv = (pfn_glVertexAttribP1uiv)load("glVertexAttribP1uiv"); + fp_glVertexAttribP2ui = (pfn_glVertexAttribP2ui)load("glVertexAttribP2ui"); + fp_glVertexAttribP2uiv = (pfn_glVertexAttribP2uiv)load("glVertexAttribP2uiv"); + fp_glVertexAttribP3ui = (pfn_glVertexAttribP3ui)load("glVertexAttribP3ui"); + fp_glVertexAttribP3uiv = (pfn_glVertexAttribP3uiv)load("glVertexAttribP3uiv"); + fp_glVertexAttribP4ui = (pfn_glVertexAttribP4ui)load("glVertexAttribP4ui"); + fp_glVertexAttribP4uiv = (pfn_glVertexAttribP4uiv)load("glVertexAttribP4uiv"); + fp_glVertexP2ui = (pfn_glVertexP2ui)load("glVertexP2ui"); + fp_glVertexP2uiv = (pfn_glVertexP2uiv)load("glVertexP2uiv"); + fp_glVertexP3ui = (pfn_glVertexP3ui)load("glVertexP3ui"); + fp_glVertexP3uiv = (pfn_glVertexP3uiv)load("glVertexP3uiv"); + fp_glVertexP4ui = (pfn_glVertexP4ui)load("glVertexP4ui"); + fp_glVertexP4uiv = (pfn_glVertexP4uiv)load("glVertexP4uiv"); + fp_glTexCoordP1ui = (pfn_glTexCoordP1ui)load("glTexCoordP1ui"); + fp_glTexCoordP1uiv = (pfn_glTexCoordP1uiv)load("glTexCoordP1uiv"); + fp_glTexCoordP2ui = (pfn_glTexCoordP2ui)load("glTexCoordP2ui"); + fp_glTexCoordP2uiv = (pfn_glTexCoordP2uiv)load("glTexCoordP2uiv"); + fp_glTexCoordP3ui = (pfn_glTexCoordP3ui)load("glTexCoordP3ui"); + fp_glTexCoordP3uiv = (pfn_glTexCoordP3uiv)load("glTexCoordP3uiv"); + fp_glTexCoordP4ui = (pfn_glTexCoordP4ui)load("glTexCoordP4ui"); + fp_glTexCoordP4uiv = (pfn_glTexCoordP4uiv)load("glTexCoordP4uiv"); + fp_glMultiTexCoordP1ui = (pfn_glMultiTexCoordP1ui)load("glMultiTexCoordP1ui"); + fp_glMultiTexCoordP1uiv = (pfn_glMultiTexCoordP1uiv)load("glMultiTexCoordP1uiv"); + fp_glMultiTexCoordP2ui = (pfn_glMultiTexCoordP2ui)load("glMultiTexCoordP2ui"); + fp_glMultiTexCoordP2uiv = (pfn_glMultiTexCoordP2uiv)load("glMultiTexCoordP2uiv"); + fp_glMultiTexCoordP3ui = (pfn_glMultiTexCoordP3ui)load("glMultiTexCoordP3ui"); + fp_glMultiTexCoordP3uiv = (pfn_glMultiTexCoordP3uiv)load("glMultiTexCoordP3uiv"); + fp_glMultiTexCoordP4ui = (pfn_glMultiTexCoordP4ui)load("glMultiTexCoordP4ui"); + fp_glMultiTexCoordP4uiv = (pfn_glMultiTexCoordP4uiv)load("glMultiTexCoordP4uiv"); + fp_glNormalP3ui = (pfn_glNormalP3ui)load("glNormalP3ui"); + fp_glNormalP3uiv = (pfn_glNormalP3uiv)load("glNormalP3uiv"); + fp_glColorP3ui = (pfn_glColorP3ui)load("glColorP3ui"); + fp_glColorP3uiv = (pfn_glColorP3uiv)load("glColorP3uiv"); + fp_glColorP4ui = (pfn_glColorP4ui)load("glColorP4ui"); + fp_glColorP4uiv = (pfn_glColorP4uiv)load("glColorP4uiv"); + fp_glSecondaryColorP3ui = (pfn_glSecondaryColorP3ui)load("glSecondaryColorP3ui"); + fp_glSecondaryColorP3uiv = (pfn_glSecondaryColorP3uiv)load("glSecondaryColorP3uiv"); +} + +GLboolean GLAD_VERSION_4_0 = GL_FALSE; +static void load_GL_VERSION_4_0(LOADER load) { + if(!GLAD_VERSION_4_0) return; + fp_glMinSampleShading = (pfn_glMinSampleShading)load("glMinSampleShading"); + fp_glBlendEquationi = (pfn_glBlendEquationi)load("glBlendEquationi"); + fp_glBlendEquationSeparatei = (pfn_glBlendEquationSeparatei)load("glBlendEquationSeparatei"); + fp_glBlendFunci = (pfn_glBlendFunci)load("glBlendFunci"); + fp_glBlendFuncSeparatei = (pfn_glBlendFuncSeparatei)load("glBlendFuncSeparatei"); + fp_glDrawArraysIndirect = (pfn_glDrawArraysIndirect)load("glDrawArraysIndirect"); + fp_glDrawElementsIndirect = (pfn_glDrawElementsIndirect)load("glDrawElementsIndirect"); + fp_glUniform1d = (pfn_glUniform1d)load("glUniform1d"); + fp_glUniform2d = (pfn_glUniform2d)load("glUniform2d"); + fp_glUniform3d = (pfn_glUniform3d)load("glUniform3d"); + fp_glUniform4d = (pfn_glUniform4d)load("glUniform4d"); + fp_glUniform1dv = (pfn_glUniform1dv)load("glUniform1dv"); + fp_glUniform2dv = (pfn_glUniform2dv)load("glUniform2dv"); + fp_glUniform3dv = (pfn_glUniform3dv)load("glUniform3dv"); + fp_glUniform4dv = (pfn_glUniform4dv)load("glUniform4dv"); + fp_glUniformMatrix2dv = (pfn_glUniformMatrix2dv)load("glUniformMatrix2dv"); + fp_glUniformMatrix3dv = (pfn_glUniformMatrix3dv)load("glUniformMatrix3dv"); + fp_glUniformMatrix4dv = (pfn_glUniformMatrix4dv)load("glUniformMatrix4dv"); + fp_glUniformMatrix2x3dv = (pfn_glUniformMatrix2x3dv)load("glUniformMatrix2x3dv"); + fp_glUniformMatrix2x4dv = (pfn_glUniformMatrix2x4dv)load("glUniformMatrix2x4dv"); + fp_glUniformMatrix3x2dv = (pfn_glUniformMatrix3x2dv)load("glUniformMatrix3x2dv"); + fp_glUniformMatrix3x4dv = (pfn_glUniformMatrix3x4dv)load("glUniformMatrix3x4dv"); + fp_glUniformMatrix4x2dv = (pfn_glUniformMatrix4x2dv)load("glUniformMatrix4x2dv"); + fp_glUniformMatrix4x3dv = (pfn_glUniformMatrix4x3dv)load("glUniformMatrix4x3dv"); + fp_glGetUniformdv = (pfn_glGetUniformdv)load("glGetUniformdv"); + fp_glGetSubroutineUniformLocation = (pfn_glGetSubroutineUniformLocation)load("glGetSubroutineUniformLocation"); + fp_glGetSubroutineIndex = (pfn_glGetSubroutineIndex)load("glGetSubroutineIndex"); + fp_glGetActiveSubroutineUniformiv = (pfn_glGetActiveSubroutineUniformiv)load("glGetActiveSubroutineUniformiv"); + fp_glGetActiveSubroutineUniformName = (pfn_glGetActiveSubroutineUniformName)load("glGetActiveSubroutineUniformName"); + fp_glGetActiveSubroutineName = (pfn_glGetActiveSubroutineName)load("glGetActiveSubroutineName"); + fp_glUniformSubroutinesuiv = (pfn_glUniformSubroutinesuiv)load("glUniformSubroutinesuiv"); + fp_glGetUniformSubroutineuiv = (pfn_glGetUniformSubroutineuiv)load("glGetUniformSubroutineuiv"); + fp_glGetProgramStageiv = (pfn_glGetProgramStageiv)load("glGetProgramStageiv"); + fp_glPatchParameteri = (pfn_glPatchParameteri)load("glPatchParameteri"); + fp_glPatchParameterfv = (pfn_glPatchParameterfv)load("glPatchParameterfv"); + fp_glBindTransformFeedback = (pfn_glBindTransformFeedback)load("glBindTransformFeedback"); + fp_glDeleteTransformFeedbacks = (pfn_glDeleteTransformFeedbacks)load("glDeleteTransformFeedbacks"); + fp_glGenTransformFeedbacks = (pfn_glGenTransformFeedbacks)load("glGenTransformFeedbacks"); + fp_glIsTransformFeedback = (pfn_glIsTransformFeedback)load("glIsTransformFeedback"); + fp_glPauseTransformFeedback = (pfn_glPauseTransformFeedback)load("glPauseTransformFeedback"); + fp_glResumeTransformFeedback = (pfn_glResumeTransformFeedback)load("glResumeTransformFeedback"); + fp_glDrawTransformFeedback = (pfn_glDrawTransformFeedback)load("glDrawTransformFeedback"); + fp_glDrawTransformFeedbackStream = (pfn_glDrawTransformFeedbackStream)load("glDrawTransformFeedbackStream"); + fp_glBeginQueryIndexed = (pfn_glBeginQueryIndexed)load("glBeginQueryIndexed"); + fp_glEndQueryIndexed = (pfn_glEndQueryIndexed)load("glEndQueryIndexed"); + fp_glGetQueryIndexediv = (pfn_glGetQueryIndexediv)load("glGetQueryIndexediv"); +} + +GLboolean GLAD_VERSION_4_1 = GL_FALSE; +static void load_GL_VERSION_4_1(LOADER load) { + if(!GLAD_VERSION_4_1) return; + fp_glReleaseShaderCompiler = (pfn_glReleaseShaderCompiler)load("glReleaseShaderCompiler"); + fp_glShaderBinary = (pfn_glShaderBinary)load("glShaderBinary"); + fp_glGetShaderPrecisionFormat = (pfn_glGetShaderPrecisionFormat)load("glGetShaderPrecisionFormat"); + fp_glDepthRangef = (pfn_glDepthRangef)load("glDepthRangef"); + fp_glClearDepthf = (pfn_glClearDepthf)load("glClearDepthf"); + fp_glGetProgramBinary = (pfn_glGetProgramBinary)load("glGetProgramBinary"); + fp_glProgramBinary = (pfn_glProgramBinary)load("glProgramBinary"); + fp_glProgramParameteri = (pfn_glProgramParameteri)load("glProgramParameteri"); + fp_glUseProgramStages = (pfn_glUseProgramStages)load("glUseProgramStages"); + fp_glActiveShaderProgram = (pfn_glActiveShaderProgram)load("glActiveShaderProgram"); + fp_glCreateShaderProgramv = (pfn_glCreateShaderProgramv)load("glCreateShaderProgramv"); + fp_glBindProgramPipeline = (pfn_glBindProgramPipeline)load("glBindProgramPipeline"); + fp_glDeleteProgramPipelines = (pfn_glDeleteProgramPipelines)load("glDeleteProgramPipelines"); + fp_glGenProgramPipelines = (pfn_glGenProgramPipelines)load("glGenProgramPipelines"); + fp_glIsProgramPipeline = (pfn_glIsProgramPipeline)load("glIsProgramPipeline"); + fp_glGetProgramPipelineiv = (pfn_glGetProgramPipelineiv)load("glGetProgramPipelineiv"); + fp_glProgramUniform1i = (pfn_glProgramUniform1i)load("glProgramUniform1i"); + fp_glProgramUniform1iv = (pfn_glProgramUniform1iv)load("glProgramUniform1iv"); + fp_glProgramUniform1f = (pfn_glProgramUniform1f)load("glProgramUniform1f"); + fp_glProgramUniform1fv = (pfn_glProgramUniform1fv)load("glProgramUniform1fv"); + fp_glProgramUniform1d = (pfn_glProgramUniform1d)load("glProgramUniform1d"); + fp_glProgramUniform1dv = (pfn_glProgramUniform1dv)load("glProgramUniform1dv"); + fp_glProgramUniform1ui = (pfn_glProgramUniform1ui)load("glProgramUniform1ui"); + fp_glProgramUniform1uiv = (pfn_glProgramUniform1uiv)load("glProgramUniform1uiv"); + fp_glProgramUniform2i = (pfn_glProgramUniform2i)load("glProgramUniform2i"); + fp_glProgramUniform2iv = (pfn_glProgramUniform2iv)load("glProgramUniform2iv"); + fp_glProgramUniform2f = (pfn_glProgramUniform2f)load("glProgramUniform2f"); + fp_glProgramUniform2fv = (pfn_glProgramUniform2fv)load("glProgramUniform2fv"); + fp_glProgramUniform2d = (pfn_glProgramUniform2d)load("glProgramUniform2d"); + fp_glProgramUniform2dv = (pfn_glProgramUniform2dv)load("glProgramUniform2dv"); + fp_glProgramUniform2ui = (pfn_glProgramUniform2ui)load("glProgramUniform2ui"); + fp_glProgramUniform2uiv = (pfn_glProgramUniform2uiv)load("glProgramUniform2uiv"); + fp_glProgramUniform3i = (pfn_glProgramUniform3i)load("glProgramUniform3i"); + fp_glProgramUniform3iv = (pfn_glProgramUniform3iv)load("glProgramUniform3iv"); + fp_glProgramUniform3f = (pfn_glProgramUniform3f)load("glProgramUniform3f"); + fp_glProgramUniform3fv = (pfn_glProgramUniform3fv)load("glProgramUniform3fv"); + fp_glProgramUniform3d = (pfn_glProgramUniform3d)load("glProgramUniform3d"); + fp_glProgramUniform3dv = (pfn_glProgramUniform3dv)load("glProgramUniform3dv"); + fp_glProgramUniform3ui = (pfn_glProgramUniform3ui)load("glProgramUniform3ui"); + fp_glProgramUniform3uiv = (pfn_glProgramUniform3uiv)load("glProgramUniform3uiv"); + fp_glProgramUniform4i = (pfn_glProgramUniform4i)load("glProgramUniform4i"); + fp_glProgramUniform4iv = (pfn_glProgramUniform4iv)load("glProgramUniform4iv"); + fp_glProgramUniform4f = (pfn_glProgramUniform4f)load("glProgramUniform4f"); + fp_glProgramUniform4fv = (pfn_glProgramUniform4fv)load("glProgramUniform4fv"); + fp_glProgramUniform4d = (pfn_glProgramUniform4d)load("glProgramUniform4d"); + fp_glProgramUniform4dv = (pfn_glProgramUniform4dv)load("glProgramUniform4dv"); + fp_glProgramUniform4ui = (pfn_glProgramUniform4ui)load("glProgramUniform4ui"); + fp_glProgramUniform4uiv = (pfn_glProgramUniform4uiv)load("glProgramUniform4uiv"); + fp_glProgramUniformMatrix2fv = (pfn_glProgramUniformMatrix2fv)load("glProgramUniformMatrix2fv"); + fp_glProgramUniformMatrix3fv = (pfn_glProgramUniformMatrix3fv)load("glProgramUniformMatrix3fv"); + fp_glProgramUniformMatrix4fv = (pfn_glProgramUniformMatrix4fv)load("glProgramUniformMatrix4fv"); + fp_glProgramUniformMatrix2dv = (pfn_glProgramUniformMatrix2dv)load("glProgramUniformMatrix2dv"); + fp_glProgramUniformMatrix3dv = (pfn_glProgramUniformMatrix3dv)load("glProgramUniformMatrix3dv"); + fp_glProgramUniformMatrix4dv = (pfn_glProgramUniformMatrix4dv)load("glProgramUniformMatrix4dv"); + fp_glProgramUniformMatrix2x3fv = (pfn_glProgramUniformMatrix2x3fv)load("glProgramUniformMatrix2x3fv"); + fp_glProgramUniformMatrix3x2fv = (pfn_glProgramUniformMatrix3x2fv)load("glProgramUniformMatrix3x2fv"); + fp_glProgramUniformMatrix2x4fv = (pfn_glProgramUniformMatrix2x4fv)load("glProgramUniformMatrix2x4fv"); + fp_glProgramUniformMatrix4x2fv = (pfn_glProgramUniformMatrix4x2fv)load("glProgramUniformMatrix4x2fv"); + fp_glProgramUniformMatrix3x4fv = (pfn_glProgramUniformMatrix3x4fv)load("glProgramUniformMatrix3x4fv"); + fp_glProgramUniformMatrix4x3fv = (pfn_glProgramUniformMatrix4x3fv)load("glProgramUniformMatrix4x3fv"); + fp_glProgramUniformMatrix2x3dv = (pfn_glProgramUniformMatrix2x3dv)load("glProgramUniformMatrix2x3dv"); + fp_glProgramUniformMatrix3x2dv = (pfn_glProgramUniformMatrix3x2dv)load("glProgramUniformMatrix3x2dv"); + fp_glProgramUniformMatrix2x4dv = (pfn_glProgramUniformMatrix2x4dv)load("glProgramUniformMatrix2x4dv"); + fp_glProgramUniformMatrix4x2dv = (pfn_glProgramUniformMatrix4x2dv)load("glProgramUniformMatrix4x2dv"); + fp_glProgramUniformMatrix3x4dv = (pfn_glProgramUniformMatrix3x4dv)load("glProgramUniformMatrix3x4dv"); + fp_glProgramUniformMatrix4x3dv = (pfn_glProgramUniformMatrix4x3dv)load("glProgramUniformMatrix4x3dv"); + fp_glValidateProgramPipeline = (pfn_glValidateProgramPipeline)load("glValidateProgramPipeline"); + fp_glGetProgramPipelineInfoLog = (pfn_glGetProgramPipelineInfoLog)load("glGetProgramPipelineInfoLog"); + fp_glVertexAttribL1d = (pfn_glVertexAttribL1d)load("glVertexAttribL1d"); + fp_glVertexAttribL2d = (pfn_glVertexAttribL2d)load("glVertexAttribL2d"); + fp_glVertexAttribL3d = (pfn_glVertexAttribL3d)load("glVertexAttribL3d"); + fp_glVertexAttribL4d = (pfn_glVertexAttribL4d)load("glVertexAttribL4d"); + fp_glVertexAttribL1dv = (pfn_glVertexAttribL1dv)load("glVertexAttribL1dv"); + fp_glVertexAttribL2dv = (pfn_glVertexAttribL2dv)load("glVertexAttribL2dv"); + fp_glVertexAttribL3dv = (pfn_glVertexAttribL3dv)load("glVertexAttribL3dv"); + fp_glVertexAttribL4dv = (pfn_glVertexAttribL4dv)load("glVertexAttribL4dv"); + fp_glVertexAttribLPointer = (pfn_glVertexAttribLPointer)load("glVertexAttribLPointer"); + fp_glGetVertexAttribLdv = (pfn_glGetVertexAttribLdv)load("glGetVertexAttribLdv"); + fp_glViewportArrayv = (pfn_glViewportArrayv)load("glViewportArrayv"); + fp_glViewportIndexedf = (pfn_glViewportIndexedf)load("glViewportIndexedf"); + fp_glViewportIndexedfv = (pfn_glViewportIndexedfv)load("glViewportIndexedfv"); + fp_glScissorArrayv = (pfn_glScissorArrayv)load("glScissorArrayv"); + fp_glScissorIndexed = (pfn_glScissorIndexed)load("glScissorIndexed"); + fp_glScissorIndexedv = (pfn_glScissorIndexedv)load("glScissorIndexedv"); + fp_glDepthRangeArrayv = (pfn_glDepthRangeArrayv)load("glDepthRangeArrayv"); + fp_glDepthRangeIndexed = (pfn_glDepthRangeIndexed)load("glDepthRangeIndexed"); + fp_glGetFloati_v = (pfn_glGetFloati_v)load("glGetFloati_v"); + fp_glGetDoublei_v = (pfn_glGetDoublei_v)load("glGetDoublei_v"); +} + +GLboolean GLAD_VERSION_4_2 = GL_FALSE; +static void load_GL_VERSION_4_2(LOADER load) { + if(!GLAD_VERSION_4_2) return; + fp_glDrawArraysInstancedBaseInstance = (pfn_glDrawArraysInstancedBaseInstance)load("glDrawArraysInstancedBaseInstance"); + fp_glDrawElementsInstancedBaseInstance = (pfn_glDrawElementsInstancedBaseInstance)load("glDrawElementsInstancedBaseInstance"); + fp_glDrawElementsInstancedBaseVertexBaseInstance = (pfn_glDrawElementsInstancedBaseVertexBaseInstance)load("glDrawElementsInstancedBaseVertexBaseInstance"); + fp_glGetInternalformativ = (pfn_glGetInternalformativ)load("glGetInternalformativ"); + fp_glGetActiveAtomicCounterBufferiv = (pfn_glGetActiveAtomicCounterBufferiv)load("glGetActiveAtomicCounterBufferiv"); + fp_glBindImageTexture = (pfn_glBindImageTexture)load("glBindImageTexture"); + fp_glMemoryBarrier = (pfn_glMemoryBarrier)load("glMemoryBarrier"); + fp_glTexStorage1D = (pfn_glTexStorage1D)load("glTexStorage1D"); + fp_glTexStorage2D = (pfn_glTexStorage2D)load("glTexStorage2D"); + fp_glTexStorage3D = (pfn_glTexStorage3D)load("glTexStorage3D"); + fp_glDrawTransformFeedbackInstanced = (pfn_glDrawTransformFeedbackInstanced)load("glDrawTransformFeedbackInstanced"); + fp_glDrawTransformFeedbackStreamInstanced = (pfn_glDrawTransformFeedbackStreamInstanced)load("glDrawTransformFeedbackStreamInstanced"); +} + +GLboolean GLAD_VERSION_4_3 = GL_FALSE; +static void load_GL_VERSION_4_3(LOADER load) { + if(!GLAD_VERSION_4_3) return; + fp_glClearBufferData = (pfn_glClearBufferData)load("glClearBufferData"); + fp_glClearBufferSubData = (pfn_glClearBufferSubData)load("glClearBufferSubData"); + fp_glDispatchCompute = (pfn_glDispatchCompute)load("glDispatchCompute"); + fp_glDispatchComputeIndirect = (pfn_glDispatchComputeIndirect)load("glDispatchComputeIndirect"); + fp_glCopyImageSubData = (pfn_glCopyImageSubData)load("glCopyImageSubData"); + fp_glFramebufferParameteri = (pfn_glFramebufferParameteri)load("glFramebufferParameteri"); + fp_glGetFramebufferParameteriv = (pfn_glGetFramebufferParameteriv)load("glGetFramebufferParameteriv"); + fp_glGetInternalformati64v = (pfn_glGetInternalformati64v)load("glGetInternalformati64v"); + fp_glInvalidateTexSubImage = (pfn_glInvalidateTexSubImage)load("glInvalidateTexSubImage"); + fp_glInvalidateTexImage = (pfn_glInvalidateTexImage)load("glInvalidateTexImage"); + fp_glInvalidateBufferSubData = (pfn_glInvalidateBufferSubData)load("glInvalidateBufferSubData"); + fp_glInvalidateBufferData = (pfn_glInvalidateBufferData)load("glInvalidateBufferData"); + fp_glInvalidateFramebuffer = (pfn_glInvalidateFramebuffer)load("glInvalidateFramebuffer"); + fp_glInvalidateSubFramebuffer = (pfn_glInvalidateSubFramebuffer)load("glInvalidateSubFramebuffer"); + fp_glMultiDrawArraysIndirect = (pfn_glMultiDrawArraysIndirect)load("glMultiDrawArraysIndirect"); + fp_glMultiDrawElementsIndirect = (pfn_glMultiDrawElementsIndirect)load("glMultiDrawElementsIndirect"); + fp_glGetProgramInterfaceiv = (pfn_glGetProgramInterfaceiv)load("glGetProgramInterfaceiv"); + fp_glGetProgramResourceIndex = (pfn_glGetProgramResourceIndex)load("glGetProgramResourceIndex"); + fp_glGetProgramResourceName = (pfn_glGetProgramResourceName)load("glGetProgramResourceName"); + fp_glGetProgramResourceiv = (pfn_glGetProgramResourceiv)load("glGetProgramResourceiv"); + fp_glGetProgramResourceLocation = (pfn_glGetProgramResourceLocation)load("glGetProgramResourceLocation"); + fp_glGetProgramResourceLocationIndex = (pfn_glGetProgramResourceLocationIndex)load("glGetProgramResourceLocationIndex"); + fp_glShaderStorageBlockBinding = (pfn_glShaderStorageBlockBinding)load("glShaderStorageBlockBinding"); + fp_glTexBufferRange = (pfn_glTexBufferRange)load("glTexBufferRange"); + fp_glTexStorage2DMultisample = (pfn_glTexStorage2DMultisample)load("glTexStorage2DMultisample"); + fp_glTexStorage3DMultisample = (pfn_glTexStorage3DMultisample)load("glTexStorage3DMultisample"); + fp_glTextureView = (pfn_glTextureView)load("glTextureView"); + fp_glBindVertexBuffer = (pfn_glBindVertexBuffer)load("glBindVertexBuffer"); + fp_glVertexAttribFormat = (pfn_glVertexAttribFormat)load("glVertexAttribFormat"); + fp_glVertexAttribIFormat = (pfn_glVertexAttribIFormat)load("glVertexAttribIFormat"); + fp_glVertexAttribLFormat = (pfn_glVertexAttribLFormat)load("glVertexAttribLFormat"); + fp_glVertexAttribBinding = (pfn_glVertexAttribBinding)load("glVertexAttribBinding"); + fp_glVertexBindingDivisor = (pfn_glVertexBindingDivisor)load("glVertexBindingDivisor"); + fp_glDebugMessageControl = (pfn_glDebugMessageControl)load("glDebugMessageControl"); + fp_glDebugMessageInsert = (pfn_glDebugMessageInsert)load("glDebugMessageInsert"); + fp_glDebugMessageCallback = (pfn_glDebugMessageCallback)load("glDebugMessageCallback"); + fp_glGetDebugMessageLog = (pfn_glGetDebugMessageLog)load("glGetDebugMessageLog"); + fp_glPushDebugGroup = (pfn_glPushDebugGroup)load("glPushDebugGroup"); + fp_glPopDebugGroup = (pfn_glPopDebugGroup)load("glPopDebugGroup"); + fp_glObjectLabel = (pfn_glObjectLabel)load("glObjectLabel"); + fp_glGetObjectLabel = (pfn_glGetObjectLabel)load("glGetObjectLabel"); + fp_glObjectPtrLabel = (pfn_glObjectPtrLabel)load("glObjectPtrLabel"); + fp_glGetObjectPtrLabel = (pfn_glGetObjectPtrLabel)load("glGetObjectPtrLabel"); + fp_glGetPointerv = (pfn_glGetPointerv)load("glGetPointerv"); + fp_glGetPointerv = (pfn_glGetPointerv)load("glGetPointerv"); +} + +GLboolean GLAD_VERSION_4_4 = GL_FALSE; +static void load_GL_VERSION_4_4(LOADER load) { + if(!GLAD_VERSION_4_4) return; + fp_glBufferStorage = (pfn_glBufferStorage)load("glBufferStorage"); + fp_glClearTexImage = (pfn_glClearTexImage)load("glClearTexImage"); + fp_glClearTexSubImage = (pfn_glClearTexSubImage)load("glClearTexSubImage"); + fp_glBindBuffersBase = (pfn_glBindBuffersBase)load("glBindBuffersBase"); + fp_glBindBuffersRange = (pfn_glBindBuffersRange)load("glBindBuffersRange"); + fp_glBindTextures = (pfn_glBindTextures)load("glBindTextures"); + fp_glBindSamplers = (pfn_glBindSamplers)load("glBindSamplers"); + fp_glBindImageTextures = (pfn_glBindImageTextures)load("glBindImageTextures"); + fp_glBindVertexBuffers = (pfn_glBindVertexBuffers)load("glBindVertexBuffers"); +} + +GLboolean GLAD_ES_VERSION_2_0 = GL_FALSE; +static void load_GL_ES_VERSION_2_0(LOADER load) { + if(!GLAD_ES_VERSION_2_0) return; + fp_glActiveTexture = (pfn_glActiveTexture)load("glActiveTexture"); + fp_glAttachShader = (pfn_glAttachShader)load("glAttachShader"); + fp_glBindAttribLocation = (pfn_glBindAttribLocation)load("glBindAttribLocation"); + fp_glBindBuffer = (pfn_glBindBuffer)load("glBindBuffer"); + fp_glBindFramebuffer = (pfn_glBindFramebuffer)load("glBindFramebuffer"); + fp_glBindRenderbuffer = (pfn_glBindRenderbuffer)load("glBindRenderbuffer"); + fp_glBindTexture = (pfn_glBindTexture)load("glBindTexture"); + fp_glBlendColor = (pfn_glBlendColor)load("glBlendColor"); + fp_glBlendEquation = (pfn_glBlendEquation)load("glBlendEquation"); + fp_glBlendEquationSeparate = (pfn_glBlendEquationSeparate)load("glBlendEquationSeparate"); + fp_glBlendFunc = (pfn_glBlendFunc)load("glBlendFunc"); + fp_glBlendFuncSeparate = (pfn_glBlendFuncSeparate)load("glBlendFuncSeparate"); + fp_glBufferData = (pfn_glBufferData)load("glBufferData"); + fp_glBufferSubData = (pfn_glBufferSubData)load("glBufferSubData"); + fp_glCheckFramebufferStatus = (pfn_glCheckFramebufferStatus)load("glCheckFramebufferStatus"); + fp_glClear = (pfn_glClear)load("glClear"); + fp_glClearColor = (pfn_glClearColor)load("glClearColor"); + fp_glClearDepthf = (pfn_glClearDepthf)load("glClearDepthf"); + fp_glClearStencil = (pfn_glClearStencil)load("glClearStencil"); + fp_glColorMask = (pfn_glColorMask)load("glColorMask"); + fp_glCompileShader = (pfn_glCompileShader)load("glCompileShader"); + fp_glCompressedTexImage2D = (pfn_glCompressedTexImage2D)load("glCompressedTexImage2D"); + fp_glCompressedTexSubImage2D = (pfn_glCompressedTexSubImage2D)load("glCompressedTexSubImage2D"); + fp_glCopyTexImage2D = (pfn_glCopyTexImage2D)load("glCopyTexImage2D"); + fp_glCopyTexSubImage2D = (pfn_glCopyTexSubImage2D)load("glCopyTexSubImage2D"); + fp_glCreateProgram = (pfn_glCreateProgram)load("glCreateProgram"); + fp_glCreateShader = (pfn_glCreateShader)load("glCreateShader"); + fp_glCullFace = (pfn_glCullFace)load("glCullFace"); + fp_glDeleteBuffers = (pfn_glDeleteBuffers)load("glDeleteBuffers"); + fp_glDeleteFramebuffers = (pfn_glDeleteFramebuffers)load("glDeleteFramebuffers"); + fp_glDeleteProgram = (pfn_glDeleteProgram)load("glDeleteProgram"); + fp_glDeleteRenderbuffers = (pfn_glDeleteRenderbuffers)load("glDeleteRenderbuffers"); + fp_glDeleteShader = (pfn_glDeleteShader)load("glDeleteShader"); + fp_glDeleteTextures = (pfn_glDeleteTextures)load("glDeleteTextures"); + fp_glDepthFunc = (pfn_glDepthFunc)load("glDepthFunc"); + fp_glDepthMask = (pfn_glDepthMask)load("glDepthMask"); + fp_glDepthRangef = (pfn_glDepthRangef)load("glDepthRangef"); + fp_glDetachShader = (pfn_glDetachShader)load("glDetachShader"); + fp_glDisable = (pfn_glDisable)load("glDisable"); + fp_glDisableVertexAttribArray = (pfn_glDisableVertexAttribArray)load("glDisableVertexAttribArray"); + fp_glDrawArrays = (pfn_glDrawArrays)load("glDrawArrays"); + fp_glDrawElements = (pfn_glDrawElements)load("glDrawElements"); + fp_glEnable = (pfn_glEnable)load("glEnable"); + fp_glEnableVertexAttribArray = (pfn_glEnableVertexAttribArray)load("glEnableVertexAttribArray"); + fp_glFinish = (pfn_glFinish)load("glFinish"); + fp_glFlush = (pfn_glFlush)load("glFlush"); + fp_glFramebufferRenderbuffer = (pfn_glFramebufferRenderbuffer)load("glFramebufferRenderbuffer"); + fp_glFramebufferTexture2D = (pfn_glFramebufferTexture2D)load("glFramebufferTexture2D"); + fp_glFrontFace = (pfn_glFrontFace)load("glFrontFace"); + fp_glGenBuffers = (pfn_glGenBuffers)load("glGenBuffers"); + fp_glGenerateMipmap = (pfn_glGenerateMipmap)load("glGenerateMipmap"); + fp_glGenFramebuffers = (pfn_glGenFramebuffers)load("glGenFramebuffers"); + fp_glGenRenderbuffers = (pfn_glGenRenderbuffers)load("glGenRenderbuffers"); + fp_glGenTextures = (pfn_glGenTextures)load("glGenTextures"); + fp_glGetActiveAttrib = (pfn_glGetActiveAttrib)load("glGetActiveAttrib"); + fp_glGetActiveUniform = (pfn_glGetActiveUniform)load("glGetActiveUniform"); + fp_glGetAttachedShaders = (pfn_glGetAttachedShaders)load("glGetAttachedShaders"); + fp_glGetAttribLocation = (pfn_glGetAttribLocation)load("glGetAttribLocation"); + fp_glGetBooleanv = (pfn_glGetBooleanv)load("glGetBooleanv"); + fp_glGetBufferParameteriv = (pfn_glGetBufferParameteriv)load("glGetBufferParameteriv"); + fp_glGetError = (pfn_glGetError)load("glGetError"); + fp_glGetFloatv = (pfn_glGetFloatv)load("glGetFloatv"); + fp_glGetFramebufferAttachmentParameteriv = (pfn_glGetFramebufferAttachmentParameteriv)load("glGetFramebufferAttachmentParameteriv"); + fp_glGetIntegerv = (pfn_glGetIntegerv)load("glGetIntegerv"); + fp_glGetProgramiv = (pfn_glGetProgramiv)load("glGetProgramiv"); + fp_glGetProgramInfoLog = (pfn_glGetProgramInfoLog)load("glGetProgramInfoLog"); + fp_glGetRenderbufferParameteriv = (pfn_glGetRenderbufferParameteriv)load("glGetRenderbufferParameteriv"); + fp_glGetShaderiv = (pfn_glGetShaderiv)load("glGetShaderiv"); + fp_glGetShaderInfoLog = (pfn_glGetShaderInfoLog)load("glGetShaderInfoLog"); + fp_glGetShaderPrecisionFormat = (pfn_glGetShaderPrecisionFormat)load("glGetShaderPrecisionFormat"); + fp_glGetShaderSource = (pfn_glGetShaderSource)load("glGetShaderSource"); + fp_glGetString = (pfn_glGetString)load("glGetString"); + fp_glGetTexParameterfv = (pfn_glGetTexParameterfv)load("glGetTexParameterfv"); + fp_glGetTexParameteriv = (pfn_glGetTexParameteriv)load("glGetTexParameteriv"); + fp_glGetUniformfv = (pfn_glGetUniformfv)load("glGetUniformfv"); + fp_glGetUniformiv = (pfn_glGetUniformiv)load("glGetUniformiv"); + fp_glGetUniformLocation = (pfn_glGetUniformLocation)load("glGetUniformLocation"); + fp_glGetVertexAttribfv = (pfn_glGetVertexAttribfv)load("glGetVertexAttribfv"); + fp_glGetVertexAttribiv = (pfn_glGetVertexAttribiv)load("glGetVertexAttribiv"); + fp_glGetVertexAttribPointerv = (pfn_glGetVertexAttribPointerv)load("glGetVertexAttribPointerv"); + fp_glHint = (pfn_glHint)load("glHint"); + fp_glIsBuffer = (pfn_glIsBuffer)load("glIsBuffer"); + fp_glIsEnabled = (pfn_glIsEnabled)load("glIsEnabled"); + fp_glIsFramebuffer = (pfn_glIsFramebuffer)load("glIsFramebuffer"); + fp_glIsProgram = (pfn_glIsProgram)load("glIsProgram"); + fp_glIsRenderbuffer = (pfn_glIsRenderbuffer)load("glIsRenderbuffer"); + fp_glIsShader = (pfn_glIsShader)load("glIsShader"); + fp_glIsTexture = (pfn_glIsTexture)load("glIsTexture"); + fp_glLineWidth = (pfn_glLineWidth)load("glLineWidth"); + fp_glLinkProgram = (pfn_glLinkProgram)load("glLinkProgram"); + fp_glPixelStorei = (pfn_glPixelStorei)load("glPixelStorei"); + fp_glPolygonOffset = (pfn_glPolygonOffset)load("glPolygonOffset"); + fp_glReadPixels = (pfn_glReadPixels)load("glReadPixels"); + fp_glReleaseShaderCompiler = (pfn_glReleaseShaderCompiler)load("glReleaseShaderCompiler"); + fp_glRenderbufferStorage = (pfn_glRenderbufferStorage)load("glRenderbufferStorage"); + fp_glSampleCoverage = (pfn_glSampleCoverage)load("glSampleCoverage"); + fp_glScissor = (pfn_glScissor)load("glScissor"); + fp_glShaderBinary = (pfn_glShaderBinary)load("glShaderBinary"); + fp_glShaderSource = (pfn_glShaderSource)load("glShaderSource"); + fp_glStencilFunc = (pfn_glStencilFunc)load("glStencilFunc"); + fp_glStencilFuncSeparate = (pfn_glStencilFuncSeparate)load("glStencilFuncSeparate"); + fp_glStencilMask = (pfn_glStencilMask)load("glStencilMask"); + fp_glStencilMaskSeparate = (pfn_glStencilMaskSeparate)load("glStencilMaskSeparate"); + fp_glStencilOp = (pfn_glStencilOp)load("glStencilOp"); + fp_glStencilOpSeparate = (pfn_glStencilOpSeparate)load("glStencilOpSeparate"); + fp_glTexImage2D = (pfn_glTexImage2D)load("glTexImage2D"); + fp_glTexParameterf = (pfn_glTexParameterf)load("glTexParameterf"); + fp_glTexParameterfv = (pfn_glTexParameterfv)load("glTexParameterfv"); + fp_glTexParameteri = (pfn_glTexParameteri)load("glTexParameteri"); + fp_glTexParameteriv = (pfn_glTexParameteriv)load("glTexParameteriv"); + fp_glTexSubImage2D = (pfn_glTexSubImage2D)load("glTexSubImage2D"); + fp_glUniform1f = (pfn_glUniform1f)load("glUniform1f"); + fp_glUniform1fv = (pfn_glUniform1fv)load("glUniform1fv"); + fp_glUniform1i = (pfn_glUniform1i)load("glUniform1i"); + fp_glUniform1iv = (pfn_glUniform1iv)load("glUniform1iv"); + fp_glUniform2f = (pfn_glUniform2f)load("glUniform2f"); + fp_glUniform2fv = (pfn_glUniform2fv)load("glUniform2fv"); + fp_glUniform2i = (pfn_glUniform2i)load("glUniform2i"); + fp_glUniform2iv = (pfn_glUniform2iv)load("glUniform2iv"); + fp_glUniform3f = (pfn_glUniform3f)load("glUniform3f"); + fp_glUniform3fv = (pfn_glUniform3fv)load("glUniform3fv"); + fp_glUniform3i = (pfn_glUniform3i)load("glUniform3i"); + fp_glUniform3iv = (pfn_glUniform3iv)load("glUniform3iv"); + fp_glUniform4f = (pfn_glUniform4f)load("glUniform4f"); + fp_glUniform4fv = (pfn_glUniform4fv)load("glUniform4fv"); + fp_glUniform4i = (pfn_glUniform4i)load("glUniform4i"); + fp_glUniform4iv = (pfn_glUniform4iv)load("glUniform4iv"); + fp_glUniformMatrix2fv = (pfn_glUniformMatrix2fv)load("glUniformMatrix2fv"); + fp_glUniformMatrix3fv = (pfn_glUniformMatrix3fv)load("glUniformMatrix3fv"); + fp_glUniformMatrix4fv = (pfn_glUniformMatrix4fv)load("glUniformMatrix4fv"); + fp_glUseProgram = (pfn_glUseProgram)load("glUseProgram"); + fp_glValidateProgram = (pfn_glValidateProgram)load("glValidateProgram"); + fp_glVertexAttrib1f = (pfn_glVertexAttrib1f)load("glVertexAttrib1f"); + fp_glVertexAttrib1fv = (pfn_glVertexAttrib1fv)load("glVertexAttrib1fv"); + fp_glVertexAttrib2f = (pfn_glVertexAttrib2f)load("glVertexAttrib2f"); + fp_glVertexAttrib2fv = (pfn_glVertexAttrib2fv)load("glVertexAttrib2fv"); + fp_glVertexAttrib3f = (pfn_glVertexAttrib3f)load("glVertexAttrib3f"); + fp_glVertexAttrib3fv = (pfn_glVertexAttrib3fv)load("glVertexAttrib3fv"); + fp_glVertexAttrib4f = (pfn_glVertexAttrib4f)load("glVertexAttrib4f"); + fp_glVertexAttrib4fv = (pfn_glVertexAttrib4fv)load("glVertexAttrib4fv"); + fp_glVertexAttribPointer = (pfn_glVertexAttribPointer)load("glVertexAttribPointer"); + fp_glViewport = (pfn_glViewport)load("glViewport"); +} + +GLboolean GLAD_ES_VERSION_3_0 = GL_FALSE; +static void load_GL_ES_VERSION_3_0(LOADER load) { + if(!GLAD_ES_VERSION_3_0) return; + fp_glReadBuffer = (pfn_glReadBuffer)load("glReadBuffer"); + fp_glDrawRangeElements = (pfn_glDrawRangeElements)load("glDrawRangeElements"); + fp_glTexImage3D = (pfn_glTexImage3D)load("glTexImage3D"); + fp_glTexSubImage3D = (pfn_glTexSubImage3D)load("glTexSubImage3D"); + fp_glCopyTexSubImage3D = (pfn_glCopyTexSubImage3D)load("glCopyTexSubImage3D"); + fp_glCompressedTexImage3D = (pfn_glCompressedTexImage3D)load("glCompressedTexImage3D"); + fp_glCompressedTexSubImage3D = (pfn_glCompressedTexSubImage3D)load("glCompressedTexSubImage3D"); + fp_glGenQueries = (pfn_glGenQueries)load("glGenQueries"); + fp_glDeleteQueries = (pfn_glDeleteQueries)load("glDeleteQueries"); + fp_glIsQuery = (pfn_glIsQuery)load("glIsQuery"); + fp_glBeginQuery = (pfn_glBeginQuery)load("glBeginQuery"); + fp_glEndQuery = (pfn_glEndQuery)load("glEndQuery"); + fp_glGetQueryiv = (pfn_glGetQueryiv)load("glGetQueryiv"); + fp_glGetQueryObjectuiv = (pfn_glGetQueryObjectuiv)load("glGetQueryObjectuiv"); + fp_glUnmapBuffer = (pfn_glUnmapBuffer)load("glUnmapBuffer"); + fp_glGetBufferPointerv = (pfn_glGetBufferPointerv)load("glGetBufferPointerv"); + fp_glDrawBuffers = (pfn_glDrawBuffers)load("glDrawBuffers"); + fp_glUniformMatrix2x3fv = (pfn_glUniformMatrix2x3fv)load("glUniformMatrix2x3fv"); + fp_glUniformMatrix3x2fv = (pfn_glUniformMatrix3x2fv)load("glUniformMatrix3x2fv"); + fp_glUniformMatrix2x4fv = (pfn_glUniformMatrix2x4fv)load("glUniformMatrix2x4fv"); + fp_glUniformMatrix4x2fv = (pfn_glUniformMatrix4x2fv)load("glUniformMatrix4x2fv"); + fp_glUniformMatrix3x4fv = (pfn_glUniformMatrix3x4fv)load("glUniformMatrix3x4fv"); + fp_glUniformMatrix4x3fv = (pfn_glUniformMatrix4x3fv)load("glUniformMatrix4x3fv"); + fp_glBlitFramebuffer = (pfn_glBlitFramebuffer)load("glBlitFramebuffer"); + fp_glRenderbufferStorageMultisample = (pfn_glRenderbufferStorageMultisample)load("glRenderbufferStorageMultisample"); + fp_glFramebufferTextureLayer = (pfn_glFramebufferTextureLayer)load("glFramebufferTextureLayer"); + fp_glMapBufferRange = (pfn_glMapBufferRange)load("glMapBufferRange"); + fp_glFlushMappedBufferRange = (pfn_glFlushMappedBufferRange)load("glFlushMappedBufferRange"); + fp_glBindVertexArray = (pfn_glBindVertexArray)load("glBindVertexArray"); + fp_glDeleteVertexArrays = (pfn_glDeleteVertexArrays)load("glDeleteVertexArrays"); + fp_glGenVertexArrays = (pfn_glGenVertexArrays)load("glGenVertexArrays"); + fp_glIsVertexArray = (pfn_glIsVertexArray)load("glIsVertexArray"); + fp_glGetIntegeri_v = (pfn_glGetIntegeri_v)load("glGetIntegeri_v"); + fp_glBeginTransformFeedback = (pfn_glBeginTransformFeedback)load("glBeginTransformFeedback"); + fp_glEndTransformFeedback = (pfn_glEndTransformFeedback)load("glEndTransformFeedback"); + fp_glBindBufferRange = (pfn_glBindBufferRange)load("glBindBufferRange"); + fp_glBindBufferBase = (pfn_glBindBufferBase)load("glBindBufferBase"); + fp_glTransformFeedbackVaryings = (pfn_glTransformFeedbackVaryings)load("glTransformFeedbackVaryings"); + fp_glGetTransformFeedbackVarying = (pfn_glGetTransformFeedbackVarying)load("glGetTransformFeedbackVarying"); + fp_glVertexAttribIPointer = (pfn_glVertexAttribIPointer)load("glVertexAttribIPointer"); + fp_glGetVertexAttribIiv = (pfn_glGetVertexAttribIiv)load("glGetVertexAttribIiv"); + fp_glGetVertexAttribIuiv = (pfn_glGetVertexAttribIuiv)load("glGetVertexAttribIuiv"); + fp_glVertexAttribI4i = (pfn_glVertexAttribI4i)load("glVertexAttribI4i"); + fp_glVertexAttribI4ui = (pfn_glVertexAttribI4ui)load("glVertexAttribI4ui"); + fp_glVertexAttribI4iv = (pfn_glVertexAttribI4iv)load("glVertexAttribI4iv"); + fp_glVertexAttribI4uiv = (pfn_glVertexAttribI4uiv)load("glVertexAttribI4uiv"); + fp_glGetUniformuiv = (pfn_glGetUniformuiv)load("glGetUniformuiv"); + fp_glGetFragDataLocation = (pfn_glGetFragDataLocation)load("glGetFragDataLocation"); + fp_glUniform1ui = (pfn_glUniform1ui)load("glUniform1ui"); + fp_glUniform2ui = (pfn_glUniform2ui)load("glUniform2ui"); + fp_glUniform3ui = (pfn_glUniform3ui)load("glUniform3ui"); + fp_glUniform4ui = (pfn_glUniform4ui)load("glUniform4ui"); + fp_glUniform1uiv = (pfn_glUniform1uiv)load("glUniform1uiv"); + fp_glUniform2uiv = (pfn_glUniform2uiv)load("glUniform2uiv"); + fp_glUniform3uiv = (pfn_glUniform3uiv)load("glUniform3uiv"); + fp_glUniform4uiv = (pfn_glUniform4uiv)load("glUniform4uiv"); + fp_glClearBufferiv = (pfn_glClearBufferiv)load("glClearBufferiv"); + fp_glClearBufferuiv = (pfn_glClearBufferuiv)load("glClearBufferuiv"); + fp_glClearBufferfv = (pfn_glClearBufferfv)load("glClearBufferfv"); + fp_glClearBufferfi = (pfn_glClearBufferfi)load("glClearBufferfi"); + fp_glGetStringi = (pfn_glGetStringi)load("glGetStringi"); + fp_glCopyBufferSubData = (pfn_glCopyBufferSubData)load("glCopyBufferSubData"); + fp_glGetUniformIndices = (pfn_glGetUniformIndices)load("glGetUniformIndices"); + fp_glGetActiveUniformsiv = (pfn_glGetActiveUniformsiv)load("glGetActiveUniformsiv"); + fp_glGetUniformBlockIndex = (pfn_glGetUniformBlockIndex)load("glGetUniformBlockIndex"); + fp_glGetActiveUniformBlockiv = (pfn_glGetActiveUniformBlockiv)load("glGetActiveUniformBlockiv"); + fp_glGetActiveUniformBlockName = (pfn_glGetActiveUniformBlockName)load("glGetActiveUniformBlockName"); + fp_glUniformBlockBinding = (pfn_glUniformBlockBinding)load("glUniformBlockBinding"); + fp_glDrawArraysInstanced = (pfn_glDrawArraysInstanced)load("glDrawArraysInstanced"); + fp_glDrawElementsInstanced = (pfn_glDrawElementsInstanced)load("glDrawElementsInstanced"); + fp_glFenceSync = (pfn_glFenceSync)load("glFenceSync"); + fp_glIsSync = (pfn_glIsSync)load("glIsSync"); + fp_glDeleteSync = (pfn_glDeleteSync)load("glDeleteSync"); + fp_glClientWaitSync = (pfn_glClientWaitSync)load("glClientWaitSync"); + fp_glWaitSync = (pfn_glWaitSync)load("glWaitSync"); + fp_glGetInteger64v = (pfn_glGetInteger64v)load("glGetInteger64v"); + fp_glGetSynciv = (pfn_glGetSynciv)load("glGetSynciv"); + fp_glGetInteger64i_v = (pfn_glGetInteger64i_v)load("glGetInteger64i_v"); + fp_glGetBufferParameteri64v = (pfn_glGetBufferParameteri64v)load("glGetBufferParameteri64v"); + fp_glGenSamplers = (pfn_glGenSamplers)load("glGenSamplers"); + fp_glDeleteSamplers = (pfn_glDeleteSamplers)load("glDeleteSamplers"); + fp_glIsSampler = (pfn_glIsSampler)load("glIsSampler"); + fp_glBindSampler = (pfn_glBindSampler)load("glBindSampler"); + fp_glSamplerParameteri = (pfn_glSamplerParameteri)load("glSamplerParameteri"); + fp_glSamplerParameteriv = (pfn_glSamplerParameteriv)load("glSamplerParameteriv"); + fp_glSamplerParameterf = (pfn_glSamplerParameterf)load("glSamplerParameterf"); + fp_glSamplerParameterfv = (pfn_glSamplerParameterfv)load("glSamplerParameterfv"); + fp_glGetSamplerParameteriv = (pfn_glGetSamplerParameteriv)load("glGetSamplerParameteriv"); + fp_glGetSamplerParameterfv = (pfn_glGetSamplerParameterfv)load("glGetSamplerParameterfv"); + fp_glVertexAttribDivisor = (pfn_glVertexAttribDivisor)load("glVertexAttribDivisor"); + fp_glBindTransformFeedback = (pfn_glBindTransformFeedback)load("glBindTransformFeedback"); + fp_glDeleteTransformFeedbacks = (pfn_glDeleteTransformFeedbacks)load("glDeleteTransformFeedbacks"); + fp_glGenTransformFeedbacks = (pfn_glGenTransformFeedbacks)load("glGenTransformFeedbacks"); + fp_glIsTransformFeedback = (pfn_glIsTransformFeedback)load("glIsTransformFeedback"); + fp_glPauseTransformFeedback = (pfn_glPauseTransformFeedback)load("glPauseTransformFeedback"); + fp_glResumeTransformFeedback = (pfn_glResumeTransformFeedback)load("glResumeTransformFeedback"); + fp_glGetProgramBinary = (pfn_glGetProgramBinary)load("glGetProgramBinary"); + fp_glProgramBinary = (pfn_glProgramBinary)load("glProgramBinary"); + fp_glProgramParameteri = (pfn_glProgramParameteri)load("glProgramParameteri"); + fp_glInvalidateFramebuffer = (pfn_glInvalidateFramebuffer)load("glInvalidateFramebuffer"); + fp_glInvalidateSubFramebuffer = (pfn_glInvalidateSubFramebuffer)load("glInvalidateSubFramebuffer"); + fp_glTexStorage2D = (pfn_glTexStorage2D)load("glTexStorage2D"); + fp_glTexStorage3D = (pfn_glTexStorage3D)load("glTexStorage3D"); + fp_glGetInternalformativ = (pfn_glGetInternalformativ)load("glGetInternalformativ"); +} + +GLboolean GLAD_KHR_debug = GL_FALSE; +static void load_GL_KHR_debug(LOADER load) { + if(!GLAD_KHR_debug) return; + fp_glDebugMessageControl = (pfn_glDebugMessageControl)load("glDebugMessageControl"); + fp_glDebugMessageInsert = (pfn_glDebugMessageInsert)load("glDebugMessageInsert"); + fp_glDebugMessageCallback = (pfn_glDebugMessageCallback)load("glDebugMessageCallback"); + fp_glGetDebugMessageLog = (pfn_glGetDebugMessageLog)load("glGetDebugMessageLog"); + fp_glPushDebugGroup = (pfn_glPushDebugGroup)load("glPushDebugGroup"); + fp_glPopDebugGroup = (pfn_glPopDebugGroup)load("glPopDebugGroup"); + fp_glObjectLabel = (pfn_glObjectLabel)load("glObjectLabel"); + fp_glGetObjectLabel = (pfn_glGetObjectLabel)load("glGetObjectLabel"); + fp_glObjectPtrLabel = (pfn_glObjectPtrLabel)load("glObjectPtrLabel"); + fp_glGetObjectPtrLabel = (pfn_glGetObjectPtrLabel)load("glGetObjectPtrLabel"); + fp_glGetPointerv = (pfn_glGetPointerv)load("glGetPointerv"); + fp_glDebugMessageControlKHR = (pfn_glDebugMessageControlKHR)load("glDebugMessageControlKHR"); + fp_glDebugMessageInsertKHR = (pfn_glDebugMessageInsertKHR)load("glDebugMessageInsertKHR"); + fp_glDebugMessageCallbackKHR = (pfn_glDebugMessageCallbackKHR)load("glDebugMessageCallbackKHR"); + fp_glGetDebugMessageLogKHR = (pfn_glGetDebugMessageLogKHR)load("glGetDebugMessageLogKHR"); + fp_glPushDebugGroupKHR = (pfn_glPushDebugGroupKHR)load("glPushDebugGroupKHR"); + fp_glPopDebugGroupKHR = (pfn_glPopDebugGroupKHR)load("glPopDebugGroupKHR"); + fp_glObjectLabelKHR = (pfn_glObjectLabelKHR)load("glObjectLabelKHR"); + fp_glGetObjectLabelKHR = (pfn_glGetObjectLabelKHR)load("glGetObjectLabelKHR"); + fp_glObjectPtrLabelKHR = (pfn_glObjectPtrLabelKHR)load("glObjectPtrLabelKHR"); + fp_glGetObjectPtrLabelKHR = (pfn_glGetObjectPtrLabelKHR)load("glGetObjectPtrLabelKHR"); + fp_glGetPointervKHR = (pfn_glGetPointervKHR)load("glGetPointervKHR"); +} + +GLboolean GLAD_KHR_texture_compression_astc_hdr = GL_FALSE; +GLboolean GLAD_KHR_texture_compression_astc_ldr = GL_FALSE; +GLboolean GLAD_ARB_arrays_of_arrays = GL_FALSE; +GLboolean GLAD_ARB_base_instance = GL_FALSE; +static void load_GL_ARB_base_instance(LOADER load) { + if(!GLAD_ARB_base_instance) return; + fp_glDrawArraysInstancedBaseInstance = (pfn_glDrawArraysInstancedBaseInstance)load("glDrawArraysInstancedBaseInstance"); + fp_glDrawElementsInstancedBaseInstance = (pfn_glDrawElementsInstancedBaseInstance)load("glDrawElementsInstancedBaseInstance"); + fp_glDrawElementsInstancedBaseVertexBaseInstance = (pfn_glDrawElementsInstancedBaseVertexBaseInstance)load("glDrawElementsInstancedBaseVertexBaseInstance"); +} + +GLboolean GLAD_ARB_bindless_texture = GL_FALSE; +static void load_GL_ARB_bindless_texture(LOADER load) { + if(!GLAD_ARB_bindless_texture) return; + fp_glGetTextureHandleARB = (pfn_glGetTextureHandleARB)load("glGetTextureHandleARB"); + fp_glGetTextureSamplerHandleARB = (pfn_glGetTextureSamplerHandleARB)load("glGetTextureSamplerHandleARB"); + fp_glMakeTextureHandleResidentARB = (pfn_glMakeTextureHandleResidentARB)load("glMakeTextureHandleResidentARB"); + fp_glMakeTextureHandleNonResidentARB = (pfn_glMakeTextureHandleNonResidentARB)load("glMakeTextureHandleNonResidentARB"); + fp_glGetImageHandleARB = (pfn_glGetImageHandleARB)load("glGetImageHandleARB"); + fp_glMakeImageHandleResidentARB = (pfn_glMakeImageHandleResidentARB)load("glMakeImageHandleResidentARB"); + fp_glMakeImageHandleNonResidentARB = (pfn_glMakeImageHandleNonResidentARB)load("glMakeImageHandleNonResidentARB"); + fp_glUniformHandleui64ARB = (pfn_glUniformHandleui64ARB)load("glUniformHandleui64ARB"); + fp_glUniformHandleui64vARB = (pfn_glUniformHandleui64vARB)load("glUniformHandleui64vARB"); + fp_glProgramUniformHandleui64ARB = (pfn_glProgramUniformHandleui64ARB)load("glProgramUniformHandleui64ARB"); + fp_glProgramUniformHandleui64vARB = (pfn_glProgramUniformHandleui64vARB)load("glProgramUniformHandleui64vARB"); + fp_glIsTextureHandleResidentARB = (pfn_glIsTextureHandleResidentARB)load("glIsTextureHandleResidentARB"); + fp_glIsImageHandleResidentARB = (pfn_glIsImageHandleResidentARB)load("glIsImageHandleResidentARB"); + fp_glVertexAttribL1ui64ARB = (pfn_glVertexAttribL1ui64ARB)load("glVertexAttribL1ui64ARB"); + fp_glVertexAttribL1ui64vARB = (pfn_glVertexAttribL1ui64vARB)load("glVertexAttribL1ui64vARB"); + fp_glGetVertexAttribLui64vARB = (pfn_glGetVertexAttribLui64vARB)load("glGetVertexAttribLui64vARB"); +} + +GLboolean GLAD_ARB_blend_func_extended = GL_FALSE; +static void load_GL_ARB_blend_func_extended(LOADER load) { + if(!GLAD_ARB_blend_func_extended) return; + fp_glBindFragDataLocationIndexed = (pfn_glBindFragDataLocationIndexed)load("glBindFragDataLocationIndexed"); + fp_glGetFragDataIndex = (pfn_glGetFragDataIndex)load("glGetFragDataIndex"); +} + +GLboolean GLAD_ARB_buffer_storage = GL_FALSE; +static void load_GL_ARB_buffer_storage(LOADER load) { + if(!GLAD_ARB_buffer_storage) return; + fp_glBufferStorage = (pfn_glBufferStorage)load("glBufferStorage"); +} + +GLboolean GLAD_ARB_cl_event = GL_FALSE; +static void load_GL_ARB_cl_event(LOADER load) { + if(!GLAD_ARB_cl_event) return; + fp_glCreateSyncFromCLeventARB = (pfn_glCreateSyncFromCLeventARB)load("glCreateSyncFromCLeventARB"); +} + +GLboolean GLAD_ARB_clear_buffer_object = GL_FALSE; +static void load_GL_ARB_clear_buffer_object(LOADER load) { + if(!GLAD_ARB_clear_buffer_object) return; + fp_glClearBufferData = (pfn_glClearBufferData)load("glClearBufferData"); + fp_glClearBufferSubData = (pfn_glClearBufferSubData)load("glClearBufferSubData"); +} + +GLboolean GLAD_ARB_clear_texture = GL_FALSE; +static void load_GL_ARB_clear_texture(LOADER load) { + if(!GLAD_ARB_clear_texture) return; + fp_glClearTexImage = (pfn_glClearTexImage)load("glClearTexImage"); + fp_glClearTexSubImage = (pfn_glClearTexSubImage)load("glClearTexSubImage"); +} + +GLboolean GLAD_ARB_color_buffer_float = GL_FALSE; +static void load_GL_ARB_color_buffer_float(LOADER load) { + if(!GLAD_ARB_color_buffer_float) return; + fp_glClampColorARB = (pfn_glClampColorARB)load("glClampColorARB"); +} + +GLboolean GLAD_ARB_compatibility = GL_FALSE; +GLboolean GLAD_ARB_compressed_texture_pixel_storage = GL_FALSE; +GLboolean GLAD_ARB_compute_shader = GL_FALSE; +static void load_GL_ARB_compute_shader(LOADER load) { + if(!GLAD_ARB_compute_shader) return; + fp_glDispatchCompute = (pfn_glDispatchCompute)load("glDispatchCompute"); + fp_glDispatchComputeIndirect = (pfn_glDispatchComputeIndirect)load("glDispatchComputeIndirect"); +} + +GLboolean GLAD_ARB_compute_variable_group_size = GL_FALSE; +static void load_GL_ARB_compute_variable_group_size(LOADER load) { + if(!GLAD_ARB_compute_variable_group_size) return; + fp_glDispatchComputeGroupSizeARB = (pfn_glDispatchComputeGroupSizeARB)load("glDispatchComputeGroupSizeARB"); +} + +GLboolean GLAD_ARB_conservative_depth = GL_FALSE; +GLboolean GLAD_ARB_copy_buffer = GL_FALSE; +static void load_GL_ARB_copy_buffer(LOADER load) { + if(!GLAD_ARB_copy_buffer) return; + fp_glCopyBufferSubData = (pfn_glCopyBufferSubData)load("glCopyBufferSubData"); +} + +GLboolean GLAD_ARB_copy_image = GL_FALSE; +static void load_GL_ARB_copy_image(LOADER load) { + if(!GLAD_ARB_copy_image) return; + fp_glCopyImageSubData = (pfn_glCopyImageSubData)load("glCopyImageSubData"); +} + +GLboolean GLAD_ARB_debug_output = GL_FALSE; +static void load_GL_ARB_debug_output(LOADER load) { + if(!GLAD_ARB_debug_output) return; + fp_glDebugMessageControlARB = (pfn_glDebugMessageControlARB)load("glDebugMessageControlARB"); + fp_glDebugMessageInsertARB = (pfn_glDebugMessageInsertARB)load("glDebugMessageInsertARB"); + fp_glDebugMessageCallbackARB = (pfn_glDebugMessageCallbackARB)load("glDebugMessageCallbackARB"); + fp_glGetDebugMessageLogARB = (pfn_glGetDebugMessageLogARB)load("glGetDebugMessageLogARB"); +} + +GLboolean GLAD_ARB_depth_buffer_float = GL_FALSE; +GLboolean GLAD_ARB_depth_clamp = GL_FALSE; +GLboolean GLAD_ARB_depth_texture = GL_FALSE; +GLboolean GLAD_ARB_draw_buffers = GL_FALSE; +static void load_GL_ARB_draw_buffers(LOADER load) { + if(!GLAD_ARB_draw_buffers) return; + fp_glDrawBuffersARB = (pfn_glDrawBuffersARB)load("glDrawBuffersARB"); +} + +GLboolean GLAD_ARB_draw_buffers_blend = GL_FALSE; +static void load_GL_ARB_draw_buffers_blend(LOADER load) { + if(!GLAD_ARB_draw_buffers_blend) return; + fp_glBlendEquationiARB = (pfn_glBlendEquationiARB)load("glBlendEquationiARB"); + fp_glBlendEquationSeparateiARB = (pfn_glBlendEquationSeparateiARB)load("glBlendEquationSeparateiARB"); + fp_glBlendFunciARB = (pfn_glBlendFunciARB)load("glBlendFunciARB"); + fp_glBlendFuncSeparateiARB = (pfn_glBlendFuncSeparateiARB)load("glBlendFuncSeparateiARB"); +} + +GLboolean GLAD_ARB_draw_elements_base_vertex = GL_FALSE; +static void load_GL_ARB_draw_elements_base_vertex(LOADER load) { + if(!GLAD_ARB_draw_elements_base_vertex) return; + fp_glDrawElementsBaseVertex = (pfn_glDrawElementsBaseVertex)load("glDrawElementsBaseVertex"); + fp_glDrawRangeElementsBaseVertex = (pfn_glDrawRangeElementsBaseVertex)load("glDrawRangeElementsBaseVertex"); + fp_glDrawElementsInstancedBaseVertex = (pfn_glDrawElementsInstancedBaseVertex)load("glDrawElementsInstancedBaseVertex"); + fp_glMultiDrawElementsBaseVertex = (pfn_glMultiDrawElementsBaseVertex)load("glMultiDrawElementsBaseVertex"); +} + +GLboolean GLAD_ARB_draw_indirect = GL_FALSE; +static void load_GL_ARB_draw_indirect(LOADER load) { + if(!GLAD_ARB_draw_indirect) return; + fp_glDrawArraysIndirect = (pfn_glDrawArraysIndirect)load("glDrawArraysIndirect"); + fp_glDrawElementsIndirect = (pfn_glDrawElementsIndirect)load("glDrawElementsIndirect"); +} + +GLboolean GLAD_ARB_draw_instanced = GL_FALSE; +static void load_GL_ARB_draw_instanced(LOADER load) { + if(!GLAD_ARB_draw_instanced) return; + fp_glDrawArraysInstancedARB = (pfn_glDrawArraysInstancedARB)load("glDrawArraysInstancedARB"); + fp_glDrawElementsInstancedARB = (pfn_glDrawElementsInstancedARB)load("glDrawElementsInstancedARB"); +} + +GLboolean GLAD_ARB_enhanced_layouts = GL_FALSE; +GLboolean GLAD_ARB_ES2_compatibility = GL_FALSE; +static void load_GL_ARB_ES2_compatibility(LOADER load) { + if(!GLAD_ARB_ES2_compatibility) return; + fp_glReleaseShaderCompiler = (pfn_glReleaseShaderCompiler)load("glReleaseShaderCompiler"); + fp_glShaderBinary = (pfn_glShaderBinary)load("glShaderBinary"); + fp_glGetShaderPrecisionFormat = (pfn_glGetShaderPrecisionFormat)load("glGetShaderPrecisionFormat"); + fp_glDepthRangef = (pfn_glDepthRangef)load("glDepthRangef"); + fp_glClearDepthf = (pfn_glClearDepthf)load("glClearDepthf"); +} + +GLboolean GLAD_ARB_ES3_compatibility = GL_FALSE; +GLboolean GLAD_ARB_explicit_attrib_location = GL_FALSE; +GLboolean GLAD_ARB_explicit_uniform_location = GL_FALSE; +GLboolean GLAD_ARB_fragment_coord_conventions = GL_FALSE; +GLboolean GLAD_ARB_fragment_layer_viewport = GL_FALSE; +GLboolean GLAD_ARB_fragment_program = GL_FALSE; +static void load_GL_ARB_fragment_program(LOADER load) { + if(!GLAD_ARB_fragment_program) return; + fp_glProgramStringARB = (pfn_glProgramStringARB)load("glProgramStringARB"); + fp_glBindProgramARB = (pfn_glBindProgramARB)load("glBindProgramARB"); + fp_glDeleteProgramsARB = (pfn_glDeleteProgramsARB)load("glDeleteProgramsARB"); + fp_glGenProgramsARB = (pfn_glGenProgramsARB)load("glGenProgramsARB"); + fp_glProgramEnvParameter4dARB = (pfn_glProgramEnvParameter4dARB)load("glProgramEnvParameter4dARB"); + fp_glProgramEnvParameter4dvARB = (pfn_glProgramEnvParameter4dvARB)load("glProgramEnvParameter4dvARB"); + fp_glProgramEnvParameter4fARB = (pfn_glProgramEnvParameter4fARB)load("glProgramEnvParameter4fARB"); + fp_glProgramEnvParameter4fvARB = (pfn_glProgramEnvParameter4fvARB)load("glProgramEnvParameter4fvARB"); + fp_glProgramLocalParameter4dARB = (pfn_glProgramLocalParameter4dARB)load("glProgramLocalParameter4dARB"); + fp_glProgramLocalParameter4dvARB = (pfn_glProgramLocalParameter4dvARB)load("glProgramLocalParameter4dvARB"); + fp_glProgramLocalParameter4fARB = (pfn_glProgramLocalParameter4fARB)load("glProgramLocalParameter4fARB"); + fp_glProgramLocalParameter4fvARB = (pfn_glProgramLocalParameter4fvARB)load("glProgramLocalParameter4fvARB"); + fp_glGetProgramEnvParameterdvARB = (pfn_glGetProgramEnvParameterdvARB)load("glGetProgramEnvParameterdvARB"); + fp_glGetProgramEnvParameterfvARB = (pfn_glGetProgramEnvParameterfvARB)load("glGetProgramEnvParameterfvARB"); + fp_glGetProgramLocalParameterdvARB = (pfn_glGetProgramLocalParameterdvARB)load("glGetProgramLocalParameterdvARB"); + fp_glGetProgramLocalParameterfvARB = (pfn_glGetProgramLocalParameterfvARB)load("glGetProgramLocalParameterfvARB"); + fp_glGetProgramivARB = (pfn_glGetProgramivARB)load("glGetProgramivARB"); + fp_glGetProgramStringARB = (pfn_glGetProgramStringARB)load("glGetProgramStringARB"); + fp_glIsProgramARB = (pfn_glIsProgramARB)load("glIsProgramARB"); +} + +GLboolean GLAD_ARB_fragment_program_shadow = GL_FALSE; +GLboolean GLAD_ARB_fragment_shader = GL_FALSE; +GLboolean GLAD_ARB_framebuffer_no_attachments = GL_FALSE; +static void load_GL_ARB_framebuffer_no_attachments(LOADER load) { + if(!GLAD_ARB_framebuffer_no_attachments) return; + fp_glFramebufferParameteri = (pfn_glFramebufferParameteri)load("glFramebufferParameteri"); + fp_glGetFramebufferParameteriv = (pfn_glGetFramebufferParameteriv)load("glGetFramebufferParameteriv"); +} + +GLboolean GLAD_ARB_framebuffer_object = GL_FALSE; +static void load_GL_ARB_framebuffer_object(LOADER load) { + if(!GLAD_ARB_framebuffer_object) return; + fp_glIsRenderbuffer = (pfn_glIsRenderbuffer)load("glIsRenderbuffer"); + fp_glBindRenderbuffer = (pfn_glBindRenderbuffer)load("glBindRenderbuffer"); + fp_glDeleteRenderbuffers = (pfn_glDeleteRenderbuffers)load("glDeleteRenderbuffers"); + fp_glGenRenderbuffers = (pfn_glGenRenderbuffers)load("glGenRenderbuffers"); + fp_glRenderbufferStorage = (pfn_glRenderbufferStorage)load("glRenderbufferStorage"); + fp_glGetRenderbufferParameteriv = (pfn_glGetRenderbufferParameteriv)load("glGetRenderbufferParameteriv"); + fp_glIsFramebuffer = (pfn_glIsFramebuffer)load("glIsFramebuffer"); + fp_glBindFramebuffer = (pfn_glBindFramebuffer)load("glBindFramebuffer"); + fp_glDeleteFramebuffers = (pfn_glDeleteFramebuffers)load("glDeleteFramebuffers"); + fp_glGenFramebuffers = (pfn_glGenFramebuffers)load("glGenFramebuffers"); + fp_glCheckFramebufferStatus = (pfn_glCheckFramebufferStatus)load("glCheckFramebufferStatus"); + fp_glFramebufferTexture1D = (pfn_glFramebufferTexture1D)load("glFramebufferTexture1D"); + fp_glFramebufferTexture2D = (pfn_glFramebufferTexture2D)load("glFramebufferTexture2D"); + fp_glFramebufferTexture3D = (pfn_glFramebufferTexture3D)load("glFramebufferTexture3D"); + fp_glFramebufferRenderbuffer = (pfn_glFramebufferRenderbuffer)load("glFramebufferRenderbuffer"); + fp_glGetFramebufferAttachmentParameteriv = (pfn_glGetFramebufferAttachmentParameteriv)load("glGetFramebufferAttachmentParameteriv"); + fp_glGenerateMipmap = (pfn_glGenerateMipmap)load("glGenerateMipmap"); + fp_glBlitFramebuffer = (pfn_glBlitFramebuffer)load("glBlitFramebuffer"); + fp_glRenderbufferStorageMultisample = (pfn_glRenderbufferStorageMultisample)load("glRenderbufferStorageMultisample"); + fp_glFramebufferTextureLayer = (pfn_glFramebufferTextureLayer)load("glFramebufferTextureLayer"); +} + +GLboolean GLAD_ARB_framebuffer_sRGB = GL_FALSE; +GLboolean GLAD_ARB_geometry_shader4 = GL_FALSE; +static void load_GL_ARB_geometry_shader4(LOADER load) { + if(!GLAD_ARB_geometry_shader4) return; + fp_glProgramParameteriARB = (pfn_glProgramParameteriARB)load("glProgramParameteriARB"); + fp_glFramebufferTextureARB = (pfn_glFramebufferTextureARB)load("glFramebufferTextureARB"); + fp_glFramebufferTextureLayerARB = (pfn_glFramebufferTextureLayerARB)load("glFramebufferTextureLayerARB"); + fp_glFramebufferTextureFaceARB = (pfn_glFramebufferTextureFaceARB)load("glFramebufferTextureFaceARB"); +} + +GLboolean GLAD_ARB_get_program_binary = GL_FALSE; +static void load_GL_ARB_get_program_binary(LOADER load) { + if(!GLAD_ARB_get_program_binary) return; + fp_glGetProgramBinary = (pfn_glGetProgramBinary)load("glGetProgramBinary"); + fp_glProgramBinary = (pfn_glProgramBinary)load("glProgramBinary"); + fp_glProgramParameteri = (pfn_glProgramParameteri)load("glProgramParameteri"); +} + +GLboolean GLAD_ARB_gpu_shader5 = GL_FALSE; +GLboolean GLAD_ARB_gpu_shader_fp64 = GL_FALSE; +static void load_GL_ARB_gpu_shader_fp64(LOADER load) { + if(!GLAD_ARB_gpu_shader_fp64) return; + fp_glUniform1d = (pfn_glUniform1d)load("glUniform1d"); + fp_glUniform2d = (pfn_glUniform2d)load("glUniform2d"); + fp_glUniform3d = (pfn_glUniform3d)load("glUniform3d"); + fp_glUniform4d = (pfn_glUniform4d)load("glUniform4d"); + fp_glUniform1dv = (pfn_glUniform1dv)load("glUniform1dv"); + fp_glUniform2dv = (pfn_glUniform2dv)load("glUniform2dv"); + fp_glUniform3dv = (pfn_glUniform3dv)load("glUniform3dv"); + fp_glUniform4dv = (pfn_glUniform4dv)load("glUniform4dv"); + fp_glUniformMatrix2dv = (pfn_glUniformMatrix2dv)load("glUniformMatrix2dv"); + fp_glUniformMatrix3dv = (pfn_glUniformMatrix3dv)load("glUniformMatrix3dv"); + fp_glUniformMatrix4dv = (pfn_glUniformMatrix4dv)load("glUniformMatrix4dv"); + fp_glUniformMatrix2x3dv = (pfn_glUniformMatrix2x3dv)load("glUniformMatrix2x3dv"); + fp_glUniformMatrix2x4dv = (pfn_glUniformMatrix2x4dv)load("glUniformMatrix2x4dv"); + fp_glUniformMatrix3x2dv = (pfn_glUniformMatrix3x2dv)load("glUniformMatrix3x2dv"); + fp_glUniformMatrix3x4dv = (pfn_glUniformMatrix3x4dv)load("glUniformMatrix3x4dv"); + fp_glUniformMatrix4x2dv = (pfn_glUniformMatrix4x2dv)load("glUniformMatrix4x2dv"); + fp_glUniformMatrix4x3dv = (pfn_glUniformMatrix4x3dv)load("glUniformMatrix4x3dv"); + fp_glGetUniformdv = (pfn_glGetUniformdv)load("glGetUniformdv"); +} + +GLboolean GLAD_ARB_half_float_pixel = GL_FALSE; +GLboolean GLAD_ARB_half_float_vertex = GL_FALSE; +GLboolean GLAD_ARB_indirect_parameters = GL_FALSE; +static void load_GL_ARB_indirect_parameters(LOADER load) { + if(!GLAD_ARB_indirect_parameters) return; + fp_glMultiDrawArraysIndirectCountARB = (pfn_glMultiDrawArraysIndirectCountARB)load("glMultiDrawArraysIndirectCountARB"); + fp_glMultiDrawElementsIndirectCountARB = (pfn_glMultiDrawElementsIndirectCountARB)load("glMultiDrawElementsIndirectCountARB"); +} + +GLboolean GLAD_ARB_instanced_arrays = GL_FALSE; +static void load_GL_ARB_instanced_arrays(LOADER load) { + if(!GLAD_ARB_instanced_arrays) return; + fp_glVertexAttribDivisorARB = (pfn_glVertexAttribDivisorARB)load("glVertexAttribDivisorARB"); +} + +GLboolean GLAD_ARB_internalformat_query = GL_FALSE; +static void load_GL_ARB_internalformat_query(LOADER load) { + if(!GLAD_ARB_internalformat_query) return; + fp_glGetInternalformativ = (pfn_glGetInternalformativ)load("glGetInternalformativ"); +} + +GLboolean GLAD_ARB_internalformat_query2 = GL_FALSE; +static void load_GL_ARB_internalformat_query2(LOADER load) { + if(!GLAD_ARB_internalformat_query2) return; + fp_glGetInternalformati64v = (pfn_glGetInternalformati64v)load("glGetInternalformati64v"); +} + +GLboolean GLAD_ARB_invalidate_subdata = GL_FALSE; +static void load_GL_ARB_invalidate_subdata(LOADER load) { + if(!GLAD_ARB_invalidate_subdata) return; + fp_glInvalidateTexSubImage = (pfn_glInvalidateTexSubImage)load("glInvalidateTexSubImage"); + fp_glInvalidateTexImage = (pfn_glInvalidateTexImage)load("glInvalidateTexImage"); + fp_glInvalidateBufferSubData = (pfn_glInvalidateBufferSubData)load("glInvalidateBufferSubData"); + fp_glInvalidateBufferData = (pfn_glInvalidateBufferData)load("glInvalidateBufferData"); + fp_glInvalidateFramebuffer = (pfn_glInvalidateFramebuffer)load("glInvalidateFramebuffer"); + fp_glInvalidateSubFramebuffer = (pfn_glInvalidateSubFramebuffer)load("glInvalidateSubFramebuffer"); +} + +GLboolean GLAD_ARB_map_buffer_alignment = GL_FALSE; +GLboolean GLAD_ARB_map_buffer_range = GL_FALSE; +static void load_GL_ARB_map_buffer_range(LOADER load) { + if(!GLAD_ARB_map_buffer_range) return; + fp_glMapBufferRange = (pfn_glMapBufferRange)load("glMapBufferRange"); + fp_glFlushMappedBufferRange = (pfn_glFlushMappedBufferRange)load("glFlushMappedBufferRange"); +} + +GLboolean GLAD_ARB_matrix_palette = GL_FALSE; +static void load_GL_ARB_matrix_palette(LOADER load) { + if(!GLAD_ARB_matrix_palette) return; + fp_glCurrentPaletteMatrixARB = (pfn_glCurrentPaletteMatrixARB)load("glCurrentPaletteMatrixARB"); + fp_glMatrixIndexubvARB = (pfn_glMatrixIndexubvARB)load("glMatrixIndexubvARB"); + fp_glMatrixIndexusvARB = (pfn_glMatrixIndexusvARB)load("glMatrixIndexusvARB"); + fp_glMatrixIndexuivARB = (pfn_glMatrixIndexuivARB)load("glMatrixIndexuivARB"); + fp_glMatrixIndexPointerARB = (pfn_glMatrixIndexPointerARB)load("glMatrixIndexPointerARB"); +} + +GLboolean GLAD_ARB_multi_bind = GL_FALSE; +static void load_GL_ARB_multi_bind(LOADER load) { + if(!GLAD_ARB_multi_bind) return; + fp_glBindBuffersBase = (pfn_glBindBuffersBase)load("glBindBuffersBase"); + fp_glBindBuffersRange = (pfn_glBindBuffersRange)load("glBindBuffersRange"); + fp_glBindTextures = (pfn_glBindTextures)load("glBindTextures"); + fp_glBindSamplers = (pfn_glBindSamplers)load("glBindSamplers"); + fp_glBindImageTextures = (pfn_glBindImageTextures)load("glBindImageTextures"); + fp_glBindVertexBuffers = (pfn_glBindVertexBuffers)load("glBindVertexBuffers"); +} + +GLboolean GLAD_ARB_multi_draw_indirect = GL_FALSE; +static void load_GL_ARB_multi_draw_indirect(LOADER load) { + if(!GLAD_ARB_multi_draw_indirect) return; + fp_glMultiDrawArraysIndirect = (pfn_glMultiDrawArraysIndirect)load("glMultiDrawArraysIndirect"); + fp_glMultiDrawElementsIndirect = (pfn_glMultiDrawElementsIndirect)load("glMultiDrawElementsIndirect"); +} + +GLboolean GLAD_ARB_multisample = GL_FALSE; +static void load_GL_ARB_multisample(LOADER load) { + if(!GLAD_ARB_multisample) return; + fp_glSampleCoverageARB = (pfn_glSampleCoverageARB)load("glSampleCoverageARB"); +} + +GLboolean GLAD_ARB_multitexture = GL_FALSE; +static void load_GL_ARB_multitexture(LOADER load) { + if(!GLAD_ARB_multitexture) return; + fp_glActiveTextureARB = (pfn_glActiveTextureARB)load("glActiveTextureARB"); + fp_glClientActiveTextureARB = (pfn_glClientActiveTextureARB)load("glClientActiveTextureARB"); + fp_glMultiTexCoord1dARB = (pfn_glMultiTexCoord1dARB)load("glMultiTexCoord1dARB"); + fp_glMultiTexCoord1dvARB = (pfn_glMultiTexCoord1dvARB)load("glMultiTexCoord1dvARB"); + fp_glMultiTexCoord1fARB = (pfn_glMultiTexCoord1fARB)load("glMultiTexCoord1fARB"); + fp_glMultiTexCoord1fvARB = (pfn_glMultiTexCoord1fvARB)load("glMultiTexCoord1fvARB"); + fp_glMultiTexCoord1iARB = (pfn_glMultiTexCoord1iARB)load("glMultiTexCoord1iARB"); + fp_glMultiTexCoord1ivARB = (pfn_glMultiTexCoord1ivARB)load("glMultiTexCoord1ivARB"); + fp_glMultiTexCoord1sARB = (pfn_glMultiTexCoord1sARB)load("glMultiTexCoord1sARB"); + fp_glMultiTexCoord1svARB = (pfn_glMultiTexCoord1svARB)load("glMultiTexCoord1svARB"); + fp_glMultiTexCoord2dARB = (pfn_glMultiTexCoord2dARB)load("glMultiTexCoord2dARB"); + fp_glMultiTexCoord2dvARB = (pfn_glMultiTexCoord2dvARB)load("glMultiTexCoord2dvARB"); + fp_glMultiTexCoord2fARB = (pfn_glMultiTexCoord2fARB)load("glMultiTexCoord2fARB"); + fp_glMultiTexCoord2fvARB = (pfn_glMultiTexCoord2fvARB)load("glMultiTexCoord2fvARB"); + fp_glMultiTexCoord2iARB = (pfn_glMultiTexCoord2iARB)load("glMultiTexCoord2iARB"); + fp_glMultiTexCoord2ivARB = (pfn_glMultiTexCoord2ivARB)load("glMultiTexCoord2ivARB"); + fp_glMultiTexCoord2sARB = (pfn_glMultiTexCoord2sARB)load("glMultiTexCoord2sARB"); + fp_glMultiTexCoord2svARB = (pfn_glMultiTexCoord2svARB)load("glMultiTexCoord2svARB"); + fp_glMultiTexCoord3dARB = (pfn_glMultiTexCoord3dARB)load("glMultiTexCoord3dARB"); + fp_glMultiTexCoord3dvARB = (pfn_glMultiTexCoord3dvARB)load("glMultiTexCoord3dvARB"); + fp_glMultiTexCoord3fARB = (pfn_glMultiTexCoord3fARB)load("glMultiTexCoord3fARB"); + fp_glMultiTexCoord3fvARB = (pfn_glMultiTexCoord3fvARB)load("glMultiTexCoord3fvARB"); + fp_glMultiTexCoord3iARB = (pfn_glMultiTexCoord3iARB)load("glMultiTexCoord3iARB"); + fp_glMultiTexCoord3ivARB = (pfn_glMultiTexCoord3ivARB)load("glMultiTexCoord3ivARB"); + fp_glMultiTexCoord3sARB = (pfn_glMultiTexCoord3sARB)load("glMultiTexCoord3sARB"); + fp_glMultiTexCoord3svARB = (pfn_glMultiTexCoord3svARB)load("glMultiTexCoord3svARB"); + fp_glMultiTexCoord4dARB = (pfn_glMultiTexCoord4dARB)load("glMultiTexCoord4dARB"); + fp_glMultiTexCoord4dvARB = (pfn_glMultiTexCoord4dvARB)load("glMultiTexCoord4dvARB"); + fp_glMultiTexCoord4fARB = (pfn_glMultiTexCoord4fARB)load("glMultiTexCoord4fARB"); + fp_glMultiTexCoord4fvARB = (pfn_glMultiTexCoord4fvARB)load("glMultiTexCoord4fvARB"); + fp_glMultiTexCoord4iARB = (pfn_glMultiTexCoord4iARB)load("glMultiTexCoord4iARB"); + fp_glMultiTexCoord4ivARB = (pfn_glMultiTexCoord4ivARB)load("glMultiTexCoord4ivARB"); + fp_glMultiTexCoord4sARB = (pfn_glMultiTexCoord4sARB)load("glMultiTexCoord4sARB"); + fp_glMultiTexCoord4svARB = (pfn_glMultiTexCoord4svARB)load("glMultiTexCoord4svARB"); +} + +GLboolean GLAD_ARB_occlusion_query = GL_FALSE; +static void load_GL_ARB_occlusion_query(LOADER load) { + if(!GLAD_ARB_occlusion_query) return; + fp_glGenQueriesARB = (pfn_glGenQueriesARB)load("glGenQueriesARB"); + fp_glDeleteQueriesARB = (pfn_glDeleteQueriesARB)load("glDeleteQueriesARB"); + fp_glIsQueryARB = (pfn_glIsQueryARB)load("glIsQueryARB"); + fp_glBeginQueryARB = (pfn_glBeginQueryARB)load("glBeginQueryARB"); + fp_glEndQueryARB = (pfn_glEndQueryARB)load("glEndQueryARB"); + fp_glGetQueryivARB = (pfn_glGetQueryivARB)load("glGetQueryivARB"); + fp_glGetQueryObjectivARB = (pfn_glGetQueryObjectivARB)load("glGetQueryObjectivARB"); + fp_glGetQueryObjectuivARB = (pfn_glGetQueryObjectuivARB)load("glGetQueryObjectuivARB"); +} + +GLboolean GLAD_ARB_occlusion_query2 = GL_FALSE; +GLboolean GLAD_ARB_pixel_buffer_object = GL_FALSE; +GLboolean GLAD_ARB_point_parameters = GL_FALSE; +static void load_GL_ARB_point_parameters(LOADER load) { + if(!GLAD_ARB_point_parameters) return; + fp_glPointParameterfARB = (pfn_glPointParameterfARB)load("glPointParameterfARB"); + fp_glPointParameterfvARB = (pfn_glPointParameterfvARB)load("glPointParameterfvARB"); +} + +GLboolean GLAD_ARB_point_sprite = GL_FALSE; +GLboolean GLAD_ARB_program_interface_query = GL_FALSE; +static void load_GL_ARB_program_interface_query(LOADER load) { + if(!GLAD_ARB_program_interface_query) return; + fp_glGetProgramInterfaceiv = (pfn_glGetProgramInterfaceiv)load("glGetProgramInterfaceiv"); + fp_glGetProgramResourceIndex = (pfn_glGetProgramResourceIndex)load("glGetProgramResourceIndex"); + fp_glGetProgramResourceName = (pfn_glGetProgramResourceName)load("glGetProgramResourceName"); + fp_glGetProgramResourceiv = (pfn_glGetProgramResourceiv)load("glGetProgramResourceiv"); + fp_glGetProgramResourceLocation = (pfn_glGetProgramResourceLocation)load("glGetProgramResourceLocation"); + fp_glGetProgramResourceLocationIndex = (pfn_glGetProgramResourceLocationIndex)load("glGetProgramResourceLocationIndex"); +} + +GLboolean GLAD_ARB_provoking_vertex = GL_FALSE; +static void load_GL_ARB_provoking_vertex(LOADER load) { + if(!GLAD_ARB_provoking_vertex) return; + fp_glProvokingVertex = (pfn_glProvokingVertex)load("glProvokingVertex"); +} + +GLboolean GLAD_ARB_query_buffer_object = GL_FALSE; +GLboolean GLAD_ARB_robust_buffer_access_behavior = GL_FALSE; +GLboolean GLAD_ARB_robustness = GL_FALSE; +static void load_GL_ARB_robustness(LOADER load) { + if(!GLAD_ARB_robustness) return; + fp_glGetGraphicsResetStatusARB = (pfn_glGetGraphicsResetStatusARB)load("glGetGraphicsResetStatusARB"); + fp_glGetnTexImageARB = (pfn_glGetnTexImageARB)load("glGetnTexImageARB"); + fp_glReadnPixelsARB = (pfn_glReadnPixelsARB)load("glReadnPixelsARB"); + fp_glGetnCompressedTexImageARB = (pfn_glGetnCompressedTexImageARB)load("glGetnCompressedTexImageARB"); + fp_glGetnUniformfvARB = (pfn_glGetnUniformfvARB)load("glGetnUniformfvARB"); + fp_glGetnUniformivARB = (pfn_glGetnUniformivARB)load("glGetnUniformivARB"); + fp_glGetnUniformuivARB = (pfn_glGetnUniformuivARB)load("glGetnUniformuivARB"); + fp_glGetnUniformdvARB = (pfn_glGetnUniformdvARB)load("glGetnUniformdvARB"); + fp_glGetnMapdvARB = (pfn_glGetnMapdvARB)load("glGetnMapdvARB"); + fp_glGetnMapfvARB = (pfn_glGetnMapfvARB)load("glGetnMapfvARB"); + fp_glGetnMapivARB = (pfn_glGetnMapivARB)load("glGetnMapivARB"); + fp_glGetnPixelMapfvARB = (pfn_glGetnPixelMapfvARB)load("glGetnPixelMapfvARB"); + fp_glGetnPixelMapuivARB = (pfn_glGetnPixelMapuivARB)load("glGetnPixelMapuivARB"); + fp_glGetnPixelMapusvARB = (pfn_glGetnPixelMapusvARB)load("glGetnPixelMapusvARB"); + fp_glGetnPolygonStippleARB = (pfn_glGetnPolygonStippleARB)load("glGetnPolygonStippleARB"); + fp_glGetnColorTableARB = (pfn_glGetnColorTableARB)load("glGetnColorTableARB"); + fp_glGetnConvolutionFilterARB = (pfn_glGetnConvolutionFilterARB)load("glGetnConvolutionFilterARB"); + fp_glGetnSeparableFilterARB = (pfn_glGetnSeparableFilterARB)load("glGetnSeparableFilterARB"); + fp_glGetnHistogramARB = (pfn_glGetnHistogramARB)load("glGetnHistogramARB"); + fp_glGetnMinmaxARB = (pfn_glGetnMinmaxARB)load("glGetnMinmaxARB"); +} + +GLboolean GLAD_ARB_robustness_isolation = GL_FALSE; +GLboolean GLAD_ARB_sample_shading = GL_FALSE; +static void load_GL_ARB_sample_shading(LOADER load) { + if(!GLAD_ARB_sample_shading) return; + fp_glMinSampleShadingARB = (pfn_glMinSampleShadingARB)load("glMinSampleShadingARB"); +} + +GLboolean GLAD_ARB_sampler_objects = GL_FALSE; +static void load_GL_ARB_sampler_objects(LOADER load) { + if(!GLAD_ARB_sampler_objects) return; + fp_glGenSamplers = (pfn_glGenSamplers)load("glGenSamplers"); + fp_glDeleteSamplers = (pfn_glDeleteSamplers)load("glDeleteSamplers"); + fp_glIsSampler = (pfn_glIsSampler)load("glIsSampler"); + fp_glBindSampler = (pfn_glBindSampler)load("glBindSampler"); + fp_glSamplerParameteri = (pfn_glSamplerParameteri)load("glSamplerParameteri"); + fp_glSamplerParameteriv = (pfn_glSamplerParameteriv)load("glSamplerParameteriv"); + fp_glSamplerParameterf = (pfn_glSamplerParameterf)load("glSamplerParameterf"); + fp_glSamplerParameterfv = (pfn_glSamplerParameterfv)load("glSamplerParameterfv"); + fp_glSamplerParameterIiv = (pfn_glSamplerParameterIiv)load("glSamplerParameterIiv"); + fp_glSamplerParameterIuiv = (pfn_glSamplerParameterIuiv)load("glSamplerParameterIuiv"); + fp_glGetSamplerParameteriv = (pfn_glGetSamplerParameteriv)load("glGetSamplerParameteriv"); + fp_glGetSamplerParameterIiv = (pfn_glGetSamplerParameterIiv)load("glGetSamplerParameterIiv"); + fp_glGetSamplerParameterfv = (pfn_glGetSamplerParameterfv)load("glGetSamplerParameterfv"); + fp_glGetSamplerParameterIuiv = (pfn_glGetSamplerParameterIuiv)load("glGetSamplerParameterIuiv"); +} + +GLboolean GLAD_ARB_seamless_cube_map = GL_FALSE; +GLboolean GLAD_ARB_seamless_cubemap_per_texture = GL_FALSE; +GLboolean GLAD_ARB_separate_shader_objects = GL_FALSE; +static void load_GL_ARB_separate_shader_objects(LOADER load) { + if(!GLAD_ARB_separate_shader_objects) return; + fp_glUseProgramStages = (pfn_glUseProgramStages)load("glUseProgramStages"); + fp_glActiveShaderProgram = (pfn_glActiveShaderProgram)load("glActiveShaderProgram"); + fp_glCreateShaderProgramv = (pfn_glCreateShaderProgramv)load("glCreateShaderProgramv"); + fp_glBindProgramPipeline = (pfn_glBindProgramPipeline)load("glBindProgramPipeline"); + fp_glDeleteProgramPipelines = (pfn_glDeleteProgramPipelines)load("glDeleteProgramPipelines"); + fp_glGenProgramPipelines = (pfn_glGenProgramPipelines)load("glGenProgramPipelines"); + fp_glIsProgramPipeline = (pfn_glIsProgramPipeline)load("glIsProgramPipeline"); + fp_glGetProgramPipelineiv = (pfn_glGetProgramPipelineiv)load("glGetProgramPipelineiv"); + fp_glProgramUniform1i = (pfn_glProgramUniform1i)load("glProgramUniform1i"); + fp_glProgramUniform1iv = (pfn_glProgramUniform1iv)load("glProgramUniform1iv"); + fp_glProgramUniform1f = (pfn_glProgramUniform1f)load("glProgramUniform1f"); + fp_glProgramUniform1fv = (pfn_glProgramUniform1fv)load("glProgramUniform1fv"); + fp_glProgramUniform1d = (pfn_glProgramUniform1d)load("glProgramUniform1d"); + fp_glProgramUniform1dv = (pfn_glProgramUniform1dv)load("glProgramUniform1dv"); + fp_glProgramUniform1ui = (pfn_glProgramUniform1ui)load("glProgramUniform1ui"); + fp_glProgramUniform1uiv = (pfn_glProgramUniform1uiv)load("glProgramUniform1uiv"); + fp_glProgramUniform2i = (pfn_glProgramUniform2i)load("glProgramUniform2i"); + fp_glProgramUniform2iv = (pfn_glProgramUniform2iv)load("glProgramUniform2iv"); + fp_glProgramUniform2f = (pfn_glProgramUniform2f)load("glProgramUniform2f"); + fp_glProgramUniform2fv = (pfn_glProgramUniform2fv)load("glProgramUniform2fv"); + fp_glProgramUniform2d = (pfn_glProgramUniform2d)load("glProgramUniform2d"); + fp_glProgramUniform2dv = (pfn_glProgramUniform2dv)load("glProgramUniform2dv"); + fp_glProgramUniform2ui = (pfn_glProgramUniform2ui)load("glProgramUniform2ui"); + fp_glProgramUniform2uiv = (pfn_glProgramUniform2uiv)load("glProgramUniform2uiv"); + fp_glProgramUniform3i = (pfn_glProgramUniform3i)load("glProgramUniform3i"); + fp_glProgramUniform3iv = (pfn_glProgramUniform3iv)load("glProgramUniform3iv"); + fp_glProgramUniform3f = (pfn_glProgramUniform3f)load("glProgramUniform3f"); + fp_glProgramUniform3fv = (pfn_glProgramUniform3fv)load("glProgramUniform3fv"); + fp_glProgramUniform3d = (pfn_glProgramUniform3d)load("glProgramUniform3d"); + fp_glProgramUniform3dv = (pfn_glProgramUniform3dv)load("glProgramUniform3dv"); + fp_glProgramUniform3ui = (pfn_glProgramUniform3ui)load("glProgramUniform3ui"); + fp_glProgramUniform3uiv = (pfn_glProgramUniform3uiv)load("glProgramUniform3uiv"); + fp_glProgramUniform4i = (pfn_glProgramUniform4i)load("glProgramUniform4i"); + fp_glProgramUniform4iv = (pfn_glProgramUniform4iv)load("glProgramUniform4iv"); + fp_glProgramUniform4f = (pfn_glProgramUniform4f)load("glProgramUniform4f"); + fp_glProgramUniform4fv = (pfn_glProgramUniform4fv)load("glProgramUniform4fv"); + fp_glProgramUniform4d = (pfn_glProgramUniform4d)load("glProgramUniform4d"); + fp_glProgramUniform4dv = (pfn_glProgramUniform4dv)load("glProgramUniform4dv"); + fp_glProgramUniform4ui = (pfn_glProgramUniform4ui)load("glProgramUniform4ui"); + fp_glProgramUniform4uiv = (pfn_glProgramUniform4uiv)load("glProgramUniform4uiv"); + fp_glProgramUniformMatrix2fv = (pfn_glProgramUniformMatrix2fv)load("glProgramUniformMatrix2fv"); + fp_glProgramUniformMatrix3fv = (pfn_glProgramUniformMatrix3fv)load("glProgramUniformMatrix3fv"); + fp_glProgramUniformMatrix4fv = (pfn_glProgramUniformMatrix4fv)load("glProgramUniformMatrix4fv"); + fp_glProgramUniformMatrix2dv = (pfn_glProgramUniformMatrix2dv)load("glProgramUniformMatrix2dv"); + fp_glProgramUniformMatrix3dv = (pfn_glProgramUniformMatrix3dv)load("glProgramUniformMatrix3dv"); + fp_glProgramUniformMatrix4dv = (pfn_glProgramUniformMatrix4dv)load("glProgramUniformMatrix4dv"); + fp_glProgramUniformMatrix2x3fv = (pfn_glProgramUniformMatrix2x3fv)load("glProgramUniformMatrix2x3fv"); + fp_glProgramUniformMatrix3x2fv = (pfn_glProgramUniformMatrix3x2fv)load("glProgramUniformMatrix3x2fv"); + fp_glProgramUniformMatrix2x4fv = (pfn_glProgramUniformMatrix2x4fv)load("glProgramUniformMatrix2x4fv"); + fp_glProgramUniformMatrix4x2fv = (pfn_glProgramUniformMatrix4x2fv)load("glProgramUniformMatrix4x2fv"); + fp_glProgramUniformMatrix3x4fv = (pfn_glProgramUniformMatrix3x4fv)load("glProgramUniformMatrix3x4fv"); + fp_glProgramUniformMatrix4x3fv = (pfn_glProgramUniformMatrix4x3fv)load("glProgramUniformMatrix4x3fv"); + fp_glProgramUniformMatrix2x3dv = (pfn_glProgramUniformMatrix2x3dv)load("glProgramUniformMatrix2x3dv"); + fp_glProgramUniformMatrix3x2dv = (pfn_glProgramUniformMatrix3x2dv)load("glProgramUniformMatrix3x2dv"); + fp_glProgramUniformMatrix2x4dv = (pfn_glProgramUniformMatrix2x4dv)load("glProgramUniformMatrix2x4dv"); + fp_glProgramUniformMatrix4x2dv = (pfn_glProgramUniformMatrix4x2dv)load("glProgramUniformMatrix4x2dv"); + fp_glProgramUniformMatrix3x4dv = (pfn_glProgramUniformMatrix3x4dv)load("glProgramUniformMatrix3x4dv"); + fp_glProgramUniformMatrix4x3dv = (pfn_glProgramUniformMatrix4x3dv)load("glProgramUniformMatrix4x3dv"); + fp_glValidateProgramPipeline = (pfn_glValidateProgramPipeline)load("glValidateProgramPipeline"); + fp_glGetProgramPipelineInfoLog = (pfn_glGetProgramPipelineInfoLog)load("glGetProgramPipelineInfoLog"); +} + +GLboolean GLAD_ARB_shader_atomic_counters = GL_FALSE; +static void load_GL_ARB_shader_atomic_counters(LOADER load) { + if(!GLAD_ARB_shader_atomic_counters) return; + fp_glGetActiveAtomicCounterBufferiv = (pfn_glGetActiveAtomicCounterBufferiv)load("glGetActiveAtomicCounterBufferiv"); +} + +GLboolean GLAD_ARB_shader_bit_encoding = GL_FALSE; +GLboolean GLAD_ARB_shader_draw_parameters = GL_FALSE; +GLboolean GLAD_ARB_shader_group_vote = GL_FALSE; +GLboolean GLAD_ARB_shader_image_load_store = GL_FALSE; +static void load_GL_ARB_shader_image_load_store(LOADER load) { + if(!GLAD_ARB_shader_image_load_store) return; + fp_glBindImageTexture = (pfn_glBindImageTexture)load("glBindImageTexture"); + fp_glMemoryBarrier = (pfn_glMemoryBarrier)load("glMemoryBarrier"); +} + +GLboolean GLAD_ARB_shader_image_size = GL_FALSE; +GLboolean GLAD_ARB_shader_objects = GL_FALSE; +static void load_GL_ARB_shader_objects(LOADER load) { + if(!GLAD_ARB_shader_objects) return; + fp_glDeleteObjectARB = (pfn_glDeleteObjectARB)load("glDeleteObjectARB"); + fp_glGetHandleARB = (pfn_glGetHandleARB)load("glGetHandleARB"); + fp_glDetachObjectARB = (pfn_glDetachObjectARB)load("glDetachObjectARB"); + fp_glCreateShaderObjectARB = (pfn_glCreateShaderObjectARB)load("glCreateShaderObjectARB"); + fp_glShaderSourceARB = (pfn_glShaderSourceARB)load("glShaderSourceARB"); + fp_glCompileShaderARB = (pfn_glCompileShaderARB)load("glCompileShaderARB"); + fp_glCreateProgramObjectARB = (pfn_glCreateProgramObjectARB)load("glCreateProgramObjectARB"); + fp_glAttachObjectARB = (pfn_glAttachObjectARB)load("glAttachObjectARB"); + fp_glLinkProgramARB = (pfn_glLinkProgramARB)load("glLinkProgramARB"); + fp_glUseProgramObjectARB = (pfn_glUseProgramObjectARB)load("glUseProgramObjectARB"); + fp_glValidateProgramARB = (pfn_glValidateProgramARB)load("glValidateProgramARB"); + fp_glUniform1fARB = (pfn_glUniform1fARB)load("glUniform1fARB"); + fp_glUniform2fARB = (pfn_glUniform2fARB)load("glUniform2fARB"); + fp_glUniform3fARB = (pfn_glUniform3fARB)load("glUniform3fARB"); + fp_glUniform4fARB = (pfn_glUniform4fARB)load("glUniform4fARB"); + fp_glUniform1iARB = (pfn_glUniform1iARB)load("glUniform1iARB"); + fp_glUniform2iARB = (pfn_glUniform2iARB)load("glUniform2iARB"); + fp_glUniform3iARB = (pfn_glUniform3iARB)load("glUniform3iARB"); + fp_glUniform4iARB = (pfn_glUniform4iARB)load("glUniform4iARB"); + fp_glUniform1fvARB = (pfn_glUniform1fvARB)load("glUniform1fvARB"); + fp_glUniform2fvARB = (pfn_glUniform2fvARB)load("glUniform2fvARB"); + fp_glUniform3fvARB = (pfn_glUniform3fvARB)load("glUniform3fvARB"); + fp_glUniform4fvARB = (pfn_glUniform4fvARB)load("glUniform4fvARB"); + fp_glUniform1ivARB = (pfn_glUniform1ivARB)load("glUniform1ivARB"); + fp_glUniform2ivARB = (pfn_glUniform2ivARB)load("glUniform2ivARB"); + fp_glUniform3ivARB = (pfn_glUniform3ivARB)load("glUniform3ivARB"); + fp_glUniform4ivARB = (pfn_glUniform4ivARB)load("glUniform4ivARB"); + fp_glUniformMatrix2fvARB = (pfn_glUniformMatrix2fvARB)load("glUniformMatrix2fvARB"); + fp_glUniformMatrix3fvARB = (pfn_glUniformMatrix3fvARB)load("glUniformMatrix3fvARB"); + fp_glUniformMatrix4fvARB = (pfn_glUniformMatrix4fvARB)load("glUniformMatrix4fvARB"); + fp_glGetObjectParameterfvARB = (pfn_glGetObjectParameterfvARB)load("glGetObjectParameterfvARB"); + fp_glGetObjectParameterivARB = (pfn_glGetObjectParameterivARB)load("glGetObjectParameterivARB"); + fp_glGetInfoLogARB = (pfn_glGetInfoLogARB)load("glGetInfoLogARB"); + fp_glGetAttachedObjectsARB = (pfn_glGetAttachedObjectsARB)load("glGetAttachedObjectsARB"); + fp_glGetUniformLocationARB = (pfn_glGetUniformLocationARB)load("glGetUniformLocationARB"); + fp_glGetActiveUniformARB = (pfn_glGetActiveUniformARB)load("glGetActiveUniformARB"); + fp_glGetUniformfvARB = (pfn_glGetUniformfvARB)load("glGetUniformfvARB"); + fp_glGetUniformivARB = (pfn_glGetUniformivARB)load("glGetUniformivARB"); + fp_glGetShaderSourceARB = (pfn_glGetShaderSourceARB)load("glGetShaderSourceARB"); +} + +GLboolean GLAD_ARB_shader_precision = GL_FALSE; +GLboolean GLAD_ARB_shader_stencil_export = GL_FALSE; +GLboolean GLAD_ARB_shader_storage_buffer_object = GL_FALSE; +static void load_GL_ARB_shader_storage_buffer_object(LOADER load) { + if(!GLAD_ARB_shader_storage_buffer_object) return; + fp_glShaderStorageBlockBinding = (pfn_glShaderStorageBlockBinding)load("glShaderStorageBlockBinding"); +} + +GLboolean GLAD_ARB_shader_subroutine = GL_FALSE; +static void load_GL_ARB_shader_subroutine(LOADER load) { + if(!GLAD_ARB_shader_subroutine) return; + fp_glGetSubroutineUniformLocation = (pfn_glGetSubroutineUniformLocation)load("glGetSubroutineUniformLocation"); + fp_glGetSubroutineIndex = (pfn_glGetSubroutineIndex)load("glGetSubroutineIndex"); + fp_glGetActiveSubroutineUniformiv = (pfn_glGetActiveSubroutineUniformiv)load("glGetActiveSubroutineUniformiv"); + fp_glGetActiveSubroutineUniformName = (pfn_glGetActiveSubroutineUniformName)load("glGetActiveSubroutineUniformName"); + fp_glGetActiveSubroutineName = (pfn_glGetActiveSubroutineName)load("glGetActiveSubroutineName"); + fp_glUniformSubroutinesuiv = (pfn_glUniformSubroutinesuiv)load("glUniformSubroutinesuiv"); + fp_glGetUniformSubroutineuiv = (pfn_glGetUniformSubroutineuiv)load("glGetUniformSubroutineuiv"); + fp_glGetProgramStageiv = (pfn_glGetProgramStageiv)load("glGetProgramStageiv"); +} + +GLboolean GLAD_ARB_shader_texture_lod = GL_FALSE; +GLboolean GLAD_ARB_shading_language_100 = GL_FALSE; +GLboolean GLAD_ARB_shading_language_420pack = GL_FALSE; +GLboolean GLAD_ARB_shading_language_include = GL_FALSE; +static void load_GL_ARB_shading_language_include(LOADER load) { + if(!GLAD_ARB_shading_language_include) return; + fp_glNamedStringARB = (pfn_glNamedStringARB)load("glNamedStringARB"); + fp_glDeleteNamedStringARB = (pfn_glDeleteNamedStringARB)load("glDeleteNamedStringARB"); + fp_glCompileShaderIncludeARB = (pfn_glCompileShaderIncludeARB)load("glCompileShaderIncludeARB"); + fp_glIsNamedStringARB = (pfn_glIsNamedStringARB)load("glIsNamedStringARB"); + fp_glGetNamedStringARB = (pfn_glGetNamedStringARB)load("glGetNamedStringARB"); + fp_glGetNamedStringivARB = (pfn_glGetNamedStringivARB)load("glGetNamedStringivARB"); +} + +GLboolean GLAD_ARB_shading_language_packing = GL_FALSE; +GLboolean GLAD_ARB_shadow = GL_FALSE; +GLboolean GLAD_ARB_shadow_ambient = GL_FALSE; +GLboolean GLAD_ARB_sparse_texture = GL_FALSE; +static void load_GL_ARB_sparse_texture(LOADER load) { + if(!GLAD_ARB_sparse_texture) return; + fp_glTexPageCommitmentARB = (pfn_glTexPageCommitmentARB)load("glTexPageCommitmentARB"); +} + +GLboolean GLAD_ARB_stencil_texturing = GL_FALSE; +GLboolean GLAD_ARB_sync = GL_FALSE; +static void load_GL_ARB_sync(LOADER load) { + if(!GLAD_ARB_sync) return; + fp_glFenceSync = (pfn_glFenceSync)load("glFenceSync"); + fp_glIsSync = (pfn_glIsSync)load("glIsSync"); + fp_glDeleteSync = (pfn_glDeleteSync)load("glDeleteSync"); + fp_glClientWaitSync = (pfn_glClientWaitSync)load("glClientWaitSync"); + fp_glWaitSync = (pfn_glWaitSync)load("glWaitSync"); + fp_glGetInteger64v = (pfn_glGetInteger64v)load("glGetInteger64v"); + fp_glGetSynciv = (pfn_glGetSynciv)load("glGetSynciv"); +} + +GLboolean GLAD_ARB_tessellation_shader = GL_FALSE; +static void load_GL_ARB_tessellation_shader(LOADER load) { + if(!GLAD_ARB_tessellation_shader) return; + fp_glPatchParameteri = (pfn_glPatchParameteri)load("glPatchParameteri"); + fp_glPatchParameterfv = (pfn_glPatchParameterfv)load("glPatchParameterfv"); +} + +GLboolean GLAD_ARB_texture_border_clamp = GL_FALSE; +GLboolean GLAD_ARB_texture_buffer_object = GL_FALSE; +static void load_GL_ARB_texture_buffer_object(LOADER load) { + if(!GLAD_ARB_texture_buffer_object) return; + fp_glTexBufferARB = (pfn_glTexBufferARB)load("glTexBufferARB"); +} + +GLboolean GLAD_ARB_texture_buffer_object_rgb32 = GL_FALSE; +GLboolean GLAD_ARB_texture_buffer_range = GL_FALSE; +static void load_GL_ARB_texture_buffer_range(LOADER load) { + if(!GLAD_ARB_texture_buffer_range) return; + fp_glTexBufferRange = (pfn_glTexBufferRange)load("glTexBufferRange"); +} + +GLboolean GLAD_ARB_texture_compression = GL_FALSE; +static void load_GL_ARB_texture_compression(LOADER load) { + if(!GLAD_ARB_texture_compression) return; + fp_glCompressedTexImage3DARB = (pfn_glCompressedTexImage3DARB)load("glCompressedTexImage3DARB"); + fp_glCompressedTexImage2DARB = (pfn_glCompressedTexImage2DARB)load("glCompressedTexImage2DARB"); + fp_glCompressedTexImage1DARB = (pfn_glCompressedTexImage1DARB)load("glCompressedTexImage1DARB"); + fp_glCompressedTexSubImage3DARB = (pfn_glCompressedTexSubImage3DARB)load("glCompressedTexSubImage3DARB"); + fp_glCompressedTexSubImage2DARB = (pfn_glCompressedTexSubImage2DARB)load("glCompressedTexSubImage2DARB"); + fp_glCompressedTexSubImage1DARB = (pfn_glCompressedTexSubImage1DARB)load("glCompressedTexSubImage1DARB"); + fp_glGetCompressedTexImageARB = (pfn_glGetCompressedTexImageARB)load("glGetCompressedTexImageARB"); +} + +GLboolean GLAD_ARB_texture_compression_bptc = GL_FALSE; +GLboolean GLAD_ARB_texture_compression_rgtc = GL_FALSE; +GLboolean GLAD_ARB_texture_cube_map = GL_FALSE; +GLboolean GLAD_ARB_texture_cube_map_array = GL_FALSE; +GLboolean GLAD_ARB_texture_env_add = GL_FALSE; +GLboolean GLAD_ARB_texture_env_combine = GL_FALSE; +GLboolean GLAD_ARB_texture_env_crossbar = GL_FALSE; +GLboolean GLAD_ARB_texture_env_dot3 = GL_FALSE; +GLboolean GLAD_ARB_texture_float = GL_FALSE; +GLboolean GLAD_ARB_texture_gather = GL_FALSE; +GLboolean GLAD_ARB_texture_mirror_clamp_to_edge = GL_FALSE; +GLboolean GLAD_ARB_texture_mirrored_repeat = GL_FALSE; +GLboolean GLAD_ARB_texture_multisample = GL_FALSE; +static void load_GL_ARB_texture_multisample(LOADER load) { + if(!GLAD_ARB_texture_multisample) return; + fp_glTexImage2DMultisample = (pfn_glTexImage2DMultisample)load("glTexImage2DMultisample"); + fp_glTexImage3DMultisample = (pfn_glTexImage3DMultisample)load("glTexImage3DMultisample"); + fp_glGetMultisamplefv = (pfn_glGetMultisamplefv)load("glGetMultisamplefv"); + fp_glSampleMaski = (pfn_glSampleMaski)load("glSampleMaski"); +} + +GLboolean GLAD_ARB_texture_non_power_of_two = GL_FALSE; +GLboolean GLAD_ARB_texture_query_levels = GL_FALSE; +GLboolean GLAD_ARB_texture_query_lod = GL_FALSE; +GLboolean GLAD_ARB_texture_rectangle = GL_FALSE; +GLboolean GLAD_ARB_texture_rg = GL_FALSE; +GLboolean GLAD_ARB_texture_rgb10_a2ui = GL_FALSE; +GLboolean GLAD_ARB_texture_stencil8 = GL_FALSE; +GLboolean GLAD_ARB_texture_storage = GL_FALSE; +static void load_GL_ARB_texture_storage(LOADER load) { + if(!GLAD_ARB_texture_storage) return; + fp_glTexStorage1D = (pfn_glTexStorage1D)load("glTexStorage1D"); + fp_glTexStorage2D = (pfn_glTexStorage2D)load("glTexStorage2D"); + fp_glTexStorage3D = (pfn_glTexStorage3D)load("glTexStorage3D"); +} + +GLboolean GLAD_ARB_texture_storage_multisample = GL_FALSE; +static void load_GL_ARB_texture_storage_multisample(LOADER load) { + if(!GLAD_ARB_texture_storage_multisample) return; + fp_glTexStorage2DMultisample = (pfn_glTexStorage2DMultisample)load("glTexStorage2DMultisample"); + fp_glTexStorage3DMultisample = (pfn_glTexStorage3DMultisample)load("glTexStorage3DMultisample"); +} + +GLboolean GLAD_ARB_texture_swizzle = GL_FALSE; +GLboolean GLAD_ARB_texture_view = GL_FALSE; +static void load_GL_ARB_texture_view(LOADER load) { + if(!GLAD_ARB_texture_view) return; + fp_glTextureView = (pfn_glTextureView)load("glTextureView"); +} + +GLboolean GLAD_ARB_timer_query = GL_FALSE; +static void load_GL_ARB_timer_query(LOADER load) { + if(!GLAD_ARB_timer_query) return; + fp_glQueryCounter = (pfn_glQueryCounter)load("glQueryCounter"); + fp_glGetQueryObjecti64v = (pfn_glGetQueryObjecti64v)load("glGetQueryObjecti64v"); + fp_glGetQueryObjectui64v = (pfn_glGetQueryObjectui64v)load("glGetQueryObjectui64v"); +} + +GLboolean GLAD_ARB_transform_feedback2 = GL_FALSE; +static void load_GL_ARB_transform_feedback2(LOADER load) { + if(!GLAD_ARB_transform_feedback2) return; + fp_glBindTransformFeedback = (pfn_glBindTransformFeedback)load("glBindTransformFeedback"); + fp_glDeleteTransformFeedbacks = (pfn_glDeleteTransformFeedbacks)load("glDeleteTransformFeedbacks"); + fp_glGenTransformFeedbacks = (pfn_glGenTransformFeedbacks)load("glGenTransformFeedbacks"); + fp_glIsTransformFeedback = (pfn_glIsTransformFeedback)load("glIsTransformFeedback"); + fp_glPauseTransformFeedback = (pfn_glPauseTransformFeedback)load("glPauseTransformFeedback"); + fp_glResumeTransformFeedback = (pfn_glResumeTransformFeedback)load("glResumeTransformFeedback"); + fp_glDrawTransformFeedback = (pfn_glDrawTransformFeedback)load("glDrawTransformFeedback"); +} + +GLboolean GLAD_ARB_transform_feedback3 = GL_FALSE; +static void load_GL_ARB_transform_feedback3(LOADER load) { + if(!GLAD_ARB_transform_feedback3) return; + fp_glDrawTransformFeedbackStream = (pfn_glDrawTransformFeedbackStream)load("glDrawTransformFeedbackStream"); + fp_glBeginQueryIndexed = (pfn_glBeginQueryIndexed)load("glBeginQueryIndexed"); + fp_glEndQueryIndexed = (pfn_glEndQueryIndexed)load("glEndQueryIndexed"); + fp_glGetQueryIndexediv = (pfn_glGetQueryIndexediv)load("glGetQueryIndexediv"); +} + +GLboolean GLAD_ARB_transform_feedback_instanced = GL_FALSE; +static void load_GL_ARB_transform_feedback_instanced(LOADER load) { + if(!GLAD_ARB_transform_feedback_instanced) return; + fp_glDrawTransformFeedbackInstanced = (pfn_glDrawTransformFeedbackInstanced)load("glDrawTransformFeedbackInstanced"); + fp_glDrawTransformFeedbackStreamInstanced = (pfn_glDrawTransformFeedbackStreamInstanced)load("glDrawTransformFeedbackStreamInstanced"); +} + +GLboolean GLAD_ARB_transpose_matrix = GL_FALSE; +static void load_GL_ARB_transpose_matrix(LOADER load) { + if(!GLAD_ARB_transpose_matrix) return; + fp_glLoadTransposeMatrixfARB = (pfn_glLoadTransposeMatrixfARB)load("glLoadTransposeMatrixfARB"); + fp_glLoadTransposeMatrixdARB = (pfn_glLoadTransposeMatrixdARB)load("glLoadTransposeMatrixdARB"); + fp_glMultTransposeMatrixfARB = (pfn_glMultTransposeMatrixfARB)load("glMultTransposeMatrixfARB"); + fp_glMultTransposeMatrixdARB = (pfn_glMultTransposeMatrixdARB)load("glMultTransposeMatrixdARB"); +} + +GLboolean GLAD_ARB_uniform_buffer_object = GL_FALSE; +static void load_GL_ARB_uniform_buffer_object(LOADER load) { + if(!GLAD_ARB_uniform_buffer_object) return; + fp_glGetUniformIndices = (pfn_glGetUniformIndices)load("glGetUniformIndices"); + fp_glGetActiveUniformsiv = (pfn_glGetActiveUniformsiv)load("glGetActiveUniformsiv"); + fp_glGetActiveUniformName = (pfn_glGetActiveUniformName)load("glGetActiveUniformName"); + fp_glGetUniformBlockIndex = (pfn_glGetUniformBlockIndex)load("glGetUniformBlockIndex"); + fp_glGetActiveUniformBlockiv = (pfn_glGetActiveUniformBlockiv)load("glGetActiveUniformBlockiv"); + fp_glGetActiveUniformBlockName = (pfn_glGetActiveUniformBlockName)load("glGetActiveUniformBlockName"); + fp_glUniformBlockBinding = (pfn_glUniformBlockBinding)load("glUniformBlockBinding"); +} + +GLboolean GLAD_ARB_vertex_array_bgra = GL_FALSE; +GLboolean GLAD_ARB_vertex_array_object = GL_FALSE; +static void load_GL_ARB_vertex_array_object(LOADER load) { + if(!GLAD_ARB_vertex_array_object) return; + fp_glBindVertexArray = (pfn_glBindVertexArray)load("glBindVertexArray"); + fp_glDeleteVertexArrays = (pfn_glDeleteVertexArrays)load("glDeleteVertexArrays"); + fp_glGenVertexArrays = (pfn_glGenVertexArrays)load("glGenVertexArrays"); + fp_glIsVertexArray = (pfn_glIsVertexArray)load("glIsVertexArray"); +} + +GLboolean GLAD_ARB_vertex_attrib_64bit = GL_FALSE; +static void load_GL_ARB_vertex_attrib_64bit(LOADER load) { + if(!GLAD_ARB_vertex_attrib_64bit) return; + fp_glVertexAttribL1d = (pfn_glVertexAttribL1d)load("glVertexAttribL1d"); + fp_glVertexAttribL2d = (pfn_glVertexAttribL2d)load("glVertexAttribL2d"); + fp_glVertexAttribL3d = (pfn_glVertexAttribL3d)load("glVertexAttribL3d"); + fp_glVertexAttribL4d = (pfn_glVertexAttribL4d)load("glVertexAttribL4d"); + fp_glVertexAttribL1dv = (pfn_glVertexAttribL1dv)load("glVertexAttribL1dv"); + fp_glVertexAttribL2dv = (pfn_glVertexAttribL2dv)load("glVertexAttribL2dv"); + fp_glVertexAttribL3dv = (pfn_glVertexAttribL3dv)load("glVertexAttribL3dv"); + fp_glVertexAttribL4dv = (pfn_glVertexAttribL4dv)load("glVertexAttribL4dv"); + fp_glVertexAttribLPointer = (pfn_glVertexAttribLPointer)load("glVertexAttribLPointer"); + fp_glGetVertexAttribLdv = (pfn_glGetVertexAttribLdv)load("glGetVertexAttribLdv"); +} + +GLboolean GLAD_ARB_vertex_attrib_binding = GL_FALSE; +static void load_GL_ARB_vertex_attrib_binding(LOADER load) { + if(!GLAD_ARB_vertex_attrib_binding) return; + fp_glBindVertexBuffer = (pfn_glBindVertexBuffer)load("glBindVertexBuffer"); + fp_glVertexAttribFormat = (pfn_glVertexAttribFormat)load("glVertexAttribFormat"); + fp_glVertexAttribIFormat = (pfn_glVertexAttribIFormat)load("glVertexAttribIFormat"); + fp_glVertexAttribLFormat = (pfn_glVertexAttribLFormat)load("glVertexAttribLFormat"); + fp_glVertexAttribBinding = (pfn_glVertexAttribBinding)load("glVertexAttribBinding"); + fp_glVertexBindingDivisor = (pfn_glVertexBindingDivisor)load("glVertexBindingDivisor"); +} + +GLboolean GLAD_ARB_vertex_blend = GL_FALSE; +static void load_GL_ARB_vertex_blend(LOADER load) { + if(!GLAD_ARB_vertex_blend) return; + fp_glWeightbvARB = (pfn_glWeightbvARB)load("glWeightbvARB"); + fp_glWeightsvARB = (pfn_glWeightsvARB)load("glWeightsvARB"); + fp_glWeightivARB = (pfn_glWeightivARB)load("glWeightivARB"); + fp_glWeightfvARB = (pfn_glWeightfvARB)load("glWeightfvARB"); + fp_glWeightdvARB = (pfn_glWeightdvARB)load("glWeightdvARB"); + fp_glWeightubvARB = (pfn_glWeightubvARB)load("glWeightubvARB"); + fp_glWeightusvARB = (pfn_glWeightusvARB)load("glWeightusvARB"); + fp_glWeightuivARB = (pfn_glWeightuivARB)load("glWeightuivARB"); + fp_glWeightPointerARB = (pfn_glWeightPointerARB)load("glWeightPointerARB"); + fp_glVertexBlendARB = (pfn_glVertexBlendARB)load("glVertexBlendARB"); +} + +GLboolean GLAD_ARB_vertex_buffer_object = GL_FALSE; +static void load_GL_ARB_vertex_buffer_object(LOADER load) { + if(!GLAD_ARB_vertex_buffer_object) return; + fp_glBindBufferARB = (pfn_glBindBufferARB)load("glBindBufferARB"); + fp_glDeleteBuffersARB = (pfn_glDeleteBuffersARB)load("glDeleteBuffersARB"); + fp_glGenBuffersARB = (pfn_glGenBuffersARB)load("glGenBuffersARB"); + fp_glIsBufferARB = (pfn_glIsBufferARB)load("glIsBufferARB"); + fp_glBufferDataARB = (pfn_glBufferDataARB)load("glBufferDataARB"); + fp_glBufferSubDataARB = (pfn_glBufferSubDataARB)load("glBufferSubDataARB"); + fp_glGetBufferSubDataARB = (pfn_glGetBufferSubDataARB)load("glGetBufferSubDataARB"); + fp_glMapBufferARB = (pfn_glMapBufferARB)load("glMapBufferARB"); + fp_glUnmapBufferARB = (pfn_glUnmapBufferARB)load("glUnmapBufferARB"); + fp_glGetBufferParameterivARB = (pfn_glGetBufferParameterivARB)load("glGetBufferParameterivARB"); + fp_glGetBufferPointervARB = (pfn_glGetBufferPointervARB)load("glGetBufferPointervARB"); +} + +GLboolean GLAD_ARB_vertex_program = GL_FALSE; +static void load_GL_ARB_vertex_program(LOADER load) { + if(!GLAD_ARB_vertex_program) return; + fp_glVertexAttrib1dARB = (pfn_glVertexAttrib1dARB)load("glVertexAttrib1dARB"); + fp_glVertexAttrib1dvARB = (pfn_glVertexAttrib1dvARB)load("glVertexAttrib1dvARB"); + fp_glVertexAttrib1fARB = (pfn_glVertexAttrib1fARB)load("glVertexAttrib1fARB"); + fp_glVertexAttrib1fvARB = (pfn_glVertexAttrib1fvARB)load("glVertexAttrib1fvARB"); + fp_glVertexAttrib1sARB = (pfn_glVertexAttrib1sARB)load("glVertexAttrib1sARB"); + fp_glVertexAttrib1svARB = (pfn_glVertexAttrib1svARB)load("glVertexAttrib1svARB"); + fp_glVertexAttrib2dARB = (pfn_glVertexAttrib2dARB)load("glVertexAttrib2dARB"); + fp_glVertexAttrib2dvARB = (pfn_glVertexAttrib2dvARB)load("glVertexAttrib2dvARB"); + fp_glVertexAttrib2fARB = (pfn_glVertexAttrib2fARB)load("glVertexAttrib2fARB"); + fp_glVertexAttrib2fvARB = (pfn_glVertexAttrib2fvARB)load("glVertexAttrib2fvARB"); + fp_glVertexAttrib2sARB = (pfn_glVertexAttrib2sARB)load("glVertexAttrib2sARB"); + fp_glVertexAttrib2svARB = (pfn_glVertexAttrib2svARB)load("glVertexAttrib2svARB"); + fp_glVertexAttrib3dARB = (pfn_glVertexAttrib3dARB)load("glVertexAttrib3dARB"); + fp_glVertexAttrib3dvARB = (pfn_glVertexAttrib3dvARB)load("glVertexAttrib3dvARB"); + fp_glVertexAttrib3fARB = (pfn_glVertexAttrib3fARB)load("glVertexAttrib3fARB"); + fp_glVertexAttrib3fvARB = (pfn_glVertexAttrib3fvARB)load("glVertexAttrib3fvARB"); + fp_glVertexAttrib3sARB = (pfn_glVertexAttrib3sARB)load("glVertexAttrib3sARB"); + fp_glVertexAttrib3svARB = (pfn_glVertexAttrib3svARB)load("glVertexAttrib3svARB"); + fp_glVertexAttrib4NbvARB = (pfn_glVertexAttrib4NbvARB)load("glVertexAttrib4NbvARB"); + fp_glVertexAttrib4NivARB = (pfn_glVertexAttrib4NivARB)load("glVertexAttrib4NivARB"); + fp_glVertexAttrib4NsvARB = (pfn_glVertexAttrib4NsvARB)load("glVertexAttrib4NsvARB"); + fp_glVertexAttrib4NubARB = (pfn_glVertexAttrib4NubARB)load("glVertexAttrib4NubARB"); + fp_glVertexAttrib4NubvARB = (pfn_glVertexAttrib4NubvARB)load("glVertexAttrib4NubvARB"); + fp_glVertexAttrib4NuivARB = (pfn_glVertexAttrib4NuivARB)load("glVertexAttrib4NuivARB"); + fp_glVertexAttrib4NusvARB = (pfn_glVertexAttrib4NusvARB)load("glVertexAttrib4NusvARB"); + fp_glVertexAttrib4bvARB = (pfn_glVertexAttrib4bvARB)load("glVertexAttrib4bvARB"); + fp_glVertexAttrib4dARB = (pfn_glVertexAttrib4dARB)load("glVertexAttrib4dARB"); + fp_glVertexAttrib4dvARB = (pfn_glVertexAttrib4dvARB)load("glVertexAttrib4dvARB"); + fp_glVertexAttrib4fARB = (pfn_glVertexAttrib4fARB)load("glVertexAttrib4fARB"); + fp_glVertexAttrib4fvARB = (pfn_glVertexAttrib4fvARB)load("glVertexAttrib4fvARB"); + fp_glVertexAttrib4ivARB = (pfn_glVertexAttrib4ivARB)load("glVertexAttrib4ivARB"); + fp_glVertexAttrib4sARB = (pfn_glVertexAttrib4sARB)load("glVertexAttrib4sARB"); + fp_glVertexAttrib4svARB = (pfn_glVertexAttrib4svARB)load("glVertexAttrib4svARB"); + fp_glVertexAttrib4ubvARB = (pfn_glVertexAttrib4ubvARB)load("glVertexAttrib4ubvARB"); + fp_glVertexAttrib4uivARB = (pfn_glVertexAttrib4uivARB)load("glVertexAttrib4uivARB"); + fp_glVertexAttrib4usvARB = (pfn_glVertexAttrib4usvARB)load("glVertexAttrib4usvARB"); + fp_glVertexAttribPointerARB = (pfn_glVertexAttribPointerARB)load("glVertexAttribPointerARB"); + fp_glEnableVertexAttribArrayARB = (pfn_glEnableVertexAttribArrayARB)load("glEnableVertexAttribArrayARB"); + fp_glDisableVertexAttribArrayARB = (pfn_glDisableVertexAttribArrayARB)load("glDisableVertexAttribArrayARB"); + fp_glProgramStringARB = (pfn_glProgramStringARB)load("glProgramStringARB"); + fp_glBindProgramARB = (pfn_glBindProgramARB)load("glBindProgramARB"); + fp_glDeleteProgramsARB = (pfn_glDeleteProgramsARB)load("glDeleteProgramsARB"); + fp_glGenProgramsARB = (pfn_glGenProgramsARB)load("glGenProgramsARB"); + fp_glProgramEnvParameter4dARB = (pfn_glProgramEnvParameter4dARB)load("glProgramEnvParameter4dARB"); + fp_glProgramEnvParameter4dvARB = (pfn_glProgramEnvParameter4dvARB)load("glProgramEnvParameter4dvARB"); + fp_glProgramEnvParameter4fARB = (pfn_glProgramEnvParameter4fARB)load("glProgramEnvParameter4fARB"); + fp_glProgramEnvParameter4fvARB = (pfn_glProgramEnvParameter4fvARB)load("glProgramEnvParameter4fvARB"); + fp_glProgramLocalParameter4dARB = (pfn_glProgramLocalParameter4dARB)load("glProgramLocalParameter4dARB"); + fp_glProgramLocalParameter4dvARB = (pfn_glProgramLocalParameter4dvARB)load("glProgramLocalParameter4dvARB"); + fp_glProgramLocalParameter4fARB = (pfn_glProgramLocalParameter4fARB)load("glProgramLocalParameter4fARB"); + fp_glProgramLocalParameter4fvARB = (pfn_glProgramLocalParameter4fvARB)load("glProgramLocalParameter4fvARB"); + fp_glGetProgramEnvParameterdvARB = (pfn_glGetProgramEnvParameterdvARB)load("glGetProgramEnvParameterdvARB"); + fp_glGetProgramEnvParameterfvARB = (pfn_glGetProgramEnvParameterfvARB)load("glGetProgramEnvParameterfvARB"); + fp_glGetProgramLocalParameterdvARB = (pfn_glGetProgramLocalParameterdvARB)load("glGetProgramLocalParameterdvARB"); + fp_glGetProgramLocalParameterfvARB = (pfn_glGetProgramLocalParameterfvARB)load("glGetProgramLocalParameterfvARB"); + fp_glGetProgramivARB = (pfn_glGetProgramivARB)load("glGetProgramivARB"); + fp_glGetProgramStringARB = (pfn_glGetProgramStringARB)load("glGetProgramStringARB"); + fp_glGetVertexAttribdvARB = (pfn_glGetVertexAttribdvARB)load("glGetVertexAttribdvARB"); + fp_glGetVertexAttribfvARB = (pfn_glGetVertexAttribfvARB)load("glGetVertexAttribfvARB"); + fp_glGetVertexAttribivARB = (pfn_glGetVertexAttribivARB)load("glGetVertexAttribivARB"); + fp_glGetVertexAttribPointervARB = (pfn_glGetVertexAttribPointervARB)load("glGetVertexAttribPointervARB"); + fp_glIsProgramARB = (pfn_glIsProgramARB)load("glIsProgramARB"); +} + +GLboolean GLAD_ARB_vertex_shader = GL_FALSE; +static void load_GL_ARB_vertex_shader(LOADER load) { + if(!GLAD_ARB_vertex_shader) return; + fp_glVertexAttrib1fARB = (pfn_glVertexAttrib1fARB)load("glVertexAttrib1fARB"); + fp_glVertexAttrib1sARB = (pfn_glVertexAttrib1sARB)load("glVertexAttrib1sARB"); + fp_glVertexAttrib1dARB = (pfn_glVertexAttrib1dARB)load("glVertexAttrib1dARB"); + fp_glVertexAttrib2fARB = (pfn_glVertexAttrib2fARB)load("glVertexAttrib2fARB"); + fp_glVertexAttrib2sARB = (pfn_glVertexAttrib2sARB)load("glVertexAttrib2sARB"); + fp_glVertexAttrib2dARB = (pfn_glVertexAttrib2dARB)load("glVertexAttrib2dARB"); + fp_glVertexAttrib3fARB = (pfn_glVertexAttrib3fARB)load("glVertexAttrib3fARB"); + fp_glVertexAttrib3sARB = (pfn_glVertexAttrib3sARB)load("glVertexAttrib3sARB"); + fp_glVertexAttrib3dARB = (pfn_glVertexAttrib3dARB)load("glVertexAttrib3dARB"); + fp_glVertexAttrib4fARB = (pfn_glVertexAttrib4fARB)load("glVertexAttrib4fARB"); + fp_glVertexAttrib4sARB = (pfn_glVertexAttrib4sARB)load("glVertexAttrib4sARB"); + fp_glVertexAttrib4dARB = (pfn_glVertexAttrib4dARB)load("glVertexAttrib4dARB"); + fp_glVertexAttrib4NubARB = (pfn_glVertexAttrib4NubARB)load("glVertexAttrib4NubARB"); + fp_glVertexAttrib1fvARB = (pfn_glVertexAttrib1fvARB)load("glVertexAttrib1fvARB"); + fp_glVertexAttrib1svARB = (pfn_glVertexAttrib1svARB)load("glVertexAttrib1svARB"); + fp_glVertexAttrib1dvARB = (pfn_glVertexAttrib1dvARB)load("glVertexAttrib1dvARB"); + fp_glVertexAttrib2fvARB = (pfn_glVertexAttrib2fvARB)load("glVertexAttrib2fvARB"); + fp_glVertexAttrib2svARB = (pfn_glVertexAttrib2svARB)load("glVertexAttrib2svARB"); + fp_glVertexAttrib2dvARB = (pfn_glVertexAttrib2dvARB)load("glVertexAttrib2dvARB"); + fp_glVertexAttrib3fvARB = (pfn_glVertexAttrib3fvARB)load("glVertexAttrib3fvARB"); + fp_glVertexAttrib3svARB = (pfn_glVertexAttrib3svARB)load("glVertexAttrib3svARB"); + fp_glVertexAttrib3dvARB = (pfn_glVertexAttrib3dvARB)load("glVertexAttrib3dvARB"); + fp_glVertexAttrib4fvARB = (pfn_glVertexAttrib4fvARB)load("glVertexAttrib4fvARB"); + fp_glVertexAttrib4svARB = (pfn_glVertexAttrib4svARB)load("glVertexAttrib4svARB"); + fp_glVertexAttrib4dvARB = (pfn_glVertexAttrib4dvARB)load("glVertexAttrib4dvARB"); + fp_glVertexAttrib4ivARB = (pfn_glVertexAttrib4ivARB)load("glVertexAttrib4ivARB"); + fp_glVertexAttrib4bvARB = (pfn_glVertexAttrib4bvARB)load("glVertexAttrib4bvARB"); + fp_glVertexAttrib4ubvARB = (pfn_glVertexAttrib4ubvARB)load("glVertexAttrib4ubvARB"); + fp_glVertexAttrib4usvARB = (pfn_glVertexAttrib4usvARB)load("glVertexAttrib4usvARB"); + fp_glVertexAttrib4uivARB = (pfn_glVertexAttrib4uivARB)load("glVertexAttrib4uivARB"); + fp_glVertexAttrib4NbvARB = (pfn_glVertexAttrib4NbvARB)load("glVertexAttrib4NbvARB"); + fp_glVertexAttrib4NsvARB = (pfn_glVertexAttrib4NsvARB)load("glVertexAttrib4NsvARB"); + fp_glVertexAttrib4NivARB = (pfn_glVertexAttrib4NivARB)load("glVertexAttrib4NivARB"); + fp_glVertexAttrib4NubvARB = (pfn_glVertexAttrib4NubvARB)load("glVertexAttrib4NubvARB"); + fp_glVertexAttrib4NusvARB = (pfn_glVertexAttrib4NusvARB)load("glVertexAttrib4NusvARB"); + fp_glVertexAttrib4NuivARB = (pfn_glVertexAttrib4NuivARB)load("glVertexAttrib4NuivARB"); + fp_glVertexAttribPointerARB = (pfn_glVertexAttribPointerARB)load("glVertexAttribPointerARB"); + fp_glEnableVertexAttribArrayARB = (pfn_glEnableVertexAttribArrayARB)load("glEnableVertexAttribArrayARB"); + fp_glDisableVertexAttribArrayARB = (pfn_glDisableVertexAttribArrayARB)load("glDisableVertexAttribArrayARB"); + fp_glBindAttribLocationARB = (pfn_glBindAttribLocationARB)load("glBindAttribLocationARB"); + fp_glGetActiveAttribARB = (pfn_glGetActiveAttribARB)load("glGetActiveAttribARB"); + fp_glGetAttribLocationARB = (pfn_glGetAttribLocationARB)load("glGetAttribLocationARB"); + fp_glGetVertexAttribdvARB = (pfn_glGetVertexAttribdvARB)load("glGetVertexAttribdvARB"); + fp_glGetVertexAttribfvARB = (pfn_glGetVertexAttribfvARB)load("glGetVertexAttribfvARB"); + fp_glGetVertexAttribivARB = (pfn_glGetVertexAttribivARB)load("glGetVertexAttribivARB"); + fp_glGetVertexAttribPointervARB = (pfn_glGetVertexAttribPointervARB)load("glGetVertexAttribPointervARB"); +} + +GLboolean GLAD_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; +GLboolean GLAD_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; +static void load_GL_ARB_vertex_type_2_10_10_10_rev(LOADER load) { + if(!GLAD_ARB_vertex_type_2_10_10_10_rev) return; + fp_glVertexAttribP1ui = (pfn_glVertexAttribP1ui)load("glVertexAttribP1ui"); + fp_glVertexAttribP1uiv = (pfn_glVertexAttribP1uiv)load("glVertexAttribP1uiv"); + fp_glVertexAttribP2ui = (pfn_glVertexAttribP2ui)load("glVertexAttribP2ui"); + fp_glVertexAttribP2uiv = (pfn_glVertexAttribP2uiv)load("glVertexAttribP2uiv"); + fp_glVertexAttribP3ui = (pfn_glVertexAttribP3ui)load("glVertexAttribP3ui"); + fp_glVertexAttribP3uiv = (pfn_glVertexAttribP3uiv)load("glVertexAttribP3uiv"); + fp_glVertexAttribP4ui = (pfn_glVertexAttribP4ui)load("glVertexAttribP4ui"); + fp_glVertexAttribP4uiv = (pfn_glVertexAttribP4uiv)load("glVertexAttribP4uiv"); + fp_glVertexP2ui = (pfn_glVertexP2ui)load("glVertexP2ui"); + fp_glVertexP2uiv = (pfn_glVertexP2uiv)load("glVertexP2uiv"); + fp_glVertexP3ui = (pfn_glVertexP3ui)load("glVertexP3ui"); + fp_glVertexP3uiv = (pfn_glVertexP3uiv)load("glVertexP3uiv"); + fp_glVertexP4ui = (pfn_glVertexP4ui)load("glVertexP4ui"); + fp_glVertexP4uiv = (pfn_glVertexP4uiv)load("glVertexP4uiv"); + fp_glTexCoordP1ui = (pfn_glTexCoordP1ui)load("glTexCoordP1ui"); + fp_glTexCoordP1uiv = (pfn_glTexCoordP1uiv)load("glTexCoordP1uiv"); + fp_glTexCoordP2ui = (pfn_glTexCoordP2ui)load("glTexCoordP2ui"); + fp_glTexCoordP2uiv = (pfn_glTexCoordP2uiv)load("glTexCoordP2uiv"); + fp_glTexCoordP3ui = (pfn_glTexCoordP3ui)load("glTexCoordP3ui"); + fp_glTexCoordP3uiv = (pfn_glTexCoordP3uiv)load("glTexCoordP3uiv"); + fp_glTexCoordP4ui = (pfn_glTexCoordP4ui)load("glTexCoordP4ui"); + fp_glTexCoordP4uiv = (pfn_glTexCoordP4uiv)load("glTexCoordP4uiv"); + fp_glMultiTexCoordP1ui = (pfn_glMultiTexCoordP1ui)load("glMultiTexCoordP1ui"); + fp_glMultiTexCoordP1uiv = (pfn_glMultiTexCoordP1uiv)load("glMultiTexCoordP1uiv"); + fp_glMultiTexCoordP2ui = (pfn_glMultiTexCoordP2ui)load("glMultiTexCoordP2ui"); + fp_glMultiTexCoordP2uiv = (pfn_glMultiTexCoordP2uiv)load("glMultiTexCoordP2uiv"); + fp_glMultiTexCoordP3ui = (pfn_glMultiTexCoordP3ui)load("glMultiTexCoordP3ui"); + fp_glMultiTexCoordP3uiv = (pfn_glMultiTexCoordP3uiv)load("glMultiTexCoordP3uiv"); + fp_glMultiTexCoordP4ui = (pfn_glMultiTexCoordP4ui)load("glMultiTexCoordP4ui"); + fp_glMultiTexCoordP4uiv = (pfn_glMultiTexCoordP4uiv)load("glMultiTexCoordP4uiv"); + fp_glNormalP3ui = (pfn_glNormalP3ui)load("glNormalP3ui"); + fp_glNormalP3uiv = (pfn_glNormalP3uiv)load("glNormalP3uiv"); + fp_glColorP3ui = (pfn_glColorP3ui)load("glColorP3ui"); + fp_glColorP3uiv = (pfn_glColorP3uiv)load("glColorP3uiv"); + fp_glColorP4ui = (pfn_glColorP4ui)load("glColorP4ui"); + fp_glColorP4uiv = (pfn_glColorP4uiv)load("glColorP4uiv"); + fp_glSecondaryColorP3ui = (pfn_glSecondaryColorP3ui)load("glSecondaryColorP3ui"); + fp_glSecondaryColorP3uiv = (pfn_glSecondaryColorP3uiv)load("glSecondaryColorP3uiv"); +} + +GLboolean GLAD_ARB_viewport_array = GL_FALSE; +static void load_GL_ARB_viewport_array(LOADER load) { + if(!GLAD_ARB_viewport_array) return; + fp_glViewportArrayv = (pfn_glViewportArrayv)load("glViewportArrayv"); + fp_glViewportIndexedf = (pfn_glViewportIndexedf)load("glViewportIndexedf"); + fp_glViewportIndexedfv = (pfn_glViewportIndexedfv)load("glViewportIndexedfv"); + fp_glScissorArrayv = (pfn_glScissorArrayv)load("glScissorArrayv"); + fp_glScissorIndexed = (pfn_glScissorIndexed)load("glScissorIndexed"); + fp_glScissorIndexedv = (pfn_glScissorIndexedv)load("glScissorIndexedv"); + fp_glDepthRangeArrayv = (pfn_glDepthRangeArrayv)load("glDepthRangeArrayv"); + fp_glDepthRangeIndexed = (pfn_glDepthRangeIndexed)load("glDepthRangeIndexed"); + fp_glGetFloati_v = (pfn_glGetFloati_v)load("glGetFloati_v"); + fp_glGetDoublei_v = (pfn_glGetDoublei_v)load("glGetDoublei_v"); +} + +GLboolean GLAD_ARB_window_pos = GL_FALSE; +static void load_GL_ARB_window_pos(LOADER load) { + if(!GLAD_ARB_window_pos) return; + fp_glWindowPos2dARB = (pfn_glWindowPos2dARB)load("glWindowPos2dARB"); + fp_glWindowPos2dvARB = (pfn_glWindowPos2dvARB)load("glWindowPos2dvARB"); + fp_glWindowPos2fARB = (pfn_glWindowPos2fARB)load("glWindowPos2fARB"); + fp_glWindowPos2fvARB = (pfn_glWindowPos2fvARB)load("glWindowPos2fvARB"); + fp_glWindowPos2iARB = (pfn_glWindowPos2iARB)load("glWindowPos2iARB"); + fp_glWindowPos2ivARB = (pfn_glWindowPos2ivARB)load("glWindowPos2ivARB"); + fp_glWindowPos2sARB = (pfn_glWindowPos2sARB)load("glWindowPos2sARB"); + fp_glWindowPos2svARB = (pfn_glWindowPos2svARB)load("glWindowPos2svARB"); + fp_glWindowPos3dARB = (pfn_glWindowPos3dARB)load("glWindowPos3dARB"); + fp_glWindowPos3dvARB = (pfn_glWindowPos3dvARB)load("glWindowPos3dvARB"); + fp_glWindowPos3fARB = (pfn_glWindowPos3fARB)load("glWindowPos3fARB"); + fp_glWindowPos3fvARB = (pfn_glWindowPos3fvARB)load("glWindowPos3fvARB"); + fp_glWindowPos3iARB = (pfn_glWindowPos3iARB)load("glWindowPos3iARB"); + fp_glWindowPos3ivARB = (pfn_glWindowPos3ivARB)load("glWindowPos3ivARB"); + fp_glWindowPos3sARB = (pfn_glWindowPos3sARB)load("glWindowPos3sARB"); + fp_glWindowPos3svARB = (pfn_glWindowPos3svARB)load("glWindowPos3svARB"); +} + +GLboolean GLAD_EXT_422_pixels = GL_FALSE; +GLboolean GLAD_EXT_abgr = GL_FALSE; +GLboolean GLAD_EXT_bindable_uniform = GL_FALSE; +static void load_GL_EXT_bindable_uniform(LOADER load) { + if(!GLAD_EXT_bindable_uniform) return; + fp_glUniformBufferEXT = (pfn_glUniformBufferEXT)load("glUniformBufferEXT"); + fp_glGetUniformBufferSizeEXT = (pfn_glGetUniformBufferSizeEXT)load("glGetUniformBufferSizeEXT"); + fp_glGetUniformOffsetEXT = (pfn_glGetUniformOffsetEXT)load("glGetUniformOffsetEXT"); +} + +GLboolean GLAD_EXT_blend_color = GL_FALSE; +static void load_GL_EXT_blend_color(LOADER load) { + if(!GLAD_EXT_blend_color) return; + fp_glBlendColorEXT = (pfn_glBlendColorEXT)load("glBlendColorEXT"); +} + +GLboolean GLAD_EXT_blend_equation_separate = GL_FALSE; +static void load_GL_EXT_blend_equation_separate(LOADER load) { + if(!GLAD_EXT_blend_equation_separate) return; + fp_glBlendEquationSeparateEXT = (pfn_glBlendEquationSeparateEXT)load("glBlendEquationSeparateEXT"); +} + +GLboolean GLAD_EXT_blend_func_separate = GL_FALSE; +static void load_GL_EXT_blend_func_separate(LOADER load) { + if(!GLAD_EXT_blend_func_separate) return; + fp_glBlendFuncSeparateEXT = (pfn_glBlendFuncSeparateEXT)load("glBlendFuncSeparateEXT"); +} + +GLboolean GLAD_EXT_blend_minmax = GL_FALSE; +static void load_GL_EXT_blend_minmax(LOADER load) { + if(!GLAD_EXT_blend_minmax) return; + fp_glBlendEquationEXT = (pfn_glBlendEquationEXT)load("glBlendEquationEXT"); +} + +GLboolean GLAD_EXT_blend_subtract = GL_FALSE; +GLboolean GLAD_EXT_clip_volume_hint = GL_FALSE; +GLboolean GLAD_EXT_cmyka = GL_FALSE; +GLboolean GLAD_EXT_color_buffer_half_float = GL_FALSE; +GLboolean GLAD_EXT_color_subtable = GL_FALSE; +static void load_GL_EXT_color_subtable(LOADER load) { + if(!GLAD_EXT_color_subtable) return; + fp_glColorSubTableEXT = (pfn_glColorSubTableEXT)load("glColorSubTableEXT"); + fp_glCopyColorSubTableEXT = (pfn_glCopyColorSubTableEXT)load("glCopyColorSubTableEXT"); +} + +GLboolean GLAD_EXT_compiled_vertex_array = GL_FALSE; +static void load_GL_EXT_compiled_vertex_array(LOADER load) { + if(!GLAD_EXT_compiled_vertex_array) return; + fp_glLockArraysEXT = (pfn_glLockArraysEXT)load("glLockArraysEXT"); + fp_glUnlockArraysEXT = (pfn_glUnlockArraysEXT)load("glUnlockArraysEXT"); +} + +GLboolean GLAD_EXT_convolution = GL_FALSE; +static void load_GL_EXT_convolution(LOADER load) { + if(!GLAD_EXT_convolution) return; + fp_glConvolutionFilter1DEXT = (pfn_glConvolutionFilter1DEXT)load("glConvolutionFilter1DEXT"); + fp_glConvolutionFilter2DEXT = (pfn_glConvolutionFilter2DEXT)load("glConvolutionFilter2DEXT"); + fp_glConvolutionParameterfEXT = (pfn_glConvolutionParameterfEXT)load("glConvolutionParameterfEXT"); + fp_glConvolutionParameterfvEXT = (pfn_glConvolutionParameterfvEXT)load("glConvolutionParameterfvEXT"); + fp_glConvolutionParameteriEXT = (pfn_glConvolutionParameteriEXT)load("glConvolutionParameteriEXT"); + fp_glConvolutionParameterivEXT = (pfn_glConvolutionParameterivEXT)load("glConvolutionParameterivEXT"); + fp_glCopyConvolutionFilter1DEXT = (pfn_glCopyConvolutionFilter1DEXT)load("glCopyConvolutionFilter1DEXT"); + fp_glCopyConvolutionFilter2DEXT = (pfn_glCopyConvolutionFilter2DEXT)load("glCopyConvolutionFilter2DEXT"); + fp_glGetConvolutionFilterEXT = (pfn_glGetConvolutionFilterEXT)load("glGetConvolutionFilterEXT"); + fp_glGetConvolutionParameterfvEXT = (pfn_glGetConvolutionParameterfvEXT)load("glGetConvolutionParameterfvEXT"); + fp_glGetConvolutionParameterivEXT = (pfn_glGetConvolutionParameterivEXT)load("glGetConvolutionParameterivEXT"); + fp_glGetSeparableFilterEXT = (pfn_glGetSeparableFilterEXT)load("glGetSeparableFilterEXT"); + fp_glSeparableFilter2DEXT = (pfn_glSeparableFilter2DEXT)load("glSeparableFilter2DEXT"); +} + +GLboolean GLAD_EXT_coordinate_frame = GL_FALSE; +static void load_GL_EXT_coordinate_frame(LOADER load) { + if(!GLAD_EXT_coordinate_frame) return; + fp_glTangent3bEXT = (pfn_glTangent3bEXT)load("glTangent3bEXT"); + fp_glTangent3bvEXT = (pfn_glTangent3bvEXT)load("glTangent3bvEXT"); + fp_glTangent3dEXT = (pfn_glTangent3dEXT)load("glTangent3dEXT"); + fp_glTangent3dvEXT = (pfn_glTangent3dvEXT)load("glTangent3dvEXT"); + fp_glTangent3fEXT = (pfn_glTangent3fEXT)load("glTangent3fEXT"); + fp_glTangent3fvEXT = (pfn_glTangent3fvEXT)load("glTangent3fvEXT"); + fp_glTangent3iEXT = (pfn_glTangent3iEXT)load("glTangent3iEXT"); + fp_glTangent3ivEXT = (pfn_glTangent3ivEXT)load("glTangent3ivEXT"); + fp_glTangent3sEXT = (pfn_glTangent3sEXT)load("glTangent3sEXT"); + fp_glTangent3svEXT = (pfn_glTangent3svEXT)load("glTangent3svEXT"); + fp_glBinormal3bEXT = (pfn_glBinormal3bEXT)load("glBinormal3bEXT"); + fp_glBinormal3bvEXT = (pfn_glBinormal3bvEXT)load("glBinormal3bvEXT"); + fp_glBinormal3dEXT = (pfn_glBinormal3dEXT)load("glBinormal3dEXT"); + fp_glBinormal3dvEXT = (pfn_glBinormal3dvEXT)load("glBinormal3dvEXT"); + fp_glBinormal3fEXT = (pfn_glBinormal3fEXT)load("glBinormal3fEXT"); + fp_glBinormal3fvEXT = (pfn_glBinormal3fvEXT)load("glBinormal3fvEXT"); + fp_glBinormal3iEXT = (pfn_glBinormal3iEXT)load("glBinormal3iEXT"); + fp_glBinormal3ivEXT = (pfn_glBinormal3ivEXT)load("glBinormal3ivEXT"); + fp_glBinormal3sEXT = (pfn_glBinormal3sEXT)load("glBinormal3sEXT"); + fp_glBinormal3svEXT = (pfn_glBinormal3svEXT)load("glBinormal3svEXT"); + fp_glTangentPointerEXT = (pfn_glTangentPointerEXT)load("glTangentPointerEXT"); + fp_glBinormalPointerEXT = (pfn_glBinormalPointerEXT)load("glBinormalPointerEXT"); +} + +GLboolean GLAD_EXT_cull_vertex = GL_FALSE; +static void load_GL_EXT_cull_vertex(LOADER load) { + if(!GLAD_EXT_cull_vertex) return; + fp_glCullParameterdvEXT = (pfn_glCullParameterdvEXT)load("glCullParameterdvEXT"); + fp_glCullParameterfvEXT = (pfn_glCullParameterfvEXT)load("glCullParameterfvEXT"); +} + +GLboolean GLAD_EXT_debug_label = GL_FALSE; +static void load_GL_EXT_debug_label(LOADER load) { + if(!GLAD_EXT_debug_label) return; + fp_glLabelObjectEXT = (pfn_glLabelObjectEXT)load("glLabelObjectEXT"); + fp_glGetObjectLabelEXT = (pfn_glGetObjectLabelEXT)load("glGetObjectLabelEXT"); +} + +GLboolean GLAD_EXT_debug_marker = GL_FALSE; +static void load_GL_EXT_debug_marker(LOADER load) { + if(!GLAD_EXT_debug_marker) return; + fp_glInsertEventMarkerEXT = (pfn_glInsertEventMarkerEXT)load("glInsertEventMarkerEXT"); + fp_glPushGroupMarkerEXT = (pfn_glPushGroupMarkerEXT)load("glPushGroupMarkerEXT"); + fp_glPopGroupMarkerEXT = (pfn_glPopGroupMarkerEXT)load("glPopGroupMarkerEXT"); +} + +GLboolean GLAD_EXT_depth_bounds_test = GL_FALSE; +static void load_GL_EXT_depth_bounds_test(LOADER load) { + if(!GLAD_EXT_depth_bounds_test) return; + fp_glDepthBoundsEXT = (pfn_glDepthBoundsEXT)load("glDepthBoundsEXT"); +} + +GLboolean GLAD_EXT_direct_state_access = GL_FALSE; +static void load_GL_EXT_direct_state_access(LOADER load) { + if(!GLAD_EXT_direct_state_access) return; + fp_glMatrixLoadfEXT = (pfn_glMatrixLoadfEXT)load("glMatrixLoadfEXT"); + fp_glMatrixLoaddEXT = (pfn_glMatrixLoaddEXT)load("glMatrixLoaddEXT"); + fp_glMatrixMultfEXT = (pfn_glMatrixMultfEXT)load("glMatrixMultfEXT"); + fp_glMatrixMultdEXT = (pfn_glMatrixMultdEXT)load("glMatrixMultdEXT"); + fp_glMatrixLoadIdentityEXT = (pfn_glMatrixLoadIdentityEXT)load("glMatrixLoadIdentityEXT"); + fp_glMatrixRotatefEXT = (pfn_glMatrixRotatefEXT)load("glMatrixRotatefEXT"); + fp_glMatrixRotatedEXT = (pfn_glMatrixRotatedEXT)load("glMatrixRotatedEXT"); + fp_glMatrixScalefEXT = (pfn_glMatrixScalefEXT)load("glMatrixScalefEXT"); + fp_glMatrixScaledEXT = (pfn_glMatrixScaledEXT)load("glMatrixScaledEXT"); + fp_glMatrixTranslatefEXT = (pfn_glMatrixTranslatefEXT)load("glMatrixTranslatefEXT"); + fp_glMatrixTranslatedEXT = (pfn_glMatrixTranslatedEXT)load("glMatrixTranslatedEXT"); + fp_glMatrixFrustumEXT = (pfn_glMatrixFrustumEXT)load("glMatrixFrustumEXT"); + fp_glMatrixOrthoEXT = (pfn_glMatrixOrthoEXT)load("glMatrixOrthoEXT"); + fp_glMatrixPopEXT = (pfn_glMatrixPopEXT)load("glMatrixPopEXT"); + fp_glMatrixPushEXT = (pfn_glMatrixPushEXT)load("glMatrixPushEXT"); + fp_glClientAttribDefaultEXT = (pfn_glClientAttribDefaultEXT)load("glClientAttribDefaultEXT"); + fp_glPushClientAttribDefaultEXT = (pfn_glPushClientAttribDefaultEXT)load("glPushClientAttribDefaultEXT"); + fp_glTextureParameterfEXT = (pfn_glTextureParameterfEXT)load("glTextureParameterfEXT"); + fp_glTextureParameterfvEXT = (pfn_glTextureParameterfvEXT)load("glTextureParameterfvEXT"); + fp_glTextureParameteriEXT = (pfn_glTextureParameteriEXT)load("glTextureParameteriEXT"); + fp_glTextureParameterivEXT = (pfn_glTextureParameterivEXT)load("glTextureParameterivEXT"); + fp_glTextureImage1DEXT = (pfn_glTextureImage1DEXT)load("glTextureImage1DEXT"); + fp_glTextureImage2DEXT = (pfn_glTextureImage2DEXT)load("glTextureImage2DEXT"); + fp_glTextureSubImage1DEXT = (pfn_glTextureSubImage1DEXT)load("glTextureSubImage1DEXT"); + fp_glTextureSubImage2DEXT = (pfn_glTextureSubImage2DEXT)load("glTextureSubImage2DEXT"); + fp_glCopyTextureImage1DEXT = (pfn_glCopyTextureImage1DEXT)load("glCopyTextureImage1DEXT"); + fp_glCopyTextureImage2DEXT = (pfn_glCopyTextureImage2DEXT)load("glCopyTextureImage2DEXT"); + fp_glCopyTextureSubImage1DEXT = (pfn_glCopyTextureSubImage1DEXT)load("glCopyTextureSubImage1DEXT"); + fp_glCopyTextureSubImage2DEXT = (pfn_glCopyTextureSubImage2DEXT)load("glCopyTextureSubImage2DEXT"); + fp_glGetTextureImageEXT = (pfn_glGetTextureImageEXT)load("glGetTextureImageEXT"); + fp_glGetTextureParameterfvEXT = (pfn_glGetTextureParameterfvEXT)load("glGetTextureParameterfvEXT"); + fp_glGetTextureParameterivEXT = (pfn_glGetTextureParameterivEXT)load("glGetTextureParameterivEXT"); + fp_glGetTextureLevelParameterfvEXT = (pfn_glGetTextureLevelParameterfvEXT)load("glGetTextureLevelParameterfvEXT"); + fp_glGetTextureLevelParameterivEXT = (pfn_glGetTextureLevelParameterivEXT)load("glGetTextureLevelParameterivEXT"); + fp_glTextureImage3DEXT = (pfn_glTextureImage3DEXT)load("glTextureImage3DEXT"); + fp_glTextureSubImage3DEXT = (pfn_glTextureSubImage3DEXT)load("glTextureSubImage3DEXT"); + fp_glCopyTextureSubImage3DEXT = (pfn_glCopyTextureSubImage3DEXT)load("glCopyTextureSubImage3DEXT"); + fp_glBindMultiTextureEXT = (pfn_glBindMultiTextureEXT)load("glBindMultiTextureEXT"); + fp_glMultiTexCoordPointerEXT = (pfn_glMultiTexCoordPointerEXT)load("glMultiTexCoordPointerEXT"); + fp_glMultiTexEnvfEXT = (pfn_glMultiTexEnvfEXT)load("glMultiTexEnvfEXT"); + fp_glMultiTexEnvfvEXT = (pfn_glMultiTexEnvfvEXT)load("glMultiTexEnvfvEXT"); + fp_glMultiTexEnviEXT = (pfn_glMultiTexEnviEXT)load("glMultiTexEnviEXT"); + fp_glMultiTexEnvivEXT = (pfn_glMultiTexEnvivEXT)load("glMultiTexEnvivEXT"); + fp_glMultiTexGendEXT = (pfn_glMultiTexGendEXT)load("glMultiTexGendEXT"); + fp_glMultiTexGendvEXT = (pfn_glMultiTexGendvEXT)load("glMultiTexGendvEXT"); + fp_glMultiTexGenfEXT = (pfn_glMultiTexGenfEXT)load("glMultiTexGenfEXT"); + fp_glMultiTexGenfvEXT = (pfn_glMultiTexGenfvEXT)load("glMultiTexGenfvEXT"); + fp_glMultiTexGeniEXT = (pfn_glMultiTexGeniEXT)load("glMultiTexGeniEXT"); + fp_glMultiTexGenivEXT = (pfn_glMultiTexGenivEXT)load("glMultiTexGenivEXT"); + fp_glGetMultiTexEnvfvEXT = (pfn_glGetMultiTexEnvfvEXT)load("glGetMultiTexEnvfvEXT"); + fp_glGetMultiTexEnvivEXT = (pfn_glGetMultiTexEnvivEXT)load("glGetMultiTexEnvivEXT"); + fp_glGetMultiTexGendvEXT = (pfn_glGetMultiTexGendvEXT)load("glGetMultiTexGendvEXT"); + fp_glGetMultiTexGenfvEXT = (pfn_glGetMultiTexGenfvEXT)load("glGetMultiTexGenfvEXT"); + fp_glGetMultiTexGenivEXT = (pfn_glGetMultiTexGenivEXT)load("glGetMultiTexGenivEXT"); + fp_glMultiTexParameteriEXT = (pfn_glMultiTexParameteriEXT)load("glMultiTexParameteriEXT"); + fp_glMultiTexParameterivEXT = (pfn_glMultiTexParameterivEXT)load("glMultiTexParameterivEXT"); + fp_glMultiTexParameterfEXT = (pfn_glMultiTexParameterfEXT)load("glMultiTexParameterfEXT"); + fp_glMultiTexParameterfvEXT = (pfn_glMultiTexParameterfvEXT)load("glMultiTexParameterfvEXT"); + fp_glMultiTexImage1DEXT = (pfn_glMultiTexImage1DEXT)load("glMultiTexImage1DEXT"); + fp_glMultiTexImage2DEXT = (pfn_glMultiTexImage2DEXT)load("glMultiTexImage2DEXT"); + fp_glMultiTexSubImage1DEXT = (pfn_glMultiTexSubImage1DEXT)load("glMultiTexSubImage1DEXT"); + fp_glMultiTexSubImage2DEXT = (pfn_glMultiTexSubImage2DEXT)load("glMultiTexSubImage2DEXT"); + fp_glCopyMultiTexImage1DEXT = (pfn_glCopyMultiTexImage1DEXT)load("glCopyMultiTexImage1DEXT"); + fp_glCopyMultiTexImage2DEXT = (pfn_glCopyMultiTexImage2DEXT)load("glCopyMultiTexImage2DEXT"); + fp_glCopyMultiTexSubImage1DEXT = (pfn_glCopyMultiTexSubImage1DEXT)load("glCopyMultiTexSubImage1DEXT"); + fp_glCopyMultiTexSubImage2DEXT = (pfn_glCopyMultiTexSubImage2DEXT)load("glCopyMultiTexSubImage2DEXT"); + fp_glGetMultiTexImageEXT = (pfn_glGetMultiTexImageEXT)load("glGetMultiTexImageEXT"); + fp_glGetMultiTexParameterfvEXT = (pfn_glGetMultiTexParameterfvEXT)load("glGetMultiTexParameterfvEXT"); + fp_glGetMultiTexParameterivEXT = (pfn_glGetMultiTexParameterivEXT)load("glGetMultiTexParameterivEXT"); + fp_glGetMultiTexLevelParameterfvEXT = (pfn_glGetMultiTexLevelParameterfvEXT)load("glGetMultiTexLevelParameterfvEXT"); + fp_glGetMultiTexLevelParameterivEXT = (pfn_glGetMultiTexLevelParameterivEXT)load("glGetMultiTexLevelParameterivEXT"); + fp_glMultiTexImage3DEXT = (pfn_glMultiTexImage3DEXT)load("glMultiTexImage3DEXT"); + fp_glMultiTexSubImage3DEXT = (pfn_glMultiTexSubImage3DEXT)load("glMultiTexSubImage3DEXT"); + fp_glCopyMultiTexSubImage3DEXT = (pfn_glCopyMultiTexSubImage3DEXT)load("glCopyMultiTexSubImage3DEXT"); + fp_glEnableClientStateIndexedEXT = (pfn_glEnableClientStateIndexedEXT)load("glEnableClientStateIndexedEXT"); + fp_glDisableClientStateIndexedEXT = (pfn_glDisableClientStateIndexedEXT)load("glDisableClientStateIndexedEXT"); + fp_glGetFloatIndexedvEXT = (pfn_glGetFloatIndexedvEXT)load("glGetFloatIndexedvEXT"); + fp_glGetDoubleIndexedvEXT = (pfn_glGetDoubleIndexedvEXT)load("glGetDoubleIndexedvEXT"); + fp_glGetPointerIndexedvEXT = (pfn_glGetPointerIndexedvEXT)load("glGetPointerIndexedvEXT"); + fp_glEnableIndexedEXT = (pfn_glEnableIndexedEXT)load("glEnableIndexedEXT"); + fp_glDisableIndexedEXT = (pfn_glDisableIndexedEXT)load("glDisableIndexedEXT"); + fp_glIsEnabledIndexedEXT = (pfn_glIsEnabledIndexedEXT)load("glIsEnabledIndexedEXT"); + fp_glGetIntegerIndexedvEXT = (pfn_glGetIntegerIndexedvEXT)load("glGetIntegerIndexedvEXT"); + fp_glGetBooleanIndexedvEXT = (pfn_glGetBooleanIndexedvEXT)load("glGetBooleanIndexedvEXT"); + fp_glCompressedTextureImage3DEXT = (pfn_glCompressedTextureImage3DEXT)load("glCompressedTextureImage3DEXT"); + fp_glCompressedTextureImage2DEXT = (pfn_glCompressedTextureImage2DEXT)load("glCompressedTextureImage2DEXT"); + fp_glCompressedTextureImage1DEXT = (pfn_glCompressedTextureImage1DEXT)load("glCompressedTextureImage1DEXT"); + fp_glCompressedTextureSubImage3DEXT = (pfn_glCompressedTextureSubImage3DEXT)load("glCompressedTextureSubImage3DEXT"); + fp_glCompressedTextureSubImage2DEXT = (pfn_glCompressedTextureSubImage2DEXT)load("glCompressedTextureSubImage2DEXT"); + fp_glCompressedTextureSubImage1DEXT = (pfn_glCompressedTextureSubImage1DEXT)load("glCompressedTextureSubImage1DEXT"); + fp_glGetCompressedTextureImageEXT = (pfn_glGetCompressedTextureImageEXT)load("glGetCompressedTextureImageEXT"); + fp_glCompressedMultiTexImage3DEXT = (pfn_glCompressedMultiTexImage3DEXT)load("glCompressedMultiTexImage3DEXT"); + fp_glCompressedMultiTexImage2DEXT = (pfn_glCompressedMultiTexImage2DEXT)load("glCompressedMultiTexImage2DEXT"); + fp_glCompressedMultiTexImage1DEXT = (pfn_glCompressedMultiTexImage1DEXT)load("glCompressedMultiTexImage1DEXT"); + fp_glCompressedMultiTexSubImage3DEXT = (pfn_glCompressedMultiTexSubImage3DEXT)load("glCompressedMultiTexSubImage3DEXT"); + fp_glCompressedMultiTexSubImage2DEXT = (pfn_glCompressedMultiTexSubImage2DEXT)load("glCompressedMultiTexSubImage2DEXT"); + fp_glCompressedMultiTexSubImage1DEXT = (pfn_glCompressedMultiTexSubImage1DEXT)load("glCompressedMultiTexSubImage1DEXT"); + fp_glGetCompressedMultiTexImageEXT = (pfn_glGetCompressedMultiTexImageEXT)load("glGetCompressedMultiTexImageEXT"); + fp_glMatrixLoadTransposefEXT = (pfn_glMatrixLoadTransposefEXT)load("glMatrixLoadTransposefEXT"); + fp_glMatrixLoadTransposedEXT = (pfn_glMatrixLoadTransposedEXT)load("glMatrixLoadTransposedEXT"); + fp_glMatrixMultTransposefEXT = (pfn_glMatrixMultTransposefEXT)load("glMatrixMultTransposefEXT"); + fp_glMatrixMultTransposedEXT = (pfn_glMatrixMultTransposedEXT)load("glMatrixMultTransposedEXT"); + fp_glNamedBufferDataEXT = (pfn_glNamedBufferDataEXT)load("glNamedBufferDataEXT"); + fp_glNamedBufferSubDataEXT = (pfn_glNamedBufferSubDataEXT)load("glNamedBufferSubDataEXT"); + fp_glMapNamedBufferEXT = (pfn_glMapNamedBufferEXT)load("glMapNamedBufferEXT"); + fp_glUnmapNamedBufferEXT = (pfn_glUnmapNamedBufferEXT)load("glUnmapNamedBufferEXT"); + fp_glGetNamedBufferParameterivEXT = (pfn_glGetNamedBufferParameterivEXT)load("glGetNamedBufferParameterivEXT"); + fp_glGetNamedBufferPointervEXT = (pfn_glGetNamedBufferPointervEXT)load("glGetNamedBufferPointervEXT"); + fp_glGetNamedBufferSubDataEXT = (pfn_glGetNamedBufferSubDataEXT)load("glGetNamedBufferSubDataEXT"); + fp_glProgramUniform1fEXT = (pfn_glProgramUniform1fEXT)load("glProgramUniform1fEXT"); + fp_glProgramUniform2fEXT = (pfn_glProgramUniform2fEXT)load("glProgramUniform2fEXT"); + fp_glProgramUniform3fEXT = (pfn_glProgramUniform3fEXT)load("glProgramUniform3fEXT"); + fp_glProgramUniform4fEXT = (pfn_glProgramUniform4fEXT)load("glProgramUniform4fEXT"); + fp_glProgramUniform1iEXT = (pfn_glProgramUniform1iEXT)load("glProgramUniform1iEXT"); + fp_glProgramUniform2iEXT = (pfn_glProgramUniform2iEXT)load("glProgramUniform2iEXT"); + fp_glProgramUniform3iEXT = (pfn_glProgramUniform3iEXT)load("glProgramUniform3iEXT"); + fp_glProgramUniform4iEXT = (pfn_glProgramUniform4iEXT)load("glProgramUniform4iEXT"); + fp_glProgramUniform1fvEXT = (pfn_glProgramUniform1fvEXT)load("glProgramUniform1fvEXT"); + fp_glProgramUniform2fvEXT = (pfn_glProgramUniform2fvEXT)load("glProgramUniform2fvEXT"); + fp_glProgramUniform3fvEXT = (pfn_glProgramUniform3fvEXT)load("glProgramUniform3fvEXT"); + fp_glProgramUniform4fvEXT = (pfn_glProgramUniform4fvEXT)load("glProgramUniform4fvEXT"); + fp_glProgramUniform1ivEXT = (pfn_glProgramUniform1ivEXT)load("glProgramUniform1ivEXT"); + fp_glProgramUniform2ivEXT = (pfn_glProgramUniform2ivEXT)load("glProgramUniform2ivEXT"); + fp_glProgramUniform3ivEXT = (pfn_glProgramUniform3ivEXT)load("glProgramUniform3ivEXT"); + fp_glProgramUniform4ivEXT = (pfn_glProgramUniform4ivEXT)load("glProgramUniform4ivEXT"); + fp_glProgramUniformMatrix2fvEXT = (pfn_glProgramUniformMatrix2fvEXT)load("glProgramUniformMatrix2fvEXT"); + fp_glProgramUniformMatrix3fvEXT = (pfn_glProgramUniformMatrix3fvEXT)load("glProgramUniformMatrix3fvEXT"); + fp_glProgramUniformMatrix4fvEXT = (pfn_glProgramUniformMatrix4fvEXT)load("glProgramUniformMatrix4fvEXT"); + fp_glProgramUniformMatrix2x3fvEXT = (pfn_glProgramUniformMatrix2x3fvEXT)load("glProgramUniformMatrix2x3fvEXT"); + fp_glProgramUniformMatrix3x2fvEXT = (pfn_glProgramUniformMatrix3x2fvEXT)load("glProgramUniformMatrix3x2fvEXT"); + fp_glProgramUniformMatrix2x4fvEXT = (pfn_glProgramUniformMatrix2x4fvEXT)load("glProgramUniformMatrix2x4fvEXT"); + fp_glProgramUniformMatrix4x2fvEXT = (pfn_glProgramUniformMatrix4x2fvEXT)load("glProgramUniformMatrix4x2fvEXT"); + fp_glProgramUniformMatrix3x4fvEXT = (pfn_glProgramUniformMatrix3x4fvEXT)load("glProgramUniformMatrix3x4fvEXT"); + fp_glProgramUniformMatrix4x3fvEXT = (pfn_glProgramUniformMatrix4x3fvEXT)load("glProgramUniformMatrix4x3fvEXT"); + fp_glTextureBufferEXT = (pfn_glTextureBufferEXT)load("glTextureBufferEXT"); + fp_glMultiTexBufferEXT = (pfn_glMultiTexBufferEXT)load("glMultiTexBufferEXT"); + fp_glTextureParameterIivEXT = (pfn_glTextureParameterIivEXT)load("glTextureParameterIivEXT"); + fp_glTextureParameterIuivEXT = (pfn_glTextureParameterIuivEXT)load("glTextureParameterIuivEXT"); + fp_glGetTextureParameterIivEXT = (pfn_glGetTextureParameterIivEXT)load("glGetTextureParameterIivEXT"); + fp_glGetTextureParameterIuivEXT = (pfn_glGetTextureParameterIuivEXT)load("glGetTextureParameterIuivEXT"); + fp_glMultiTexParameterIivEXT = (pfn_glMultiTexParameterIivEXT)load("glMultiTexParameterIivEXT"); + fp_glMultiTexParameterIuivEXT = (pfn_glMultiTexParameterIuivEXT)load("glMultiTexParameterIuivEXT"); + fp_glGetMultiTexParameterIivEXT = (pfn_glGetMultiTexParameterIivEXT)load("glGetMultiTexParameterIivEXT"); + fp_glGetMultiTexParameterIuivEXT = (pfn_glGetMultiTexParameterIuivEXT)load("glGetMultiTexParameterIuivEXT"); + fp_glProgramUniform1uiEXT = (pfn_glProgramUniform1uiEXT)load("glProgramUniform1uiEXT"); + fp_glProgramUniform2uiEXT = (pfn_glProgramUniform2uiEXT)load("glProgramUniform2uiEXT"); + fp_glProgramUniform3uiEXT = (pfn_glProgramUniform3uiEXT)load("glProgramUniform3uiEXT"); + fp_glProgramUniform4uiEXT = (pfn_glProgramUniform4uiEXT)load("glProgramUniform4uiEXT"); + fp_glProgramUniform1uivEXT = (pfn_glProgramUniform1uivEXT)load("glProgramUniform1uivEXT"); + fp_glProgramUniform2uivEXT = (pfn_glProgramUniform2uivEXT)load("glProgramUniform2uivEXT"); + fp_glProgramUniform3uivEXT = (pfn_glProgramUniform3uivEXT)load("glProgramUniform3uivEXT"); + fp_glProgramUniform4uivEXT = (pfn_glProgramUniform4uivEXT)load("glProgramUniform4uivEXT"); + fp_glNamedProgramLocalParameters4fvEXT = (pfn_glNamedProgramLocalParameters4fvEXT)load("glNamedProgramLocalParameters4fvEXT"); + fp_glNamedProgramLocalParameterI4iEXT = (pfn_glNamedProgramLocalParameterI4iEXT)load("glNamedProgramLocalParameterI4iEXT"); + fp_glNamedProgramLocalParameterI4ivEXT = (pfn_glNamedProgramLocalParameterI4ivEXT)load("glNamedProgramLocalParameterI4ivEXT"); + fp_glNamedProgramLocalParametersI4ivEXT = (pfn_glNamedProgramLocalParametersI4ivEXT)load("glNamedProgramLocalParametersI4ivEXT"); + fp_glNamedProgramLocalParameterI4uiEXT = (pfn_glNamedProgramLocalParameterI4uiEXT)load("glNamedProgramLocalParameterI4uiEXT"); + fp_glNamedProgramLocalParameterI4uivEXT = (pfn_glNamedProgramLocalParameterI4uivEXT)load("glNamedProgramLocalParameterI4uivEXT"); + fp_glNamedProgramLocalParametersI4uivEXT = (pfn_glNamedProgramLocalParametersI4uivEXT)load("glNamedProgramLocalParametersI4uivEXT"); + fp_glGetNamedProgramLocalParameterIivEXT = (pfn_glGetNamedProgramLocalParameterIivEXT)load("glGetNamedProgramLocalParameterIivEXT"); + fp_glGetNamedProgramLocalParameterIuivEXT = (pfn_glGetNamedProgramLocalParameterIuivEXT)load("glGetNamedProgramLocalParameterIuivEXT"); + fp_glEnableClientStateiEXT = (pfn_glEnableClientStateiEXT)load("glEnableClientStateiEXT"); + fp_glDisableClientStateiEXT = (pfn_glDisableClientStateiEXT)load("glDisableClientStateiEXT"); + fp_glGetFloati_vEXT = (pfn_glGetFloati_vEXT)load("glGetFloati_vEXT"); + fp_glGetDoublei_vEXT = (pfn_glGetDoublei_vEXT)load("glGetDoublei_vEXT"); + fp_glGetPointeri_vEXT = (pfn_glGetPointeri_vEXT)load("glGetPointeri_vEXT"); + fp_glNamedProgramStringEXT = (pfn_glNamedProgramStringEXT)load("glNamedProgramStringEXT"); + fp_glNamedProgramLocalParameter4dEXT = (pfn_glNamedProgramLocalParameter4dEXT)load("glNamedProgramLocalParameter4dEXT"); + fp_glNamedProgramLocalParameter4dvEXT = (pfn_glNamedProgramLocalParameter4dvEXT)load("glNamedProgramLocalParameter4dvEXT"); + fp_glNamedProgramLocalParameter4fEXT = (pfn_glNamedProgramLocalParameter4fEXT)load("glNamedProgramLocalParameter4fEXT"); + fp_glNamedProgramLocalParameter4fvEXT = (pfn_glNamedProgramLocalParameter4fvEXT)load("glNamedProgramLocalParameter4fvEXT"); + fp_glGetNamedProgramLocalParameterdvEXT = (pfn_glGetNamedProgramLocalParameterdvEXT)load("glGetNamedProgramLocalParameterdvEXT"); + fp_glGetNamedProgramLocalParameterfvEXT = (pfn_glGetNamedProgramLocalParameterfvEXT)load("glGetNamedProgramLocalParameterfvEXT"); + fp_glGetNamedProgramivEXT = (pfn_glGetNamedProgramivEXT)load("glGetNamedProgramivEXT"); + fp_glGetNamedProgramStringEXT = (pfn_glGetNamedProgramStringEXT)load("glGetNamedProgramStringEXT"); + fp_glNamedRenderbufferStorageEXT = (pfn_glNamedRenderbufferStorageEXT)load("glNamedRenderbufferStorageEXT"); + fp_glGetNamedRenderbufferParameterivEXT = (pfn_glGetNamedRenderbufferParameterivEXT)load("glGetNamedRenderbufferParameterivEXT"); + fp_glNamedRenderbufferStorageMultisampleEXT = (pfn_glNamedRenderbufferStorageMultisampleEXT)load("glNamedRenderbufferStorageMultisampleEXT"); + fp_glNamedRenderbufferStorageMultisampleCoverageEXT = (pfn_glNamedRenderbufferStorageMultisampleCoverageEXT)load("glNamedRenderbufferStorageMultisampleCoverageEXT"); + fp_glCheckNamedFramebufferStatusEXT = (pfn_glCheckNamedFramebufferStatusEXT)load("glCheckNamedFramebufferStatusEXT"); + fp_glNamedFramebufferTexture1DEXT = (pfn_glNamedFramebufferTexture1DEXT)load("glNamedFramebufferTexture1DEXT"); + fp_glNamedFramebufferTexture2DEXT = (pfn_glNamedFramebufferTexture2DEXT)load("glNamedFramebufferTexture2DEXT"); + fp_glNamedFramebufferTexture3DEXT = (pfn_glNamedFramebufferTexture3DEXT)load("glNamedFramebufferTexture3DEXT"); + fp_glNamedFramebufferRenderbufferEXT = (pfn_glNamedFramebufferRenderbufferEXT)load("glNamedFramebufferRenderbufferEXT"); + fp_glGetNamedFramebufferAttachmentParameterivEXT = (pfn_glGetNamedFramebufferAttachmentParameterivEXT)load("glGetNamedFramebufferAttachmentParameterivEXT"); + fp_glGenerateTextureMipmapEXT = (pfn_glGenerateTextureMipmapEXT)load("glGenerateTextureMipmapEXT"); + fp_glGenerateMultiTexMipmapEXT = (pfn_glGenerateMultiTexMipmapEXT)load("glGenerateMultiTexMipmapEXT"); + fp_glFramebufferDrawBufferEXT = (pfn_glFramebufferDrawBufferEXT)load("glFramebufferDrawBufferEXT"); + fp_glFramebufferDrawBuffersEXT = (pfn_glFramebufferDrawBuffersEXT)load("glFramebufferDrawBuffersEXT"); + fp_glFramebufferReadBufferEXT = (pfn_glFramebufferReadBufferEXT)load("glFramebufferReadBufferEXT"); + fp_glGetFramebufferParameterivEXT = (pfn_glGetFramebufferParameterivEXT)load("glGetFramebufferParameterivEXT"); + fp_glNamedCopyBufferSubDataEXT = (pfn_glNamedCopyBufferSubDataEXT)load("glNamedCopyBufferSubDataEXT"); + fp_glNamedFramebufferTextureEXT = (pfn_glNamedFramebufferTextureEXT)load("glNamedFramebufferTextureEXT"); + fp_glNamedFramebufferTextureLayerEXT = (pfn_glNamedFramebufferTextureLayerEXT)load("glNamedFramebufferTextureLayerEXT"); + fp_glNamedFramebufferTextureFaceEXT = (pfn_glNamedFramebufferTextureFaceEXT)load("glNamedFramebufferTextureFaceEXT"); + fp_glTextureRenderbufferEXT = (pfn_glTextureRenderbufferEXT)load("glTextureRenderbufferEXT"); + fp_glMultiTexRenderbufferEXT = (pfn_glMultiTexRenderbufferEXT)load("glMultiTexRenderbufferEXT"); + fp_glVertexArrayVertexOffsetEXT = (pfn_glVertexArrayVertexOffsetEXT)load("glVertexArrayVertexOffsetEXT"); + fp_glVertexArrayColorOffsetEXT = (pfn_glVertexArrayColorOffsetEXT)load("glVertexArrayColorOffsetEXT"); + fp_glVertexArrayEdgeFlagOffsetEXT = (pfn_glVertexArrayEdgeFlagOffsetEXT)load("glVertexArrayEdgeFlagOffsetEXT"); + fp_glVertexArrayIndexOffsetEXT = (pfn_glVertexArrayIndexOffsetEXT)load("glVertexArrayIndexOffsetEXT"); + fp_glVertexArrayNormalOffsetEXT = (pfn_glVertexArrayNormalOffsetEXT)load("glVertexArrayNormalOffsetEXT"); + fp_glVertexArrayTexCoordOffsetEXT = (pfn_glVertexArrayTexCoordOffsetEXT)load("glVertexArrayTexCoordOffsetEXT"); + fp_glVertexArrayMultiTexCoordOffsetEXT = (pfn_glVertexArrayMultiTexCoordOffsetEXT)load("glVertexArrayMultiTexCoordOffsetEXT"); + fp_glVertexArrayFogCoordOffsetEXT = (pfn_glVertexArrayFogCoordOffsetEXT)load("glVertexArrayFogCoordOffsetEXT"); + fp_glVertexArraySecondaryColorOffsetEXT = (pfn_glVertexArraySecondaryColorOffsetEXT)load("glVertexArraySecondaryColorOffsetEXT"); + fp_glVertexArrayVertexAttribOffsetEXT = (pfn_glVertexArrayVertexAttribOffsetEXT)load("glVertexArrayVertexAttribOffsetEXT"); + fp_glVertexArrayVertexAttribIOffsetEXT = (pfn_glVertexArrayVertexAttribIOffsetEXT)load("glVertexArrayVertexAttribIOffsetEXT"); + fp_glEnableVertexArrayEXT = (pfn_glEnableVertexArrayEXT)load("glEnableVertexArrayEXT"); + fp_glDisableVertexArrayEXT = (pfn_glDisableVertexArrayEXT)load("glDisableVertexArrayEXT"); + fp_glEnableVertexArrayAttribEXT = (pfn_glEnableVertexArrayAttribEXT)load("glEnableVertexArrayAttribEXT"); + fp_glDisableVertexArrayAttribEXT = (pfn_glDisableVertexArrayAttribEXT)load("glDisableVertexArrayAttribEXT"); + fp_glGetVertexArrayIntegervEXT = (pfn_glGetVertexArrayIntegervEXT)load("glGetVertexArrayIntegervEXT"); + fp_glGetVertexArrayPointervEXT = (pfn_glGetVertexArrayPointervEXT)load("glGetVertexArrayPointervEXT"); + fp_glGetVertexArrayIntegeri_vEXT = (pfn_glGetVertexArrayIntegeri_vEXT)load("glGetVertexArrayIntegeri_vEXT"); + fp_glGetVertexArrayPointeri_vEXT = (pfn_glGetVertexArrayPointeri_vEXT)load("glGetVertexArrayPointeri_vEXT"); + fp_glMapNamedBufferRangeEXT = (pfn_glMapNamedBufferRangeEXT)load("glMapNamedBufferRangeEXT"); + fp_glFlushMappedNamedBufferRangeEXT = (pfn_glFlushMappedNamedBufferRangeEXT)load("glFlushMappedNamedBufferRangeEXT"); + fp_glNamedBufferStorageEXT = (pfn_glNamedBufferStorageEXT)load("glNamedBufferStorageEXT"); + fp_glClearNamedBufferDataEXT = (pfn_glClearNamedBufferDataEXT)load("glClearNamedBufferDataEXT"); + fp_glClearNamedBufferSubDataEXT = (pfn_glClearNamedBufferSubDataEXT)load("glClearNamedBufferSubDataEXT"); + fp_glNamedFramebufferParameteriEXT = (pfn_glNamedFramebufferParameteriEXT)load("glNamedFramebufferParameteriEXT"); + fp_glGetNamedFramebufferParameterivEXT = (pfn_glGetNamedFramebufferParameterivEXT)load("glGetNamedFramebufferParameterivEXT"); + fp_glProgramUniform1dEXT = (pfn_glProgramUniform1dEXT)load("glProgramUniform1dEXT"); + fp_glProgramUniform2dEXT = (pfn_glProgramUniform2dEXT)load("glProgramUniform2dEXT"); + fp_glProgramUniform3dEXT = (pfn_glProgramUniform3dEXT)load("glProgramUniform3dEXT"); + fp_glProgramUniform4dEXT = (pfn_glProgramUniform4dEXT)load("glProgramUniform4dEXT"); + fp_glProgramUniform1dvEXT = (pfn_glProgramUniform1dvEXT)load("glProgramUniform1dvEXT"); + fp_glProgramUniform2dvEXT = (pfn_glProgramUniform2dvEXT)load("glProgramUniform2dvEXT"); + fp_glProgramUniform3dvEXT = (pfn_glProgramUniform3dvEXT)load("glProgramUniform3dvEXT"); + fp_glProgramUniform4dvEXT = (pfn_glProgramUniform4dvEXT)load("glProgramUniform4dvEXT"); + fp_glProgramUniformMatrix2dvEXT = (pfn_glProgramUniformMatrix2dvEXT)load("glProgramUniformMatrix2dvEXT"); + fp_glProgramUniformMatrix3dvEXT = (pfn_glProgramUniformMatrix3dvEXT)load("glProgramUniformMatrix3dvEXT"); + fp_glProgramUniformMatrix4dvEXT = (pfn_glProgramUniformMatrix4dvEXT)load("glProgramUniformMatrix4dvEXT"); + fp_glProgramUniformMatrix2x3dvEXT = (pfn_glProgramUniformMatrix2x3dvEXT)load("glProgramUniformMatrix2x3dvEXT"); + fp_glProgramUniformMatrix2x4dvEXT = (pfn_glProgramUniformMatrix2x4dvEXT)load("glProgramUniformMatrix2x4dvEXT"); + fp_glProgramUniformMatrix3x2dvEXT = (pfn_glProgramUniformMatrix3x2dvEXT)load("glProgramUniformMatrix3x2dvEXT"); + fp_glProgramUniformMatrix3x4dvEXT = (pfn_glProgramUniformMatrix3x4dvEXT)load("glProgramUniformMatrix3x4dvEXT"); + fp_glProgramUniformMatrix4x2dvEXT = (pfn_glProgramUniformMatrix4x2dvEXT)load("glProgramUniformMatrix4x2dvEXT"); + fp_glProgramUniformMatrix4x3dvEXT = (pfn_glProgramUniformMatrix4x3dvEXT)load("glProgramUniformMatrix4x3dvEXT"); + fp_glTextureBufferRangeEXT = (pfn_glTextureBufferRangeEXT)load("glTextureBufferRangeEXT"); + fp_glTextureStorage1DEXT = (pfn_glTextureStorage1DEXT)load("glTextureStorage1DEXT"); + fp_glTextureStorage2DEXT = (pfn_glTextureStorage2DEXT)load("glTextureStorage2DEXT"); + fp_glTextureStorage3DEXT = (pfn_glTextureStorage3DEXT)load("glTextureStorage3DEXT"); + fp_glTextureStorage2DMultisampleEXT = (pfn_glTextureStorage2DMultisampleEXT)load("glTextureStorage2DMultisampleEXT"); + fp_glTextureStorage3DMultisampleEXT = (pfn_glTextureStorage3DMultisampleEXT)load("glTextureStorage3DMultisampleEXT"); + fp_glVertexArrayBindVertexBufferEXT = (pfn_glVertexArrayBindVertexBufferEXT)load("glVertexArrayBindVertexBufferEXT"); + fp_glVertexArrayVertexAttribFormatEXT = (pfn_glVertexArrayVertexAttribFormatEXT)load("glVertexArrayVertexAttribFormatEXT"); + fp_glVertexArrayVertexAttribIFormatEXT = (pfn_glVertexArrayVertexAttribIFormatEXT)load("glVertexArrayVertexAttribIFormatEXT"); + fp_glVertexArrayVertexAttribLFormatEXT = (pfn_glVertexArrayVertexAttribLFormatEXT)load("glVertexArrayVertexAttribLFormatEXT"); + fp_glVertexArrayVertexAttribBindingEXT = (pfn_glVertexArrayVertexAttribBindingEXT)load("glVertexArrayVertexAttribBindingEXT"); + fp_glVertexArrayVertexBindingDivisorEXT = (pfn_glVertexArrayVertexBindingDivisorEXT)load("glVertexArrayVertexBindingDivisorEXT"); + fp_glVertexArrayVertexAttribLOffsetEXT = (pfn_glVertexArrayVertexAttribLOffsetEXT)load("glVertexArrayVertexAttribLOffsetEXT"); + fp_glTexturePageCommitmentEXT = (pfn_glTexturePageCommitmentEXT)load("glTexturePageCommitmentEXT"); + fp_glVertexArrayVertexAttribDivisorEXT = (pfn_glVertexArrayVertexAttribDivisorEXT)load("glVertexArrayVertexAttribDivisorEXT"); +} + +GLboolean GLAD_EXT_discard_framebuffer = GL_FALSE; +static void load_GL_EXT_discard_framebuffer(LOADER load) { + if(!GLAD_EXT_discard_framebuffer) return; + fp_glDiscardFramebufferEXT = (pfn_glDiscardFramebufferEXT)load("glDiscardFramebufferEXT"); +} + +GLboolean GLAD_EXT_disjoint_timer_query = GL_FALSE; +static void load_GL_EXT_disjoint_timer_query(LOADER load) { + if(!GLAD_EXT_disjoint_timer_query) return; + fp_glGenQueriesEXT = (pfn_glGenQueriesEXT)load("glGenQueriesEXT"); + fp_glDeleteQueriesEXT = (pfn_glDeleteQueriesEXT)load("glDeleteQueriesEXT"); + fp_glIsQueryEXT = (pfn_glIsQueryEXT)load("glIsQueryEXT"); + fp_glBeginQueryEXT = (pfn_glBeginQueryEXT)load("glBeginQueryEXT"); + fp_glEndQueryEXT = (pfn_glEndQueryEXT)load("glEndQueryEXT"); + fp_glQueryCounterEXT = (pfn_glQueryCounterEXT)load("glQueryCounterEXT"); + fp_glGetQueryivEXT = (pfn_glGetQueryivEXT)load("glGetQueryivEXT"); + fp_glGetQueryObjectivEXT = (pfn_glGetQueryObjectivEXT)load("glGetQueryObjectivEXT"); + fp_glGetQueryObjectuivEXT = (pfn_glGetQueryObjectuivEXT)load("glGetQueryObjectuivEXT"); + fp_glGetQueryObjecti64vEXT = (pfn_glGetQueryObjecti64vEXT)load("glGetQueryObjecti64vEXT"); + fp_glGetQueryObjectui64vEXT = (pfn_glGetQueryObjectui64vEXT)load("glGetQueryObjectui64vEXT"); +} + +GLboolean GLAD_EXT_draw_buffers = GL_FALSE; +static void load_GL_EXT_draw_buffers(LOADER load) { + if(!GLAD_EXT_draw_buffers) return; + fp_glDrawBuffersEXT = (pfn_glDrawBuffersEXT)load("glDrawBuffersEXT"); +} + +GLboolean GLAD_EXT_draw_buffers2 = GL_FALSE; +static void load_GL_EXT_draw_buffers2(LOADER load) { + if(!GLAD_EXT_draw_buffers2) return; + fp_glColorMaskIndexedEXT = (pfn_glColorMaskIndexedEXT)load("glColorMaskIndexedEXT"); + fp_glGetBooleanIndexedvEXT = (pfn_glGetBooleanIndexedvEXT)load("glGetBooleanIndexedvEXT"); + fp_glGetIntegerIndexedvEXT = (pfn_glGetIntegerIndexedvEXT)load("glGetIntegerIndexedvEXT"); + fp_glEnableIndexedEXT = (pfn_glEnableIndexedEXT)load("glEnableIndexedEXT"); + fp_glDisableIndexedEXT = (pfn_glDisableIndexedEXT)load("glDisableIndexedEXT"); + fp_glIsEnabledIndexedEXT = (pfn_glIsEnabledIndexedEXT)load("glIsEnabledIndexedEXT"); +} + +GLboolean GLAD_EXT_draw_instanced = GL_FALSE; +static void load_GL_EXT_draw_instanced(LOADER load) { + if(!GLAD_EXT_draw_instanced) return; + fp_glDrawArraysInstancedEXT = (pfn_glDrawArraysInstancedEXT)load("glDrawArraysInstancedEXT"); + fp_glDrawElementsInstancedEXT = (pfn_glDrawElementsInstancedEXT)load("glDrawElementsInstancedEXT"); +} + +GLboolean GLAD_EXT_fog_coord = GL_FALSE; +static void load_GL_EXT_fog_coord(LOADER load) { + if(!GLAD_EXT_fog_coord) return; + fp_glFogCoordfEXT = (pfn_glFogCoordfEXT)load("glFogCoordfEXT"); + fp_glFogCoordfvEXT = (pfn_glFogCoordfvEXT)load("glFogCoordfvEXT"); + fp_glFogCoorddEXT = (pfn_glFogCoorddEXT)load("glFogCoorddEXT"); + fp_glFogCoorddvEXT = (pfn_glFogCoorddvEXT)load("glFogCoorddvEXT"); + fp_glFogCoordPointerEXT = (pfn_glFogCoordPointerEXT)load("glFogCoordPointerEXT"); +} + +GLboolean GLAD_EXT_framebuffer_blit = GL_FALSE; +static void load_GL_EXT_framebuffer_blit(LOADER load) { + if(!GLAD_EXT_framebuffer_blit) return; + fp_glBlitFramebufferEXT = (pfn_glBlitFramebufferEXT)load("glBlitFramebufferEXT"); +} + +GLboolean GLAD_EXT_framebuffer_multisample = GL_FALSE; +static void load_GL_EXT_framebuffer_multisample(LOADER load) { + if(!GLAD_EXT_framebuffer_multisample) return; + fp_glRenderbufferStorageMultisampleEXT = (pfn_glRenderbufferStorageMultisampleEXT)load("glRenderbufferStorageMultisampleEXT"); +} + +GLboolean GLAD_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; +GLboolean GLAD_EXT_framebuffer_object = GL_FALSE; +static void load_GL_EXT_framebuffer_object(LOADER load) { + if(!GLAD_EXT_framebuffer_object) return; + fp_glIsRenderbufferEXT = (pfn_glIsRenderbufferEXT)load("glIsRenderbufferEXT"); + fp_glBindRenderbufferEXT = (pfn_glBindRenderbufferEXT)load("glBindRenderbufferEXT"); + fp_glDeleteRenderbuffersEXT = (pfn_glDeleteRenderbuffersEXT)load("glDeleteRenderbuffersEXT"); + fp_glGenRenderbuffersEXT = (pfn_glGenRenderbuffersEXT)load("glGenRenderbuffersEXT"); + fp_glRenderbufferStorageEXT = (pfn_glRenderbufferStorageEXT)load("glRenderbufferStorageEXT"); + fp_glGetRenderbufferParameterivEXT = (pfn_glGetRenderbufferParameterivEXT)load("glGetRenderbufferParameterivEXT"); + fp_glIsFramebufferEXT = (pfn_glIsFramebufferEXT)load("glIsFramebufferEXT"); + fp_glBindFramebufferEXT = (pfn_glBindFramebufferEXT)load("glBindFramebufferEXT"); + fp_glDeleteFramebuffersEXT = (pfn_glDeleteFramebuffersEXT)load("glDeleteFramebuffersEXT"); + fp_glGenFramebuffersEXT = (pfn_glGenFramebuffersEXT)load("glGenFramebuffersEXT"); + fp_glCheckFramebufferStatusEXT = (pfn_glCheckFramebufferStatusEXT)load("glCheckFramebufferStatusEXT"); + fp_glFramebufferTexture1DEXT = (pfn_glFramebufferTexture1DEXT)load("glFramebufferTexture1DEXT"); + fp_glFramebufferTexture2DEXT = (pfn_glFramebufferTexture2DEXT)load("glFramebufferTexture2DEXT"); + fp_glFramebufferTexture3DEXT = (pfn_glFramebufferTexture3DEXT)load("glFramebufferTexture3DEXT"); + fp_glFramebufferRenderbufferEXT = (pfn_glFramebufferRenderbufferEXT)load("glFramebufferRenderbufferEXT"); + fp_glGetFramebufferAttachmentParameterivEXT = (pfn_glGetFramebufferAttachmentParameterivEXT)load("glGetFramebufferAttachmentParameterivEXT"); + fp_glGenerateMipmapEXT = (pfn_glGenerateMipmapEXT)load("glGenerateMipmapEXT"); +} + +GLboolean GLAD_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean GLAD_EXT_geometry_shader4 = GL_FALSE; +static void load_GL_EXT_geometry_shader4(LOADER load) { + if(!GLAD_EXT_geometry_shader4) return; + fp_glProgramParameteriEXT = (pfn_glProgramParameteriEXT)load("glProgramParameteriEXT"); +} + +GLboolean GLAD_EXT_gpu_program_parameters = GL_FALSE; +static void load_GL_EXT_gpu_program_parameters(LOADER load) { + if(!GLAD_EXT_gpu_program_parameters) return; + fp_glProgramEnvParameters4fvEXT = (pfn_glProgramEnvParameters4fvEXT)load("glProgramEnvParameters4fvEXT"); + fp_glProgramLocalParameters4fvEXT = (pfn_glProgramLocalParameters4fvEXT)load("glProgramLocalParameters4fvEXT"); +} + +GLboolean GLAD_EXT_gpu_shader4 = GL_FALSE; +static void load_GL_EXT_gpu_shader4(LOADER load) { + if(!GLAD_EXT_gpu_shader4) return; + fp_glGetUniformuivEXT = (pfn_glGetUniformuivEXT)load("glGetUniformuivEXT"); + fp_glBindFragDataLocationEXT = (pfn_glBindFragDataLocationEXT)load("glBindFragDataLocationEXT"); + fp_glGetFragDataLocationEXT = (pfn_glGetFragDataLocationEXT)load("glGetFragDataLocationEXT"); + fp_glUniform1uiEXT = (pfn_glUniform1uiEXT)load("glUniform1uiEXT"); + fp_glUniform2uiEXT = (pfn_glUniform2uiEXT)load("glUniform2uiEXT"); + fp_glUniform3uiEXT = (pfn_glUniform3uiEXT)load("glUniform3uiEXT"); + fp_glUniform4uiEXT = (pfn_glUniform4uiEXT)load("glUniform4uiEXT"); + fp_glUniform1uivEXT = (pfn_glUniform1uivEXT)load("glUniform1uivEXT"); + fp_glUniform2uivEXT = (pfn_glUniform2uivEXT)load("glUniform2uivEXT"); + fp_glUniform3uivEXT = (pfn_glUniform3uivEXT)load("glUniform3uivEXT"); + fp_glUniform4uivEXT = (pfn_glUniform4uivEXT)load("glUniform4uivEXT"); +} + +GLboolean GLAD_EXT_histogram = GL_FALSE; +static void load_GL_EXT_histogram(LOADER load) { + if(!GLAD_EXT_histogram) return; + fp_glGetHistogramEXT = (pfn_glGetHistogramEXT)load("glGetHistogramEXT"); + fp_glGetHistogramParameterfvEXT = (pfn_glGetHistogramParameterfvEXT)load("glGetHistogramParameterfvEXT"); + fp_glGetHistogramParameterivEXT = (pfn_glGetHistogramParameterivEXT)load("glGetHistogramParameterivEXT"); + fp_glGetMinmaxEXT = (pfn_glGetMinmaxEXT)load("glGetMinmaxEXT"); + fp_glGetMinmaxParameterfvEXT = (pfn_glGetMinmaxParameterfvEXT)load("glGetMinmaxParameterfvEXT"); + fp_glGetMinmaxParameterivEXT = (pfn_glGetMinmaxParameterivEXT)load("glGetMinmaxParameterivEXT"); + fp_glHistogramEXT = (pfn_glHistogramEXT)load("glHistogramEXT"); + fp_glMinmaxEXT = (pfn_glMinmaxEXT)load("glMinmaxEXT"); + fp_glResetHistogramEXT = (pfn_glResetHistogramEXT)load("glResetHistogramEXT"); + fp_glResetMinmaxEXT = (pfn_glResetMinmaxEXT)load("glResetMinmaxEXT"); +} + +GLboolean GLAD_EXT_index_array_formats = GL_FALSE; +GLboolean GLAD_EXT_index_func = GL_FALSE; +static void load_GL_EXT_index_func(LOADER load) { + if(!GLAD_EXT_index_func) return; + fp_glIndexFuncEXT = (pfn_glIndexFuncEXT)load("glIndexFuncEXT"); +} + +GLboolean GLAD_EXT_index_material = GL_FALSE; +static void load_GL_EXT_index_material(LOADER load) { + if(!GLAD_EXT_index_material) return; + fp_glIndexMaterialEXT = (pfn_glIndexMaterialEXT)load("glIndexMaterialEXT"); +} + +GLboolean GLAD_EXT_index_texture = GL_FALSE; +GLboolean GLAD_EXT_instanced_arrays = GL_FALSE; +static void load_GL_EXT_instanced_arrays(LOADER load) { + if(!GLAD_EXT_instanced_arrays) return; + fp_glDrawArraysInstancedEXT = (pfn_glDrawArraysInstancedEXT)load("glDrawArraysInstancedEXT"); + fp_glDrawElementsInstancedEXT = (pfn_glDrawElementsInstancedEXT)load("glDrawElementsInstancedEXT"); + fp_glVertexAttribDivisorEXT = (pfn_glVertexAttribDivisorEXT)load("glVertexAttribDivisorEXT"); +} + +GLboolean GLAD_EXT_light_texture = GL_FALSE; +static void load_GL_EXT_light_texture(LOADER load) { + if(!GLAD_EXT_light_texture) return; + fp_glApplyTextureEXT = (pfn_glApplyTextureEXT)load("glApplyTextureEXT"); + fp_glTextureLightEXT = (pfn_glTextureLightEXT)load("glTextureLightEXT"); + fp_glTextureMaterialEXT = (pfn_glTextureMaterialEXT)load("glTextureMaterialEXT"); +} + +GLboolean GLAD_EXT_map_buffer_range = GL_FALSE; +static void load_GL_EXT_map_buffer_range(LOADER load) { + if(!GLAD_EXT_map_buffer_range) return; + fp_glMapBufferRangeEXT = (pfn_glMapBufferRangeEXT)load("glMapBufferRangeEXT"); + fp_glFlushMappedBufferRangeEXT = (pfn_glFlushMappedBufferRangeEXT)load("glFlushMappedBufferRangeEXT"); +} + +GLboolean GLAD_EXT_misc_attribute = GL_FALSE; +GLboolean GLAD_EXT_multi_draw_arrays = GL_FALSE; +static void load_GL_EXT_multi_draw_arrays(LOADER load) { + if(!GLAD_EXT_multi_draw_arrays) return; + fp_glMultiDrawArraysEXT = (pfn_glMultiDrawArraysEXT)load("glMultiDrawArraysEXT"); + fp_glMultiDrawElementsEXT = (pfn_glMultiDrawElementsEXT)load("glMultiDrawElementsEXT"); +} + +GLboolean GLAD_EXT_multisample = GL_FALSE; +static void load_GL_EXT_multisample(LOADER load) { + if(!GLAD_EXT_multisample) return; + fp_glSampleMaskEXT = (pfn_glSampleMaskEXT)load("glSampleMaskEXT"); + fp_glSamplePatternEXT = (pfn_glSamplePatternEXT)load("glSamplePatternEXT"); +} + +GLboolean GLAD_EXT_multisampled_render_to_texture = GL_FALSE; +static void load_GL_EXT_multisampled_render_to_texture(LOADER load) { + if(!GLAD_EXT_multisampled_render_to_texture) return; + fp_glRenderbufferStorageMultisampleEXT = (pfn_glRenderbufferStorageMultisampleEXT)load("glRenderbufferStorageMultisampleEXT"); + fp_glFramebufferTexture2DMultisampleEXT = (pfn_glFramebufferTexture2DMultisampleEXT)load("glFramebufferTexture2DMultisampleEXT"); +} + +GLboolean GLAD_EXT_multiview_draw_buffers = GL_FALSE; +static void load_GL_EXT_multiview_draw_buffers(LOADER load) { + if(!GLAD_EXT_multiview_draw_buffers) return; + fp_glReadBufferIndexedEXT = (pfn_glReadBufferIndexedEXT)load("glReadBufferIndexedEXT"); + fp_glDrawBuffersIndexedEXT = (pfn_glDrawBuffersIndexedEXT)load("glDrawBuffersIndexedEXT"); + fp_glGetIntegeri_vEXT = (pfn_glGetIntegeri_vEXT)load("glGetIntegeri_vEXT"); +} + +GLboolean GLAD_EXT_occlusion_query_boolean = GL_FALSE; +static void load_GL_EXT_occlusion_query_boolean(LOADER load) { + if(!GLAD_EXT_occlusion_query_boolean) return; + fp_glGenQueriesEXT = (pfn_glGenQueriesEXT)load("glGenQueriesEXT"); + fp_glDeleteQueriesEXT = (pfn_glDeleteQueriesEXT)load("glDeleteQueriesEXT"); + fp_glIsQueryEXT = (pfn_glIsQueryEXT)load("glIsQueryEXT"); + fp_glBeginQueryEXT = (pfn_glBeginQueryEXT)load("glBeginQueryEXT"); + fp_glEndQueryEXT = (pfn_glEndQueryEXT)load("glEndQueryEXT"); + fp_glGetQueryivEXT = (pfn_glGetQueryivEXT)load("glGetQueryivEXT"); + fp_glGetQueryObjectuivEXT = (pfn_glGetQueryObjectuivEXT)load("glGetQueryObjectuivEXT"); +} + +GLboolean GLAD_EXT_packed_depth_stencil = GL_FALSE; +GLboolean GLAD_EXT_packed_float = GL_FALSE; +GLboolean GLAD_EXT_paletted_texture = GL_FALSE; +static void load_GL_EXT_paletted_texture(LOADER load) { + if(!GLAD_EXT_paletted_texture) return; + fp_glColorTableEXT = (pfn_glColorTableEXT)load("glColorTableEXT"); + fp_glGetColorTableEXT = (pfn_glGetColorTableEXT)load("glGetColorTableEXT"); + fp_glGetColorTableParameterivEXT = (pfn_glGetColorTableParameterivEXT)load("glGetColorTableParameterivEXT"); + fp_glGetColorTableParameterfvEXT = (pfn_glGetColorTableParameterfvEXT)load("glGetColorTableParameterfvEXT"); +} + +GLboolean GLAD_EXT_pixel_buffer_object = GL_FALSE; +GLboolean GLAD_EXT_pixel_transform = GL_FALSE; +static void load_GL_EXT_pixel_transform(LOADER load) { + if(!GLAD_EXT_pixel_transform) return; + fp_glPixelTransformParameteriEXT = (pfn_glPixelTransformParameteriEXT)load("glPixelTransformParameteriEXT"); + fp_glPixelTransformParameterfEXT = (pfn_glPixelTransformParameterfEXT)load("glPixelTransformParameterfEXT"); + fp_glPixelTransformParameterivEXT = (pfn_glPixelTransformParameterivEXT)load("glPixelTransformParameterivEXT"); + fp_glPixelTransformParameterfvEXT = (pfn_glPixelTransformParameterfvEXT)load("glPixelTransformParameterfvEXT"); + fp_glGetPixelTransformParameterivEXT = (pfn_glGetPixelTransformParameterivEXT)load("glGetPixelTransformParameterivEXT"); + fp_glGetPixelTransformParameterfvEXT = (pfn_glGetPixelTransformParameterfvEXT)load("glGetPixelTransformParameterfvEXT"); +} + +GLboolean GLAD_EXT_pixel_transform_color_table = GL_FALSE; +GLboolean GLAD_EXT_point_parameters = GL_FALSE; +static void load_GL_EXT_point_parameters(LOADER load) { + if(!GLAD_EXT_point_parameters) return; + fp_glPointParameterfEXT = (pfn_glPointParameterfEXT)load("glPointParameterfEXT"); + fp_glPointParameterfvEXT = (pfn_glPointParameterfvEXT)load("glPointParameterfvEXT"); +} + +GLboolean GLAD_EXT_provoking_vertex = GL_FALSE; +static void load_GL_EXT_provoking_vertex(LOADER load) { + if(!GLAD_EXT_provoking_vertex) return; + fp_glProvokingVertexEXT = (pfn_glProvokingVertexEXT)load("glProvokingVertexEXT"); +} + +GLboolean GLAD_EXT_pvrtc_sRGB = GL_FALSE; +GLboolean GLAD_EXT_read_format_bgra = GL_FALSE; +GLboolean GLAD_EXT_robustness = GL_FALSE; +static void load_GL_EXT_robustness(LOADER load) { + if(!GLAD_EXT_robustness) return; + fp_glGetGraphicsResetStatusEXT = (pfn_glGetGraphicsResetStatusEXT)load("glGetGraphicsResetStatusEXT"); + fp_glReadnPixelsEXT = (pfn_glReadnPixelsEXT)load("glReadnPixelsEXT"); + fp_glGetnUniformfvEXT = (pfn_glGetnUniformfvEXT)load("glGetnUniformfvEXT"); + fp_glGetnUniformivEXT = (pfn_glGetnUniformivEXT)load("glGetnUniformivEXT"); +} + +GLboolean GLAD_EXT_secondary_color = GL_FALSE; +static void load_GL_EXT_secondary_color(LOADER load) { + if(!GLAD_EXT_secondary_color) return; + fp_glSecondaryColor3bEXT = (pfn_glSecondaryColor3bEXT)load("glSecondaryColor3bEXT"); + fp_glSecondaryColor3bvEXT = (pfn_glSecondaryColor3bvEXT)load("glSecondaryColor3bvEXT"); + fp_glSecondaryColor3dEXT = (pfn_glSecondaryColor3dEXT)load("glSecondaryColor3dEXT"); + fp_glSecondaryColor3dvEXT = (pfn_glSecondaryColor3dvEXT)load("glSecondaryColor3dvEXT"); + fp_glSecondaryColor3fEXT = (pfn_glSecondaryColor3fEXT)load("glSecondaryColor3fEXT"); + fp_glSecondaryColor3fvEXT = (pfn_glSecondaryColor3fvEXT)load("glSecondaryColor3fvEXT"); + fp_glSecondaryColor3iEXT = (pfn_glSecondaryColor3iEXT)load("glSecondaryColor3iEXT"); + fp_glSecondaryColor3ivEXT = (pfn_glSecondaryColor3ivEXT)load("glSecondaryColor3ivEXT"); + fp_glSecondaryColor3sEXT = (pfn_glSecondaryColor3sEXT)load("glSecondaryColor3sEXT"); + fp_glSecondaryColor3svEXT = (pfn_glSecondaryColor3svEXT)load("glSecondaryColor3svEXT"); + fp_glSecondaryColor3ubEXT = (pfn_glSecondaryColor3ubEXT)load("glSecondaryColor3ubEXT"); + fp_glSecondaryColor3ubvEXT = (pfn_glSecondaryColor3ubvEXT)load("glSecondaryColor3ubvEXT"); + fp_glSecondaryColor3uiEXT = (pfn_glSecondaryColor3uiEXT)load("glSecondaryColor3uiEXT"); + fp_glSecondaryColor3uivEXT = (pfn_glSecondaryColor3uivEXT)load("glSecondaryColor3uivEXT"); + fp_glSecondaryColor3usEXT = (pfn_glSecondaryColor3usEXT)load("glSecondaryColor3usEXT"); + fp_glSecondaryColor3usvEXT = (pfn_glSecondaryColor3usvEXT)load("glSecondaryColor3usvEXT"); + fp_glSecondaryColorPointerEXT = (pfn_glSecondaryColorPointerEXT)load("glSecondaryColorPointerEXT"); +} + +GLboolean GLAD_EXT_separate_shader_objects = GL_FALSE; +static void load_GL_EXT_separate_shader_objects(LOADER load) { + if(!GLAD_EXT_separate_shader_objects) return; + fp_glUseShaderProgramEXT = (pfn_glUseShaderProgramEXT)load("glUseShaderProgramEXT"); + fp_glActiveProgramEXT = (pfn_glActiveProgramEXT)load("glActiveProgramEXT"); + fp_glCreateShaderProgramEXT = (pfn_glCreateShaderProgramEXT)load("glCreateShaderProgramEXT"); + fp_glActiveShaderProgramEXT = (pfn_glActiveShaderProgramEXT)load("glActiveShaderProgramEXT"); + fp_glBindProgramPipelineEXT = (pfn_glBindProgramPipelineEXT)load("glBindProgramPipelineEXT"); + fp_glCreateShaderProgramvEXT = (pfn_glCreateShaderProgramvEXT)load("glCreateShaderProgramvEXT"); + fp_glDeleteProgramPipelinesEXT = (pfn_glDeleteProgramPipelinesEXT)load("glDeleteProgramPipelinesEXT"); + fp_glGenProgramPipelinesEXT = (pfn_glGenProgramPipelinesEXT)load("glGenProgramPipelinesEXT"); + fp_glGetProgramPipelineInfoLogEXT = (pfn_glGetProgramPipelineInfoLogEXT)load("glGetProgramPipelineInfoLogEXT"); + fp_glGetProgramPipelineivEXT = (pfn_glGetProgramPipelineivEXT)load("glGetProgramPipelineivEXT"); + fp_glIsProgramPipelineEXT = (pfn_glIsProgramPipelineEXT)load("glIsProgramPipelineEXT"); + fp_glProgramParameteriEXT = (pfn_glProgramParameteriEXT)load("glProgramParameteriEXT"); + fp_glProgramUniform1fEXT = (pfn_glProgramUniform1fEXT)load("glProgramUniform1fEXT"); + fp_glProgramUniform1fvEXT = (pfn_glProgramUniform1fvEXT)load("glProgramUniform1fvEXT"); + fp_glProgramUniform1iEXT = (pfn_glProgramUniform1iEXT)load("glProgramUniform1iEXT"); + fp_glProgramUniform1ivEXT = (pfn_glProgramUniform1ivEXT)load("glProgramUniform1ivEXT"); + fp_glProgramUniform2fEXT = (pfn_glProgramUniform2fEXT)load("glProgramUniform2fEXT"); + fp_glProgramUniform2fvEXT = (pfn_glProgramUniform2fvEXT)load("glProgramUniform2fvEXT"); + fp_glProgramUniform2iEXT = (pfn_glProgramUniform2iEXT)load("glProgramUniform2iEXT"); + fp_glProgramUniform2ivEXT = (pfn_glProgramUniform2ivEXT)load("glProgramUniform2ivEXT"); + fp_glProgramUniform3fEXT = (pfn_glProgramUniform3fEXT)load("glProgramUniform3fEXT"); + fp_glProgramUniform3fvEXT = (pfn_glProgramUniform3fvEXT)load("glProgramUniform3fvEXT"); + fp_glProgramUniform3iEXT = (pfn_glProgramUniform3iEXT)load("glProgramUniform3iEXT"); + fp_glProgramUniform3ivEXT = (pfn_glProgramUniform3ivEXT)load("glProgramUniform3ivEXT"); + fp_glProgramUniform4fEXT = (pfn_glProgramUniform4fEXT)load("glProgramUniform4fEXT"); + fp_glProgramUniform4fvEXT = (pfn_glProgramUniform4fvEXT)load("glProgramUniform4fvEXT"); + fp_glProgramUniform4iEXT = (pfn_glProgramUniform4iEXT)load("glProgramUniform4iEXT"); + fp_glProgramUniform4ivEXT = (pfn_glProgramUniform4ivEXT)load("glProgramUniform4ivEXT"); + fp_glProgramUniformMatrix2fvEXT = (pfn_glProgramUniformMatrix2fvEXT)load("glProgramUniformMatrix2fvEXT"); + fp_glProgramUniformMatrix3fvEXT = (pfn_glProgramUniformMatrix3fvEXT)load("glProgramUniformMatrix3fvEXT"); + fp_glProgramUniformMatrix4fvEXT = (pfn_glProgramUniformMatrix4fvEXT)load("glProgramUniformMatrix4fvEXT"); + fp_glUseProgramStagesEXT = (pfn_glUseProgramStagesEXT)load("glUseProgramStagesEXT"); + fp_glValidateProgramPipelineEXT = (pfn_glValidateProgramPipelineEXT)load("glValidateProgramPipelineEXT"); + fp_glProgramUniform1uiEXT = (pfn_glProgramUniform1uiEXT)load("glProgramUniform1uiEXT"); + fp_glProgramUniform2uiEXT = (pfn_glProgramUniform2uiEXT)load("glProgramUniform2uiEXT"); + fp_glProgramUniform3uiEXT = (pfn_glProgramUniform3uiEXT)load("glProgramUniform3uiEXT"); + fp_glProgramUniform4uiEXT = (pfn_glProgramUniform4uiEXT)load("glProgramUniform4uiEXT"); + fp_glProgramUniform1uivEXT = (pfn_glProgramUniform1uivEXT)load("glProgramUniform1uivEXT"); + fp_glProgramUniform2uivEXT = (pfn_glProgramUniform2uivEXT)load("glProgramUniform2uivEXT"); + fp_glProgramUniform3uivEXT = (pfn_glProgramUniform3uivEXT)load("glProgramUniform3uivEXT"); + fp_glProgramUniform4uivEXT = (pfn_glProgramUniform4uivEXT)load("glProgramUniform4uivEXT"); + fp_glProgramUniformMatrix4fvEXT = (pfn_glProgramUniformMatrix4fvEXT)load("glProgramUniformMatrix4fvEXT"); + fp_glProgramUniformMatrix2x3fvEXT = (pfn_glProgramUniformMatrix2x3fvEXT)load("glProgramUniformMatrix2x3fvEXT"); + fp_glProgramUniformMatrix3x2fvEXT = (pfn_glProgramUniformMatrix3x2fvEXT)load("glProgramUniformMatrix3x2fvEXT"); + fp_glProgramUniformMatrix2x4fvEXT = (pfn_glProgramUniformMatrix2x4fvEXT)load("glProgramUniformMatrix2x4fvEXT"); + fp_glProgramUniformMatrix4x2fvEXT = (pfn_glProgramUniformMatrix4x2fvEXT)load("glProgramUniformMatrix4x2fvEXT"); + fp_glProgramUniformMatrix3x4fvEXT = (pfn_glProgramUniformMatrix3x4fvEXT)load("glProgramUniformMatrix3x4fvEXT"); + fp_glProgramUniformMatrix4x3fvEXT = (pfn_glProgramUniformMatrix4x3fvEXT)load("glProgramUniformMatrix4x3fvEXT"); +} + +GLboolean GLAD_EXT_shader_framebuffer_fetch = GL_FALSE; +GLboolean GLAD_EXT_shader_image_load_store = GL_FALSE; +static void load_GL_EXT_shader_image_load_store(LOADER load) { + if(!GLAD_EXT_shader_image_load_store) return; + fp_glBindImageTextureEXT = (pfn_glBindImageTextureEXT)load("glBindImageTextureEXT"); + fp_glMemoryBarrierEXT = (pfn_glMemoryBarrierEXT)load("glMemoryBarrierEXT"); +} + +GLboolean GLAD_EXT_shader_integer_mix = GL_FALSE; +GLboolean GLAD_EXT_shader_texture_lod = GL_FALSE; +GLboolean GLAD_EXT_shadow_funcs = GL_FALSE; +GLboolean GLAD_EXT_shadow_samplers = GL_FALSE; +GLboolean GLAD_EXT_shared_texture_palette = GL_FALSE; +GLboolean GLAD_EXT_sRGB = GL_FALSE; +GLboolean GLAD_EXT_sRGB_write_control = GL_FALSE; +GLboolean GLAD_EXT_stencil_clear_tag = GL_FALSE; +static void load_GL_EXT_stencil_clear_tag(LOADER load) { + if(!GLAD_EXT_stencil_clear_tag) return; + fp_glStencilClearTagEXT = (pfn_glStencilClearTagEXT)load("glStencilClearTagEXT"); +} + +GLboolean GLAD_EXT_stencil_two_side = GL_FALSE; +static void load_GL_EXT_stencil_two_side(LOADER load) { + if(!GLAD_EXT_stencil_two_side) return; + fp_glActiveStencilFaceEXT = (pfn_glActiveStencilFaceEXT)load("glActiveStencilFaceEXT"); +} + +GLboolean GLAD_EXT_stencil_wrap = GL_FALSE; +GLboolean GLAD_EXT_texture_array = GL_FALSE; +GLboolean GLAD_EXT_texture_buffer_object = GL_FALSE; +static void load_GL_EXT_texture_buffer_object(LOADER load) { + if(!GLAD_EXT_texture_buffer_object) return; + fp_glTexBufferEXT = (pfn_glTexBufferEXT)load("glTexBufferEXT"); +} + +GLboolean GLAD_EXT_texture_compression_dxt1 = GL_FALSE; +GLboolean GLAD_EXT_texture_compression_latc = GL_FALSE; +GLboolean GLAD_EXT_texture_compression_rgtc = GL_FALSE; +GLboolean GLAD_EXT_texture_compression_s3tc = GL_FALSE; +GLboolean GLAD_EXT_texture_cube_map = GL_FALSE; +GLboolean GLAD_EXT_texture_env_add = GL_FALSE; +GLboolean GLAD_EXT_texture_env_combine = GL_FALSE; +GLboolean GLAD_EXT_texture_env_dot3 = GL_FALSE; +GLboolean GLAD_EXT_texture_filter_anisotropic = GL_FALSE; +GLboolean GLAD_EXT_texture_format_BGRA8888 = GL_FALSE; +GLboolean GLAD_EXT_texture_integer = GL_FALSE; +static void load_GL_EXT_texture_integer(LOADER load) { + if(!GLAD_EXT_texture_integer) return; + fp_glTexParameterIivEXT = (pfn_glTexParameterIivEXT)load("glTexParameterIivEXT"); + fp_glTexParameterIuivEXT = (pfn_glTexParameterIuivEXT)load("glTexParameterIuivEXT"); + fp_glGetTexParameterIivEXT = (pfn_glGetTexParameterIivEXT)load("glGetTexParameterIivEXT"); + fp_glGetTexParameterIuivEXT = (pfn_glGetTexParameterIuivEXT)load("glGetTexParameterIuivEXT"); + fp_glClearColorIiEXT = (pfn_glClearColorIiEXT)load("glClearColorIiEXT"); + fp_glClearColorIuiEXT = (pfn_glClearColorIuiEXT)load("glClearColorIuiEXT"); +} + +GLboolean GLAD_EXT_texture_lod_bias = GL_FALSE; +GLboolean GLAD_EXT_texture_mirror_clamp = GL_FALSE; +GLboolean GLAD_EXT_texture_perturb_normal = GL_FALSE; +static void load_GL_EXT_texture_perturb_normal(LOADER load) { + if(!GLAD_EXT_texture_perturb_normal) return; + fp_glTextureNormalEXT = (pfn_glTextureNormalEXT)load("glTextureNormalEXT"); +} + +GLboolean GLAD_EXT_texture_rg = GL_FALSE; +GLboolean GLAD_EXT_texture_shared_exponent = GL_FALSE; +GLboolean GLAD_EXT_texture_snorm = GL_FALSE; +GLboolean GLAD_EXT_texture_sRGB = GL_FALSE; +GLboolean GLAD_EXT_texture_sRGB_decode = GL_FALSE; +GLboolean GLAD_EXT_texture_storage = GL_FALSE; +static void load_GL_EXT_texture_storage(LOADER load) { + if(!GLAD_EXT_texture_storage) return; + fp_glTexStorage1DEXT = (pfn_glTexStorage1DEXT)load("glTexStorage1DEXT"); + fp_glTexStorage2DEXT = (pfn_glTexStorage2DEXT)load("glTexStorage2DEXT"); + fp_glTexStorage3DEXT = (pfn_glTexStorage3DEXT)load("glTexStorage3DEXT"); + fp_glTextureStorage1DEXT = (pfn_glTextureStorage1DEXT)load("glTextureStorage1DEXT"); + fp_glTextureStorage2DEXT = (pfn_glTextureStorage2DEXT)load("glTextureStorage2DEXT"); + fp_glTextureStorage3DEXT = (pfn_glTextureStorage3DEXT)load("glTextureStorage3DEXT"); +} + +GLboolean GLAD_EXT_texture_swizzle = GL_FALSE; +GLboolean GLAD_EXT_texture_type_2_10_10_10_REV = GL_FALSE; +GLboolean GLAD_EXT_timer_query = GL_FALSE; +static void load_GL_EXT_timer_query(LOADER load) { + if(!GLAD_EXT_timer_query) return; + fp_glGetQueryObjecti64vEXT = (pfn_glGetQueryObjecti64vEXT)load("glGetQueryObjecti64vEXT"); + fp_glGetQueryObjectui64vEXT = (pfn_glGetQueryObjectui64vEXT)load("glGetQueryObjectui64vEXT"); +} + +GLboolean GLAD_EXT_transform_feedback = GL_FALSE; +static void load_GL_EXT_transform_feedback(LOADER load) { + if(!GLAD_EXT_transform_feedback) return; + fp_glBeginTransformFeedbackEXT = (pfn_glBeginTransformFeedbackEXT)load("glBeginTransformFeedbackEXT"); + fp_glEndTransformFeedbackEXT = (pfn_glEndTransformFeedbackEXT)load("glEndTransformFeedbackEXT"); + fp_glBindBufferRangeEXT = (pfn_glBindBufferRangeEXT)load("glBindBufferRangeEXT"); + fp_glBindBufferOffsetEXT = (pfn_glBindBufferOffsetEXT)load("glBindBufferOffsetEXT"); + fp_glBindBufferBaseEXT = (pfn_glBindBufferBaseEXT)load("glBindBufferBaseEXT"); + fp_glTransformFeedbackVaryingsEXT = (pfn_glTransformFeedbackVaryingsEXT)load("glTransformFeedbackVaryingsEXT"); + fp_glGetTransformFeedbackVaryingEXT = (pfn_glGetTransformFeedbackVaryingEXT)load("glGetTransformFeedbackVaryingEXT"); +} + +GLboolean GLAD_EXT_unpack_subimage = GL_FALSE; +GLboolean GLAD_EXT_vertex_array_bgra = GL_FALSE; +GLboolean GLAD_EXT_vertex_attrib_64bit = GL_FALSE; +static void load_GL_EXT_vertex_attrib_64bit(LOADER load) { + if(!GLAD_EXT_vertex_attrib_64bit) return; + fp_glVertexAttribL1dEXT = (pfn_glVertexAttribL1dEXT)load("glVertexAttribL1dEXT"); + fp_glVertexAttribL2dEXT = (pfn_glVertexAttribL2dEXT)load("glVertexAttribL2dEXT"); + fp_glVertexAttribL3dEXT = (pfn_glVertexAttribL3dEXT)load("glVertexAttribL3dEXT"); + fp_glVertexAttribL4dEXT = (pfn_glVertexAttribL4dEXT)load("glVertexAttribL4dEXT"); + fp_glVertexAttribL1dvEXT = (pfn_glVertexAttribL1dvEXT)load("glVertexAttribL1dvEXT"); + fp_glVertexAttribL2dvEXT = (pfn_glVertexAttribL2dvEXT)load("glVertexAttribL2dvEXT"); + fp_glVertexAttribL3dvEXT = (pfn_glVertexAttribL3dvEXT)load("glVertexAttribL3dvEXT"); + fp_glVertexAttribL4dvEXT = (pfn_glVertexAttribL4dvEXT)load("glVertexAttribL4dvEXT"); + fp_glVertexAttribLPointerEXT = (pfn_glVertexAttribLPointerEXT)load("glVertexAttribLPointerEXT"); + fp_glGetVertexAttribLdvEXT = (pfn_glGetVertexAttribLdvEXT)load("glGetVertexAttribLdvEXT"); +} + +GLboolean GLAD_EXT_vertex_shader = GL_FALSE; +static void load_GL_EXT_vertex_shader(LOADER load) { + if(!GLAD_EXT_vertex_shader) return; + fp_glBeginVertexShaderEXT = (pfn_glBeginVertexShaderEXT)load("glBeginVertexShaderEXT"); + fp_glEndVertexShaderEXT = (pfn_glEndVertexShaderEXT)load("glEndVertexShaderEXT"); + fp_glBindVertexShaderEXT = (pfn_glBindVertexShaderEXT)load("glBindVertexShaderEXT"); + fp_glGenVertexShadersEXT = (pfn_glGenVertexShadersEXT)load("glGenVertexShadersEXT"); + fp_glDeleteVertexShaderEXT = (pfn_glDeleteVertexShaderEXT)load("glDeleteVertexShaderEXT"); + fp_glShaderOp1EXT = (pfn_glShaderOp1EXT)load("glShaderOp1EXT"); + fp_glShaderOp2EXT = (pfn_glShaderOp2EXT)load("glShaderOp2EXT"); + fp_glShaderOp3EXT = (pfn_glShaderOp3EXT)load("glShaderOp3EXT"); + fp_glSwizzleEXT = (pfn_glSwizzleEXT)load("glSwizzleEXT"); + fp_glWriteMaskEXT = (pfn_glWriteMaskEXT)load("glWriteMaskEXT"); + fp_glInsertComponentEXT = (pfn_glInsertComponentEXT)load("glInsertComponentEXT"); + fp_glExtractComponentEXT = (pfn_glExtractComponentEXT)load("glExtractComponentEXT"); + fp_glGenSymbolsEXT = (pfn_glGenSymbolsEXT)load("glGenSymbolsEXT"); + fp_glSetInvariantEXT = (pfn_glSetInvariantEXT)load("glSetInvariantEXT"); + fp_glSetLocalConstantEXT = (pfn_glSetLocalConstantEXT)load("glSetLocalConstantEXT"); + fp_glVariantbvEXT = (pfn_glVariantbvEXT)load("glVariantbvEXT"); + fp_glVariantsvEXT = (pfn_glVariantsvEXT)load("glVariantsvEXT"); + fp_glVariantivEXT = (pfn_glVariantivEXT)load("glVariantivEXT"); + fp_glVariantfvEXT = (pfn_glVariantfvEXT)load("glVariantfvEXT"); + fp_glVariantdvEXT = (pfn_glVariantdvEXT)load("glVariantdvEXT"); + fp_glVariantubvEXT = (pfn_glVariantubvEXT)load("glVariantubvEXT"); + fp_glVariantusvEXT = (pfn_glVariantusvEXT)load("glVariantusvEXT"); + fp_glVariantuivEXT = (pfn_glVariantuivEXT)load("glVariantuivEXT"); + fp_glVariantPointerEXT = (pfn_glVariantPointerEXT)load("glVariantPointerEXT"); + fp_glEnableVariantClientStateEXT = (pfn_glEnableVariantClientStateEXT)load("glEnableVariantClientStateEXT"); + fp_glDisableVariantClientStateEXT = (pfn_glDisableVariantClientStateEXT)load("glDisableVariantClientStateEXT"); + fp_glBindLightParameterEXT = (pfn_glBindLightParameterEXT)load("glBindLightParameterEXT"); + fp_glBindMaterialParameterEXT = (pfn_glBindMaterialParameterEXT)load("glBindMaterialParameterEXT"); + fp_glBindTexGenParameterEXT = (pfn_glBindTexGenParameterEXT)load("glBindTexGenParameterEXT"); + fp_glBindTextureUnitParameterEXT = (pfn_glBindTextureUnitParameterEXT)load("glBindTextureUnitParameterEXT"); + fp_glBindParameterEXT = (pfn_glBindParameterEXT)load("glBindParameterEXT"); + fp_glIsVariantEnabledEXT = (pfn_glIsVariantEnabledEXT)load("glIsVariantEnabledEXT"); + fp_glGetVariantBooleanvEXT = (pfn_glGetVariantBooleanvEXT)load("glGetVariantBooleanvEXT"); + fp_glGetVariantIntegervEXT = (pfn_glGetVariantIntegervEXT)load("glGetVariantIntegervEXT"); + fp_glGetVariantFloatvEXT = (pfn_glGetVariantFloatvEXT)load("glGetVariantFloatvEXT"); + fp_glGetVariantPointervEXT = (pfn_glGetVariantPointervEXT)load("glGetVariantPointervEXT"); + fp_glGetInvariantBooleanvEXT = (pfn_glGetInvariantBooleanvEXT)load("glGetInvariantBooleanvEXT"); + fp_glGetInvariantIntegervEXT = (pfn_glGetInvariantIntegervEXT)load("glGetInvariantIntegervEXT"); + fp_glGetInvariantFloatvEXT = (pfn_glGetInvariantFloatvEXT)load("glGetInvariantFloatvEXT"); + fp_glGetLocalConstantBooleanvEXT = (pfn_glGetLocalConstantBooleanvEXT)load("glGetLocalConstantBooleanvEXT"); + fp_glGetLocalConstantIntegervEXT = (pfn_glGetLocalConstantIntegervEXT)load("glGetLocalConstantIntegervEXT"); + fp_glGetLocalConstantFloatvEXT = (pfn_glGetLocalConstantFloatvEXT)load("glGetLocalConstantFloatvEXT"); +} + +GLboolean GLAD_EXT_vertex_weighting = GL_FALSE; +static void load_GL_EXT_vertex_weighting(LOADER load) { + if(!GLAD_EXT_vertex_weighting) return; + fp_glVertexWeightfEXT = (pfn_glVertexWeightfEXT)load("glVertexWeightfEXT"); + fp_glVertexWeightfvEXT = (pfn_glVertexWeightfvEXT)load("glVertexWeightfvEXT"); + fp_glVertexWeightPointerEXT = (pfn_glVertexWeightPointerEXT)load("glVertexWeightPointerEXT"); +} + +GLboolean GLAD_EXT_x11_sync_object = GL_FALSE; +static void load_GL_EXT_x11_sync_object(LOADER load) { + if(!GLAD_EXT_x11_sync_object) return; + fp_glImportSyncEXT = (pfn_glImportSyncEXT)load("glImportSyncEXT"); +} + +GLboolean GLAD_OES_byte_coordinates = GL_FALSE; +static void load_GL_OES_byte_coordinates(LOADER load) { + if(!GLAD_OES_byte_coordinates) return; + fp_glMultiTexCoord1bOES = (pfn_glMultiTexCoord1bOES)load("glMultiTexCoord1bOES"); + fp_glMultiTexCoord1bvOES = (pfn_glMultiTexCoord1bvOES)load("glMultiTexCoord1bvOES"); + fp_glMultiTexCoord2bOES = (pfn_glMultiTexCoord2bOES)load("glMultiTexCoord2bOES"); + fp_glMultiTexCoord2bvOES = (pfn_glMultiTexCoord2bvOES)load("glMultiTexCoord2bvOES"); + fp_glMultiTexCoord3bOES = (pfn_glMultiTexCoord3bOES)load("glMultiTexCoord3bOES"); + fp_glMultiTexCoord3bvOES = (pfn_glMultiTexCoord3bvOES)load("glMultiTexCoord3bvOES"); + fp_glMultiTexCoord4bOES = (pfn_glMultiTexCoord4bOES)load("glMultiTexCoord4bOES"); + fp_glMultiTexCoord4bvOES = (pfn_glMultiTexCoord4bvOES)load("glMultiTexCoord4bvOES"); + fp_glTexCoord1bOES = (pfn_glTexCoord1bOES)load("glTexCoord1bOES"); + fp_glTexCoord1bvOES = (pfn_glTexCoord1bvOES)load("glTexCoord1bvOES"); + fp_glTexCoord2bOES = (pfn_glTexCoord2bOES)load("glTexCoord2bOES"); + fp_glTexCoord2bvOES = (pfn_glTexCoord2bvOES)load("glTexCoord2bvOES"); + fp_glTexCoord3bOES = (pfn_glTexCoord3bOES)load("glTexCoord3bOES"); + fp_glTexCoord3bvOES = (pfn_glTexCoord3bvOES)load("glTexCoord3bvOES"); + fp_glTexCoord4bOES = (pfn_glTexCoord4bOES)load("glTexCoord4bOES"); + fp_glTexCoord4bvOES = (pfn_glTexCoord4bvOES)load("glTexCoord4bvOES"); + fp_glVertex2bOES = (pfn_glVertex2bOES)load("glVertex2bOES"); + fp_glVertex2bvOES = (pfn_glVertex2bvOES)load("glVertex2bvOES"); + fp_glVertex3bOES = (pfn_glVertex3bOES)load("glVertex3bOES"); + fp_glVertex3bvOES = (pfn_glVertex3bvOES)load("glVertex3bvOES"); + fp_glVertex4bOES = (pfn_glVertex4bOES)load("glVertex4bOES"); + fp_glVertex4bvOES = (pfn_glVertex4bvOES)load("glVertex4bvOES"); +} + +GLboolean GLAD_OES_compressed_ETC1_RGB8_texture = GL_FALSE; +GLboolean GLAD_OES_compressed_paletted_texture = GL_FALSE; +GLboolean GLAD_OES_depth24 = GL_FALSE; +GLboolean GLAD_OES_depth32 = GL_FALSE; +GLboolean GLAD_OES_depth_texture = GL_FALSE; +GLboolean GLAD_OES_EGL_image = GL_FALSE; +static void load_GL_OES_EGL_image(LOADER load) { + if(!GLAD_OES_EGL_image) return; + fp_glEGLImageTargetTexture2DOES = (pfn_glEGLImageTargetTexture2DOES)load("glEGLImageTargetTexture2DOES"); + fp_glEGLImageTargetRenderbufferStorageOES = (pfn_glEGLImageTargetRenderbufferStorageOES)load("glEGLImageTargetRenderbufferStorageOES"); +} + +GLboolean GLAD_OES_EGL_image_external = GL_FALSE; +GLboolean GLAD_OES_element_index_uint = GL_FALSE; +GLboolean GLAD_OES_fbo_render_mipmap = GL_FALSE; +GLboolean GLAD_OES_fixed_point = GL_FALSE; +static void load_GL_OES_fixed_point(LOADER load) { + if(!GLAD_OES_fixed_point) return; + fp_glAlphaFuncxOES = (pfn_glAlphaFuncxOES)load("glAlphaFuncxOES"); + fp_glClearColorxOES = (pfn_glClearColorxOES)load("glClearColorxOES"); + fp_glClearDepthxOES = (pfn_glClearDepthxOES)load("glClearDepthxOES"); + fp_glClipPlanexOES = (pfn_glClipPlanexOES)load("glClipPlanexOES"); + fp_glColor4xOES = (pfn_glColor4xOES)load("glColor4xOES"); + fp_glDepthRangexOES = (pfn_glDepthRangexOES)load("glDepthRangexOES"); + fp_glFogxOES = (pfn_glFogxOES)load("glFogxOES"); + fp_glFogxvOES = (pfn_glFogxvOES)load("glFogxvOES"); + fp_glFrustumxOES = (pfn_glFrustumxOES)load("glFrustumxOES"); + fp_glGetClipPlanexOES = (pfn_glGetClipPlanexOES)load("glGetClipPlanexOES"); + fp_glGetFixedvOES = (pfn_glGetFixedvOES)load("glGetFixedvOES"); + fp_glGetTexEnvxvOES = (pfn_glGetTexEnvxvOES)load("glGetTexEnvxvOES"); + fp_glGetTexParameterxvOES = (pfn_glGetTexParameterxvOES)load("glGetTexParameterxvOES"); + fp_glLightModelxOES = (pfn_glLightModelxOES)load("glLightModelxOES"); + fp_glLightModelxvOES = (pfn_glLightModelxvOES)load("glLightModelxvOES"); + fp_glLightxOES = (pfn_glLightxOES)load("glLightxOES"); + fp_glLightxvOES = (pfn_glLightxvOES)load("glLightxvOES"); + fp_glLineWidthxOES = (pfn_glLineWidthxOES)load("glLineWidthxOES"); + fp_glLoadMatrixxOES = (pfn_glLoadMatrixxOES)load("glLoadMatrixxOES"); + fp_glMaterialxOES = (pfn_glMaterialxOES)load("glMaterialxOES"); + fp_glMaterialxvOES = (pfn_glMaterialxvOES)load("glMaterialxvOES"); + fp_glMultMatrixxOES = (pfn_glMultMatrixxOES)load("glMultMatrixxOES"); + fp_glMultiTexCoord4xOES = (pfn_glMultiTexCoord4xOES)load("glMultiTexCoord4xOES"); + fp_glNormal3xOES = (pfn_glNormal3xOES)load("glNormal3xOES"); + fp_glOrthoxOES = (pfn_glOrthoxOES)load("glOrthoxOES"); + fp_glPointParameterxvOES = (pfn_glPointParameterxvOES)load("glPointParameterxvOES"); + fp_glPointSizexOES = (pfn_glPointSizexOES)load("glPointSizexOES"); + fp_glPolygonOffsetxOES = (pfn_glPolygonOffsetxOES)load("glPolygonOffsetxOES"); + fp_glRotatexOES = (pfn_glRotatexOES)load("glRotatexOES"); + fp_glSampleCoverageOES = (pfn_glSampleCoverageOES)load("glSampleCoverageOES"); + fp_glScalexOES = (pfn_glScalexOES)load("glScalexOES"); + fp_glTexEnvxOES = (pfn_glTexEnvxOES)load("glTexEnvxOES"); + fp_glTexEnvxvOES = (pfn_glTexEnvxvOES)load("glTexEnvxvOES"); + fp_glTexParameterxOES = (pfn_glTexParameterxOES)load("glTexParameterxOES"); + fp_glTexParameterxvOES = (pfn_glTexParameterxvOES)load("glTexParameterxvOES"); + fp_glTranslatexOES = (pfn_glTranslatexOES)load("glTranslatexOES"); + fp_glGetLightxvOES = (pfn_glGetLightxvOES)load("glGetLightxvOES"); + fp_glGetMaterialxvOES = (pfn_glGetMaterialxvOES)load("glGetMaterialxvOES"); + fp_glPointParameterxOES = (pfn_glPointParameterxOES)load("glPointParameterxOES"); + fp_glSampleCoveragexOES = (pfn_glSampleCoveragexOES)load("glSampleCoveragexOES"); + fp_glAccumxOES = (pfn_glAccumxOES)load("glAccumxOES"); + fp_glBitmapxOES = (pfn_glBitmapxOES)load("glBitmapxOES"); + fp_glBlendColorxOES = (pfn_glBlendColorxOES)load("glBlendColorxOES"); + fp_glClearAccumxOES = (pfn_glClearAccumxOES)load("glClearAccumxOES"); + fp_glColor3xOES = (pfn_glColor3xOES)load("glColor3xOES"); + fp_glColor3xvOES = (pfn_glColor3xvOES)load("glColor3xvOES"); + fp_glColor4xvOES = (pfn_glColor4xvOES)load("glColor4xvOES"); + fp_glConvolutionParameterxOES = (pfn_glConvolutionParameterxOES)load("glConvolutionParameterxOES"); + fp_glConvolutionParameterxvOES = (pfn_glConvolutionParameterxvOES)load("glConvolutionParameterxvOES"); + fp_glEvalCoord1xOES = (pfn_glEvalCoord1xOES)load("glEvalCoord1xOES"); + fp_glEvalCoord1xvOES = (pfn_glEvalCoord1xvOES)load("glEvalCoord1xvOES"); + fp_glEvalCoord2xOES = (pfn_glEvalCoord2xOES)load("glEvalCoord2xOES"); + fp_glEvalCoord2xvOES = (pfn_glEvalCoord2xvOES)load("glEvalCoord2xvOES"); + fp_glFeedbackBufferxOES = (pfn_glFeedbackBufferxOES)load("glFeedbackBufferxOES"); + fp_glGetConvolutionParameterxvOES = (pfn_glGetConvolutionParameterxvOES)load("glGetConvolutionParameterxvOES"); + fp_glGetHistogramParameterxvOES = (pfn_glGetHistogramParameterxvOES)load("glGetHistogramParameterxvOES"); + fp_glGetLightxOES = (pfn_glGetLightxOES)load("glGetLightxOES"); + fp_glGetMapxvOES = (pfn_glGetMapxvOES)load("glGetMapxvOES"); + fp_glGetMaterialxOES = (pfn_glGetMaterialxOES)load("glGetMaterialxOES"); + fp_glGetPixelMapxv = (pfn_glGetPixelMapxv)load("glGetPixelMapxv"); + fp_glGetTexGenxvOES = (pfn_glGetTexGenxvOES)load("glGetTexGenxvOES"); + fp_glGetTexLevelParameterxvOES = (pfn_glGetTexLevelParameterxvOES)load("glGetTexLevelParameterxvOES"); + fp_glIndexxOES = (pfn_glIndexxOES)load("glIndexxOES"); + fp_glIndexxvOES = (pfn_glIndexxvOES)load("glIndexxvOES"); + fp_glLoadTransposeMatrixxOES = (pfn_glLoadTransposeMatrixxOES)load("glLoadTransposeMatrixxOES"); + fp_glMap1xOES = (pfn_glMap1xOES)load("glMap1xOES"); + fp_glMap2xOES = (pfn_glMap2xOES)load("glMap2xOES"); + fp_glMapGrid1xOES = (pfn_glMapGrid1xOES)load("glMapGrid1xOES"); + fp_glMapGrid2xOES = (pfn_glMapGrid2xOES)load("glMapGrid2xOES"); + fp_glMultTransposeMatrixxOES = (pfn_glMultTransposeMatrixxOES)load("glMultTransposeMatrixxOES"); + fp_glMultiTexCoord1xOES = (pfn_glMultiTexCoord1xOES)load("glMultiTexCoord1xOES"); + fp_glMultiTexCoord1xvOES = (pfn_glMultiTexCoord1xvOES)load("glMultiTexCoord1xvOES"); + fp_glMultiTexCoord2xOES = (pfn_glMultiTexCoord2xOES)load("glMultiTexCoord2xOES"); + fp_glMultiTexCoord2xvOES = (pfn_glMultiTexCoord2xvOES)load("glMultiTexCoord2xvOES"); + fp_glMultiTexCoord3xOES = (pfn_glMultiTexCoord3xOES)load("glMultiTexCoord3xOES"); + fp_glMultiTexCoord3xvOES = (pfn_glMultiTexCoord3xvOES)load("glMultiTexCoord3xvOES"); + fp_glMultiTexCoord4xvOES = (pfn_glMultiTexCoord4xvOES)load("glMultiTexCoord4xvOES"); + fp_glNormal3xvOES = (pfn_glNormal3xvOES)load("glNormal3xvOES"); + fp_glPassThroughxOES = (pfn_glPassThroughxOES)load("glPassThroughxOES"); + fp_glPixelMapx = (pfn_glPixelMapx)load("glPixelMapx"); + fp_glPixelStorex = (pfn_glPixelStorex)load("glPixelStorex"); + fp_glPixelTransferxOES = (pfn_glPixelTransferxOES)load("glPixelTransferxOES"); + fp_glPixelZoomxOES = (pfn_glPixelZoomxOES)load("glPixelZoomxOES"); + fp_glPrioritizeTexturesxOES = (pfn_glPrioritizeTexturesxOES)load("glPrioritizeTexturesxOES"); + fp_glRasterPos2xOES = (pfn_glRasterPos2xOES)load("glRasterPos2xOES"); + fp_glRasterPos2xvOES = (pfn_glRasterPos2xvOES)load("glRasterPos2xvOES"); + fp_glRasterPos3xOES = (pfn_glRasterPos3xOES)load("glRasterPos3xOES"); + fp_glRasterPos3xvOES = (pfn_glRasterPos3xvOES)load("glRasterPos3xvOES"); + fp_glRasterPos4xOES = (pfn_glRasterPos4xOES)load("glRasterPos4xOES"); + fp_glRasterPos4xvOES = (pfn_glRasterPos4xvOES)load("glRasterPos4xvOES"); + fp_glRectxOES = (pfn_glRectxOES)load("glRectxOES"); + fp_glRectxvOES = (pfn_glRectxvOES)load("glRectxvOES"); + fp_glTexCoord1xOES = (pfn_glTexCoord1xOES)load("glTexCoord1xOES"); + fp_glTexCoord1xvOES = (pfn_glTexCoord1xvOES)load("glTexCoord1xvOES"); + fp_glTexCoord2xOES = (pfn_glTexCoord2xOES)load("glTexCoord2xOES"); + fp_glTexCoord2xvOES = (pfn_glTexCoord2xvOES)load("glTexCoord2xvOES"); + fp_glTexCoord3xOES = (pfn_glTexCoord3xOES)load("glTexCoord3xOES"); + fp_glTexCoord3xvOES = (pfn_glTexCoord3xvOES)load("glTexCoord3xvOES"); + fp_glTexCoord4xOES = (pfn_glTexCoord4xOES)load("glTexCoord4xOES"); + fp_glTexCoord4xvOES = (pfn_glTexCoord4xvOES)load("glTexCoord4xvOES"); + fp_glTexGenxOES = (pfn_glTexGenxOES)load("glTexGenxOES"); + fp_glTexGenxvOES = (pfn_glTexGenxvOES)load("glTexGenxvOES"); + fp_glVertex2xOES = (pfn_glVertex2xOES)load("glVertex2xOES"); + fp_glVertex2xvOES = (pfn_glVertex2xvOES)load("glVertex2xvOES"); + fp_glVertex3xOES = (pfn_glVertex3xOES)load("glVertex3xOES"); + fp_glVertex3xvOES = (pfn_glVertex3xvOES)load("glVertex3xvOES"); + fp_glVertex4xOES = (pfn_glVertex4xOES)load("glVertex4xOES"); + fp_glVertex4xvOES = (pfn_glVertex4xvOES)load("glVertex4xvOES"); +} + +GLboolean GLAD_OES_fragment_precision_high = GL_FALSE; +GLboolean GLAD_OES_get_program_binary = GL_FALSE; +static void load_GL_OES_get_program_binary(LOADER load) { + if(!GLAD_OES_get_program_binary) return; + fp_glGetProgramBinaryOES = (pfn_glGetProgramBinaryOES)load("glGetProgramBinaryOES"); + fp_glProgramBinaryOES = (pfn_glProgramBinaryOES)load("glProgramBinaryOES"); +} + +GLboolean GLAD_OES_mapbuffer = GL_FALSE; +static void load_GL_OES_mapbuffer(LOADER load) { + if(!GLAD_OES_mapbuffer) return; + fp_glMapBufferOES = (pfn_glMapBufferOES)load("glMapBufferOES"); + fp_glUnmapBufferOES = (pfn_glUnmapBufferOES)load("glUnmapBufferOES"); + fp_glGetBufferPointervOES = (pfn_glGetBufferPointervOES)load("glGetBufferPointervOES"); +} + +GLboolean GLAD_OES_packed_depth_stencil = GL_FALSE; +GLboolean GLAD_OES_query_matrix = GL_FALSE; +static void load_GL_OES_query_matrix(LOADER load) { + if(!GLAD_OES_query_matrix) return; + fp_glQueryMatrixxOES = (pfn_glQueryMatrixxOES)load("glQueryMatrixxOES"); +} + +GLboolean GLAD_OES_read_format = GL_FALSE; +GLboolean GLAD_OES_required_internalformat = GL_FALSE; +GLboolean GLAD_OES_rgb8_rgba8 = GL_FALSE; +GLboolean GLAD_OES_single_precision = GL_FALSE; +static void load_GL_OES_single_precision(LOADER load) { + if(!GLAD_OES_single_precision) return; + fp_glClearDepthfOES = (pfn_glClearDepthfOES)load("glClearDepthfOES"); + fp_glClipPlanefOES = (pfn_glClipPlanefOES)load("glClipPlanefOES"); + fp_glDepthRangefOES = (pfn_glDepthRangefOES)load("glDepthRangefOES"); + fp_glFrustumfOES = (pfn_glFrustumfOES)load("glFrustumfOES"); + fp_glGetClipPlanefOES = (pfn_glGetClipPlanefOES)load("glGetClipPlanefOES"); + fp_glOrthofOES = (pfn_glOrthofOES)load("glOrthofOES"); +} + +GLboolean GLAD_OES_standard_derivatives = GL_FALSE; +GLboolean GLAD_OES_stencil1 = GL_FALSE; +GLboolean GLAD_OES_stencil4 = GL_FALSE; +GLboolean GLAD_OES_surfaceless_context = GL_FALSE; +GLboolean GLAD_OES_texture_3D = GL_FALSE; +static void load_GL_OES_texture_3D(LOADER load) { + if(!GLAD_OES_texture_3D) return; + fp_glTexImage3DOES = (pfn_glTexImage3DOES)load("glTexImage3DOES"); + fp_glTexSubImage3DOES = (pfn_glTexSubImage3DOES)load("glTexSubImage3DOES"); + fp_glCopyTexSubImage3DOES = (pfn_glCopyTexSubImage3DOES)load("glCopyTexSubImage3DOES"); + fp_glCompressedTexImage3DOES = (pfn_glCompressedTexImage3DOES)load("glCompressedTexImage3DOES"); + fp_glCompressedTexSubImage3DOES = (pfn_glCompressedTexSubImage3DOES)load("glCompressedTexSubImage3DOES"); + fp_glFramebufferTexture3DOES = (pfn_glFramebufferTexture3DOES)load("glFramebufferTexture3DOES"); +} + +GLboolean GLAD_OES_texture_compression_astc = GL_FALSE; +GLboolean GLAD_OES_texture_float = GL_FALSE; +GLboolean GLAD_OES_texture_float_linear = GL_FALSE; +GLboolean GLAD_OES_texture_half_float = GL_FALSE; +GLboolean GLAD_OES_texture_half_float_linear = GL_FALSE; +GLboolean GLAD_OES_texture_npot = GL_FALSE; +GLboolean GLAD_OES_vertex_array_object = GL_FALSE; +static void load_GL_OES_vertex_array_object(LOADER load) { + if(!GLAD_OES_vertex_array_object) return; + fp_glBindVertexArrayOES = (pfn_glBindVertexArrayOES)load("glBindVertexArrayOES"); + fp_glDeleteVertexArraysOES = (pfn_glDeleteVertexArraysOES)load("glDeleteVertexArraysOES"); + fp_glGenVertexArraysOES = (pfn_glGenVertexArraysOES)load("glGenVertexArraysOES"); + fp_glIsVertexArrayOES = (pfn_glIsVertexArrayOES)load("glIsVertexArrayOES"); +} + +GLboolean GLAD_OES_vertex_half_float = GL_FALSE; +GLboolean GLAD_OES_vertex_type_10_10_10_2 = GL_FALSE; +GLboolean GLAD_AMD_blend_minmax_factor = GL_FALSE; +GLboolean GLAD_AMD_compressed_3DC_texture = GL_FALSE; +GLboolean GLAD_AMD_compressed_ATC_texture = GL_FALSE; +GLboolean GLAD_AMD_conservative_depth = GL_FALSE; +GLboolean GLAD_AMD_debug_output = GL_FALSE; +static void load_GL_AMD_debug_output(LOADER load) { + if(!GLAD_AMD_debug_output) return; + fp_glDebugMessageEnableAMD = (pfn_glDebugMessageEnableAMD)load("glDebugMessageEnableAMD"); + fp_glDebugMessageInsertAMD = (pfn_glDebugMessageInsertAMD)load("glDebugMessageInsertAMD"); + fp_glDebugMessageCallbackAMD = (pfn_glDebugMessageCallbackAMD)load("glDebugMessageCallbackAMD"); + fp_glGetDebugMessageLogAMD = (pfn_glGetDebugMessageLogAMD)load("glGetDebugMessageLogAMD"); +} + +GLboolean GLAD_AMD_depth_clamp_separate = GL_FALSE; +GLboolean GLAD_AMD_draw_buffers_blend = GL_FALSE; +static void load_GL_AMD_draw_buffers_blend(LOADER load) { + if(!GLAD_AMD_draw_buffers_blend) return; + fp_glBlendFuncIndexedAMD = (pfn_glBlendFuncIndexedAMD)load("glBlendFuncIndexedAMD"); + fp_glBlendFuncSeparateIndexedAMD = (pfn_glBlendFuncSeparateIndexedAMD)load("glBlendFuncSeparateIndexedAMD"); + fp_glBlendEquationIndexedAMD = (pfn_glBlendEquationIndexedAMD)load("glBlendEquationIndexedAMD"); + fp_glBlendEquationSeparateIndexedAMD = (pfn_glBlendEquationSeparateIndexedAMD)load("glBlendEquationSeparateIndexedAMD"); +} + +GLboolean GLAD_AMD_interleaved_elements = GL_FALSE; +static void load_GL_AMD_interleaved_elements(LOADER load) { + if(!GLAD_AMD_interleaved_elements) return; + fp_glVertexAttribParameteriAMD = (pfn_glVertexAttribParameteriAMD)load("glVertexAttribParameteriAMD"); +} + +GLboolean GLAD_AMD_multi_draw_indirect = GL_FALSE; +static void load_GL_AMD_multi_draw_indirect(LOADER load) { + if(!GLAD_AMD_multi_draw_indirect) return; + fp_glMultiDrawArraysIndirectAMD = (pfn_glMultiDrawArraysIndirectAMD)load("glMultiDrawArraysIndirectAMD"); + fp_glMultiDrawElementsIndirectAMD = (pfn_glMultiDrawElementsIndirectAMD)load("glMultiDrawElementsIndirectAMD"); +} + +GLboolean GLAD_AMD_name_gen_delete = GL_FALSE; +static void load_GL_AMD_name_gen_delete(LOADER load) { + if(!GLAD_AMD_name_gen_delete) return; + fp_glGenNamesAMD = (pfn_glGenNamesAMD)load("glGenNamesAMD"); + fp_glDeleteNamesAMD = (pfn_glDeleteNamesAMD)load("glDeleteNamesAMD"); + fp_glIsNameAMD = (pfn_glIsNameAMD)load("glIsNameAMD"); +} + +GLboolean GLAD_AMD_performance_monitor = GL_FALSE; +static void load_GL_AMD_performance_monitor(LOADER load) { + if(!GLAD_AMD_performance_monitor) return; + fp_glGetPerfMonitorGroupsAMD = (pfn_glGetPerfMonitorGroupsAMD)load("glGetPerfMonitorGroupsAMD"); + fp_glGetPerfMonitorCountersAMD = (pfn_glGetPerfMonitorCountersAMD)load("glGetPerfMonitorCountersAMD"); + fp_glGetPerfMonitorGroupStringAMD = (pfn_glGetPerfMonitorGroupStringAMD)load("glGetPerfMonitorGroupStringAMD"); + fp_glGetPerfMonitorCounterStringAMD = (pfn_glGetPerfMonitorCounterStringAMD)load("glGetPerfMonitorCounterStringAMD"); + fp_glGetPerfMonitorCounterInfoAMD = (pfn_glGetPerfMonitorCounterInfoAMD)load("glGetPerfMonitorCounterInfoAMD"); + fp_glGenPerfMonitorsAMD = (pfn_glGenPerfMonitorsAMD)load("glGenPerfMonitorsAMD"); + fp_glDeletePerfMonitorsAMD = (pfn_glDeletePerfMonitorsAMD)load("glDeletePerfMonitorsAMD"); + fp_glSelectPerfMonitorCountersAMD = (pfn_glSelectPerfMonitorCountersAMD)load("glSelectPerfMonitorCountersAMD"); + fp_glBeginPerfMonitorAMD = (pfn_glBeginPerfMonitorAMD)load("glBeginPerfMonitorAMD"); + fp_glEndPerfMonitorAMD = (pfn_glEndPerfMonitorAMD)load("glEndPerfMonitorAMD"); + fp_glGetPerfMonitorCounterDataAMD = (pfn_glGetPerfMonitorCounterDataAMD)load("glGetPerfMonitorCounterDataAMD"); +} + +GLboolean GLAD_AMD_pinned_memory = GL_FALSE; +GLboolean GLAD_AMD_program_binary_Z400 = GL_FALSE; +GLboolean GLAD_AMD_query_buffer_object = GL_FALSE; +GLboolean GLAD_AMD_sample_positions = GL_FALSE; +static void load_GL_AMD_sample_positions(LOADER load) { + if(!GLAD_AMD_sample_positions) return; + fp_glSetMultisamplefvAMD = (pfn_glSetMultisamplefvAMD)load("glSetMultisamplefvAMD"); +} + +GLboolean GLAD_AMD_seamless_cubemap_per_texture = GL_FALSE; +GLboolean GLAD_AMD_shader_atomic_counter_ops = GL_FALSE; +GLboolean GLAD_AMD_shader_stencil_export = GL_FALSE; +GLboolean GLAD_AMD_shader_trinary_minmax = GL_FALSE; +GLboolean GLAD_AMD_sparse_texture = GL_FALSE; +static void load_GL_AMD_sparse_texture(LOADER load) { + if(!GLAD_AMD_sparse_texture) return; + fp_glTexStorageSparseAMD = (pfn_glTexStorageSparseAMD)load("glTexStorageSparseAMD"); + fp_glTextureStorageSparseAMD = (pfn_glTextureStorageSparseAMD)load("glTextureStorageSparseAMD"); +} + +GLboolean GLAD_AMD_stencil_operation_extended = GL_FALSE; +static void load_GL_AMD_stencil_operation_extended(LOADER load) { + if(!GLAD_AMD_stencil_operation_extended) return; + fp_glStencilOpValueAMD = (pfn_glStencilOpValueAMD)load("glStencilOpValueAMD"); +} + +GLboolean GLAD_AMD_texture_texture4 = GL_FALSE; +GLboolean GLAD_AMD_transform_feedback3_lines_triangles = GL_FALSE; +GLboolean GLAD_AMD_vertex_shader_layer = GL_FALSE; +GLboolean GLAD_AMD_vertex_shader_tessellator = GL_FALSE; +static void load_GL_AMD_vertex_shader_tessellator(LOADER load) { + if(!GLAD_AMD_vertex_shader_tessellator) return; + fp_glTessellationFactorAMD = (pfn_glTessellationFactorAMD)load("glTessellationFactorAMD"); + fp_glTessellationModeAMD = (pfn_glTessellationModeAMD)load("glTessellationModeAMD"); +} + +GLboolean GLAD_AMD_vertex_shader_viewport_index = GL_FALSE; +GLboolean GLAD_ANGLE_depth_texture = GL_FALSE; +GLboolean GLAD_ANGLE_framebuffer_blit = GL_FALSE; +static void load_GL_ANGLE_framebuffer_blit(LOADER load) { + if(!GLAD_ANGLE_framebuffer_blit) return; + fp_glBlitFramebufferANGLE = (pfn_glBlitFramebufferANGLE)load("glBlitFramebufferANGLE"); +} + +GLboolean GLAD_ANGLE_framebuffer_multisample = GL_FALSE; +static void load_GL_ANGLE_framebuffer_multisample(LOADER load) { + if(!GLAD_ANGLE_framebuffer_multisample) return; + fp_glRenderbufferStorageMultisampleANGLE = (pfn_glRenderbufferStorageMultisampleANGLE)load("glRenderbufferStorageMultisampleANGLE"); +} + +GLboolean GLAD_ANGLE_instanced_arrays = GL_FALSE; +static void load_GL_ANGLE_instanced_arrays(LOADER load) { + if(!GLAD_ANGLE_instanced_arrays) return; + fp_glDrawArraysInstancedANGLE = (pfn_glDrawArraysInstancedANGLE)load("glDrawArraysInstancedANGLE"); + fp_glDrawElementsInstancedANGLE = (pfn_glDrawElementsInstancedANGLE)load("glDrawElementsInstancedANGLE"); + fp_glVertexAttribDivisorANGLE = (pfn_glVertexAttribDivisorANGLE)load("glVertexAttribDivisorANGLE"); +} + +GLboolean GLAD_ANGLE_pack_reverse_row_order = GL_FALSE; +GLboolean GLAD_ANGLE_program_binary = GL_FALSE; +GLboolean GLAD_ANGLE_texture_compression_dxt3 = GL_FALSE; +GLboolean GLAD_ANGLE_texture_compression_dxt5 = GL_FALSE; +GLboolean GLAD_ANGLE_texture_usage = GL_FALSE; +GLboolean GLAD_ANGLE_translated_shader_source = GL_FALSE; +static void load_GL_ANGLE_translated_shader_source(LOADER load) { + if(!GLAD_ANGLE_translated_shader_source) return; + fp_glGetTranslatedShaderSourceANGLE = (pfn_glGetTranslatedShaderSourceANGLE)load("glGetTranslatedShaderSourceANGLE"); +} + +GLboolean GLAD_APPLE_aux_depth_stencil = GL_FALSE; +GLboolean GLAD_APPLE_client_storage = GL_FALSE; +GLboolean GLAD_APPLE_copy_texture_levels = GL_FALSE; +static void load_GL_APPLE_copy_texture_levels(LOADER load) { + if(!GLAD_APPLE_copy_texture_levels) return; + fp_glCopyTextureLevelsAPPLE = (pfn_glCopyTextureLevelsAPPLE)load("glCopyTextureLevelsAPPLE"); +} + +GLboolean GLAD_APPLE_element_array = GL_FALSE; +static void load_GL_APPLE_element_array(LOADER load) { + if(!GLAD_APPLE_element_array) return; + fp_glElementPointerAPPLE = (pfn_glElementPointerAPPLE)load("glElementPointerAPPLE"); + fp_glDrawElementArrayAPPLE = (pfn_glDrawElementArrayAPPLE)load("glDrawElementArrayAPPLE"); + fp_glDrawRangeElementArrayAPPLE = (pfn_glDrawRangeElementArrayAPPLE)load("glDrawRangeElementArrayAPPLE"); + fp_glMultiDrawElementArrayAPPLE = (pfn_glMultiDrawElementArrayAPPLE)load("glMultiDrawElementArrayAPPLE"); + fp_glMultiDrawRangeElementArrayAPPLE = (pfn_glMultiDrawRangeElementArrayAPPLE)load("glMultiDrawRangeElementArrayAPPLE"); +} + +GLboolean GLAD_APPLE_fence = GL_FALSE; +static void load_GL_APPLE_fence(LOADER load) { + if(!GLAD_APPLE_fence) return; + fp_glGenFencesAPPLE = (pfn_glGenFencesAPPLE)load("glGenFencesAPPLE"); + fp_glDeleteFencesAPPLE = (pfn_glDeleteFencesAPPLE)load("glDeleteFencesAPPLE"); + fp_glSetFenceAPPLE = (pfn_glSetFenceAPPLE)load("glSetFenceAPPLE"); + fp_glIsFenceAPPLE = (pfn_glIsFenceAPPLE)load("glIsFenceAPPLE"); + fp_glTestFenceAPPLE = (pfn_glTestFenceAPPLE)load("glTestFenceAPPLE"); + fp_glFinishFenceAPPLE = (pfn_glFinishFenceAPPLE)load("glFinishFenceAPPLE"); + fp_glTestObjectAPPLE = (pfn_glTestObjectAPPLE)load("glTestObjectAPPLE"); + fp_glFinishObjectAPPLE = (pfn_glFinishObjectAPPLE)load("glFinishObjectAPPLE"); +} + +GLboolean GLAD_APPLE_float_pixels = GL_FALSE; +GLboolean GLAD_APPLE_flush_buffer_range = GL_FALSE; +static void load_GL_APPLE_flush_buffer_range(LOADER load) { + if(!GLAD_APPLE_flush_buffer_range) return; + fp_glBufferParameteriAPPLE = (pfn_glBufferParameteriAPPLE)load("glBufferParameteriAPPLE"); + fp_glFlushMappedBufferRangeAPPLE = (pfn_glFlushMappedBufferRangeAPPLE)load("glFlushMappedBufferRangeAPPLE"); +} + +GLboolean GLAD_APPLE_framebuffer_multisample = GL_FALSE; +static void load_GL_APPLE_framebuffer_multisample(LOADER load) { + if(!GLAD_APPLE_framebuffer_multisample) return; + fp_glRenderbufferStorageMultisampleAPPLE = (pfn_glRenderbufferStorageMultisampleAPPLE)load("glRenderbufferStorageMultisampleAPPLE"); + fp_glResolveMultisampleFramebufferAPPLE = (pfn_glResolveMultisampleFramebufferAPPLE)load("glResolveMultisampleFramebufferAPPLE"); +} + +GLboolean GLAD_APPLE_object_purgeable = GL_FALSE; +static void load_GL_APPLE_object_purgeable(LOADER load) { + if(!GLAD_APPLE_object_purgeable) return; + fp_glObjectPurgeableAPPLE = (pfn_glObjectPurgeableAPPLE)load("glObjectPurgeableAPPLE"); + fp_glObjectUnpurgeableAPPLE = (pfn_glObjectUnpurgeableAPPLE)load("glObjectUnpurgeableAPPLE"); + fp_glGetObjectParameterivAPPLE = (pfn_glGetObjectParameterivAPPLE)load("glGetObjectParameterivAPPLE"); +} + +GLboolean GLAD_APPLE_rgb_422 = GL_FALSE; +GLboolean GLAD_APPLE_row_bytes = GL_FALSE; +GLboolean GLAD_APPLE_specular_vector = GL_FALSE; +GLboolean GLAD_APPLE_sync = GL_FALSE; +static void load_GL_APPLE_sync(LOADER load) { + if(!GLAD_APPLE_sync) return; + fp_glFenceSyncAPPLE = (pfn_glFenceSyncAPPLE)load("glFenceSyncAPPLE"); + fp_glIsSyncAPPLE = (pfn_glIsSyncAPPLE)load("glIsSyncAPPLE"); + fp_glDeleteSyncAPPLE = (pfn_glDeleteSyncAPPLE)load("glDeleteSyncAPPLE"); + fp_glClientWaitSyncAPPLE = (pfn_glClientWaitSyncAPPLE)load("glClientWaitSyncAPPLE"); + fp_glWaitSyncAPPLE = (pfn_glWaitSyncAPPLE)load("glWaitSyncAPPLE"); + fp_glGetInteger64vAPPLE = (pfn_glGetInteger64vAPPLE)load("glGetInteger64vAPPLE"); + fp_glGetSyncivAPPLE = (pfn_glGetSyncivAPPLE)load("glGetSyncivAPPLE"); +} + +GLboolean GLAD_APPLE_texture_format_BGRA8888 = GL_FALSE; +GLboolean GLAD_APPLE_texture_max_level = GL_FALSE; +GLboolean GLAD_APPLE_texture_range = GL_FALSE; +static void load_GL_APPLE_texture_range(LOADER load) { + if(!GLAD_APPLE_texture_range) return; + fp_glTextureRangeAPPLE = (pfn_glTextureRangeAPPLE)load("glTextureRangeAPPLE"); + fp_glGetTexParameterPointervAPPLE = (pfn_glGetTexParameterPointervAPPLE)load("glGetTexParameterPointervAPPLE"); +} + +GLboolean GLAD_APPLE_transform_hint = GL_FALSE; +GLboolean GLAD_APPLE_vertex_array_object = GL_FALSE; +static void load_GL_APPLE_vertex_array_object(LOADER load) { + if(!GLAD_APPLE_vertex_array_object) return; + fp_glBindVertexArrayAPPLE = (pfn_glBindVertexArrayAPPLE)load("glBindVertexArrayAPPLE"); + fp_glDeleteVertexArraysAPPLE = (pfn_glDeleteVertexArraysAPPLE)load("glDeleteVertexArraysAPPLE"); + fp_glGenVertexArraysAPPLE = (pfn_glGenVertexArraysAPPLE)load("glGenVertexArraysAPPLE"); + fp_glIsVertexArrayAPPLE = (pfn_glIsVertexArrayAPPLE)load("glIsVertexArrayAPPLE"); +} + +GLboolean GLAD_APPLE_vertex_array_range = GL_FALSE; +static void load_GL_APPLE_vertex_array_range(LOADER load) { + if(!GLAD_APPLE_vertex_array_range) return; + fp_glVertexArrayRangeAPPLE = (pfn_glVertexArrayRangeAPPLE)load("glVertexArrayRangeAPPLE"); + fp_glFlushVertexArrayRangeAPPLE = (pfn_glFlushVertexArrayRangeAPPLE)load("glFlushVertexArrayRangeAPPLE"); + fp_glVertexArrayParameteriAPPLE = (pfn_glVertexArrayParameteriAPPLE)load("glVertexArrayParameteriAPPLE"); +} + +GLboolean GLAD_APPLE_vertex_program_evaluators = GL_FALSE; +static void load_GL_APPLE_vertex_program_evaluators(LOADER load) { + if(!GLAD_APPLE_vertex_program_evaluators) return; + fp_glEnableVertexAttribAPPLE = (pfn_glEnableVertexAttribAPPLE)load("glEnableVertexAttribAPPLE"); + fp_glDisableVertexAttribAPPLE = (pfn_glDisableVertexAttribAPPLE)load("glDisableVertexAttribAPPLE"); + fp_glIsVertexAttribEnabledAPPLE = (pfn_glIsVertexAttribEnabledAPPLE)load("glIsVertexAttribEnabledAPPLE"); + fp_glMapVertexAttrib1dAPPLE = (pfn_glMapVertexAttrib1dAPPLE)load("glMapVertexAttrib1dAPPLE"); + fp_glMapVertexAttrib1fAPPLE = (pfn_glMapVertexAttrib1fAPPLE)load("glMapVertexAttrib1fAPPLE"); + fp_glMapVertexAttrib2dAPPLE = (pfn_glMapVertexAttrib2dAPPLE)load("glMapVertexAttrib2dAPPLE"); + fp_glMapVertexAttrib2fAPPLE = (pfn_glMapVertexAttrib2fAPPLE)load("glMapVertexAttrib2fAPPLE"); +} + +GLboolean GLAD_APPLE_ycbcr_422 = GL_FALSE; +GLboolean GLAD_ARM_mali_program_binary = GL_FALSE; +GLboolean GLAD_ARM_mali_shader_binary = GL_FALSE; +GLboolean GLAD_ARM_rgba8 = GL_FALSE; +GLboolean GLAD_ATI_draw_buffers = GL_FALSE; +static void load_GL_ATI_draw_buffers(LOADER load) { + if(!GLAD_ATI_draw_buffers) return; + fp_glDrawBuffersATI = (pfn_glDrawBuffersATI)load("glDrawBuffersATI"); +} + +GLboolean GLAD_ATI_element_array = GL_FALSE; +static void load_GL_ATI_element_array(LOADER load) { + if(!GLAD_ATI_element_array) return; + fp_glElementPointerATI = (pfn_glElementPointerATI)load("glElementPointerATI"); + fp_glDrawElementArrayATI = (pfn_glDrawElementArrayATI)load("glDrawElementArrayATI"); + fp_glDrawRangeElementArrayATI = (pfn_glDrawRangeElementArrayATI)load("glDrawRangeElementArrayATI"); +} + +GLboolean GLAD_ATI_envmap_bumpmap = GL_FALSE; +static void load_GL_ATI_envmap_bumpmap(LOADER load) { + if(!GLAD_ATI_envmap_bumpmap) return; + fp_glTexBumpParameterivATI = (pfn_glTexBumpParameterivATI)load("glTexBumpParameterivATI"); + fp_glTexBumpParameterfvATI = (pfn_glTexBumpParameterfvATI)load("glTexBumpParameterfvATI"); + fp_glGetTexBumpParameterivATI = (pfn_glGetTexBumpParameterivATI)load("glGetTexBumpParameterivATI"); + fp_glGetTexBumpParameterfvATI = (pfn_glGetTexBumpParameterfvATI)load("glGetTexBumpParameterfvATI"); +} + +GLboolean GLAD_ATI_fragment_shader = GL_FALSE; +static void load_GL_ATI_fragment_shader(LOADER load) { + if(!GLAD_ATI_fragment_shader) return; + fp_glGenFragmentShadersATI = (pfn_glGenFragmentShadersATI)load("glGenFragmentShadersATI"); + fp_glBindFragmentShaderATI = (pfn_glBindFragmentShaderATI)load("glBindFragmentShaderATI"); + fp_glDeleteFragmentShaderATI = (pfn_glDeleteFragmentShaderATI)load("glDeleteFragmentShaderATI"); + fp_glBeginFragmentShaderATI = (pfn_glBeginFragmentShaderATI)load("glBeginFragmentShaderATI"); + fp_glEndFragmentShaderATI = (pfn_glEndFragmentShaderATI)load("glEndFragmentShaderATI"); + fp_glPassTexCoordATI = (pfn_glPassTexCoordATI)load("glPassTexCoordATI"); + fp_glSampleMapATI = (pfn_glSampleMapATI)load("glSampleMapATI"); + fp_glColorFragmentOp1ATI = (pfn_glColorFragmentOp1ATI)load("glColorFragmentOp1ATI"); + fp_glColorFragmentOp2ATI = (pfn_glColorFragmentOp2ATI)load("glColorFragmentOp2ATI"); + fp_glColorFragmentOp3ATI = (pfn_glColorFragmentOp3ATI)load("glColorFragmentOp3ATI"); + fp_glAlphaFragmentOp1ATI = (pfn_glAlphaFragmentOp1ATI)load("glAlphaFragmentOp1ATI"); + fp_glAlphaFragmentOp2ATI = (pfn_glAlphaFragmentOp2ATI)load("glAlphaFragmentOp2ATI"); + fp_glAlphaFragmentOp3ATI = (pfn_glAlphaFragmentOp3ATI)load("glAlphaFragmentOp3ATI"); + fp_glSetFragmentShaderConstantATI = (pfn_glSetFragmentShaderConstantATI)load("glSetFragmentShaderConstantATI"); +} + +GLboolean GLAD_ATI_map_object_buffer = GL_FALSE; +static void load_GL_ATI_map_object_buffer(LOADER load) { + if(!GLAD_ATI_map_object_buffer) return; + fp_glMapObjectBufferATI = (pfn_glMapObjectBufferATI)load("glMapObjectBufferATI"); + fp_glUnmapObjectBufferATI = (pfn_glUnmapObjectBufferATI)load("glUnmapObjectBufferATI"); +} + +GLboolean GLAD_ATI_meminfo = GL_FALSE; +GLboolean GLAD_ATI_pixel_format_float = GL_FALSE; +GLboolean GLAD_ATI_pn_triangles = GL_FALSE; +static void load_GL_ATI_pn_triangles(LOADER load) { + if(!GLAD_ATI_pn_triangles) return; + fp_glPNTrianglesiATI = (pfn_glPNTrianglesiATI)load("glPNTrianglesiATI"); + fp_glPNTrianglesfATI = (pfn_glPNTrianglesfATI)load("glPNTrianglesfATI"); +} + +GLboolean GLAD_ATI_separate_stencil = GL_FALSE; +static void load_GL_ATI_separate_stencil(LOADER load) { + if(!GLAD_ATI_separate_stencil) return; + fp_glStencilOpSeparateATI = (pfn_glStencilOpSeparateATI)load("glStencilOpSeparateATI"); + fp_glStencilFuncSeparateATI = (pfn_glStencilFuncSeparateATI)load("glStencilFuncSeparateATI"); +} + +GLboolean GLAD_ATI_text_fragment_shader = GL_FALSE; +GLboolean GLAD_ATI_texture_env_combine3 = GL_FALSE; +GLboolean GLAD_ATI_texture_float = GL_FALSE; +GLboolean GLAD_ATI_texture_mirror_once = GL_FALSE; +GLboolean GLAD_ATI_vertex_array_object = GL_FALSE; +static void load_GL_ATI_vertex_array_object(LOADER load) { + if(!GLAD_ATI_vertex_array_object) return; + fp_glNewObjectBufferATI = (pfn_glNewObjectBufferATI)load("glNewObjectBufferATI"); + fp_glIsObjectBufferATI = (pfn_glIsObjectBufferATI)load("glIsObjectBufferATI"); + fp_glUpdateObjectBufferATI = (pfn_glUpdateObjectBufferATI)load("glUpdateObjectBufferATI"); + fp_glGetObjectBufferfvATI = (pfn_glGetObjectBufferfvATI)load("glGetObjectBufferfvATI"); + fp_glGetObjectBufferivATI = (pfn_glGetObjectBufferivATI)load("glGetObjectBufferivATI"); + fp_glFreeObjectBufferATI = (pfn_glFreeObjectBufferATI)load("glFreeObjectBufferATI"); + fp_glArrayObjectATI = (pfn_glArrayObjectATI)load("glArrayObjectATI"); + fp_glGetArrayObjectfvATI = (pfn_glGetArrayObjectfvATI)load("glGetArrayObjectfvATI"); + fp_glGetArrayObjectivATI = (pfn_glGetArrayObjectivATI)load("glGetArrayObjectivATI"); + fp_glVariantArrayObjectATI = (pfn_glVariantArrayObjectATI)load("glVariantArrayObjectATI"); + fp_glGetVariantArrayObjectfvATI = (pfn_glGetVariantArrayObjectfvATI)load("glGetVariantArrayObjectfvATI"); + fp_glGetVariantArrayObjectivATI = (pfn_glGetVariantArrayObjectivATI)load("glGetVariantArrayObjectivATI"); +} + +GLboolean GLAD_ATI_vertex_attrib_array_object = GL_FALSE; +static void load_GL_ATI_vertex_attrib_array_object(LOADER load) { + if(!GLAD_ATI_vertex_attrib_array_object) return; + fp_glVertexAttribArrayObjectATI = (pfn_glVertexAttribArrayObjectATI)load("glVertexAttribArrayObjectATI"); + fp_glGetVertexAttribArrayObjectfvATI = (pfn_glGetVertexAttribArrayObjectfvATI)load("glGetVertexAttribArrayObjectfvATI"); + fp_glGetVertexAttribArrayObjectivATI = (pfn_glGetVertexAttribArrayObjectivATI)load("glGetVertexAttribArrayObjectivATI"); +} + +GLboolean GLAD_ATI_vertex_streams = GL_FALSE; +static void load_GL_ATI_vertex_streams(LOADER load) { + if(!GLAD_ATI_vertex_streams) return; + fp_glVertexStream1sATI = (pfn_glVertexStream1sATI)load("glVertexStream1sATI"); + fp_glVertexStream1svATI = (pfn_glVertexStream1svATI)load("glVertexStream1svATI"); + fp_glVertexStream1iATI = (pfn_glVertexStream1iATI)load("glVertexStream1iATI"); + fp_glVertexStream1ivATI = (pfn_glVertexStream1ivATI)load("glVertexStream1ivATI"); + fp_glVertexStream1fATI = (pfn_glVertexStream1fATI)load("glVertexStream1fATI"); + fp_glVertexStream1fvATI = (pfn_glVertexStream1fvATI)load("glVertexStream1fvATI"); + fp_glVertexStream1dATI = (pfn_glVertexStream1dATI)load("glVertexStream1dATI"); + fp_glVertexStream1dvATI = (pfn_glVertexStream1dvATI)load("glVertexStream1dvATI"); + fp_glVertexStream2sATI = (pfn_glVertexStream2sATI)load("glVertexStream2sATI"); + fp_glVertexStream2svATI = (pfn_glVertexStream2svATI)load("glVertexStream2svATI"); + fp_glVertexStream2iATI = (pfn_glVertexStream2iATI)load("glVertexStream2iATI"); + fp_glVertexStream2ivATI = (pfn_glVertexStream2ivATI)load("glVertexStream2ivATI"); + fp_glVertexStream2fATI = (pfn_glVertexStream2fATI)load("glVertexStream2fATI"); + fp_glVertexStream2fvATI = (pfn_glVertexStream2fvATI)load("glVertexStream2fvATI"); + fp_glVertexStream2dATI = (pfn_glVertexStream2dATI)load("glVertexStream2dATI"); + fp_glVertexStream2dvATI = (pfn_glVertexStream2dvATI)load("glVertexStream2dvATI"); + fp_glVertexStream3sATI = (pfn_glVertexStream3sATI)load("glVertexStream3sATI"); + fp_glVertexStream3svATI = (pfn_glVertexStream3svATI)load("glVertexStream3svATI"); + fp_glVertexStream3iATI = (pfn_glVertexStream3iATI)load("glVertexStream3iATI"); + fp_glVertexStream3ivATI = (pfn_glVertexStream3ivATI)load("glVertexStream3ivATI"); + fp_glVertexStream3fATI = (pfn_glVertexStream3fATI)load("glVertexStream3fATI"); + fp_glVertexStream3fvATI = (pfn_glVertexStream3fvATI)load("glVertexStream3fvATI"); + fp_glVertexStream3dATI = (pfn_glVertexStream3dATI)load("glVertexStream3dATI"); + fp_glVertexStream3dvATI = (pfn_glVertexStream3dvATI)load("glVertexStream3dvATI"); + fp_glVertexStream4sATI = (pfn_glVertexStream4sATI)load("glVertexStream4sATI"); + fp_glVertexStream4svATI = (pfn_glVertexStream4svATI)load("glVertexStream4svATI"); + fp_glVertexStream4iATI = (pfn_glVertexStream4iATI)load("glVertexStream4iATI"); + fp_glVertexStream4ivATI = (pfn_glVertexStream4ivATI)load("glVertexStream4ivATI"); + fp_glVertexStream4fATI = (pfn_glVertexStream4fATI)load("glVertexStream4fATI"); + fp_glVertexStream4fvATI = (pfn_glVertexStream4fvATI)load("glVertexStream4fvATI"); + fp_glVertexStream4dATI = (pfn_glVertexStream4dATI)load("glVertexStream4dATI"); + fp_glVertexStream4dvATI = (pfn_glVertexStream4dvATI)load("glVertexStream4dvATI"); + fp_glNormalStream3bATI = (pfn_glNormalStream3bATI)load("glNormalStream3bATI"); + fp_glNormalStream3bvATI = (pfn_glNormalStream3bvATI)load("glNormalStream3bvATI"); + fp_glNormalStream3sATI = (pfn_glNormalStream3sATI)load("glNormalStream3sATI"); + fp_glNormalStream3svATI = (pfn_glNormalStream3svATI)load("glNormalStream3svATI"); + fp_glNormalStream3iATI = (pfn_glNormalStream3iATI)load("glNormalStream3iATI"); + fp_glNormalStream3ivATI = (pfn_glNormalStream3ivATI)load("glNormalStream3ivATI"); + fp_glNormalStream3fATI = (pfn_glNormalStream3fATI)load("glNormalStream3fATI"); + fp_glNormalStream3fvATI = (pfn_glNormalStream3fvATI)load("glNormalStream3fvATI"); + fp_glNormalStream3dATI = (pfn_glNormalStream3dATI)load("glNormalStream3dATI"); + fp_glNormalStream3dvATI = (pfn_glNormalStream3dvATI)load("glNormalStream3dvATI"); + fp_glClientActiveVertexStreamATI = (pfn_glClientActiveVertexStreamATI)load("glClientActiveVertexStreamATI"); + fp_glVertexBlendEnviATI = (pfn_glVertexBlendEnviATI)load("glVertexBlendEnviATI"); + fp_glVertexBlendEnvfATI = (pfn_glVertexBlendEnvfATI)load("glVertexBlendEnvfATI"); +} + +GLboolean GLAD_DMP_shader_binary = GL_FALSE; +GLboolean GLAD_FJ_shader_binary_GCCSO = GL_FALSE; +GLboolean GLAD_GREMEDY_frame_terminator = GL_FALSE; +static void load_GL_GREMEDY_frame_terminator(LOADER load) { + if(!GLAD_GREMEDY_frame_terminator) return; + fp_glFrameTerminatorGREMEDY = (pfn_glFrameTerminatorGREMEDY)load("glFrameTerminatorGREMEDY"); +} + +GLboolean GLAD_GREMEDY_string_marker = GL_FALSE; +static void load_GL_GREMEDY_string_marker(LOADER load) { + if(!GLAD_GREMEDY_string_marker) return; + fp_glStringMarkerGREMEDY = (pfn_glStringMarkerGREMEDY)load("glStringMarkerGREMEDY"); +} + +GLboolean GLAD_IBM_rasterpos_clip = GL_FALSE; +GLboolean GLAD_IMG_multisampled_render_to_texture = GL_FALSE; +static void load_GL_IMG_multisampled_render_to_texture(LOADER load) { + if(!GLAD_IMG_multisampled_render_to_texture) return; + fp_glRenderbufferStorageMultisampleIMG = (pfn_glRenderbufferStorageMultisampleIMG)load("glRenderbufferStorageMultisampleIMG"); + fp_glFramebufferTexture2DMultisampleIMG = (pfn_glFramebufferTexture2DMultisampleIMG)load("glFramebufferTexture2DMultisampleIMG"); +} + +GLboolean GLAD_IMG_program_binary = GL_FALSE; +GLboolean GLAD_IMG_read_format = GL_FALSE; +GLboolean GLAD_IMG_shader_binary = GL_FALSE; +GLboolean GLAD_IMG_texture_compression_pvrtc = GL_FALSE; +GLboolean GLAD_IMG_texture_compression_pvrtc2 = GL_FALSE; +GLboolean GLAD_INGR_blend_func_separate = GL_FALSE; +static void load_GL_INGR_blend_func_separate(LOADER load) { + if(!GLAD_INGR_blend_func_separate) return; + fp_glBlendFuncSeparateINGR = (pfn_glBlendFuncSeparateINGR)load("glBlendFuncSeparateINGR"); +} + +GLboolean GLAD_INTEL_fragment_shader_ordering = GL_FALSE; +GLboolean GLAD_INTEL_map_texture = GL_FALSE; +static void load_GL_INTEL_map_texture(LOADER load) { + if(!GLAD_INTEL_map_texture) return; + fp_glSyncTextureINTEL = (pfn_glSyncTextureINTEL)load("glSyncTextureINTEL"); + fp_glUnmapTexture2DINTEL = (pfn_glUnmapTexture2DINTEL)load("glUnmapTexture2DINTEL"); + fp_glMapTexture2DINTEL = (pfn_glMapTexture2DINTEL)load("glMapTexture2DINTEL"); +} + +GLboolean GLAD_INTEL_parallel_arrays = GL_FALSE; +static void load_GL_INTEL_parallel_arrays(LOADER load) { + if(!GLAD_INTEL_parallel_arrays) return; + fp_glVertexPointervINTEL = (pfn_glVertexPointervINTEL)load("glVertexPointervINTEL"); + fp_glNormalPointervINTEL = (pfn_glNormalPointervINTEL)load("glNormalPointervINTEL"); + fp_glColorPointervINTEL = (pfn_glColorPointervINTEL)load("glColorPointervINTEL"); + fp_glTexCoordPointervINTEL = (pfn_glTexCoordPointervINTEL)load("glTexCoordPointervINTEL"); +} + +GLboolean GLAD_MESA_pack_invert = GL_FALSE; +GLboolean GLAD_MESA_resize_buffers = GL_FALSE; +static void load_GL_MESA_resize_buffers(LOADER load) { + if(!GLAD_MESA_resize_buffers) return; + fp_glResizeBuffersMESA = (pfn_glResizeBuffersMESA)load("glResizeBuffersMESA"); +} + +GLboolean GLAD_MESA_window_pos = GL_FALSE; +static void load_GL_MESA_window_pos(LOADER load) { + if(!GLAD_MESA_window_pos) return; + fp_glWindowPos2dMESA = (pfn_glWindowPos2dMESA)load("glWindowPos2dMESA"); + fp_glWindowPos2dvMESA = (pfn_glWindowPos2dvMESA)load("glWindowPos2dvMESA"); + fp_glWindowPos2fMESA = (pfn_glWindowPos2fMESA)load("glWindowPos2fMESA"); + fp_glWindowPos2fvMESA = (pfn_glWindowPos2fvMESA)load("glWindowPos2fvMESA"); + fp_glWindowPos2iMESA = (pfn_glWindowPos2iMESA)load("glWindowPos2iMESA"); + fp_glWindowPos2ivMESA = (pfn_glWindowPos2ivMESA)load("glWindowPos2ivMESA"); + fp_glWindowPos2sMESA = (pfn_glWindowPos2sMESA)load("glWindowPos2sMESA"); + fp_glWindowPos2svMESA = (pfn_glWindowPos2svMESA)load("glWindowPos2svMESA"); + fp_glWindowPos3dMESA = (pfn_glWindowPos3dMESA)load("glWindowPos3dMESA"); + fp_glWindowPos3dvMESA = (pfn_glWindowPos3dvMESA)load("glWindowPos3dvMESA"); + fp_glWindowPos3fMESA = (pfn_glWindowPos3fMESA)load("glWindowPos3fMESA"); + fp_glWindowPos3fvMESA = (pfn_glWindowPos3fvMESA)load("glWindowPos3fvMESA"); + fp_glWindowPos3iMESA = (pfn_glWindowPos3iMESA)load("glWindowPos3iMESA"); + fp_glWindowPos3ivMESA = (pfn_glWindowPos3ivMESA)load("glWindowPos3ivMESA"); + fp_glWindowPos3sMESA = (pfn_glWindowPos3sMESA)load("glWindowPos3sMESA"); + fp_glWindowPos3svMESA = (pfn_glWindowPos3svMESA)load("glWindowPos3svMESA"); + fp_glWindowPos4dMESA = (pfn_glWindowPos4dMESA)load("glWindowPos4dMESA"); + fp_glWindowPos4dvMESA = (pfn_glWindowPos4dvMESA)load("glWindowPos4dvMESA"); + fp_glWindowPos4fMESA = (pfn_glWindowPos4fMESA)load("glWindowPos4fMESA"); + fp_glWindowPos4fvMESA = (pfn_glWindowPos4fvMESA)load("glWindowPos4fvMESA"); + fp_glWindowPos4iMESA = (pfn_glWindowPos4iMESA)load("glWindowPos4iMESA"); + fp_glWindowPos4ivMESA = (pfn_glWindowPos4ivMESA)load("glWindowPos4ivMESA"); + fp_glWindowPos4sMESA = (pfn_glWindowPos4sMESA)load("glWindowPos4sMESA"); + fp_glWindowPos4svMESA = (pfn_glWindowPos4svMESA)load("glWindowPos4svMESA"); +} + +GLboolean GLAD_MESA_ycbcr_texture = GL_FALSE; +GLboolean GLAD_MESAX_texture_stack = GL_FALSE; +GLboolean GLAD_NV_bindless_multi_draw_indirect = GL_FALSE; +static void load_GL_NV_bindless_multi_draw_indirect(LOADER load) { + if(!GLAD_NV_bindless_multi_draw_indirect) return; + fp_glMultiDrawArraysIndirectBindlessNV = (pfn_glMultiDrawArraysIndirectBindlessNV)load("glMultiDrawArraysIndirectBindlessNV"); + fp_glMultiDrawElementsIndirectBindlessNV = (pfn_glMultiDrawElementsIndirectBindlessNV)load("glMultiDrawElementsIndirectBindlessNV"); +} + +GLboolean GLAD_NV_bindless_texture = GL_FALSE; +static void load_GL_NV_bindless_texture(LOADER load) { + if(!GLAD_NV_bindless_texture) return; + fp_glGetTextureHandleNV = (pfn_glGetTextureHandleNV)load("glGetTextureHandleNV"); + fp_glGetTextureSamplerHandleNV = (pfn_glGetTextureSamplerHandleNV)load("glGetTextureSamplerHandleNV"); + fp_glMakeTextureHandleResidentNV = (pfn_glMakeTextureHandleResidentNV)load("glMakeTextureHandleResidentNV"); + fp_glMakeTextureHandleNonResidentNV = (pfn_glMakeTextureHandleNonResidentNV)load("glMakeTextureHandleNonResidentNV"); + fp_glGetImageHandleNV = (pfn_glGetImageHandleNV)load("glGetImageHandleNV"); + fp_glMakeImageHandleResidentNV = (pfn_glMakeImageHandleResidentNV)load("glMakeImageHandleResidentNV"); + fp_glMakeImageHandleNonResidentNV = (pfn_glMakeImageHandleNonResidentNV)load("glMakeImageHandleNonResidentNV"); + fp_glUniformHandleui64NV = (pfn_glUniformHandleui64NV)load("glUniformHandleui64NV"); + fp_glUniformHandleui64vNV = (pfn_glUniformHandleui64vNV)load("glUniformHandleui64vNV"); + fp_glProgramUniformHandleui64NV = (pfn_glProgramUniformHandleui64NV)load("glProgramUniformHandleui64NV"); + fp_glProgramUniformHandleui64vNV = (pfn_glProgramUniformHandleui64vNV)load("glProgramUniformHandleui64vNV"); + fp_glIsTextureHandleResidentNV = (pfn_glIsTextureHandleResidentNV)load("glIsTextureHandleResidentNV"); + fp_glIsImageHandleResidentNV = (pfn_glIsImageHandleResidentNV)load("glIsImageHandleResidentNV"); +} + +GLboolean GLAD_NV_blend_equation_advanced = GL_FALSE; +static void load_GL_NV_blend_equation_advanced(LOADER load) { + if(!GLAD_NV_blend_equation_advanced) return; + fp_glBlendParameteriNV = (pfn_glBlendParameteriNV)load("glBlendParameteriNV"); + fp_glBlendBarrierNV = (pfn_glBlendBarrierNV)load("glBlendBarrierNV"); +} + +GLboolean GLAD_NV_blend_equation_advanced_coherent = GL_FALSE; +GLboolean GLAD_NV_blend_square = GL_FALSE; +GLboolean GLAD_NV_compute_program5 = GL_FALSE; +GLboolean GLAD_NV_conditional_render = GL_FALSE; +static void load_GL_NV_conditional_render(LOADER load) { + if(!GLAD_NV_conditional_render) return; + fp_glBeginConditionalRenderNV = (pfn_glBeginConditionalRenderNV)load("glBeginConditionalRenderNV"); + fp_glEndConditionalRenderNV = (pfn_glEndConditionalRenderNV)load("glEndConditionalRenderNV"); +} + +GLboolean GLAD_NV_copy_buffer = GL_FALSE; +static void load_GL_NV_copy_buffer(LOADER load) { + if(!GLAD_NV_copy_buffer) return; + fp_glCopyBufferSubDataNV = (pfn_glCopyBufferSubDataNV)load("glCopyBufferSubDataNV"); +} + +GLboolean GLAD_NV_copy_depth_to_color = GL_FALSE; +GLboolean GLAD_NV_copy_image = GL_FALSE; +static void load_GL_NV_copy_image(LOADER load) { + if(!GLAD_NV_copy_image) return; + fp_glCopyImageSubDataNV = (pfn_glCopyImageSubDataNV)load("glCopyImageSubDataNV"); +} + +GLboolean GLAD_NV_coverage_sample = GL_FALSE; +static void load_GL_NV_coverage_sample(LOADER load) { + if(!GLAD_NV_coverage_sample) return; + fp_glCoverageMaskNV = (pfn_glCoverageMaskNV)load("glCoverageMaskNV"); + fp_glCoverageOperationNV = (pfn_glCoverageOperationNV)load("glCoverageOperationNV"); +} + +GLboolean GLAD_NV_deep_texture3D = GL_FALSE; +GLboolean GLAD_NV_depth_buffer_float = GL_FALSE; +static void load_GL_NV_depth_buffer_float(LOADER load) { + if(!GLAD_NV_depth_buffer_float) return; + fp_glDepthRangedNV = (pfn_glDepthRangedNV)load("glDepthRangedNV"); + fp_glClearDepthdNV = (pfn_glClearDepthdNV)load("glClearDepthdNV"); + fp_glDepthBoundsdNV = (pfn_glDepthBoundsdNV)load("glDepthBoundsdNV"); +} + +GLboolean GLAD_NV_depth_clamp = GL_FALSE; +GLboolean GLAD_NV_depth_nonlinear = GL_FALSE; +GLboolean GLAD_NV_draw_buffers = GL_FALSE; +static void load_GL_NV_draw_buffers(LOADER load) { + if(!GLAD_NV_draw_buffers) return; + fp_glDrawBuffersNV = (pfn_glDrawBuffersNV)load("glDrawBuffersNV"); +} + +GLboolean GLAD_NV_draw_instanced = GL_FALSE; +static void load_GL_NV_draw_instanced(LOADER load) { + if(!GLAD_NV_draw_instanced) return; + fp_glDrawArraysInstancedNV = (pfn_glDrawArraysInstancedNV)load("glDrawArraysInstancedNV"); + fp_glDrawElementsInstancedNV = (pfn_glDrawElementsInstancedNV)load("glDrawElementsInstancedNV"); +} + +GLboolean GLAD_NV_draw_texture = GL_FALSE; +static void load_GL_NV_draw_texture(LOADER load) { + if(!GLAD_NV_draw_texture) return; + fp_glDrawTextureNV = (pfn_glDrawTextureNV)load("glDrawTextureNV"); +} + +GLboolean GLAD_NV_evaluators = GL_FALSE; +static void load_GL_NV_evaluators(LOADER load) { + if(!GLAD_NV_evaluators) return; + fp_glMapControlPointsNV = (pfn_glMapControlPointsNV)load("glMapControlPointsNV"); + fp_glMapParameterivNV = (pfn_glMapParameterivNV)load("glMapParameterivNV"); + fp_glMapParameterfvNV = (pfn_glMapParameterfvNV)load("glMapParameterfvNV"); + fp_glGetMapControlPointsNV = (pfn_glGetMapControlPointsNV)load("glGetMapControlPointsNV"); + fp_glGetMapParameterivNV = (pfn_glGetMapParameterivNV)load("glGetMapParameterivNV"); + fp_glGetMapParameterfvNV = (pfn_glGetMapParameterfvNV)load("glGetMapParameterfvNV"); + fp_glGetMapAttribParameterivNV = (pfn_glGetMapAttribParameterivNV)load("glGetMapAttribParameterivNV"); + fp_glGetMapAttribParameterfvNV = (pfn_glGetMapAttribParameterfvNV)load("glGetMapAttribParameterfvNV"); + fp_glEvalMapsNV = (pfn_glEvalMapsNV)load("glEvalMapsNV"); +} + +GLboolean GLAD_NV_explicit_attrib_location = GL_FALSE; +GLboolean GLAD_NV_explicit_multisample = GL_FALSE; +static void load_GL_NV_explicit_multisample(LOADER load) { + if(!GLAD_NV_explicit_multisample) return; + fp_glGetMultisamplefvNV = (pfn_glGetMultisamplefvNV)load("glGetMultisamplefvNV"); + fp_glSampleMaskIndexedNV = (pfn_glSampleMaskIndexedNV)load("glSampleMaskIndexedNV"); + fp_glTexRenderbufferNV = (pfn_glTexRenderbufferNV)load("glTexRenderbufferNV"); +} + +GLboolean GLAD_NV_fbo_color_attachments = GL_FALSE; +GLboolean GLAD_NV_fence = GL_FALSE; +static void load_GL_NV_fence(LOADER load) { + if(!GLAD_NV_fence) return; + fp_glDeleteFencesNV = (pfn_glDeleteFencesNV)load("glDeleteFencesNV"); + fp_glGenFencesNV = (pfn_glGenFencesNV)load("glGenFencesNV"); + fp_glIsFenceNV = (pfn_glIsFenceNV)load("glIsFenceNV"); + fp_glTestFenceNV = (pfn_glTestFenceNV)load("glTestFenceNV"); + fp_glGetFenceivNV = (pfn_glGetFenceivNV)load("glGetFenceivNV"); + fp_glFinishFenceNV = (pfn_glFinishFenceNV)load("glFinishFenceNV"); + fp_glSetFenceNV = (pfn_glSetFenceNV)load("glSetFenceNV"); +} + +GLboolean GLAD_NV_float_buffer = GL_FALSE; +GLboolean GLAD_NV_fog_distance = GL_FALSE; +GLboolean GLAD_NV_fragment_program = GL_FALSE; +static void load_GL_NV_fragment_program(LOADER load) { + if(!GLAD_NV_fragment_program) return; + fp_glProgramNamedParameter4fNV = (pfn_glProgramNamedParameter4fNV)load("glProgramNamedParameter4fNV"); + fp_glProgramNamedParameter4fvNV = (pfn_glProgramNamedParameter4fvNV)load("glProgramNamedParameter4fvNV"); + fp_glProgramNamedParameter4dNV = (pfn_glProgramNamedParameter4dNV)load("glProgramNamedParameter4dNV"); + fp_glProgramNamedParameter4dvNV = (pfn_glProgramNamedParameter4dvNV)load("glProgramNamedParameter4dvNV"); + fp_glGetProgramNamedParameterfvNV = (pfn_glGetProgramNamedParameterfvNV)load("glGetProgramNamedParameterfvNV"); + fp_glGetProgramNamedParameterdvNV = (pfn_glGetProgramNamedParameterdvNV)load("glGetProgramNamedParameterdvNV"); +} + +GLboolean GLAD_NV_fragment_program2 = GL_FALSE; +GLboolean GLAD_NV_fragment_program4 = GL_FALSE; +GLboolean GLAD_NV_fragment_program_option = GL_FALSE; +GLboolean GLAD_NV_framebuffer_blit = GL_FALSE; +static void load_GL_NV_framebuffer_blit(LOADER load) { + if(!GLAD_NV_framebuffer_blit) return; + fp_glBlitFramebufferNV = (pfn_glBlitFramebufferNV)load("glBlitFramebufferNV"); +} + +GLboolean GLAD_NV_framebuffer_multisample = GL_FALSE; +static void load_GL_NV_framebuffer_multisample(LOADER load) { + if(!GLAD_NV_framebuffer_multisample) return; + fp_glRenderbufferStorageMultisampleNV = (pfn_glRenderbufferStorageMultisampleNV)load("glRenderbufferStorageMultisampleNV"); +} + +GLboolean GLAD_NV_framebuffer_multisample_coverage = GL_FALSE; +static void load_GL_NV_framebuffer_multisample_coverage(LOADER load) { + if(!GLAD_NV_framebuffer_multisample_coverage) return; + fp_glRenderbufferStorageMultisampleCoverageNV = (pfn_glRenderbufferStorageMultisampleCoverageNV)load("glRenderbufferStorageMultisampleCoverageNV"); +} + +GLboolean GLAD_NV_generate_mipmap_sRGB = GL_FALSE; +GLboolean GLAD_NV_geometry_program4 = GL_FALSE; +static void load_GL_NV_geometry_program4(LOADER load) { + if(!GLAD_NV_geometry_program4) return; + fp_glProgramVertexLimitNV = (pfn_glProgramVertexLimitNV)load("glProgramVertexLimitNV"); + fp_glFramebufferTextureEXT = (pfn_glFramebufferTextureEXT)load("glFramebufferTextureEXT"); + fp_glFramebufferTextureLayerEXT = (pfn_glFramebufferTextureLayerEXT)load("glFramebufferTextureLayerEXT"); + fp_glFramebufferTextureFaceEXT = (pfn_glFramebufferTextureFaceEXT)load("glFramebufferTextureFaceEXT"); +} + +GLboolean GLAD_NV_geometry_shader4 = GL_FALSE; +GLboolean GLAD_NV_gpu_program4 = GL_FALSE; +static void load_GL_NV_gpu_program4(LOADER load) { + if(!GLAD_NV_gpu_program4) return; + fp_glProgramLocalParameterI4iNV = (pfn_glProgramLocalParameterI4iNV)load("glProgramLocalParameterI4iNV"); + fp_glProgramLocalParameterI4ivNV = (pfn_glProgramLocalParameterI4ivNV)load("glProgramLocalParameterI4ivNV"); + fp_glProgramLocalParametersI4ivNV = (pfn_glProgramLocalParametersI4ivNV)load("glProgramLocalParametersI4ivNV"); + fp_glProgramLocalParameterI4uiNV = (pfn_glProgramLocalParameterI4uiNV)load("glProgramLocalParameterI4uiNV"); + fp_glProgramLocalParameterI4uivNV = (pfn_glProgramLocalParameterI4uivNV)load("glProgramLocalParameterI4uivNV"); + fp_glProgramLocalParametersI4uivNV = (pfn_glProgramLocalParametersI4uivNV)load("glProgramLocalParametersI4uivNV"); + fp_glProgramEnvParameterI4iNV = (pfn_glProgramEnvParameterI4iNV)load("glProgramEnvParameterI4iNV"); + fp_glProgramEnvParameterI4ivNV = (pfn_glProgramEnvParameterI4ivNV)load("glProgramEnvParameterI4ivNV"); + fp_glProgramEnvParametersI4ivNV = (pfn_glProgramEnvParametersI4ivNV)load("glProgramEnvParametersI4ivNV"); + fp_glProgramEnvParameterI4uiNV = (pfn_glProgramEnvParameterI4uiNV)load("glProgramEnvParameterI4uiNV"); + fp_glProgramEnvParameterI4uivNV = (pfn_glProgramEnvParameterI4uivNV)load("glProgramEnvParameterI4uivNV"); + fp_glProgramEnvParametersI4uivNV = (pfn_glProgramEnvParametersI4uivNV)load("glProgramEnvParametersI4uivNV"); + fp_glGetProgramLocalParameterIivNV = (pfn_glGetProgramLocalParameterIivNV)load("glGetProgramLocalParameterIivNV"); + fp_glGetProgramLocalParameterIuivNV = (pfn_glGetProgramLocalParameterIuivNV)load("glGetProgramLocalParameterIuivNV"); + fp_glGetProgramEnvParameterIivNV = (pfn_glGetProgramEnvParameterIivNV)load("glGetProgramEnvParameterIivNV"); + fp_glGetProgramEnvParameterIuivNV = (pfn_glGetProgramEnvParameterIuivNV)load("glGetProgramEnvParameterIuivNV"); +} + +GLboolean GLAD_NV_gpu_program5 = GL_FALSE; +static void load_GL_NV_gpu_program5(LOADER load) { + if(!GLAD_NV_gpu_program5) return; + fp_glProgramSubroutineParametersuivNV = (pfn_glProgramSubroutineParametersuivNV)load("glProgramSubroutineParametersuivNV"); + fp_glGetProgramSubroutineParameteruivNV = (pfn_glGetProgramSubroutineParameteruivNV)load("glGetProgramSubroutineParameteruivNV"); +} + +GLboolean GLAD_NV_gpu_program5_mem_extended = GL_FALSE; +GLboolean GLAD_NV_gpu_shader5 = GL_FALSE; +static void load_GL_NV_gpu_shader5(LOADER load) { + if(!GLAD_NV_gpu_shader5) return; + fp_glUniform1i64NV = (pfn_glUniform1i64NV)load("glUniform1i64NV"); + fp_glUniform2i64NV = (pfn_glUniform2i64NV)load("glUniform2i64NV"); + fp_glUniform3i64NV = (pfn_glUniform3i64NV)load("glUniform3i64NV"); + fp_glUniform4i64NV = (pfn_glUniform4i64NV)load("glUniform4i64NV"); + fp_glUniform1i64vNV = (pfn_glUniform1i64vNV)load("glUniform1i64vNV"); + fp_glUniform2i64vNV = (pfn_glUniform2i64vNV)load("glUniform2i64vNV"); + fp_glUniform3i64vNV = (pfn_glUniform3i64vNV)load("glUniform3i64vNV"); + fp_glUniform4i64vNV = (pfn_glUniform4i64vNV)load("glUniform4i64vNV"); + fp_glUniform1ui64NV = (pfn_glUniform1ui64NV)load("glUniform1ui64NV"); + fp_glUniform2ui64NV = (pfn_glUniform2ui64NV)load("glUniform2ui64NV"); + fp_glUniform3ui64NV = (pfn_glUniform3ui64NV)load("glUniform3ui64NV"); + fp_glUniform4ui64NV = (pfn_glUniform4ui64NV)load("glUniform4ui64NV"); + fp_glUniform1ui64vNV = (pfn_glUniform1ui64vNV)load("glUniform1ui64vNV"); + fp_glUniform2ui64vNV = (pfn_glUniform2ui64vNV)load("glUniform2ui64vNV"); + fp_glUniform3ui64vNV = (pfn_glUniform3ui64vNV)load("glUniform3ui64vNV"); + fp_glUniform4ui64vNV = (pfn_glUniform4ui64vNV)load("glUniform4ui64vNV"); + fp_glGetUniformi64vNV = (pfn_glGetUniformi64vNV)load("glGetUniformi64vNV"); + fp_glProgramUniform1i64NV = (pfn_glProgramUniform1i64NV)load("glProgramUniform1i64NV"); + fp_glProgramUniform2i64NV = (pfn_glProgramUniform2i64NV)load("glProgramUniform2i64NV"); + fp_glProgramUniform3i64NV = (pfn_glProgramUniform3i64NV)load("glProgramUniform3i64NV"); + fp_glProgramUniform4i64NV = (pfn_glProgramUniform4i64NV)load("glProgramUniform4i64NV"); + fp_glProgramUniform1i64vNV = (pfn_glProgramUniform1i64vNV)load("glProgramUniform1i64vNV"); + fp_glProgramUniform2i64vNV = (pfn_glProgramUniform2i64vNV)load("glProgramUniform2i64vNV"); + fp_glProgramUniform3i64vNV = (pfn_glProgramUniform3i64vNV)load("glProgramUniform3i64vNV"); + fp_glProgramUniform4i64vNV = (pfn_glProgramUniform4i64vNV)load("glProgramUniform4i64vNV"); + fp_glProgramUniform1ui64NV = (pfn_glProgramUniform1ui64NV)load("glProgramUniform1ui64NV"); + fp_glProgramUniform2ui64NV = (pfn_glProgramUniform2ui64NV)load("glProgramUniform2ui64NV"); + fp_glProgramUniform3ui64NV = (pfn_glProgramUniform3ui64NV)load("glProgramUniform3ui64NV"); + fp_glProgramUniform4ui64NV = (pfn_glProgramUniform4ui64NV)load("glProgramUniform4ui64NV"); + fp_glProgramUniform1ui64vNV = (pfn_glProgramUniform1ui64vNV)load("glProgramUniform1ui64vNV"); + fp_glProgramUniform2ui64vNV = (pfn_glProgramUniform2ui64vNV)load("glProgramUniform2ui64vNV"); + fp_glProgramUniform3ui64vNV = (pfn_glProgramUniform3ui64vNV)load("glProgramUniform3ui64vNV"); + fp_glProgramUniform4ui64vNV = (pfn_glProgramUniform4ui64vNV)load("glProgramUniform4ui64vNV"); +} + +GLboolean GLAD_NV_half_float = GL_FALSE; +static void load_GL_NV_half_float(LOADER load) { + if(!GLAD_NV_half_float) return; + fp_glVertex2hNV = (pfn_glVertex2hNV)load("glVertex2hNV"); + fp_glVertex2hvNV = (pfn_glVertex2hvNV)load("glVertex2hvNV"); + fp_glVertex3hNV = (pfn_glVertex3hNV)load("glVertex3hNV"); + fp_glVertex3hvNV = (pfn_glVertex3hvNV)load("glVertex3hvNV"); + fp_glVertex4hNV = (pfn_glVertex4hNV)load("glVertex4hNV"); + fp_glVertex4hvNV = (pfn_glVertex4hvNV)load("glVertex4hvNV"); + fp_glNormal3hNV = (pfn_glNormal3hNV)load("glNormal3hNV"); + fp_glNormal3hvNV = (pfn_glNormal3hvNV)load("glNormal3hvNV"); + fp_glColor3hNV = (pfn_glColor3hNV)load("glColor3hNV"); + fp_glColor3hvNV = (pfn_glColor3hvNV)load("glColor3hvNV"); + fp_glColor4hNV = (pfn_glColor4hNV)load("glColor4hNV"); + fp_glColor4hvNV = (pfn_glColor4hvNV)load("glColor4hvNV"); + fp_glTexCoord1hNV = (pfn_glTexCoord1hNV)load("glTexCoord1hNV"); + fp_glTexCoord1hvNV = (pfn_glTexCoord1hvNV)load("glTexCoord1hvNV"); + fp_glTexCoord2hNV = (pfn_glTexCoord2hNV)load("glTexCoord2hNV"); + fp_glTexCoord2hvNV = (pfn_glTexCoord2hvNV)load("glTexCoord2hvNV"); + fp_glTexCoord3hNV = (pfn_glTexCoord3hNV)load("glTexCoord3hNV"); + fp_glTexCoord3hvNV = (pfn_glTexCoord3hvNV)load("glTexCoord3hvNV"); + fp_glTexCoord4hNV = (pfn_glTexCoord4hNV)load("glTexCoord4hNV"); + fp_glTexCoord4hvNV = (pfn_glTexCoord4hvNV)load("glTexCoord4hvNV"); + fp_glMultiTexCoord1hNV = (pfn_glMultiTexCoord1hNV)load("glMultiTexCoord1hNV"); + fp_glMultiTexCoord1hvNV = (pfn_glMultiTexCoord1hvNV)load("glMultiTexCoord1hvNV"); + fp_glMultiTexCoord2hNV = (pfn_glMultiTexCoord2hNV)load("glMultiTexCoord2hNV"); + fp_glMultiTexCoord2hvNV = (pfn_glMultiTexCoord2hvNV)load("glMultiTexCoord2hvNV"); + fp_glMultiTexCoord3hNV = (pfn_glMultiTexCoord3hNV)load("glMultiTexCoord3hNV"); + fp_glMultiTexCoord3hvNV = (pfn_glMultiTexCoord3hvNV)load("glMultiTexCoord3hvNV"); + fp_glMultiTexCoord4hNV = (pfn_glMultiTexCoord4hNV)load("glMultiTexCoord4hNV"); + fp_glMultiTexCoord4hvNV = (pfn_glMultiTexCoord4hvNV)load("glMultiTexCoord4hvNV"); + fp_glFogCoordhNV = (pfn_glFogCoordhNV)load("glFogCoordhNV"); + fp_glFogCoordhvNV = (pfn_glFogCoordhvNV)load("glFogCoordhvNV"); + fp_glSecondaryColor3hNV = (pfn_glSecondaryColor3hNV)load("glSecondaryColor3hNV"); + fp_glSecondaryColor3hvNV = (pfn_glSecondaryColor3hvNV)load("glSecondaryColor3hvNV"); + fp_glVertexWeighthNV = (pfn_glVertexWeighthNV)load("glVertexWeighthNV"); + fp_glVertexWeighthvNV = (pfn_glVertexWeighthvNV)load("glVertexWeighthvNV"); + fp_glVertexAttrib1hNV = (pfn_glVertexAttrib1hNV)load("glVertexAttrib1hNV"); + fp_glVertexAttrib1hvNV = (pfn_glVertexAttrib1hvNV)load("glVertexAttrib1hvNV"); + fp_glVertexAttrib2hNV = (pfn_glVertexAttrib2hNV)load("glVertexAttrib2hNV"); + fp_glVertexAttrib2hvNV = (pfn_glVertexAttrib2hvNV)load("glVertexAttrib2hvNV"); + fp_glVertexAttrib3hNV = (pfn_glVertexAttrib3hNV)load("glVertexAttrib3hNV"); + fp_glVertexAttrib3hvNV = (pfn_glVertexAttrib3hvNV)load("glVertexAttrib3hvNV"); + fp_glVertexAttrib4hNV = (pfn_glVertexAttrib4hNV)load("glVertexAttrib4hNV"); + fp_glVertexAttrib4hvNV = (pfn_glVertexAttrib4hvNV)load("glVertexAttrib4hvNV"); + fp_glVertexAttribs1hvNV = (pfn_glVertexAttribs1hvNV)load("glVertexAttribs1hvNV"); + fp_glVertexAttribs2hvNV = (pfn_glVertexAttribs2hvNV)load("glVertexAttribs2hvNV"); + fp_glVertexAttribs3hvNV = (pfn_glVertexAttribs3hvNV)load("glVertexAttribs3hvNV"); + fp_glVertexAttribs4hvNV = (pfn_glVertexAttribs4hvNV)load("glVertexAttribs4hvNV"); +} + +GLboolean GLAD_NV_instanced_arrays = GL_FALSE; +static void load_GL_NV_instanced_arrays(LOADER load) { + if(!GLAD_NV_instanced_arrays) return; + fp_glVertexAttribDivisorNV = (pfn_glVertexAttribDivisorNV)load("glVertexAttribDivisorNV"); +} + +GLboolean GLAD_NV_light_max_exponent = GL_FALSE; +GLboolean GLAD_NV_multisample_coverage = GL_FALSE; +GLboolean GLAD_NV_multisample_filter_hint = GL_FALSE; +GLboolean GLAD_NV_non_square_matrices = GL_FALSE; +static void load_GL_NV_non_square_matrices(LOADER load) { + if(!GLAD_NV_non_square_matrices) return; + fp_glUniformMatrix2x3fvNV = (pfn_glUniformMatrix2x3fvNV)load("glUniformMatrix2x3fvNV"); + fp_glUniformMatrix3x2fvNV = (pfn_glUniformMatrix3x2fvNV)load("glUniformMatrix3x2fvNV"); + fp_glUniformMatrix2x4fvNV = (pfn_glUniformMatrix2x4fvNV)load("glUniformMatrix2x4fvNV"); + fp_glUniformMatrix4x2fvNV = (pfn_glUniformMatrix4x2fvNV)load("glUniformMatrix4x2fvNV"); + fp_glUniformMatrix3x4fvNV = (pfn_glUniformMatrix3x4fvNV)load("glUniformMatrix3x4fvNV"); + fp_glUniformMatrix4x3fvNV = (pfn_glUniformMatrix4x3fvNV)load("glUniformMatrix4x3fvNV"); +} + +GLboolean GLAD_NV_occlusion_query = GL_FALSE; +static void load_GL_NV_occlusion_query(LOADER load) { + if(!GLAD_NV_occlusion_query) return; + fp_glGenOcclusionQueriesNV = (pfn_glGenOcclusionQueriesNV)load("glGenOcclusionQueriesNV"); + fp_glDeleteOcclusionQueriesNV = (pfn_glDeleteOcclusionQueriesNV)load("glDeleteOcclusionQueriesNV"); + fp_glIsOcclusionQueryNV = (pfn_glIsOcclusionQueryNV)load("glIsOcclusionQueryNV"); + fp_glBeginOcclusionQueryNV = (pfn_glBeginOcclusionQueryNV)load("glBeginOcclusionQueryNV"); + fp_glEndOcclusionQueryNV = (pfn_glEndOcclusionQueryNV)load("glEndOcclusionQueryNV"); + fp_glGetOcclusionQueryivNV = (pfn_glGetOcclusionQueryivNV)load("glGetOcclusionQueryivNV"); + fp_glGetOcclusionQueryuivNV = (pfn_glGetOcclusionQueryuivNV)load("glGetOcclusionQueryuivNV"); +} + +GLboolean GLAD_NV_packed_depth_stencil = GL_FALSE; +GLboolean GLAD_NV_parameter_buffer_object = GL_FALSE; +static void load_GL_NV_parameter_buffer_object(LOADER load) { + if(!GLAD_NV_parameter_buffer_object) return; + fp_glProgramBufferParametersfvNV = (pfn_glProgramBufferParametersfvNV)load("glProgramBufferParametersfvNV"); + fp_glProgramBufferParametersIivNV = (pfn_glProgramBufferParametersIivNV)load("glProgramBufferParametersIivNV"); + fp_glProgramBufferParametersIuivNV = (pfn_glProgramBufferParametersIuivNV)load("glProgramBufferParametersIuivNV"); +} + +GLboolean GLAD_NV_parameter_buffer_object2 = GL_FALSE; +GLboolean GLAD_NV_path_rendering = GL_FALSE; +static void load_GL_NV_path_rendering(LOADER load) { + if(!GLAD_NV_path_rendering) return; + fp_glGenPathsNV = (pfn_glGenPathsNV)load("glGenPathsNV"); + fp_glDeletePathsNV = (pfn_glDeletePathsNV)load("glDeletePathsNV"); + fp_glIsPathNV = (pfn_glIsPathNV)load("glIsPathNV"); + fp_glPathCommandsNV = (pfn_glPathCommandsNV)load("glPathCommandsNV"); + fp_glPathCoordsNV = (pfn_glPathCoordsNV)load("glPathCoordsNV"); + fp_glPathSubCommandsNV = (pfn_glPathSubCommandsNV)load("glPathSubCommandsNV"); + fp_glPathSubCoordsNV = (pfn_glPathSubCoordsNV)load("glPathSubCoordsNV"); + fp_glPathStringNV = (pfn_glPathStringNV)load("glPathStringNV"); + fp_glPathGlyphsNV = (pfn_glPathGlyphsNV)load("glPathGlyphsNV"); + fp_glPathGlyphRangeNV = (pfn_glPathGlyphRangeNV)load("glPathGlyphRangeNV"); + fp_glWeightPathsNV = (pfn_glWeightPathsNV)load("glWeightPathsNV"); + fp_glCopyPathNV = (pfn_glCopyPathNV)load("glCopyPathNV"); + fp_glInterpolatePathsNV = (pfn_glInterpolatePathsNV)load("glInterpolatePathsNV"); + fp_glTransformPathNV = (pfn_glTransformPathNV)load("glTransformPathNV"); + fp_glPathParameterivNV = (pfn_glPathParameterivNV)load("glPathParameterivNV"); + fp_glPathParameteriNV = (pfn_glPathParameteriNV)load("glPathParameteriNV"); + fp_glPathParameterfvNV = (pfn_glPathParameterfvNV)load("glPathParameterfvNV"); + fp_glPathParameterfNV = (pfn_glPathParameterfNV)load("glPathParameterfNV"); + fp_glPathDashArrayNV = (pfn_glPathDashArrayNV)load("glPathDashArrayNV"); + fp_glPathStencilFuncNV = (pfn_glPathStencilFuncNV)load("glPathStencilFuncNV"); + fp_glPathStencilDepthOffsetNV = (pfn_glPathStencilDepthOffsetNV)load("glPathStencilDepthOffsetNV"); + fp_glStencilFillPathNV = (pfn_glStencilFillPathNV)load("glStencilFillPathNV"); + fp_glStencilStrokePathNV = (pfn_glStencilStrokePathNV)load("glStencilStrokePathNV"); + fp_glStencilFillPathInstancedNV = (pfn_glStencilFillPathInstancedNV)load("glStencilFillPathInstancedNV"); + fp_glStencilStrokePathInstancedNV = (pfn_glStencilStrokePathInstancedNV)load("glStencilStrokePathInstancedNV"); + fp_glPathCoverDepthFuncNV = (pfn_glPathCoverDepthFuncNV)load("glPathCoverDepthFuncNV"); + fp_glPathColorGenNV = (pfn_glPathColorGenNV)load("glPathColorGenNV"); + fp_glPathTexGenNV = (pfn_glPathTexGenNV)load("glPathTexGenNV"); + fp_glPathFogGenNV = (pfn_glPathFogGenNV)load("glPathFogGenNV"); + fp_glCoverFillPathNV = (pfn_glCoverFillPathNV)load("glCoverFillPathNV"); + fp_glCoverStrokePathNV = (pfn_glCoverStrokePathNV)load("glCoverStrokePathNV"); + fp_glCoverFillPathInstancedNV = (pfn_glCoverFillPathInstancedNV)load("glCoverFillPathInstancedNV"); + fp_glCoverStrokePathInstancedNV = (pfn_glCoverStrokePathInstancedNV)load("glCoverStrokePathInstancedNV"); + fp_glGetPathParameterivNV = (pfn_glGetPathParameterivNV)load("glGetPathParameterivNV"); + fp_glGetPathParameterfvNV = (pfn_glGetPathParameterfvNV)load("glGetPathParameterfvNV"); + fp_glGetPathCommandsNV = (pfn_glGetPathCommandsNV)load("glGetPathCommandsNV"); + fp_glGetPathCoordsNV = (pfn_glGetPathCoordsNV)load("glGetPathCoordsNV"); + fp_glGetPathDashArrayNV = (pfn_glGetPathDashArrayNV)load("glGetPathDashArrayNV"); + fp_glGetPathMetricsNV = (pfn_glGetPathMetricsNV)load("glGetPathMetricsNV"); + fp_glGetPathMetricRangeNV = (pfn_glGetPathMetricRangeNV)load("glGetPathMetricRangeNV"); + fp_glGetPathSpacingNV = (pfn_glGetPathSpacingNV)load("glGetPathSpacingNV"); + fp_glGetPathColorGenivNV = (pfn_glGetPathColorGenivNV)load("glGetPathColorGenivNV"); + fp_glGetPathColorGenfvNV = (pfn_glGetPathColorGenfvNV)load("glGetPathColorGenfvNV"); + fp_glGetPathTexGenivNV = (pfn_glGetPathTexGenivNV)load("glGetPathTexGenivNV"); + fp_glGetPathTexGenfvNV = (pfn_glGetPathTexGenfvNV)load("glGetPathTexGenfvNV"); + fp_glIsPointInFillPathNV = (pfn_glIsPointInFillPathNV)load("glIsPointInFillPathNV"); + fp_glIsPointInStrokePathNV = (pfn_glIsPointInStrokePathNV)load("glIsPointInStrokePathNV"); + fp_glGetPathLengthNV = (pfn_glGetPathLengthNV)load("glGetPathLengthNV"); + fp_glPointAlongPathNV = (pfn_glPointAlongPathNV)load("glPointAlongPathNV"); +} + +GLboolean GLAD_NV_pixel_data_range = GL_FALSE; +static void load_GL_NV_pixel_data_range(LOADER load) { + if(!GLAD_NV_pixel_data_range) return; + fp_glPixelDataRangeNV = (pfn_glPixelDataRangeNV)load("glPixelDataRangeNV"); + fp_glFlushPixelDataRangeNV = (pfn_glFlushPixelDataRangeNV)load("glFlushPixelDataRangeNV"); +} + +GLboolean GLAD_NV_point_sprite = GL_FALSE; +static void load_GL_NV_point_sprite(LOADER load) { + if(!GLAD_NV_point_sprite) return; + fp_glPointParameteriNV = (pfn_glPointParameteriNV)load("glPointParameteriNV"); + fp_glPointParameterivNV = (pfn_glPointParameterivNV)load("glPointParameterivNV"); +} + +GLboolean GLAD_NV_present_video = GL_FALSE; +static void load_GL_NV_present_video(LOADER load) { + if(!GLAD_NV_present_video) return; + fp_glPresentFrameKeyedNV = (pfn_glPresentFrameKeyedNV)load("glPresentFrameKeyedNV"); + fp_glPresentFrameDualFillNV = (pfn_glPresentFrameDualFillNV)load("glPresentFrameDualFillNV"); + fp_glGetVideoivNV = (pfn_glGetVideoivNV)load("glGetVideoivNV"); + fp_glGetVideouivNV = (pfn_glGetVideouivNV)load("glGetVideouivNV"); + fp_glGetVideoi64vNV = (pfn_glGetVideoi64vNV)load("glGetVideoi64vNV"); + fp_glGetVideoui64vNV = (pfn_glGetVideoui64vNV)load("glGetVideoui64vNV"); +} + +GLboolean GLAD_NV_primitive_restart = GL_FALSE; +static void load_GL_NV_primitive_restart(LOADER load) { + if(!GLAD_NV_primitive_restart) return; + fp_glPrimitiveRestartNV = (pfn_glPrimitiveRestartNV)load("glPrimitiveRestartNV"); + fp_glPrimitiveRestartIndexNV = (pfn_glPrimitiveRestartIndexNV)load("glPrimitiveRestartIndexNV"); +} + +GLboolean GLAD_NV_read_buffer = GL_FALSE; +static void load_GL_NV_read_buffer(LOADER load) { + if(!GLAD_NV_read_buffer) return; + fp_glReadBufferNV = (pfn_glReadBufferNV)load("glReadBufferNV"); +} + +GLboolean GLAD_NV_read_buffer_front = GL_FALSE; +GLboolean GLAD_NV_read_depth = GL_FALSE; +GLboolean GLAD_NV_read_depth_stencil = GL_FALSE; +GLboolean GLAD_NV_read_stencil = GL_FALSE; +GLboolean GLAD_NV_register_combiners = GL_FALSE; +static void load_GL_NV_register_combiners(LOADER load) { + if(!GLAD_NV_register_combiners) return; + fp_glCombinerParameterfvNV = (pfn_glCombinerParameterfvNV)load("glCombinerParameterfvNV"); + fp_glCombinerParameterfNV = (pfn_glCombinerParameterfNV)load("glCombinerParameterfNV"); + fp_glCombinerParameterivNV = (pfn_glCombinerParameterivNV)load("glCombinerParameterivNV"); + fp_glCombinerParameteriNV = (pfn_glCombinerParameteriNV)load("glCombinerParameteriNV"); + fp_glCombinerInputNV = (pfn_glCombinerInputNV)load("glCombinerInputNV"); + fp_glCombinerOutputNV = (pfn_glCombinerOutputNV)load("glCombinerOutputNV"); + fp_glFinalCombinerInputNV = (pfn_glFinalCombinerInputNV)load("glFinalCombinerInputNV"); + fp_glGetCombinerInputParameterfvNV = (pfn_glGetCombinerInputParameterfvNV)load("glGetCombinerInputParameterfvNV"); + fp_glGetCombinerInputParameterivNV = (pfn_glGetCombinerInputParameterivNV)load("glGetCombinerInputParameterivNV"); + fp_glGetCombinerOutputParameterfvNV = (pfn_glGetCombinerOutputParameterfvNV)load("glGetCombinerOutputParameterfvNV"); + fp_glGetCombinerOutputParameterivNV = (pfn_glGetCombinerOutputParameterivNV)load("glGetCombinerOutputParameterivNV"); + fp_glGetFinalCombinerInputParameterfvNV = (pfn_glGetFinalCombinerInputParameterfvNV)load("glGetFinalCombinerInputParameterfvNV"); + fp_glGetFinalCombinerInputParameterivNV = (pfn_glGetFinalCombinerInputParameterivNV)load("glGetFinalCombinerInputParameterivNV"); +} + +GLboolean GLAD_NV_register_combiners2 = GL_FALSE; +static void load_GL_NV_register_combiners2(LOADER load) { + if(!GLAD_NV_register_combiners2) return; + fp_glCombinerStageParameterfvNV = (pfn_glCombinerStageParameterfvNV)load("glCombinerStageParameterfvNV"); + fp_glGetCombinerStageParameterfvNV = (pfn_glGetCombinerStageParameterfvNV)load("glGetCombinerStageParameterfvNV"); +} + +GLboolean GLAD_NV_shader_atomic_counters = GL_FALSE; +GLboolean GLAD_NV_shader_atomic_float = GL_FALSE; +GLboolean GLAD_NV_shader_buffer_load = GL_FALSE; +static void load_GL_NV_shader_buffer_load(LOADER load) { + if(!GLAD_NV_shader_buffer_load) return; + fp_glMakeBufferResidentNV = (pfn_glMakeBufferResidentNV)load("glMakeBufferResidentNV"); + fp_glMakeBufferNonResidentNV = (pfn_glMakeBufferNonResidentNV)load("glMakeBufferNonResidentNV"); + fp_glIsBufferResidentNV = (pfn_glIsBufferResidentNV)load("glIsBufferResidentNV"); + fp_glMakeNamedBufferResidentNV = (pfn_glMakeNamedBufferResidentNV)load("glMakeNamedBufferResidentNV"); + fp_glMakeNamedBufferNonResidentNV = (pfn_glMakeNamedBufferNonResidentNV)load("glMakeNamedBufferNonResidentNV"); + fp_glIsNamedBufferResidentNV = (pfn_glIsNamedBufferResidentNV)load("glIsNamedBufferResidentNV"); + fp_glGetBufferParameterui64vNV = (pfn_glGetBufferParameterui64vNV)load("glGetBufferParameterui64vNV"); + fp_glGetNamedBufferParameterui64vNV = (pfn_glGetNamedBufferParameterui64vNV)load("glGetNamedBufferParameterui64vNV"); + fp_glGetIntegerui64vNV = (pfn_glGetIntegerui64vNV)load("glGetIntegerui64vNV"); + fp_glUniformui64NV = (pfn_glUniformui64NV)load("glUniformui64NV"); + fp_glUniformui64vNV = (pfn_glUniformui64vNV)load("glUniformui64vNV"); + fp_glGetUniformui64vNV = (pfn_glGetUniformui64vNV)load("glGetUniformui64vNV"); + fp_glProgramUniformui64NV = (pfn_glProgramUniformui64NV)load("glProgramUniformui64NV"); + fp_glProgramUniformui64vNV = (pfn_glProgramUniformui64vNV)load("glProgramUniformui64vNV"); +} + +GLboolean GLAD_NV_shader_buffer_store = GL_FALSE; +GLboolean GLAD_NV_shader_storage_buffer_object = GL_FALSE; +GLboolean GLAD_NV_shadow_samplers_array = GL_FALSE; +GLboolean GLAD_NV_shadow_samplers_cube = GL_FALSE; +GLboolean GLAD_NV_sRGB_formats = GL_FALSE; +GLboolean GLAD_NV_tessellation_program5 = GL_FALSE; +GLboolean GLAD_NV_texgen_emboss = GL_FALSE; +GLboolean GLAD_NV_texgen_reflection = GL_FALSE; +GLboolean GLAD_NV_texture_barrier = GL_FALSE; +static void load_GL_NV_texture_barrier(LOADER load) { + if(!GLAD_NV_texture_barrier) return; + fp_glTextureBarrierNV = (pfn_glTextureBarrierNV)load("glTextureBarrierNV"); +} + +GLboolean GLAD_NV_texture_border_clamp = GL_FALSE; +GLboolean GLAD_NV_texture_compression_s3tc_update = GL_FALSE; +GLboolean GLAD_NV_texture_compression_vtc = GL_FALSE; +GLboolean GLAD_NV_texture_env_combine4 = GL_FALSE; +GLboolean GLAD_NV_texture_expand_normal = GL_FALSE; +GLboolean GLAD_NV_texture_multisample = GL_FALSE; +static void load_GL_NV_texture_multisample(LOADER load) { + if(!GLAD_NV_texture_multisample) return; + fp_glTexImage2DMultisampleCoverageNV = (pfn_glTexImage2DMultisampleCoverageNV)load("glTexImage2DMultisampleCoverageNV"); + fp_glTexImage3DMultisampleCoverageNV = (pfn_glTexImage3DMultisampleCoverageNV)load("glTexImage3DMultisampleCoverageNV"); + fp_glTextureImage2DMultisampleNV = (pfn_glTextureImage2DMultisampleNV)load("glTextureImage2DMultisampleNV"); + fp_glTextureImage3DMultisampleNV = (pfn_glTextureImage3DMultisampleNV)load("glTextureImage3DMultisampleNV"); + fp_glTextureImage2DMultisampleCoverageNV = (pfn_glTextureImage2DMultisampleCoverageNV)load("glTextureImage2DMultisampleCoverageNV"); + fp_glTextureImage3DMultisampleCoverageNV = (pfn_glTextureImage3DMultisampleCoverageNV)load("glTextureImage3DMultisampleCoverageNV"); +} + +GLboolean GLAD_NV_texture_npot_2D_mipmap = GL_FALSE; +GLboolean GLAD_NV_texture_rectangle = GL_FALSE; +GLboolean GLAD_NV_texture_shader = GL_FALSE; +GLboolean GLAD_NV_texture_shader2 = GL_FALSE; +GLboolean GLAD_NV_texture_shader3 = GL_FALSE; +GLboolean GLAD_NV_transform_feedback = GL_FALSE; +static void load_GL_NV_transform_feedback(LOADER load) { + if(!GLAD_NV_transform_feedback) return; + fp_glBeginTransformFeedbackNV = (pfn_glBeginTransformFeedbackNV)load("glBeginTransformFeedbackNV"); + fp_glEndTransformFeedbackNV = (pfn_glEndTransformFeedbackNV)load("glEndTransformFeedbackNV"); + fp_glTransformFeedbackAttribsNV = (pfn_glTransformFeedbackAttribsNV)load("glTransformFeedbackAttribsNV"); + fp_glBindBufferRangeNV = (pfn_glBindBufferRangeNV)load("glBindBufferRangeNV"); + fp_glBindBufferOffsetNV = (pfn_glBindBufferOffsetNV)load("glBindBufferOffsetNV"); + fp_glBindBufferBaseNV = (pfn_glBindBufferBaseNV)load("glBindBufferBaseNV"); + fp_glTransformFeedbackVaryingsNV = (pfn_glTransformFeedbackVaryingsNV)load("glTransformFeedbackVaryingsNV"); + fp_glActiveVaryingNV = (pfn_glActiveVaryingNV)load("glActiveVaryingNV"); + fp_glGetVaryingLocationNV = (pfn_glGetVaryingLocationNV)load("glGetVaryingLocationNV"); + fp_glGetActiveVaryingNV = (pfn_glGetActiveVaryingNV)load("glGetActiveVaryingNV"); + fp_glGetTransformFeedbackVaryingNV = (pfn_glGetTransformFeedbackVaryingNV)load("glGetTransformFeedbackVaryingNV"); + fp_glTransformFeedbackStreamAttribsNV = (pfn_glTransformFeedbackStreamAttribsNV)load("glTransformFeedbackStreamAttribsNV"); +} + +GLboolean GLAD_NV_transform_feedback2 = GL_FALSE; +static void load_GL_NV_transform_feedback2(LOADER load) { + if(!GLAD_NV_transform_feedback2) return; + fp_glBindTransformFeedbackNV = (pfn_glBindTransformFeedbackNV)load("glBindTransformFeedbackNV"); + fp_glDeleteTransformFeedbacksNV = (pfn_glDeleteTransformFeedbacksNV)load("glDeleteTransformFeedbacksNV"); + fp_glGenTransformFeedbacksNV = (pfn_glGenTransformFeedbacksNV)load("glGenTransformFeedbacksNV"); + fp_glIsTransformFeedbackNV = (pfn_glIsTransformFeedbackNV)load("glIsTransformFeedbackNV"); + fp_glPauseTransformFeedbackNV = (pfn_glPauseTransformFeedbackNV)load("glPauseTransformFeedbackNV"); + fp_glResumeTransformFeedbackNV = (pfn_glResumeTransformFeedbackNV)load("glResumeTransformFeedbackNV"); + fp_glDrawTransformFeedbackNV = (pfn_glDrawTransformFeedbackNV)load("glDrawTransformFeedbackNV"); +} + +GLboolean GLAD_NV_vdpau_interop = GL_FALSE; +static void load_GL_NV_vdpau_interop(LOADER load) { + if(!GLAD_NV_vdpau_interop) return; + fp_glVDPAUInitNV = (pfn_glVDPAUInitNV)load("glVDPAUInitNV"); + fp_glVDPAUFiniNV = (pfn_glVDPAUFiniNV)load("glVDPAUFiniNV"); + fp_glVDPAURegisterVideoSurfaceNV = (pfn_glVDPAURegisterVideoSurfaceNV)load("glVDPAURegisterVideoSurfaceNV"); + fp_glVDPAURegisterOutputSurfaceNV = (pfn_glVDPAURegisterOutputSurfaceNV)load("glVDPAURegisterOutputSurfaceNV"); + fp_glVDPAUIsSurfaceNV = (pfn_glVDPAUIsSurfaceNV)load("glVDPAUIsSurfaceNV"); + fp_glVDPAUUnregisterSurfaceNV = (pfn_glVDPAUUnregisterSurfaceNV)load("glVDPAUUnregisterSurfaceNV"); + fp_glVDPAUGetSurfaceivNV = (pfn_glVDPAUGetSurfaceivNV)load("glVDPAUGetSurfaceivNV"); + fp_glVDPAUSurfaceAccessNV = (pfn_glVDPAUSurfaceAccessNV)load("glVDPAUSurfaceAccessNV"); + fp_glVDPAUMapSurfacesNV = (pfn_glVDPAUMapSurfacesNV)load("glVDPAUMapSurfacesNV"); + fp_glVDPAUUnmapSurfacesNV = (pfn_glVDPAUUnmapSurfacesNV)load("glVDPAUUnmapSurfacesNV"); +} + +GLboolean GLAD_NV_vertex_array_range = GL_FALSE; +static void load_GL_NV_vertex_array_range(LOADER load) { + if(!GLAD_NV_vertex_array_range) return; + fp_glFlushVertexArrayRangeNV = (pfn_glFlushVertexArrayRangeNV)load("glFlushVertexArrayRangeNV"); + fp_glVertexArrayRangeNV = (pfn_glVertexArrayRangeNV)load("glVertexArrayRangeNV"); +} + +GLboolean GLAD_NV_vertex_array_range2 = GL_FALSE; +GLboolean GLAD_NV_vertex_attrib_integer_64bit = GL_FALSE; +static void load_GL_NV_vertex_attrib_integer_64bit(LOADER load) { + if(!GLAD_NV_vertex_attrib_integer_64bit) return; + fp_glVertexAttribL1i64NV = (pfn_glVertexAttribL1i64NV)load("glVertexAttribL1i64NV"); + fp_glVertexAttribL2i64NV = (pfn_glVertexAttribL2i64NV)load("glVertexAttribL2i64NV"); + fp_glVertexAttribL3i64NV = (pfn_glVertexAttribL3i64NV)load("glVertexAttribL3i64NV"); + fp_glVertexAttribL4i64NV = (pfn_glVertexAttribL4i64NV)load("glVertexAttribL4i64NV"); + fp_glVertexAttribL1i64vNV = (pfn_glVertexAttribL1i64vNV)load("glVertexAttribL1i64vNV"); + fp_glVertexAttribL2i64vNV = (pfn_glVertexAttribL2i64vNV)load("glVertexAttribL2i64vNV"); + fp_glVertexAttribL3i64vNV = (pfn_glVertexAttribL3i64vNV)load("glVertexAttribL3i64vNV"); + fp_glVertexAttribL4i64vNV = (pfn_glVertexAttribL4i64vNV)load("glVertexAttribL4i64vNV"); + fp_glVertexAttribL1ui64NV = (pfn_glVertexAttribL1ui64NV)load("glVertexAttribL1ui64NV"); + fp_glVertexAttribL2ui64NV = (pfn_glVertexAttribL2ui64NV)load("glVertexAttribL2ui64NV"); + fp_glVertexAttribL3ui64NV = (pfn_glVertexAttribL3ui64NV)load("glVertexAttribL3ui64NV"); + fp_glVertexAttribL4ui64NV = (pfn_glVertexAttribL4ui64NV)load("glVertexAttribL4ui64NV"); + fp_glVertexAttribL1ui64vNV = (pfn_glVertexAttribL1ui64vNV)load("glVertexAttribL1ui64vNV"); + fp_glVertexAttribL2ui64vNV = (pfn_glVertexAttribL2ui64vNV)load("glVertexAttribL2ui64vNV"); + fp_glVertexAttribL3ui64vNV = (pfn_glVertexAttribL3ui64vNV)load("glVertexAttribL3ui64vNV"); + fp_glVertexAttribL4ui64vNV = (pfn_glVertexAttribL4ui64vNV)load("glVertexAttribL4ui64vNV"); + fp_glGetVertexAttribLi64vNV = (pfn_glGetVertexAttribLi64vNV)load("glGetVertexAttribLi64vNV"); + fp_glGetVertexAttribLui64vNV = (pfn_glGetVertexAttribLui64vNV)load("glGetVertexAttribLui64vNV"); + fp_glVertexAttribLFormatNV = (pfn_glVertexAttribLFormatNV)load("glVertexAttribLFormatNV"); +} + +GLboolean GLAD_NV_vertex_buffer_unified_memory = GL_FALSE; +static void load_GL_NV_vertex_buffer_unified_memory(LOADER load) { + if(!GLAD_NV_vertex_buffer_unified_memory) return; + fp_glBufferAddressRangeNV = (pfn_glBufferAddressRangeNV)load("glBufferAddressRangeNV"); + fp_glVertexFormatNV = (pfn_glVertexFormatNV)load("glVertexFormatNV"); + fp_glNormalFormatNV = (pfn_glNormalFormatNV)load("glNormalFormatNV"); + fp_glColorFormatNV = (pfn_glColorFormatNV)load("glColorFormatNV"); + fp_glIndexFormatNV = (pfn_glIndexFormatNV)load("glIndexFormatNV"); + fp_glTexCoordFormatNV = (pfn_glTexCoordFormatNV)load("glTexCoordFormatNV"); + fp_glEdgeFlagFormatNV = (pfn_glEdgeFlagFormatNV)load("glEdgeFlagFormatNV"); + fp_glSecondaryColorFormatNV = (pfn_glSecondaryColorFormatNV)load("glSecondaryColorFormatNV"); + fp_glFogCoordFormatNV = (pfn_glFogCoordFormatNV)load("glFogCoordFormatNV"); + fp_glVertexAttribFormatNV = (pfn_glVertexAttribFormatNV)load("glVertexAttribFormatNV"); + fp_glVertexAttribIFormatNV = (pfn_glVertexAttribIFormatNV)load("glVertexAttribIFormatNV"); + fp_glGetIntegerui64i_vNV = (pfn_glGetIntegerui64i_vNV)load("glGetIntegerui64i_vNV"); +} + +GLboolean GLAD_NV_vertex_program = GL_FALSE; +static void load_GL_NV_vertex_program(LOADER load) { + if(!GLAD_NV_vertex_program) return; + fp_glAreProgramsResidentNV = (pfn_glAreProgramsResidentNV)load("glAreProgramsResidentNV"); + fp_glBindProgramNV = (pfn_glBindProgramNV)load("glBindProgramNV"); + fp_glDeleteProgramsNV = (pfn_glDeleteProgramsNV)load("glDeleteProgramsNV"); + fp_glExecuteProgramNV = (pfn_glExecuteProgramNV)load("glExecuteProgramNV"); + fp_glGenProgramsNV = (pfn_glGenProgramsNV)load("glGenProgramsNV"); + fp_glGetProgramParameterdvNV = (pfn_glGetProgramParameterdvNV)load("glGetProgramParameterdvNV"); + fp_glGetProgramParameterfvNV = (pfn_glGetProgramParameterfvNV)load("glGetProgramParameterfvNV"); + fp_glGetProgramivNV = (pfn_glGetProgramivNV)load("glGetProgramivNV"); + fp_glGetProgramStringNV = (pfn_glGetProgramStringNV)load("glGetProgramStringNV"); + fp_glGetTrackMatrixivNV = (pfn_glGetTrackMatrixivNV)load("glGetTrackMatrixivNV"); + fp_glGetVertexAttribdvNV = (pfn_glGetVertexAttribdvNV)load("glGetVertexAttribdvNV"); + fp_glGetVertexAttribfvNV = (pfn_glGetVertexAttribfvNV)load("glGetVertexAttribfvNV"); + fp_glGetVertexAttribivNV = (pfn_glGetVertexAttribivNV)load("glGetVertexAttribivNV"); + fp_glGetVertexAttribPointervNV = (pfn_glGetVertexAttribPointervNV)load("glGetVertexAttribPointervNV"); + fp_glIsProgramNV = (pfn_glIsProgramNV)load("glIsProgramNV"); + fp_glLoadProgramNV = (pfn_glLoadProgramNV)load("glLoadProgramNV"); + fp_glProgramParameter4dNV = (pfn_glProgramParameter4dNV)load("glProgramParameter4dNV"); + fp_glProgramParameter4dvNV = (pfn_glProgramParameter4dvNV)load("glProgramParameter4dvNV"); + fp_glProgramParameter4fNV = (pfn_glProgramParameter4fNV)load("glProgramParameter4fNV"); + fp_glProgramParameter4fvNV = (pfn_glProgramParameter4fvNV)load("glProgramParameter4fvNV"); + fp_glProgramParameters4dvNV = (pfn_glProgramParameters4dvNV)load("glProgramParameters4dvNV"); + fp_glProgramParameters4fvNV = (pfn_glProgramParameters4fvNV)load("glProgramParameters4fvNV"); + fp_glRequestResidentProgramsNV = (pfn_glRequestResidentProgramsNV)load("glRequestResidentProgramsNV"); + fp_glTrackMatrixNV = (pfn_glTrackMatrixNV)load("glTrackMatrixNV"); + fp_glVertexAttribPointerNV = (pfn_glVertexAttribPointerNV)load("glVertexAttribPointerNV"); + fp_glVertexAttrib1dNV = (pfn_glVertexAttrib1dNV)load("glVertexAttrib1dNV"); + fp_glVertexAttrib1dvNV = (pfn_glVertexAttrib1dvNV)load("glVertexAttrib1dvNV"); + fp_glVertexAttrib1fNV = (pfn_glVertexAttrib1fNV)load("glVertexAttrib1fNV"); + fp_glVertexAttrib1fvNV = (pfn_glVertexAttrib1fvNV)load("glVertexAttrib1fvNV"); + fp_glVertexAttrib1sNV = (pfn_glVertexAttrib1sNV)load("glVertexAttrib1sNV"); + fp_glVertexAttrib1svNV = (pfn_glVertexAttrib1svNV)load("glVertexAttrib1svNV"); + fp_glVertexAttrib2dNV = (pfn_glVertexAttrib2dNV)load("glVertexAttrib2dNV"); + fp_glVertexAttrib2dvNV = (pfn_glVertexAttrib2dvNV)load("glVertexAttrib2dvNV"); + fp_glVertexAttrib2fNV = (pfn_glVertexAttrib2fNV)load("glVertexAttrib2fNV"); + fp_glVertexAttrib2fvNV = (pfn_glVertexAttrib2fvNV)load("glVertexAttrib2fvNV"); + fp_glVertexAttrib2sNV = (pfn_glVertexAttrib2sNV)load("glVertexAttrib2sNV"); + fp_glVertexAttrib2svNV = (pfn_glVertexAttrib2svNV)load("glVertexAttrib2svNV"); + fp_glVertexAttrib3dNV = (pfn_glVertexAttrib3dNV)load("glVertexAttrib3dNV"); + fp_glVertexAttrib3dvNV = (pfn_glVertexAttrib3dvNV)load("glVertexAttrib3dvNV"); + fp_glVertexAttrib3fNV = (pfn_glVertexAttrib3fNV)load("glVertexAttrib3fNV"); + fp_glVertexAttrib3fvNV = (pfn_glVertexAttrib3fvNV)load("glVertexAttrib3fvNV"); + fp_glVertexAttrib3sNV = (pfn_glVertexAttrib3sNV)load("glVertexAttrib3sNV"); + fp_glVertexAttrib3svNV = (pfn_glVertexAttrib3svNV)load("glVertexAttrib3svNV"); + fp_glVertexAttrib4dNV = (pfn_glVertexAttrib4dNV)load("glVertexAttrib4dNV"); + fp_glVertexAttrib4dvNV = (pfn_glVertexAttrib4dvNV)load("glVertexAttrib4dvNV"); + fp_glVertexAttrib4fNV = (pfn_glVertexAttrib4fNV)load("glVertexAttrib4fNV"); + fp_glVertexAttrib4fvNV = (pfn_glVertexAttrib4fvNV)load("glVertexAttrib4fvNV"); + fp_glVertexAttrib4sNV = (pfn_glVertexAttrib4sNV)load("glVertexAttrib4sNV"); + fp_glVertexAttrib4svNV = (pfn_glVertexAttrib4svNV)load("glVertexAttrib4svNV"); + fp_glVertexAttrib4ubNV = (pfn_glVertexAttrib4ubNV)load("glVertexAttrib4ubNV"); + fp_glVertexAttrib4ubvNV = (pfn_glVertexAttrib4ubvNV)load("glVertexAttrib4ubvNV"); + fp_glVertexAttribs1dvNV = (pfn_glVertexAttribs1dvNV)load("glVertexAttribs1dvNV"); + fp_glVertexAttribs1fvNV = (pfn_glVertexAttribs1fvNV)load("glVertexAttribs1fvNV"); + fp_glVertexAttribs1svNV = (pfn_glVertexAttribs1svNV)load("glVertexAttribs1svNV"); + fp_glVertexAttribs2dvNV = (pfn_glVertexAttribs2dvNV)load("glVertexAttribs2dvNV"); + fp_glVertexAttribs2fvNV = (pfn_glVertexAttribs2fvNV)load("glVertexAttribs2fvNV"); + fp_glVertexAttribs2svNV = (pfn_glVertexAttribs2svNV)load("glVertexAttribs2svNV"); + fp_glVertexAttribs3dvNV = (pfn_glVertexAttribs3dvNV)load("glVertexAttribs3dvNV"); + fp_glVertexAttribs3fvNV = (pfn_glVertexAttribs3fvNV)load("glVertexAttribs3fvNV"); + fp_glVertexAttribs3svNV = (pfn_glVertexAttribs3svNV)load("glVertexAttribs3svNV"); + fp_glVertexAttribs4dvNV = (pfn_glVertexAttribs4dvNV)load("glVertexAttribs4dvNV"); + fp_glVertexAttribs4fvNV = (pfn_glVertexAttribs4fvNV)load("glVertexAttribs4fvNV"); + fp_glVertexAttribs4svNV = (pfn_glVertexAttribs4svNV)load("glVertexAttribs4svNV"); + fp_glVertexAttribs4ubvNV = (pfn_glVertexAttribs4ubvNV)load("glVertexAttribs4ubvNV"); +} + +GLboolean GLAD_NV_vertex_program1_1 = GL_FALSE; +GLboolean GLAD_NV_vertex_program2 = GL_FALSE; +GLboolean GLAD_NV_vertex_program2_option = GL_FALSE; +GLboolean GLAD_NV_vertex_program3 = GL_FALSE; +GLboolean GLAD_NV_vertex_program4 = GL_FALSE; +static void load_GL_NV_vertex_program4(LOADER load) { + if(!GLAD_NV_vertex_program4) return; + fp_glVertexAttribI1iEXT = (pfn_glVertexAttribI1iEXT)load("glVertexAttribI1iEXT"); + fp_glVertexAttribI2iEXT = (pfn_glVertexAttribI2iEXT)load("glVertexAttribI2iEXT"); + fp_glVertexAttribI3iEXT = (pfn_glVertexAttribI3iEXT)load("glVertexAttribI3iEXT"); + fp_glVertexAttribI4iEXT = (pfn_glVertexAttribI4iEXT)load("glVertexAttribI4iEXT"); + fp_glVertexAttribI1uiEXT = (pfn_glVertexAttribI1uiEXT)load("glVertexAttribI1uiEXT"); + fp_glVertexAttribI2uiEXT = (pfn_glVertexAttribI2uiEXT)load("glVertexAttribI2uiEXT"); + fp_glVertexAttribI3uiEXT = (pfn_glVertexAttribI3uiEXT)load("glVertexAttribI3uiEXT"); + fp_glVertexAttribI4uiEXT = (pfn_glVertexAttribI4uiEXT)load("glVertexAttribI4uiEXT"); + fp_glVertexAttribI1ivEXT = (pfn_glVertexAttribI1ivEXT)load("glVertexAttribI1ivEXT"); + fp_glVertexAttribI2ivEXT = (pfn_glVertexAttribI2ivEXT)load("glVertexAttribI2ivEXT"); + fp_glVertexAttribI3ivEXT = (pfn_glVertexAttribI3ivEXT)load("glVertexAttribI3ivEXT"); + fp_glVertexAttribI4ivEXT = (pfn_glVertexAttribI4ivEXT)load("glVertexAttribI4ivEXT"); + fp_glVertexAttribI1uivEXT = (pfn_glVertexAttribI1uivEXT)load("glVertexAttribI1uivEXT"); + fp_glVertexAttribI2uivEXT = (pfn_glVertexAttribI2uivEXT)load("glVertexAttribI2uivEXT"); + fp_glVertexAttribI3uivEXT = (pfn_glVertexAttribI3uivEXT)load("glVertexAttribI3uivEXT"); + fp_glVertexAttribI4uivEXT = (pfn_glVertexAttribI4uivEXT)load("glVertexAttribI4uivEXT"); + fp_glVertexAttribI4bvEXT = (pfn_glVertexAttribI4bvEXT)load("glVertexAttribI4bvEXT"); + fp_glVertexAttribI4svEXT = (pfn_glVertexAttribI4svEXT)load("glVertexAttribI4svEXT"); + fp_glVertexAttribI4ubvEXT = (pfn_glVertexAttribI4ubvEXT)load("glVertexAttribI4ubvEXT"); + fp_glVertexAttribI4usvEXT = (pfn_glVertexAttribI4usvEXT)load("glVertexAttribI4usvEXT"); + fp_glVertexAttribIPointerEXT = (pfn_glVertexAttribIPointerEXT)load("glVertexAttribIPointerEXT"); + fp_glGetVertexAttribIivEXT = (pfn_glGetVertexAttribIivEXT)load("glGetVertexAttribIivEXT"); + fp_glGetVertexAttribIuivEXT = (pfn_glGetVertexAttribIuivEXT)load("glGetVertexAttribIuivEXT"); +} + +GLboolean GLAD_NV_video_capture = GL_FALSE; +static void load_GL_NV_video_capture(LOADER load) { + if(!GLAD_NV_video_capture) return; + fp_glBeginVideoCaptureNV = (pfn_glBeginVideoCaptureNV)load("glBeginVideoCaptureNV"); + fp_glBindVideoCaptureStreamBufferNV = (pfn_glBindVideoCaptureStreamBufferNV)load("glBindVideoCaptureStreamBufferNV"); + fp_glBindVideoCaptureStreamTextureNV = (pfn_glBindVideoCaptureStreamTextureNV)load("glBindVideoCaptureStreamTextureNV"); + fp_glEndVideoCaptureNV = (pfn_glEndVideoCaptureNV)load("glEndVideoCaptureNV"); + fp_glGetVideoCaptureivNV = (pfn_glGetVideoCaptureivNV)load("glGetVideoCaptureivNV"); + fp_glGetVideoCaptureStreamivNV = (pfn_glGetVideoCaptureStreamivNV)load("glGetVideoCaptureStreamivNV"); + fp_glGetVideoCaptureStreamfvNV = (pfn_glGetVideoCaptureStreamfvNV)load("glGetVideoCaptureStreamfvNV"); + fp_glGetVideoCaptureStreamdvNV = (pfn_glGetVideoCaptureStreamdvNV)load("glGetVideoCaptureStreamdvNV"); + fp_glVideoCaptureNV = (pfn_glVideoCaptureNV)load("glVideoCaptureNV"); + fp_glVideoCaptureStreamParameterivNV = (pfn_glVideoCaptureStreamParameterivNV)load("glVideoCaptureStreamParameterivNV"); + fp_glVideoCaptureStreamParameterfvNV = (pfn_glVideoCaptureStreamParameterfvNV)load("glVideoCaptureStreamParameterfvNV"); + fp_glVideoCaptureStreamParameterdvNV = (pfn_glVideoCaptureStreamParameterdvNV)load("glVideoCaptureStreamParameterdvNV"); +} + +GLboolean GLAD_NVX_conditional_render = GL_FALSE; +static void load_GL_NVX_conditional_render(LOADER load) { + if(!GLAD_NVX_conditional_render) return; + fp_glBeginConditionalRenderNVX = (pfn_glBeginConditionalRenderNVX)load("glBeginConditionalRenderNVX"); + fp_glEndConditionalRenderNVX = (pfn_glEndConditionalRenderNVX)load("glEndConditionalRenderNVX"); +} + +GLboolean GLAD_OML_interlace = GL_FALSE; +GLboolean GLAD_OML_resample = GL_FALSE; +GLboolean GLAD_OML_subsample = GL_FALSE; +GLboolean GLAD_PGI_misc_hints = GL_FALSE; +static void load_GL_PGI_misc_hints(LOADER load) { + if(!GLAD_PGI_misc_hints) return; + fp_glHintPGI = (pfn_glHintPGI)load("glHintPGI"); +} + +GLboolean GLAD_PGI_vertex_hints = GL_FALSE; +GLboolean GLAD_QCOM_alpha_test = GL_FALSE; +static void load_GL_QCOM_alpha_test(LOADER load) { + if(!GLAD_QCOM_alpha_test) return; + fp_glAlphaFuncQCOM = (pfn_glAlphaFuncQCOM)load("glAlphaFuncQCOM"); +} + +GLboolean GLAD_QCOM_binning_control = GL_FALSE; +GLboolean GLAD_QCOM_driver_control = GL_FALSE; +static void load_GL_QCOM_driver_control(LOADER load) { + if(!GLAD_QCOM_driver_control) return; + fp_glGetDriverControlsQCOM = (pfn_glGetDriverControlsQCOM)load("glGetDriverControlsQCOM"); + fp_glGetDriverControlStringQCOM = (pfn_glGetDriverControlStringQCOM)load("glGetDriverControlStringQCOM"); + fp_glEnableDriverControlQCOM = (pfn_glEnableDriverControlQCOM)load("glEnableDriverControlQCOM"); + fp_glDisableDriverControlQCOM = (pfn_glDisableDriverControlQCOM)load("glDisableDriverControlQCOM"); +} + +GLboolean GLAD_QCOM_extended_get = GL_FALSE; +static void load_GL_QCOM_extended_get(LOADER load) { + if(!GLAD_QCOM_extended_get) return; + fp_glExtGetTexturesQCOM = (pfn_glExtGetTexturesQCOM)load("glExtGetTexturesQCOM"); + fp_glExtGetBuffersQCOM = (pfn_glExtGetBuffersQCOM)load("glExtGetBuffersQCOM"); + fp_glExtGetRenderbuffersQCOM = (pfn_glExtGetRenderbuffersQCOM)load("glExtGetRenderbuffersQCOM"); + fp_glExtGetFramebuffersQCOM = (pfn_glExtGetFramebuffersQCOM)load("glExtGetFramebuffersQCOM"); + fp_glExtGetTexLevelParameterivQCOM = (pfn_glExtGetTexLevelParameterivQCOM)load("glExtGetTexLevelParameterivQCOM"); + fp_glExtTexObjectStateOverrideiQCOM = (pfn_glExtTexObjectStateOverrideiQCOM)load("glExtTexObjectStateOverrideiQCOM"); + fp_glExtGetTexSubImageQCOM = (pfn_glExtGetTexSubImageQCOM)load("glExtGetTexSubImageQCOM"); + fp_glExtGetBufferPointervQCOM = (pfn_glExtGetBufferPointervQCOM)load("glExtGetBufferPointervQCOM"); +} + +GLboolean GLAD_QCOM_extended_get2 = GL_FALSE; +static void load_GL_QCOM_extended_get2(LOADER load) { + if(!GLAD_QCOM_extended_get2) return; + fp_glExtGetShadersQCOM = (pfn_glExtGetShadersQCOM)load("glExtGetShadersQCOM"); + fp_glExtGetProgramsQCOM = (pfn_glExtGetProgramsQCOM)load("glExtGetProgramsQCOM"); + fp_glExtIsProgramBinaryQCOM = (pfn_glExtIsProgramBinaryQCOM)load("glExtIsProgramBinaryQCOM"); + fp_glExtGetProgramBinarySourceQCOM = (pfn_glExtGetProgramBinarySourceQCOM)load("glExtGetProgramBinarySourceQCOM"); +} + +GLboolean GLAD_QCOM_perfmon_global_mode = GL_FALSE; +GLboolean GLAD_QCOM_tiled_rendering = GL_FALSE; +static void load_GL_QCOM_tiled_rendering(LOADER load) { + if(!GLAD_QCOM_tiled_rendering) return; + fp_glStartTilingQCOM = (pfn_glStartTilingQCOM)load("glStartTilingQCOM"); + fp_glEndTilingQCOM = (pfn_glEndTilingQCOM)load("glEndTilingQCOM"); +} + +GLboolean GLAD_QCOM_writeonly_rendering = GL_FALSE; +GLboolean GLAD_REND_screen_coordinates = GL_FALSE; +GLboolean GLAD_S3_s3tc = GL_FALSE; +GLboolean GLAD_SGIS_generate_mipmap = GL_FALSE; +GLboolean GLAD_SGIX_texture_lod_bias = GL_FALSE; +GLboolean GLAD_VIV_shader_binary = GL_FALSE; +static void find_extensions(void) { + GLAD_KHR_debug = has_ext("GL_KHR_debug"); + GLAD_KHR_texture_compression_astc_hdr = has_ext("GL_KHR_texture_compression_astc_hdr"); + GLAD_KHR_texture_compression_astc_ldr = has_ext("GL_KHR_texture_compression_astc_ldr"); + GLAD_ARB_arrays_of_arrays = has_ext("GL_ARB_arrays_of_arrays"); + GLAD_ARB_base_instance = has_ext("GL_ARB_base_instance"); + GLAD_ARB_bindless_texture = has_ext("GL_ARB_bindless_texture"); + GLAD_ARB_blend_func_extended = has_ext("GL_ARB_blend_func_extended"); + GLAD_ARB_buffer_storage = has_ext("GL_ARB_buffer_storage"); + GLAD_ARB_cl_event = has_ext("GL_ARB_cl_event"); + GLAD_ARB_clear_buffer_object = has_ext("GL_ARB_clear_buffer_object"); + GLAD_ARB_clear_texture = has_ext("GL_ARB_clear_texture"); + GLAD_ARB_color_buffer_float = has_ext("GL_ARB_color_buffer_float"); + GLAD_ARB_compatibility = has_ext("GL_ARB_compatibility"); + GLAD_ARB_compressed_texture_pixel_storage = has_ext("GL_ARB_compressed_texture_pixel_storage"); + GLAD_ARB_compute_shader = has_ext("GL_ARB_compute_shader"); + GLAD_ARB_compute_variable_group_size = has_ext("GL_ARB_compute_variable_group_size"); + GLAD_ARB_conservative_depth = has_ext("GL_ARB_conservative_depth"); + GLAD_ARB_copy_buffer = has_ext("GL_ARB_copy_buffer"); + GLAD_ARB_copy_image = has_ext("GL_ARB_copy_image"); + GLAD_ARB_debug_output = has_ext("GL_ARB_debug_output"); + GLAD_ARB_depth_buffer_float = has_ext("GL_ARB_depth_buffer_float"); + GLAD_ARB_depth_clamp = has_ext("GL_ARB_depth_clamp"); + GLAD_ARB_depth_texture = has_ext("GL_ARB_depth_texture"); + GLAD_ARB_draw_buffers = has_ext("GL_ARB_draw_buffers"); + GLAD_ARB_draw_buffers_blend = has_ext("GL_ARB_draw_buffers_blend"); + GLAD_ARB_draw_elements_base_vertex = has_ext("GL_ARB_draw_elements_base_vertex"); + GLAD_ARB_draw_indirect = has_ext("GL_ARB_draw_indirect"); + GLAD_ARB_draw_instanced = has_ext("GL_ARB_draw_instanced"); + GLAD_ARB_enhanced_layouts = has_ext("GL_ARB_enhanced_layouts"); + GLAD_ARB_ES2_compatibility = has_ext("GL_ARB_ES2_compatibility"); + GLAD_ARB_ES3_compatibility = has_ext("GL_ARB_ES3_compatibility"); + GLAD_ARB_explicit_attrib_location = has_ext("GL_ARB_explicit_attrib_location"); + GLAD_ARB_explicit_uniform_location = has_ext("GL_ARB_explicit_uniform_location"); + GLAD_ARB_fragment_coord_conventions = has_ext("GL_ARB_fragment_coord_conventions"); + GLAD_ARB_fragment_layer_viewport = has_ext("GL_ARB_fragment_layer_viewport"); + GLAD_ARB_fragment_program = has_ext("GL_ARB_fragment_program"); + GLAD_ARB_fragment_program_shadow = has_ext("GL_ARB_fragment_program_shadow"); + GLAD_ARB_fragment_shader = has_ext("GL_ARB_fragment_shader"); + GLAD_ARB_framebuffer_no_attachments = has_ext("GL_ARB_framebuffer_no_attachments"); + GLAD_ARB_framebuffer_object = has_ext("GL_ARB_framebuffer_object"); + GLAD_ARB_framebuffer_sRGB = has_ext("GL_ARB_framebuffer_sRGB"); + GLAD_ARB_geometry_shader4 = has_ext("GL_ARB_geometry_shader4"); + GLAD_ARB_get_program_binary = has_ext("GL_ARB_get_program_binary"); + GLAD_ARB_gpu_shader5 = has_ext("GL_ARB_gpu_shader5"); + GLAD_ARB_gpu_shader_fp64 = has_ext("GL_ARB_gpu_shader_fp64"); + GLAD_ARB_half_float_pixel = has_ext("GL_ARB_half_float_pixel"); + GLAD_ARB_half_float_vertex = has_ext("GL_ARB_half_float_vertex"); + GLAD_ARB_indirect_parameters = has_ext("GL_ARB_indirect_parameters"); + GLAD_ARB_instanced_arrays = has_ext("GL_ARB_instanced_arrays"); + GLAD_ARB_internalformat_query = has_ext("GL_ARB_internalformat_query"); + GLAD_ARB_internalformat_query2 = has_ext("GL_ARB_internalformat_query2"); + GLAD_ARB_invalidate_subdata = has_ext("GL_ARB_invalidate_subdata"); + GLAD_ARB_map_buffer_alignment = has_ext("GL_ARB_map_buffer_alignment"); + GLAD_ARB_map_buffer_range = has_ext("GL_ARB_map_buffer_range"); + GLAD_ARB_matrix_palette = has_ext("GL_ARB_matrix_palette"); + GLAD_ARB_multi_bind = has_ext("GL_ARB_multi_bind"); + GLAD_ARB_multi_draw_indirect = has_ext("GL_ARB_multi_draw_indirect"); + GLAD_ARB_multisample = has_ext("GL_ARB_multisample"); + GLAD_ARB_multitexture = has_ext("GL_ARB_multitexture"); + GLAD_ARB_occlusion_query = has_ext("GL_ARB_occlusion_query"); + GLAD_ARB_occlusion_query2 = has_ext("GL_ARB_occlusion_query2"); + GLAD_ARB_pixel_buffer_object = has_ext("GL_ARB_pixel_buffer_object"); + GLAD_ARB_point_parameters = has_ext("GL_ARB_point_parameters"); + GLAD_ARB_point_sprite = has_ext("GL_ARB_point_sprite"); + GLAD_ARB_program_interface_query = has_ext("GL_ARB_program_interface_query"); + GLAD_ARB_provoking_vertex = has_ext("GL_ARB_provoking_vertex"); + GLAD_ARB_query_buffer_object = has_ext("GL_ARB_query_buffer_object"); + GLAD_ARB_robust_buffer_access_behavior = has_ext("GL_ARB_robust_buffer_access_behavior"); + GLAD_ARB_robustness = has_ext("GL_ARB_robustness"); + GLAD_ARB_robustness_isolation = has_ext("GL_ARB_robustness_isolation"); + GLAD_ARB_sample_shading = has_ext("GL_ARB_sample_shading"); + GLAD_ARB_sampler_objects = has_ext("GL_ARB_sampler_objects"); + GLAD_ARB_seamless_cube_map = has_ext("GL_ARB_seamless_cube_map"); + GLAD_ARB_seamless_cubemap_per_texture = has_ext("GL_ARB_seamless_cubemap_per_texture"); + GLAD_ARB_separate_shader_objects = has_ext("GL_ARB_separate_shader_objects"); + GLAD_ARB_shader_atomic_counters = has_ext("GL_ARB_shader_atomic_counters"); + GLAD_ARB_shader_bit_encoding = has_ext("GL_ARB_shader_bit_encoding"); + GLAD_ARB_shader_draw_parameters = has_ext("GL_ARB_shader_draw_parameters"); + GLAD_ARB_shader_group_vote = has_ext("GL_ARB_shader_group_vote"); + GLAD_ARB_shader_image_load_store = has_ext("GL_ARB_shader_image_load_store"); + GLAD_ARB_shader_image_size = has_ext("GL_ARB_shader_image_size"); + GLAD_ARB_shader_objects = has_ext("GL_ARB_shader_objects"); + GLAD_ARB_shader_precision = has_ext("GL_ARB_shader_precision"); + GLAD_ARB_shader_stencil_export = has_ext("GL_ARB_shader_stencil_export"); + GLAD_ARB_shader_storage_buffer_object = has_ext("GL_ARB_shader_storage_buffer_object"); + GLAD_ARB_shader_subroutine = has_ext("GL_ARB_shader_subroutine"); + GLAD_ARB_shader_texture_lod = has_ext("GL_ARB_shader_texture_lod"); + GLAD_ARB_shading_language_100 = has_ext("GL_ARB_shading_language_100"); + GLAD_ARB_shading_language_420pack = has_ext("GL_ARB_shading_language_420pack"); + GLAD_ARB_shading_language_include = has_ext("GL_ARB_shading_language_include"); + GLAD_ARB_shading_language_packing = has_ext("GL_ARB_shading_language_packing"); + GLAD_ARB_shadow = has_ext("GL_ARB_shadow"); + GLAD_ARB_shadow_ambient = has_ext("GL_ARB_shadow_ambient"); + GLAD_ARB_sparse_texture = has_ext("GL_ARB_sparse_texture"); + GLAD_ARB_stencil_texturing = has_ext("GL_ARB_stencil_texturing"); + GLAD_ARB_sync = has_ext("GL_ARB_sync"); + GLAD_ARB_tessellation_shader = has_ext("GL_ARB_tessellation_shader"); + GLAD_ARB_texture_border_clamp = has_ext("GL_ARB_texture_border_clamp"); + GLAD_ARB_texture_buffer_object = has_ext("GL_ARB_texture_buffer_object"); + GLAD_ARB_texture_buffer_object_rgb32 = has_ext("GL_ARB_texture_buffer_object_rgb32"); + GLAD_ARB_texture_buffer_range = has_ext("GL_ARB_texture_buffer_range"); + GLAD_ARB_texture_compression = has_ext("GL_ARB_texture_compression"); + GLAD_ARB_texture_compression_bptc = has_ext("GL_ARB_texture_compression_bptc"); + GLAD_ARB_texture_compression_rgtc = has_ext("GL_ARB_texture_compression_rgtc"); + GLAD_ARB_texture_cube_map = has_ext("GL_ARB_texture_cube_map"); + GLAD_ARB_texture_cube_map_array = has_ext("GL_ARB_texture_cube_map_array"); + GLAD_ARB_texture_env_add = has_ext("GL_ARB_texture_env_add"); + GLAD_ARB_texture_env_combine = has_ext("GL_ARB_texture_env_combine"); + GLAD_ARB_texture_env_crossbar = has_ext("GL_ARB_texture_env_crossbar"); + GLAD_ARB_texture_env_dot3 = has_ext("GL_ARB_texture_env_dot3"); + GLAD_ARB_texture_float = has_ext("GL_ARB_texture_float"); + GLAD_ARB_texture_gather = has_ext("GL_ARB_texture_gather"); + GLAD_ARB_texture_mirror_clamp_to_edge = has_ext("GL_ARB_texture_mirror_clamp_to_edge"); + GLAD_ARB_texture_mirrored_repeat = has_ext("GL_ARB_texture_mirrored_repeat"); + GLAD_ARB_texture_multisample = has_ext("GL_ARB_texture_multisample"); + GLAD_ARB_texture_non_power_of_two = has_ext("GL_ARB_texture_non_power_of_two"); + GLAD_ARB_texture_query_levels = has_ext("GL_ARB_texture_query_levels"); + GLAD_ARB_texture_query_lod = has_ext("GL_ARB_texture_query_lod"); + GLAD_ARB_texture_rectangle = has_ext("GL_ARB_texture_rectangle"); + GLAD_ARB_texture_rg = has_ext("GL_ARB_texture_rg"); + GLAD_ARB_texture_rgb10_a2ui = has_ext("GL_ARB_texture_rgb10_a2ui"); + GLAD_ARB_texture_stencil8 = has_ext("GL_ARB_texture_stencil8"); + GLAD_ARB_texture_storage = has_ext("GL_ARB_texture_storage"); + GLAD_ARB_texture_storage_multisample = has_ext("GL_ARB_texture_storage_multisample"); + GLAD_ARB_texture_swizzle = has_ext("GL_ARB_texture_swizzle"); + GLAD_ARB_texture_view = has_ext("GL_ARB_texture_view"); + GLAD_ARB_timer_query = has_ext("GL_ARB_timer_query"); + GLAD_ARB_transform_feedback2 = has_ext("GL_ARB_transform_feedback2"); + GLAD_ARB_transform_feedback3 = has_ext("GL_ARB_transform_feedback3"); + GLAD_ARB_transform_feedback_instanced = has_ext("GL_ARB_transform_feedback_instanced"); + GLAD_ARB_transpose_matrix = has_ext("GL_ARB_transpose_matrix"); + GLAD_ARB_uniform_buffer_object = has_ext("GL_ARB_uniform_buffer_object"); + GLAD_ARB_vertex_array_bgra = has_ext("GL_ARB_vertex_array_bgra"); + GLAD_ARB_vertex_array_object = has_ext("GL_ARB_vertex_array_object"); + GLAD_ARB_vertex_attrib_64bit = has_ext("GL_ARB_vertex_attrib_64bit"); + GLAD_ARB_vertex_attrib_binding = has_ext("GL_ARB_vertex_attrib_binding"); + GLAD_ARB_vertex_blend = has_ext("GL_ARB_vertex_blend"); + GLAD_ARB_vertex_buffer_object = has_ext("GL_ARB_vertex_buffer_object"); + GLAD_ARB_vertex_program = has_ext("GL_ARB_vertex_program"); + GLAD_ARB_vertex_shader = has_ext("GL_ARB_vertex_shader"); + GLAD_ARB_vertex_type_10f_11f_11f_rev = has_ext("GL_ARB_vertex_type_10f_11f_11f_rev"); + GLAD_ARB_vertex_type_2_10_10_10_rev = has_ext("GL_ARB_vertex_type_2_10_10_10_rev"); + GLAD_ARB_viewport_array = has_ext("GL_ARB_viewport_array"); + GLAD_ARB_window_pos = has_ext("GL_ARB_window_pos"); + GLAD_EXT_422_pixels = has_ext("GL_EXT_422_pixels"); + GLAD_EXT_abgr = has_ext("GL_EXT_abgr"); + GLAD_EXT_bindable_uniform = has_ext("GL_EXT_bindable_uniform"); + GLAD_EXT_blend_color = has_ext("GL_EXT_blend_color"); + GLAD_EXT_blend_equation_separate = has_ext("GL_EXT_blend_equation_separate"); + GLAD_EXT_blend_func_separate = has_ext("GL_EXT_blend_func_separate"); + GLAD_EXT_blend_minmax = has_ext("GL_EXT_blend_minmax"); + GLAD_EXT_blend_subtract = has_ext("GL_EXT_blend_subtract"); + GLAD_EXT_clip_volume_hint = has_ext("GL_EXT_clip_volume_hint"); + GLAD_EXT_cmyka = has_ext("GL_EXT_cmyka"); + GLAD_EXT_color_buffer_half_float = has_ext("GL_EXT_color_buffer_half_float"); + GLAD_EXT_color_subtable = has_ext("GL_EXT_color_subtable"); + GLAD_EXT_compiled_vertex_array = has_ext("GL_EXT_compiled_vertex_array"); + GLAD_EXT_convolution = has_ext("GL_EXT_convolution"); + GLAD_EXT_coordinate_frame = has_ext("GL_EXT_coordinate_frame"); + GLAD_EXT_cull_vertex = has_ext("GL_EXT_cull_vertex"); + GLAD_EXT_debug_label = has_ext("GL_EXT_debug_label"); + GLAD_EXT_debug_marker = has_ext("GL_EXT_debug_marker"); + GLAD_EXT_depth_bounds_test = has_ext("GL_EXT_depth_bounds_test"); + GLAD_EXT_direct_state_access = has_ext("GL_EXT_direct_state_access"); + GLAD_EXT_discard_framebuffer = has_ext("GL_EXT_discard_framebuffer"); + GLAD_EXT_disjoint_timer_query = has_ext("GL_EXT_disjoint_timer_query"); + GLAD_EXT_draw_buffers = has_ext("GL_EXT_draw_buffers"); + GLAD_EXT_draw_buffers2 = has_ext("GL_EXT_draw_buffers2"); + GLAD_EXT_draw_instanced = has_ext("GL_EXT_draw_instanced"); + GLAD_EXT_fog_coord = has_ext("GL_EXT_fog_coord"); + GLAD_EXT_framebuffer_blit = has_ext("GL_EXT_framebuffer_blit"); + GLAD_EXT_framebuffer_multisample = has_ext("GL_EXT_framebuffer_multisample"); + GLAD_EXT_framebuffer_multisample_blit_scaled = has_ext("GL_EXT_framebuffer_multisample_blit_scaled"); + GLAD_EXT_framebuffer_object = has_ext("GL_EXT_framebuffer_object"); + GLAD_EXT_framebuffer_sRGB = has_ext("GL_EXT_framebuffer_sRGB"); + GLAD_EXT_geometry_shader4 = has_ext("GL_EXT_geometry_shader4"); + GLAD_EXT_gpu_program_parameters = has_ext("GL_EXT_gpu_program_parameters"); + GLAD_EXT_gpu_shader4 = has_ext("GL_EXT_gpu_shader4"); + GLAD_EXT_histogram = has_ext("GL_EXT_histogram"); + GLAD_EXT_index_array_formats = has_ext("GL_EXT_index_array_formats"); + GLAD_EXT_index_func = has_ext("GL_EXT_index_func"); + GLAD_EXT_index_material = has_ext("GL_EXT_index_material"); + GLAD_EXT_index_texture = has_ext("GL_EXT_index_texture"); + GLAD_EXT_instanced_arrays = has_ext("GL_EXT_instanced_arrays"); + GLAD_EXT_light_texture = has_ext("GL_EXT_light_texture"); + GLAD_EXT_map_buffer_range = has_ext("GL_EXT_map_buffer_range"); + GLAD_EXT_misc_attribute = has_ext("GL_EXT_misc_attribute"); + GLAD_EXT_multi_draw_arrays = has_ext("GL_EXT_multi_draw_arrays"); + GLAD_EXT_multisample = has_ext("GL_EXT_multisample"); + GLAD_EXT_multisampled_render_to_texture = has_ext("GL_EXT_multisampled_render_to_texture"); + GLAD_EXT_multiview_draw_buffers = has_ext("GL_EXT_multiview_draw_buffers"); + GLAD_EXT_occlusion_query_boolean = has_ext("GL_EXT_occlusion_query_boolean"); + GLAD_EXT_packed_depth_stencil = has_ext("GL_EXT_packed_depth_stencil"); + GLAD_EXT_packed_float = has_ext("GL_EXT_packed_float"); + GLAD_EXT_paletted_texture = has_ext("GL_EXT_paletted_texture"); + GLAD_EXT_pixel_buffer_object = has_ext("GL_EXT_pixel_buffer_object"); + GLAD_EXT_pixel_transform = has_ext("GL_EXT_pixel_transform"); + GLAD_EXT_pixel_transform_color_table = has_ext("GL_EXT_pixel_transform_color_table"); + GLAD_EXT_point_parameters = has_ext("GL_EXT_point_parameters"); + GLAD_EXT_provoking_vertex = has_ext("GL_EXT_provoking_vertex"); + GLAD_EXT_pvrtc_sRGB = has_ext("GL_EXT_pvrtc_sRGB"); + GLAD_EXT_read_format_bgra = has_ext("GL_EXT_read_format_bgra"); + GLAD_EXT_robustness = has_ext("GL_EXT_robustness"); + GLAD_EXT_secondary_color = has_ext("GL_EXT_secondary_color"); + GLAD_EXT_separate_shader_objects = has_ext("GL_EXT_separate_shader_objects"); + GLAD_EXT_shader_framebuffer_fetch = has_ext("GL_EXT_shader_framebuffer_fetch"); + GLAD_EXT_shader_image_load_store = has_ext("GL_EXT_shader_image_load_store"); + GLAD_EXT_shader_integer_mix = has_ext("GL_EXT_shader_integer_mix"); + GLAD_EXT_shader_texture_lod = has_ext("GL_EXT_shader_texture_lod"); + GLAD_EXT_shadow_funcs = has_ext("GL_EXT_shadow_funcs"); + GLAD_EXT_shadow_samplers = has_ext("GL_EXT_shadow_samplers"); + GLAD_EXT_shared_texture_palette = has_ext("GL_EXT_shared_texture_palette"); + GLAD_EXT_sRGB = has_ext("GL_EXT_sRGB"); + GLAD_EXT_sRGB_write_control = has_ext("GL_EXT_sRGB_write_control"); + GLAD_EXT_stencil_clear_tag = has_ext("GL_EXT_stencil_clear_tag"); + GLAD_EXT_stencil_two_side = has_ext("GL_EXT_stencil_two_side"); + GLAD_EXT_stencil_wrap = has_ext("GL_EXT_stencil_wrap"); + GLAD_EXT_texture_array = has_ext("GL_EXT_texture_array"); + GLAD_EXT_texture_buffer_object = has_ext("GL_EXT_texture_buffer_object"); + GLAD_EXT_texture_compression_dxt1 = has_ext("GL_EXT_texture_compression_dxt1"); + GLAD_EXT_texture_compression_latc = has_ext("GL_EXT_texture_compression_latc"); + GLAD_EXT_texture_compression_rgtc = has_ext("GL_EXT_texture_compression_rgtc"); + GLAD_EXT_texture_compression_s3tc = has_ext("GL_EXT_texture_compression_s3tc"); + GLAD_EXT_texture_cube_map = has_ext("GL_EXT_texture_cube_map"); + GLAD_EXT_texture_env_add = has_ext("GL_EXT_texture_env_add"); + GLAD_EXT_texture_env_combine = has_ext("GL_EXT_texture_env_combine"); + GLAD_EXT_texture_env_dot3 = has_ext("GL_EXT_texture_env_dot3"); + GLAD_EXT_texture_filter_anisotropic = has_ext("GL_EXT_texture_filter_anisotropic"); + GLAD_EXT_texture_format_BGRA8888 = has_ext("GL_EXT_texture_format_BGRA8888"); + GLAD_EXT_texture_integer = has_ext("GL_EXT_texture_integer"); + GLAD_EXT_texture_lod_bias = has_ext("GL_EXT_texture_lod_bias"); + GLAD_EXT_texture_mirror_clamp = has_ext("GL_EXT_texture_mirror_clamp"); + GLAD_EXT_texture_perturb_normal = has_ext("GL_EXT_texture_perturb_normal"); + GLAD_EXT_texture_rg = has_ext("GL_EXT_texture_rg"); + GLAD_EXT_texture_shared_exponent = has_ext("GL_EXT_texture_shared_exponent"); + GLAD_EXT_texture_snorm = has_ext("GL_EXT_texture_snorm"); + GLAD_EXT_texture_sRGB = has_ext("GL_EXT_texture_sRGB"); + GLAD_EXT_texture_sRGB_decode = has_ext("GL_EXT_texture_sRGB_decode"); + GLAD_EXT_texture_storage = has_ext("GL_EXT_texture_storage"); + GLAD_EXT_texture_swizzle = has_ext("GL_EXT_texture_swizzle"); + GLAD_EXT_texture_type_2_10_10_10_REV = has_ext("GL_EXT_texture_type_2_10_10_10_REV"); + GLAD_EXT_timer_query = has_ext("GL_EXT_timer_query"); + GLAD_EXT_transform_feedback = has_ext("GL_EXT_transform_feedback"); + GLAD_EXT_unpack_subimage = has_ext("GL_EXT_unpack_subimage"); + GLAD_EXT_vertex_array_bgra = has_ext("GL_EXT_vertex_array_bgra"); + GLAD_EXT_vertex_attrib_64bit = has_ext("GL_EXT_vertex_attrib_64bit"); + GLAD_EXT_vertex_shader = has_ext("GL_EXT_vertex_shader"); + GLAD_EXT_vertex_weighting = has_ext("GL_EXT_vertex_weighting"); + GLAD_EXT_x11_sync_object = has_ext("GL_EXT_x11_sync_object"); + GLAD_OES_byte_coordinates = has_ext("GL_OES_byte_coordinates"); + GLAD_OES_compressed_ETC1_RGB8_texture = has_ext("GL_OES_compressed_ETC1_RGB8_texture"); + GLAD_OES_compressed_paletted_texture = has_ext("GL_OES_compressed_paletted_texture"); + GLAD_OES_depth24 = has_ext("GL_OES_depth24"); + GLAD_OES_depth32 = has_ext("GL_OES_depth32"); + GLAD_OES_depth_texture = has_ext("GL_OES_depth_texture"); + GLAD_OES_EGL_image = has_ext("GL_OES_EGL_image"); + GLAD_OES_EGL_image_external = has_ext("GL_OES_EGL_image_external"); + GLAD_OES_element_index_uint = has_ext("GL_OES_element_index_uint"); + GLAD_OES_fbo_render_mipmap = has_ext("GL_OES_fbo_render_mipmap"); + GLAD_OES_fixed_point = has_ext("GL_OES_fixed_point"); + GLAD_OES_fragment_precision_high = has_ext("GL_OES_fragment_precision_high"); + GLAD_OES_get_program_binary = has_ext("GL_OES_get_program_binary"); + GLAD_OES_mapbuffer = has_ext("GL_OES_mapbuffer"); + GLAD_OES_packed_depth_stencil = has_ext("GL_OES_packed_depth_stencil"); + GLAD_OES_query_matrix = has_ext("GL_OES_query_matrix"); + GLAD_OES_read_format = has_ext("GL_OES_read_format"); + GLAD_OES_required_internalformat = has_ext("GL_OES_required_internalformat"); + GLAD_OES_rgb8_rgba8 = has_ext("GL_OES_rgb8_rgba8"); + GLAD_OES_single_precision = has_ext("GL_OES_single_precision"); + GLAD_OES_standard_derivatives = has_ext("GL_OES_standard_derivatives"); + GLAD_OES_stencil1 = has_ext("GL_OES_stencil1"); + GLAD_OES_stencil4 = has_ext("GL_OES_stencil4"); + GLAD_OES_surfaceless_context = has_ext("GL_OES_surfaceless_context"); + GLAD_OES_texture_3D = has_ext("GL_OES_texture_3D"); + GLAD_OES_texture_compression_astc = has_ext("GL_OES_texture_compression_astc"); + GLAD_OES_texture_float = has_ext("GL_OES_texture_float"); + GLAD_OES_texture_float_linear = has_ext("GL_OES_texture_float_linear"); + GLAD_OES_texture_half_float = has_ext("GL_OES_texture_half_float"); + GLAD_OES_texture_half_float_linear = has_ext("GL_OES_texture_half_float_linear"); + GLAD_OES_texture_npot = has_ext("GL_OES_texture_npot"); + GLAD_OES_vertex_array_object = has_ext("GL_OES_vertex_array_object"); + GLAD_OES_vertex_half_float = has_ext("GL_OES_vertex_half_float"); + GLAD_OES_vertex_type_10_10_10_2 = has_ext("GL_OES_vertex_type_10_10_10_2"); + GLAD_AMD_blend_minmax_factor = has_ext("GL_AMD_blend_minmax_factor"); + GLAD_AMD_compressed_3DC_texture = has_ext("GL_AMD_compressed_3DC_texture"); + GLAD_AMD_compressed_ATC_texture = has_ext("GL_AMD_compressed_ATC_texture"); + GLAD_AMD_conservative_depth = has_ext("GL_AMD_conservative_depth"); + GLAD_AMD_debug_output = has_ext("GL_AMD_debug_output"); + GLAD_AMD_depth_clamp_separate = has_ext("GL_AMD_depth_clamp_separate"); + GLAD_AMD_draw_buffers_blend = has_ext("GL_AMD_draw_buffers_blend"); + GLAD_AMD_interleaved_elements = has_ext("GL_AMD_interleaved_elements"); + GLAD_AMD_multi_draw_indirect = has_ext("GL_AMD_multi_draw_indirect"); + GLAD_AMD_name_gen_delete = has_ext("GL_AMD_name_gen_delete"); + GLAD_AMD_performance_monitor = has_ext("GL_AMD_performance_monitor"); + GLAD_AMD_pinned_memory = has_ext("GL_AMD_pinned_memory"); + GLAD_AMD_program_binary_Z400 = has_ext("GL_AMD_program_binary_Z400"); + GLAD_AMD_query_buffer_object = has_ext("GL_AMD_query_buffer_object"); + GLAD_AMD_sample_positions = has_ext("GL_AMD_sample_positions"); + GLAD_AMD_seamless_cubemap_per_texture = has_ext("GL_AMD_seamless_cubemap_per_texture"); + GLAD_AMD_shader_atomic_counter_ops = has_ext("GL_AMD_shader_atomic_counter_ops"); + GLAD_AMD_shader_stencil_export = has_ext("GL_AMD_shader_stencil_export"); + GLAD_AMD_shader_trinary_minmax = has_ext("GL_AMD_shader_trinary_minmax"); + GLAD_AMD_sparse_texture = has_ext("GL_AMD_sparse_texture"); + GLAD_AMD_stencil_operation_extended = has_ext("GL_AMD_stencil_operation_extended"); + GLAD_AMD_texture_texture4 = has_ext("GL_AMD_texture_texture4"); + GLAD_AMD_transform_feedback3_lines_triangles = has_ext("GL_AMD_transform_feedback3_lines_triangles"); + GLAD_AMD_vertex_shader_layer = has_ext("GL_AMD_vertex_shader_layer"); + GLAD_AMD_vertex_shader_tessellator = has_ext("GL_AMD_vertex_shader_tessellator"); + GLAD_AMD_vertex_shader_viewport_index = has_ext("GL_AMD_vertex_shader_viewport_index"); + GLAD_ANGLE_depth_texture = has_ext("GL_ANGLE_depth_texture"); + GLAD_ANGLE_framebuffer_blit = has_ext("GL_ANGLE_framebuffer_blit"); + GLAD_ANGLE_framebuffer_multisample = has_ext("GL_ANGLE_framebuffer_multisample"); + GLAD_ANGLE_instanced_arrays = has_ext("GL_ANGLE_instanced_arrays"); + GLAD_ANGLE_pack_reverse_row_order = has_ext("GL_ANGLE_pack_reverse_row_order"); + GLAD_ANGLE_program_binary = has_ext("GL_ANGLE_program_binary"); + GLAD_ANGLE_texture_compression_dxt3 = has_ext("GL_ANGLE_texture_compression_dxt3"); + GLAD_ANGLE_texture_compression_dxt5 = has_ext("GL_ANGLE_texture_compression_dxt5"); + GLAD_ANGLE_texture_usage = has_ext("GL_ANGLE_texture_usage"); + GLAD_ANGLE_translated_shader_source = has_ext("GL_ANGLE_translated_shader_source"); + GLAD_APPLE_aux_depth_stencil = has_ext("GL_APPLE_aux_depth_stencil"); + GLAD_APPLE_client_storage = has_ext("GL_APPLE_client_storage"); + GLAD_APPLE_copy_texture_levels = has_ext("GL_APPLE_copy_texture_levels"); + GLAD_APPLE_element_array = has_ext("GL_APPLE_element_array"); + GLAD_APPLE_fence = has_ext("GL_APPLE_fence"); + GLAD_APPLE_float_pixels = has_ext("GL_APPLE_float_pixels"); + GLAD_APPLE_flush_buffer_range = has_ext("GL_APPLE_flush_buffer_range"); + GLAD_APPLE_framebuffer_multisample = has_ext("GL_APPLE_framebuffer_multisample"); + GLAD_APPLE_object_purgeable = has_ext("GL_APPLE_object_purgeable"); + GLAD_APPLE_rgb_422 = has_ext("GL_APPLE_rgb_422"); + GLAD_APPLE_row_bytes = has_ext("GL_APPLE_row_bytes"); + GLAD_APPLE_specular_vector = has_ext("GL_APPLE_specular_vector"); + GLAD_APPLE_sync = has_ext("GL_APPLE_sync"); + GLAD_APPLE_texture_format_BGRA8888 = has_ext("GL_APPLE_texture_format_BGRA8888"); + GLAD_APPLE_texture_max_level = has_ext("GL_APPLE_texture_max_level"); + GLAD_APPLE_texture_range = has_ext("GL_APPLE_texture_range"); + GLAD_APPLE_transform_hint = has_ext("GL_APPLE_transform_hint"); + GLAD_APPLE_vertex_array_object = has_ext("GL_APPLE_vertex_array_object"); + GLAD_APPLE_vertex_array_range = has_ext("GL_APPLE_vertex_array_range"); + GLAD_APPLE_vertex_program_evaluators = has_ext("GL_APPLE_vertex_program_evaluators"); + GLAD_APPLE_ycbcr_422 = has_ext("GL_APPLE_ycbcr_422"); + GLAD_ARM_mali_program_binary = has_ext("GL_ARM_mali_program_binary"); + GLAD_ARM_mali_shader_binary = has_ext("GL_ARM_mali_shader_binary"); + GLAD_ARM_rgba8 = has_ext("GL_ARM_rgba8"); + GLAD_ATI_draw_buffers = has_ext("GL_ATI_draw_buffers"); + GLAD_ATI_element_array = has_ext("GL_ATI_element_array"); + GLAD_ATI_envmap_bumpmap = has_ext("GL_ATI_envmap_bumpmap"); + GLAD_ATI_fragment_shader = has_ext("GL_ATI_fragment_shader"); + GLAD_ATI_map_object_buffer = has_ext("GL_ATI_map_object_buffer"); + GLAD_ATI_meminfo = has_ext("GL_ATI_meminfo"); + GLAD_ATI_pixel_format_float = has_ext("GL_ATI_pixel_format_float"); + GLAD_ATI_pn_triangles = has_ext("GL_ATI_pn_triangles"); + GLAD_ATI_separate_stencil = has_ext("GL_ATI_separate_stencil"); + GLAD_ATI_text_fragment_shader = has_ext("GL_ATI_text_fragment_shader"); + GLAD_ATI_texture_env_combine3 = has_ext("GL_ATI_texture_env_combine3"); + GLAD_ATI_texture_float = has_ext("GL_ATI_texture_float"); + GLAD_ATI_texture_mirror_once = has_ext("GL_ATI_texture_mirror_once"); + GLAD_ATI_vertex_array_object = has_ext("GL_ATI_vertex_array_object"); + GLAD_ATI_vertex_attrib_array_object = has_ext("GL_ATI_vertex_attrib_array_object"); + GLAD_ATI_vertex_streams = has_ext("GL_ATI_vertex_streams"); + GLAD_DMP_shader_binary = has_ext("GL_DMP_shader_binary"); + GLAD_FJ_shader_binary_GCCSO = has_ext("GL_FJ_shader_binary_GCCSO"); + GLAD_GREMEDY_frame_terminator = has_ext("GL_GREMEDY_frame_terminator"); + GLAD_GREMEDY_string_marker = has_ext("GL_GREMEDY_string_marker"); + GLAD_IBM_rasterpos_clip = has_ext("GL_IBM_rasterpos_clip"); + GLAD_IMG_multisampled_render_to_texture = has_ext("GL_IMG_multisampled_render_to_texture"); + GLAD_IMG_program_binary = has_ext("GL_IMG_program_binary"); + GLAD_IMG_read_format = has_ext("GL_IMG_read_format"); + GLAD_IMG_shader_binary = has_ext("GL_IMG_shader_binary"); + GLAD_IMG_texture_compression_pvrtc = has_ext("GL_IMG_texture_compression_pvrtc"); + GLAD_IMG_texture_compression_pvrtc2 = has_ext("GL_IMG_texture_compression_pvrtc2"); + GLAD_INGR_blend_func_separate = has_ext("GL_INGR_blend_func_separate"); + GLAD_INTEL_fragment_shader_ordering = has_ext("GL_INTEL_fragment_shader_ordering"); + GLAD_INTEL_map_texture = has_ext("GL_INTEL_map_texture"); + GLAD_INTEL_parallel_arrays = has_ext("GL_INTEL_parallel_arrays"); + GLAD_MESA_pack_invert = has_ext("GL_MESA_pack_invert"); + GLAD_MESA_resize_buffers = has_ext("GL_MESA_resize_buffers"); + GLAD_MESA_window_pos = has_ext("GL_MESA_window_pos"); + GLAD_MESA_ycbcr_texture = has_ext("GL_MESA_ycbcr_texture"); + GLAD_MESAX_texture_stack = has_ext("GL_MESAX_texture_stack"); + GLAD_NV_bindless_multi_draw_indirect = has_ext("GL_NV_bindless_multi_draw_indirect"); + GLAD_NV_bindless_texture = has_ext("GL_NV_bindless_texture"); + GLAD_NV_blend_equation_advanced = has_ext("GL_NV_blend_equation_advanced"); + GLAD_NV_blend_equation_advanced_coherent = has_ext("GL_NV_blend_equation_advanced_coherent"); + GLAD_NV_blend_square = has_ext("GL_NV_blend_square"); + GLAD_NV_compute_program5 = has_ext("GL_NV_compute_program5"); + GLAD_NV_conditional_render = has_ext("GL_NV_conditional_render"); + GLAD_NV_copy_buffer = has_ext("GL_NV_copy_buffer"); + GLAD_NV_copy_depth_to_color = has_ext("GL_NV_copy_depth_to_color"); + GLAD_NV_copy_image = has_ext("GL_NV_copy_image"); + GLAD_NV_coverage_sample = has_ext("GL_NV_coverage_sample"); + GLAD_NV_deep_texture3D = has_ext("GL_NV_deep_texture3D"); + GLAD_NV_depth_buffer_float = has_ext("GL_NV_depth_buffer_float"); + GLAD_NV_depth_clamp = has_ext("GL_NV_depth_clamp"); + GLAD_NV_depth_nonlinear = has_ext("GL_NV_depth_nonlinear"); + GLAD_NV_draw_buffers = has_ext("GL_NV_draw_buffers"); + GLAD_NV_draw_instanced = has_ext("GL_NV_draw_instanced"); + GLAD_NV_draw_texture = has_ext("GL_NV_draw_texture"); + GLAD_NV_evaluators = has_ext("GL_NV_evaluators"); + GLAD_NV_explicit_attrib_location = has_ext("GL_NV_explicit_attrib_location"); + GLAD_NV_explicit_multisample = has_ext("GL_NV_explicit_multisample"); + GLAD_NV_fbo_color_attachments = has_ext("GL_NV_fbo_color_attachments"); + GLAD_NV_fence = has_ext("GL_NV_fence"); + GLAD_NV_float_buffer = has_ext("GL_NV_float_buffer"); + GLAD_NV_fog_distance = has_ext("GL_NV_fog_distance"); + GLAD_NV_fragment_program = has_ext("GL_NV_fragment_program"); + GLAD_NV_fragment_program2 = has_ext("GL_NV_fragment_program2"); + GLAD_NV_fragment_program4 = has_ext("GL_NV_fragment_program4"); + GLAD_NV_fragment_program_option = has_ext("GL_NV_fragment_program_option"); + GLAD_NV_framebuffer_blit = has_ext("GL_NV_framebuffer_blit"); + GLAD_NV_framebuffer_multisample = has_ext("GL_NV_framebuffer_multisample"); + GLAD_NV_framebuffer_multisample_coverage = has_ext("GL_NV_framebuffer_multisample_coverage"); + GLAD_NV_generate_mipmap_sRGB = has_ext("GL_NV_generate_mipmap_sRGB"); + GLAD_NV_geometry_program4 = has_ext("GL_NV_geometry_program4"); + GLAD_NV_geometry_shader4 = has_ext("GL_NV_geometry_shader4"); + GLAD_NV_gpu_program4 = has_ext("GL_NV_gpu_program4"); + GLAD_NV_gpu_program5 = has_ext("GL_NV_gpu_program5"); + GLAD_NV_gpu_program5_mem_extended = has_ext("GL_NV_gpu_program5_mem_extended"); + GLAD_NV_gpu_shader5 = has_ext("GL_NV_gpu_shader5"); + GLAD_NV_half_float = has_ext("GL_NV_half_float"); + GLAD_NV_instanced_arrays = has_ext("GL_NV_instanced_arrays"); + GLAD_NV_light_max_exponent = has_ext("GL_NV_light_max_exponent"); + GLAD_NV_multisample_coverage = has_ext("GL_NV_multisample_coverage"); + GLAD_NV_multisample_filter_hint = has_ext("GL_NV_multisample_filter_hint"); + GLAD_NV_non_square_matrices = has_ext("GL_NV_non_square_matrices"); + GLAD_NV_occlusion_query = has_ext("GL_NV_occlusion_query"); + GLAD_NV_packed_depth_stencil = has_ext("GL_NV_packed_depth_stencil"); + GLAD_NV_parameter_buffer_object = has_ext("GL_NV_parameter_buffer_object"); + GLAD_NV_parameter_buffer_object2 = has_ext("GL_NV_parameter_buffer_object2"); + GLAD_NV_path_rendering = has_ext("GL_NV_path_rendering"); + GLAD_NV_pixel_data_range = has_ext("GL_NV_pixel_data_range"); + GLAD_NV_point_sprite = has_ext("GL_NV_point_sprite"); + GLAD_NV_present_video = has_ext("GL_NV_present_video"); + GLAD_NV_primitive_restart = has_ext("GL_NV_primitive_restart"); + GLAD_NV_read_buffer = has_ext("GL_NV_read_buffer"); + GLAD_NV_read_buffer_front = has_ext("GL_NV_read_buffer_front"); + GLAD_NV_read_depth = has_ext("GL_NV_read_depth"); + GLAD_NV_read_depth_stencil = has_ext("GL_NV_read_depth_stencil"); + GLAD_NV_read_stencil = has_ext("GL_NV_read_stencil"); + GLAD_NV_register_combiners = has_ext("GL_NV_register_combiners"); + GLAD_NV_register_combiners2 = has_ext("GL_NV_register_combiners2"); + GLAD_NV_shader_atomic_counters = has_ext("GL_NV_shader_atomic_counters"); + GLAD_NV_shader_atomic_float = has_ext("GL_NV_shader_atomic_float"); + GLAD_NV_shader_buffer_load = has_ext("GL_NV_shader_buffer_load"); + GLAD_NV_shader_buffer_store = has_ext("GL_NV_shader_buffer_store"); + GLAD_NV_shader_storage_buffer_object = has_ext("GL_NV_shader_storage_buffer_object"); + GLAD_NV_shadow_samplers_array = has_ext("GL_NV_shadow_samplers_array"); + GLAD_NV_shadow_samplers_cube = has_ext("GL_NV_shadow_samplers_cube"); + GLAD_NV_sRGB_formats = has_ext("GL_NV_sRGB_formats"); + GLAD_NV_tessellation_program5 = has_ext("GL_NV_tessellation_program5"); + GLAD_NV_texgen_emboss = has_ext("GL_NV_texgen_emboss"); + GLAD_NV_texgen_reflection = has_ext("GL_NV_texgen_reflection"); + GLAD_NV_texture_barrier = has_ext("GL_NV_texture_barrier"); + GLAD_NV_texture_border_clamp = has_ext("GL_NV_texture_border_clamp"); + GLAD_NV_texture_compression_s3tc_update = has_ext("GL_NV_texture_compression_s3tc_update"); + GLAD_NV_texture_compression_vtc = has_ext("GL_NV_texture_compression_vtc"); + GLAD_NV_texture_env_combine4 = has_ext("GL_NV_texture_env_combine4"); + GLAD_NV_texture_expand_normal = has_ext("GL_NV_texture_expand_normal"); + GLAD_NV_texture_multisample = has_ext("GL_NV_texture_multisample"); + GLAD_NV_texture_npot_2D_mipmap = has_ext("GL_NV_texture_npot_2D_mipmap"); + GLAD_NV_texture_rectangle = has_ext("GL_NV_texture_rectangle"); + GLAD_NV_texture_shader = has_ext("GL_NV_texture_shader"); + GLAD_NV_texture_shader2 = has_ext("GL_NV_texture_shader2"); + GLAD_NV_texture_shader3 = has_ext("GL_NV_texture_shader3"); + GLAD_NV_transform_feedback = has_ext("GL_NV_transform_feedback"); + GLAD_NV_transform_feedback2 = has_ext("GL_NV_transform_feedback2"); + GLAD_NV_vdpau_interop = has_ext("GL_NV_vdpau_interop"); + GLAD_NV_vertex_array_range = has_ext("GL_NV_vertex_array_range"); + GLAD_NV_vertex_array_range2 = has_ext("GL_NV_vertex_array_range2"); + GLAD_NV_vertex_attrib_integer_64bit = has_ext("GL_NV_vertex_attrib_integer_64bit"); + GLAD_NV_vertex_buffer_unified_memory = has_ext("GL_NV_vertex_buffer_unified_memory"); + GLAD_NV_vertex_program = has_ext("GL_NV_vertex_program"); + GLAD_NV_vertex_program1_1 = has_ext("GL_NV_vertex_program1_1"); + GLAD_NV_vertex_program2 = has_ext("GL_NV_vertex_program2"); + GLAD_NV_vertex_program2_option = has_ext("GL_NV_vertex_program2_option"); + GLAD_NV_vertex_program3 = has_ext("GL_NV_vertex_program3"); + GLAD_NV_vertex_program4 = has_ext("GL_NV_vertex_program4"); + GLAD_NV_video_capture = has_ext("GL_NV_video_capture"); + GLAD_NVX_conditional_render = has_ext("GL_NVX_conditional_render"); + GLAD_OML_interlace = has_ext("GL_OML_interlace"); + GLAD_OML_resample = has_ext("GL_OML_resample"); + GLAD_OML_subsample = has_ext("GL_OML_subsample"); + GLAD_PGI_misc_hints = has_ext("GL_PGI_misc_hints"); + GLAD_PGI_vertex_hints = has_ext("GL_PGI_vertex_hints"); + GLAD_QCOM_alpha_test = has_ext("GL_QCOM_alpha_test"); + GLAD_QCOM_binning_control = has_ext("GL_QCOM_binning_control"); + GLAD_QCOM_driver_control = has_ext("GL_QCOM_driver_control"); + GLAD_QCOM_extended_get = has_ext("GL_QCOM_extended_get"); + GLAD_QCOM_extended_get2 = has_ext("GL_QCOM_extended_get2"); + GLAD_QCOM_perfmon_global_mode = has_ext("GL_QCOM_perfmon_global_mode"); + GLAD_QCOM_tiled_rendering = has_ext("GL_QCOM_tiled_rendering"); + GLAD_QCOM_writeonly_rendering = has_ext("GL_QCOM_writeonly_rendering"); + GLAD_REND_screen_coordinates = has_ext("GL_REND_screen_coordinates"); + GLAD_S3_s3tc = has_ext("GL_S3_s3tc"); + GLAD_SGIS_generate_mipmap = has_ext("GL_SGIS_generate_mipmap"); + GLAD_SGIX_texture_lod_bias = has_ext("GL_SGIX_texture_lod_bias"); + GLAD_VIV_shader_binary = has_ext("GL_VIV_shader_binary"); +} + +static void find_core(void) { + const char *v = (const char *)fp_glGetString(GL_VERSION); + int major = v[0] - '0', minor = v[2] - '0', gles = false; + GLVersion.gles = false; + if (strstr(v, "OpenGL ES ") == v) { + major = v[10] - '0'; minor = v[12] - '0'; gles = true; + } + GLVersion.major = major; GLVersion.minor = minor; GLVersion.gles = gles; + GLAD_VERSION_1_0 = gles == 0 && ((major == 1 && minor >= 0) || major > 1); + GLAD_VERSION_1_1 = gles == 0 && ((major == 1 && minor >= 1) || major > 1); + GLAD_VERSION_1_2 = gles == 0 && ((major == 1 && minor >= 2) || major > 1); + GLAD_VERSION_1_3 = gles == 0 && ((major == 1 && minor >= 3) || major > 1); + GLAD_VERSION_1_4 = gles == 0 && ((major == 1 && minor >= 4) || major > 1); + GLAD_VERSION_1_5 = gles == 0 && ((major == 1 && minor >= 5) || major > 1); + GLAD_VERSION_2_0 = gles == 0 && ((major == 2 && minor >= 0) || major > 2); + GLAD_VERSION_2_1 = gles == 0 && ((major == 2 && minor >= 1) || major > 2); + GLAD_VERSION_3_0 = gles == 0 && ((major == 3 && minor >= 0) || major > 3); + GLAD_VERSION_3_1 = gles == 0 && ((major == 3 && minor >= 1) || major > 3); + GLAD_VERSION_3_2 = gles == 0 && ((major == 3 && minor >= 2) || major > 3); + GLAD_VERSION_3_3 = gles == 0 && ((major == 3 && minor >= 3) || major > 3); + GLAD_VERSION_4_0 = gles == 0 && ((major == 4 && minor >= 0) || major > 4); + GLAD_VERSION_4_1 = gles == 0 && ((major == 4 && minor >= 1) || major > 4); + GLAD_VERSION_4_2 = gles == 0 && ((major == 4 && minor >= 2) || major > 4); + GLAD_VERSION_4_3 = gles == 0 && ((major == 4 && minor >= 3) || major > 4); + GLAD_VERSION_4_4 = gles == 0 && ((major == 4 && minor >= 4) || major > 4); + GLAD_ES_VERSION_2_0 = gles == 1 && ((major == 2 && minor >= 0) || major > 2); + GLAD_ES_VERSION_3_0 = gles == 1 && ((major == 3 && minor >= 0) || major > 3); +} + +bool gladLoadGLLoader(LOADER load) { + GLVersion.major = 0; GLVersion.minor = 0; GLVersion.gles = 0; + fp_glGetString = (pfn_glGetString)load("glGetString"); + if(fp_glGetString == NULL) return false; + find_core(); + load_GL_VERSION_1_0(load); + load_GL_VERSION_1_1(load); + load_GL_VERSION_1_2(load); + load_GL_VERSION_1_3(load); + load_GL_VERSION_1_4(load); + load_GL_VERSION_1_5(load); + load_GL_VERSION_2_0(load); + load_GL_VERSION_2_1(load); + load_GL_VERSION_3_0(load); + load_GL_VERSION_3_1(load); + load_GL_VERSION_3_2(load); + load_GL_VERSION_3_3(load); + load_GL_VERSION_4_0(load); + load_GL_VERSION_4_1(load); + load_GL_VERSION_4_2(load); + load_GL_VERSION_4_3(load); + load_GL_VERSION_4_4(load); + load_GL_ES_VERSION_2_0(load); + load_GL_ES_VERSION_3_0(load); + + find_extensions(); + load_GL_KHR_debug(load); + load_GL_ARB_base_instance(load); + load_GL_ARB_bindless_texture(load); + load_GL_ARB_blend_func_extended(load); + load_GL_ARB_buffer_storage(load); + load_GL_ARB_cl_event(load); + load_GL_ARB_clear_buffer_object(load); + load_GL_ARB_clear_texture(load); + load_GL_ARB_color_buffer_float(load); + load_GL_ARB_compute_shader(load); + load_GL_ARB_compute_variable_group_size(load); + load_GL_ARB_copy_buffer(load); + load_GL_ARB_copy_image(load); + load_GL_ARB_debug_output(load); + load_GL_ARB_draw_buffers(load); + load_GL_ARB_draw_buffers_blend(load); + load_GL_ARB_draw_elements_base_vertex(load); + load_GL_ARB_draw_indirect(load); + load_GL_ARB_draw_instanced(load); + load_GL_ARB_ES2_compatibility(load); + load_GL_ARB_fragment_program(load); + load_GL_ARB_framebuffer_no_attachments(load); + load_GL_ARB_framebuffer_object(load); + load_GL_ARB_geometry_shader4(load); + load_GL_ARB_get_program_binary(load); + load_GL_ARB_gpu_shader_fp64(load); + load_GL_ARB_indirect_parameters(load); + load_GL_ARB_instanced_arrays(load); + load_GL_ARB_internalformat_query(load); + load_GL_ARB_internalformat_query2(load); + load_GL_ARB_invalidate_subdata(load); + load_GL_ARB_map_buffer_range(load); + load_GL_ARB_matrix_palette(load); + load_GL_ARB_multi_bind(load); + load_GL_ARB_multi_draw_indirect(load); + load_GL_ARB_multisample(load); + load_GL_ARB_multitexture(load); + load_GL_ARB_occlusion_query(load); + load_GL_ARB_point_parameters(load); + load_GL_ARB_program_interface_query(load); + load_GL_ARB_provoking_vertex(load); + load_GL_ARB_robustness(load); + load_GL_ARB_sample_shading(load); + load_GL_ARB_sampler_objects(load); + load_GL_ARB_separate_shader_objects(load); + load_GL_ARB_shader_atomic_counters(load); + load_GL_ARB_shader_image_load_store(load); + load_GL_ARB_shader_objects(load); + load_GL_ARB_shader_storage_buffer_object(load); + load_GL_ARB_shader_subroutine(load); + load_GL_ARB_shading_language_include(load); + load_GL_ARB_sparse_texture(load); + load_GL_ARB_sync(load); + load_GL_ARB_tessellation_shader(load); + load_GL_ARB_texture_buffer_object(load); + load_GL_ARB_texture_buffer_range(load); + load_GL_ARB_texture_compression(load); + load_GL_ARB_texture_multisample(load); + load_GL_ARB_texture_storage(load); + load_GL_ARB_texture_storage_multisample(load); + load_GL_ARB_texture_view(load); + load_GL_ARB_timer_query(load); + load_GL_ARB_transform_feedback2(load); + load_GL_ARB_transform_feedback3(load); + load_GL_ARB_transform_feedback_instanced(load); + load_GL_ARB_transpose_matrix(load); + load_GL_ARB_uniform_buffer_object(load); + load_GL_ARB_vertex_array_object(load); + load_GL_ARB_vertex_attrib_64bit(load); + load_GL_ARB_vertex_attrib_binding(load); + load_GL_ARB_vertex_blend(load); + load_GL_ARB_vertex_buffer_object(load); + load_GL_ARB_vertex_program(load); + load_GL_ARB_vertex_shader(load); + load_GL_ARB_vertex_type_2_10_10_10_rev(load); + load_GL_ARB_viewport_array(load); + load_GL_ARB_window_pos(load); + load_GL_EXT_bindable_uniform(load); + load_GL_EXT_blend_color(load); + load_GL_EXT_blend_equation_separate(load); + load_GL_EXT_blend_func_separate(load); + load_GL_EXT_blend_minmax(load); + load_GL_EXT_color_subtable(load); + load_GL_EXT_compiled_vertex_array(load); + load_GL_EXT_convolution(load); + load_GL_EXT_coordinate_frame(load); + load_GL_EXT_cull_vertex(load); + load_GL_EXT_debug_label(load); + load_GL_EXT_debug_marker(load); + load_GL_EXT_depth_bounds_test(load); + load_GL_EXT_direct_state_access(load); + load_GL_EXT_discard_framebuffer(load); + load_GL_EXT_disjoint_timer_query(load); + load_GL_EXT_draw_buffers(load); + load_GL_EXT_draw_buffers2(load); + load_GL_EXT_draw_instanced(load); + load_GL_EXT_fog_coord(load); + load_GL_EXT_framebuffer_blit(load); + load_GL_EXT_framebuffer_multisample(load); + load_GL_EXT_framebuffer_object(load); + load_GL_EXT_geometry_shader4(load); + load_GL_EXT_gpu_program_parameters(load); + load_GL_EXT_gpu_shader4(load); + load_GL_EXT_histogram(load); + load_GL_EXT_index_func(load); + load_GL_EXT_index_material(load); + load_GL_EXT_instanced_arrays(load); + load_GL_EXT_light_texture(load); + load_GL_EXT_map_buffer_range(load); + load_GL_EXT_multi_draw_arrays(load); + load_GL_EXT_multisample(load); + load_GL_EXT_multisampled_render_to_texture(load); + load_GL_EXT_multiview_draw_buffers(load); + load_GL_EXT_occlusion_query_boolean(load); + load_GL_EXT_paletted_texture(load); + load_GL_EXT_pixel_transform(load); + load_GL_EXT_point_parameters(load); + load_GL_EXT_provoking_vertex(load); + load_GL_EXT_robustness(load); + load_GL_EXT_secondary_color(load); + load_GL_EXT_separate_shader_objects(load); + load_GL_EXT_shader_image_load_store(load); + load_GL_EXT_stencil_clear_tag(load); + load_GL_EXT_stencil_two_side(load); + load_GL_EXT_texture_buffer_object(load); + load_GL_EXT_texture_integer(load); + load_GL_EXT_texture_perturb_normal(load); + load_GL_EXT_texture_storage(load); + load_GL_EXT_timer_query(load); + load_GL_EXT_transform_feedback(load); + load_GL_EXT_vertex_attrib_64bit(load); + load_GL_EXT_vertex_shader(load); + load_GL_EXT_vertex_weighting(load); + load_GL_EXT_x11_sync_object(load); + load_GL_OES_byte_coordinates(load); + load_GL_OES_EGL_image(load); + load_GL_OES_fixed_point(load); + load_GL_OES_get_program_binary(load); + load_GL_OES_mapbuffer(load); + load_GL_OES_query_matrix(load); + load_GL_OES_single_precision(load); + load_GL_OES_texture_3D(load); + load_GL_OES_vertex_array_object(load); + load_GL_AMD_debug_output(load); + load_GL_AMD_draw_buffers_blend(load); + load_GL_AMD_interleaved_elements(load); + load_GL_AMD_multi_draw_indirect(load); + load_GL_AMD_name_gen_delete(load); + load_GL_AMD_performance_monitor(load); + load_GL_AMD_sample_positions(load); + load_GL_AMD_sparse_texture(load); + load_GL_AMD_stencil_operation_extended(load); + load_GL_AMD_vertex_shader_tessellator(load); + load_GL_ANGLE_framebuffer_blit(load); + load_GL_ANGLE_framebuffer_multisample(load); + load_GL_ANGLE_instanced_arrays(load); + load_GL_ANGLE_translated_shader_source(load); + load_GL_APPLE_copy_texture_levels(load); + load_GL_APPLE_element_array(load); + load_GL_APPLE_fence(load); + load_GL_APPLE_flush_buffer_range(load); + load_GL_APPLE_framebuffer_multisample(load); + load_GL_APPLE_object_purgeable(load); + load_GL_APPLE_sync(load); + load_GL_APPLE_texture_range(load); + load_GL_APPLE_vertex_array_object(load); + load_GL_APPLE_vertex_array_range(load); + load_GL_APPLE_vertex_program_evaluators(load); + load_GL_ATI_draw_buffers(load); + load_GL_ATI_element_array(load); + load_GL_ATI_envmap_bumpmap(load); + load_GL_ATI_fragment_shader(load); + load_GL_ATI_map_object_buffer(load); + load_GL_ATI_pn_triangles(load); + load_GL_ATI_separate_stencil(load); + load_GL_ATI_vertex_array_object(load); + load_GL_ATI_vertex_attrib_array_object(load); + load_GL_ATI_vertex_streams(load); + load_GL_GREMEDY_frame_terminator(load); + load_GL_GREMEDY_string_marker(load); + load_GL_IMG_multisampled_render_to_texture(load); + load_GL_INGR_blend_func_separate(load); + load_GL_INTEL_map_texture(load); + load_GL_INTEL_parallel_arrays(load); + load_GL_MESA_resize_buffers(load); + load_GL_MESA_window_pos(load); + load_GL_NV_bindless_multi_draw_indirect(load); + load_GL_NV_bindless_texture(load); + load_GL_NV_blend_equation_advanced(load); + load_GL_NV_conditional_render(load); + load_GL_NV_copy_buffer(load); + load_GL_NV_copy_image(load); + load_GL_NV_coverage_sample(load); + load_GL_NV_depth_buffer_float(load); + load_GL_NV_draw_buffers(load); + load_GL_NV_draw_instanced(load); + load_GL_NV_draw_texture(load); + load_GL_NV_evaluators(load); + load_GL_NV_explicit_multisample(load); + load_GL_NV_fence(load); + load_GL_NV_fragment_program(load); + load_GL_NV_framebuffer_blit(load); + load_GL_NV_framebuffer_multisample(load); + load_GL_NV_framebuffer_multisample_coverage(load); + load_GL_NV_geometry_program4(load); + load_GL_NV_gpu_program4(load); + load_GL_NV_gpu_program5(load); + load_GL_NV_gpu_shader5(load); + load_GL_NV_half_float(load); + load_GL_NV_instanced_arrays(load); + load_GL_NV_non_square_matrices(load); + load_GL_NV_occlusion_query(load); + load_GL_NV_parameter_buffer_object(load); + load_GL_NV_path_rendering(load); + load_GL_NV_pixel_data_range(load); + load_GL_NV_point_sprite(load); + load_GL_NV_present_video(load); + load_GL_NV_primitive_restart(load); + load_GL_NV_read_buffer(load); + load_GL_NV_register_combiners(load); + load_GL_NV_register_combiners2(load); + load_GL_NV_shader_buffer_load(load); + load_GL_NV_texture_barrier(load); + load_GL_NV_texture_multisample(load); + load_GL_NV_transform_feedback(load); + load_GL_NV_transform_feedback2(load); + load_GL_NV_vdpau_interop(load); + load_GL_NV_vertex_array_range(load); + load_GL_NV_vertex_attrib_integer_64bit(load); + load_GL_NV_vertex_buffer_unified_memory(load); + load_GL_NV_vertex_program(load); + load_GL_NV_vertex_program4(load); + load_GL_NV_video_capture(load); + load_GL_NVX_conditional_render(load); + load_GL_PGI_misc_hints(load); + load_GL_QCOM_alpha_test(load); + load_GL_QCOM_driver_control(load); + load_GL_QCOM_extended_get(load); + load_GL_QCOM_extended_get2(load); + load_GL_QCOM_tiled_rendering(load); + return true; +} + +} /* namespace glad */ diff --git a/jni/love/src/libraries/glad/glad.hpp b/jni/love/src/libraries/glad/glad.hpp new file mode 100644 index 00000000..3914de5e --- /dev/null +++ b/jni/love/src/libraries/glad/glad.hpp @@ -0,0 +1,11142 @@ + +/** + * The MIT License (MIT) + * + * Copyright (c) 2013 David Herberth, modified by Alex Szpakowski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **/ + + +#ifndef __glad_hpp_ + +#if defined(__gl_h_) || defined(__glext_h_) || defined(__glcorearb_h_) \ + || defined(__gl3_h) || defined(__gl3_ext_h) +#error OpenGL header already included, remove this include, glad already provides it +#endif + +#define __glad_hpp_ +#define __gl_h_ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include + +#ifdef near +#undef near +#endif + +#ifdef far +#undef far +#endif + +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +namespace glad { + +bool gladLoadGL(void); + +typedef void* (* LOADER)(const char *name); +bool gladLoadGLLoader(LOADER); + + +#include +#ifndef GLEXT_64_TYPES_DEFINED +/* This code block is duplicated in glxext.h, so must be protected */ +#define GLEXT_64_TYPES_DEFINED +/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ +/* (as used in the GL_EXT_timer_query extension). */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(__sun__) || defined(__digital__) +#include +#if defined(__STDC__) +#if defined(__arch64__) || defined(_LP64) +typedef long int int64_t; +typedef unsigned long int uint64_t; +#else +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#endif /* __arch64__ */ +#endif /* __STDC__ */ +#elif defined( __VMS ) || defined(__sgi) +#include +#elif defined(__SCO__) || defined(__USLC__) +#include +#elif defined(__UNIXOS2__) || defined(__SOL64__) +typedef long int int32_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif +#endif +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef signed char GLbyte; +typedef short GLshort; +typedef int GLint; +typedef int GLclampx; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned int GLuint; +typedef int GLsizei; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef unsigned short GLhalfARB; +typedef unsigned short GLhalf; +typedef GLint GLfixed; +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; +typedef int64_t GLint64; +typedef uint64_t GLuint64; +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; +typedef int64_t GLint64EXT; +typedef uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void ( *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void ( *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void ( *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void ( *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; + + /* GL_VERSION_1_0 */ +extern GLboolean GLAD_VERSION_1_0; +typedef void (APIENTRYP pfn_glCullFace) (GLenum); +extern pfn_glCullFace fp_glCullFace; +typedef void (APIENTRYP pfn_glFrontFace) (GLenum); +extern pfn_glFrontFace fp_glFrontFace; +typedef void (APIENTRYP pfn_glHint) (GLenum, GLenum); +extern pfn_glHint fp_glHint; +typedef void (APIENTRYP pfn_glLineWidth) (GLfloat); +extern pfn_glLineWidth fp_glLineWidth; +typedef void (APIENTRYP pfn_glPointSize) (GLfloat); +extern pfn_glPointSize fp_glPointSize; +typedef void (APIENTRYP pfn_glPolygonMode) (GLenum, GLenum); +extern pfn_glPolygonMode fp_glPolygonMode; +typedef void (APIENTRYP pfn_glScissor) (GLint, GLint, GLsizei, GLsizei); +extern pfn_glScissor fp_glScissor; +typedef void (APIENTRYP pfn_glTexParameterf) (GLenum, GLenum, GLfloat); +extern pfn_glTexParameterf fp_glTexParameterf; +typedef void (APIENTRYP pfn_glTexParameterfv) (GLenum, GLenum, const GLfloat*); +extern pfn_glTexParameterfv fp_glTexParameterfv; +typedef void (APIENTRYP pfn_glTexParameteri) (GLenum, GLenum, GLint); +extern pfn_glTexParameteri fp_glTexParameteri; +typedef void (APIENTRYP pfn_glTexParameteriv) (GLenum, GLenum, const GLint*); +extern pfn_glTexParameteriv fp_glTexParameteriv; +typedef void (APIENTRYP pfn_glTexImage1D) (GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glTexImage1D fp_glTexImage1D; +typedef void (APIENTRYP pfn_glTexImage2D) (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glTexImage2D fp_glTexImage2D; +typedef void (APIENTRYP pfn_glDrawBuffer) (GLenum); +extern pfn_glDrawBuffer fp_glDrawBuffer; +typedef void (APIENTRYP pfn_glClear) (GLbitfield); +extern pfn_glClear fp_glClear; +typedef void (APIENTRYP pfn_glClearColor) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glClearColor fp_glClearColor; +typedef void (APIENTRYP pfn_glClearStencil) (GLint); +extern pfn_glClearStencil fp_glClearStencil; +typedef void (APIENTRYP pfn_glClearDepth) (GLdouble); +extern pfn_glClearDepth fp_glClearDepth; +typedef void (APIENTRYP pfn_glStencilMask) (GLuint); +extern pfn_glStencilMask fp_glStencilMask; +typedef void (APIENTRYP pfn_glColorMask) (GLboolean, GLboolean, GLboolean, GLboolean); +extern pfn_glColorMask fp_glColorMask; +typedef void (APIENTRYP pfn_glDepthMask) (GLboolean); +extern pfn_glDepthMask fp_glDepthMask; +typedef void (APIENTRYP pfn_glDisable) (GLenum); +extern pfn_glDisable fp_glDisable; +typedef void (APIENTRYP pfn_glEnable) (GLenum); +extern pfn_glEnable fp_glEnable; +typedef void (APIENTRYP pfn_glFinish) (); +extern pfn_glFinish fp_glFinish; +typedef void (APIENTRYP pfn_glFlush) (); +extern pfn_glFlush fp_glFlush; +typedef void (APIENTRYP pfn_glBlendFunc) (GLenum, GLenum); +extern pfn_glBlendFunc fp_glBlendFunc; +typedef void (APIENTRYP pfn_glLogicOp) (GLenum); +extern pfn_glLogicOp fp_glLogicOp; +typedef void (APIENTRYP pfn_glStencilFunc) (GLenum, GLint, GLuint); +extern pfn_glStencilFunc fp_glStencilFunc; +typedef void (APIENTRYP pfn_glStencilOp) (GLenum, GLenum, GLenum); +extern pfn_glStencilOp fp_glStencilOp; +typedef void (APIENTRYP pfn_glDepthFunc) (GLenum); +extern pfn_glDepthFunc fp_glDepthFunc; +typedef void (APIENTRYP pfn_glPixelStoref) (GLenum, GLfloat); +extern pfn_glPixelStoref fp_glPixelStoref; +typedef void (APIENTRYP pfn_glPixelStorei) (GLenum, GLint); +extern pfn_glPixelStorei fp_glPixelStorei; +typedef void (APIENTRYP pfn_glReadBuffer) (GLenum); +extern pfn_glReadBuffer fp_glReadBuffer; +typedef void (APIENTRYP pfn_glReadPixels) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void*); +extern pfn_glReadPixels fp_glReadPixels; +typedef void (APIENTRYP pfn_glGetBooleanv) (GLenum, GLboolean*); +extern pfn_glGetBooleanv fp_glGetBooleanv; +typedef void (APIENTRYP pfn_glGetDoublev) (GLenum, GLdouble*); +extern pfn_glGetDoublev fp_glGetDoublev; +typedef GLenum (APIENTRYP pfn_glGetError) (); +extern pfn_glGetError fp_glGetError; +typedef void (APIENTRYP pfn_glGetFloatv) (GLenum, GLfloat*); +extern pfn_glGetFloatv fp_glGetFloatv; +typedef void (APIENTRYP pfn_glGetIntegerv) (GLenum, GLint*); +extern pfn_glGetIntegerv fp_glGetIntegerv; +typedef const GLubyte* (APIENTRYP pfn_glGetString) (GLenum); +extern pfn_glGetString fp_glGetString; +typedef void (APIENTRYP pfn_glGetTexImage) (GLenum, GLint, GLenum, GLenum, void*); +extern pfn_glGetTexImage fp_glGetTexImage; +typedef void (APIENTRYP pfn_glGetTexParameterfv) (GLenum, GLenum, GLfloat*); +extern pfn_glGetTexParameterfv fp_glGetTexParameterfv; +typedef void (APIENTRYP pfn_glGetTexParameteriv) (GLenum, GLenum, GLint*); +extern pfn_glGetTexParameteriv fp_glGetTexParameteriv; +typedef void (APIENTRYP pfn_glGetTexLevelParameterfv) (GLenum, GLint, GLenum, GLfloat*); +extern pfn_glGetTexLevelParameterfv fp_glGetTexLevelParameterfv; +typedef void (APIENTRYP pfn_glGetTexLevelParameteriv) (GLenum, GLint, GLenum, GLint*); +extern pfn_glGetTexLevelParameteriv fp_glGetTexLevelParameteriv; +typedef GLboolean (APIENTRYP pfn_glIsEnabled) (GLenum); +extern pfn_glIsEnabled fp_glIsEnabled; +typedef void (APIENTRYP pfn_glDepthRange) (GLdouble, GLdouble); +extern pfn_glDepthRange fp_glDepthRange; +typedef void (APIENTRYP pfn_glViewport) (GLint, GLint, GLsizei, GLsizei); +extern pfn_glViewport fp_glViewport; +typedef void (APIENTRYP pfn_glNewList) (GLuint, GLenum); +extern pfn_glNewList fp_glNewList; +typedef void (APIENTRYP pfn_glEndList) (); +extern pfn_glEndList fp_glEndList; +typedef void (APIENTRYP pfn_glCallList) (GLuint); +extern pfn_glCallList fp_glCallList; +typedef void (APIENTRYP pfn_glCallLists) (GLsizei, GLenum, const void*); +extern pfn_glCallLists fp_glCallLists; +typedef void (APIENTRYP pfn_glDeleteLists) (GLuint, GLsizei); +extern pfn_glDeleteLists fp_glDeleteLists; +typedef GLuint (APIENTRYP pfn_glGenLists) (GLsizei); +extern pfn_glGenLists fp_glGenLists; +typedef void (APIENTRYP pfn_glListBase) (GLuint); +extern pfn_glListBase fp_glListBase; +typedef void (APIENTRYP pfn_glBegin) (GLenum); +extern pfn_glBegin fp_glBegin; +typedef void (APIENTRYP pfn_glBitmap) (GLsizei, GLsizei, GLfloat, GLfloat, GLfloat, GLfloat, const GLubyte*); +extern pfn_glBitmap fp_glBitmap; +typedef void (APIENTRYP pfn_glColor3b) (GLbyte, GLbyte, GLbyte); +extern pfn_glColor3b fp_glColor3b; +typedef void (APIENTRYP pfn_glColor3bv) (const GLbyte*); +extern pfn_glColor3bv fp_glColor3bv; +typedef void (APIENTRYP pfn_glColor3d) (GLdouble, GLdouble, GLdouble); +extern pfn_glColor3d fp_glColor3d; +typedef void (APIENTRYP pfn_glColor3dv) (const GLdouble*); +extern pfn_glColor3dv fp_glColor3dv; +typedef void (APIENTRYP pfn_glColor3f) (GLfloat, GLfloat, GLfloat); +extern pfn_glColor3f fp_glColor3f; +typedef void (APIENTRYP pfn_glColor3fv) (const GLfloat*); +extern pfn_glColor3fv fp_glColor3fv; +typedef void (APIENTRYP pfn_glColor3i) (GLint, GLint, GLint); +extern pfn_glColor3i fp_glColor3i; +typedef void (APIENTRYP pfn_glColor3iv) (const GLint*); +extern pfn_glColor3iv fp_glColor3iv; +typedef void (APIENTRYP pfn_glColor3s) (GLshort, GLshort, GLshort); +extern pfn_glColor3s fp_glColor3s; +typedef void (APIENTRYP pfn_glColor3sv) (const GLshort*); +extern pfn_glColor3sv fp_glColor3sv; +typedef void (APIENTRYP pfn_glColor3ub) (GLubyte, GLubyte, GLubyte); +extern pfn_glColor3ub fp_glColor3ub; +typedef void (APIENTRYP pfn_glColor3ubv) (const GLubyte*); +extern pfn_glColor3ubv fp_glColor3ubv; +typedef void (APIENTRYP pfn_glColor3ui) (GLuint, GLuint, GLuint); +extern pfn_glColor3ui fp_glColor3ui; +typedef void (APIENTRYP pfn_glColor3uiv) (const GLuint*); +extern pfn_glColor3uiv fp_glColor3uiv; +typedef void (APIENTRYP pfn_glColor3us) (GLushort, GLushort, GLushort); +extern pfn_glColor3us fp_glColor3us; +typedef void (APIENTRYP pfn_glColor3usv) (const GLushort*); +extern pfn_glColor3usv fp_glColor3usv; +typedef void (APIENTRYP pfn_glColor4b) (GLbyte, GLbyte, GLbyte, GLbyte); +extern pfn_glColor4b fp_glColor4b; +typedef void (APIENTRYP pfn_glColor4bv) (const GLbyte*); +extern pfn_glColor4bv fp_glColor4bv; +typedef void (APIENTRYP pfn_glColor4d) (GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glColor4d fp_glColor4d; +typedef void (APIENTRYP pfn_glColor4dv) (const GLdouble*); +extern pfn_glColor4dv fp_glColor4dv; +typedef void (APIENTRYP pfn_glColor4f) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glColor4f fp_glColor4f; +typedef void (APIENTRYP pfn_glColor4fv) (const GLfloat*); +extern pfn_glColor4fv fp_glColor4fv; +typedef void (APIENTRYP pfn_glColor4i) (GLint, GLint, GLint, GLint); +extern pfn_glColor4i fp_glColor4i; +typedef void (APIENTRYP pfn_glColor4iv) (const GLint*); +extern pfn_glColor4iv fp_glColor4iv; +typedef void (APIENTRYP pfn_glColor4s) (GLshort, GLshort, GLshort, GLshort); +extern pfn_glColor4s fp_glColor4s; +typedef void (APIENTRYP pfn_glColor4sv) (const GLshort*); +extern pfn_glColor4sv fp_glColor4sv; +typedef void (APIENTRYP pfn_glColor4ub) (GLubyte, GLubyte, GLubyte, GLubyte); +extern pfn_glColor4ub fp_glColor4ub; +typedef void (APIENTRYP pfn_glColor4ubv) (const GLubyte*); +extern pfn_glColor4ubv fp_glColor4ubv; +typedef void (APIENTRYP pfn_glColor4ui) (GLuint, GLuint, GLuint, GLuint); +extern pfn_glColor4ui fp_glColor4ui; +typedef void (APIENTRYP pfn_glColor4uiv) (const GLuint*); +extern pfn_glColor4uiv fp_glColor4uiv; +typedef void (APIENTRYP pfn_glColor4us) (GLushort, GLushort, GLushort, GLushort); +extern pfn_glColor4us fp_glColor4us; +typedef void (APIENTRYP pfn_glColor4usv) (const GLushort*); +extern pfn_glColor4usv fp_glColor4usv; +typedef void (APIENTRYP pfn_glEdgeFlag) (GLboolean); +extern pfn_glEdgeFlag fp_glEdgeFlag; +typedef void (APIENTRYP pfn_glEdgeFlagv) (const GLboolean*); +extern pfn_glEdgeFlagv fp_glEdgeFlagv; +typedef void (APIENTRYP pfn_glEnd) (); +extern pfn_glEnd fp_glEnd; +typedef void (APIENTRYP pfn_glIndexd) (GLdouble); +extern pfn_glIndexd fp_glIndexd; +typedef void (APIENTRYP pfn_glIndexdv) (const GLdouble*); +extern pfn_glIndexdv fp_glIndexdv; +typedef void (APIENTRYP pfn_glIndexf) (GLfloat); +extern pfn_glIndexf fp_glIndexf; +typedef void (APIENTRYP pfn_glIndexfv) (const GLfloat*); +extern pfn_glIndexfv fp_glIndexfv; +typedef void (APIENTRYP pfn_glIndexi) (GLint); +extern pfn_glIndexi fp_glIndexi; +typedef void (APIENTRYP pfn_glIndexiv) (const GLint*); +extern pfn_glIndexiv fp_glIndexiv; +typedef void (APIENTRYP pfn_glIndexs) (GLshort); +extern pfn_glIndexs fp_glIndexs; +typedef void (APIENTRYP pfn_glIndexsv) (const GLshort*); +extern pfn_glIndexsv fp_glIndexsv; +typedef void (APIENTRYP pfn_glNormal3b) (GLbyte, GLbyte, GLbyte); +extern pfn_glNormal3b fp_glNormal3b; +typedef void (APIENTRYP pfn_glNormal3bv) (const GLbyte*); +extern pfn_glNormal3bv fp_glNormal3bv; +typedef void (APIENTRYP pfn_glNormal3d) (GLdouble, GLdouble, GLdouble); +extern pfn_glNormal3d fp_glNormal3d; +typedef void (APIENTRYP pfn_glNormal3dv) (const GLdouble*); +extern pfn_glNormal3dv fp_glNormal3dv; +typedef void (APIENTRYP pfn_glNormal3f) (GLfloat, GLfloat, GLfloat); +extern pfn_glNormal3f fp_glNormal3f; +typedef void (APIENTRYP pfn_glNormal3fv) (const GLfloat*); +extern pfn_glNormal3fv fp_glNormal3fv; +typedef void (APIENTRYP pfn_glNormal3i) (GLint, GLint, GLint); +extern pfn_glNormal3i fp_glNormal3i; +typedef void (APIENTRYP pfn_glNormal3iv) (const GLint*); +extern pfn_glNormal3iv fp_glNormal3iv; +typedef void (APIENTRYP pfn_glNormal3s) (GLshort, GLshort, GLshort); +extern pfn_glNormal3s fp_glNormal3s; +typedef void (APIENTRYP pfn_glNormal3sv) (const GLshort*); +extern pfn_glNormal3sv fp_glNormal3sv; +typedef void (APIENTRYP pfn_glRasterPos2d) (GLdouble, GLdouble); +extern pfn_glRasterPos2d fp_glRasterPos2d; +typedef void (APIENTRYP pfn_glRasterPos2dv) (const GLdouble*); +extern pfn_glRasterPos2dv fp_glRasterPos2dv; +typedef void (APIENTRYP pfn_glRasterPos2f) (GLfloat, GLfloat); +extern pfn_glRasterPos2f fp_glRasterPos2f; +typedef void (APIENTRYP pfn_glRasterPos2fv) (const GLfloat*); +extern pfn_glRasterPos2fv fp_glRasterPos2fv; +typedef void (APIENTRYP pfn_glRasterPos2i) (GLint, GLint); +extern pfn_glRasterPos2i fp_glRasterPos2i; +typedef void (APIENTRYP pfn_glRasterPos2iv) (const GLint*); +extern pfn_glRasterPos2iv fp_glRasterPos2iv; +typedef void (APIENTRYP pfn_glRasterPos2s) (GLshort, GLshort); +extern pfn_glRasterPos2s fp_glRasterPos2s; +typedef void (APIENTRYP pfn_glRasterPos2sv) (const GLshort*); +extern pfn_glRasterPos2sv fp_glRasterPos2sv; +typedef void (APIENTRYP pfn_glRasterPos3d) (GLdouble, GLdouble, GLdouble); +extern pfn_glRasterPos3d fp_glRasterPos3d; +typedef void (APIENTRYP pfn_glRasterPos3dv) (const GLdouble*); +extern pfn_glRasterPos3dv fp_glRasterPos3dv; +typedef void (APIENTRYP pfn_glRasterPos3f) (GLfloat, GLfloat, GLfloat); +extern pfn_glRasterPos3f fp_glRasterPos3f; +typedef void (APIENTRYP pfn_glRasterPos3fv) (const GLfloat*); +extern pfn_glRasterPos3fv fp_glRasterPos3fv; +typedef void (APIENTRYP pfn_glRasterPos3i) (GLint, GLint, GLint); +extern pfn_glRasterPos3i fp_glRasterPos3i; +typedef void (APIENTRYP pfn_glRasterPos3iv) (const GLint*); +extern pfn_glRasterPos3iv fp_glRasterPos3iv; +typedef void (APIENTRYP pfn_glRasterPos3s) (GLshort, GLshort, GLshort); +extern pfn_glRasterPos3s fp_glRasterPos3s; +typedef void (APIENTRYP pfn_glRasterPos3sv) (const GLshort*); +extern pfn_glRasterPos3sv fp_glRasterPos3sv; +typedef void (APIENTRYP pfn_glRasterPos4d) (GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glRasterPos4d fp_glRasterPos4d; +typedef void (APIENTRYP pfn_glRasterPos4dv) (const GLdouble*); +extern pfn_glRasterPos4dv fp_glRasterPos4dv; +typedef void (APIENTRYP pfn_glRasterPos4f) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glRasterPos4f fp_glRasterPos4f; +typedef void (APIENTRYP pfn_glRasterPos4fv) (const GLfloat*); +extern pfn_glRasterPos4fv fp_glRasterPos4fv; +typedef void (APIENTRYP pfn_glRasterPos4i) (GLint, GLint, GLint, GLint); +extern pfn_glRasterPos4i fp_glRasterPos4i; +typedef void (APIENTRYP pfn_glRasterPos4iv) (const GLint*); +extern pfn_glRasterPos4iv fp_glRasterPos4iv; +typedef void (APIENTRYP pfn_glRasterPos4s) (GLshort, GLshort, GLshort, GLshort); +extern pfn_glRasterPos4s fp_glRasterPos4s; +typedef void (APIENTRYP pfn_glRasterPos4sv) (const GLshort*); +extern pfn_glRasterPos4sv fp_glRasterPos4sv; +typedef void (APIENTRYP pfn_glRectd) (GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glRectd fp_glRectd; +typedef void (APIENTRYP pfn_glRectdv) (const GLdouble*, const GLdouble*); +extern pfn_glRectdv fp_glRectdv; +typedef void (APIENTRYP pfn_glRectf) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glRectf fp_glRectf; +typedef void (APIENTRYP pfn_glRectfv) (const GLfloat*, const GLfloat*); +extern pfn_glRectfv fp_glRectfv; +typedef void (APIENTRYP pfn_glRecti) (GLint, GLint, GLint, GLint); +extern pfn_glRecti fp_glRecti; +typedef void (APIENTRYP pfn_glRectiv) (const GLint*, const GLint*); +extern pfn_glRectiv fp_glRectiv; +typedef void (APIENTRYP pfn_glRects) (GLshort, GLshort, GLshort, GLshort); +extern pfn_glRects fp_glRects; +typedef void (APIENTRYP pfn_glRectsv) (const GLshort*, const GLshort*); +extern pfn_glRectsv fp_glRectsv; +typedef void (APIENTRYP pfn_glTexCoord1d) (GLdouble); +extern pfn_glTexCoord1d fp_glTexCoord1d; +typedef void (APIENTRYP pfn_glTexCoord1dv) (const GLdouble*); +extern pfn_glTexCoord1dv fp_glTexCoord1dv; +typedef void (APIENTRYP pfn_glTexCoord1f) (GLfloat); +extern pfn_glTexCoord1f fp_glTexCoord1f; +typedef void (APIENTRYP pfn_glTexCoord1fv) (const GLfloat*); +extern pfn_glTexCoord1fv fp_glTexCoord1fv; +typedef void (APIENTRYP pfn_glTexCoord1i) (GLint); +extern pfn_glTexCoord1i fp_glTexCoord1i; +typedef void (APIENTRYP pfn_glTexCoord1iv) (const GLint*); +extern pfn_glTexCoord1iv fp_glTexCoord1iv; +typedef void (APIENTRYP pfn_glTexCoord1s) (GLshort); +extern pfn_glTexCoord1s fp_glTexCoord1s; +typedef void (APIENTRYP pfn_glTexCoord1sv) (const GLshort*); +extern pfn_glTexCoord1sv fp_glTexCoord1sv; +typedef void (APIENTRYP pfn_glTexCoord2d) (GLdouble, GLdouble); +extern pfn_glTexCoord2d fp_glTexCoord2d; +typedef void (APIENTRYP pfn_glTexCoord2dv) (const GLdouble*); +extern pfn_glTexCoord2dv fp_glTexCoord2dv; +typedef void (APIENTRYP pfn_glTexCoord2f) (GLfloat, GLfloat); +extern pfn_glTexCoord2f fp_glTexCoord2f; +typedef void (APIENTRYP pfn_glTexCoord2fv) (const GLfloat*); +extern pfn_glTexCoord2fv fp_glTexCoord2fv; +typedef void (APIENTRYP pfn_glTexCoord2i) (GLint, GLint); +extern pfn_glTexCoord2i fp_glTexCoord2i; +typedef void (APIENTRYP pfn_glTexCoord2iv) (const GLint*); +extern pfn_glTexCoord2iv fp_glTexCoord2iv; +typedef void (APIENTRYP pfn_glTexCoord2s) (GLshort, GLshort); +extern pfn_glTexCoord2s fp_glTexCoord2s; +typedef void (APIENTRYP pfn_glTexCoord2sv) (const GLshort*); +extern pfn_glTexCoord2sv fp_glTexCoord2sv; +typedef void (APIENTRYP pfn_glTexCoord3d) (GLdouble, GLdouble, GLdouble); +extern pfn_glTexCoord3d fp_glTexCoord3d; +typedef void (APIENTRYP pfn_glTexCoord3dv) (const GLdouble*); +extern pfn_glTexCoord3dv fp_glTexCoord3dv; +typedef void (APIENTRYP pfn_glTexCoord3f) (GLfloat, GLfloat, GLfloat); +extern pfn_glTexCoord3f fp_glTexCoord3f; +typedef void (APIENTRYP pfn_glTexCoord3fv) (const GLfloat*); +extern pfn_glTexCoord3fv fp_glTexCoord3fv; +typedef void (APIENTRYP pfn_glTexCoord3i) (GLint, GLint, GLint); +extern pfn_glTexCoord3i fp_glTexCoord3i; +typedef void (APIENTRYP pfn_glTexCoord3iv) (const GLint*); +extern pfn_glTexCoord3iv fp_glTexCoord3iv; +typedef void (APIENTRYP pfn_glTexCoord3s) (GLshort, GLshort, GLshort); +extern pfn_glTexCoord3s fp_glTexCoord3s; +typedef void (APIENTRYP pfn_glTexCoord3sv) (const GLshort*); +extern pfn_glTexCoord3sv fp_glTexCoord3sv; +typedef void (APIENTRYP pfn_glTexCoord4d) (GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glTexCoord4d fp_glTexCoord4d; +typedef void (APIENTRYP pfn_glTexCoord4dv) (const GLdouble*); +extern pfn_glTexCoord4dv fp_glTexCoord4dv; +typedef void (APIENTRYP pfn_glTexCoord4f) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glTexCoord4f fp_glTexCoord4f; +typedef void (APIENTRYP pfn_glTexCoord4fv) (const GLfloat*); +extern pfn_glTexCoord4fv fp_glTexCoord4fv; +typedef void (APIENTRYP pfn_glTexCoord4i) (GLint, GLint, GLint, GLint); +extern pfn_glTexCoord4i fp_glTexCoord4i; +typedef void (APIENTRYP pfn_glTexCoord4iv) (const GLint*); +extern pfn_glTexCoord4iv fp_glTexCoord4iv; +typedef void (APIENTRYP pfn_glTexCoord4s) (GLshort, GLshort, GLshort, GLshort); +extern pfn_glTexCoord4s fp_glTexCoord4s; +typedef void (APIENTRYP pfn_glTexCoord4sv) (const GLshort*); +extern pfn_glTexCoord4sv fp_glTexCoord4sv; +typedef void (APIENTRYP pfn_glVertex2d) (GLdouble, GLdouble); +extern pfn_glVertex2d fp_glVertex2d; +typedef void (APIENTRYP pfn_glVertex2dv) (const GLdouble*); +extern pfn_glVertex2dv fp_glVertex2dv; +typedef void (APIENTRYP pfn_glVertex2f) (GLfloat, GLfloat); +extern pfn_glVertex2f fp_glVertex2f; +typedef void (APIENTRYP pfn_glVertex2fv) (const GLfloat*); +extern pfn_glVertex2fv fp_glVertex2fv; +typedef void (APIENTRYP pfn_glVertex2i) (GLint, GLint); +extern pfn_glVertex2i fp_glVertex2i; +typedef void (APIENTRYP pfn_glVertex2iv) (const GLint*); +extern pfn_glVertex2iv fp_glVertex2iv; +typedef void (APIENTRYP pfn_glVertex2s) (GLshort, GLshort); +extern pfn_glVertex2s fp_glVertex2s; +typedef void (APIENTRYP pfn_glVertex2sv) (const GLshort*); +extern pfn_glVertex2sv fp_glVertex2sv; +typedef void (APIENTRYP pfn_glVertex3d) (GLdouble, GLdouble, GLdouble); +extern pfn_glVertex3d fp_glVertex3d; +typedef void (APIENTRYP pfn_glVertex3dv) (const GLdouble*); +extern pfn_glVertex3dv fp_glVertex3dv; +typedef void (APIENTRYP pfn_glVertex3f) (GLfloat, GLfloat, GLfloat); +extern pfn_glVertex3f fp_glVertex3f; +typedef void (APIENTRYP pfn_glVertex3fv) (const GLfloat*); +extern pfn_glVertex3fv fp_glVertex3fv; +typedef void (APIENTRYP pfn_glVertex3i) (GLint, GLint, GLint); +extern pfn_glVertex3i fp_glVertex3i; +typedef void (APIENTRYP pfn_glVertex3iv) (const GLint*); +extern pfn_glVertex3iv fp_glVertex3iv; +typedef void (APIENTRYP pfn_glVertex3s) (GLshort, GLshort, GLshort); +extern pfn_glVertex3s fp_glVertex3s; +typedef void (APIENTRYP pfn_glVertex3sv) (const GLshort*); +extern pfn_glVertex3sv fp_glVertex3sv; +typedef void (APIENTRYP pfn_glVertex4d) (GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glVertex4d fp_glVertex4d; +typedef void (APIENTRYP pfn_glVertex4dv) (const GLdouble*); +extern pfn_glVertex4dv fp_glVertex4dv; +typedef void (APIENTRYP pfn_glVertex4f) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glVertex4f fp_glVertex4f; +typedef void (APIENTRYP pfn_glVertex4fv) (const GLfloat*); +extern pfn_glVertex4fv fp_glVertex4fv; +typedef void (APIENTRYP pfn_glVertex4i) (GLint, GLint, GLint, GLint); +extern pfn_glVertex4i fp_glVertex4i; +typedef void (APIENTRYP pfn_glVertex4iv) (const GLint*); +extern pfn_glVertex4iv fp_glVertex4iv; +typedef void (APIENTRYP pfn_glVertex4s) (GLshort, GLshort, GLshort, GLshort); +extern pfn_glVertex4s fp_glVertex4s; +typedef void (APIENTRYP pfn_glVertex4sv) (const GLshort*); +extern pfn_glVertex4sv fp_glVertex4sv; +typedef void (APIENTRYP pfn_glClipPlane) (GLenum, const GLdouble*); +extern pfn_glClipPlane fp_glClipPlane; +typedef void (APIENTRYP pfn_glColorMaterial) (GLenum, GLenum); +extern pfn_glColorMaterial fp_glColorMaterial; +typedef void (APIENTRYP pfn_glFogf) (GLenum, GLfloat); +extern pfn_glFogf fp_glFogf; +typedef void (APIENTRYP pfn_glFogfv) (GLenum, const GLfloat*); +extern pfn_glFogfv fp_glFogfv; +typedef void (APIENTRYP pfn_glFogi) (GLenum, GLint); +extern pfn_glFogi fp_glFogi; +typedef void (APIENTRYP pfn_glFogiv) (GLenum, const GLint*); +extern pfn_glFogiv fp_glFogiv; +typedef void (APIENTRYP pfn_glLightf) (GLenum, GLenum, GLfloat); +extern pfn_glLightf fp_glLightf; +typedef void (APIENTRYP pfn_glLightfv) (GLenum, GLenum, const GLfloat*); +extern pfn_glLightfv fp_glLightfv; +typedef void (APIENTRYP pfn_glLighti) (GLenum, GLenum, GLint); +extern pfn_glLighti fp_glLighti; +typedef void (APIENTRYP pfn_glLightiv) (GLenum, GLenum, const GLint*); +extern pfn_glLightiv fp_glLightiv; +typedef void (APIENTRYP pfn_glLightModelf) (GLenum, GLfloat); +extern pfn_glLightModelf fp_glLightModelf; +typedef void (APIENTRYP pfn_glLightModelfv) (GLenum, const GLfloat*); +extern pfn_glLightModelfv fp_glLightModelfv; +typedef void (APIENTRYP pfn_glLightModeli) (GLenum, GLint); +extern pfn_glLightModeli fp_glLightModeli; +typedef void (APIENTRYP pfn_glLightModeliv) (GLenum, const GLint*); +extern pfn_glLightModeliv fp_glLightModeliv; +typedef void (APIENTRYP pfn_glLineStipple) (GLint, GLushort); +extern pfn_glLineStipple fp_glLineStipple; +typedef void (APIENTRYP pfn_glMaterialf) (GLenum, GLenum, GLfloat); +extern pfn_glMaterialf fp_glMaterialf; +typedef void (APIENTRYP pfn_glMaterialfv) (GLenum, GLenum, const GLfloat*); +extern pfn_glMaterialfv fp_glMaterialfv; +typedef void (APIENTRYP pfn_glMateriali) (GLenum, GLenum, GLint); +extern pfn_glMateriali fp_glMateriali; +typedef void (APIENTRYP pfn_glMaterialiv) (GLenum, GLenum, const GLint*); +extern pfn_glMaterialiv fp_glMaterialiv; +typedef void (APIENTRYP pfn_glPolygonStipple) (const GLubyte*); +extern pfn_glPolygonStipple fp_glPolygonStipple; +typedef void (APIENTRYP pfn_glShadeModel) (GLenum); +extern pfn_glShadeModel fp_glShadeModel; +typedef void (APIENTRYP pfn_glTexEnvf) (GLenum, GLenum, GLfloat); +extern pfn_glTexEnvf fp_glTexEnvf; +typedef void (APIENTRYP pfn_glTexEnvfv) (GLenum, GLenum, const GLfloat*); +extern pfn_glTexEnvfv fp_glTexEnvfv; +typedef void (APIENTRYP pfn_glTexEnvi) (GLenum, GLenum, GLint); +extern pfn_glTexEnvi fp_glTexEnvi; +typedef void (APIENTRYP pfn_glTexEnviv) (GLenum, GLenum, const GLint*); +extern pfn_glTexEnviv fp_glTexEnviv; +typedef void (APIENTRYP pfn_glTexGend) (GLenum, GLenum, GLdouble); +extern pfn_glTexGend fp_glTexGend; +typedef void (APIENTRYP pfn_glTexGendv) (GLenum, GLenum, const GLdouble*); +extern pfn_glTexGendv fp_glTexGendv; +typedef void (APIENTRYP pfn_glTexGenf) (GLenum, GLenum, GLfloat); +extern pfn_glTexGenf fp_glTexGenf; +typedef void (APIENTRYP pfn_glTexGenfv) (GLenum, GLenum, const GLfloat*); +extern pfn_glTexGenfv fp_glTexGenfv; +typedef void (APIENTRYP pfn_glTexGeni) (GLenum, GLenum, GLint); +extern pfn_glTexGeni fp_glTexGeni; +typedef void (APIENTRYP pfn_glTexGeniv) (GLenum, GLenum, const GLint*); +extern pfn_glTexGeniv fp_glTexGeniv; +typedef void (APIENTRYP pfn_glFeedbackBuffer) (GLsizei, GLenum, GLfloat*); +extern pfn_glFeedbackBuffer fp_glFeedbackBuffer; +typedef void (APIENTRYP pfn_glSelectBuffer) (GLsizei, GLuint*); +extern pfn_glSelectBuffer fp_glSelectBuffer; +typedef GLint (APIENTRYP pfn_glRenderMode) (GLenum); +extern pfn_glRenderMode fp_glRenderMode; +typedef void (APIENTRYP pfn_glInitNames) (); +extern pfn_glInitNames fp_glInitNames; +typedef void (APIENTRYP pfn_glLoadName) (GLuint); +extern pfn_glLoadName fp_glLoadName; +typedef void (APIENTRYP pfn_glPassThrough) (GLfloat); +extern pfn_glPassThrough fp_glPassThrough; +typedef void (APIENTRYP pfn_glPopName) (); +extern pfn_glPopName fp_glPopName; +typedef void (APIENTRYP pfn_glPushName) (GLuint); +extern pfn_glPushName fp_glPushName; +typedef void (APIENTRYP pfn_glClearAccum) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glClearAccum fp_glClearAccum; +typedef void (APIENTRYP pfn_glClearIndex) (GLfloat); +extern pfn_glClearIndex fp_glClearIndex; +typedef void (APIENTRYP pfn_glIndexMask) (GLuint); +extern pfn_glIndexMask fp_glIndexMask; +typedef void (APIENTRYP pfn_glAccum) (GLenum, GLfloat); +extern pfn_glAccum fp_glAccum; +typedef void (APIENTRYP pfn_glPopAttrib) (); +extern pfn_glPopAttrib fp_glPopAttrib; +typedef void (APIENTRYP pfn_glPushAttrib) (GLbitfield); +extern pfn_glPushAttrib fp_glPushAttrib; +typedef void (APIENTRYP pfn_glMap1d) (GLenum, GLdouble, GLdouble, GLint, GLint, const GLdouble*); +extern pfn_glMap1d fp_glMap1d; +typedef void (APIENTRYP pfn_glMap1f) (GLenum, GLfloat, GLfloat, GLint, GLint, const GLfloat*); +extern pfn_glMap1f fp_glMap1f; +typedef void (APIENTRYP pfn_glMap2d) (GLenum, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble*); +extern pfn_glMap2d fp_glMap2d; +typedef void (APIENTRYP pfn_glMap2f) (GLenum, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat*); +extern pfn_glMap2f fp_glMap2f; +typedef void (APIENTRYP pfn_glMapGrid1d) (GLint, GLdouble, GLdouble); +extern pfn_glMapGrid1d fp_glMapGrid1d; +typedef void (APIENTRYP pfn_glMapGrid1f) (GLint, GLfloat, GLfloat); +extern pfn_glMapGrid1f fp_glMapGrid1f; +typedef void (APIENTRYP pfn_glMapGrid2d) (GLint, GLdouble, GLdouble, GLint, GLdouble, GLdouble); +extern pfn_glMapGrid2d fp_glMapGrid2d; +typedef void (APIENTRYP pfn_glMapGrid2f) (GLint, GLfloat, GLfloat, GLint, GLfloat, GLfloat); +extern pfn_glMapGrid2f fp_glMapGrid2f; +typedef void (APIENTRYP pfn_glEvalCoord1d) (GLdouble); +extern pfn_glEvalCoord1d fp_glEvalCoord1d; +typedef void (APIENTRYP pfn_glEvalCoord1dv) (const GLdouble*); +extern pfn_glEvalCoord1dv fp_glEvalCoord1dv; +typedef void (APIENTRYP pfn_glEvalCoord1f) (GLfloat); +extern pfn_glEvalCoord1f fp_glEvalCoord1f; +typedef void (APIENTRYP pfn_glEvalCoord1fv) (const GLfloat*); +extern pfn_glEvalCoord1fv fp_glEvalCoord1fv; +typedef void (APIENTRYP pfn_glEvalCoord2d) (GLdouble, GLdouble); +extern pfn_glEvalCoord2d fp_glEvalCoord2d; +typedef void (APIENTRYP pfn_glEvalCoord2dv) (const GLdouble*); +extern pfn_glEvalCoord2dv fp_glEvalCoord2dv; +typedef void (APIENTRYP pfn_glEvalCoord2f) (GLfloat, GLfloat); +extern pfn_glEvalCoord2f fp_glEvalCoord2f; +typedef void (APIENTRYP pfn_glEvalCoord2fv) (const GLfloat*); +extern pfn_glEvalCoord2fv fp_glEvalCoord2fv; +typedef void (APIENTRYP pfn_glEvalMesh1) (GLenum, GLint, GLint); +extern pfn_glEvalMesh1 fp_glEvalMesh1; +typedef void (APIENTRYP pfn_glEvalPoint1) (GLint); +extern pfn_glEvalPoint1 fp_glEvalPoint1; +typedef void (APIENTRYP pfn_glEvalMesh2) (GLenum, GLint, GLint, GLint, GLint); +extern pfn_glEvalMesh2 fp_glEvalMesh2; +typedef void (APIENTRYP pfn_glEvalPoint2) (GLint, GLint); +extern pfn_glEvalPoint2 fp_glEvalPoint2; +typedef void (APIENTRYP pfn_glAlphaFunc) (GLenum, GLfloat); +extern pfn_glAlphaFunc fp_glAlphaFunc; +typedef void (APIENTRYP pfn_glPixelZoom) (GLfloat, GLfloat); +extern pfn_glPixelZoom fp_glPixelZoom; +typedef void (APIENTRYP pfn_glPixelTransferf) (GLenum, GLfloat); +extern pfn_glPixelTransferf fp_glPixelTransferf; +typedef void (APIENTRYP pfn_glPixelTransferi) (GLenum, GLint); +extern pfn_glPixelTransferi fp_glPixelTransferi; +typedef void (APIENTRYP pfn_glPixelMapfv) (GLenum, GLsizei, const GLfloat*); +extern pfn_glPixelMapfv fp_glPixelMapfv; +typedef void (APIENTRYP pfn_glPixelMapuiv) (GLenum, GLsizei, const GLuint*); +extern pfn_glPixelMapuiv fp_glPixelMapuiv; +typedef void (APIENTRYP pfn_glPixelMapusv) (GLenum, GLsizei, const GLushort*); +extern pfn_glPixelMapusv fp_glPixelMapusv; +typedef void (APIENTRYP pfn_glCopyPixels) (GLint, GLint, GLsizei, GLsizei, GLenum); +extern pfn_glCopyPixels fp_glCopyPixels; +typedef void (APIENTRYP pfn_glDrawPixels) (GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glDrawPixels fp_glDrawPixels; +typedef void (APIENTRYP pfn_glGetClipPlane) (GLenum, GLdouble*); +extern pfn_glGetClipPlane fp_glGetClipPlane; +typedef void (APIENTRYP pfn_glGetLightfv) (GLenum, GLenum, GLfloat*); +extern pfn_glGetLightfv fp_glGetLightfv; +typedef void (APIENTRYP pfn_glGetLightiv) (GLenum, GLenum, GLint*); +extern pfn_glGetLightiv fp_glGetLightiv; +typedef void (APIENTRYP pfn_glGetMapdv) (GLenum, GLenum, GLdouble*); +extern pfn_glGetMapdv fp_glGetMapdv; +typedef void (APIENTRYP pfn_glGetMapfv) (GLenum, GLenum, GLfloat*); +extern pfn_glGetMapfv fp_glGetMapfv; +typedef void (APIENTRYP pfn_glGetMapiv) (GLenum, GLenum, GLint*); +extern pfn_glGetMapiv fp_glGetMapiv; +typedef void (APIENTRYP pfn_glGetMaterialfv) (GLenum, GLenum, GLfloat*); +extern pfn_glGetMaterialfv fp_glGetMaterialfv; +typedef void (APIENTRYP pfn_glGetMaterialiv) (GLenum, GLenum, GLint*); +extern pfn_glGetMaterialiv fp_glGetMaterialiv; +typedef void (APIENTRYP pfn_glGetPixelMapfv) (GLenum, GLfloat*); +extern pfn_glGetPixelMapfv fp_glGetPixelMapfv; +typedef void (APIENTRYP pfn_glGetPixelMapuiv) (GLenum, GLuint*); +extern pfn_glGetPixelMapuiv fp_glGetPixelMapuiv; +typedef void (APIENTRYP pfn_glGetPixelMapusv) (GLenum, GLushort*); +extern pfn_glGetPixelMapusv fp_glGetPixelMapusv; +typedef void (APIENTRYP pfn_glGetPolygonStipple) (GLubyte*); +extern pfn_glGetPolygonStipple fp_glGetPolygonStipple; +typedef void (APIENTRYP pfn_glGetTexEnvfv) (GLenum, GLenum, GLfloat*); +extern pfn_glGetTexEnvfv fp_glGetTexEnvfv; +typedef void (APIENTRYP pfn_glGetTexEnviv) (GLenum, GLenum, GLint*); +extern pfn_glGetTexEnviv fp_glGetTexEnviv; +typedef void (APIENTRYP pfn_glGetTexGendv) (GLenum, GLenum, GLdouble*); +extern pfn_glGetTexGendv fp_glGetTexGendv; +typedef void (APIENTRYP pfn_glGetTexGenfv) (GLenum, GLenum, GLfloat*); +extern pfn_glGetTexGenfv fp_glGetTexGenfv; +typedef void (APIENTRYP pfn_glGetTexGeniv) (GLenum, GLenum, GLint*); +extern pfn_glGetTexGeniv fp_glGetTexGeniv; +typedef GLboolean (APIENTRYP pfn_glIsList) (GLuint); +extern pfn_glIsList fp_glIsList; +typedef void (APIENTRYP pfn_glFrustum) (GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glFrustum fp_glFrustum; +typedef void (APIENTRYP pfn_glLoadIdentity) (); +extern pfn_glLoadIdentity fp_glLoadIdentity; +typedef void (APIENTRYP pfn_glLoadMatrixf) (const GLfloat*); +extern pfn_glLoadMatrixf fp_glLoadMatrixf; +typedef void (APIENTRYP pfn_glLoadMatrixd) (const GLdouble*); +extern pfn_glLoadMatrixd fp_glLoadMatrixd; +typedef void (APIENTRYP pfn_glMatrixMode) (GLenum); +extern pfn_glMatrixMode fp_glMatrixMode; +typedef void (APIENTRYP pfn_glMultMatrixf) (const GLfloat*); +extern pfn_glMultMatrixf fp_glMultMatrixf; +typedef void (APIENTRYP pfn_glMultMatrixd) (const GLdouble*); +extern pfn_glMultMatrixd fp_glMultMatrixd; +typedef void (APIENTRYP pfn_glOrtho) (GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glOrtho fp_glOrtho; +typedef void (APIENTRYP pfn_glPopMatrix) (); +extern pfn_glPopMatrix fp_glPopMatrix; +typedef void (APIENTRYP pfn_glPushMatrix) (); +extern pfn_glPushMatrix fp_glPushMatrix; +typedef void (APIENTRYP pfn_glRotated) (GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glRotated fp_glRotated; +typedef void (APIENTRYP pfn_glRotatef) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glRotatef fp_glRotatef; +typedef void (APIENTRYP pfn_glScaled) (GLdouble, GLdouble, GLdouble); +extern pfn_glScaled fp_glScaled; +typedef void (APIENTRYP pfn_glScalef) (GLfloat, GLfloat, GLfloat); +extern pfn_glScalef fp_glScalef; +typedef void (APIENTRYP pfn_glTranslated) (GLdouble, GLdouble, GLdouble); +extern pfn_glTranslated fp_glTranslated; +typedef void (APIENTRYP pfn_glTranslatef) (GLfloat, GLfloat, GLfloat); +extern pfn_glTranslatef fp_glTranslatef; + + /* GL_VERSION_1_1 */ +extern GLboolean GLAD_VERSION_1_1; +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_FALSE 0 +#define GL_TRUE 1 +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_NEVER 0x0200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_ZERO 0 +#define GL_ONE 1 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_NONE 0 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_VIEWPORT 0x0BA2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_DOUBLE 0x140A +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_REPEAT 0x2901 +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_LOGIC_OP 0x0BF1 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_COLOR_INDEX 0x1900 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_CLAMP 0x2900 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +typedef void (APIENTRYP pfn_glDrawArrays) (GLenum, GLint, GLsizei); +extern pfn_glDrawArrays fp_glDrawArrays; +typedef void (APIENTRYP pfn_glDrawElements) (GLenum, GLsizei, GLenum, const void*); +extern pfn_glDrawElements fp_glDrawElements; +typedef void (APIENTRYP pfn_glGetPointerv) (GLenum, void**); +extern pfn_glGetPointerv fp_glGetPointerv; +typedef void (APIENTRYP pfn_glPolygonOffset) (GLfloat, GLfloat); +extern pfn_glPolygonOffset fp_glPolygonOffset; +typedef void (APIENTRYP pfn_glCopyTexImage1D) (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +extern pfn_glCopyTexImage1D fp_glCopyTexImage1D; +typedef void (APIENTRYP pfn_glCopyTexImage2D) (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +extern pfn_glCopyTexImage2D fp_glCopyTexImage2D; +typedef void (APIENTRYP pfn_glCopyTexSubImage1D) (GLenum, GLint, GLint, GLint, GLint, GLsizei); +extern pfn_glCopyTexSubImage1D fp_glCopyTexSubImage1D; +typedef void (APIENTRYP pfn_glCopyTexSubImage2D) (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyTexSubImage2D fp_glCopyTexSubImage2D; +typedef void (APIENTRYP pfn_glTexSubImage1D) (GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTexSubImage1D fp_glTexSubImage1D; +typedef void (APIENTRYP pfn_glTexSubImage2D) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTexSubImage2D fp_glTexSubImage2D; +typedef void (APIENTRYP pfn_glBindTexture) (GLenum, GLuint); +extern pfn_glBindTexture fp_glBindTexture; +typedef void (APIENTRYP pfn_glDeleteTextures) (GLsizei, const GLuint*); +extern pfn_glDeleteTextures fp_glDeleteTextures; +typedef void (APIENTRYP pfn_glGenTextures) (GLsizei, GLuint*); +extern pfn_glGenTextures fp_glGenTextures; +typedef GLboolean (APIENTRYP pfn_glIsTexture) (GLuint); +extern pfn_glIsTexture fp_glIsTexture; +typedef void (APIENTRYP pfn_glArrayElement) (GLint); +extern pfn_glArrayElement fp_glArrayElement; +typedef void (APIENTRYP pfn_glColorPointer) (GLint, GLenum, GLsizei, const void*); +extern pfn_glColorPointer fp_glColorPointer; +typedef void (APIENTRYP pfn_glDisableClientState) (GLenum); +extern pfn_glDisableClientState fp_glDisableClientState; +typedef void (APIENTRYP pfn_glEdgeFlagPointer) (GLsizei, const void*); +extern pfn_glEdgeFlagPointer fp_glEdgeFlagPointer; +typedef void (APIENTRYP pfn_glEnableClientState) (GLenum); +extern pfn_glEnableClientState fp_glEnableClientState; +typedef void (APIENTRYP pfn_glIndexPointer) (GLenum, GLsizei, const void*); +extern pfn_glIndexPointer fp_glIndexPointer; +typedef void (APIENTRYP pfn_glInterleavedArrays) (GLenum, GLsizei, const void*); +extern pfn_glInterleavedArrays fp_glInterleavedArrays; +typedef void (APIENTRYP pfn_glNormalPointer) (GLenum, GLsizei, const void*); +extern pfn_glNormalPointer fp_glNormalPointer; +typedef void (APIENTRYP pfn_glTexCoordPointer) (GLint, GLenum, GLsizei, const void*); +extern pfn_glTexCoordPointer fp_glTexCoordPointer; +typedef void (APIENTRYP pfn_glVertexPointer) (GLint, GLenum, GLsizei, const void*); +extern pfn_glVertexPointer fp_glVertexPointer; +typedef GLboolean (APIENTRYP pfn_glAreTexturesResident) (GLsizei, const GLuint*, GLboolean*); +extern pfn_glAreTexturesResident fp_glAreTexturesResident; +typedef void (APIENTRYP pfn_glPrioritizeTextures) (GLsizei, const GLuint*, const GLfloat*); +extern pfn_glPrioritizeTextures fp_glPrioritizeTextures; +typedef void (APIENTRYP pfn_glIndexub) (GLubyte); +extern pfn_glIndexub fp_glIndexub; +typedef void (APIENTRYP pfn_glIndexubv) (const GLubyte*); +extern pfn_glIndexubv fp_glIndexubv; +typedef void (APIENTRYP pfn_glPopClientAttrib) (); +extern pfn_glPopClientAttrib fp_glPopClientAttrib; +typedef void (APIENTRYP pfn_glPushClientAttrib) (GLbitfield); +extern pfn_glPushClientAttrib fp_glPushClientAttrib; + + /* GL_VERSION_1_2 */ +extern GLboolean GLAD_VERSION_1_2; +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +typedef void (APIENTRYP pfn_glDrawRangeElements) (GLenum, GLuint, GLuint, GLsizei, GLenum, const void*); +extern pfn_glDrawRangeElements fp_glDrawRangeElements; +typedef void (APIENTRYP pfn_glTexImage3D) (GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glTexImage3D fp_glTexImage3D; +typedef void (APIENTRYP pfn_glTexSubImage3D) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTexSubImage3D fp_glTexSubImage3D; +typedef void (APIENTRYP pfn_glCopyTexSubImage3D) (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyTexSubImage3D fp_glCopyTexSubImage3D; + + /* GL_VERSION_1_3 */ +extern GLboolean GLAD_VERSION_1_3; +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +typedef void (APIENTRYP pfn_glActiveTexture) (GLenum); +extern pfn_glActiveTexture fp_glActiveTexture; +typedef void (APIENTRYP pfn_glSampleCoverage) (GLfloat, GLboolean); +extern pfn_glSampleCoverage fp_glSampleCoverage; +typedef void (APIENTRYP pfn_glCompressedTexImage3D) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTexImage3D fp_glCompressedTexImage3D; +typedef void (APIENTRYP pfn_glCompressedTexImage2D) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTexImage2D fp_glCompressedTexImage2D; +typedef void (APIENTRYP pfn_glCompressedTexImage1D) (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTexImage1D fp_glCompressedTexImage1D; +typedef void (APIENTRYP pfn_glCompressedTexSubImage3D) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTexSubImage3D fp_glCompressedTexSubImage3D; +typedef void (APIENTRYP pfn_glCompressedTexSubImage2D) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTexSubImage2D fp_glCompressedTexSubImage2D; +typedef void (APIENTRYP pfn_glCompressedTexSubImage1D) (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTexSubImage1D fp_glCompressedTexSubImage1D; +typedef void (APIENTRYP pfn_glGetCompressedTexImage) (GLenum, GLint, void*); +extern pfn_glGetCompressedTexImage fp_glGetCompressedTexImage; +typedef void (APIENTRYP pfn_glClientActiveTexture) (GLenum); +extern pfn_glClientActiveTexture fp_glClientActiveTexture; +typedef void (APIENTRYP pfn_glMultiTexCoord1d) (GLenum, GLdouble); +extern pfn_glMultiTexCoord1d fp_glMultiTexCoord1d; +typedef void (APIENTRYP pfn_glMultiTexCoord1dv) (GLenum, const GLdouble*); +extern pfn_glMultiTexCoord1dv fp_glMultiTexCoord1dv; +typedef void (APIENTRYP pfn_glMultiTexCoord1f) (GLenum, GLfloat); +extern pfn_glMultiTexCoord1f fp_glMultiTexCoord1f; +typedef void (APIENTRYP pfn_glMultiTexCoord1fv) (GLenum, const GLfloat*); +extern pfn_glMultiTexCoord1fv fp_glMultiTexCoord1fv; +typedef void (APIENTRYP pfn_glMultiTexCoord1i) (GLenum, GLint); +extern pfn_glMultiTexCoord1i fp_glMultiTexCoord1i; +typedef void (APIENTRYP pfn_glMultiTexCoord1iv) (GLenum, const GLint*); +extern pfn_glMultiTexCoord1iv fp_glMultiTexCoord1iv; +typedef void (APIENTRYP pfn_glMultiTexCoord1s) (GLenum, GLshort); +extern pfn_glMultiTexCoord1s fp_glMultiTexCoord1s; +typedef void (APIENTRYP pfn_glMultiTexCoord1sv) (GLenum, const GLshort*); +extern pfn_glMultiTexCoord1sv fp_glMultiTexCoord1sv; +typedef void (APIENTRYP pfn_glMultiTexCoord2d) (GLenum, GLdouble, GLdouble); +extern pfn_glMultiTexCoord2d fp_glMultiTexCoord2d; +typedef void (APIENTRYP pfn_glMultiTexCoord2dv) (GLenum, const GLdouble*); +extern pfn_glMultiTexCoord2dv fp_glMultiTexCoord2dv; +typedef void (APIENTRYP pfn_glMultiTexCoord2f) (GLenum, GLfloat, GLfloat); +extern pfn_glMultiTexCoord2f fp_glMultiTexCoord2f; +typedef void (APIENTRYP pfn_glMultiTexCoord2fv) (GLenum, const GLfloat*); +extern pfn_glMultiTexCoord2fv fp_glMultiTexCoord2fv; +typedef void (APIENTRYP pfn_glMultiTexCoord2i) (GLenum, GLint, GLint); +extern pfn_glMultiTexCoord2i fp_glMultiTexCoord2i; +typedef void (APIENTRYP pfn_glMultiTexCoord2iv) (GLenum, const GLint*); +extern pfn_glMultiTexCoord2iv fp_glMultiTexCoord2iv; +typedef void (APIENTRYP pfn_glMultiTexCoord2s) (GLenum, GLshort, GLshort); +extern pfn_glMultiTexCoord2s fp_glMultiTexCoord2s; +typedef void (APIENTRYP pfn_glMultiTexCoord2sv) (GLenum, const GLshort*); +extern pfn_glMultiTexCoord2sv fp_glMultiTexCoord2sv; +typedef void (APIENTRYP pfn_glMultiTexCoord3d) (GLenum, GLdouble, GLdouble, GLdouble); +extern pfn_glMultiTexCoord3d fp_glMultiTexCoord3d; +typedef void (APIENTRYP pfn_glMultiTexCoord3dv) (GLenum, const GLdouble*); +extern pfn_glMultiTexCoord3dv fp_glMultiTexCoord3dv; +typedef void (APIENTRYP pfn_glMultiTexCoord3f) (GLenum, GLfloat, GLfloat, GLfloat); +extern pfn_glMultiTexCoord3f fp_glMultiTexCoord3f; +typedef void (APIENTRYP pfn_glMultiTexCoord3fv) (GLenum, const GLfloat*); +extern pfn_glMultiTexCoord3fv fp_glMultiTexCoord3fv; +typedef void (APIENTRYP pfn_glMultiTexCoord3i) (GLenum, GLint, GLint, GLint); +extern pfn_glMultiTexCoord3i fp_glMultiTexCoord3i; +typedef void (APIENTRYP pfn_glMultiTexCoord3iv) (GLenum, const GLint*); +extern pfn_glMultiTexCoord3iv fp_glMultiTexCoord3iv; +typedef void (APIENTRYP pfn_glMultiTexCoord3s) (GLenum, GLshort, GLshort, GLshort); +extern pfn_glMultiTexCoord3s fp_glMultiTexCoord3s; +typedef void (APIENTRYP pfn_glMultiTexCoord3sv) (GLenum, const GLshort*); +extern pfn_glMultiTexCoord3sv fp_glMultiTexCoord3sv; +typedef void (APIENTRYP pfn_glMultiTexCoord4d) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glMultiTexCoord4d fp_glMultiTexCoord4d; +typedef void (APIENTRYP pfn_glMultiTexCoord4dv) (GLenum, const GLdouble*); +extern pfn_glMultiTexCoord4dv fp_glMultiTexCoord4dv; +typedef void (APIENTRYP pfn_glMultiTexCoord4f) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glMultiTexCoord4f fp_glMultiTexCoord4f; +typedef void (APIENTRYP pfn_glMultiTexCoord4fv) (GLenum, const GLfloat*); +extern pfn_glMultiTexCoord4fv fp_glMultiTexCoord4fv; +typedef void (APIENTRYP pfn_glMultiTexCoord4i) (GLenum, GLint, GLint, GLint, GLint); +extern pfn_glMultiTexCoord4i fp_glMultiTexCoord4i; +typedef void (APIENTRYP pfn_glMultiTexCoord4iv) (GLenum, const GLint*); +extern pfn_glMultiTexCoord4iv fp_glMultiTexCoord4iv; +typedef void (APIENTRYP pfn_glMultiTexCoord4s) (GLenum, GLshort, GLshort, GLshort, GLshort); +extern pfn_glMultiTexCoord4s fp_glMultiTexCoord4s; +typedef void (APIENTRYP pfn_glMultiTexCoord4sv) (GLenum, const GLshort*); +extern pfn_glMultiTexCoord4sv fp_glMultiTexCoord4sv; +typedef void (APIENTRYP pfn_glLoadTransposeMatrixf) (const GLfloat*); +extern pfn_glLoadTransposeMatrixf fp_glLoadTransposeMatrixf; +typedef void (APIENTRYP pfn_glLoadTransposeMatrixd) (const GLdouble*); +extern pfn_glLoadTransposeMatrixd fp_glLoadTransposeMatrixd; +typedef void (APIENTRYP pfn_glMultTransposeMatrixf) (const GLfloat*); +extern pfn_glMultTransposeMatrixf fp_glMultTransposeMatrixf; +typedef void (APIENTRYP pfn_glMultTransposeMatrixd) (const GLdouble*); +extern pfn_glMultTransposeMatrixd fp_glMultTransposeMatrixd; + + /* GL_VERSION_1_4 */ +extern GLboolean GLAD_VERSION_1_4; +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +typedef void (APIENTRYP pfn_glBlendFuncSeparate) (GLenum, GLenum, GLenum, GLenum); +extern pfn_glBlendFuncSeparate fp_glBlendFuncSeparate; +typedef void (APIENTRYP pfn_glMultiDrawArrays) (GLenum, const GLint*, const GLsizei*, GLsizei); +extern pfn_glMultiDrawArrays fp_glMultiDrawArrays; +typedef void (APIENTRYP pfn_glMultiDrawElements) (GLenum, const GLsizei*, GLenum, const void**, GLsizei); +extern pfn_glMultiDrawElements fp_glMultiDrawElements; +typedef void (APIENTRYP pfn_glPointParameterf) (GLenum, GLfloat); +extern pfn_glPointParameterf fp_glPointParameterf; +typedef void (APIENTRYP pfn_glPointParameterfv) (GLenum, const GLfloat*); +extern pfn_glPointParameterfv fp_glPointParameterfv; +typedef void (APIENTRYP pfn_glPointParameteri) (GLenum, GLint); +extern pfn_glPointParameteri fp_glPointParameteri; +typedef void (APIENTRYP pfn_glPointParameteriv) (GLenum, const GLint*); +extern pfn_glPointParameteriv fp_glPointParameteriv; +typedef void (APIENTRYP pfn_glFogCoordf) (GLfloat); +extern pfn_glFogCoordf fp_glFogCoordf; +typedef void (APIENTRYP pfn_glFogCoordfv) (const GLfloat*); +extern pfn_glFogCoordfv fp_glFogCoordfv; +typedef void (APIENTRYP pfn_glFogCoordd) (GLdouble); +extern pfn_glFogCoordd fp_glFogCoordd; +typedef void (APIENTRYP pfn_glFogCoorddv) (const GLdouble*); +extern pfn_glFogCoorddv fp_glFogCoorddv; +typedef void (APIENTRYP pfn_glFogCoordPointer) (GLenum, GLsizei, const void*); +extern pfn_glFogCoordPointer fp_glFogCoordPointer; +typedef void (APIENTRYP pfn_glSecondaryColor3b) (GLbyte, GLbyte, GLbyte); +extern pfn_glSecondaryColor3b fp_glSecondaryColor3b; +typedef void (APIENTRYP pfn_glSecondaryColor3bv) (const GLbyte*); +extern pfn_glSecondaryColor3bv fp_glSecondaryColor3bv; +typedef void (APIENTRYP pfn_glSecondaryColor3d) (GLdouble, GLdouble, GLdouble); +extern pfn_glSecondaryColor3d fp_glSecondaryColor3d; +typedef void (APIENTRYP pfn_glSecondaryColor3dv) (const GLdouble*); +extern pfn_glSecondaryColor3dv fp_glSecondaryColor3dv; +typedef void (APIENTRYP pfn_glSecondaryColor3f) (GLfloat, GLfloat, GLfloat); +extern pfn_glSecondaryColor3f fp_glSecondaryColor3f; +typedef void (APIENTRYP pfn_glSecondaryColor3fv) (const GLfloat*); +extern pfn_glSecondaryColor3fv fp_glSecondaryColor3fv; +typedef void (APIENTRYP pfn_glSecondaryColor3i) (GLint, GLint, GLint); +extern pfn_glSecondaryColor3i fp_glSecondaryColor3i; +typedef void (APIENTRYP pfn_glSecondaryColor3iv) (const GLint*); +extern pfn_glSecondaryColor3iv fp_glSecondaryColor3iv; +typedef void (APIENTRYP pfn_glSecondaryColor3s) (GLshort, GLshort, GLshort); +extern pfn_glSecondaryColor3s fp_glSecondaryColor3s; +typedef void (APIENTRYP pfn_glSecondaryColor3sv) (const GLshort*); +extern pfn_glSecondaryColor3sv fp_glSecondaryColor3sv; +typedef void (APIENTRYP pfn_glSecondaryColor3ub) (GLubyte, GLubyte, GLubyte); +extern pfn_glSecondaryColor3ub fp_glSecondaryColor3ub; +typedef void (APIENTRYP pfn_glSecondaryColor3ubv) (const GLubyte*); +extern pfn_glSecondaryColor3ubv fp_glSecondaryColor3ubv; +typedef void (APIENTRYP pfn_glSecondaryColor3ui) (GLuint, GLuint, GLuint); +extern pfn_glSecondaryColor3ui fp_glSecondaryColor3ui; +typedef void (APIENTRYP pfn_glSecondaryColor3uiv) (const GLuint*); +extern pfn_glSecondaryColor3uiv fp_glSecondaryColor3uiv; +typedef void (APIENTRYP pfn_glSecondaryColor3us) (GLushort, GLushort, GLushort); +extern pfn_glSecondaryColor3us fp_glSecondaryColor3us; +typedef void (APIENTRYP pfn_glSecondaryColor3usv) (const GLushort*); +extern pfn_glSecondaryColor3usv fp_glSecondaryColor3usv; +typedef void (APIENTRYP pfn_glSecondaryColorPointer) (GLint, GLenum, GLsizei, const void*); +extern pfn_glSecondaryColorPointer fp_glSecondaryColorPointer; +typedef void (APIENTRYP pfn_glWindowPos2d) (GLdouble, GLdouble); +extern pfn_glWindowPos2d fp_glWindowPos2d; +typedef void (APIENTRYP pfn_glWindowPos2dv) (const GLdouble*); +extern pfn_glWindowPos2dv fp_glWindowPos2dv; +typedef void (APIENTRYP pfn_glWindowPos2f) (GLfloat, GLfloat); +extern pfn_glWindowPos2f fp_glWindowPos2f; +typedef void (APIENTRYP pfn_glWindowPos2fv) (const GLfloat*); +extern pfn_glWindowPos2fv fp_glWindowPos2fv; +typedef void (APIENTRYP pfn_glWindowPos2i) (GLint, GLint); +extern pfn_glWindowPos2i fp_glWindowPos2i; +typedef void (APIENTRYP pfn_glWindowPos2iv) (const GLint*); +extern pfn_glWindowPos2iv fp_glWindowPos2iv; +typedef void (APIENTRYP pfn_glWindowPos2s) (GLshort, GLshort); +extern pfn_glWindowPos2s fp_glWindowPos2s; +typedef void (APIENTRYP pfn_glWindowPos2sv) (const GLshort*); +extern pfn_glWindowPos2sv fp_glWindowPos2sv; +typedef void (APIENTRYP pfn_glWindowPos3d) (GLdouble, GLdouble, GLdouble); +extern pfn_glWindowPos3d fp_glWindowPos3d; +typedef void (APIENTRYP pfn_glWindowPos3dv) (const GLdouble*); +extern pfn_glWindowPos3dv fp_glWindowPos3dv; +typedef void (APIENTRYP pfn_glWindowPos3f) (GLfloat, GLfloat, GLfloat); +extern pfn_glWindowPos3f fp_glWindowPos3f; +typedef void (APIENTRYP pfn_glWindowPos3fv) (const GLfloat*); +extern pfn_glWindowPos3fv fp_glWindowPos3fv; +typedef void (APIENTRYP pfn_glWindowPos3i) (GLint, GLint, GLint); +extern pfn_glWindowPos3i fp_glWindowPos3i; +typedef void (APIENTRYP pfn_glWindowPos3iv) (const GLint*); +extern pfn_glWindowPos3iv fp_glWindowPos3iv; +typedef void (APIENTRYP pfn_glWindowPos3s) (GLshort, GLshort, GLshort); +extern pfn_glWindowPos3s fp_glWindowPos3s; +typedef void (APIENTRYP pfn_glWindowPos3sv) (const GLshort*); +extern pfn_glWindowPos3sv fp_glWindowPos3sv; +typedef void (APIENTRYP pfn_glBlendColor) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glBlendColor fp_glBlendColor; +typedef void (APIENTRYP pfn_glBlendEquation) (GLenum); +extern pfn_glBlendEquation fp_glBlendEquation; + + /* GL_VERSION_1_5 */ +extern GLboolean GLAD_VERSION_1_5; +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SRC1_ALPHA 0x8589 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC2_ALPHA 0x858A +typedef void (APIENTRYP pfn_glGenQueries) (GLsizei, GLuint*); +extern pfn_glGenQueries fp_glGenQueries; +typedef void (APIENTRYP pfn_glDeleteQueries) (GLsizei, const GLuint*); +extern pfn_glDeleteQueries fp_glDeleteQueries; +typedef GLboolean (APIENTRYP pfn_glIsQuery) (GLuint); +extern pfn_glIsQuery fp_glIsQuery; +typedef void (APIENTRYP pfn_glBeginQuery) (GLenum, GLuint); +extern pfn_glBeginQuery fp_glBeginQuery; +typedef void (APIENTRYP pfn_glEndQuery) (GLenum); +extern pfn_glEndQuery fp_glEndQuery; +typedef void (APIENTRYP pfn_glGetQueryiv) (GLenum, GLenum, GLint*); +extern pfn_glGetQueryiv fp_glGetQueryiv; +typedef void (APIENTRYP pfn_glGetQueryObjectiv) (GLuint, GLenum, GLint*); +extern pfn_glGetQueryObjectiv fp_glGetQueryObjectiv; +typedef void (APIENTRYP pfn_glGetQueryObjectuiv) (GLuint, GLenum, GLuint*); +extern pfn_glGetQueryObjectuiv fp_glGetQueryObjectuiv; +typedef void (APIENTRYP pfn_glBindBuffer) (GLenum, GLuint); +extern pfn_glBindBuffer fp_glBindBuffer; +typedef void (APIENTRYP pfn_glDeleteBuffers) (GLsizei, const GLuint*); +extern pfn_glDeleteBuffers fp_glDeleteBuffers; +typedef void (APIENTRYP pfn_glGenBuffers) (GLsizei, GLuint*); +extern pfn_glGenBuffers fp_glGenBuffers; +typedef GLboolean (APIENTRYP pfn_glIsBuffer) (GLuint); +extern pfn_glIsBuffer fp_glIsBuffer; +typedef void (APIENTRYP pfn_glBufferData) (GLenum, GLsizeiptr, const void*, GLenum); +extern pfn_glBufferData fp_glBufferData; +typedef void (APIENTRYP pfn_glBufferSubData) (GLenum, GLintptr, GLsizeiptr, const void*); +extern pfn_glBufferSubData fp_glBufferSubData; +typedef void (APIENTRYP pfn_glGetBufferSubData) (GLenum, GLintptr, GLsizeiptr, void*); +extern pfn_glGetBufferSubData fp_glGetBufferSubData; +typedef void* (APIENTRYP pfn_glMapBuffer) (GLenum, GLenum); +extern pfn_glMapBuffer fp_glMapBuffer; +typedef GLboolean (APIENTRYP pfn_glUnmapBuffer) (GLenum); +extern pfn_glUnmapBuffer fp_glUnmapBuffer; +typedef void (APIENTRYP pfn_glGetBufferParameteriv) (GLenum, GLenum, GLint*); +extern pfn_glGetBufferParameteriv fp_glGetBufferParameteriv; +typedef void (APIENTRYP pfn_glGetBufferPointerv) (GLenum, GLenum, void**); +extern pfn_glGetBufferPointerv fp_glGetBufferPointerv; + + /* GL_VERSION_2_0 */ +extern GLboolean GLAD_VERSION_2_0; +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +typedef void (APIENTRYP pfn_glBlendEquationSeparate) (GLenum, GLenum); +extern pfn_glBlendEquationSeparate fp_glBlendEquationSeparate; +typedef void (APIENTRYP pfn_glDrawBuffers) (GLsizei, const GLenum*); +extern pfn_glDrawBuffers fp_glDrawBuffers; +typedef void (APIENTRYP pfn_glStencilOpSeparate) (GLenum, GLenum, GLenum, GLenum); +extern pfn_glStencilOpSeparate fp_glStencilOpSeparate; +typedef void (APIENTRYP pfn_glStencilFuncSeparate) (GLenum, GLenum, GLint, GLuint); +extern pfn_glStencilFuncSeparate fp_glStencilFuncSeparate; +typedef void (APIENTRYP pfn_glStencilMaskSeparate) (GLenum, GLuint); +extern pfn_glStencilMaskSeparate fp_glStencilMaskSeparate; +typedef void (APIENTRYP pfn_glAttachShader) (GLuint, GLuint); +extern pfn_glAttachShader fp_glAttachShader; +typedef void (APIENTRYP pfn_glBindAttribLocation) (GLuint, GLuint, const GLchar*); +extern pfn_glBindAttribLocation fp_glBindAttribLocation; +typedef void (APIENTRYP pfn_glCompileShader) (GLuint); +extern pfn_glCompileShader fp_glCompileShader; +typedef GLuint (APIENTRYP pfn_glCreateProgram) (); +extern pfn_glCreateProgram fp_glCreateProgram; +typedef GLuint (APIENTRYP pfn_glCreateShader) (GLenum); +extern pfn_glCreateShader fp_glCreateShader; +typedef void (APIENTRYP pfn_glDeleteProgram) (GLuint); +extern pfn_glDeleteProgram fp_glDeleteProgram; +typedef void (APIENTRYP pfn_glDeleteShader) (GLuint); +extern pfn_glDeleteShader fp_glDeleteShader; +typedef void (APIENTRYP pfn_glDetachShader) (GLuint, GLuint); +extern pfn_glDetachShader fp_glDetachShader; +typedef void (APIENTRYP pfn_glDisableVertexAttribArray) (GLuint); +extern pfn_glDisableVertexAttribArray fp_glDisableVertexAttribArray; +typedef void (APIENTRYP pfn_glEnableVertexAttribArray) (GLuint); +extern pfn_glEnableVertexAttribArray fp_glEnableVertexAttribArray; +typedef void (APIENTRYP pfn_glGetActiveAttrib) (GLuint, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLchar*); +extern pfn_glGetActiveAttrib fp_glGetActiveAttrib; +typedef void (APIENTRYP pfn_glGetActiveUniform) (GLuint, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLchar*); +extern pfn_glGetActiveUniform fp_glGetActiveUniform; +typedef void (APIENTRYP pfn_glGetAttachedShaders) (GLuint, GLsizei, GLsizei*, GLuint*); +extern pfn_glGetAttachedShaders fp_glGetAttachedShaders; +typedef GLint (APIENTRYP pfn_glGetAttribLocation) (GLuint, const GLchar*); +extern pfn_glGetAttribLocation fp_glGetAttribLocation; +typedef void (APIENTRYP pfn_glGetProgramiv) (GLuint, GLenum, GLint*); +extern pfn_glGetProgramiv fp_glGetProgramiv; +typedef void (APIENTRYP pfn_glGetProgramInfoLog) (GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetProgramInfoLog fp_glGetProgramInfoLog; +typedef void (APIENTRYP pfn_glGetShaderiv) (GLuint, GLenum, GLint*); +extern pfn_glGetShaderiv fp_glGetShaderiv; +typedef void (APIENTRYP pfn_glGetShaderInfoLog) (GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetShaderInfoLog fp_glGetShaderInfoLog; +typedef void (APIENTRYP pfn_glGetShaderSource) (GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetShaderSource fp_glGetShaderSource; +typedef GLint (APIENTRYP pfn_glGetUniformLocation) (GLuint, const GLchar*); +extern pfn_glGetUniformLocation fp_glGetUniformLocation; +typedef void (APIENTRYP pfn_glGetUniformfv) (GLuint, GLint, GLfloat*); +extern pfn_glGetUniformfv fp_glGetUniformfv; +typedef void (APIENTRYP pfn_glGetUniformiv) (GLuint, GLint, GLint*); +extern pfn_glGetUniformiv fp_glGetUniformiv; +typedef void (APIENTRYP pfn_glGetVertexAttribdv) (GLuint, GLenum, GLdouble*); +extern pfn_glGetVertexAttribdv fp_glGetVertexAttribdv; +typedef void (APIENTRYP pfn_glGetVertexAttribfv) (GLuint, GLenum, GLfloat*); +extern pfn_glGetVertexAttribfv fp_glGetVertexAttribfv; +typedef void (APIENTRYP pfn_glGetVertexAttribiv) (GLuint, GLenum, GLint*); +extern pfn_glGetVertexAttribiv fp_glGetVertexAttribiv; +typedef void (APIENTRYP pfn_glGetVertexAttribPointerv) (GLuint, GLenum, void**); +extern pfn_glGetVertexAttribPointerv fp_glGetVertexAttribPointerv; +typedef GLboolean (APIENTRYP pfn_glIsProgram) (GLuint); +extern pfn_glIsProgram fp_glIsProgram; +typedef GLboolean (APIENTRYP pfn_glIsShader) (GLuint); +extern pfn_glIsShader fp_glIsShader; +typedef void (APIENTRYP pfn_glLinkProgram) (GLuint); +extern pfn_glLinkProgram fp_glLinkProgram; +typedef void (APIENTRYP pfn_glShaderSource) (GLuint, GLsizei, const GLchar**, const GLint*); +extern pfn_glShaderSource fp_glShaderSource; +typedef void (APIENTRYP pfn_glUseProgram) (GLuint); +extern pfn_glUseProgram fp_glUseProgram; +typedef void (APIENTRYP pfn_glUniform1f) (GLint, GLfloat); +extern pfn_glUniform1f fp_glUniform1f; +typedef void (APIENTRYP pfn_glUniform2f) (GLint, GLfloat, GLfloat); +extern pfn_glUniform2f fp_glUniform2f; +typedef void (APIENTRYP pfn_glUniform3f) (GLint, GLfloat, GLfloat, GLfloat); +extern pfn_glUniform3f fp_glUniform3f; +typedef void (APIENTRYP pfn_glUniform4f) (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glUniform4f fp_glUniform4f; +typedef void (APIENTRYP pfn_glUniform1i) (GLint, GLint); +extern pfn_glUniform1i fp_glUniform1i; +typedef void (APIENTRYP pfn_glUniform2i) (GLint, GLint, GLint); +extern pfn_glUniform2i fp_glUniform2i; +typedef void (APIENTRYP pfn_glUniform3i) (GLint, GLint, GLint, GLint); +extern pfn_glUniform3i fp_glUniform3i; +typedef void (APIENTRYP pfn_glUniform4i) (GLint, GLint, GLint, GLint, GLint); +extern pfn_glUniform4i fp_glUniform4i; +typedef void (APIENTRYP pfn_glUniform1fv) (GLint, GLsizei, const GLfloat*); +extern pfn_glUniform1fv fp_glUniform1fv; +typedef void (APIENTRYP pfn_glUniform2fv) (GLint, GLsizei, const GLfloat*); +extern pfn_glUniform2fv fp_glUniform2fv; +typedef void (APIENTRYP pfn_glUniform3fv) (GLint, GLsizei, const GLfloat*); +extern pfn_glUniform3fv fp_glUniform3fv; +typedef void (APIENTRYP pfn_glUniform4fv) (GLint, GLsizei, const GLfloat*); +extern pfn_glUniform4fv fp_glUniform4fv; +typedef void (APIENTRYP pfn_glUniform1iv) (GLint, GLsizei, const GLint*); +extern pfn_glUniform1iv fp_glUniform1iv; +typedef void (APIENTRYP pfn_glUniform2iv) (GLint, GLsizei, const GLint*); +extern pfn_glUniform2iv fp_glUniform2iv; +typedef void (APIENTRYP pfn_glUniform3iv) (GLint, GLsizei, const GLint*); +extern pfn_glUniform3iv fp_glUniform3iv; +typedef void (APIENTRYP pfn_glUniform4iv) (GLint, GLsizei, const GLint*); +extern pfn_glUniform4iv fp_glUniform4iv; +typedef void (APIENTRYP pfn_glUniformMatrix2fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix2fv fp_glUniformMatrix2fv; +typedef void (APIENTRYP pfn_glUniformMatrix3fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix3fv fp_glUniformMatrix3fv; +typedef void (APIENTRYP pfn_glUniformMatrix4fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix4fv fp_glUniformMatrix4fv; +typedef void (APIENTRYP pfn_glValidateProgram) (GLuint); +extern pfn_glValidateProgram fp_glValidateProgram; +typedef void (APIENTRYP pfn_glVertexAttrib1d) (GLuint, GLdouble); +extern pfn_glVertexAttrib1d fp_glVertexAttrib1d; +typedef void (APIENTRYP pfn_glVertexAttrib1dv) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib1dv fp_glVertexAttrib1dv; +typedef void (APIENTRYP pfn_glVertexAttrib1f) (GLuint, GLfloat); +extern pfn_glVertexAttrib1f fp_glVertexAttrib1f; +typedef void (APIENTRYP pfn_glVertexAttrib1fv) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib1fv fp_glVertexAttrib1fv; +typedef void (APIENTRYP pfn_glVertexAttrib1s) (GLuint, GLshort); +extern pfn_glVertexAttrib1s fp_glVertexAttrib1s; +typedef void (APIENTRYP pfn_glVertexAttrib1sv) (GLuint, const GLshort*); +extern pfn_glVertexAttrib1sv fp_glVertexAttrib1sv; +typedef void (APIENTRYP pfn_glVertexAttrib2d) (GLuint, GLdouble, GLdouble); +extern pfn_glVertexAttrib2d fp_glVertexAttrib2d; +typedef void (APIENTRYP pfn_glVertexAttrib2dv) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib2dv fp_glVertexAttrib2dv; +typedef void (APIENTRYP pfn_glVertexAttrib2f) (GLuint, GLfloat, GLfloat); +extern pfn_glVertexAttrib2f fp_glVertexAttrib2f; +typedef void (APIENTRYP pfn_glVertexAttrib2fv) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib2fv fp_glVertexAttrib2fv; +typedef void (APIENTRYP pfn_glVertexAttrib2s) (GLuint, GLshort, GLshort); +extern pfn_glVertexAttrib2s fp_glVertexAttrib2s; +typedef void (APIENTRYP pfn_glVertexAttrib2sv) (GLuint, const GLshort*); +extern pfn_glVertexAttrib2sv fp_glVertexAttrib2sv; +typedef void (APIENTRYP pfn_glVertexAttrib3d) (GLuint, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttrib3d fp_glVertexAttrib3d; +typedef void (APIENTRYP pfn_glVertexAttrib3dv) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib3dv fp_glVertexAttrib3dv; +typedef void (APIENTRYP pfn_glVertexAttrib3f) (GLuint, GLfloat, GLfloat, GLfloat); +extern pfn_glVertexAttrib3f fp_glVertexAttrib3f; +typedef void (APIENTRYP pfn_glVertexAttrib3fv) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib3fv fp_glVertexAttrib3fv; +typedef void (APIENTRYP pfn_glVertexAttrib3s) (GLuint, GLshort, GLshort, GLshort); +extern pfn_glVertexAttrib3s fp_glVertexAttrib3s; +typedef void (APIENTRYP pfn_glVertexAttrib3sv) (GLuint, const GLshort*); +extern pfn_glVertexAttrib3sv fp_glVertexAttrib3sv; +typedef void (APIENTRYP pfn_glVertexAttrib4Nbv) (GLuint, const GLbyte*); +extern pfn_glVertexAttrib4Nbv fp_glVertexAttrib4Nbv; +typedef void (APIENTRYP pfn_glVertexAttrib4Niv) (GLuint, const GLint*); +extern pfn_glVertexAttrib4Niv fp_glVertexAttrib4Niv; +typedef void (APIENTRYP pfn_glVertexAttrib4Nsv) (GLuint, const GLshort*); +extern pfn_glVertexAttrib4Nsv fp_glVertexAttrib4Nsv; +typedef void (APIENTRYP pfn_glVertexAttrib4Nub) (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +extern pfn_glVertexAttrib4Nub fp_glVertexAttrib4Nub; +typedef void (APIENTRYP pfn_glVertexAttrib4Nubv) (GLuint, const GLubyte*); +extern pfn_glVertexAttrib4Nubv fp_glVertexAttrib4Nubv; +typedef void (APIENTRYP pfn_glVertexAttrib4Nuiv) (GLuint, const GLuint*); +extern pfn_glVertexAttrib4Nuiv fp_glVertexAttrib4Nuiv; +typedef void (APIENTRYP pfn_glVertexAttrib4Nusv) (GLuint, const GLushort*); +extern pfn_glVertexAttrib4Nusv fp_glVertexAttrib4Nusv; +typedef void (APIENTRYP pfn_glVertexAttrib4bv) (GLuint, const GLbyte*); +extern pfn_glVertexAttrib4bv fp_glVertexAttrib4bv; +typedef void (APIENTRYP pfn_glVertexAttrib4d) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttrib4d fp_glVertexAttrib4d; +typedef void (APIENTRYP pfn_glVertexAttrib4dv) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib4dv fp_glVertexAttrib4dv; +typedef void (APIENTRYP pfn_glVertexAttrib4f) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glVertexAttrib4f fp_glVertexAttrib4f; +typedef void (APIENTRYP pfn_glVertexAttrib4fv) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib4fv fp_glVertexAttrib4fv; +typedef void (APIENTRYP pfn_glVertexAttrib4iv) (GLuint, const GLint*); +extern pfn_glVertexAttrib4iv fp_glVertexAttrib4iv; +typedef void (APIENTRYP pfn_glVertexAttrib4s) (GLuint, GLshort, GLshort, GLshort, GLshort); +extern pfn_glVertexAttrib4s fp_glVertexAttrib4s; +typedef void (APIENTRYP pfn_glVertexAttrib4sv) (GLuint, const GLshort*); +extern pfn_glVertexAttrib4sv fp_glVertexAttrib4sv; +typedef void (APIENTRYP pfn_glVertexAttrib4ubv) (GLuint, const GLubyte*); +extern pfn_glVertexAttrib4ubv fp_glVertexAttrib4ubv; +typedef void (APIENTRYP pfn_glVertexAttrib4uiv) (GLuint, const GLuint*); +extern pfn_glVertexAttrib4uiv fp_glVertexAttrib4uiv; +typedef void (APIENTRYP pfn_glVertexAttrib4usv) (GLuint, const GLushort*); +extern pfn_glVertexAttrib4usv fp_glVertexAttrib4usv; +typedef void (APIENTRYP pfn_glVertexAttribPointer) (GLuint, GLint, GLenum, GLboolean, GLsizei, const void*); +extern pfn_glVertexAttribPointer fp_glVertexAttribPointer; + + /* GL_VERSION_2_1 */ +extern GLboolean GLAD_VERSION_2_1; +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +typedef void (APIENTRYP pfn_glUniformMatrix2x3fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix2x3fv fp_glUniformMatrix2x3fv; +typedef void (APIENTRYP pfn_glUniformMatrix3x2fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix3x2fv fp_glUniformMatrix3x2fv; +typedef void (APIENTRYP pfn_glUniformMatrix2x4fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix2x4fv fp_glUniformMatrix2x4fv; +typedef void (APIENTRYP pfn_glUniformMatrix4x2fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix4x2fv fp_glUniformMatrix4x2fv; +typedef void (APIENTRYP pfn_glUniformMatrix3x4fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix3x4fv fp_glUniformMatrix3x4fv; +typedef void (APIENTRYP pfn_glUniformMatrix4x3fv) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix4x3fv fp_glUniformMatrix4x3fv; + + /* GL_VERSION_3_0 */ +extern GLboolean GLAD_VERSION_3_0; +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_HALF_FLOAT 0x140B +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +typedef void (APIENTRYP pfn_glColorMaski) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); +extern pfn_glColorMaski fp_glColorMaski; +typedef void (APIENTRYP pfn_glGetBooleani_v) (GLenum, GLuint, GLboolean*); +extern pfn_glGetBooleani_v fp_glGetBooleani_v; +typedef void (APIENTRYP pfn_glGetIntegeri_v) (GLenum, GLuint, GLint*); +extern pfn_glGetIntegeri_v fp_glGetIntegeri_v; +typedef void (APIENTRYP pfn_glEnablei) (GLenum, GLuint); +extern pfn_glEnablei fp_glEnablei; +typedef void (APIENTRYP pfn_glDisablei) (GLenum, GLuint); +extern pfn_glDisablei fp_glDisablei; +typedef GLboolean (APIENTRYP pfn_glIsEnabledi) (GLenum, GLuint); +extern pfn_glIsEnabledi fp_glIsEnabledi; +typedef void (APIENTRYP pfn_glBeginTransformFeedback) (GLenum); +extern pfn_glBeginTransformFeedback fp_glBeginTransformFeedback; +typedef void (APIENTRYP pfn_glEndTransformFeedback) (); +extern pfn_glEndTransformFeedback fp_glEndTransformFeedback; +typedef void (APIENTRYP pfn_glBindBufferRange) (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr); +extern pfn_glBindBufferRange fp_glBindBufferRange; +typedef void (APIENTRYP pfn_glBindBufferBase) (GLenum, GLuint, GLuint); +extern pfn_glBindBufferBase fp_glBindBufferBase; +typedef void (APIENTRYP pfn_glTransformFeedbackVaryings) (GLuint, GLsizei, const GLchar**, GLenum); +extern pfn_glTransformFeedbackVaryings fp_glTransformFeedbackVaryings; +typedef void (APIENTRYP pfn_glGetTransformFeedbackVarying) (GLuint, GLuint, GLsizei, GLsizei*, GLsizei*, GLenum*, GLchar*); +extern pfn_glGetTransformFeedbackVarying fp_glGetTransformFeedbackVarying; +typedef void (APIENTRYP pfn_glClampColor) (GLenum, GLenum); +extern pfn_glClampColor fp_glClampColor; +typedef void (APIENTRYP pfn_glBeginConditionalRender) (GLuint, GLenum); +extern pfn_glBeginConditionalRender fp_glBeginConditionalRender; +typedef void (APIENTRYP pfn_glEndConditionalRender) (); +extern pfn_glEndConditionalRender fp_glEndConditionalRender; +typedef void (APIENTRYP pfn_glVertexAttribIPointer) (GLuint, GLint, GLenum, GLsizei, const void*); +extern pfn_glVertexAttribIPointer fp_glVertexAttribIPointer; +typedef void (APIENTRYP pfn_glGetVertexAttribIiv) (GLuint, GLenum, GLint*); +extern pfn_glGetVertexAttribIiv fp_glGetVertexAttribIiv; +typedef void (APIENTRYP pfn_glGetVertexAttribIuiv) (GLuint, GLenum, GLuint*); +extern pfn_glGetVertexAttribIuiv fp_glGetVertexAttribIuiv; +typedef void (APIENTRYP pfn_glVertexAttribI1i) (GLuint, GLint); +extern pfn_glVertexAttribI1i fp_glVertexAttribI1i; +typedef void (APIENTRYP pfn_glVertexAttribI2i) (GLuint, GLint, GLint); +extern pfn_glVertexAttribI2i fp_glVertexAttribI2i; +typedef void (APIENTRYP pfn_glVertexAttribI3i) (GLuint, GLint, GLint, GLint); +extern pfn_glVertexAttribI3i fp_glVertexAttribI3i; +typedef void (APIENTRYP pfn_glVertexAttribI4i) (GLuint, GLint, GLint, GLint, GLint); +extern pfn_glVertexAttribI4i fp_glVertexAttribI4i; +typedef void (APIENTRYP pfn_glVertexAttribI1ui) (GLuint, GLuint); +extern pfn_glVertexAttribI1ui fp_glVertexAttribI1ui; +typedef void (APIENTRYP pfn_glVertexAttribI2ui) (GLuint, GLuint, GLuint); +extern pfn_glVertexAttribI2ui fp_glVertexAttribI2ui; +typedef void (APIENTRYP pfn_glVertexAttribI3ui) (GLuint, GLuint, GLuint, GLuint); +extern pfn_glVertexAttribI3ui fp_glVertexAttribI3ui; +typedef void (APIENTRYP pfn_glVertexAttribI4ui) (GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glVertexAttribI4ui fp_glVertexAttribI4ui; +typedef void (APIENTRYP pfn_glVertexAttribI1iv) (GLuint, const GLint*); +extern pfn_glVertexAttribI1iv fp_glVertexAttribI1iv; +typedef void (APIENTRYP pfn_glVertexAttribI2iv) (GLuint, const GLint*); +extern pfn_glVertexAttribI2iv fp_glVertexAttribI2iv; +typedef void (APIENTRYP pfn_glVertexAttribI3iv) (GLuint, const GLint*); +extern pfn_glVertexAttribI3iv fp_glVertexAttribI3iv; +typedef void (APIENTRYP pfn_glVertexAttribI4iv) (GLuint, const GLint*); +extern pfn_glVertexAttribI4iv fp_glVertexAttribI4iv; +typedef void (APIENTRYP pfn_glVertexAttribI1uiv) (GLuint, const GLuint*); +extern pfn_glVertexAttribI1uiv fp_glVertexAttribI1uiv; +typedef void (APIENTRYP pfn_glVertexAttribI2uiv) (GLuint, const GLuint*); +extern pfn_glVertexAttribI2uiv fp_glVertexAttribI2uiv; +typedef void (APIENTRYP pfn_glVertexAttribI3uiv) (GLuint, const GLuint*); +extern pfn_glVertexAttribI3uiv fp_glVertexAttribI3uiv; +typedef void (APIENTRYP pfn_glVertexAttribI4uiv) (GLuint, const GLuint*); +extern pfn_glVertexAttribI4uiv fp_glVertexAttribI4uiv; +typedef void (APIENTRYP pfn_glVertexAttribI4bv) (GLuint, const GLbyte*); +extern pfn_glVertexAttribI4bv fp_glVertexAttribI4bv; +typedef void (APIENTRYP pfn_glVertexAttribI4sv) (GLuint, const GLshort*); +extern pfn_glVertexAttribI4sv fp_glVertexAttribI4sv; +typedef void (APIENTRYP pfn_glVertexAttribI4ubv) (GLuint, const GLubyte*); +extern pfn_glVertexAttribI4ubv fp_glVertexAttribI4ubv; +typedef void (APIENTRYP pfn_glVertexAttribI4usv) (GLuint, const GLushort*); +extern pfn_glVertexAttribI4usv fp_glVertexAttribI4usv; +typedef void (APIENTRYP pfn_glGetUniformuiv) (GLuint, GLint, GLuint*); +extern pfn_glGetUniformuiv fp_glGetUniformuiv; +typedef void (APIENTRYP pfn_glBindFragDataLocation) (GLuint, GLuint, const GLchar*); +extern pfn_glBindFragDataLocation fp_glBindFragDataLocation; +typedef GLint (APIENTRYP pfn_glGetFragDataLocation) (GLuint, const GLchar*); +extern pfn_glGetFragDataLocation fp_glGetFragDataLocation; +typedef void (APIENTRYP pfn_glUniform1ui) (GLint, GLuint); +extern pfn_glUniform1ui fp_glUniform1ui; +typedef void (APIENTRYP pfn_glUniform2ui) (GLint, GLuint, GLuint); +extern pfn_glUniform2ui fp_glUniform2ui; +typedef void (APIENTRYP pfn_glUniform3ui) (GLint, GLuint, GLuint, GLuint); +extern pfn_glUniform3ui fp_glUniform3ui; +typedef void (APIENTRYP pfn_glUniform4ui) (GLint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glUniform4ui fp_glUniform4ui; +typedef void (APIENTRYP pfn_glUniform1uiv) (GLint, GLsizei, const GLuint*); +extern pfn_glUniform1uiv fp_glUniform1uiv; +typedef void (APIENTRYP pfn_glUniform2uiv) (GLint, GLsizei, const GLuint*); +extern pfn_glUniform2uiv fp_glUniform2uiv; +typedef void (APIENTRYP pfn_glUniform3uiv) (GLint, GLsizei, const GLuint*); +extern pfn_glUniform3uiv fp_glUniform3uiv; +typedef void (APIENTRYP pfn_glUniform4uiv) (GLint, GLsizei, const GLuint*); +extern pfn_glUniform4uiv fp_glUniform4uiv; +typedef void (APIENTRYP pfn_glTexParameterIiv) (GLenum, GLenum, const GLint*); +extern pfn_glTexParameterIiv fp_glTexParameterIiv; +typedef void (APIENTRYP pfn_glTexParameterIuiv) (GLenum, GLenum, const GLuint*); +extern pfn_glTexParameterIuiv fp_glTexParameterIuiv; +typedef void (APIENTRYP pfn_glGetTexParameterIiv) (GLenum, GLenum, GLint*); +extern pfn_glGetTexParameterIiv fp_glGetTexParameterIiv; +typedef void (APIENTRYP pfn_glGetTexParameterIuiv) (GLenum, GLenum, GLuint*); +extern pfn_glGetTexParameterIuiv fp_glGetTexParameterIuiv; +typedef void (APIENTRYP pfn_glClearBufferiv) (GLenum, GLint, const GLint*); +extern pfn_glClearBufferiv fp_glClearBufferiv; +typedef void (APIENTRYP pfn_glClearBufferuiv) (GLenum, GLint, const GLuint*); +extern pfn_glClearBufferuiv fp_glClearBufferuiv; +typedef void (APIENTRYP pfn_glClearBufferfv) (GLenum, GLint, const GLfloat*); +extern pfn_glClearBufferfv fp_glClearBufferfv; +typedef void (APIENTRYP pfn_glClearBufferfi) (GLenum, GLint, GLfloat, GLint); +extern pfn_glClearBufferfi fp_glClearBufferfi; +typedef const GLubyte* (APIENTRYP pfn_glGetStringi) (GLenum, GLuint); +extern pfn_glGetStringi fp_glGetStringi; +typedef GLboolean (APIENTRYP pfn_glIsRenderbuffer) (GLuint); +extern pfn_glIsRenderbuffer fp_glIsRenderbuffer; +typedef void (APIENTRYP pfn_glBindRenderbuffer) (GLenum, GLuint); +extern pfn_glBindRenderbuffer fp_glBindRenderbuffer; +typedef void (APIENTRYP pfn_glDeleteRenderbuffers) (GLsizei, const GLuint*); +extern pfn_glDeleteRenderbuffers fp_glDeleteRenderbuffers; +typedef void (APIENTRYP pfn_glGenRenderbuffers) (GLsizei, GLuint*); +extern pfn_glGenRenderbuffers fp_glGenRenderbuffers; +typedef void (APIENTRYP pfn_glRenderbufferStorage) (GLenum, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorage fp_glRenderbufferStorage; +typedef void (APIENTRYP pfn_glGetRenderbufferParameteriv) (GLenum, GLenum, GLint*); +extern pfn_glGetRenderbufferParameteriv fp_glGetRenderbufferParameteriv; +typedef GLboolean (APIENTRYP pfn_glIsFramebuffer) (GLuint); +extern pfn_glIsFramebuffer fp_glIsFramebuffer; +typedef void (APIENTRYP pfn_glBindFramebuffer) (GLenum, GLuint); +extern pfn_glBindFramebuffer fp_glBindFramebuffer; +typedef void (APIENTRYP pfn_glDeleteFramebuffers) (GLsizei, const GLuint*); +extern pfn_glDeleteFramebuffers fp_glDeleteFramebuffers; +typedef void (APIENTRYP pfn_glGenFramebuffers) (GLsizei, GLuint*); +extern pfn_glGenFramebuffers fp_glGenFramebuffers; +typedef GLenum (APIENTRYP pfn_glCheckFramebufferStatus) (GLenum); +extern pfn_glCheckFramebufferStatus fp_glCheckFramebufferStatus; +typedef void (APIENTRYP pfn_glFramebufferTexture1D) (GLenum, GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTexture1D fp_glFramebufferTexture1D; +typedef void (APIENTRYP pfn_glFramebufferTexture2D) (GLenum, GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTexture2D fp_glFramebufferTexture2D; +typedef void (APIENTRYP pfn_glFramebufferTexture3D) (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +extern pfn_glFramebufferTexture3D fp_glFramebufferTexture3D; +typedef void (APIENTRYP pfn_glFramebufferRenderbuffer) (GLenum, GLenum, GLenum, GLuint); +extern pfn_glFramebufferRenderbuffer fp_glFramebufferRenderbuffer; +typedef void (APIENTRYP pfn_glGetFramebufferAttachmentParameteriv) (GLenum, GLenum, GLenum, GLint*); +extern pfn_glGetFramebufferAttachmentParameteriv fp_glGetFramebufferAttachmentParameteriv; +typedef void (APIENTRYP pfn_glGenerateMipmap) (GLenum); +extern pfn_glGenerateMipmap fp_glGenerateMipmap; +typedef void (APIENTRYP pfn_glBlitFramebuffer) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +extern pfn_glBlitFramebuffer fp_glBlitFramebuffer; +typedef void (APIENTRYP pfn_glRenderbufferStorageMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorageMultisample fp_glRenderbufferStorageMultisample; +typedef void (APIENTRYP pfn_glFramebufferTextureLayer) (GLenum, GLenum, GLuint, GLint, GLint); +extern pfn_glFramebufferTextureLayer fp_glFramebufferTextureLayer; +typedef void* (APIENTRYP pfn_glMapBufferRange) (GLenum, GLintptr, GLsizeiptr, GLbitfield); +extern pfn_glMapBufferRange fp_glMapBufferRange; +typedef void (APIENTRYP pfn_glFlushMappedBufferRange) (GLenum, GLintptr, GLsizeiptr); +extern pfn_glFlushMappedBufferRange fp_glFlushMappedBufferRange; +typedef void (APIENTRYP pfn_glBindVertexArray) (GLuint); +extern pfn_glBindVertexArray fp_glBindVertexArray; +typedef void (APIENTRYP pfn_glDeleteVertexArrays) (GLsizei, const GLuint*); +extern pfn_glDeleteVertexArrays fp_glDeleteVertexArrays; +typedef void (APIENTRYP pfn_glGenVertexArrays) (GLsizei, GLuint*); +extern pfn_glGenVertexArrays fp_glGenVertexArrays; +typedef GLboolean (APIENTRYP pfn_glIsVertexArray) (GLuint); +extern pfn_glIsVertexArray fp_glIsVertexArray; + + /* GL_VERSION_3_1 */ +extern GLboolean GLAD_VERSION_3_1; +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFF +typedef void (APIENTRYP pfn_glDrawArraysInstanced) (GLenum, GLint, GLsizei, GLsizei); +extern pfn_glDrawArraysInstanced fp_glDrawArraysInstanced; +typedef void (APIENTRYP pfn_glDrawElementsInstanced) (GLenum, GLsizei, GLenum, const void*, GLsizei); +extern pfn_glDrawElementsInstanced fp_glDrawElementsInstanced; +typedef void (APIENTRYP pfn_glTexBuffer) (GLenum, GLenum, GLuint); +extern pfn_glTexBuffer fp_glTexBuffer; +typedef void (APIENTRYP pfn_glPrimitiveRestartIndex) (GLuint); +extern pfn_glPrimitiveRestartIndex fp_glPrimitiveRestartIndex; +typedef void (APIENTRYP pfn_glCopyBufferSubData) (GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr); +extern pfn_glCopyBufferSubData fp_glCopyBufferSubData; +typedef void (APIENTRYP pfn_glGetUniformIndices) (GLuint, GLsizei, const GLchar**, GLuint*); +extern pfn_glGetUniformIndices fp_glGetUniformIndices; +typedef void (APIENTRYP pfn_glGetActiveUniformsiv) (GLuint, GLsizei, const GLuint*, GLenum, GLint*); +extern pfn_glGetActiveUniformsiv fp_glGetActiveUniformsiv; +typedef void (APIENTRYP pfn_glGetActiveUniformName) (GLuint, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetActiveUniformName fp_glGetActiveUniformName; +typedef GLuint (APIENTRYP pfn_glGetUniformBlockIndex) (GLuint, const GLchar*); +extern pfn_glGetUniformBlockIndex fp_glGetUniformBlockIndex; +typedef void (APIENTRYP pfn_glGetActiveUniformBlockiv) (GLuint, GLuint, GLenum, GLint*); +extern pfn_glGetActiveUniformBlockiv fp_glGetActiveUniformBlockiv; +typedef void (APIENTRYP pfn_glGetActiveUniformBlockName) (GLuint, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetActiveUniformBlockName fp_glGetActiveUniformBlockName; +typedef void (APIENTRYP pfn_glUniformBlockBinding) (GLuint, GLuint, GLuint); +extern pfn_glUniformBlockBinding fp_glUniformBlockBinding; + + /* GL_VERSION_3_2 */ +extern GLboolean GLAD_VERSION_3_2; +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_DEPTH_CLAMP 0x864F +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +typedef void (APIENTRYP pfn_glDrawElementsBaseVertex) (GLenum, GLsizei, GLenum, const void*, GLint); +extern pfn_glDrawElementsBaseVertex fp_glDrawElementsBaseVertex; +typedef void (APIENTRYP pfn_glDrawRangeElementsBaseVertex) (GLenum, GLuint, GLuint, GLsizei, GLenum, const void*, GLint); +extern pfn_glDrawRangeElementsBaseVertex fp_glDrawRangeElementsBaseVertex; +typedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertex) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint); +extern pfn_glDrawElementsInstancedBaseVertex fp_glDrawElementsInstancedBaseVertex; +typedef void (APIENTRYP pfn_glMultiDrawElementsBaseVertex) (GLenum, const GLsizei*, GLenum, const void**, GLsizei, const GLint*); +extern pfn_glMultiDrawElementsBaseVertex fp_glMultiDrawElementsBaseVertex; +typedef void (APIENTRYP pfn_glProvokingVertex) (GLenum); +extern pfn_glProvokingVertex fp_glProvokingVertex; +typedef GLsync (APIENTRYP pfn_glFenceSync) (GLenum, GLbitfield); +extern pfn_glFenceSync fp_glFenceSync; +typedef GLboolean (APIENTRYP pfn_glIsSync) (GLsync); +extern pfn_glIsSync fp_glIsSync; +typedef void (APIENTRYP pfn_glDeleteSync) (GLsync); +extern pfn_glDeleteSync fp_glDeleteSync; +typedef GLenum (APIENTRYP pfn_glClientWaitSync) (GLsync, GLbitfield, GLuint64); +extern pfn_glClientWaitSync fp_glClientWaitSync; +typedef void (APIENTRYP pfn_glWaitSync) (GLsync, GLbitfield, GLuint64); +extern pfn_glWaitSync fp_glWaitSync; +typedef void (APIENTRYP pfn_glGetInteger64v) (GLenum, GLint64*); +extern pfn_glGetInteger64v fp_glGetInteger64v; +typedef void (APIENTRYP pfn_glGetSynciv) (GLsync, GLenum, GLsizei, GLsizei*, GLint*); +extern pfn_glGetSynciv fp_glGetSynciv; +typedef void (APIENTRYP pfn_glGetInteger64i_v) (GLenum, GLuint, GLint64*); +extern pfn_glGetInteger64i_v fp_glGetInteger64i_v; +typedef void (APIENTRYP pfn_glGetBufferParameteri64v) (GLenum, GLenum, GLint64*); +extern pfn_glGetBufferParameteri64v fp_glGetBufferParameteri64v; +typedef void (APIENTRYP pfn_glFramebufferTexture) (GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTexture fp_glFramebufferTexture; +typedef void (APIENTRYP pfn_glTexImage2DMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean); +extern pfn_glTexImage2DMultisample fp_glTexImage2DMultisample; +typedef void (APIENTRYP pfn_glTexImage3DMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTexImage3DMultisample fp_glTexImage3DMultisample; +typedef void (APIENTRYP pfn_glGetMultisamplefv) (GLenum, GLuint, GLfloat*); +extern pfn_glGetMultisamplefv fp_glGetMultisamplefv; +typedef void (APIENTRYP pfn_glSampleMaski) (GLuint, GLbitfield); +extern pfn_glSampleMaski fp_glSampleMaski; + + /* GL_VERSION_3_3 */ +extern GLboolean GLAD_VERSION_3_3; +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_RGB10_A2UI 0x906F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#define GL_INT_2_10_10_10_REV 0x8D9F +typedef void (APIENTRYP pfn_glBindFragDataLocationIndexed) (GLuint, GLuint, GLuint, const GLchar*); +extern pfn_glBindFragDataLocationIndexed fp_glBindFragDataLocationIndexed; +typedef GLint (APIENTRYP pfn_glGetFragDataIndex) (GLuint, const GLchar*); +extern pfn_glGetFragDataIndex fp_glGetFragDataIndex; +typedef void (APIENTRYP pfn_glGenSamplers) (GLsizei, GLuint*); +extern pfn_glGenSamplers fp_glGenSamplers; +typedef void (APIENTRYP pfn_glDeleteSamplers) (GLsizei, const GLuint*); +extern pfn_glDeleteSamplers fp_glDeleteSamplers; +typedef GLboolean (APIENTRYP pfn_glIsSampler) (GLuint); +extern pfn_glIsSampler fp_glIsSampler; +typedef void (APIENTRYP pfn_glBindSampler) (GLuint, GLuint); +extern pfn_glBindSampler fp_glBindSampler; +typedef void (APIENTRYP pfn_glSamplerParameteri) (GLuint, GLenum, GLint); +extern pfn_glSamplerParameteri fp_glSamplerParameteri; +typedef void (APIENTRYP pfn_glSamplerParameteriv) (GLuint, GLenum, const GLint*); +extern pfn_glSamplerParameteriv fp_glSamplerParameteriv; +typedef void (APIENTRYP pfn_glSamplerParameterf) (GLuint, GLenum, GLfloat); +extern pfn_glSamplerParameterf fp_glSamplerParameterf; +typedef void (APIENTRYP pfn_glSamplerParameterfv) (GLuint, GLenum, const GLfloat*); +extern pfn_glSamplerParameterfv fp_glSamplerParameterfv; +typedef void (APIENTRYP pfn_glSamplerParameterIiv) (GLuint, GLenum, const GLint*); +extern pfn_glSamplerParameterIiv fp_glSamplerParameterIiv; +typedef void (APIENTRYP pfn_glSamplerParameterIuiv) (GLuint, GLenum, const GLuint*); +extern pfn_glSamplerParameterIuiv fp_glSamplerParameterIuiv; +typedef void (APIENTRYP pfn_glGetSamplerParameteriv) (GLuint, GLenum, GLint*); +extern pfn_glGetSamplerParameteriv fp_glGetSamplerParameteriv; +typedef void (APIENTRYP pfn_glGetSamplerParameterIiv) (GLuint, GLenum, GLint*); +extern pfn_glGetSamplerParameterIiv fp_glGetSamplerParameterIiv; +typedef void (APIENTRYP pfn_glGetSamplerParameterfv) (GLuint, GLenum, GLfloat*); +extern pfn_glGetSamplerParameterfv fp_glGetSamplerParameterfv; +typedef void (APIENTRYP pfn_glGetSamplerParameterIuiv) (GLuint, GLenum, GLuint*); +extern pfn_glGetSamplerParameterIuiv fp_glGetSamplerParameterIuiv; +typedef void (APIENTRYP pfn_glQueryCounter) (GLuint, GLenum); +extern pfn_glQueryCounter fp_glQueryCounter; +typedef void (APIENTRYP pfn_glGetQueryObjecti64v) (GLuint, GLenum, GLint64*); +extern pfn_glGetQueryObjecti64v fp_glGetQueryObjecti64v; +typedef void (APIENTRYP pfn_glGetQueryObjectui64v) (GLuint, GLenum, GLuint64*); +extern pfn_glGetQueryObjectui64v fp_glGetQueryObjectui64v; +typedef void (APIENTRYP pfn_glVertexAttribDivisor) (GLuint, GLuint); +extern pfn_glVertexAttribDivisor fp_glVertexAttribDivisor; +typedef void (APIENTRYP pfn_glVertexAttribP1ui) (GLuint, GLenum, GLboolean, GLuint); +extern pfn_glVertexAttribP1ui fp_glVertexAttribP1ui; +typedef void (APIENTRYP pfn_glVertexAttribP1uiv) (GLuint, GLenum, GLboolean, const GLuint*); +extern pfn_glVertexAttribP1uiv fp_glVertexAttribP1uiv; +typedef void (APIENTRYP pfn_glVertexAttribP2ui) (GLuint, GLenum, GLboolean, GLuint); +extern pfn_glVertexAttribP2ui fp_glVertexAttribP2ui; +typedef void (APIENTRYP pfn_glVertexAttribP2uiv) (GLuint, GLenum, GLboolean, const GLuint*); +extern pfn_glVertexAttribP2uiv fp_glVertexAttribP2uiv; +typedef void (APIENTRYP pfn_glVertexAttribP3ui) (GLuint, GLenum, GLboolean, GLuint); +extern pfn_glVertexAttribP3ui fp_glVertexAttribP3ui; +typedef void (APIENTRYP pfn_glVertexAttribP3uiv) (GLuint, GLenum, GLboolean, const GLuint*); +extern pfn_glVertexAttribP3uiv fp_glVertexAttribP3uiv; +typedef void (APIENTRYP pfn_glVertexAttribP4ui) (GLuint, GLenum, GLboolean, GLuint); +extern pfn_glVertexAttribP4ui fp_glVertexAttribP4ui; +typedef void (APIENTRYP pfn_glVertexAttribP4uiv) (GLuint, GLenum, GLboolean, const GLuint*); +extern pfn_glVertexAttribP4uiv fp_glVertexAttribP4uiv; +typedef void (APIENTRYP pfn_glVertexP2ui) (GLenum, GLuint); +extern pfn_glVertexP2ui fp_glVertexP2ui; +typedef void (APIENTRYP pfn_glVertexP2uiv) (GLenum, const GLuint*); +extern pfn_glVertexP2uiv fp_glVertexP2uiv; +typedef void (APIENTRYP pfn_glVertexP3ui) (GLenum, GLuint); +extern pfn_glVertexP3ui fp_glVertexP3ui; +typedef void (APIENTRYP pfn_glVertexP3uiv) (GLenum, const GLuint*); +extern pfn_glVertexP3uiv fp_glVertexP3uiv; +typedef void (APIENTRYP pfn_glVertexP4ui) (GLenum, GLuint); +extern pfn_glVertexP4ui fp_glVertexP4ui; +typedef void (APIENTRYP pfn_glVertexP4uiv) (GLenum, const GLuint*); +extern pfn_glVertexP4uiv fp_glVertexP4uiv; +typedef void (APIENTRYP pfn_glTexCoordP1ui) (GLenum, GLuint); +extern pfn_glTexCoordP1ui fp_glTexCoordP1ui; +typedef void (APIENTRYP pfn_glTexCoordP1uiv) (GLenum, const GLuint*); +extern pfn_glTexCoordP1uiv fp_glTexCoordP1uiv; +typedef void (APIENTRYP pfn_glTexCoordP2ui) (GLenum, GLuint); +extern pfn_glTexCoordP2ui fp_glTexCoordP2ui; +typedef void (APIENTRYP pfn_glTexCoordP2uiv) (GLenum, const GLuint*); +extern pfn_glTexCoordP2uiv fp_glTexCoordP2uiv; +typedef void (APIENTRYP pfn_glTexCoordP3ui) (GLenum, GLuint); +extern pfn_glTexCoordP3ui fp_glTexCoordP3ui; +typedef void (APIENTRYP pfn_glTexCoordP3uiv) (GLenum, const GLuint*); +extern pfn_glTexCoordP3uiv fp_glTexCoordP3uiv; +typedef void (APIENTRYP pfn_glTexCoordP4ui) (GLenum, GLuint); +extern pfn_glTexCoordP4ui fp_glTexCoordP4ui; +typedef void (APIENTRYP pfn_glTexCoordP4uiv) (GLenum, const GLuint*); +extern pfn_glTexCoordP4uiv fp_glTexCoordP4uiv; +typedef void (APIENTRYP pfn_glMultiTexCoordP1ui) (GLenum, GLenum, GLuint); +extern pfn_glMultiTexCoordP1ui fp_glMultiTexCoordP1ui; +typedef void (APIENTRYP pfn_glMultiTexCoordP1uiv) (GLenum, GLenum, const GLuint*); +extern pfn_glMultiTexCoordP1uiv fp_glMultiTexCoordP1uiv; +typedef void (APIENTRYP pfn_glMultiTexCoordP2ui) (GLenum, GLenum, GLuint); +extern pfn_glMultiTexCoordP2ui fp_glMultiTexCoordP2ui; +typedef void (APIENTRYP pfn_glMultiTexCoordP2uiv) (GLenum, GLenum, const GLuint*); +extern pfn_glMultiTexCoordP2uiv fp_glMultiTexCoordP2uiv; +typedef void (APIENTRYP pfn_glMultiTexCoordP3ui) (GLenum, GLenum, GLuint); +extern pfn_glMultiTexCoordP3ui fp_glMultiTexCoordP3ui; +typedef void (APIENTRYP pfn_glMultiTexCoordP3uiv) (GLenum, GLenum, const GLuint*); +extern pfn_glMultiTexCoordP3uiv fp_glMultiTexCoordP3uiv; +typedef void (APIENTRYP pfn_glMultiTexCoordP4ui) (GLenum, GLenum, GLuint); +extern pfn_glMultiTexCoordP4ui fp_glMultiTexCoordP4ui; +typedef void (APIENTRYP pfn_glMultiTexCoordP4uiv) (GLenum, GLenum, const GLuint*); +extern pfn_glMultiTexCoordP4uiv fp_glMultiTexCoordP4uiv; +typedef void (APIENTRYP pfn_glNormalP3ui) (GLenum, GLuint); +extern pfn_glNormalP3ui fp_glNormalP3ui; +typedef void (APIENTRYP pfn_glNormalP3uiv) (GLenum, const GLuint*); +extern pfn_glNormalP3uiv fp_glNormalP3uiv; +typedef void (APIENTRYP pfn_glColorP3ui) (GLenum, GLuint); +extern pfn_glColorP3ui fp_glColorP3ui; +typedef void (APIENTRYP pfn_glColorP3uiv) (GLenum, const GLuint*); +extern pfn_glColorP3uiv fp_glColorP3uiv; +typedef void (APIENTRYP pfn_glColorP4ui) (GLenum, GLuint); +extern pfn_glColorP4ui fp_glColorP4ui; +typedef void (APIENTRYP pfn_glColorP4uiv) (GLenum, const GLuint*); +extern pfn_glColorP4uiv fp_glColorP4uiv; +typedef void (APIENTRYP pfn_glSecondaryColorP3ui) (GLenum, GLuint); +extern pfn_glSecondaryColorP3ui fp_glSecondaryColorP3ui; +typedef void (APIENTRYP pfn_glSecondaryColorP3uiv) (GLenum, const GLuint*); +extern pfn_glSecondaryColorP3uiv fp_glSecondaryColorP3uiv; + + /* GL_VERSION_4_0 */ +extern GLboolean GLAD_VERSION_4_0; +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +typedef void (APIENTRYP pfn_glMinSampleShading) (GLfloat); +extern pfn_glMinSampleShading fp_glMinSampleShading; +typedef void (APIENTRYP pfn_glBlendEquationi) (GLuint, GLenum); +extern pfn_glBlendEquationi fp_glBlendEquationi; +typedef void (APIENTRYP pfn_glBlendEquationSeparatei) (GLuint, GLenum, GLenum); +extern pfn_glBlendEquationSeparatei fp_glBlendEquationSeparatei; +typedef void (APIENTRYP pfn_glBlendFunci) (GLuint, GLenum, GLenum); +extern pfn_glBlendFunci fp_glBlendFunci; +typedef void (APIENTRYP pfn_glBlendFuncSeparatei) (GLuint, GLenum, GLenum, GLenum, GLenum); +extern pfn_glBlendFuncSeparatei fp_glBlendFuncSeparatei; +typedef void (APIENTRYP pfn_glDrawArraysIndirect) (GLenum, const void*); +extern pfn_glDrawArraysIndirect fp_glDrawArraysIndirect; +typedef void (APIENTRYP pfn_glDrawElementsIndirect) (GLenum, GLenum, const void*); +extern pfn_glDrawElementsIndirect fp_glDrawElementsIndirect; +typedef void (APIENTRYP pfn_glUniform1d) (GLint, GLdouble); +extern pfn_glUniform1d fp_glUniform1d; +typedef void (APIENTRYP pfn_glUniform2d) (GLint, GLdouble, GLdouble); +extern pfn_glUniform2d fp_glUniform2d; +typedef void (APIENTRYP pfn_glUniform3d) (GLint, GLdouble, GLdouble, GLdouble); +extern pfn_glUniform3d fp_glUniform3d; +typedef void (APIENTRYP pfn_glUniform4d) (GLint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glUniform4d fp_glUniform4d; +typedef void (APIENTRYP pfn_glUniform1dv) (GLint, GLsizei, const GLdouble*); +extern pfn_glUniform1dv fp_glUniform1dv; +typedef void (APIENTRYP pfn_glUniform2dv) (GLint, GLsizei, const GLdouble*); +extern pfn_glUniform2dv fp_glUniform2dv; +typedef void (APIENTRYP pfn_glUniform3dv) (GLint, GLsizei, const GLdouble*); +extern pfn_glUniform3dv fp_glUniform3dv; +typedef void (APIENTRYP pfn_glUniform4dv) (GLint, GLsizei, const GLdouble*); +extern pfn_glUniform4dv fp_glUniform4dv; +typedef void (APIENTRYP pfn_glUniformMatrix2dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix2dv fp_glUniformMatrix2dv; +typedef void (APIENTRYP pfn_glUniformMatrix3dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix3dv fp_glUniformMatrix3dv; +typedef void (APIENTRYP pfn_glUniformMatrix4dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix4dv fp_glUniformMatrix4dv; +typedef void (APIENTRYP pfn_glUniformMatrix2x3dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix2x3dv fp_glUniformMatrix2x3dv; +typedef void (APIENTRYP pfn_glUniformMatrix2x4dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix2x4dv fp_glUniformMatrix2x4dv; +typedef void (APIENTRYP pfn_glUniformMatrix3x2dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix3x2dv fp_glUniformMatrix3x2dv; +typedef void (APIENTRYP pfn_glUniformMatrix3x4dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix3x4dv fp_glUniformMatrix3x4dv; +typedef void (APIENTRYP pfn_glUniformMatrix4x2dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix4x2dv fp_glUniformMatrix4x2dv; +typedef void (APIENTRYP pfn_glUniformMatrix4x3dv) (GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glUniformMatrix4x3dv fp_glUniformMatrix4x3dv; +typedef void (APIENTRYP pfn_glGetUniformdv) (GLuint, GLint, GLdouble*); +extern pfn_glGetUniformdv fp_glGetUniformdv; +typedef GLint (APIENTRYP pfn_glGetSubroutineUniformLocation) (GLuint, GLenum, const GLchar*); +extern pfn_glGetSubroutineUniformLocation fp_glGetSubroutineUniformLocation; +typedef GLuint (APIENTRYP pfn_glGetSubroutineIndex) (GLuint, GLenum, const GLchar*); +extern pfn_glGetSubroutineIndex fp_glGetSubroutineIndex; +typedef void (APIENTRYP pfn_glGetActiveSubroutineUniformiv) (GLuint, GLenum, GLuint, GLenum, GLint*); +extern pfn_glGetActiveSubroutineUniformiv fp_glGetActiveSubroutineUniformiv; +typedef void (APIENTRYP pfn_glGetActiveSubroutineUniformName) (GLuint, GLenum, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetActiveSubroutineUniformName fp_glGetActiveSubroutineUniformName; +typedef void (APIENTRYP pfn_glGetActiveSubroutineName) (GLuint, GLenum, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetActiveSubroutineName fp_glGetActiveSubroutineName; +typedef void (APIENTRYP pfn_glUniformSubroutinesuiv) (GLenum, GLsizei, const GLuint*); +extern pfn_glUniformSubroutinesuiv fp_glUniformSubroutinesuiv; +typedef void (APIENTRYP pfn_glGetUniformSubroutineuiv) (GLenum, GLint, GLuint*); +extern pfn_glGetUniformSubroutineuiv fp_glGetUniformSubroutineuiv; +typedef void (APIENTRYP pfn_glGetProgramStageiv) (GLuint, GLenum, GLenum, GLint*); +extern pfn_glGetProgramStageiv fp_glGetProgramStageiv; +typedef void (APIENTRYP pfn_glPatchParameteri) (GLenum, GLint); +extern pfn_glPatchParameteri fp_glPatchParameteri; +typedef void (APIENTRYP pfn_glPatchParameterfv) (GLenum, const GLfloat*); +extern pfn_glPatchParameterfv fp_glPatchParameterfv; +typedef void (APIENTRYP pfn_glBindTransformFeedback) (GLenum, GLuint); +extern pfn_glBindTransformFeedback fp_glBindTransformFeedback; +typedef void (APIENTRYP pfn_glDeleteTransformFeedbacks) (GLsizei, const GLuint*); +extern pfn_glDeleteTransformFeedbacks fp_glDeleteTransformFeedbacks; +typedef void (APIENTRYP pfn_glGenTransformFeedbacks) (GLsizei, GLuint*); +extern pfn_glGenTransformFeedbacks fp_glGenTransformFeedbacks; +typedef GLboolean (APIENTRYP pfn_glIsTransformFeedback) (GLuint); +extern pfn_glIsTransformFeedback fp_glIsTransformFeedback; +typedef void (APIENTRYP pfn_glPauseTransformFeedback) (); +extern pfn_glPauseTransformFeedback fp_glPauseTransformFeedback; +typedef void (APIENTRYP pfn_glResumeTransformFeedback) (); +extern pfn_glResumeTransformFeedback fp_glResumeTransformFeedback; +typedef void (APIENTRYP pfn_glDrawTransformFeedback) (GLenum, GLuint); +extern pfn_glDrawTransformFeedback fp_glDrawTransformFeedback; +typedef void (APIENTRYP pfn_glDrawTransformFeedbackStream) (GLenum, GLuint, GLuint); +extern pfn_glDrawTransformFeedbackStream fp_glDrawTransformFeedbackStream; +typedef void (APIENTRYP pfn_glBeginQueryIndexed) (GLenum, GLuint, GLuint); +extern pfn_glBeginQueryIndexed fp_glBeginQueryIndexed; +typedef void (APIENTRYP pfn_glEndQueryIndexed) (GLenum, GLuint); +extern pfn_glEndQueryIndexed fp_glEndQueryIndexed; +typedef void (APIENTRYP pfn_glGetQueryIndexediv) (GLenum, GLuint, GLenum, GLint*); +extern pfn_glGetQueryIndexediv fp_glGetQueryIndexediv; + + /* GL_VERSION_4_1 */ +extern GLboolean GLAD_VERSION_4_1; +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_RGB565 0x8D62 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +typedef void (APIENTRYP pfn_glReleaseShaderCompiler) (); +extern pfn_glReleaseShaderCompiler fp_glReleaseShaderCompiler; +typedef void (APIENTRYP pfn_glShaderBinary) (GLsizei, const GLuint*, GLenum, const void*, GLsizei); +extern pfn_glShaderBinary fp_glShaderBinary; +typedef void (APIENTRYP pfn_glGetShaderPrecisionFormat) (GLenum, GLenum, GLint*, GLint*); +extern pfn_glGetShaderPrecisionFormat fp_glGetShaderPrecisionFormat; +typedef void (APIENTRYP pfn_glDepthRangef) (GLfloat, GLfloat); +extern pfn_glDepthRangef fp_glDepthRangef; +typedef void (APIENTRYP pfn_glClearDepthf) (GLfloat); +extern pfn_glClearDepthf fp_glClearDepthf; +typedef void (APIENTRYP pfn_glGetProgramBinary) (GLuint, GLsizei, GLsizei*, GLenum*, void*); +extern pfn_glGetProgramBinary fp_glGetProgramBinary; +typedef void (APIENTRYP pfn_glProgramBinary) (GLuint, GLenum, const void*, GLsizei); +extern pfn_glProgramBinary fp_glProgramBinary; +typedef void (APIENTRYP pfn_glProgramParameteri) (GLuint, GLenum, GLint); +extern pfn_glProgramParameteri fp_glProgramParameteri; +typedef void (APIENTRYP pfn_glUseProgramStages) (GLuint, GLbitfield, GLuint); +extern pfn_glUseProgramStages fp_glUseProgramStages; +typedef void (APIENTRYP pfn_glActiveShaderProgram) (GLuint, GLuint); +extern pfn_glActiveShaderProgram fp_glActiveShaderProgram; +typedef GLuint (APIENTRYP pfn_glCreateShaderProgramv) (GLenum, GLsizei, const GLchar**); +extern pfn_glCreateShaderProgramv fp_glCreateShaderProgramv; +typedef void (APIENTRYP pfn_glBindProgramPipeline) (GLuint); +extern pfn_glBindProgramPipeline fp_glBindProgramPipeline; +typedef void (APIENTRYP pfn_glDeleteProgramPipelines) (GLsizei, const GLuint*); +extern pfn_glDeleteProgramPipelines fp_glDeleteProgramPipelines; +typedef void (APIENTRYP pfn_glGenProgramPipelines) (GLsizei, GLuint*); +extern pfn_glGenProgramPipelines fp_glGenProgramPipelines; +typedef GLboolean (APIENTRYP pfn_glIsProgramPipeline) (GLuint); +extern pfn_glIsProgramPipeline fp_glIsProgramPipeline; +typedef void (APIENTRYP pfn_glGetProgramPipelineiv) (GLuint, GLenum, GLint*); +extern pfn_glGetProgramPipelineiv fp_glGetProgramPipelineiv; +typedef void (APIENTRYP pfn_glProgramUniform1i) (GLuint, GLint, GLint); +extern pfn_glProgramUniform1i fp_glProgramUniform1i; +typedef void (APIENTRYP pfn_glProgramUniform1iv) (GLuint, GLint, GLsizei, const GLint*); +extern pfn_glProgramUniform1iv fp_glProgramUniform1iv; +typedef void (APIENTRYP pfn_glProgramUniform1f) (GLuint, GLint, GLfloat); +extern pfn_glProgramUniform1f fp_glProgramUniform1f; +typedef void (APIENTRYP pfn_glProgramUniform1fv) (GLuint, GLint, GLsizei, const GLfloat*); +extern pfn_glProgramUniform1fv fp_glProgramUniform1fv; +typedef void (APIENTRYP pfn_glProgramUniform1d) (GLuint, GLint, GLdouble); +extern pfn_glProgramUniform1d fp_glProgramUniform1d; +typedef void (APIENTRYP pfn_glProgramUniform1dv) (GLuint, GLint, GLsizei, const GLdouble*); +extern pfn_glProgramUniform1dv fp_glProgramUniform1dv; +typedef void (APIENTRYP pfn_glProgramUniform1ui) (GLuint, GLint, GLuint); +extern pfn_glProgramUniform1ui fp_glProgramUniform1ui; +typedef void (APIENTRYP pfn_glProgramUniform1uiv) (GLuint, GLint, GLsizei, const GLuint*); +extern pfn_glProgramUniform1uiv fp_glProgramUniform1uiv; +typedef void (APIENTRYP pfn_glProgramUniform2i) (GLuint, GLint, GLint, GLint); +extern pfn_glProgramUniform2i fp_glProgramUniform2i; +typedef void (APIENTRYP pfn_glProgramUniform2iv) (GLuint, GLint, GLsizei, const GLint*); +extern pfn_glProgramUniform2iv fp_glProgramUniform2iv; +typedef void (APIENTRYP pfn_glProgramUniform2f) (GLuint, GLint, GLfloat, GLfloat); +extern pfn_glProgramUniform2f fp_glProgramUniform2f; +typedef void (APIENTRYP pfn_glProgramUniform2fv) (GLuint, GLint, GLsizei, const GLfloat*); +extern pfn_glProgramUniform2fv fp_glProgramUniform2fv; +typedef void (APIENTRYP pfn_glProgramUniform2d) (GLuint, GLint, GLdouble, GLdouble); +extern pfn_glProgramUniform2d fp_glProgramUniform2d; +typedef void (APIENTRYP pfn_glProgramUniform2dv) (GLuint, GLint, GLsizei, const GLdouble*); +extern pfn_glProgramUniform2dv fp_glProgramUniform2dv; +typedef void (APIENTRYP pfn_glProgramUniform2ui) (GLuint, GLint, GLuint, GLuint); +extern pfn_glProgramUniform2ui fp_glProgramUniform2ui; +typedef void (APIENTRYP pfn_glProgramUniform2uiv) (GLuint, GLint, GLsizei, const GLuint*); +extern pfn_glProgramUniform2uiv fp_glProgramUniform2uiv; +typedef void (APIENTRYP pfn_glProgramUniform3i) (GLuint, GLint, GLint, GLint, GLint); +extern pfn_glProgramUniform3i fp_glProgramUniform3i; +typedef void (APIENTRYP pfn_glProgramUniform3iv) (GLuint, GLint, GLsizei, const GLint*); +extern pfn_glProgramUniform3iv fp_glProgramUniform3iv; +typedef void (APIENTRYP pfn_glProgramUniform3f) (GLuint, GLint, GLfloat, GLfloat, GLfloat); +extern pfn_glProgramUniform3f fp_glProgramUniform3f; +typedef void (APIENTRYP pfn_glProgramUniform3fv) (GLuint, GLint, GLsizei, const GLfloat*); +extern pfn_glProgramUniform3fv fp_glProgramUniform3fv; +typedef void (APIENTRYP pfn_glProgramUniform3d) (GLuint, GLint, GLdouble, GLdouble, GLdouble); +extern pfn_glProgramUniform3d fp_glProgramUniform3d; +typedef void (APIENTRYP pfn_glProgramUniform3dv) (GLuint, GLint, GLsizei, const GLdouble*); +extern pfn_glProgramUniform3dv fp_glProgramUniform3dv; +typedef void (APIENTRYP pfn_glProgramUniform3ui) (GLuint, GLint, GLuint, GLuint, GLuint); +extern pfn_glProgramUniform3ui fp_glProgramUniform3ui; +typedef void (APIENTRYP pfn_glProgramUniform3uiv) (GLuint, GLint, GLsizei, const GLuint*); +extern pfn_glProgramUniform3uiv fp_glProgramUniform3uiv; +typedef void (APIENTRYP pfn_glProgramUniform4i) (GLuint, GLint, GLint, GLint, GLint, GLint); +extern pfn_glProgramUniform4i fp_glProgramUniform4i; +typedef void (APIENTRYP pfn_glProgramUniform4iv) (GLuint, GLint, GLsizei, const GLint*); +extern pfn_glProgramUniform4iv fp_glProgramUniform4iv; +typedef void (APIENTRYP pfn_glProgramUniform4f) (GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glProgramUniform4f fp_glProgramUniform4f; +typedef void (APIENTRYP pfn_glProgramUniform4fv) (GLuint, GLint, GLsizei, const GLfloat*); +extern pfn_glProgramUniform4fv fp_glProgramUniform4fv; +typedef void (APIENTRYP pfn_glProgramUniform4d) (GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glProgramUniform4d fp_glProgramUniform4d; +typedef void (APIENTRYP pfn_glProgramUniform4dv) (GLuint, GLint, GLsizei, const GLdouble*); +extern pfn_glProgramUniform4dv fp_glProgramUniform4dv; +typedef void (APIENTRYP pfn_glProgramUniform4ui) (GLuint, GLint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glProgramUniform4ui fp_glProgramUniform4ui; +typedef void (APIENTRYP pfn_glProgramUniform4uiv) (GLuint, GLint, GLsizei, const GLuint*); +extern pfn_glProgramUniform4uiv fp_glProgramUniform4uiv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix2fv fp_glProgramUniformMatrix2fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix3fv fp_glProgramUniformMatrix3fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix4fv fp_glProgramUniformMatrix4fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix2dv fp_glProgramUniformMatrix2dv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix3dv fp_glProgramUniformMatrix3dv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix4dv fp_glProgramUniformMatrix4dv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2x3fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix2x3fv fp_glProgramUniformMatrix2x3fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3x2fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix3x2fv fp_glProgramUniformMatrix3x2fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2x4fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix2x4fv fp_glProgramUniformMatrix2x4fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4x2fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix4x2fv fp_glProgramUniformMatrix4x2fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3x4fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix3x4fv fp_glProgramUniformMatrix3x4fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4x3fv) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix4x3fv fp_glProgramUniformMatrix4x3fv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2x3dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix2x3dv fp_glProgramUniformMatrix2x3dv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3x2dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix3x2dv fp_glProgramUniformMatrix3x2dv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2x4dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix2x4dv fp_glProgramUniformMatrix2x4dv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4x2dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix4x2dv fp_glProgramUniformMatrix4x2dv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3x4dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix3x4dv fp_glProgramUniformMatrix3x4dv; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4x3dv) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix4x3dv fp_glProgramUniformMatrix4x3dv; +typedef void (APIENTRYP pfn_glValidateProgramPipeline) (GLuint); +extern pfn_glValidateProgramPipeline fp_glValidateProgramPipeline; +typedef void (APIENTRYP pfn_glGetProgramPipelineInfoLog) (GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetProgramPipelineInfoLog fp_glGetProgramPipelineInfoLog; +typedef void (APIENTRYP pfn_glVertexAttribL1d) (GLuint, GLdouble); +extern pfn_glVertexAttribL1d fp_glVertexAttribL1d; +typedef void (APIENTRYP pfn_glVertexAttribL2d) (GLuint, GLdouble, GLdouble); +extern pfn_glVertexAttribL2d fp_glVertexAttribL2d; +typedef void (APIENTRYP pfn_glVertexAttribL3d) (GLuint, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttribL3d fp_glVertexAttribL3d; +typedef void (APIENTRYP pfn_glVertexAttribL4d) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttribL4d fp_glVertexAttribL4d; +typedef void (APIENTRYP pfn_glVertexAttribL1dv) (GLuint, const GLdouble*); +extern pfn_glVertexAttribL1dv fp_glVertexAttribL1dv; +typedef void (APIENTRYP pfn_glVertexAttribL2dv) (GLuint, const GLdouble*); +extern pfn_glVertexAttribL2dv fp_glVertexAttribL2dv; +typedef void (APIENTRYP pfn_glVertexAttribL3dv) (GLuint, const GLdouble*); +extern pfn_glVertexAttribL3dv fp_glVertexAttribL3dv; +typedef void (APIENTRYP pfn_glVertexAttribL4dv) (GLuint, const GLdouble*); +extern pfn_glVertexAttribL4dv fp_glVertexAttribL4dv; +typedef void (APIENTRYP pfn_glVertexAttribLPointer) (GLuint, GLint, GLenum, GLsizei, const void*); +extern pfn_glVertexAttribLPointer fp_glVertexAttribLPointer; +typedef void (APIENTRYP pfn_glGetVertexAttribLdv) (GLuint, GLenum, GLdouble*); +extern pfn_glGetVertexAttribLdv fp_glGetVertexAttribLdv; +typedef void (APIENTRYP pfn_glViewportArrayv) (GLuint, GLsizei, const GLfloat*); +extern pfn_glViewportArrayv fp_glViewportArrayv; +typedef void (APIENTRYP pfn_glViewportIndexedf) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glViewportIndexedf fp_glViewportIndexedf; +typedef void (APIENTRYP pfn_glViewportIndexedfv) (GLuint, const GLfloat*); +extern pfn_glViewportIndexedfv fp_glViewportIndexedfv; +typedef void (APIENTRYP pfn_glScissorArrayv) (GLuint, GLsizei, const GLint*); +extern pfn_glScissorArrayv fp_glScissorArrayv; +typedef void (APIENTRYP pfn_glScissorIndexed) (GLuint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glScissorIndexed fp_glScissorIndexed; +typedef void (APIENTRYP pfn_glScissorIndexedv) (GLuint, const GLint*); +extern pfn_glScissorIndexedv fp_glScissorIndexedv; +typedef void (APIENTRYP pfn_glDepthRangeArrayv) (GLuint, GLsizei, const GLdouble*); +extern pfn_glDepthRangeArrayv fp_glDepthRangeArrayv; +typedef void (APIENTRYP pfn_glDepthRangeIndexed) (GLuint, GLdouble, GLdouble); +extern pfn_glDepthRangeIndexed fp_glDepthRangeIndexed; +typedef void (APIENTRYP pfn_glGetFloati_v) (GLenum, GLuint, GLfloat*); +extern pfn_glGetFloati_v fp_glGetFloati_v; +typedef void (APIENTRYP pfn_glGetDoublei_v) (GLenum, GLuint, GLdouble*); +extern pfn_glGetDoublei_v fp_glGetDoublei_v; + + /* GL_VERSION_4_2 */ +extern GLboolean GLAD_VERSION_4_2; +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +typedef void (APIENTRYP pfn_glDrawArraysInstancedBaseInstance) (GLenum, GLint, GLsizei, GLsizei, GLuint); +extern pfn_glDrawArraysInstancedBaseInstance fp_glDrawArraysInstancedBaseInstance; +typedef void (APIENTRYP pfn_glDrawElementsInstancedBaseInstance) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLuint); +extern pfn_glDrawElementsInstancedBaseInstance fp_glDrawElementsInstancedBaseInstance; +typedef void (APIENTRYP pfn_glDrawElementsInstancedBaseVertexBaseInstance) (GLenum, GLsizei, GLenum, const void*, GLsizei, GLint, GLuint); +extern pfn_glDrawElementsInstancedBaseVertexBaseInstance fp_glDrawElementsInstancedBaseVertexBaseInstance; +typedef void (APIENTRYP pfn_glGetInternalformativ) (GLenum, GLenum, GLenum, GLsizei, GLint*); +extern pfn_glGetInternalformativ fp_glGetInternalformativ; +typedef void (APIENTRYP pfn_glGetActiveAtomicCounterBufferiv) (GLuint, GLuint, GLenum, GLint*); +extern pfn_glGetActiveAtomicCounterBufferiv fp_glGetActiveAtomicCounterBufferiv; +typedef void (APIENTRYP pfn_glBindImageTexture) (GLuint, GLuint, GLint, GLboolean, GLint, GLenum, GLenum); +extern pfn_glBindImageTexture fp_glBindImageTexture; +typedef void (APIENTRYP pfn_glMemoryBarrier) (GLbitfield); +extern pfn_glMemoryBarrier fp_glMemoryBarrier; +typedef void (APIENTRYP pfn_glTexStorage1D) (GLenum, GLsizei, GLenum, GLsizei); +extern pfn_glTexStorage1D fp_glTexStorage1D; +typedef void (APIENTRYP pfn_glTexStorage2D) (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glTexStorage2D fp_glTexStorage2D; +typedef void (APIENTRYP pfn_glTexStorage3D) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); +extern pfn_glTexStorage3D fp_glTexStorage3D; +typedef void (APIENTRYP pfn_glDrawTransformFeedbackInstanced) (GLenum, GLuint, GLsizei); +extern pfn_glDrawTransformFeedbackInstanced fp_glDrawTransformFeedbackInstanced; +typedef void (APIENTRYP pfn_glDrawTransformFeedbackStreamInstanced) (GLenum, GLuint, GLuint, GLsizei); +extern pfn_glDrawTransformFeedbackStreamInstanced fp_glDrawTransformFeedbackStreamInstanced; + + /* GL_VERSION_4_3 */ +extern GLboolean GLAD_VERSION_4_3; +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F +#define GL_IS_PER_PATCH 0x92E7 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_DISPLAY_LIST 0x82E7 +typedef void (APIENTRYP pfn_glClearBufferData) (GLenum, GLenum, GLenum, GLenum, const void*); +extern pfn_glClearBufferData fp_glClearBufferData; +typedef void (APIENTRYP pfn_glClearBufferSubData) (GLenum, GLenum, GLintptr, GLsizeiptr, GLenum, GLenum, const void*); +extern pfn_glClearBufferSubData fp_glClearBufferSubData; +typedef void (APIENTRYP pfn_glDispatchCompute) (GLuint, GLuint, GLuint); +extern pfn_glDispatchCompute fp_glDispatchCompute; +typedef void (APIENTRYP pfn_glDispatchComputeIndirect) (GLintptr); +extern pfn_glDispatchComputeIndirect fp_glDispatchComputeIndirect; +typedef void (APIENTRYP pfn_glCopyImageSubData) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei); +extern pfn_glCopyImageSubData fp_glCopyImageSubData; +typedef void (APIENTRYP pfn_glFramebufferParameteri) (GLenum, GLenum, GLint); +extern pfn_glFramebufferParameteri fp_glFramebufferParameteri; +typedef void (APIENTRYP pfn_glGetFramebufferParameteriv) (GLenum, GLenum, GLint*); +extern pfn_glGetFramebufferParameteriv fp_glGetFramebufferParameteriv; +typedef void (APIENTRYP pfn_glGetInternalformati64v) (GLenum, GLenum, GLenum, GLsizei, GLint64*); +extern pfn_glGetInternalformati64v fp_glGetInternalformati64v; +typedef void (APIENTRYP pfn_glInvalidateTexSubImage) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei); +extern pfn_glInvalidateTexSubImage fp_glInvalidateTexSubImage; +typedef void (APIENTRYP pfn_glInvalidateTexImage) (GLuint, GLint); +extern pfn_glInvalidateTexImage fp_glInvalidateTexImage; +typedef void (APIENTRYP pfn_glInvalidateBufferSubData) (GLuint, GLintptr, GLsizeiptr); +extern pfn_glInvalidateBufferSubData fp_glInvalidateBufferSubData; +typedef void (APIENTRYP pfn_glInvalidateBufferData) (GLuint); +extern pfn_glInvalidateBufferData fp_glInvalidateBufferData; +typedef void (APIENTRYP pfn_glInvalidateFramebuffer) (GLenum, GLsizei, const GLenum*); +extern pfn_glInvalidateFramebuffer fp_glInvalidateFramebuffer; +typedef void (APIENTRYP pfn_glInvalidateSubFramebuffer) (GLenum, GLsizei, const GLenum*, GLint, GLint, GLsizei, GLsizei); +extern pfn_glInvalidateSubFramebuffer fp_glInvalidateSubFramebuffer; +typedef void (APIENTRYP pfn_glMultiDrawArraysIndirect) (GLenum, const void*, GLsizei, GLsizei); +extern pfn_glMultiDrawArraysIndirect fp_glMultiDrawArraysIndirect; +typedef void (APIENTRYP pfn_glMultiDrawElementsIndirect) (GLenum, GLenum, const void*, GLsizei, GLsizei); +extern pfn_glMultiDrawElementsIndirect fp_glMultiDrawElementsIndirect; +typedef void (APIENTRYP pfn_glGetProgramInterfaceiv) (GLuint, GLenum, GLenum, GLint*); +extern pfn_glGetProgramInterfaceiv fp_glGetProgramInterfaceiv; +typedef GLuint (APIENTRYP pfn_glGetProgramResourceIndex) (GLuint, GLenum, const GLchar*); +extern pfn_glGetProgramResourceIndex fp_glGetProgramResourceIndex; +typedef void (APIENTRYP pfn_glGetProgramResourceName) (GLuint, GLenum, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetProgramResourceName fp_glGetProgramResourceName; +typedef void (APIENTRYP pfn_glGetProgramResourceiv) (GLuint, GLenum, GLuint, GLsizei, const GLenum*, GLsizei, GLsizei*, GLint*); +extern pfn_glGetProgramResourceiv fp_glGetProgramResourceiv; +typedef GLint (APIENTRYP pfn_glGetProgramResourceLocation) (GLuint, GLenum, const GLchar*); +extern pfn_glGetProgramResourceLocation fp_glGetProgramResourceLocation; +typedef GLint (APIENTRYP pfn_glGetProgramResourceLocationIndex) (GLuint, GLenum, const GLchar*); +extern pfn_glGetProgramResourceLocationIndex fp_glGetProgramResourceLocationIndex; +typedef void (APIENTRYP pfn_glShaderStorageBlockBinding) (GLuint, GLuint, GLuint); +extern pfn_glShaderStorageBlockBinding fp_glShaderStorageBlockBinding; +typedef void (APIENTRYP pfn_glTexBufferRange) (GLenum, GLenum, GLuint, GLintptr, GLsizeiptr); +extern pfn_glTexBufferRange fp_glTexBufferRange; +typedef void (APIENTRYP pfn_glTexStorage2DMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean); +extern pfn_glTexStorage2DMultisample fp_glTexStorage2DMultisample; +typedef void (APIENTRYP pfn_glTexStorage3DMultisample) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTexStorage3DMultisample fp_glTexStorage3DMultisample; +typedef void (APIENTRYP pfn_glTextureView) (GLuint, GLenum, GLuint, GLenum, GLuint, GLuint, GLuint, GLuint); +extern pfn_glTextureView fp_glTextureView; +typedef void (APIENTRYP pfn_glBindVertexBuffer) (GLuint, GLuint, GLintptr, GLsizei); +extern pfn_glBindVertexBuffer fp_glBindVertexBuffer; +typedef void (APIENTRYP pfn_glVertexAttribFormat) (GLuint, GLint, GLenum, GLboolean, GLuint); +extern pfn_glVertexAttribFormat fp_glVertexAttribFormat; +typedef void (APIENTRYP pfn_glVertexAttribIFormat) (GLuint, GLint, GLenum, GLuint); +extern pfn_glVertexAttribIFormat fp_glVertexAttribIFormat; +typedef void (APIENTRYP pfn_glVertexAttribLFormat) (GLuint, GLint, GLenum, GLuint); +extern pfn_glVertexAttribLFormat fp_glVertexAttribLFormat; +typedef void (APIENTRYP pfn_glVertexAttribBinding) (GLuint, GLuint); +extern pfn_glVertexAttribBinding fp_glVertexAttribBinding; +typedef void (APIENTRYP pfn_glVertexBindingDivisor) (GLuint, GLuint); +extern pfn_glVertexBindingDivisor fp_glVertexBindingDivisor; +typedef void (APIENTRYP pfn_glDebugMessageControl) (GLenum, GLenum, GLenum, GLsizei, const GLuint*, GLboolean); +extern pfn_glDebugMessageControl fp_glDebugMessageControl; +typedef void (APIENTRYP pfn_glDebugMessageInsert) (GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*); +extern pfn_glDebugMessageInsert fp_glDebugMessageInsert; +typedef void (APIENTRYP pfn_glDebugMessageCallback) (GLDEBUGPROC, const void*); +extern pfn_glDebugMessageCallback fp_glDebugMessageCallback; +typedef GLuint (APIENTRYP pfn_glGetDebugMessageLog) (GLuint, GLsizei, GLenum*, GLenum*, GLuint*, GLenum*, GLsizei*, GLchar*); +extern pfn_glGetDebugMessageLog fp_glGetDebugMessageLog; +typedef void (APIENTRYP pfn_glPushDebugGroup) (GLenum, GLuint, GLsizei, const GLchar*); +extern pfn_glPushDebugGroup fp_glPushDebugGroup; +typedef void (APIENTRYP pfn_glPopDebugGroup) (); +extern pfn_glPopDebugGroup fp_glPopDebugGroup; +typedef void (APIENTRYP pfn_glObjectLabel) (GLenum, GLuint, GLsizei, const GLchar*); +extern pfn_glObjectLabel fp_glObjectLabel; +typedef void (APIENTRYP pfn_glGetObjectLabel) (GLenum, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetObjectLabel fp_glGetObjectLabel; +typedef void (APIENTRYP pfn_glObjectPtrLabel) (const void*, GLsizei, const GLchar*); +extern pfn_glObjectPtrLabel fp_glObjectPtrLabel; +typedef void (APIENTRYP pfn_glGetObjectPtrLabel) (const void*, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetObjectPtrLabel fp_glGetObjectPtrLabel; + + /* GL_VERSION_4_4 */ +extern GLboolean GLAD_VERSION_4_4; +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +typedef void (APIENTRYP pfn_glBufferStorage) (GLenum, GLsizeiptr, const void*, GLbitfield); +extern pfn_glBufferStorage fp_glBufferStorage; +typedef void (APIENTRYP pfn_glClearTexImage) (GLuint, GLint, GLenum, GLenum, const void*); +extern pfn_glClearTexImage fp_glClearTexImage; +typedef void (APIENTRYP pfn_glClearTexSubImage) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glClearTexSubImage fp_glClearTexSubImage; +typedef void (APIENTRYP pfn_glBindBuffersBase) (GLenum, GLuint, GLsizei, const GLuint*); +extern pfn_glBindBuffersBase fp_glBindBuffersBase; +typedef void (APIENTRYP pfn_glBindBuffersRange) (GLenum, GLuint, GLsizei, const GLuint*, const GLintptr*, const GLsizeiptr*); +extern pfn_glBindBuffersRange fp_glBindBuffersRange; +typedef void (APIENTRYP pfn_glBindTextures) (GLuint, GLsizei, const GLuint*); +extern pfn_glBindTextures fp_glBindTextures; +typedef void (APIENTRYP pfn_glBindSamplers) (GLuint, GLsizei, const GLuint*); +extern pfn_glBindSamplers fp_glBindSamplers; +typedef void (APIENTRYP pfn_glBindImageTextures) (GLuint, GLsizei, const GLuint*); +extern pfn_glBindImageTextures fp_glBindImageTextures; +typedef void (APIENTRYP pfn_glBindVertexBuffers) (GLuint, GLsizei, const GLuint*, const GLintptr*, const GLsizei*); +extern pfn_glBindVertexBuffers fp_glBindVertexBuffers; + + /* GL_ES_VERSION_2_0 */ +extern GLboolean GLAD_ES_VERSION_2_0; +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_COLOR 0x8005 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 + + /* GL_ES_VERSION_3_0 */ +extern GLboolean GLAD_ES_VERSION_3_0; +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 + + /* GL_KHR_debug */ +extern GLboolean GLAD_KHR_debug; +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 +#define GL_DEBUG_SOURCE_API_KHR 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A +#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B +#define GL_DEBUG_TYPE_ERROR_KHR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 +#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 +#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D +#define GL_BUFFER_KHR 0x82E0 +#define GL_SHADER_KHR 0x82E1 +#define GL_PROGRAM_KHR 0x82E2 +#define GL_VERTEX_ARRAY_KHR 0x8074 +#define GL_QUERY_KHR 0x82E3 +#define GL_SAMPLER_KHR 0x82E6 +#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 +#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 +#define GL_DEBUG_OUTPUT_KHR 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 +#define GL_STACK_OVERFLOW_KHR 0x0503 +#define GL_STACK_UNDERFLOW_KHR 0x0504 +typedef void (APIENTRYP pfn_glDebugMessageControlKHR) (GLenum, GLenum, GLenum, GLsizei, const GLuint*, GLboolean); +extern pfn_glDebugMessageControlKHR fp_glDebugMessageControlKHR; +typedef void (APIENTRYP pfn_glDebugMessageInsertKHR) (GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*); +extern pfn_glDebugMessageInsertKHR fp_glDebugMessageInsertKHR; +typedef void (APIENTRYP pfn_glDebugMessageCallbackKHR) (GLDEBUGPROCKHR, const void*); +extern pfn_glDebugMessageCallbackKHR fp_glDebugMessageCallbackKHR; +typedef GLuint (APIENTRYP pfn_glGetDebugMessageLogKHR) (GLuint, GLsizei, GLenum*, GLenum*, GLuint*, GLenum*, GLsizei*, GLchar*); +extern pfn_glGetDebugMessageLogKHR fp_glGetDebugMessageLogKHR; +typedef void (APIENTRYP pfn_glPushDebugGroupKHR) (GLenum, GLuint, GLsizei, const GLchar*); +extern pfn_glPushDebugGroupKHR fp_glPushDebugGroupKHR; +typedef void (APIENTRYP pfn_glPopDebugGroupKHR) (); +extern pfn_glPopDebugGroupKHR fp_glPopDebugGroupKHR; +typedef void (APIENTRYP pfn_glObjectLabelKHR) (GLenum, GLuint, GLsizei, const GLchar*); +extern pfn_glObjectLabelKHR fp_glObjectLabelKHR; +typedef void (APIENTRYP pfn_glGetObjectLabelKHR) (GLenum, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetObjectLabelKHR fp_glGetObjectLabelKHR; +typedef void (APIENTRYP pfn_glObjectPtrLabelKHR) (const void*, GLsizei, const GLchar*); +extern pfn_glObjectPtrLabelKHR fp_glObjectPtrLabelKHR; +typedef void (APIENTRYP pfn_glGetObjectPtrLabelKHR) (const void*, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetObjectPtrLabelKHR fp_glGetObjectPtrLabelKHR; +typedef void (APIENTRYP pfn_glGetPointervKHR) (GLenum, void**); +extern pfn_glGetPointervKHR fp_glGetPointervKHR; + + /* GL_KHR_texture_compression_astc_hdr */ +extern GLboolean GLAD_KHR_texture_compression_astc_hdr; +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + + /* GL_KHR_texture_compression_astc_ldr */ +extern GLboolean GLAD_KHR_texture_compression_astc_ldr; + + /* GL_ARB_arrays_of_arrays */ +extern GLboolean GLAD_ARB_arrays_of_arrays; + + /* GL_ARB_base_instance */ +extern GLboolean GLAD_ARB_base_instance; + + /* GL_ARB_bindless_texture */ +extern GLboolean GLAD_ARB_bindless_texture; +#define GL_UNSIGNED_INT64_ARB 0x140F +typedef GLuint64 (APIENTRYP pfn_glGetTextureHandleARB) (GLuint); +extern pfn_glGetTextureHandleARB fp_glGetTextureHandleARB; +typedef GLuint64 (APIENTRYP pfn_glGetTextureSamplerHandleARB) (GLuint, GLuint); +extern pfn_glGetTextureSamplerHandleARB fp_glGetTextureSamplerHandleARB; +typedef void (APIENTRYP pfn_glMakeTextureHandleResidentARB) (GLuint64); +extern pfn_glMakeTextureHandleResidentARB fp_glMakeTextureHandleResidentARB; +typedef void (APIENTRYP pfn_glMakeTextureHandleNonResidentARB) (GLuint64); +extern pfn_glMakeTextureHandleNonResidentARB fp_glMakeTextureHandleNonResidentARB; +typedef GLuint64 (APIENTRYP pfn_glGetImageHandleARB) (GLuint, GLint, GLboolean, GLint, GLenum); +extern pfn_glGetImageHandleARB fp_glGetImageHandleARB; +typedef void (APIENTRYP pfn_glMakeImageHandleResidentARB) (GLuint64, GLenum); +extern pfn_glMakeImageHandleResidentARB fp_glMakeImageHandleResidentARB; +typedef void (APIENTRYP pfn_glMakeImageHandleNonResidentARB) (GLuint64); +extern pfn_glMakeImageHandleNonResidentARB fp_glMakeImageHandleNonResidentARB; +typedef void (APIENTRYP pfn_glUniformHandleui64ARB) (GLint, GLuint64); +extern pfn_glUniformHandleui64ARB fp_glUniformHandleui64ARB; +typedef void (APIENTRYP pfn_glUniformHandleui64vARB) (GLint, GLsizei, const GLuint64*); +extern pfn_glUniformHandleui64vARB fp_glUniformHandleui64vARB; +typedef void (APIENTRYP pfn_glProgramUniformHandleui64ARB) (GLuint, GLint, GLuint64); +extern pfn_glProgramUniformHandleui64ARB fp_glProgramUniformHandleui64ARB; +typedef void (APIENTRYP pfn_glProgramUniformHandleui64vARB) (GLuint, GLint, GLsizei, const GLuint64*); +extern pfn_glProgramUniformHandleui64vARB fp_glProgramUniformHandleui64vARB; +typedef GLboolean (APIENTRYP pfn_glIsTextureHandleResidentARB) (GLuint64); +extern pfn_glIsTextureHandleResidentARB fp_glIsTextureHandleResidentARB; +typedef GLboolean (APIENTRYP pfn_glIsImageHandleResidentARB) (GLuint64); +extern pfn_glIsImageHandleResidentARB fp_glIsImageHandleResidentARB; +typedef void (APIENTRYP pfn_glVertexAttribL1ui64ARB) (GLuint, GLuint64EXT); +extern pfn_glVertexAttribL1ui64ARB fp_glVertexAttribL1ui64ARB; +typedef void (APIENTRYP pfn_glVertexAttribL1ui64vARB) (GLuint, const GLuint64EXT*); +extern pfn_glVertexAttribL1ui64vARB fp_glVertexAttribL1ui64vARB; +typedef void (APIENTRYP pfn_glGetVertexAttribLui64vARB) (GLuint, GLenum, GLuint64EXT*); +extern pfn_glGetVertexAttribLui64vARB fp_glGetVertexAttribLui64vARB; + + /* GL_ARB_blend_func_extended */ +extern GLboolean GLAD_ARB_blend_func_extended; + + /* GL_ARB_buffer_storage */ +extern GLboolean GLAD_ARB_buffer_storage; + + /* GL_ARB_cl_event */ +extern GLboolean GLAD_ARB_cl_event; +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +typedef GLsync (APIENTRYP pfn_glCreateSyncFromCLeventARB) (struct _cl_context*, struct _cl_event*, GLbitfield); +extern pfn_glCreateSyncFromCLeventARB fp_glCreateSyncFromCLeventARB; + + /* GL_ARB_clear_buffer_object */ +extern GLboolean GLAD_ARB_clear_buffer_object; + + /* GL_ARB_clear_texture */ +extern GLboolean GLAD_ARB_clear_texture; + + /* GL_ARB_color_buffer_float */ +extern GLboolean GLAD_ARB_color_buffer_float; +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +typedef void (APIENTRYP pfn_glClampColorARB) (GLenum, GLenum); +extern pfn_glClampColorARB fp_glClampColorARB; + + /* GL_ARB_compatibility */ +extern GLboolean GLAD_ARB_compatibility; + + /* GL_ARB_compressed_texture_pixel_storage */ +extern GLboolean GLAD_ARB_compressed_texture_pixel_storage; + + /* GL_ARB_compute_shader */ +extern GLboolean GLAD_ARB_compute_shader; +#define GL_COMPUTE_SHADER_BIT 0x00000020 + + /* GL_ARB_compute_variable_group_size */ +extern GLboolean GLAD_ARB_compute_variable_group_size; +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +typedef void (APIENTRYP pfn_glDispatchComputeGroupSizeARB) (GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glDispatchComputeGroupSizeARB fp_glDispatchComputeGroupSizeARB; + + /* GL_ARB_conservative_depth */ +extern GLboolean GLAD_ARB_conservative_depth; + + /* GL_ARB_copy_buffer */ +extern GLboolean GLAD_ARB_copy_buffer; + + /* GL_ARB_copy_image */ +extern GLboolean GLAD_ARB_copy_image; + + /* GL_ARB_debug_output */ +extern GLboolean GLAD_ARB_debug_output; +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +typedef void (APIENTRYP pfn_glDebugMessageControlARB) (GLenum, GLenum, GLenum, GLsizei, const GLuint*, GLboolean); +extern pfn_glDebugMessageControlARB fp_glDebugMessageControlARB; +typedef void (APIENTRYP pfn_glDebugMessageInsertARB) (GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar*); +extern pfn_glDebugMessageInsertARB fp_glDebugMessageInsertARB; +typedef void (APIENTRYP pfn_glDebugMessageCallbackARB) (GLDEBUGPROCARB, const void*); +extern pfn_glDebugMessageCallbackARB fp_glDebugMessageCallbackARB; +typedef GLuint (APIENTRYP pfn_glGetDebugMessageLogARB) (GLuint, GLsizei, GLenum*, GLenum*, GLuint*, GLenum*, GLsizei*, GLchar*); +extern pfn_glGetDebugMessageLogARB fp_glGetDebugMessageLogARB; + + /* GL_ARB_depth_buffer_float */ +extern GLboolean GLAD_ARB_depth_buffer_float; + + /* GL_ARB_depth_clamp */ +extern GLboolean GLAD_ARB_depth_clamp; + + /* GL_ARB_depth_texture */ +extern GLboolean GLAD_ARB_depth_texture; +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + + /* GL_ARB_draw_buffers */ +extern GLboolean GLAD_ARB_draw_buffers; +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +typedef void (APIENTRYP pfn_glDrawBuffersARB) (GLsizei, const GLenum*); +extern pfn_glDrawBuffersARB fp_glDrawBuffersARB; + + /* GL_ARB_draw_buffers_blend */ +extern GLboolean GLAD_ARB_draw_buffers_blend; +typedef void (APIENTRYP pfn_glBlendEquationiARB) (GLuint, GLenum); +extern pfn_glBlendEquationiARB fp_glBlendEquationiARB; +typedef void (APIENTRYP pfn_glBlendEquationSeparateiARB) (GLuint, GLenum, GLenum); +extern pfn_glBlendEquationSeparateiARB fp_glBlendEquationSeparateiARB; +typedef void (APIENTRYP pfn_glBlendFunciARB) (GLuint, GLenum, GLenum); +extern pfn_glBlendFunciARB fp_glBlendFunciARB; +typedef void (APIENTRYP pfn_glBlendFuncSeparateiARB) (GLuint, GLenum, GLenum, GLenum, GLenum); +extern pfn_glBlendFuncSeparateiARB fp_glBlendFuncSeparateiARB; + + /* GL_ARB_draw_elements_base_vertex */ +extern GLboolean GLAD_ARB_draw_elements_base_vertex; + + /* GL_ARB_draw_indirect */ +extern GLboolean GLAD_ARB_draw_indirect; + + /* GL_ARB_draw_instanced */ +extern GLboolean GLAD_ARB_draw_instanced; +typedef void (APIENTRYP pfn_glDrawArraysInstancedARB) (GLenum, GLint, GLsizei, GLsizei); +extern pfn_glDrawArraysInstancedARB fp_glDrawArraysInstancedARB; +typedef void (APIENTRYP pfn_glDrawElementsInstancedARB) (GLenum, GLsizei, GLenum, const void*, GLsizei); +extern pfn_glDrawElementsInstancedARB fp_glDrawElementsInstancedARB; + + /* GL_ARB_enhanced_layouts */ +extern GLboolean GLAD_ARB_enhanced_layouts; + + /* GL_ARB_ES2_compatibility */ +extern GLboolean GLAD_ARB_ES2_compatibility; + + /* GL_ARB_ES3_compatibility */ +extern GLboolean GLAD_ARB_ES3_compatibility; + + /* GL_ARB_explicit_attrib_location */ +extern GLboolean GLAD_ARB_explicit_attrib_location; + + /* GL_ARB_explicit_uniform_location */ +extern GLboolean GLAD_ARB_explicit_uniform_location; + + /* GL_ARB_fragment_coord_conventions */ +extern GLboolean GLAD_ARB_fragment_coord_conventions; + + /* GL_ARB_fragment_layer_viewport */ +extern GLboolean GLAD_ARB_fragment_layer_viewport; + + /* GL_ARB_fragment_program */ +extern GLboolean GLAD_ARB_fragment_program; +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +typedef void (APIENTRYP pfn_glProgramStringARB) (GLenum, GLenum, GLsizei, const void*); +extern pfn_glProgramStringARB fp_glProgramStringARB; +typedef void (APIENTRYP pfn_glBindProgramARB) (GLenum, GLuint); +extern pfn_glBindProgramARB fp_glBindProgramARB; +typedef void (APIENTRYP pfn_glDeleteProgramsARB) (GLsizei, const GLuint*); +extern pfn_glDeleteProgramsARB fp_glDeleteProgramsARB; +typedef void (APIENTRYP pfn_glGenProgramsARB) (GLsizei, GLuint*); +extern pfn_glGenProgramsARB fp_glGenProgramsARB; +typedef void (APIENTRYP pfn_glProgramEnvParameter4dARB) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glProgramEnvParameter4dARB fp_glProgramEnvParameter4dARB; +typedef void (APIENTRYP pfn_glProgramEnvParameter4dvARB) (GLenum, GLuint, const GLdouble*); +extern pfn_glProgramEnvParameter4dvARB fp_glProgramEnvParameter4dvARB; +typedef void (APIENTRYP pfn_glProgramEnvParameter4fARB) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glProgramEnvParameter4fARB fp_glProgramEnvParameter4fARB; +typedef void (APIENTRYP pfn_glProgramEnvParameter4fvARB) (GLenum, GLuint, const GLfloat*); +extern pfn_glProgramEnvParameter4fvARB fp_glProgramEnvParameter4fvARB; +typedef void (APIENTRYP pfn_glProgramLocalParameter4dARB) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glProgramLocalParameter4dARB fp_glProgramLocalParameter4dARB; +typedef void (APIENTRYP pfn_glProgramLocalParameter4dvARB) (GLenum, GLuint, const GLdouble*); +extern pfn_glProgramLocalParameter4dvARB fp_glProgramLocalParameter4dvARB; +typedef void (APIENTRYP pfn_glProgramLocalParameter4fARB) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glProgramLocalParameter4fARB fp_glProgramLocalParameter4fARB; +typedef void (APIENTRYP pfn_glProgramLocalParameter4fvARB) (GLenum, GLuint, const GLfloat*); +extern pfn_glProgramLocalParameter4fvARB fp_glProgramLocalParameter4fvARB; +typedef void (APIENTRYP pfn_glGetProgramEnvParameterdvARB) (GLenum, GLuint, GLdouble*); +extern pfn_glGetProgramEnvParameterdvARB fp_glGetProgramEnvParameterdvARB; +typedef void (APIENTRYP pfn_glGetProgramEnvParameterfvARB) (GLenum, GLuint, GLfloat*); +extern pfn_glGetProgramEnvParameterfvARB fp_glGetProgramEnvParameterfvARB; +typedef void (APIENTRYP pfn_glGetProgramLocalParameterdvARB) (GLenum, GLuint, GLdouble*); +extern pfn_glGetProgramLocalParameterdvARB fp_glGetProgramLocalParameterdvARB; +typedef void (APIENTRYP pfn_glGetProgramLocalParameterfvARB) (GLenum, GLuint, GLfloat*); +extern pfn_glGetProgramLocalParameterfvARB fp_glGetProgramLocalParameterfvARB; +typedef void (APIENTRYP pfn_glGetProgramivARB) (GLenum, GLenum, GLint*); +extern pfn_glGetProgramivARB fp_glGetProgramivARB; +typedef void (APIENTRYP pfn_glGetProgramStringARB) (GLenum, GLenum, void*); +extern pfn_glGetProgramStringARB fp_glGetProgramStringARB; +typedef GLboolean (APIENTRYP pfn_glIsProgramARB) (GLuint); +extern pfn_glIsProgramARB fp_glIsProgramARB; + + /* GL_ARB_fragment_program_shadow */ +extern GLboolean GLAD_ARB_fragment_program_shadow; + + /* GL_ARB_fragment_shader */ +extern GLboolean GLAD_ARB_fragment_shader; +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B + + /* GL_ARB_framebuffer_no_attachments */ +extern GLboolean GLAD_ARB_framebuffer_no_attachments; + + /* GL_ARB_framebuffer_object */ +extern GLboolean GLAD_ARB_framebuffer_object; + + /* GL_ARB_framebuffer_sRGB */ +extern GLboolean GLAD_ARB_framebuffer_sRGB; + + /* GL_ARB_geometry_shader4 */ +extern GLboolean GLAD_ARB_geometry_shader4; +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +typedef void (APIENTRYP pfn_glProgramParameteriARB) (GLuint, GLenum, GLint); +extern pfn_glProgramParameteriARB fp_glProgramParameteriARB; +typedef void (APIENTRYP pfn_glFramebufferTextureARB) (GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTextureARB fp_glFramebufferTextureARB; +typedef void (APIENTRYP pfn_glFramebufferTextureLayerARB) (GLenum, GLenum, GLuint, GLint, GLint); +extern pfn_glFramebufferTextureLayerARB fp_glFramebufferTextureLayerARB; +typedef void (APIENTRYP pfn_glFramebufferTextureFaceARB) (GLenum, GLenum, GLuint, GLint, GLenum); +extern pfn_glFramebufferTextureFaceARB fp_glFramebufferTextureFaceARB; + + /* GL_ARB_get_program_binary */ +extern GLboolean GLAD_ARB_get_program_binary; + + /* GL_ARB_gpu_shader5 */ +extern GLboolean GLAD_ARB_gpu_shader5; + + /* GL_ARB_gpu_shader_fp64 */ +extern GLboolean GLAD_ARB_gpu_shader_fp64; + + /* GL_ARB_half_float_pixel */ +extern GLboolean GLAD_ARB_half_float_pixel; +#define GL_HALF_FLOAT_ARB 0x140B + + /* GL_ARB_half_float_vertex */ +extern GLboolean GLAD_ARB_half_float_vertex; + + /* GL_ARB_indirect_parameters */ +extern GLboolean GLAD_ARB_indirect_parameters; +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF +typedef void (APIENTRYP pfn_glMultiDrawArraysIndirectCountARB) (GLenum, GLintptr, GLintptr, GLsizei, GLsizei); +extern pfn_glMultiDrawArraysIndirectCountARB fp_glMultiDrawArraysIndirectCountARB; +typedef void (APIENTRYP pfn_glMultiDrawElementsIndirectCountARB) (GLenum, GLenum, GLintptr, GLintptr, GLsizei, GLsizei); +extern pfn_glMultiDrawElementsIndirectCountARB fp_glMultiDrawElementsIndirectCountARB; + + /* GL_ARB_instanced_arrays */ +extern GLboolean GLAD_ARB_instanced_arrays; +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +typedef void (APIENTRYP pfn_glVertexAttribDivisorARB) (GLuint, GLuint); +extern pfn_glVertexAttribDivisorARB fp_glVertexAttribDivisorARB; + + /* GL_ARB_internalformat_query */ +extern GLboolean GLAD_ARB_internalformat_query; + + /* GL_ARB_internalformat_query2 */ +extern GLboolean GLAD_ARB_internalformat_query2; +#define GL_SRGB_DECODE_ARB 0x8299 + + /* GL_ARB_invalidate_subdata */ +extern GLboolean GLAD_ARB_invalidate_subdata; + + /* GL_ARB_map_buffer_alignment */ +extern GLboolean GLAD_ARB_map_buffer_alignment; + + /* GL_ARB_map_buffer_range */ +extern GLboolean GLAD_ARB_map_buffer_range; + + /* GL_ARB_matrix_palette */ +extern GLboolean GLAD_ARB_matrix_palette; +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +typedef void (APIENTRYP pfn_glCurrentPaletteMatrixARB) (GLint); +extern pfn_glCurrentPaletteMatrixARB fp_glCurrentPaletteMatrixARB; +typedef void (APIENTRYP pfn_glMatrixIndexubvARB) (GLint, const GLubyte*); +extern pfn_glMatrixIndexubvARB fp_glMatrixIndexubvARB; +typedef void (APIENTRYP pfn_glMatrixIndexusvARB) (GLint, const GLushort*); +extern pfn_glMatrixIndexusvARB fp_glMatrixIndexusvARB; +typedef void (APIENTRYP pfn_glMatrixIndexuivARB) (GLint, const GLuint*); +extern pfn_glMatrixIndexuivARB fp_glMatrixIndexuivARB; +typedef void (APIENTRYP pfn_glMatrixIndexPointerARB) (GLint, GLenum, GLsizei, const void*); +extern pfn_glMatrixIndexPointerARB fp_glMatrixIndexPointerARB; + + /* GL_ARB_multi_bind */ +extern GLboolean GLAD_ARB_multi_bind; + + /* GL_ARB_multi_draw_indirect */ +extern GLboolean GLAD_ARB_multi_draw_indirect; + + /* GL_ARB_multisample */ +extern GLboolean GLAD_ARB_multisample; +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +typedef void (APIENTRYP pfn_glSampleCoverageARB) (GLfloat, GLboolean); +extern pfn_glSampleCoverageARB fp_glSampleCoverageARB; + + /* GL_ARB_multitexture */ +extern GLboolean GLAD_ARB_multitexture; +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +typedef void (APIENTRYP pfn_glActiveTextureARB) (GLenum); +extern pfn_glActiveTextureARB fp_glActiveTextureARB; +typedef void (APIENTRYP pfn_glClientActiveTextureARB) (GLenum); +extern pfn_glClientActiveTextureARB fp_glClientActiveTextureARB; +typedef void (APIENTRYP pfn_glMultiTexCoord1dARB) (GLenum, GLdouble); +extern pfn_glMultiTexCoord1dARB fp_glMultiTexCoord1dARB; +typedef void (APIENTRYP pfn_glMultiTexCoord1dvARB) (GLenum, const GLdouble*); +extern pfn_glMultiTexCoord1dvARB fp_glMultiTexCoord1dvARB; +typedef void (APIENTRYP pfn_glMultiTexCoord1fARB) (GLenum, GLfloat); +extern pfn_glMultiTexCoord1fARB fp_glMultiTexCoord1fARB; +typedef void (APIENTRYP pfn_glMultiTexCoord1fvARB) (GLenum, const GLfloat*); +extern pfn_glMultiTexCoord1fvARB fp_glMultiTexCoord1fvARB; +typedef void (APIENTRYP pfn_glMultiTexCoord1iARB) (GLenum, GLint); +extern pfn_glMultiTexCoord1iARB fp_glMultiTexCoord1iARB; +typedef void (APIENTRYP pfn_glMultiTexCoord1ivARB) (GLenum, const GLint*); +extern pfn_glMultiTexCoord1ivARB fp_glMultiTexCoord1ivARB; +typedef void (APIENTRYP pfn_glMultiTexCoord1sARB) (GLenum, GLshort); +extern pfn_glMultiTexCoord1sARB fp_glMultiTexCoord1sARB; +typedef void (APIENTRYP pfn_glMultiTexCoord1svARB) (GLenum, const GLshort*); +extern pfn_glMultiTexCoord1svARB fp_glMultiTexCoord1svARB; +typedef void (APIENTRYP pfn_glMultiTexCoord2dARB) (GLenum, GLdouble, GLdouble); +extern pfn_glMultiTexCoord2dARB fp_glMultiTexCoord2dARB; +typedef void (APIENTRYP pfn_glMultiTexCoord2dvARB) (GLenum, const GLdouble*); +extern pfn_glMultiTexCoord2dvARB fp_glMultiTexCoord2dvARB; +typedef void (APIENTRYP pfn_glMultiTexCoord2fARB) (GLenum, GLfloat, GLfloat); +extern pfn_glMultiTexCoord2fARB fp_glMultiTexCoord2fARB; +typedef void (APIENTRYP pfn_glMultiTexCoord2fvARB) (GLenum, const GLfloat*); +extern pfn_glMultiTexCoord2fvARB fp_glMultiTexCoord2fvARB; +typedef void (APIENTRYP pfn_glMultiTexCoord2iARB) (GLenum, GLint, GLint); +extern pfn_glMultiTexCoord2iARB fp_glMultiTexCoord2iARB; +typedef void (APIENTRYP pfn_glMultiTexCoord2ivARB) (GLenum, const GLint*); +extern pfn_glMultiTexCoord2ivARB fp_glMultiTexCoord2ivARB; +typedef void (APIENTRYP pfn_glMultiTexCoord2sARB) (GLenum, GLshort, GLshort); +extern pfn_glMultiTexCoord2sARB fp_glMultiTexCoord2sARB; +typedef void (APIENTRYP pfn_glMultiTexCoord2svARB) (GLenum, const GLshort*); +extern pfn_glMultiTexCoord2svARB fp_glMultiTexCoord2svARB; +typedef void (APIENTRYP pfn_glMultiTexCoord3dARB) (GLenum, GLdouble, GLdouble, GLdouble); +extern pfn_glMultiTexCoord3dARB fp_glMultiTexCoord3dARB; +typedef void (APIENTRYP pfn_glMultiTexCoord3dvARB) (GLenum, const GLdouble*); +extern pfn_glMultiTexCoord3dvARB fp_glMultiTexCoord3dvARB; +typedef void (APIENTRYP pfn_glMultiTexCoord3fARB) (GLenum, GLfloat, GLfloat, GLfloat); +extern pfn_glMultiTexCoord3fARB fp_glMultiTexCoord3fARB; +typedef void (APIENTRYP pfn_glMultiTexCoord3fvARB) (GLenum, const GLfloat*); +extern pfn_glMultiTexCoord3fvARB fp_glMultiTexCoord3fvARB; +typedef void (APIENTRYP pfn_glMultiTexCoord3iARB) (GLenum, GLint, GLint, GLint); +extern pfn_glMultiTexCoord3iARB fp_glMultiTexCoord3iARB; +typedef void (APIENTRYP pfn_glMultiTexCoord3ivARB) (GLenum, const GLint*); +extern pfn_glMultiTexCoord3ivARB fp_glMultiTexCoord3ivARB; +typedef void (APIENTRYP pfn_glMultiTexCoord3sARB) (GLenum, GLshort, GLshort, GLshort); +extern pfn_glMultiTexCoord3sARB fp_glMultiTexCoord3sARB; +typedef void (APIENTRYP pfn_glMultiTexCoord3svARB) (GLenum, const GLshort*); +extern pfn_glMultiTexCoord3svARB fp_glMultiTexCoord3svARB; +typedef void (APIENTRYP pfn_glMultiTexCoord4dARB) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glMultiTexCoord4dARB fp_glMultiTexCoord4dARB; +typedef void (APIENTRYP pfn_glMultiTexCoord4dvARB) (GLenum, const GLdouble*); +extern pfn_glMultiTexCoord4dvARB fp_glMultiTexCoord4dvARB; +typedef void (APIENTRYP pfn_glMultiTexCoord4fARB) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glMultiTexCoord4fARB fp_glMultiTexCoord4fARB; +typedef void (APIENTRYP pfn_glMultiTexCoord4fvARB) (GLenum, const GLfloat*); +extern pfn_glMultiTexCoord4fvARB fp_glMultiTexCoord4fvARB; +typedef void (APIENTRYP pfn_glMultiTexCoord4iARB) (GLenum, GLint, GLint, GLint, GLint); +extern pfn_glMultiTexCoord4iARB fp_glMultiTexCoord4iARB; +typedef void (APIENTRYP pfn_glMultiTexCoord4ivARB) (GLenum, const GLint*); +extern pfn_glMultiTexCoord4ivARB fp_glMultiTexCoord4ivARB; +typedef void (APIENTRYP pfn_glMultiTexCoord4sARB) (GLenum, GLshort, GLshort, GLshort, GLshort); +extern pfn_glMultiTexCoord4sARB fp_glMultiTexCoord4sARB; +typedef void (APIENTRYP pfn_glMultiTexCoord4svARB) (GLenum, const GLshort*); +extern pfn_glMultiTexCoord4svARB fp_glMultiTexCoord4svARB; + + /* GL_ARB_occlusion_query */ +extern GLboolean GLAD_ARB_occlusion_query; +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +typedef void (APIENTRYP pfn_glGenQueriesARB) (GLsizei, GLuint*); +extern pfn_glGenQueriesARB fp_glGenQueriesARB; +typedef void (APIENTRYP pfn_glDeleteQueriesARB) (GLsizei, const GLuint*); +extern pfn_glDeleteQueriesARB fp_glDeleteQueriesARB; +typedef GLboolean (APIENTRYP pfn_glIsQueryARB) (GLuint); +extern pfn_glIsQueryARB fp_glIsQueryARB; +typedef void (APIENTRYP pfn_glBeginQueryARB) (GLenum, GLuint); +extern pfn_glBeginQueryARB fp_glBeginQueryARB; +typedef void (APIENTRYP pfn_glEndQueryARB) (GLenum); +extern pfn_glEndQueryARB fp_glEndQueryARB; +typedef void (APIENTRYP pfn_glGetQueryivARB) (GLenum, GLenum, GLint*); +extern pfn_glGetQueryivARB fp_glGetQueryivARB; +typedef void (APIENTRYP pfn_glGetQueryObjectivARB) (GLuint, GLenum, GLint*); +extern pfn_glGetQueryObjectivARB fp_glGetQueryObjectivARB; +typedef void (APIENTRYP pfn_glGetQueryObjectuivARB) (GLuint, GLenum, GLuint*); +extern pfn_glGetQueryObjectuivARB fp_glGetQueryObjectuivARB; + + /* GL_ARB_occlusion_query2 */ +extern GLboolean GLAD_ARB_occlusion_query2; + + /* GL_ARB_pixel_buffer_object */ +extern GLboolean GLAD_ARB_pixel_buffer_object; +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF + + /* GL_ARB_point_parameters */ +extern GLboolean GLAD_ARB_point_parameters; +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +typedef void (APIENTRYP pfn_glPointParameterfARB) (GLenum, GLfloat); +extern pfn_glPointParameterfARB fp_glPointParameterfARB; +typedef void (APIENTRYP pfn_glPointParameterfvARB) (GLenum, const GLfloat*); +extern pfn_glPointParameterfvARB fp_glPointParameterfvARB; + + /* GL_ARB_point_sprite */ +extern GLboolean GLAD_ARB_point_sprite; +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 + + /* GL_ARB_program_interface_query */ +extern GLboolean GLAD_ARB_program_interface_query; + + /* GL_ARB_provoking_vertex */ +extern GLboolean GLAD_ARB_provoking_vertex; + + /* GL_ARB_query_buffer_object */ +extern GLboolean GLAD_ARB_query_buffer_object; + + /* GL_ARB_robust_buffer_access_behavior */ +extern GLboolean GLAD_ARB_robust_buffer_access_behavior; + + /* GL_ARB_robustness */ +extern GLboolean GLAD_ARB_robustness; +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +typedef GLenum (APIENTRYP pfn_glGetGraphicsResetStatusARB) (); +extern pfn_glGetGraphicsResetStatusARB fp_glGetGraphicsResetStatusARB; +typedef void (APIENTRYP pfn_glGetnTexImageARB) (GLenum, GLint, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnTexImageARB fp_glGetnTexImageARB; +typedef void (APIENTRYP pfn_glReadnPixelsARB) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*); +extern pfn_glReadnPixelsARB fp_glReadnPixelsARB; +typedef void (APIENTRYP pfn_glGetnCompressedTexImageARB) (GLenum, GLint, GLsizei, void*); +extern pfn_glGetnCompressedTexImageARB fp_glGetnCompressedTexImageARB; +typedef void (APIENTRYP pfn_glGetnUniformfvARB) (GLuint, GLint, GLsizei, GLfloat*); +extern pfn_glGetnUniformfvARB fp_glGetnUniformfvARB; +typedef void (APIENTRYP pfn_glGetnUniformivARB) (GLuint, GLint, GLsizei, GLint*); +extern pfn_glGetnUniformivARB fp_glGetnUniformivARB; +typedef void (APIENTRYP pfn_glGetnUniformuivARB) (GLuint, GLint, GLsizei, GLuint*); +extern pfn_glGetnUniformuivARB fp_glGetnUniformuivARB; +typedef void (APIENTRYP pfn_glGetnUniformdvARB) (GLuint, GLint, GLsizei, GLdouble*); +extern pfn_glGetnUniformdvARB fp_glGetnUniformdvARB; +typedef void (APIENTRYP pfn_glGetnMapdvARB) (GLenum, GLenum, GLsizei, GLdouble*); +extern pfn_glGetnMapdvARB fp_glGetnMapdvARB; +typedef void (APIENTRYP pfn_glGetnMapfvARB) (GLenum, GLenum, GLsizei, GLfloat*); +extern pfn_glGetnMapfvARB fp_glGetnMapfvARB; +typedef void (APIENTRYP pfn_glGetnMapivARB) (GLenum, GLenum, GLsizei, GLint*); +extern pfn_glGetnMapivARB fp_glGetnMapivARB; +typedef void (APIENTRYP pfn_glGetnPixelMapfvARB) (GLenum, GLsizei, GLfloat*); +extern pfn_glGetnPixelMapfvARB fp_glGetnPixelMapfvARB; +typedef void (APIENTRYP pfn_glGetnPixelMapuivARB) (GLenum, GLsizei, GLuint*); +extern pfn_glGetnPixelMapuivARB fp_glGetnPixelMapuivARB; +typedef void (APIENTRYP pfn_glGetnPixelMapusvARB) (GLenum, GLsizei, GLushort*); +extern pfn_glGetnPixelMapusvARB fp_glGetnPixelMapusvARB; +typedef void (APIENTRYP pfn_glGetnPolygonStippleARB) (GLsizei, GLubyte*); +extern pfn_glGetnPolygonStippleARB fp_glGetnPolygonStippleARB; +typedef void (APIENTRYP pfn_glGetnColorTableARB) (GLenum, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnColorTableARB fp_glGetnColorTableARB; +typedef void (APIENTRYP pfn_glGetnConvolutionFilterARB) (GLenum, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnConvolutionFilterARB fp_glGetnConvolutionFilterARB; +typedef void (APIENTRYP pfn_glGetnSeparableFilterARB) (GLenum, GLenum, GLenum, GLsizei, void*, GLsizei, void*, void*); +extern pfn_glGetnSeparableFilterARB fp_glGetnSeparableFilterARB; +typedef void (APIENTRYP pfn_glGetnHistogramARB) (GLenum, GLboolean, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnHistogramARB fp_glGetnHistogramARB; +typedef void (APIENTRYP pfn_glGetnMinmaxARB) (GLenum, GLboolean, GLenum, GLenum, GLsizei, void*); +extern pfn_glGetnMinmaxARB fp_glGetnMinmaxARB; + + /* GL_ARB_robustness_isolation */ +extern GLboolean GLAD_ARB_robustness_isolation; + + /* GL_ARB_sample_shading */ +extern GLboolean GLAD_ARB_sample_shading; +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +typedef void (APIENTRYP pfn_glMinSampleShadingARB) (GLfloat); +extern pfn_glMinSampleShadingARB fp_glMinSampleShadingARB; + + /* GL_ARB_sampler_objects */ +extern GLboolean GLAD_ARB_sampler_objects; + + /* GL_ARB_seamless_cube_map */ +extern GLboolean GLAD_ARB_seamless_cube_map; + + /* GL_ARB_seamless_cubemap_per_texture */ +extern GLboolean GLAD_ARB_seamless_cubemap_per_texture; + + /* GL_ARB_separate_shader_objects */ +extern GLboolean GLAD_ARB_separate_shader_objects; + + /* GL_ARB_shader_atomic_counters */ +extern GLboolean GLAD_ARB_shader_atomic_counters; + + /* GL_ARB_shader_bit_encoding */ +extern GLboolean GLAD_ARB_shader_bit_encoding; + + /* GL_ARB_shader_draw_parameters */ +extern GLboolean GLAD_ARB_shader_draw_parameters; + + /* GL_ARB_shader_group_vote */ +extern GLboolean GLAD_ARB_shader_group_vote; + + /* GL_ARB_shader_image_load_store */ +extern GLboolean GLAD_ARB_shader_image_load_store; + + /* GL_ARB_shader_image_size */ +extern GLboolean GLAD_ARB_shader_image_size; + + /* GL_ARB_shader_objects */ +extern GLboolean GLAD_ARB_shader_objects; +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +typedef void (APIENTRYP pfn_glDeleteObjectARB) (GLhandleARB); +extern pfn_glDeleteObjectARB fp_glDeleteObjectARB; +typedef GLhandleARB (APIENTRYP pfn_glGetHandleARB) (GLenum); +extern pfn_glGetHandleARB fp_glGetHandleARB; +typedef void (APIENTRYP pfn_glDetachObjectARB) (GLhandleARB, GLhandleARB); +extern pfn_glDetachObjectARB fp_glDetachObjectARB; +typedef GLhandleARB (APIENTRYP pfn_glCreateShaderObjectARB) (GLenum); +extern pfn_glCreateShaderObjectARB fp_glCreateShaderObjectARB; +typedef void (APIENTRYP pfn_glShaderSourceARB) (GLhandleARB, GLsizei, const GLcharARB**, const GLint*); +extern pfn_glShaderSourceARB fp_glShaderSourceARB; +typedef void (APIENTRYP pfn_glCompileShaderARB) (GLhandleARB); +extern pfn_glCompileShaderARB fp_glCompileShaderARB; +typedef GLhandleARB (APIENTRYP pfn_glCreateProgramObjectARB) (); +extern pfn_glCreateProgramObjectARB fp_glCreateProgramObjectARB; +typedef void (APIENTRYP pfn_glAttachObjectARB) (GLhandleARB, GLhandleARB); +extern pfn_glAttachObjectARB fp_glAttachObjectARB; +typedef void (APIENTRYP pfn_glLinkProgramARB) (GLhandleARB); +extern pfn_glLinkProgramARB fp_glLinkProgramARB; +typedef void (APIENTRYP pfn_glUseProgramObjectARB) (GLhandleARB); +extern pfn_glUseProgramObjectARB fp_glUseProgramObjectARB; +typedef void (APIENTRYP pfn_glValidateProgramARB) (GLhandleARB); +extern pfn_glValidateProgramARB fp_glValidateProgramARB; +typedef void (APIENTRYP pfn_glUniform1fARB) (GLint, GLfloat); +extern pfn_glUniform1fARB fp_glUniform1fARB; +typedef void (APIENTRYP pfn_glUniform2fARB) (GLint, GLfloat, GLfloat); +extern pfn_glUniform2fARB fp_glUniform2fARB; +typedef void (APIENTRYP pfn_glUniform3fARB) (GLint, GLfloat, GLfloat, GLfloat); +extern pfn_glUniform3fARB fp_glUniform3fARB; +typedef void (APIENTRYP pfn_glUniform4fARB) (GLint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glUniform4fARB fp_glUniform4fARB; +typedef void (APIENTRYP pfn_glUniform1iARB) (GLint, GLint); +extern pfn_glUniform1iARB fp_glUniform1iARB; +typedef void (APIENTRYP pfn_glUniform2iARB) (GLint, GLint, GLint); +extern pfn_glUniform2iARB fp_glUniform2iARB; +typedef void (APIENTRYP pfn_glUniform3iARB) (GLint, GLint, GLint, GLint); +extern pfn_glUniform3iARB fp_glUniform3iARB; +typedef void (APIENTRYP pfn_glUniform4iARB) (GLint, GLint, GLint, GLint, GLint); +extern pfn_glUniform4iARB fp_glUniform4iARB; +typedef void (APIENTRYP pfn_glUniform1fvARB) (GLint, GLsizei, const GLfloat*); +extern pfn_glUniform1fvARB fp_glUniform1fvARB; +typedef void (APIENTRYP pfn_glUniform2fvARB) (GLint, GLsizei, const GLfloat*); +extern pfn_glUniform2fvARB fp_glUniform2fvARB; +typedef void (APIENTRYP pfn_glUniform3fvARB) (GLint, GLsizei, const GLfloat*); +extern pfn_glUniform3fvARB fp_glUniform3fvARB; +typedef void (APIENTRYP pfn_glUniform4fvARB) (GLint, GLsizei, const GLfloat*); +extern pfn_glUniform4fvARB fp_glUniform4fvARB; +typedef void (APIENTRYP pfn_glUniform1ivARB) (GLint, GLsizei, const GLint*); +extern pfn_glUniform1ivARB fp_glUniform1ivARB; +typedef void (APIENTRYP pfn_glUniform2ivARB) (GLint, GLsizei, const GLint*); +extern pfn_glUniform2ivARB fp_glUniform2ivARB; +typedef void (APIENTRYP pfn_glUniform3ivARB) (GLint, GLsizei, const GLint*); +extern pfn_glUniform3ivARB fp_glUniform3ivARB; +typedef void (APIENTRYP pfn_glUniform4ivARB) (GLint, GLsizei, const GLint*); +extern pfn_glUniform4ivARB fp_glUniform4ivARB; +typedef void (APIENTRYP pfn_glUniformMatrix2fvARB) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix2fvARB fp_glUniformMatrix2fvARB; +typedef void (APIENTRYP pfn_glUniformMatrix3fvARB) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix3fvARB fp_glUniformMatrix3fvARB; +typedef void (APIENTRYP pfn_glUniformMatrix4fvARB) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix4fvARB fp_glUniformMatrix4fvARB; +typedef void (APIENTRYP pfn_glGetObjectParameterfvARB) (GLhandleARB, GLenum, GLfloat*); +extern pfn_glGetObjectParameterfvARB fp_glGetObjectParameterfvARB; +typedef void (APIENTRYP pfn_glGetObjectParameterivARB) (GLhandleARB, GLenum, GLint*); +extern pfn_glGetObjectParameterivARB fp_glGetObjectParameterivARB; +typedef void (APIENTRYP pfn_glGetInfoLogARB) (GLhandleARB, GLsizei, GLsizei*, GLcharARB*); +extern pfn_glGetInfoLogARB fp_glGetInfoLogARB; +typedef void (APIENTRYP pfn_glGetAttachedObjectsARB) (GLhandleARB, GLsizei, GLsizei*, GLhandleARB*); +extern pfn_glGetAttachedObjectsARB fp_glGetAttachedObjectsARB; +typedef GLint (APIENTRYP pfn_glGetUniformLocationARB) (GLhandleARB, const GLcharARB*); +extern pfn_glGetUniformLocationARB fp_glGetUniformLocationARB; +typedef void (APIENTRYP pfn_glGetActiveUniformARB) (GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*); +extern pfn_glGetActiveUniformARB fp_glGetActiveUniformARB; +typedef void (APIENTRYP pfn_glGetUniformfvARB) (GLhandleARB, GLint, GLfloat*); +extern pfn_glGetUniformfvARB fp_glGetUniformfvARB; +typedef void (APIENTRYP pfn_glGetUniformivARB) (GLhandleARB, GLint, GLint*); +extern pfn_glGetUniformivARB fp_glGetUniformivARB; +typedef void (APIENTRYP pfn_glGetShaderSourceARB) (GLhandleARB, GLsizei, GLsizei*, GLcharARB*); +extern pfn_glGetShaderSourceARB fp_glGetShaderSourceARB; + + /* GL_ARB_shader_precision */ +extern GLboolean GLAD_ARB_shader_precision; + + /* GL_ARB_shader_stencil_export */ +extern GLboolean GLAD_ARB_shader_stencil_export; + + /* GL_ARB_shader_storage_buffer_object */ +extern GLboolean GLAD_ARB_shader_storage_buffer_object; + + /* GL_ARB_shader_subroutine */ +extern GLboolean GLAD_ARB_shader_subroutine; + + /* GL_ARB_shader_texture_lod */ +extern GLboolean GLAD_ARB_shader_texture_lod; + + /* GL_ARB_shading_language_100 */ +extern GLboolean GLAD_ARB_shading_language_100; +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C + + /* GL_ARB_shading_language_420pack */ +extern GLboolean GLAD_ARB_shading_language_420pack; + + /* GL_ARB_shading_language_include */ +extern GLboolean GLAD_ARB_shading_language_include; +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +typedef void (APIENTRYP pfn_glNamedStringARB) (GLenum, GLint, const GLchar*, GLint, const GLchar*); +extern pfn_glNamedStringARB fp_glNamedStringARB; +typedef void (APIENTRYP pfn_glDeleteNamedStringARB) (GLint, const GLchar*); +extern pfn_glDeleteNamedStringARB fp_glDeleteNamedStringARB; +typedef void (APIENTRYP pfn_glCompileShaderIncludeARB) (GLuint, GLsizei, const GLchar**, const GLint*); +extern pfn_glCompileShaderIncludeARB fp_glCompileShaderIncludeARB; +typedef GLboolean (APIENTRYP pfn_glIsNamedStringARB) (GLint, const GLchar*); +extern pfn_glIsNamedStringARB fp_glIsNamedStringARB; +typedef void (APIENTRYP pfn_glGetNamedStringARB) (GLint, const GLchar*, GLsizei, GLint*, GLchar*); +extern pfn_glGetNamedStringARB fp_glGetNamedStringARB; +typedef void (APIENTRYP pfn_glGetNamedStringivARB) (GLint, const GLchar*, GLenum, GLint*); +extern pfn_glGetNamedStringivARB fp_glGetNamedStringivARB; + + /* GL_ARB_shading_language_packing */ +extern GLboolean GLAD_ARB_shading_language_packing; + + /* GL_ARB_shadow */ +extern GLboolean GLAD_ARB_shadow; +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E + + /* GL_ARB_shadow_ambient */ +extern GLboolean GLAD_ARB_shadow_ambient; +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + + /* GL_ARB_sparse_texture */ +extern GLboolean GLAD_ARB_sparse_texture; +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_MIN_SPARSE_LEVEL_ARB 0x919B +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +typedef void (APIENTRYP pfn_glTexPageCommitmentARB) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTexPageCommitmentARB fp_glTexPageCommitmentARB; + + /* GL_ARB_stencil_texturing */ +extern GLboolean GLAD_ARB_stencil_texturing; + + /* GL_ARB_sync */ +extern GLboolean GLAD_ARB_sync; + + /* GL_ARB_tessellation_shader */ +extern GLboolean GLAD_ARB_tessellation_shader; + + /* GL_ARB_texture_border_clamp */ +extern GLboolean GLAD_ARB_texture_border_clamp; +#define GL_CLAMP_TO_BORDER_ARB 0x812D + + /* GL_ARB_texture_buffer_object */ +extern GLboolean GLAD_ARB_texture_buffer_object; +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +typedef void (APIENTRYP pfn_glTexBufferARB) (GLenum, GLenum, GLuint); +extern pfn_glTexBufferARB fp_glTexBufferARB; + + /* GL_ARB_texture_buffer_object_rgb32 */ +extern GLboolean GLAD_ARB_texture_buffer_object_rgb32; + + /* GL_ARB_texture_buffer_range */ +extern GLboolean GLAD_ARB_texture_buffer_range; + + /* GL_ARB_texture_compression */ +extern GLboolean GLAD_ARB_texture_compression; +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +typedef void (APIENTRYP pfn_glCompressedTexImage3DARB) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTexImage3DARB fp_glCompressedTexImage3DARB; +typedef void (APIENTRYP pfn_glCompressedTexImage2DARB) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTexImage2DARB fp_glCompressedTexImage2DARB; +typedef void (APIENTRYP pfn_glCompressedTexImage1DARB) (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTexImage1DARB fp_glCompressedTexImage1DARB; +typedef void (APIENTRYP pfn_glCompressedTexSubImage3DARB) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTexSubImage3DARB fp_glCompressedTexSubImage3DARB; +typedef void (APIENTRYP pfn_glCompressedTexSubImage2DARB) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTexSubImage2DARB fp_glCompressedTexSubImage2DARB; +typedef void (APIENTRYP pfn_glCompressedTexSubImage1DARB) (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTexSubImage1DARB fp_glCompressedTexSubImage1DARB; +typedef void (APIENTRYP pfn_glGetCompressedTexImageARB) (GLenum, GLint, void*); +extern pfn_glGetCompressedTexImageARB fp_glGetCompressedTexImageARB; + + /* GL_ARB_texture_compression_bptc */ +extern GLboolean GLAD_ARB_texture_compression_bptc; +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F + + /* GL_ARB_texture_compression_rgtc */ +extern GLboolean GLAD_ARB_texture_compression_rgtc; + + /* GL_ARB_texture_cube_map */ +extern GLboolean GLAD_ARB_texture_cube_map; +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C + + /* GL_ARB_texture_cube_map_array */ +extern GLboolean GLAD_ARB_texture_cube_map_array; +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F + + /* GL_ARB_texture_env_add */ +extern GLboolean GLAD_ARB_texture_env_add; + + /* GL_ARB_texture_env_combine */ +extern GLboolean GLAD_ARB_texture_env_combine; +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 + + /* GL_ARB_texture_env_crossbar */ +extern GLboolean GLAD_ARB_texture_env_crossbar; + + /* GL_ARB_texture_env_dot3 */ +extern GLboolean GLAD_ARB_texture_env_dot3; +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF + + /* GL_ARB_texture_float */ +extern GLboolean GLAD_ARB_texture_float; +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F + + /* GL_ARB_texture_gather */ +extern GLboolean GLAD_ARB_texture_gather; +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F + + /* GL_ARB_texture_mirror_clamp_to_edge */ +extern GLboolean GLAD_ARB_texture_mirror_clamp_to_edge; + + /* GL_ARB_texture_mirrored_repeat */ +extern GLboolean GLAD_ARB_texture_mirrored_repeat; +#define GL_MIRRORED_REPEAT_ARB 0x8370 + + /* GL_ARB_texture_multisample */ +extern GLboolean GLAD_ARB_texture_multisample; + + /* GL_ARB_texture_non_power_of_two */ +extern GLboolean GLAD_ARB_texture_non_power_of_two; + + /* GL_ARB_texture_query_levels */ +extern GLboolean GLAD_ARB_texture_query_levels; + + /* GL_ARB_texture_query_lod */ +extern GLboolean GLAD_ARB_texture_query_lod; + + /* GL_ARB_texture_rectangle */ +extern GLboolean GLAD_ARB_texture_rectangle; +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 + + /* GL_ARB_texture_rg */ +extern GLboolean GLAD_ARB_texture_rg; + + /* GL_ARB_texture_rgb10_a2ui */ +extern GLboolean GLAD_ARB_texture_rgb10_a2ui; + + /* GL_ARB_texture_stencil8 */ +extern GLboolean GLAD_ARB_texture_stencil8; + + /* GL_ARB_texture_storage */ +extern GLboolean GLAD_ARB_texture_storage; + + /* GL_ARB_texture_storage_multisample */ +extern GLboolean GLAD_ARB_texture_storage_multisample; + + /* GL_ARB_texture_swizzle */ +extern GLboolean GLAD_ARB_texture_swizzle; + + /* GL_ARB_texture_view */ +extern GLboolean GLAD_ARB_texture_view; + + /* GL_ARB_timer_query */ +extern GLboolean GLAD_ARB_timer_query; + + /* GL_ARB_transform_feedback2 */ +extern GLboolean GLAD_ARB_transform_feedback2; + + /* GL_ARB_transform_feedback3 */ +extern GLboolean GLAD_ARB_transform_feedback3; + + /* GL_ARB_transform_feedback_instanced */ +extern GLboolean GLAD_ARB_transform_feedback_instanced; + + /* GL_ARB_transpose_matrix */ +extern GLboolean GLAD_ARB_transpose_matrix; +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +typedef void (APIENTRYP pfn_glLoadTransposeMatrixfARB) (const GLfloat*); +extern pfn_glLoadTransposeMatrixfARB fp_glLoadTransposeMatrixfARB; +typedef void (APIENTRYP pfn_glLoadTransposeMatrixdARB) (const GLdouble*); +extern pfn_glLoadTransposeMatrixdARB fp_glLoadTransposeMatrixdARB; +typedef void (APIENTRYP pfn_glMultTransposeMatrixfARB) (const GLfloat*); +extern pfn_glMultTransposeMatrixfARB fp_glMultTransposeMatrixfARB; +typedef void (APIENTRYP pfn_glMultTransposeMatrixdARB) (const GLdouble*); +extern pfn_glMultTransposeMatrixdARB fp_glMultTransposeMatrixdARB; + + /* GL_ARB_uniform_buffer_object */ +extern GLboolean GLAD_ARB_uniform_buffer_object; +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 + + /* GL_ARB_vertex_array_bgra */ +extern GLboolean GLAD_ARB_vertex_array_bgra; + + /* GL_ARB_vertex_array_object */ +extern GLboolean GLAD_ARB_vertex_array_object; + + /* GL_ARB_vertex_attrib_64bit */ +extern GLboolean GLAD_ARB_vertex_attrib_64bit; + + /* GL_ARB_vertex_attrib_binding */ +extern GLboolean GLAD_ARB_vertex_attrib_binding; + + /* GL_ARB_vertex_blend */ +extern GLboolean GLAD_ARB_vertex_blend; +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +typedef void (APIENTRYP pfn_glWeightbvARB) (GLint, const GLbyte*); +extern pfn_glWeightbvARB fp_glWeightbvARB; +typedef void (APIENTRYP pfn_glWeightsvARB) (GLint, const GLshort*); +extern pfn_glWeightsvARB fp_glWeightsvARB; +typedef void (APIENTRYP pfn_glWeightivARB) (GLint, const GLint*); +extern pfn_glWeightivARB fp_glWeightivARB; +typedef void (APIENTRYP pfn_glWeightfvARB) (GLint, const GLfloat*); +extern pfn_glWeightfvARB fp_glWeightfvARB; +typedef void (APIENTRYP pfn_glWeightdvARB) (GLint, const GLdouble*); +extern pfn_glWeightdvARB fp_glWeightdvARB; +typedef void (APIENTRYP pfn_glWeightubvARB) (GLint, const GLubyte*); +extern pfn_glWeightubvARB fp_glWeightubvARB; +typedef void (APIENTRYP pfn_glWeightusvARB) (GLint, const GLushort*); +extern pfn_glWeightusvARB fp_glWeightusvARB; +typedef void (APIENTRYP pfn_glWeightuivARB) (GLint, const GLuint*); +extern pfn_glWeightuivARB fp_glWeightuivARB; +typedef void (APIENTRYP pfn_glWeightPointerARB) (GLint, GLenum, GLsizei, const void*); +extern pfn_glWeightPointerARB fp_glWeightPointerARB; +typedef void (APIENTRYP pfn_glVertexBlendARB) (GLint); +extern pfn_glVertexBlendARB fp_glVertexBlendARB; + + /* GL_ARB_vertex_buffer_object */ +extern GLboolean GLAD_ARB_vertex_buffer_object; +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +typedef void (APIENTRYP pfn_glBindBufferARB) (GLenum, GLuint); +extern pfn_glBindBufferARB fp_glBindBufferARB; +typedef void (APIENTRYP pfn_glDeleteBuffersARB) (GLsizei, const GLuint*); +extern pfn_glDeleteBuffersARB fp_glDeleteBuffersARB; +typedef void (APIENTRYP pfn_glGenBuffersARB) (GLsizei, GLuint*); +extern pfn_glGenBuffersARB fp_glGenBuffersARB; +typedef GLboolean (APIENTRYP pfn_glIsBufferARB) (GLuint); +extern pfn_glIsBufferARB fp_glIsBufferARB; +typedef void (APIENTRYP pfn_glBufferDataARB) (GLenum, GLsizeiptrARB, const void*, GLenum); +extern pfn_glBufferDataARB fp_glBufferDataARB; +typedef void (APIENTRYP pfn_glBufferSubDataARB) (GLenum, GLintptrARB, GLsizeiptrARB, const void*); +extern pfn_glBufferSubDataARB fp_glBufferSubDataARB; +typedef void (APIENTRYP pfn_glGetBufferSubDataARB) (GLenum, GLintptrARB, GLsizeiptrARB, void*); +extern pfn_glGetBufferSubDataARB fp_glGetBufferSubDataARB; +typedef void* (APIENTRYP pfn_glMapBufferARB) (GLenum, GLenum); +extern pfn_glMapBufferARB fp_glMapBufferARB; +typedef GLboolean (APIENTRYP pfn_glUnmapBufferARB) (GLenum); +extern pfn_glUnmapBufferARB fp_glUnmapBufferARB; +typedef void (APIENTRYP pfn_glGetBufferParameterivARB) (GLenum, GLenum, GLint*); +extern pfn_glGetBufferParameterivARB fp_glGetBufferParameterivARB; +typedef void (APIENTRYP pfn_glGetBufferPointervARB) (GLenum, GLenum, void**); +extern pfn_glGetBufferPointervARB fp_glGetBufferPointervARB; + + /* GL_ARB_vertex_program */ +extern GLboolean GLAD_ARB_vertex_program; +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +typedef void (APIENTRYP pfn_glVertexAttrib1dARB) (GLuint, GLdouble); +extern pfn_glVertexAttrib1dARB fp_glVertexAttrib1dARB; +typedef void (APIENTRYP pfn_glVertexAttrib1dvARB) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib1dvARB fp_glVertexAttrib1dvARB; +typedef void (APIENTRYP pfn_glVertexAttrib1fARB) (GLuint, GLfloat); +extern pfn_glVertexAttrib1fARB fp_glVertexAttrib1fARB; +typedef void (APIENTRYP pfn_glVertexAttrib1fvARB) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib1fvARB fp_glVertexAttrib1fvARB; +typedef void (APIENTRYP pfn_glVertexAttrib1sARB) (GLuint, GLshort); +extern pfn_glVertexAttrib1sARB fp_glVertexAttrib1sARB; +typedef void (APIENTRYP pfn_glVertexAttrib1svARB) (GLuint, const GLshort*); +extern pfn_glVertexAttrib1svARB fp_glVertexAttrib1svARB; +typedef void (APIENTRYP pfn_glVertexAttrib2dARB) (GLuint, GLdouble, GLdouble); +extern pfn_glVertexAttrib2dARB fp_glVertexAttrib2dARB; +typedef void (APIENTRYP pfn_glVertexAttrib2dvARB) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib2dvARB fp_glVertexAttrib2dvARB; +typedef void (APIENTRYP pfn_glVertexAttrib2fARB) (GLuint, GLfloat, GLfloat); +extern pfn_glVertexAttrib2fARB fp_glVertexAttrib2fARB; +typedef void (APIENTRYP pfn_glVertexAttrib2fvARB) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib2fvARB fp_glVertexAttrib2fvARB; +typedef void (APIENTRYP pfn_glVertexAttrib2sARB) (GLuint, GLshort, GLshort); +extern pfn_glVertexAttrib2sARB fp_glVertexAttrib2sARB; +typedef void (APIENTRYP pfn_glVertexAttrib2svARB) (GLuint, const GLshort*); +extern pfn_glVertexAttrib2svARB fp_glVertexAttrib2svARB; +typedef void (APIENTRYP pfn_glVertexAttrib3dARB) (GLuint, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttrib3dARB fp_glVertexAttrib3dARB; +typedef void (APIENTRYP pfn_glVertexAttrib3dvARB) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib3dvARB fp_glVertexAttrib3dvARB; +typedef void (APIENTRYP pfn_glVertexAttrib3fARB) (GLuint, GLfloat, GLfloat, GLfloat); +extern pfn_glVertexAttrib3fARB fp_glVertexAttrib3fARB; +typedef void (APIENTRYP pfn_glVertexAttrib3fvARB) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib3fvARB fp_glVertexAttrib3fvARB; +typedef void (APIENTRYP pfn_glVertexAttrib3sARB) (GLuint, GLshort, GLshort, GLshort); +extern pfn_glVertexAttrib3sARB fp_glVertexAttrib3sARB; +typedef void (APIENTRYP pfn_glVertexAttrib3svARB) (GLuint, const GLshort*); +extern pfn_glVertexAttrib3svARB fp_glVertexAttrib3svARB; +typedef void (APIENTRYP pfn_glVertexAttrib4NbvARB) (GLuint, const GLbyte*); +extern pfn_glVertexAttrib4NbvARB fp_glVertexAttrib4NbvARB; +typedef void (APIENTRYP pfn_glVertexAttrib4NivARB) (GLuint, const GLint*); +extern pfn_glVertexAttrib4NivARB fp_glVertexAttrib4NivARB; +typedef void (APIENTRYP pfn_glVertexAttrib4NsvARB) (GLuint, const GLshort*); +extern pfn_glVertexAttrib4NsvARB fp_glVertexAttrib4NsvARB; +typedef void (APIENTRYP pfn_glVertexAttrib4NubARB) (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +extern pfn_glVertexAttrib4NubARB fp_glVertexAttrib4NubARB; +typedef void (APIENTRYP pfn_glVertexAttrib4NubvARB) (GLuint, const GLubyte*); +extern pfn_glVertexAttrib4NubvARB fp_glVertexAttrib4NubvARB; +typedef void (APIENTRYP pfn_glVertexAttrib4NuivARB) (GLuint, const GLuint*); +extern pfn_glVertexAttrib4NuivARB fp_glVertexAttrib4NuivARB; +typedef void (APIENTRYP pfn_glVertexAttrib4NusvARB) (GLuint, const GLushort*); +extern pfn_glVertexAttrib4NusvARB fp_glVertexAttrib4NusvARB; +typedef void (APIENTRYP pfn_glVertexAttrib4bvARB) (GLuint, const GLbyte*); +extern pfn_glVertexAttrib4bvARB fp_glVertexAttrib4bvARB; +typedef void (APIENTRYP pfn_glVertexAttrib4dARB) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttrib4dARB fp_glVertexAttrib4dARB; +typedef void (APIENTRYP pfn_glVertexAttrib4dvARB) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib4dvARB fp_glVertexAttrib4dvARB; +typedef void (APIENTRYP pfn_glVertexAttrib4fARB) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glVertexAttrib4fARB fp_glVertexAttrib4fARB; +typedef void (APIENTRYP pfn_glVertexAttrib4fvARB) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib4fvARB fp_glVertexAttrib4fvARB; +typedef void (APIENTRYP pfn_glVertexAttrib4ivARB) (GLuint, const GLint*); +extern pfn_glVertexAttrib4ivARB fp_glVertexAttrib4ivARB; +typedef void (APIENTRYP pfn_glVertexAttrib4sARB) (GLuint, GLshort, GLshort, GLshort, GLshort); +extern pfn_glVertexAttrib4sARB fp_glVertexAttrib4sARB; +typedef void (APIENTRYP pfn_glVertexAttrib4svARB) (GLuint, const GLshort*); +extern pfn_glVertexAttrib4svARB fp_glVertexAttrib4svARB; +typedef void (APIENTRYP pfn_glVertexAttrib4ubvARB) (GLuint, const GLubyte*); +extern pfn_glVertexAttrib4ubvARB fp_glVertexAttrib4ubvARB; +typedef void (APIENTRYP pfn_glVertexAttrib4uivARB) (GLuint, const GLuint*); +extern pfn_glVertexAttrib4uivARB fp_glVertexAttrib4uivARB; +typedef void (APIENTRYP pfn_glVertexAttrib4usvARB) (GLuint, const GLushort*); +extern pfn_glVertexAttrib4usvARB fp_glVertexAttrib4usvARB; +typedef void (APIENTRYP pfn_glVertexAttribPointerARB) (GLuint, GLint, GLenum, GLboolean, GLsizei, const void*); +extern pfn_glVertexAttribPointerARB fp_glVertexAttribPointerARB; +typedef void (APIENTRYP pfn_glEnableVertexAttribArrayARB) (GLuint); +extern pfn_glEnableVertexAttribArrayARB fp_glEnableVertexAttribArrayARB; +typedef void (APIENTRYP pfn_glDisableVertexAttribArrayARB) (GLuint); +extern pfn_glDisableVertexAttribArrayARB fp_glDisableVertexAttribArrayARB; +typedef void (APIENTRYP pfn_glGetVertexAttribdvARB) (GLuint, GLenum, GLdouble*); +extern pfn_glGetVertexAttribdvARB fp_glGetVertexAttribdvARB; +typedef void (APIENTRYP pfn_glGetVertexAttribfvARB) (GLuint, GLenum, GLfloat*); +extern pfn_glGetVertexAttribfvARB fp_glGetVertexAttribfvARB; +typedef void (APIENTRYP pfn_glGetVertexAttribivARB) (GLuint, GLenum, GLint*); +extern pfn_glGetVertexAttribivARB fp_glGetVertexAttribivARB; +typedef void (APIENTRYP pfn_glGetVertexAttribPointervARB) (GLuint, GLenum, void**); +extern pfn_glGetVertexAttribPointervARB fp_glGetVertexAttribPointervARB; + + /* GL_ARB_vertex_shader */ +extern GLboolean GLAD_ARB_vertex_shader; +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +typedef void (APIENTRYP pfn_glBindAttribLocationARB) (GLhandleARB, GLuint, const GLcharARB*); +extern pfn_glBindAttribLocationARB fp_glBindAttribLocationARB; +typedef void (APIENTRYP pfn_glGetActiveAttribARB) (GLhandleARB, GLuint, GLsizei, GLsizei*, GLint*, GLenum*, GLcharARB*); +extern pfn_glGetActiveAttribARB fp_glGetActiveAttribARB; +typedef GLint (APIENTRYP pfn_glGetAttribLocationARB) (GLhandleARB, const GLcharARB*); +extern pfn_glGetAttribLocationARB fp_glGetAttribLocationARB; + + /* GL_ARB_vertex_type_10f_11f_11f_rev */ +extern GLboolean GLAD_ARB_vertex_type_10f_11f_11f_rev; + + /* GL_ARB_vertex_type_2_10_10_10_rev */ +extern GLboolean GLAD_ARB_vertex_type_2_10_10_10_rev; + + /* GL_ARB_viewport_array */ +extern GLboolean GLAD_ARB_viewport_array; + + /* GL_ARB_window_pos */ +extern GLboolean GLAD_ARB_window_pos; +typedef void (APIENTRYP pfn_glWindowPos2dARB) (GLdouble, GLdouble); +extern pfn_glWindowPos2dARB fp_glWindowPos2dARB; +typedef void (APIENTRYP pfn_glWindowPos2dvARB) (const GLdouble*); +extern pfn_glWindowPos2dvARB fp_glWindowPos2dvARB; +typedef void (APIENTRYP pfn_glWindowPos2fARB) (GLfloat, GLfloat); +extern pfn_glWindowPos2fARB fp_glWindowPos2fARB; +typedef void (APIENTRYP pfn_glWindowPos2fvARB) (const GLfloat*); +extern pfn_glWindowPos2fvARB fp_glWindowPos2fvARB; +typedef void (APIENTRYP pfn_glWindowPos2iARB) (GLint, GLint); +extern pfn_glWindowPos2iARB fp_glWindowPos2iARB; +typedef void (APIENTRYP pfn_glWindowPos2ivARB) (const GLint*); +extern pfn_glWindowPos2ivARB fp_glWindowPos2ivARB; +typedef void (APIENTRYP pfn_glWindowPos2sARB) (GLshort, GLshort); +extern pfn_glWindowPos2sARB fp_glWindowPos2sARB; +typedef void (APIENTRYP pfn_glWindowPos2svARB) (const GLshort*); +extern pfn_glWindowPos2svARB fp_glWindowPos2svARB; +typedef void (APIENTRYP pfn_glWindowPos3dARB) (GLdouble, GLdouble, GLdouble); +extern pfn_glWindowPos3dARB fp_glWindowPos3dARB; +typedef void (APIENTRYP pfn_glWindowPos3dvARB) (const GLdouble*); +extern pfn_glWindowPos3dvARB fp_glWindowPos3dvARB; +typedef void (APIENTRYP pfn_glWindowPos3fARB) (GLfloat, GLfloat, GLfloat); +extern pfn_glWindowPos3fARB fp_glWindowPos3fARB; +typedef void (APIENTRYP pfn_glWindowPos3fvARB) (const GLfloat*); +extern pfn_glWindowPos3fvARB fp_glWindowPos3fvARB; +typedef void (APIENTRYP pfn_glWindowPos3iARB) (GLint, GLint, GLint); +extern pfn_glWindowPos3iARB fp_glWindowPos3iARB; +typedef void (APIENTRYP pfn_glWindowPos3ivARB) (const GLint*); +extern pfn_glWindowPos3ivARB fp_glWindowPos3ivARB; +typedef void (APIENTRYP pfn_glWindowPos3sARB) (GLshort, GLshort, GLshort); +extern pfn_glWindowPos3sARB fp_glWindowPos3sARB; +typedef void (APIENTRYP pfn_glWindowPos3svARB) (const GLshort*); +extern pfn_glWindowPos3svARB fp_glWindowPos3svARB; + + /* GL_EXT_422_pixels */ +extern GLboolean GLAD_EXT_422_pixels; +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF + + /* GL_EXT_abgr */ +extern GLboolean GLAD_EXT_abgr; +#define GL_ABGR_EXT 0x8000 + + /* GL_EXT_bindable_uniform */ +extern GLboolean GLAD_EXT_bindable_uniform; +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +typedef void (APIENTRYP pfn_glUniformBufferEXT) (GLuint, GLint, GLuint); +extern pfn_glUniformBufferEXT fp_glUniformBufferEXT; +typedef GLint (APIENTRYP pfn_glGetUniformBufferSizeEXT) (GLuint, GLint); +extern pfn_glGetUniformBufferSizeEXT fp_glGetUniformBufferSizeEXT; +typedef GLintptr (APIENTRYP pfn_glGetUniformOffsetEXT) (GLuint, GLint); +extern pfn_glGetUniformOffsetEXT fp_glGetUniformOffsetEXT; + + /* GL_EXT_blend_color */ +extern GLboolean GLAD_EXT_blend_color; +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +typedef void (APIENTRYP pfn_glBlendColorEXT) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glBlendColorEXT fp_glBlendColorEXT; + + /* GL_EXT_blend_equation_separate */ +extern GLboolean GLAD_EXT_blend_equation_separate; +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +typedef void (APIENTRYP pfn_glBlendEquationSeparateEXT) (GLenum, GLenum); +extern pfn_glBlendEquationSeparateEXT fp_glBlendEquationSeparateEXT; + + /* GL_EXT_blend_func_separate */ +extern GLboolean GLAD_EXT_blend_func_separate; +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +typedef void (APIENTRYP pfn_glBlendFuncSeparateEXT) (GLenum, GLenum, GLenum, GLenum); +extern pfn_glBlendFuncSeparateEXT fp_glBlendFuncSeparateEXT; + + /* GL_EXT_blend_minmax */ +extern GLboolean GLAD_EXT_blend_minmax; +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_BLEND_EQUATION_EXT 0x8009 +typedef void (APIENTRYP pfn_glBlendEquationEXT) (GLenum); +extern pfn_glBlendEquationEXT fp_glBlendEquationEXT; + + /* GL_EXT_blend_subtract */ +extern GLboolean GLAD_EXT_blend_subtract; +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + + /* GL_EXT_clip_volume_hint */ +extern GLboolean GLAD_EXT_clip_volume_hint; +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 + + /* GL_EXT_cmyka */ +extern GLboolean GLAD_EXT_cmyka; +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F + + /* GL_EXT_color_buffer_half_float */ +extern GLboolean GLAD_EXT_color_buffer_half_float; +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_RG16F_EXT 0x822F +#define GL_R16F_EXT 0x822D +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 + + /* GL_EXT_color_subtable */ +extern GLboolean GLAD_EXT_color_subtable; +typedef void (APIENTRYP pfn_glColorSubTableEXT) (GLenum, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glColorSubTableEXT fp_glColorSubTableEXT; +typedef void (APIENTRYP pfn_glCopyColorSubTableEXT) (GLenum, GLsizei, GLint, GLint, GLsizei); +extern pfn_glCopyColorSubTableEXT fp_glCopyColorSubTableEXT; + + /* GL_EXT_compiled_vertex_array */ +extern GLboolean GLAD_EXT_compiled_vertex_array; +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +typedef void (APIENTRYP pfn_glLockArraysEXT) (GLint, GLsizei); +extern pfn_glLockArraysEXT fp_glLockArraysEXT; +typedef void (APIENTRYP pfn_glUnlockArraysEXT) (); +extern pfn_glUnlockArraysEXT fp_glUnlockArraysEXT; + + /* GL_EXT_convolution */ +extern GLboolean GLAD_EXT_convolution; +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +typedef void (APIENTRYP pfn_glConvolutionFilter1DEXT) (GLenum, GLenum, GLsizei, GLenum, GLenum, const void*); +extern pfn_glConvolutionFilter1DEXT fp_glConvolutionFilter1DEXT; +typedef void (APIENTRYP pfn_glConvolutionFilter2DEXT) (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glConvolutionFilter2DEXT fp_glConvolutionFilter2DEXT; +typedef void (APIENTRYP pfn_glConvolutionParameterfEXT) (GLenum, GLenum, GLfloat); +extern pfn_glConvolutionParameterfEXT fp_glConvolutionParameterfEXT; +typedef void (APIENTRYP pfn_glConvolutionParameterfvEXT) (GLenum, GLenum, const GLfloat*); +extern pfn_glConvolutionParameterfvEXT fp_glConvolutionParameterfvEXT; +typedef void (APIENTRYP pfn_glConvolutionParameteriEXT) (GLenum, GLenum, GLint); +extern pfn_glConvolutionParameteriEXT fp_glConvolutionParameteriEXT; +typedef void (APIENTRYP pfn_glConvolutionParameterivEXT) (GLenum, GLenum, const GLint*); +extern pfn_glConvolutionParameterivEXT fp_glConvolutionParameterivEXT; +typedef void (APIENTRYP pfn_glCopyConvolutionFilter1DEXT) (GLenum, GLenum, GLint, GLint, GLsizei); +extern pfn_glCopyConvolutionFilter1DEXT fp_glCopyConvolutionFilter1DEXT; +typedef void (APIENTRYP pfn_glCopyConvolutionFilter2DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyConvolutionFilter2DEXT fp_glCopyConvolutionFilter2DEXT; +typedef void (APIENTRYP pfn_glGetConvolutionFilterEXT) (GLenum, GLenum, GLenum, void*); +extern pfn_glGetConvolutionFilterEXT fp_glGetConvolutionFilterEXT; +typedef void (APIENTRYP pfn_glGetConvolutionParameterfvEXT) (GLenum, GLenum, GLfloat*); +extern pfn_glGetConvolutionParameterfvEXT fp_glGetConvolutionParameterfvEXT; +typedef void (APIENTRYP pfn_glGetConvolutionParameterivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetConvolutionParameterivEXT fp_glGetConvolutionParameterivEXT; +typedef void (APIENTRYP pfn_glGetSeparableFilterEXT) (GLenum, GLenum, GLenum, void*, void*, void*); +extern pfn_glGetSeparableFilterEXT fp_glGetSeparableFilterEXT; +typedef void (APIENTRYP pfn_glSeparableFilter2DEXT) (GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, const void*, const void*); +extern pfn_glSeparableFilter2DEXT fp_glSeparableFilter2DEXT; + + /* GL_EXT_coordinate_frame */ +extern GLboolean GLAD_EXT_coordinate_frame; +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +typedef void (APIENTRYP pfn_glTangent3bEXT) (GLbyte, GLbyte, GLbyte); +extern pfn_glTangent3bEXT fp_glTangent3bEXT; +typedef void (APIENTRYP pfn_glTangent3bvEXT) (const GLbyte*); +extern pfn_glTangent3bvEXT fp_glTangent3bvEXT; +typedef void (APIENTRYP pfn_glTangent3dEXT) (GLdouble, GLdouble, GLdouble); +extern pfn_glTangent3dEXT fp_glTangent3dEXT; +typedef void (APIENTRYP pfn_glTangent3dvEXT) (const GLdouble*); +extern pfn_glTangent3dvEXT fp_glTangent3dvEXT; +typedef void (APIENTRYP pfn_glTangent3fEXT) (GLfloat, GLfloat, GLfloat); +extern pfn_glTangent3fEXT fp_glTangent3fEXT; +typedef void (APIENTRYP pfn_glTangent3fvEXT) (const GLfloat*); +extern pfn_glTangent3fvEXT fp_glTangent3fvEXT; +typedef void (APIENTRYP pfn_glTangent3iEXT) (GLint, GLint, GLint); +extern pfn_glTangent3iEXT fp_glTangent3iEXT; +typedef void (APIENTRYP pfn_glTangent3ivEXT) (const GLint*); +extern pfn_glTangent3ivEXT fp_glTangent3ivEXT; +typedef void (APIENTRYP pfn_glTangent3sEXT) (GLshort, GLshort, GLshort); +extern pfn_glTangent3sEXT fp_glTangent3sEXT; +typedef void (APIENTRYP pfn_glTangent3svEXT) (const GLshort*); +extern pfn_glTangent3svEXT fp_glTangent3svEXT; +typedef void (APIENTRYP pfn_glBinormal3bEXT) (GLbyte, GLbyte, GLbyte); +extern pfn_glBinormal3bEXT fp_glBinormal3bEXT; +typedef void (APIENTRYP pfn_glBinormal3bvEXT) (const GLbyte*); +extern pfn_glBinormal3bvEXT fp_glBinormal3bvEXT; +typedef void (APIENTRYP pfn_glBinormal3dEXT) (GLdouble, GLdouble, GLdouble); +extern pfn_glBinormal3dEXT fp_glBinormal3dEXT; +typedef void (APIENTRYP pfn_glBinormal3dvEXT) (const GLdouble*); +extern pfn_glBinormal3dvEXT fp_glBinormal3dvEXT; +typedef void (APIENTRYP pfn_glBinormal3fEXT) (GLfloat, GLfloat, GLfloat); +extern pfn_glBinormal3fEXT fp_glBinormal3fEXT; +typedef void (APIENTRYP pfn_glBinormal3fvEXT) (const GLfloat*); +extern pfn_glBinormal3fvEXT fp_glBinormal3fvEXT; +typedef void (APIENTRYP pfn_glBinormal3iEXT) (GLint, GLint, GLint); +extern pfn_glBinormal3iEXT fp_glBinormal3iEXT; +typedef void (APIENTRYP pfn_glBinormal3ivEXT) (const GLint*); +extern pfn_glBinormal3ivEXT fp_glBinormal3ivEXT; +typedef void (APIENTRYP pfn_glBinormal3sEXT) (GLshort, GLshort, GLshort); +extern pfn_glBinormal3sEXT fp_glBinormal3sEXT; +typedef void (APIENTRYP pfn_glBinormal3svEXT) (const GLshort*); +extern pfn_glBinormal3svEXT fp_glBinormal3svEXT; +typedef void (APIENTRYP pfn_glTangentPointerEXT) (GLenum, GLsizei, const void*); +extern pfn_glTangentPointerEXT fp_glTangentPointerEXT; +typedef void (APIENTRYP pfn_glBinormalPointerEXT) (GLenum, GLsizei, const void*); +extern pfn_glBinormalPointerEXT fp_glBinormalPointerEXT; + + /* GL_EXT_cull_vertex */ +extern GLboolean GLAD_EXT_cull_vertex; +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +typedef void (APIENTRYP pfn_glCullParameterdvEXT) (GLenum, GLdouble*); +extern pfn_glCullParameterdvEXT fp_glCullParameterdvEXT; +typedef void (APIENTRYP pfn_glCullParameterfvEXT) (GLenum, GLfloat*); +extern pfn_glCullParameterfvEXT fp_glCullParameterfvEXT; + + /* GL_EXT_debug_label */ +extern GLboolean GLAD_EXT_debug_label; +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +typedef void (APIENTRYP pfn_glLabelObjectEXT) (GLenum, GLuint, GLsizei, const GLchar*); +extern pfn_glLabelObjectEXT fp_glLabelObjectEXT; +typedef void (APIENTRYP pfn_glGetObjectLabelEXT) (GLenum, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetObjectLabelEXT fp_glGetObjectLabelEXT; + + /* GL_EXT_debug_marker */ +extern GLboolean GLAD_EXT_debug_marker; +typedef void (APIENTRYP pfn_glInsertEventMarkerEXT) (GLsizei, const GLchar*); +extern pfn_glInsertEventMarkerEXT fp_glInsertEventMarkerEXT; +typedef void (APIENTRYP pfn_glPushGroupMarkerEXT) (GLsizei, const GLchar*); +extern pfn_glPushGroupMarkerEXT fp_glPushGroupMarkerEXT; +typedef void (APIENTRYP pfn_glPopGroupMarkerEXT) (); +extern pfn_glPopGroupMarkerEXT fp_glPopGroupMarkerEXT; + + /* GL_EXT_depth_bounds_test */ +extern GLboolean GLAD_EXT_depth_bounds_test; +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +typedef void (APIENTRYP pfn_glDepthBoundsEXT) (GLclampd, GLclampd); +extern pfn_glDepthBoundsEXT fp_glDepthBoundsEXT; + + /* GL_EXT_direct_state_access */ +extern GLboolean GLAD_EXT_direct_state_access; +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +typedef void (APIENTRYP pfn_glMatrixLoadfEXT) (GLenum, const GLfloat*); +extern pfn_glMatrixLoadfEXT fp_glMatrixLoadfEXT; +typedef void (APIENTRYP pfn_glMatrixLoaddEXT) (GLenum, const GLdouble*); +extern pfn_glMatrixLoaddEXT fp_glMatrixLoaddEXT; +typedef void (APIENTRYP pfn_glMatrixMultfEXT) (GLenum, const GLfloat*); +extern pfn_glMatrixMultfEXT fp_glMatrixMultfEXT; +typedef void (APIENTRYP pfn_glMatrixMultdEXT) (GLenum, const GLdouble*); +extern pfn_glMatrixMultdEXT fp_glMatrixMultdEXT; +typedef void (APIENTRYP pfn_glMatrixLoadIdentityEXT) (GLenum); +extern pfn_glMatrixLoadIdentityEXT fp_glMatrixLoadIdentityEXT; +typedef void (APIENTRYP pfn_glMatrixRotatefEXT) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glMatrixRotatefEXT fp_glMatrixRotatefEXT; +typedef void (APIENTRYP pfn_glMatrixRotatedEXT) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glMatrixRotatedEXT fp_glMatrixRotatedEXT; +typedef void (APIENTRYP pfn_glMatrixScalefEXT) (GLenum, GLfloat, GLfloat, GLfloat); +extern pfn_glMatrixScalefEXT fp_glMatrixScalefEXT; +typedef void (APIENTRYP pfn_glMatrixScaledEXT) (GLenum, GLdouble, GLdouble, GLdouble); +extern pfn_glMatrixScaledEXT fp_glMatrixScaledEXT; +typedef void (APIENTRYP pfn_glMatrixTranslatefEXT) (GLenum, GLfloat, GLfloat, GLfloat); +extern pfn_glMatrixTranslatefEXT fp_glMatrixTranslatefEXT; +typedef void (APIENTRYP pfn_glMatrixTranslatedEXT) (GLenum, GLdouble, GLdouble, GLdouble); +extern pfn_glMatrixTranslatedEXT fp_glMatrixTranslatedEXT; +typedef void (APIENTRYP pfn_glMatrixFrustumEXT) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glMatrixFrustumEXT fp_glMatrixFrustumEXT; +typedef void (APIENTRYP pfn_glMatrixOrthoEXT) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glMatrixOrthoEXT fp_glMatrixOrthoEXT; +typedef void (APIENTRYP pfn_glMatrixPopEXT) (GLenum); +extern pfn_glMatrixPopEXT fp_glMatrixPopEXT; +typedef void (APIENTRYP pfn_glMatrixPushEXT) (GLenum); +extern pfn_glMatrixPushEXT fp_glMatrixPushEXT; +typedef void (APIENTRYP pfn_glClientAttribDefaultEXT) (GLbitfield); +extern pfn_glClientAttribDefaultEXT fp_glClientAttribDefaultEXT; +typedef void (APIENTRYP pfn_glPushClientAttribDefaultEXT) (GLbitfield); +extern pfn_glPushClientAttribDefaultEXT fp_glPushClientAttribDefaultEXT; +typedef void (APIENTRYP pfn_glTextureParameterfEXT) (GLuint, GLenum, GLenum, GLfloat); +extern pfn_glTextureParameterfEXT fp_glTextureParameterfEXT; +typedef void (APIENTRYP pfn_glTextureParameterfvEXT) (GLuint, GLenum, GLenum, const GLfloat*); +extern pfn_glTextureParameterfvEXT fp_glTextureParameterfvEXT; +typedef void (APIENTRYP pfn_glTextureParameteriEXT) (GLuint, GLenum, GLenum, GLint); +extern pfn_glTextureParameteriEXT fp_glTextureParameteriEXT; +typedef void (APIENTRYP pfn_glTextureParameterivEXT) (GLuint, GLenum, GLenum, const GLint*); +extern pfn_glTextureParameterivEXT fp_glTextureParameterivEXT; +typedef void (APIENTRYP pfn_glTextureImage1DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glTextureImage1DEXT fp_glTextureImage1DEXT; +typedef void (APIENTRYP pfn_glTextureImage2DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glTextureImage2DEXT fp_glTextureImage2DEXT; +typedef void (APIENTRYP pfn_glTextureSubImage1DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTextureSubImage1DEXT fp_glTextureSubImage1DEXT; +typedef void (APIENTRYP pfn_glTextureSubImage2DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTextureSubImage2DEXT fp_glTextureSubImage2DEXT; +typedef void (APIENTRYP pfn_glCopyTextureImage1DEXT) (GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +extern pfn_glCopyTextureImage1DEXT fp_glCopyTextureImage1DEXT; +typedef void (APIENTRYP pfn_glCopyTextureImage2DEXT) (GLuint, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +extern pfn_glCopyTextureImage2DEXT fp_glCopyTextureImage2DEXT; +typedef void (APIENTRYP pfn_glCopyTextureSubImage1DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei); +extern pfn_glCopyTextureSubImage1DEXT fp_glCopyTextureSubImage1DEXT; +typedef void (APIENTRYP pfn_glCopyTextureSubImage2DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyTextureSubImage2DEXT fp_glCopyTextureSubImage2DEXT; +typedef void (APIENTRYP pfn_glGetTextureImageEXT) (GLuint, GLenum, GLint, GLenum, GLenum, void*); +extern pfn_glGetTextureImageEXT fp_glGetTextureImageEXT; +typedef void (APIENTRYP pfn_glGetTextureParameterfvEXT) (GLuint, GLenum, GLenum, GLfloat*); +extern pfn_glGetTextureParameterfvEXT fp_glGetTextureParameterfvEXT; +typedef void (APIENTRYP pfn_glGetTextureParameterivEXT) (GLuint, GLenum, GLenum, GLint*); +extern pfn_glGetTextureParameterivEXT fp_glGetTextureParameterivEXT; +typedef void (APIENTRYP pfn_glGetTextureLevelParameterfvEXT) (GLuint, GLenum, GLint, GLenum, GLfloat*); +extern pfn_glGetTextureLevelParameterfvEXT fp_glGetTextureLevelParameterfvEXT; +typedef void (APIENTRYP pfn_glGetTextureLevelParameterivEXT) (GLuint, GLenum, GLint, GLenum, GLint*); +extern pfn_glGetTextureLevelParameterivEXT fp_glGetTextureLevelParameterivEXT; +typedef void (APIENTRYP pfn_glTextureImage3DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glTextureImage3DEXT fp_glTextureImage3DEXT; +typedef void (APIENTRYP pfn_glTextureSubImage3DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTextureSubImage3DEXT fp_glTextureSubImage3DEXT; +typedef void (APIENTRYP pfn_glCopyTextureSubImage3DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyTextureSubImage3DEXT fp_glCopyTextureSubImage3DEXT; +typedef void (APIENTRYP pfn_glBindMultiTextureEXT) (GLenum, GLenum, GLuint); +extern pfn_glBindMultiTextureEXT fp_glBindMultiTextureEXT; +typedef void (APIENTRYP pfn_glMultiTexCoordPointerEXT) (GLenum, GLint, GLenum, GLsizei, const void*); +extern pfn_glMultiTexCoordPointerEXT fp_glMultiTexCoordPointerEXT; +typedef void (APIENTRYP pfn_glMultiTexEnvfEXT) (GLenum, GLenum, GLenum, GLfloat); +extern pfn_glMultiTexEnvfEXT fp_glMultiTexEnvfEXT; +typedef void (APIENTRYP pfn_glMultiTexEnvfvEXT) (GLenum, GLenum, GLenum, const GLfloat*); +extern pfn_glMultiTexEnvfvEXT fp_glMultiTexEnvfvEXT; +typedef void (APIENTRYP pfn_glMultiTexEnviEXT) (GLenum, GLenum, GLenum, GLint); +extern pfn_glMultiTexEnviEXT fp_glMultiTexEnviEXT; +typedef void (APIENTRYP pfn_glMultiTexEnvivEXT) (GLenum, GLenum, GLenum, const GLint*); +extern pfn_glMultiTexEnvivEXT fp_glMultiTexEnvivEXT; +typedef void (APIENTRYP pfn_glMultiTexGendEXT) (GLenum, GLenum, GLenum, GLdouble); +extern pfn_glMultiTexGendEXT fp_glMultiTexGendEXT; +typedef void (APIENTRYP pfn_glMultiTexGendvEXT) (GLenum, GLenum, GLenum, const GLdouble*); +extern pfn_glMultiTexGendvEXT fp_glMultiTexGendvEXT; +typedef void (APIENTRYP pfn_glMultiTexGenfEXT) (GLenum, GLenum, GLenum, GLfloat); +extern pfn_glMultiTexGenfEXT fp_glMultiTexGenfEXT; +typedef void (APIENTRYP pfn_glMultiTexGenfvEXT) (GLenum, GLenum, GLenum, const GLfloat*); +extern pfn_glMultiTexGenfvEXT fp_glMultiTexGenfvEXT; +typedef void (APIENTRYP pfn_glMultiTexGeniEXT) (GLenum, GLenum, GLenum, GLint); +extern pfn_glMultiTexGeniEXT fp_glMultiTexGeniEXT; +typedef void (APIENTRYP pfn_glMultiTexGenivEXT) (GLenum, GLenum, GLenum, const GLint*); +extern pfn_glMultiTexGenivEXT fp_glMultiTexGenivEXT; +typedef void (APIENTRYP pfn_glGetMultiTexEnvfvEXT) (GLenum, GLenum, GLenum, GLfloat*); +extern pfn_glGetMultiTexEnvfvEXT fp_glGetMultiTexEnvfvEXT; +typedef void (APIENTRYP pfn_glGetMultiTexEnvivEXT) (GLenum, GLenum, GLenum, GLint*); +extern pfn_glGetMultiTexEnvivEXT fp_glGetMultiTexEnvivEXT; +typedef void (APIENTRYP pfn_glGetMultiTexGendvEXT) (GLenum, GLenum, GLenum, GLdouble*); +extern pfn_glGetMultiTexGendvEXT fp_glGetMultiTexGendvEXT; +typedef void (APIENTRYP pfn_glGetMultiTexGenfvEXT) (GLenum, GLenum, GLenum, GLfloat*); +extern pfn_glGetMultiTexGenfvEXT fp_glGetMultiTexGenfvEXT; +typedef void (APIENTRYP pfn_glGetMultiTexGenivEXT) (GLenum, GLenum, GLenum, GLint*); +extern pfn_glGetMultiTexGenivEXT fp_glGetMultiTexGenivEXT; +typedef void (APIENTRYP pfn_glMultiTexParameteriEXT) (GLenum, GLenum, GLenum, GLint); +extern pfn_glMultiTexParameteriEXT fp_glMultiTexParameteriEXT; +typedef void (APIENTRYP pfn_glMultiTexParameterivEXT) (GLenum, GLenum, GLenum, const GLint*); +extern pfn_glMultiTexParameterivEXT fp_glMultiTexParameterivEXT; +typedef void (APIENTRYP pfn_glMultiTexParameterfEXT) (GLenum, GLenum, GLenum, GLfloat); +extern pfn_glMultiTexParameterfEXT fp_glMultiTexParameterfEXT; +typedef void (APIENTRYP pfn_glMultiTexParameterfvEXT) (GLenum, GLenum, GLenum, const GLfloat*); +extern pfn_glMultiTexParameterfvEXT fp_glMultiTexParameterfvEXT; +typedef void (APIENTRYP pfn_glMultiTexImage1DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glMultiTexImage1DEXT fp_glMultiTexImage1DEXT; +typedef void (APIENTRYP pfn_glMultiTexImage2DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glMultiTexImage2DEXT fp_glMultiTexImage2DEXT; +typedef void (APIENTRYP pfn_glMultiTexSubImage1DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void*); +extern pfn_glMultiTexSubImage1DEXT fp_glMultiTexSubImage1DEXT; +typedef void (APIENTRYP pfn_glMultiTexSubImage2DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glMultiTexSubImage2DEXT fp_glMultiTexSubImage2DEXT; +typedef void (APIENTRYP pfn_glCopyMultiTexImage1DEXT) (GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint); +extern pfn_glCopyMultiTexImage1DEXT fp_glCopyMultiTexImage1DEXT; +typedef void (APIENTRYP pfn_glCopyMultiTexImage2DEXT) (GLenum, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint); +extern pfn_glCopyMultiTexImage2DEXT fp_glCopyMultiTexImage2DEXT; +typedef void (APIENTRYP pfn_glCopyMultiTexSubImage1DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei); +extern pfn_glCopyMultiTexSubImage1DEXT fp_glCopyMultiTexSubImage1DEXT; +typedef void (APIENTRYP pfn_glCopyMultiTexSubImage2DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyMultiTexSubImage2DEXT fp_glCopyMultiTexSubImage2DEXT; +typedef void (APIENTRYP pfn_glGetMultiTexImageEXT) (GLenum, GLenum, GLint, GLenum, GLenum, void*); +extern pfn_glGetMultiTexImageEXT fp_glGetMultiTexImageEXT; +typedef void (APIENTRYP pfn_glGetMultiTexParameterfvEXT) (GLenum, GLenum, GLenum, GLfloat*); +extern pfn_glGetMultiTexParameterfvEXT fp_glGetMultiTexParameterfvEXT; +typedef void (APIENTRYP pfn_glGetMultiTexParameterivEXT) (GLenum, GLenum, GLenum, GLint*); +extern pfn_glGetMultiTexParameterivEXT fp_glGetMultiTexParameterivEXT; +typedef void (APIENTRYP pfn_glGetMultiTexLevelParameterfvEXT) (GLenum, GLenum, GLint, GLenum, GLfloat*); +extern pfn_glGetMultiTexLevelParameterfvEXT fp_glGetMultiTexLevelParameterfvEXT; +typedef void (APIENTRYP pfn_glGetMultiTexLevelParameterivEXT) (GLenum, GLenum, GLint, GLenum, GLint*); +extern pfn_glGetMultiTexLevelParameterivEXT fp_glGetMultiTexLevelParameterivEXT; +typedef void (APIENTRYP pfn_glMultiTexImage3DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glMultiTexImage3DEXT fp_glMultiTexImage3DEXT; +typedef void (APIENTRYP pfn_glMultiTexSubImage3DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glMultiTexSubImage3DEXT fp_glMultiTexSubImage3DEXT; +typedef void (APIENTRYP pfn_glCopyMultiTexSubImage3DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyMultiTexSubImage3DEXT fp_glCopyMultiTexSubImage3DEXT; +typedef void (APIENTRYP pfn_glEnableClientStateIndexedEXT) (GLenum, GLuint); +extern pfn_glEnableClientStateIndexedEXT fp_glEnableClientStateIndexedEXT; +typedef void (APIENTRYP pfn_glDisableClientStateIndexedEXT) (GLenum, GLuint); +extern pfn_glDisableClientStateIndexedEXT fp_glDisableClientStateIndexedEXT; +typedef void (APIENTRYP pfn_glGetFloatIndexedvEXT) (GLenum, GLuint, GLfloat*); +extern pfn_glGetFloatIndexedvEXT fp_glGetFloatIndexedvEXT; +typedef void (APIENTRYP pfn_glGetDoubleIndexedvEXT) (GLenum, GLuint, GLdouble*); +extern pfn_glGetDoubleIndexedvEXT fp_glGetDoubleIndexedvEXT; +typedef void (APIENTRYP pfn_glGetPointerIndexedvEXT) (GLenum, GLuint, void**); +extern pfn_glGetPointerIndexedvEXT fp_glGetPointerIndexedvEXT; +typedef void (APIENTRYP pfn_glEnableIndexedEXT) (GLenum, GLuint); +extern pfn_glEnableIndexedEXT fp_glEnableIndexedEXT; +typedef void (APIENTRYP pfn_glDisableIndexedEXT) (GLenum, GLuint); +extern pfn_glDisableIndexedEXT fp_glDisableIndexedEXT; +typedef GLboolean (APIENTRYP pfn_glIsEnabledIndexedEXT) (GLenum, GLuint); +extern pfn_glIsEnabledIndexedEXT fp_glIsEnabledIndexedEXT; +typedef void (APIENTRYP pfn_glGetIntegerIndexedvEXT) (GLenum, GLuint, GLint*); +extern pfn_glGetIntegerIndexedvEXT fp_glGetIntegerIndexedvEXT; +typedef void (APIENTRYP pfn_glGetBooleanIndexedvEXT) (GLenum, GLuint, GLboolean*); +extern pfn_glGetBooleanIndexedvEXT fp_glGetBooleanIndexedvEXT; +typedef void (APIENTRYP pfn_glCompressedTextureImage3DEXT) (GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTextureImage3DEXT fp_glCompressedTextureImage3DEXT; +typedef void (APIENTRYP pfn_glCompressedTextureImage2DEXT) (GLuint, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTextureImage2DEXT fp_glCompressedTextureImage2DEXT; +typedef void (APIENTRYP pfn_glCompressedTextureImage1DEXT) (GLuint, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTextureImage1DEXT fp_glCompressedTextureImage1DEXT; +typedef void (APIENTRYP pfn_glCompressedTextureSubImage3DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTextureSubImage3DEXT fp_glCompressedTextureSubImage3DEXT; +typedef void (APIENTRYP pfn_glCompressedTextureSubImage2DEXT) (GLuint, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTextureSubImage2DEXT fp_glCompressedTextureSubImage2DEXT; +typedef void (APIENTRYP pfn_glCompressedTextureSubImage1DEXT) (GLuint, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTextureSubImage1DEXT fp_glCompressedTextureSubImage1DEXT; +typedef void (APIENTRYP pfn_glGetCompressedTextureImageEXT) (GLuint, GLenum, GLint, void*); +extern pfn_glGetCompressedTextureImageEXT fp_glGetCompressedTextureImageEXT; +typedef void (APIENTRYP pfn_glCompressedMultiTexImage3DEXT) (GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedMultiTexImage3DEXT fp_glCompressedMultiTexImage3DEXT; +typedef void (APIENTRYP pfn_glCompressedMultiTexImage2DEXT) (GLenum, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedMultiTexImage2DEXT fp_glCompressedMultiTexImage2DEXT; +typedef void (APIENTRYP pfn_glCompressedMultiTexImage1DEXT) (GLenum, GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedMultiTexImage1DEXT fp_glCompressedMultiTexImage1DEXT; +typedef void (APIENTRYP pfn_glCompressedMultiTexSubImage3DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedMultiTexSubImage3DEXT fp_glCompressedMultiTexSubImage3DEXT; +typedef void (APIENTRYP pfn_glCompressedMultiTexSubImage2DEXT) (GLenum, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedMultiTexSubImage2DEXT fp_glCompressedMultiTexSubImage2DEXT; +typedef void (APIENTRYP pfn_glCompressedMultiTexSubImage1DEXT) (GLenum, GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedMultiTexSubImage1DEXT fp_glCompressedMultiTexSubImage1DEXT; +typedef void (APIENTRYP pfn_glGetCompressedMultiTexImageEXT) (GLenum, GLenum, GLint, void*); +extern pfn_glGetCompressedMultiTexImageEXT fp_glGetCompressedMultiTexImageEXT; +typedef void (APIENTRYP pfn_glMatrixLoadTransposefEXT) (GLenum, const GLfloat*); +extern pfn_glMatrixLoadTransposefEXT fp_glMatrixLoadTransposefEXT; +typedef void (APIENTRYP pfn_glMatrixLoadTransposedEXT) (GLenum, const GLdouble*); +extern pfn_glMatrixLoadTransposedEXT fp_glMatrixLoadTransposedEXT; +typedef void (APIENTRYP pfn_glMatrixMultTransposefEXT) (GLenum, const GLfloat*); +extern pfn_glMatrixMultTransposefEXT fp_glMatrixMultTransposefEXT; +typedef void (APIENTRYP pfn_glMatrixMultTransposedEXT) (GLenum, const GLdouble*); +extern pfn_glMatrixMultTransposedEXT fp_glMatrixMultTransposedEXT; +typedef void (APIENTRYP pfn_glNamedBufferDataEXT) (GLuint, GLsizeiptr, const void*, GLenum); +extern pfn_glNamedBufferDataEXT fp_glNamedBufferDataEXT; +typedef void (APIENTRYP pfn_glNamedBufferSubDataEXT) (GLuint, GLintptr, GLsizeiptr, const void*); +extern pfn_glNamedBufferSubDataEXT fp_glNamedBufferSubDataEXT; +typedef void* (APIENTRYP pfn_glMapNamedBufferEXT) (GLuint, GLenum); +extern pfn_glMapNamedBufferEXT fp_glMapNamedBufferEXT; +typedef GLboolean (APIENTRYP pfn_glUnmapNamedBufferEXT) (GLuint); +extern pfn_glUnmapNamedBufferEXT fp_glUnmapNamedBufferEXT; +typedef void (APIENTRYP pfn_glGetNamedBufferParameterivEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetNamedBufferParameterivEXT fp_glGetNamedBufferParameterivEXT; +typedef void (APIENTRYP pfn_glGetNamedBufferPointervEXT) (GLuint, GLenum, void**); +extern pfn_glGetNamedBufferPointervEXT fp_glGetNamedBufferPointervEXT; +typedef void (APIENTRYP pfn_glGetNamedBufferSubDataEXT) (GLuint, GLintptr, GLsizeiptr, void*); +extern pfn_glGetNamedBufferSubDataEXT fp_glGetNamedBufferSubDataEXT; +typedef void (APIENTRYP pfn_glProgramUniform1fEXT) (GLuint, GLint, GLfloat); +extern pfn_glProgramUniform1fEXT fp_glProgramUniform1fEXT; +typedef void (APIENTRYP pfn_glProgramUniform2fEXT) (GLuint, GLint, GLfloat, GLfloat); +extern pfn_glProgramUniform2fEXT fp_glProgramUniform2fEXT; +typedef void (APIENTRYP pfn_glProgramUniform3fEXT) (GLuint, GLint, GLfloat, GLfloat, GLfloat); +extern pfn_glProgramUniform3fEXT fp_glProgramUniform3fEXT; +typedef void (APIENTRYP pfn_glProgramUniform4fEXT) (GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glProgramUniform4fEXT fp_glProgramUniform4fEXT; +typedef void (APIENTRYP pfn_glProgramUniform1iEXT) (GLuint, GLint, GLint); +extern pfn_glProgramUniform1iEXT fp_glProgramUniform1iEXT; +typedef void (APIENTRYP pfn_glProgramUniform2iEXT) (GLuint, GLint, GLint, GLint); +extern pfn_glProgramUniform2iEXT fp_glProgramUniform2iEXT; +typedef void (APIENTRYP pfn_glProgramUniform3iEXT) (GLuint, GLint, GLint, GLint, GLint); +extern pfn_glProgramUniform3iEXT fp_glProgramUniform3iEXT; +typedef void (APIENTRYP pfn_glProgramUniform4iEXT) (GLuint, GLint, GLint, GLint, GLint, GLint); +extern pfn_glProgramUniform4iEXT fp_glProgramUniform4iEXT; +typedef void (APIENTRYP pfn_glProgramUniform1fvEXT) (GLuint, GLint, GLsizei, const GLfloat*); +extern pfn_glProgramUniform1fvEXT fp_glProgramUniform1fvEXT; +typedef void (APIENTRYP pfn_glProgramUniform2fvEXT) (GLuint, GLint, GLsizei, const GLfloat*); +extern pfn_glProgramUniform2fvEXT fp_glProgramUniform2fvEXT; +typedef void (APIENTRYP pfn_glProgramUniform3fvEXT) (GLuint, GLint, GLsizei, const GLfloat*); +extern pfn_glProgramUniform3fvEXT fp_glProgramUniform3fvEXT; +typedef void (APIENTRYP pfn_glProgramUniform4fvEXT) (GLuint, GLint, GLsizei, const GLfloat*); +extern pfn_glProgramUniform4fvEXT fp_glProgramUniform4fvEXT; +typedef void (APIENTRYP pfn_glProgramUniform1ivEXT) (GLuint, GLint, GLsizei, const GLint*); +extern pfn_glProgramUniform1ivEXT fp_glProgramUniform1ivEXT; +typedef void (APIENTRYP pfn_glProgramUniform2ivEXT) (GLuint, GLint, GLsizei, const GLint*); +extern pfn_glProgramUniform2ivEXT fp_glProgramUniform2ivEXT; +typedef void (APIENTRYP pfn_glProgramUniform3ivEXT) (GLuint, GLint, GLsizei, const GLint*); +extern pfn_glProgramUniform3ivEXT fp_glProgramUniform3ivEXT; +typedef void (APIENTRYP pfn_glProgramUniform4ivEXT) (GLuint, GLint, GLsizei, const GLint*); +extern pfn_glProgramUniform4ivEXT fp_glProgramUniform4ivEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix2fvEXT fp_glProgramUniformMatrix2fvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix3fvEXT fp_glProgramUniformMatrix3fvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix4fvEXT fp_glProgramUniformMatrix4fvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2x3fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix2x3fvEXT fp_glProgramUniformMatrix2x3fvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3x2fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix3x2fvEXT fp_glProgramUniformMatrix3x2fvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2x4fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix2x4fvEXT fp_glProgramUniformMatrix2x4fvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4x2fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix4x2fvEXT fp_glProgramUniformMatrix4x2fvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3x4fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix3x4fvEXT fp_glProgramUniformMatrix3x4fvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4x3fvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glProgramUniformMatrix4x3fvEXT fp_glProgramUniformMatrix4x3fvEXT; +typedef void (APIENTRYP pfn_glTextureBufferEXT) (GLuint, GLenum, GLenum, GLuint); +extern pfn_glTextureBufferEXT fp_glTextureBufferEXT; +typedef void (APIENTRYP pfn_glMultiTexBufferEXT) (GLenum, GLenum, GLenum, GLuint); +extern pfn_glMultiTexBufferEXT fp_glMultiTexBufferEXT; +typedef void (APIENTRYP pfn_glTextureParameterIivEXT) (GLuint, GLenum, GLenum, const GLint*); +extern pfn_glTextureParameterIivEXT fp_glTextureParameterIivEXT; +typedef void (APIENTRYP pfn_glTextureParameterIuivEXT) (GLuint, GLenum, GLenum, const GLuint*); +extern pfn_glTextureParameterIuivEXT fp_glTextureParameterIuivEXT; +typedef void (APIENTRYP pfn_glGetTextureParameterIivEXT) (GLuint, GLenum, GLenum, GLint*); +extern pfn_glGetTextureParameterIivEXT fp_glGetTextureParameterIivEXT; +typedef void (APIENTRYP pfn_glGetTextureParameterIuivEXT) (GLuint, GLenum, GLenum, GLuint*); +extern pfn_glGetTextureParameterIuivEXT fp_glGetTextureParameterIuivEXT; +typedef void (APIENTRYP pfn_glMultiTexParameterIivEXT) (GLenum, GLenum, GLenum, const GLint*); +extern pfn_glMultiTexParameterIivEXT fp_glMultiTexParameterIivEXT; +typedef void (APIENTRYP pfn_glMultiTexParameterIuivEXT) (GLenum, GLenum, GLenum, const GLuint*); +extern pfn_glMultiTexParameterIuivEXT fp_glMultiTexParameterIuivEXT; +typedef void (APIENTRYP pfn_glGetMultiTexParameterIivEXT) (GLenum, GLenum, GLenum, GLint*); +extern pfn_glGetMultiTexParameterIivEXT fp_glGetMultiTexParameterIivEXT; +typedef void (APIENTRYP pfn_glGetMultiTexParameterIuivEXT) (GLenum, GLenum, GLenum, GLuint*); +extern pfn_glGetMultiTexParameterIuivEXT fp_glGetMultiTexParameterIuivEXT; +typedef void (APIENTRYP pfn_glProgramUniform1uiEXT) (GLuint, GLint, GLuint); +extern pfn_glProgramUniform1uiEXT fp_glProgramUniform1uiEXT; +typedef void (APIENTRYP pfn_glProgramUniform2uiEXT) (GLuint, GLint, GLuint, GLuint); +extern pfn_glProgramUniform2uiEXT fp_glProgramUniform2uiEXT; +typedef void (APIENTRYP pfn_glProgramUniform3uiEXT) (GLuint, GLint, GLuint, GLuint, GLuint); +extern pfn_glProgramUniform3uiEXT fp_glProgramUniform3uiEXT; +typedef void (APIENTRYP pfn_glProgramUniform4uiEXT) (GLuint, GLint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glProgramUniform4uiEXT fp_glProgramUniform4uiEXT; +typedef void (APIENTRYP pfn_glProgramUniform1uivEXT) (GLuint, GLint, GLsizei, const GLuint*); +extern pfn_glProgramUniform1uivEXT fp_glProgramUniform1uivEXT; +typedef void (APIENTRYP pfn_glProgramUniform2uivEXT) (GLuint, GLint, GLsizei, const GLuint*); +extern pfn_glProgramUniform2uivEXT fp_glProgramUniform2uivEXT; +typedef void (APIENTRYP pfn_glProgramUniform3uivEXT) (GLuint, GLint, GLsizei, const GLuint*); +extern pfn_glProgramUniform3uivEXT fp_glProgramUniform3uivEXT; +typedef void (APIENTRYP pfn_glProgramUniform4uivEXT) (GLuint, GLint, GLsizei, const GLuint*); +extern pfn_glProgramUniform4uivEXT fp_glProgramUniform4uivEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameters4fvEXT) (GLuint, GLenum, GLuint, GLsizei, const GLfloat*); +extern pfn_glNamedProgramLocalParameters4fvEXT fp_glNamedProgramLocalParameters4fvEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameterI4iEXT) (GLuint, GLenum, GLuint, GLint, GLint, GLint, GLint); +extern pfn_glNamedProgramLocalParameterI4iEXT fp_glNamedProgramLocalParameterI4iEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameterI4ivEXT) (GLuint, GLenum, GLuint, const GLint*); +extern pfn_glNamedProgramLocalParameterI4ivEXT fp_glNamedProgramLocalParameterI4ivEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParametersI4ivEXT) (GLuint, GLenum, GLuint, GLsizei, const GLint*); +extern pfn_glNamedProgramLocalParametersI4ivEXT fp_glNamedProgramLocalParametersI4ivEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameterI4uiEXT) (GLuint, GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glNamedProgramLocalParameterI4uiEXT fp_glNamedProgramLocalParameterI4uiEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameterI4uivEXT) (GLuint, GLenum, GLuint, const GLuint*); +extern pfn_glNamedProgramLocalParameterI4uivEXT fp_glNamedProgramLocalParameterI4uivEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParametersI4uivEXT) (GLuint, GLenum, GLuint, GLsizei, const GLuint*); +extern pfn_glNamedProgramLocalParametersI4uivEXT fp_glNamedProgramLocalParametersI4uivEXT; +typedef void (APIENTRYP pfn_glGetNamedProgramLocalParameterIivEXT) (GLuint, GLenum, GLuint, GLint*); +extern pfn_glGetNamedProgramLocalParameterIivEXT fp_glGetNamedProgramLocalParameterIivEXT; +typedef void (APIENTRYP pfn_glGetNamedProgramLocalParameterIuivEXT) (GLuint, GLenum, GLuint, GLuint*); +extern pfn_glGetNamedProgramLocalParameterIuivEXT fp_glGetNamedProgramLocalParameterIuivEXT; +typedef void (APIENTRYP pfn_glEnableClientStateiEXT) (GLenum, GLuint); +extern pfn_glEnableClientStateiEXT fp_glEnableClientStateiEXT; +typedef void (APIENTRYP pfn_glDisableClientStateiEXT) (GLenum, GLuint); +extern pfn_glDisableClientStateiEXT fp_glDisableClientStateiEXT; +typedef void (APIENTRYP pfn_glGetFloati_vEXT) (GLenum, GLuint, GLfloat*); +extern pfn_glGetFloati_vEXT fp_glGetFloati_vEXT; +typedef void (APIENTRYP pfn_glGetDoublei_vEXT) (GLenum, GLuint, GLdouble*); +extern pfn_glGetDoublei_vEXT fp_glGetDoublei_vEXT; +typedef void (APIENTRYP pfn_glGetPointeri_vEXT) (GLenum, GLuint, void**); +extern pfn_glGetPointeri_vEXT fp_glGetPointeri_vEXT; +typedef void (APIENTRYP pfn_glNamedProgramStringEXT) (GLuint, GLenum, GLenum, GLsizei, const void*); +extern pfn_glNamedProgramStringEXT fp_glNamedProgramStringEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameter4dEXT) (GLuint, GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glNamedProgramLocalParameter4dEXT fp_glNamedProgramLocalParameter4dEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameter4dvEXT) (GLuint, GLenum, GLuint, const GLdouble*); +extern pfn_glNamedProgramLocalParameter4dvEXT fp_glNamedProgramLocalParameter4dvEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameter4fEXT) (GLuint, GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glNamedProgramLocalParameter4fEXT fp_glNamedProgramLocalParameter4fEXT; +typedef void (APIENTRYP pfn_glNamedProgramLocalParameter4fvEXT) (GLuint, GLenum, GLuint, const GLfloat*); +extern pfn_glNamedProgramLocalParameter4fvEXT fp_glNamedProgramLocalParameter4fvEXT; +typedef void (APIENTRYP pfn_glGetNamedProgramLocalParameterdvEXT) (GLuint, GLenum, GLuint, GLdouble*); +extern pfn_glGetNamedProgramLocalParameterdvEXT fp_glGetNamedProgramLocalParameterdvEXT; +typedef void (APIENTRYP pfn_glGetNamedProgramLocalParameterfvEXT) (GLuint, GLenum, GLuint, GLfloat*); +extern pfn_glGetNamedProgramLocalParameterfvEXT fp_glGetNamedProgramLocalParameterfvEXT; +typedef void (APIENTRYP pfn_glGetNamedProgramivEXT) (GLuint, GLenum, GLenum, GLint*); +extern pfn_glGetNamedProgramivEXT fp_glGetNamedProgramivEXT; +typedef void (APIENTRYP pfn_glGetNamedProgramStringEXT) (GLuint, GLenum, GLenum, void*); +extern pfn_glGetNamedProgramStringEXT fp_glGetNamedProgramStringEXT; +typedef void (APIENTRYP pfn_glNamedRenderbufferStorageEXT) (GLuint, GLenum, GLsizei, GLsizei); +extern pfn_glNamedRenderbufferStorageEXT fp_glNamedRenderbufferStorageEXT; +typedef void (APIENTRYP pfn_glGetNamedRenderbufferParameterivEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetNamedRenderbufferParameterivEXT fp_glGetNamedRenderbufferParameterivEXT; +typedef void (APIENTRYP pfn_glNamedRenderbufferStorageMultisampleEXT) (GLuint, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glNamedRenderbufferStorageMultisampleEXT fp_glNamedRenderbufferStorageMultisampleEXT; +typedef void (APIENTRYP pfn_glNamedRenderbufferStorageMultisampleCoverageEXT) (GLuint, GLsizei, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glNamedRenderbufferStorageMultisampleCoverageEXT fp_glNamedRenderbufferStorageMultisampleCoverageEXT; +typedef GLenum (APIENTRYP pfn_glCheckNamedFramebufferStatusEXT) (GLuint, GLenum); +extern pfn_glCheckNamedFramebufferStatusEXT fp_glCheckNamedFramebufferStatusEXT; +typedef void (APIENTRYP pfn_glNamedFramebufferTexture1DEXT) (GLuint, GLenum, GLenum, GLuint, GLint); +extern pfn_glNamedFramebufferTexture1DEXT fp_glNamedFramebufferTexture1DEXT; +typedef void (APIENTRYP pfn_glNamedFramebufferTexture2DEXT) (GLuint, GLenum, GLenum, GLuint, GLint); +extern pfn_glNamedFramebufferTexture2DEXT fp_glNamedFramebufferTexture2DEXT; +typedef void (APIENTRYP pfn_glNamedFramebufferTexture3DEXT) (GLuint, GLenum, GLenum, GLuint, GLint, GLint); +extern pfn_glNamedFramebufferTexture3DEXT fp_glNamedFramebufferTexture3DEXT; +typedef void (APIENTRYP pfn_glNamedFramebufferRenderbufferEXT) (GLuint, GLenum, GLenum, GLuint); +extern pfn_glNamedFramebufferRenderbufferEXT fp_glNamedFramebufferRenderbufferEXT; +typedef void (APIENTRYP pfn_glGetNamedFramebufferAttachmentParameterivEXT) (GLuint, GLenum, GLenum, GLint*); +extern pfn_glGetNamedFramebufferAttachmentParameterivEXT fp_glGetNamedFramebufferAttachmentParameterivEXT; +typedef void (APIENTRYP pfn_glGenerateTextureMipmapEXT) (GLuint, GLenum); +extern pfn_glGenerateTextureMipmapEXT fp_glGenerateTextureMipmapEXT; +typedef void (APIENTRYP pfn_glGenerateMultiTexMipmapEXT) (GLenum, GLenum); +extern pfn_glGenerateMultiTexMipmapEXT fp_glGenerateMultiTexMipmapEXT; +typedef void (APIENTRYP pfn_glFramebufferDrawBufferEXT) (GLuint, GLenum); +extern pfn_glFramebufferDrawBufferEXT fp_glFramebufferDrawBufferEXT; +typedef void (APIENTRYP pfn_glFramebufferDrawBuffersEXT) (GLuint, GLsizei, const GLenum*); +extern pfn_glFramebufferDrawBuffersEXT fp_glFramebufferDrawBuffersEXT; +typedef void (APIENTRYP pfn_glFramebufferReadBufferEXT) (GLuint, GLenum); +extern pfn_glFramebufferReadBufferEXT fp_glFramebufferReadBufferEXT; +typedef void (APIENTRYP pfn_glGetFramebufferParameterivEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetFramebufferParameterivEXT fp_glGetFramebufferParameterivEXT; +typedef void (APIENTRYP pfn_glNamedCopyBufferSubDataEXT) (GLuint, GLuint, GLintptr, GLintptr, GLsizeiptr); +extern pfn_glNamedCopyBufferSubDataEXT fp_glNamedCopyBufferSubDataEXT; +typedef void (APIENTRYP pfn_glNamedFramebufferTextureEXT) (GLuint, GLenum, GLuint, GLint); +extern pfn_glNamedFramebufferTextureEXT fp_glNamedFramebufferTextureEXT; +typedef void (APIENTRYP pfn_glNamedFramebufferTextureLayerEXT) (GLuint, GLenum, GLuint, GLint, GLint); +extern pfn_glNamedFramebufferTextureLayerEXT fp_glNamedFramebufferTextureLayerEXT; +typedef void (APIENTRYP pfn_glNamedFramebufferTextureFaceEXT) (GLuint, GLenum, GLuint, GLint, GLenum); +extern pfn_glNamedFramebufferTextureFaceEXT fp_glNamedFramebufferTextureFaceEXT; +typedef void (APIENTRYP pfn_glTextureRenderbufferEXT) (GLuint, GLenum, GLuint); +extern pfn_glTextureRenderbufferEXT fp_glTextureRenderbufferEXT; +typedef void (APIENTRYP pfn_glMultiTexRenderbufferEXT) (GLenum, GLenum, GLuint); +extern pfn_glMultiTexRenderbufferEXT fp_glMultiTexRenderbufferEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexOffsetEXT) (GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayVertexOffsetEXT fp_glVertexArrayVertexOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayColorOffsetEXT) (GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayColorOffsetEXT fp_glVertexArrayColorOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayEdgeFlagOffsetEXT) (GLuint, GLuint, GLsizei, GLintptr); +extern pfn_glVertexArrayEdgeFlagOffsetEXT fp_glVertexArrayEdgeFlagOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayIndexOffsetEXT) (GLuint, GLuint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayIndexOffsetEXT fp_glVertexArrayIndexOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayNormalOffsetEXT) (GLuint, GLuint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayNormalOffsetEXT fp_glVertexArrayNormalOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayTexCoordOffsetEXT) (GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayTexCoordOffsetEXT fp_glVertexArrayTexCoordOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayMultiTexCoordOffsetEXT) (GLuint, GLuint, GLenum, GLint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayMultiTexCoordOffsetEXT fp_glVertexArrayMultiTexCoordOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayFogCoordOffsetEXT) (GLuint, GLuint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayFogCoordOffsetEXT fp_glVertexArrayFogCoordOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArraySecondaryColorOffsetEXT) (GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArraySecondaryColorOffsetEXT fp_glVertexArraySecondaryColorOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexAttribOffsetEXT) (GLuint, GLuint, GLuint, GLint, GLenum, GLboolean, GLsizei, GLintptr); +extern pfn_glVertexArrayVertexAttribOffsetEXT fp_glVertexArrayVertexAttribOffsetEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexAttribIOffsetEXT) (GLuint, GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayVertexAttribIOffsetEXT fp_glVertexArrayVertexAttribIOffsetEXT; +typedef void (APIENTRYP pfn_glEnableVertexArrayEXT) (GLuint, GLenum); +extern pfn_glEnableVertexArrayEXT fp_glEnableVertexArrayEXT; +typedef void (APIENTRYP pfn_glDisableVertexArrayEXT) (GLuint, GLenum); +extern pfn_glDisableVertexArrayEXT fp_glDisableVertexArrayEXT; +typedef void (APIENTRYP pfn_glEnableVertexArrayAttribEXT) (GLuint, GLuint); +extern pfn_glEnableVertexArrayAttribEXT fp_glEnableVertexArrayAttribEXT; +typedef void (APIENTRYP pfn_glDisableVertexArrayAttribEXT) (GLuint, GLuint); +extern pfn_glDisableVertexArrayAttribEXT fp_glDisableVertexArrayAttribEXT; +typedef void (APIENTRYP pfn_glGetVertexArrayIntegervEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetVertexArrayIntegervEXT fp_glGetVertexArrayIntegervEXT; +typedef void (APIENTRYP pfn_glGetVertexArrayPointervEXT) (GLuint, GLenum, void**); +extern pfn_glGetVertexArrayPointervEXT fp_glGetVertexArrayPointervEXT; +typedef void (APIENTRYP pfn_glGetVertexArrayIntegeri_vEXT) (GLuint, GLuint, GLenum, GLint*); +extern pfn_glGetVertexArrayIntegeri_vEXT fp_glGetVertexArrayIntegeri_vEXT; +typedef void (APIENTRYP pfn_glGetVertexArrayPointeri_vEXT) (GLuint, GLuint, GLenum, void**); +extern pfn_glGetVertexArrayPointeri_vEXT fp_glGetVertexArrayPointeri_vEXT; +typedef void* (APIENTRYP pfn_glMapNamedBufferRangeEXT) (GLuint, GLintptr, GLsizeiptr, GLbitfield); +extern pfn_glMapNamedBufferRangeEXT fp_glMapNamedBufferRangeEXT; +typedef void (APIENTRYP pfn_glFlushMappedNamedBufferRangeEXT) (GLuint, GLintptr, GLsizeiptr); +extern pfn_glFlushMappedNamedBufferRangeEXT fp_glFlushMappedNamedBufferRangeEXT; +typedef void (APIENTRYP pfn_glNamedBufferStorageEXT) (GLuint, GLsizeiptr, const void*, GLbitfield); +extern pfn_glNamedBufferStorageEXT fp_glNamedBufferStorageEXT; +typedef void (APIENTRYP pfn_glClearNamedBufferDataEXT) (GLuint, GLenum, GLenum, GLenum, const void*); +extern pfn_glClearNamedBufferDataEXT fp_glClearNamedBufferDataEXT; +typedef void (APIENTRYP pfn_glClearNamedBufferSubDataEXT) (GLuint, GLenum, GLenum, GLenum, GLsizeiptr, GLsizeiptr, const void*); +extern pfn_glClearNamedBufferSubDataEXT fp_glClearNamedBufferSubDataEXT; +typedef void (APIENTRYP pfn_glNamedFramebufferParameteriEXT) (GLuint, GLenum, GLint); +extern pfn_glNamedFramebufferParameteriEXT fp_glNamedFramebufferParameteriEXT; +typedef void (APIENTRYP pfn_glGetNamedFramebufferParameterivEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetNamedFramebufferParameterivEXT fp_glGetNamedFramebufferParameterivEXT; +typedef void (APIENTRYP pfn_glProgramUniform1dEXT) (GLuint, GLint, GLdouble); +extern pfn_glProgramUniform1dEXT fp_glProgramUniform1dEXT; +typedef void (APIENTRYP pfn_glProgramUniform2dEXT) (GLuint, GLint, GLdouble, GLdouble); +extern pfn_glProgramUniform2dEXT fp_glProgramUniform2dEXT; +typedef void (APIENTRYP pfn_glProgramUniform3dEXT) (GLuint, GLint, GLdouble, GLdouble, GLdouble); +extern pfn_glProgramUniform3dEXT fp_glProgramUniform3dEXT; +typedef void (APIENTRYP pfn_glProgramUniform4dEXT) (GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glProgramUniform4dEXT fp_glProgramUniform4dEXT; +typedef void (APIENTRYP pfn_glProgramUniform1dvEXT) (GLuint, GLint, GLsizei, const GLdouble*); +extern pfn_glProgramUniform1dvEXT fp_glProgramUniform1dvEXT; +typedef void (APIENTRYP pfn_glProgramUniform2dvEXT) (GLuint, GLint, GLsizei, const GLdouble*); +extern pfn_glProgramUniform2dvEXT fp_glProgramUniform2dvEXT; +typedef void (APIENTRYP pfn_glProgramUniform3dvEXT) (GLuint, GLint, GLsizei, const GLdouble*); +extern pfn_glProgramUniform3dvEXT fp_glProgramUniform3dvEXT; +typedef void (APIENTRYP pfn_glProgramUniform4dvEXT) (GLuint, GLint, GLsizei, const GLdouble*); +extern pfn_glProgramUniform4dvEXT fp_glProgramUniform4dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix2dvEXT fp_glProgramUniformMatrix2dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix3dvEXT fp_glProgramUniformMatrix3dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix4dvEXT fp_glProgramUniformMatrix4dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2x3dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix2x3dvEXT fp_glProgramUniformMatrix2x3dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix2x4dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix2x4dvEXT fp_glProgramUniformMatrix2x4dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3x2dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix3x2dvEXT fp_glProgramUniformMatrix3x2dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix3x4dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix3x4dvEXT fp_glProgramUniformMatrix3x4dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4x2dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix4x2dvEXT fp_glProgramUniformMatrix4x2dvEXT; +typedef void (APIENTRYP pfn_glProgramUniformMatrix4x3dvEXT) (GLuint, GLint, GLsizei, GLboolean, const GLdouble*); +extern pfn_glProgramUniformMatrix4x3dvEXT fp_glProgramUniformMatrix4x3dvEXT; +typedef void (APIENTRYP pfn_glTextureBufferRangeEXT) (GLuint, GLenum, GLenum, GLuint, GLintptr, GLsizeiptr); +extern pfn_glTextureBufferRangeEXT fp_glTextureBufferRangeEXT; +typedef void (APIENTRYP pfn_glTextureStorage1DEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei); +extern pfn_glTextureStorage1DEXT fp_glTextureStorage1DEXT; +typedef void (APIENTRYP pfn_glTextureStorage2DEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glTextureStorage2DEXT fp_glTextureStorage2DEXT; +typedef void (APIENTRYP pfn_glTextureStorage3DEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); +extern pfn_glTextureStorage3DEXT fp_glTextureStorage3DEXT; +typedef void (APIENTRYP pfn_glTextureStorage2DMultisampleEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLboolean); +extern pfn_glTextureStorage2DMultisampleEXT fp_glTextureStorage2DMultisampleEXT; +typedef void (APIENTRYP pfn_glTextureStorage3DMultisampleEXT) (GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTextureStorage3DMultisampleEXT fp_glTextureStorage3DMultisampleEXT; +typedef void (APIENTRYP pfn_glVertexArrayBindVertexBufferEXT) (GLuint, GLuint, GLuint, GLintptr, GLsizei); +extern pfn_glVertexArrayBindVertexBufferEXT fp_glVertexArrayBindVertexBufferEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexAttribFormatEXT) (GLuint, GLuint, GLint, GLenum, GLboolean, GLuint); +extern pfn_glVertexArrayVertexAttribFormatEXT fp_glVertexArrayVertexAttribFormatEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexAttribIFormatEXT) (GLuint, GLuint, GLint, GLenum, GLuint); +extern pfn_glVertexArrayVertexAttribIFormatEXT fp_glVertexArrayVertexAttribIFormatEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexAttribLFormatEXT) (GLuint, GLuint, GLint, GLenum, GLuint); +extern pfn_glVertexArrayVertexAttribLFormatEXT fp_glVertexArrayVertexAttribLFormatEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexAttribBindingEXT) (GLuint, GLuint, GLuint); +extern pfn_glVertexArrayVertexAttribBindingEXT fp_glVertexArrayVertexAttribBindingEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexBindingDivisorEXT) (GLuint, GLuint, GLuint); +extern pfn_glVertexArrayVertexBindingDivisorEXT fp_glVertexArrayVertexBindingDivisorEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexAttribLOffsetEXT) (GLuint, GLuint, GLuint, GLint, GLenum, GLsizei, GLintptr); +extern pfn_glVertexArrayVertexAttribLOffsetEXT fp_glVertexArrayVertexAttribLOffsetEXT; +typedef void (APIENTRYP pfn_glTexturePageCommitmentEXT) (GLuint, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTexturePageCommitmentEXT fp_glTexturePageCommitmentEXT; +typedef void (APIENTRYP pfn_glVertexArrayVertexAttribDivisorEXT) (GLuint, GLuint, GLuint); +extern pfn_glVertexArrayVertexAttribDivisorEXT fp_glVertexArrayVertexAttribDivisorEXT; + + /* GL_EXT_discard_framebuffer */ +extern GLboolean GLAD_EXT_discard_framebuffer; +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 +typedef void (APIENTRYP pfn_glDiscardFramebufferEXT) (GLenum, GLsizei, const GLenum*); +extern pfn_glDiscardFramebufferEXT fp_glDiscardFramebufferEXT; + + /* GL_EXT_disjoint_timer_query */ +extern GLboolean GLAD_EXT_disjoint_timer_query; +#define GL_QUERY_COUNTER_BITS_EXT 0x8864 +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#define GL_TIME_ELAPSED_EXT 0x88BF +#define GL_TIMESTAMP_EXT 0x8E28 +#define GL_GPU_DISJOINT_EXT 0x8FBB +typedef void (APIENTRYP pfn_glGenQueriesEXT) (GLsizei, GLuint*); +extern pfn_glGenQueriesEXT fp_glGenQueriesEXT; +typedef void (APIENTRYP pfn_glDeleteQueriesEXT) (GLsizei, const GLuint*); +extern pfn_glDeleteQueriesEXT fp_glDeleteQueriesEXT; +typedef GLboolean (APIENTRYP pfn_glIsQueryEXT) (GLuint); +extern pfn_glIsQueryEXT fp_glIsQueryEXT; +typedef void (APIENTRYP pfn_glBeginQueryEXT) (GLenum, GLuint); +extern pfn_glBeginQueryEXT fp_glBeginQueryEXT; +typedef void (APIENTRYP pfn_glEndQueryEXT) (GLenum); +extern pfn_glEndQueryEXT fp_glEndQueryEXT; +typedef void (APIENTRYP pfn_glQueryCounterEXT) (GLuint, GLenum); +extern pfn_glQueryCounterEXT fp_glQueryCounterEXT; +typedef void (APIENTRYP pfn_glGetQueryivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetQueryivEXT fp_glGetQueryivEXT; +typedef void (APIENTRYP pfn_glGetQueryObjectivEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetQueryObjectivEXT fp_glGetQueryObjectivEXT; +typedef void (APIENTRYP pfn_glGetQueryObjectuivEXT) (GLuint, GLenum, GLuint*); +extern pfn_glGetQueryObjectuivEXT fp_glGetQueryObjectuivEXT; +typedef void (APIENTRYP pfn_glGetQueryObjecti64vEXT) (GLuint, GLenum, GLint64*); +extern pfn_glGetQueryObjecti64vEXT fp_glGetQueryObjecti64vEXT; +typedef void (APIENTRYP pfn_glGetQueryObjectui64vEXT) (GLuint, GLenum, GLuint64*); +extern pfn_glGetQueryObjectui64vEXT fp_glGetQueryObjectui64vEXT; + + /* GL_EXT_draw_buffers */ +extern GLboolean GLAD_EXT_draw_buffers; +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +typedef void (APIENTRYP pfn_glDrawBuffersEXT) (GLsizei, const GLenum*); +extern pfn_glDrawBuffersEXT fp_glDrawBuffersEXT; + + /* GL_EXT_draw_buffers2 */ +extern GLboolean GLAD_EXT_draw_buffers2; +typedef void (APIENTRYP pfn_glColorMaskIndexedEXT) (GLuint, GLboolean, GLboolean, GLboolean, GLboolean); +extern pfn_glColorMaskIndexedEXT fp_glColorMaskIndexedEXT; + + /* GL_EXT_draw_instanced */ +extern GLboolean GLAD_EXT_draw_instanced; +typedef void (APIENTRYP pfn_glDrawArraysInstancedEXT) (GLenum, GLint, GLsizei, GLsizei); +extern pfn_glDrawArraysInstancedEXT fp_glDrawArraysInstancedEXT; +typedef void (APIENTRYP pfn_glDrawElementsInstancedEXT) (GLenum, GLsizei, GLenum, const void*, GLsizei); +extern pfn_glDrawElementsInstancedEXT fp_glDrawElementsInstancedEXT; + + /* GL_EXT_fog_coord */ +extern GLboolean GLAD_EXT_fog_coord; +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +typedef void (APIENTRYP pfn_glFogCoordfEXT) (GLfloat); +extern pfn_glFogCoordfEXT fp_glFogCoordfEXT; +typedef void (APIENTRYP pfn_glFogCoordfvEXT) (const GLfloat*); +extern pfn_glFogCoordfvEXT fp_glFogCoordfvEXT; +typedef void (APIENTRYP pfn_glFogCoorddEXT) (GLdouble); +extern pfn_glFogCoorddEXT fp_glFogCoorddEXT; +typedef void (APIENTRYP pfn_glFogCoorddvEXT) (const GLdouble*); +extern pfn_glFogCoorddvEXT fp_glFogCoorddvEXT; +typedef void (APIENTRYP pfn_glFogCoordPointerEXT) (GLenum, GLsizei, const void*); +extern pfn_glFogCoordPointerEXT fp_glFogCoordPointerEXT; + + /* GL_EXT_framebuffer_blit */ +extern GLboolean GLAD_EXT_framebuffer_blit; +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +typedef void (APIENTRYP pfn_glBlitFramebufferEXT) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +extern pfn_glBlitFramebufferEXT fp_glBlitFramebufferEXT; + + /* GL_EXT_framebuffer_multisample */ +extern GLboolean GLAD_EXT_framebuffer_multisample; +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleEXT) (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorageMultisampleEXT fp_glRenderbufferStorageMultisampleEXT; + + /* GL_EXT_framebuffer_multisample_blit_scaled */ +extern GLboolean GLAD_EXT_framebuffer_multisample_blit_scaled; +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB + + /* GL_EXT_framebuffer_object */ +extern GLboolean GLAD_EXT_framebuffer_object; +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +typedef GLboolean (APIENTRYP pfn_glIsRenderbufferEXT) (GLuint); +extern pfn_glIsRenderbufferEXT fp_glIsRenderbufferEXT; +typedef void (APIENTRYP pfn_glBindRenderbufferEXT) (GLenum, GLuint); +extern pfn_glBindRenderbufferEXT fp_glBindRenderbufferEXT; +typedef void (APIENTRYP pfn_glDeleteRenderbuffersEXT) (GLsizei, const GLuint*); +extern pfn_glDeleteRenderbuffersEXT fp_glDeleteRenderbuffersEXT; +typedef void (APIENTRYP pfn_glGenRenderbuffersEXT) (GLsizei, GLuint*); +extern pfn_glGenRenderbuffersEXT fp_glGenRenderbuffersEXT; +typedef void (APIENTRYP pfn_glRenderbufferStorageEXT) (GLenum, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorageEXT fp_glRenderbufferStorageEXT; +typedef void (APIENTRYP pfn_glGetRenderbufferParameterivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetRenderbufferParameterivEXT fp_glGetRenderbufferParameterivEXT; +typedef GLboolean (APIENTRYP pfn_glIsFramebufferEXT) (GLuint); +extern pfn_glIsFramebufferEXT fp_glIsFramebufferEXT; +typedef void (APIENTRYP pfn_glBindFramebufferEXT) (GLenum, GLuint); +extern pfn_glBindFramebufferEXT fp_glBindFramebufferEXT; +typedef void (APIENTRYP pfn_glDeleteFramebuffersEXT) (GLsizei, const GLuint*); +extern pfn_glDeleteFramebuffersEXT fp_glDeleteFramebuffersEXT; +typedef void (APIENTRYP pfn_glGenFramebuffersEXT) (GLsizei, GLuint*); +extern pfn_glGenFramebuffersEXT fp_glGenFramebuffersEXT; +typedef GLenum (APIENTRYP pfn_glCheckFramebufferStatusEXT) (GLenum); +extern pfn_glCheckFramebufferStatusEXT fp_glCheckFramebufferStatusEXT; +typedef void (APIENTRYP pfn_glFramebufferTexture1DEXT) (GLenum, GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTexture1DEXT fp_glFramebufferTexture1DEXT; +typedef void (APIENTRYP pfn_glFramebufferTexture2DEXT) (GLenum, GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTexture2DEXT fp_glFramebufferTexture2DEXT; +typedef void (APIENTRYP pfn_glFramebufferTexture3DEXT) (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +extern pfn_glFramebufferTexture3DEXT fp_glFramebufferTexture3DEXT; +typedef void (APIENTRYP pfn_glFramebufferRenderbufferEXT) (GLenum, GLenum, GLenum, GLuint); +extern pfn_glFramebufferRenderbufferEXT fp_glFramebufferRenderbufferEXT; +typedef void (APIENTRYP pfn_glGetFramebufferAttachmentParameterivEXT) (GLenum, GLenum, GLenum, GLint*); +extern pfn_glGetFramebufferAttachmentParameterivEXT fp_glGetFramebufferAttachmentParameterivEXT; +typedef void (APIENTRYP pfn_glGenerateMipmapEXT) (GLenum); +extern pfn_glGenerateMipmapEXT fp_glGenerateMipmapEXT; + + /* GL_EXT_framebuffer_sRGB */ +extern GLboolean GLAD_EXT_framebuffer_sRGB; +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA + + /* GL_EXT_geometry_shader4 */ +extern GLboolean GLAD_EXT_geometry_shader4; +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +typedef void (APIENTRYP pfn_glProgramParameteriEXT) (GLuint, GLenum, GLint); +extern pfn_glProgramParameteriEXT fp_glProgramParameteriEXT; + + /* GL_EXT_gpu_program_parameters */ +extern GLboolean GLAD_EXT_gpu_program_parameters; +typedef void (APIENTRYP pfn_glProgramEnvParameters4fvEXT) (GLenum, GLuint, GLsizei, const GLfloat*); +extern pfn_glProgramEnvParameters4fvEXT fp_glProgramEnvParameters4fvEXT; +typedef void (APIENTRYP pfn_glProgramLocalParameters4fvEXT) (GLenum, GLuint, GLsizei, const GLfloat*); +extern pfn_glProgramLocalParameters4fvEXT fp_glProgramLocalParameters4fvEXT; + + /* GL_EXT_gpu_shader4 */ +extern GLboolean GLAD_EXT_gpu_shader4; +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +typedef void (APIENTRYP pfn_glGetUniformuivEXT) (GLuint, GLint, GLuint*); +extern pfn_glGetUniformuivEXT fp_glGetUniformuivEXT; +typedef void (APIENTRYP pfn_glBindFragDataLocationEXT) (GLuint, GLuint, const GLchar*); +extern pfn_glBindFragDataLocationEXT fp_glBindFragDataLocationEXT; +typedef GLint (APIENTRYP pfn_glGetFragDataLocationEXT) (GLuint, const GLchar*); +extern pfn_glGetFragDataLocationEXT fp_glGetFragDataLocationEXT; +typedef void (APIENTRYP pfn_glUniform1uiEXT) (GLint, GLuint); +extern pfn_glUniform1uiEXT fp_glUniform1uiEXT; +typedef void (APIENTRYP pfn_glUniform2uiEXT) (GLint, GLuint, GLuint); +extern pfn_glUniform2uiEXT fp_glUniform2uiEXT; +typedef void (APIENTRYP pfn_glUniform3uiEXT) (GLint, GLuint, GLuint, GLuint); +extern pfn_glUniform3uiEXT fp_glUniform3uiEXT; +typedef void (APIENTRYP pfn_glUniform4uiEXT) (GLint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glUniform4uiEXT fp_glUniform4uiEXT; +typedef void (APIENTRYP pfn_glUniform1uivEXT) (GLint, GLsizei, const GLuint*); +extern pfn_glUniform1uivEXT fp_glUniform1uivEXT; +typedef void (APIENTRYP pfn_glUniform2uivEXT) (GLint, GLsizei, const GLuint*); +extern pfn_glUniform2uivEXT fp_glUniform2uivEXT; +typedef void (APIENTRYP pfn_glUniform3uivEXT) (GLint, GLsizei, const GLuint*); +extern pfn_glUniform3uivEXT fp_glUniform3uivEXT; +typedef void (APIENTRYP pfn_glUniform4uivEXT) (GLint, GLsizei, const GLuint*); +extern pfn_glUniform4uivEXT fp_glUniform4uivEXT; + + /* GL_EXT_histogram */ +extern GLboolean GLAD_EXT_histogram; +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +typedef void (APIENTRYP pfn_glGetHistogramEXT) (GLenum, GLboolean, GLenum, GLenum, void*); +extern pfn_glGetHistogramEXT fp_glGetHistogramEXT; +typedef void (APIENTRYP pfn_glGetHistogramParameterfvEXT) (GLenum, GLenum, GLfloat*); +extern pfn_glGetHistogramParameterfvEXT fp_glGetHistogramParameterfvEXT; +typedef void (APIENTRYP pfn_glGetHistogramParameterivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetHistogramParameterivEXT fp_glGetHistogramParameterivEXT; +typedef void (APIENTRYP pfn_glGetMinmaxEXT) (GLenum, GLboolean, GLenum, GLenum, void*); +extern pfn_glGetMinmaxEXT fp_glGetMinmaxEXT; +typedef void (APIENTRYP pfn_glGetMinmaxParameterfvEXT) (GLenum, GLenum, GLfloat*); +extern pfn_glGetMinmaxParameterfvEXT fp_glGetMinmaxParameterfvEXT; +typedef void (APIENTRYP pfn_glGetMinmaxParameterivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetMinmaxParameterivEXT fp_glGetMinmaxParameterivEXT; +typedef void (APIENTRYP pfn_glHistogramEXT) (GLenum, GLsizei, GLenum, GLboolean); +extern pfn_glHistogramEXT fp_glHistogramEXT; +typedef void (APIENTRYP pfn_glMinmaxEXT) (GLenum, GLenum, GLboolean); +extern pfn_glMinmaxEXT fp_glMinmaxEXT; +typedef void (APIENTRYP pfn_glResetHistogramEXT) (GLenum); +extern pfn_glResetHistogramEXT fp_glResetHistogramEXT; +typedef void (APIENTRYP pfn_glResetMinmaxEXT) (GLenum); +extern pfn_glResetMinmaxEXT fp_glResetMinmaxEXT; + + /* GL_EXT_index_array_formats */ +extern GLboolean GLAD_EXT_index_array_formats; +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 + + /* GL_EXT_index_func */ +extern GLboolean GLAD_EXT_index_func; +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +typedef void (APIENTRYP pfn_glIndexFuncEXT) (GLenum, GLclampf); +extern pfn_glIndexFuncEXT fp_glIndexFuncEXT; + + /* GL_EXT_index_material */ +extern GLboolean GLAD_EXT_index_material; +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +typedef void (APIENTRYP pfn_glIndexMaterialEXT) (GLenum, GLenum); +extern pfn_glIndexMaterialEXT fp_glIndexMaterialEXT; + + /* GL_EXT_index_texture */ +extern GLboolean GLAD_EXT_index_texture; + + /* GL_EXT_instanced_arrays */ +extern GLboolean GLAD_EXT_instanced_arrays; +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE +typedef void (APIENTRYP pfn_glVertexAttribDivisorEXT) (GLuint, GLuint); +extern pfn_glVertexAttribDivisorEXT fp_glVertexAttribDivisorEXT; + + /* GL_EXT_light_texture */ +extern GLboolean GLAD_EXT_light_texture; +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +typedef void (APIENTRYP pfn_glApplyTextureEXT) (GLenum); +extern pfn_glApplyTextureEXT fp_glApplyTextureEXT; +typedef void (APIENTRYP pfn_glTextureLightEXT) (GLenum); +extern pfn_glTextureLightEXT fp_glTextureLightEXT; +typedef void (APIENTRYP pfn_glTextureMaterialEXT) (GLenum, GLenum); +extern pfn_glTextureMaterialEXT fp_glTextureMaterialEXT; + + /* GL_EXT_map_buffer_range */ +extern GLboolean GLAD_EXT_map_buffer_range; +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +typedef void* (APIENTRYP pfn_glMapBufferRangeEXT) (GLenum, GLintptr, GLsizeiptr, GLbitfield); +extern pfn_glMapBufferRangeEXT fp_glMapBufferRangeEXT; +typedef void (APIENTRYP pfn_glFlushMappedBufferRangeEXT) (GLenum, GLintptr, GLsizeiptr); +extern pfn_glFlushMappedBufferRangeEXT fp_glFlushMappedBufferRangeEXT; + + /* GL_EXT_misc_attribute */ +extern GLboolean GLAD_EXT_misc_attribute; + + /* GL_EXT_multi_draw_arrays */ +extern GLboolean GLAD_EXT_multi_draw_arrays; +typedef void (APIENTRYP pfn_glMultiDrawArraysEXT) (GLenum, const GLint*, const GLsizei*, GLsizei); +extern pfn_glMultiDrawArraysEXT fp_glMultiDrawArraysEXT; +typedef void (APIENTRYP pfn_glMultiDrawElementsEXT) (GLenum, const GLsizei*, GLenum, const void**, GLsizei); +extern pfn_glMultiDrawElementsEXT fp_glMultiDrawElementsEXT; + + /* GL_EXT_multisample */ +extern GLboolean GLAD_EXT_multisample; +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +typedef void (APIENTRYP pfn_glSampleMaskEXT) (GLclampf, GLboolean); +extern pfn_glSampleMaskEXT fp_glSampleMaskEXT; +typedef void (APIENTRYP pfn_glSamplePatternEXT) (GLenum); +extern pfn_glSamplePatternEXT fp_glSamplePatternEXT; + + /* GL_EXT_multisampled_render_to_texture */ +extern GLboolean GLAD_EXT_multisampled_render_to_texture; +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +typedef void (APIENTRYP pfn_glFramebufferTexture2DMultisampleEXT) (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); +extern pfn_glFramebufferTexture2DMultisampleEXT fp_glFramebufferTexture2DMultisampleEXT; + + /* GL_EXT_multiview_draw_buffers */ +extern GLboolean GLAD_EXT_multiview_draw_buffers; +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 +typedef void (APIENTRYP pfn_glReadBufferIndexedEXT) (GLenum, GLint); +extern pfn_glReadBufferIndexedEXT fp_glReadBufferIndexedEXT; +typedef void (APIENTRYP pfn_glDrawBuffersIndexedEXT) (GLint, const GLenum*, const GLint*); +extern pfn_glDrawBuffersIndexedEXT fp_glDrawBuffersIndexedEXT; +typedef void (APIENTRYP pfn_glGetIntegeri_vEXT) (GLenum, GLuint, GLint*); +extern pfn_glGetIntegeri_vEXT fp_glGetIntegeri_vEXT; + + /* GL_EXT_occlusion_query_boolean */ +extern GLboolean GLAD_EXT_occlusion_query_boolean; +#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A + + /* GL_EXT_packed_depth_stencil */ +extern GLboolean GLAD_EXT_packed_depth_stencil; +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 + + /* GL_EXT_packed_float */ +extern GLboolean GLAD_EXT_packed_float; +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C + + /* GL_EXT_paletted_texture */ +extern GLboolean GLAD_EXT_paletted_texture; +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +typedef void (APIENTRYP pfn_glColorTableEXT) (GLenum, GLenum, GLsizei, GLenum, GLenum, const void*); +extern pfn_glColorTableEXT fp_glColorTableEXT; +typedef void (APIENTRYP pfn_glGetColorTableEXT) (GLenum, GLenum, GLenum, void*); +extern pfn_glGetColorTableEXT fp_glGetColorTableEXT; +typedef void (APIENTRYP pfn_glGetColorTableParameterivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetColorTableParameterivEXT fp_glGetColorTableParameterivEXT; +typedef void (APIENTRYP pfn_glGetColorTableParameterfvEXT) (GLenum, GLenum, GLfloat*); +extern pfn_glGetColorTableParameterfvEXT fp_glGetColorTableParameterfvEXT; + + /* GL_EXT_pixel_buffer_object */ +extern GLboolean GLAD_EXT_pixel_buffer_object; +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF + + /* GL_EXT_pixel_transform */ +extern GLboolean GLAD_EXT_pixel_transform; +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +typedef void (APIENTRYP pfn_glPixelTransformParameteriEXT) (GLenum, GLenum, GLint); +extern pfn_glPixelTransformParameteriEXT fp_glPixelTransformParameteriEXT; +typedef void (APIENTRYP pfn_glPixelTransformParameterfEXT) (GLenum, GLenum, GLfloat); +extern pfn_glPixelTransformParameterfEXT fp_glPixelTransformParameterfEXT; +typedef void (APIENTRYP pfn_glPixelTransformParameterivEXT) (GLenum, GLenum, const GLint*); +extern pfn_glPixelTransformParameterivEXT fp_glPixelTransformParameterivEXT; +typedef void (APIENTRYP pfn_glPixelTransformParameterfvEXT) (GLenum, GLenum, const GLfloat*); +extern pfn_glPixelTransformParameterfvEXT fp_glPixelTransformParameterfvEXT; +typedef void (APIENTRYP pfn_glGetPixelTransformParameterivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetPixelTransformParameterivEXT fp_glGetPixelTransformParameterivEXT; +typedef void (APIENTRYP pfn_glGetPixelTransformParameterfvEXT) (GLenum, GLenum, GLfloat*); +extern pfn_glGetPixelTransformParameterfvEXT fp_glGetPixelTransformParameterfvEXT; + + /* GL_EXT_pixel_transform_color_table */ +extern GLboolean GLAD_EXT_pixel_transform_color_table; + + /* GL_EXT_point_parameters */ +extern GLboolean GLAD_EXT_point_parameters; +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +typedef void (APIENTRYP pfn_glPointParameterfEXT) (GLenum, GLfloat); +extern pfn_glPointParameterfEXT fp_glPointParameterfEXT; +typedef void (APIENTRYP pfn_glPointParameterfvEXT) (GLenum, const GLfloat*); +extern pfn_glPointParameterfvEXT fp_glPointParameterfvEXT; + + /* GL_EXT_provoking_vertex */ +extern GLboolean GLAD_EXT_provoking_vertex; +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +typedef void (APIENTRYP pfn_glProvokingVertexEXT) (GLenum); +extern pfn_glProvokingVertexEXT fp_glProvokingVertexEXT; + + /* GL_EXT_pvrtc_sRGB */ +extern GLboolean GLAD_EXT_pvrtc_sRGB; +#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 +#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 + + /* GL_EXT_read_format_bgra */ +extern GLboolean GLAD_EXT_read_format_bgra; +#define GL_BGRA_EXT 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 + + /* GL_EXT_robustness */ +extern GLboolean GLAD_EXT_robustness; +#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 +#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 +#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 +#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 +typedef GLenum (APIENTRYP pfn_glGetGraphicsResetStatusEXT) (); +extern pfn_glGetGraphicsResetStatusEXT fp_glGetGraphicsResetStatusEXT; +typedef void (APIENTRYP pfn_glReadnPixelsEXT) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLsizei, void*); +extern pfn_glReadnPixelsEXT fp_glReadnPixelsEXT; +typedef void (APIENTRYP pfn_glGetnUniformfvEXT) (GLuint, GLint, GLsizei, GLfloat*); +extern pfn_glGetnUniformfvEXT fp_glGetnUniformfvEXT; +typedef void (APIENTRYP pfn_glGetnUniformivEXT) (GLuint, GLint, GLsizei, GLint*); +extern pfn_glGetnUniformivEXT fp_glGetnUniformivEXT; + + /* GL_EXT_secondary_color */ +extern GLboolean GLAD_EXT_secondary_color; +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +typedef void (APIENTRYP pfn_glSecondaryColor3bEXT) (GLbyte, GLbyte, GLbyte); +extern pfn_glSecondaryColor3bEXT fp_glSecondaryColor3bEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3bvEXT) (const GLbyte*); +extern pfn_glSecondaryColor3bvEXT fp_glSecondaryColor3bvEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3dEXT) (GLdouble, GLdouble, GLdouble); +extern pfn_glSecondaryColor3dEXT fp_glSecondaryColor3dEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3dvEXT) (const GLdouble*); +extern pfn_glSecondaryColor3dvEXT fp_glSecondaryColor3dvEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3fEXT) (GLfloat, GLfloat, GLfloat); +extern pfn_glSecondaryColor3fEXT fp_glSecondaryColor3fEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3fvEXT) (const GLfloat*); +extern pfn_glSecondaryColor3fvEXT fp_glSecondaryColor3fvEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3iEXT) (GLint, GLint, GLint); +extern pfn_glSecondaryColor3iEXT fp_glSecondaryColor3iEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3ivEXT) (const GLint*); +extern pfn_glSecondaryColor3ivEXT fp_glSecondaryColor3ivEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3sEXT) (GLshort, GLshort, GLshort); +extern pfn_glSecondaryColor3sEXT fp_glSecondaryColor3sEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3svEXT) (const GLshort*); +extern pfn_glSecondaryColor3svEXT fp_glSecondaryColor3svEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3ubEXT) (GLubyte, GLubyte, GLubyte); +extern pfn_glSecondaryColor3ubEXT fp_glSecondaryColor3ubEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3ubvEXT) (const GLubyte*); +extern pfn_glSecondaryColor3ubvEXT fp_glSecondaryColor3ubvEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3uiEXT) (GLuint, GLuint, GLuint); +extern pfn_glSecondaryColor3uiEXT fp_glSecondaryColor3uiEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3uivEXT) (const GLuint*); +extern pfn_glSecondaryColor3uivEXT fp_glSecondaryColor3uivEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3usEXT) (GLushort, GLushort, GLushort); +extern pfn_glSecondaryColor3usEXT fp_glSecondaryColor3usEXT; +typedef void (APIENTRYP pfn_glSecondaryColor3usvEXT) (const GLushort*); +extern pfn_glSecondaryColor3usvEXT fp_glSecondaryColor3usvEXT; +typedef void (APIENTRYP pfn_glSecondaryColorPointerEXT) (GLint, GLenum, GLsizei, const void*); +extern pfn_glSecondaryColorPointerEXT fp_glSecondaryColorPointerEXT; + + /* GL_EXT_separate_shader_objects */ +extern GLboolean GLAD_EXT_separate_shader_objects; +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 +#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE_EXT 0x8258 +#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A +typedef void (APIENTRYP pfn_glUseShaderProgramEXT) (GLenum, GLuint); +extern pfn_glUseShaderProgramEXT fp_glUseShaderProgramEXT; +typedef void (APIENTRYP pfn_glActiveProgramEXT) (GLuint); +extern pfn_glActiveProgramEXT fp_glActiveProgramEXT; +typedef GLuint (APIENTRYP pfn_glCreateShaderProgramEXT) (GLenum, const GLchar*); +extern pfn_glCreateShaderProgramEXT fp_glCreateShaderProgramEXT; +typedef void (APIENTRYP pfn_glActiveShaderProgramEXT) (GLuint, GLuint); +extern pfn_glActiveShaderProgramEXT fp_glActiveShaderProgramEXT; +typedef void (APIENTRYP pfn_glBindProgramPipelineEXT) (GLuint); +extern pfn_glBindProgramPipelineEXT fp_glBindProgramPipelineEXT; +typedef GLuint (APIENTRYP pfn_glCreateShaderProgramvEXT) (GLenum, GLsizei, const GLchar**); +extern pfn_glCreateShaderProgramvEXT fp_glCreateShaderProgramvEXT; +typedef void (APIENTRYP pfn_glDeleteProgramPipelinesEXT) (GLsizei, const GLuint*); +extern pfn_glDeleteProgramPipelinesEXT fp_glDeleteProgramPipelinesEXT; +typedef void (APIENTRYP pfn_glGenProgramPipelinesEXT) (GLsizei, GLuint*); +extern pfn_glGenProgramPipelinesEXT fp_glGenProgramPipelinesEXT; +typedef void (APIENTRYP pfn_glGetProgramPipelineInfoLogEXT) (GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetProgramPipelineInfoLogEXT fp_glGetProgramPipelineInfoLogEXT; +typedef void (APIENTRYP pfn_glGetProgramPipelineivEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetProgramPipelineivEXT fp_glGetProgramPipelineivEXT; +typedef GLboolean (APIENTRYP pfn_glIsProgramPipelineEXT) (GLuint); +extern pfn_glIsProgramPipelineEXT fp_glIsProgramPipelineEXT; +typedef void (APIENTRYP pfn_glUseProgramStagesEXT) (GLuint, GLbitfield, GLuint); +extern pfn_glUseProgramStagesEXT fp_glUseProgramStagesEXT; +typedef void (APIENTRYP pfn_glValidateProgramPipelineEXT) (GLuint); +extern pfn_glValidateProgramPipelineEXT fp_glValidateProgramPipelineEXT; + + /* GL_EXT_shader_framebuffer_fetch */ +extern GLboolean GLAD_EXT_shader_framebuffer_fetch; +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 + + /* GL_EXT_shader_image_load_store */ +extern GLboolean GLAD_EXT_shader_image_load_store; +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +typedef void (APIENTRYP pfn_glBindImageTextureEXT) (GLuint, GLuint, GLint, GLboolean, GLint, GLenum, GLint); +extern pfn_glBindImageTextureEXT fp_glBindImageTextureEXT; +typedef void (APIENTRYP pfn_glMemoryBarrierEXT) (GLbitfield); +extern pfn_glMemoryBarrierEXT fp_glMemoryBarrierEXT; + + /* GL_EXT_shader_integer_mix */ +extern GLboolean GLAD_EXT_shader_integer_mix; + + /* GL_EXT_shader_texture_lod */ +extern GLboolean GLAD_EXT_shader_texture_lod; + + /* GL_EXT_shadow_funcs */ +extern GLboolean GLAD_EXT_shadow_funcs; + + /* GL_EXT_shadow_samplers */ +extern GLboolean GLAD_EXT_shadow_samplers; +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 + + /* GL_EXT_shared_texture_palette */ +extern GLboolean GLAD_EXT_shared_texture_palette; +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + + /* GL_EXT_sRGB */ +extern GLboolean GLAD_EXT_sRGB; +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 + + /* GL_EXT_sRGB_write_control */ +extern GLboolean GLAD_EXT_sRGB_write_control; + + /* GL_EXT_stencil_clear_tag */ +extern GLboolean GLAD_EXT_stencil_clear_tag; +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +typedef void (APIENTRYP pfn_glStencilClearTagEXT) (GLsizei, GLuint); +extern pfn_glStencilClearTagEXT fp_glStencilClearTagEXT; + + /* GL_EXT_stencil_two_side */ +extern GLboolean GLAD_EXT_stencil_two_side; +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +typedef void (APIENTRYP pfn_glActiveStencilFaceEXT) (GLenum); +extern pfn_glActiveStencilFaceEXT fp_glActiveStencilFaceEXT; + + /* GL_EXT_stencil_wrap */ +extern GLboolean GLAD_EXT_stencil_wrap; +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 + + /* GL_EXT_texture_array */ +extern GLboolean GLAD_EXT_texture_array; +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E + + /* GL_EXT_texture_buffer_object */ +extern GLboolean GLAD_EXT_texture_buffer_object; +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +typedef void (APIENTRYP pfn_glTexBufferEXT) (GLenum, GLenum, GLuint); +extern pfn_glTexBufferEXT fp_glTexBufferEXT; + + /* GL_EXT_texture_compression_dxt1 */ +extern GLboolean GLAD_EXT_texture_compression_dxt1; +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 + + /* GL_EXT_texture_compression_latc */ +extern GLboolean GLAD_EXT_texture_compression_latc; +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 + + /* GL_EXT_texture_compression_rgtc */ +extern GLboolean GLAD_EXT_texture_compression_rgtc; +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE + + /* GL_EXT_texture_compression_s3tc */ +extern GLboolean GLAD_EXT_texture_compression_s3tc; +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + + /* GL_EXT_texture_cube_map */ +extern GLboolean GLAD_EXT_texture_cube_map; +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C + + /* GL_EXT_texture_env_add */ +extern GLboolean GLAD_EXT_texture_env_add; + + /* GL_EXT_texture_env_combine */ +extern GLboolean GLAD_EXT_texture_env_combine; +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + + /* GL_EXT_texture_env_dot3 */ +extern GLboolean GLAD_EXT_texture_env_dot3; +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 + + /* GL_EXT_texture_filter_anisotropic */ +extern GLboolean GLAD_EXT_texture_filter_anisotropic; +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + + /* GL_EXT_texture_format_BGRA8888 */ +extern GLboolean GLAD_EXT_texture_format_BGRA8888; + + /* GL_EXT_texture_integer */ +extern GLboolean GLAD_EXT_texture_integer; +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +typedef void (APIENTRYP pfn_glTexParameterIivEXT) (GLenum, GLenum, const GLint*); +extern pfn_glTexParameterIivEXT fp_glTexParameterIivEXT; +typedef void (APIENTRYP pfn_glTexParameterIuivEXT) (GLenum, GLenum, const GLuint*); +extern pfn_glTexParameterIuivEXT fp_glTexParameterIuivEXT; +typedef void (APIENTRYP pfn_glGetTexParameterIivEXT) (GLenum, GLenum, GLint*); +extern pfn_glGetTexParameterIivEXT fp_glGetTexParameterIivEXT; +typedef void (APIENTRYP pfn_glGetTexParameterIuivEXT) (GLenum, GLenum, GLuint*); +extern pfn_glGetTexParameterIuivEXT fp_glGetTexParameterIuivEXT; +typedef void (APIENTRYP pfn_glClearColorIiEXT) (GLint, GLint, GLint, GLint); +extern pfn_glClearColorIiEXT fp_glClearColorIiEXT; +typedef void (APIENTRYP pfn_glClearColorIuiEXT) (GLuint, GLuint, GLuint, GLuint); +extern pfn_glClearColorIuiEXT fp_glClearColorIuiEXT; + + /* GL_EXT_texture_lod_bias */ +extern GLboolean GLAD_EXT_texture_lod_bias; +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 + + /* GL_EXT_texture_mirror_clamp */ +extern GLboolean GLAD_EXT_texture_mirror_clamp; +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 + + /* GL_EXT_texture_perturb_normal */ +extern GLboolean GLAD_EXT_texture_perturb_normal; +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +typedef void (APIENTRYP pfn_glTextureNormalEXT) (GLenum); +extern pfn_glTextureNormalEXT fp_glTextureNormalEXT; + + /* GL_EXT_texture_rg */ +extern GLboolean GLAD_EXT_texture_rg; +#define GL_RED_EXT 0x1903 +#define GL_RG_EXT 0x8227 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B + + /* GL_EXT_texture_shared_exponent */ +extern GLboolean GLAD_EXT_texture_shared_exponent; +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F + + /* GL_EXT_texture_snorm */ +extern GLboolean GLAD_EXT_texture_snorm; +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 + + /* GL_EXT_texture_sRGB */ +extern GLboolean GLAD_EXT_texture_sRGB; +#define GL_SRGB8_EXT 0x8C41 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + + /* GL_EXT_texture_sRGB_decode */ +extern GLboolean GLAD_EXT_texture_sRGB_decode; +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A + + /* GL_EXT_texture_storage */ +extern GLboolean GLAD_EXT_texture_storage; +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGB10_EXT 0x8052 +#define GL_BGRA8_EXT 0x93A1 +#define GL_R32F_EXT 0x822E +#define GL_RG32F_EXT 0x8230 +typedef void (APIENTRYP pfn_glTexStorage1DEXT) (GLenum, GLsizei, GLenum, GLsizei); +extern pfn_glTexStorage1DEXT fp_glTexStorage1DEXT; +typedef void (APIENTRYP pfn_glTexStorage2DEXT) (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glTexStorage2DEXT fp_glTexStorage2DEXT; +typedef void (APIENTRYP pfn_glTexStorage3DEXT) (GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei); +extern pfn_glTexStorage3DEXT fp_glTexStorage3DEXT; + + /* GL_EXT_texture_swizzle */ +extern GLboolean GLAD_EXT_texture_swizzle; +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 + + /* GL_EXT_texture_type_2_10_10_10_REV */ +extern GLboolean GLAD_EXT_texture_type_2_10_10_10_REV; +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 + + /* GL_EXT_timer_query */ +extern GLboolean GLAD_EXT_timer_query; + + /* GL_EXT_transform_feedback */ +extern GLboolean GLAD_EXT_transform_feedback; +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +typedef void (APIENTRYP pfn_glBeginTransformFeedbackEXT) (GLenum); +extern pfn_glBeginTransformFeedbackEXT fp_glBeginTransformFeedbackEXT; +typedef void (APIENTRYP pfn_glEndTransformFeedbackEXT) (); +extern pfn_glEndTransformFeedbackEXT fp_glEndTransformFeedbackEXT; +typedef void (APIENTRYP pfn_glBindBufferRangeEXT) (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr); +extern pfn_glBindBufferRangeEXT fp_glBindBufferRangeEXT; +typedef void (APIENTRYP pfn_glBindBufferOffsetEXT) (GLenum, GLuint, GLuint, GLintptr); +extern pfn_glBindBufferOffsetEXT fp_glBindBufferOffsetEXT; +typedef void (APIENTRYP pfn_glBindBufferBaseEXT) (GLenum, GLuint, GLuint); +extern pfn_glBindBufferBaseEXT fp_glBindBufferBaseEXT; +typedef void (APIENTRYP pfn_glTransformFeedbackVaryingsEXT) (GLuint, GLsizei, const GLchar**, GLenum); +extern pfn_glTransformFeedbackVaryingsEXT fp_glTransformFeedbackVaryingsEXT; +typedef void (APIENTRYP pfn_glGetTransformFeedbackVaryingEXT) (GLuint, GLuint, GLsizei, GLsizei*, GLsizei*, GLenum*, GLchar*); +extern pfn_glGetTransformFeedbackVaryingEXT fp_glGetTransformFeedbackVaryingEXT; + + /* GL_EXT_unpack_subimage */ +extern GLboolean GLAD_EXT_unpack_subimage; +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 + + /* GL_EXT_vertex_array_bgra */ +extern GLboolean GLAD_EXT_vertex_array_bgra; + + /* GL_EXT_vertex_attrib_64bit */ +extern GLboolean GLAD_EXT_vertex_attrib_64bit; +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +typedef void (APIENTRYP pfn_glVertexAttribL1dEXT) (GLuint, GLdouble); +extern pfn_glVertexAttribL1dEXT fp_glVertexAttribL1dEXT; +typedef void (APIENTRYP pfn_glVertexAttribL2dEXT) (GLuint, GLdouble, GLdouble); +extern pfn_glVertexAttribL2dEXT fp_glVertexAttribL2dEXT; +typedef void (APIENTRYP pfn_glVertexAttribL3dEXT) (GLuint, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttribL3dEXT fp_glVertexAttribL3dEXT; +typedef void (APIENTRYP pfn_glVertexAttribL4dEXT) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttribL4dEXT fp_glVertexAttribL4dEXT; +typedef void (APIENTRYP pfn_glVertexAttribL1dvEXT) (GLuint, const GLdouble*); +extern pfn_glVertexAttribL1dvEXT fp_glVertexAttribL1dvEXT; +typedef void (APIENTRYP pfn_glVertexAttribL2dvEXT) (GLuint, const GLdouble*); +extern pfn_glVertexAttribL2dvEXT fp_glVertexAttribL2dvEXT; +typedef void (APIENTRYP pfn_glVertexAttribL3dvEXT) (GLuint, const GLdouble*); +extern pfn_glVertexAttribL3dvEXT fp_glVertexAttribL3dvEXT; +typedef void (APIENTRYP pfn_glVertexAttribL4dvEXT) (GLuint, const GLdouble*); +extern pfn_glVertexAttribL4dvEXT fp_glVertexAttribL4dvEXT; +typedef void (APIENTRYP pfn_glVertexAttribLPointerEXT) (GLuint, GLint, GLenum, GLsizei, const void*); +extern pfn_glVertexAttribLPointerEXT fp_glVertexAttribLPointerEXT; +typedef void (APIENTRYP pfn_glGetVertexAttribLdvEXT) (GLuint, GLenum, GLdouble*); +extern pfn_glGetVertexAttribLdvEXT fp_glGetVertexAttribLdvEXT; + + /* GL_EXT_vertex_shader */ +extern GLboolean GLAD_EXT_vertex_shader; +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +typedef void (APIENTRYP pfn_glBeginVertexShaderEXT) (); +extern pfn_glBeginVertexShaderEXT fp_glBeginVertexShaderEXT; +typedef void (APIENTRYP pfn_glEndVertexShaderEXT) (); +extern pfn_glEndVertexShaderEXT fp_glEndVertexShaderEXT; +typedef void (APIENTRYP pfn_glBindVertexShaderEXT) (GLuint); +extern pfn_glBindVertexShaderEXT fp_glBindVertexShaderEXT; +typedef GLuint (APIENTRYP pfn_glGenVertexShadersEXT) (GLuint); +extern pfn_glGenVertexShadersEXT fp_glGenVertexShadersEXT; +typedef void (APIENTRYP pfn_glDeleteVertexShaderEXT) (GLuint); +extern pfn_glDeleteVertexShaderEXT fp_glDeleteVertexShaderEXT; +typedef void (APIENTRYP pfn_glShaderOp1EXT) (GLenum, GLuint, GLuint); +extern pfn_glShaderOp1EXT fp_glShaderOp1EXT; +typedef void (APIENTRYP pfn_glShaderOp2EXT) (GLenum, GLuint, GLuint, GLuint); +extern pfn_glShaderOp2EXT fp_glShaderOp2EXT; +typedef void (APIENTRYP pfn_glShaderOp3EXT) (GLenum, GLuint, GLuint, GLuint, GLuint); +extern pfn_glShaderOp3EXT fp_glShaderOp3EXT; +typedef void (APIENTRYP pfn_glSwizzleEXT) (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +extern pfn_glSwizzleEXT fp_glSwizzleEXT; +typedef void (APIENTRYP pfn_glWriteMaskEXT) (GLuint, GLuint, GLenum, GLenum, GLenum, GLenum); +extern pfn_glWriteMaskEXT fp_glWriteMaskEXT; +typedef void (APIENTRYP pfn_glInsertComponentEXT) (GLuint, GLuint, GLuint); +extern pfn_glInsertComponentEXT fp_glInsertComponentEXT; +typedef void (APIENTRYP pfn_glExtractComponentEXT) (GLuint, GLuint, GLuint); +extern pfn_glExtractComponentEXT fp_glExtractComponentEXT; +typedef GLuint (APIENTRYP pfn_glGenSymbolsEXT) (GLenum, GLenum, GLenum, GLuint); +extern pfn_glGenSymbolsEXT fp_glGenSymbolsEXT; +typedef void (APIENTRYP pfn_glSetInvariantEXT) (GLuint, GLenum, const void*); +extern pfn_glSetInvariantEXT fp_glSetInvariantEXT; +typedef void (APIENTRYP pfn_glSetLocalConstantEXT) (GLuint, GLenum, const void*); +extern pfn_glSetLocalConstantEXT fp_glSetLocalConstantEXT; +typedef void (APIENTRYP pfn_glVariantbvEXT) (GLuint, const GLbyte*); +extern pfn_glVariantbvEXT fp_glVariantbvEXT; +typedef void (APIENTRYP pfn_glVariantsvEXT) (GLuint, const GLshort*); +extern pfn_glVariantsvEXT fp_glVariantsvEXT; +typedef void (APIENTRYP pfn_glVariantivEXT) (GLuint, const GLint*); +extern pfn_glVariantivEXT fp_glVariantivEXT; +typedef void (APIENTRYP pfn_glVariantfvEXT) (GLuint, const GLfloat*); +extern pfn_glVariantfvEXT fp_glVariantfvEXT; +typedef void (APIENTRYP pfn_glVariantdvEXT) (GLuint, const GLdouble*); +extern pfn_glVariantdvEXT fp_glVariantdvEXT; +typedef void (APIENTRYP pfn_glVariantubvEXT) (GLuint, const GLubyte*); +extern pfn_glVariantubvEXT fp_glVariantubvEXT; +typedef void (APIENTRYP pfn_glVariantusvEXT) (GLuint, const GLushort*); +extern pfn_glVariantusvEXT fp_glVariantusvEXT; +typedef void (APIENTRYP pfn_glVariantuivEXT) (GLuint, const GLuint*); +extern pfn_glVariantuivEXT fp_glVariantuivEXT; +typedef void (APIENTRYP pfn_glVariantPointerEXT) (GLuint, GLenum, GLuint, const void*); +extern pfn_glVariantPointerEXT fp_glVariantPointerEXT; +typedef void (APIENTRYP pfn_glEnableVariantClientStateEXT) (GLuint); +extern pfn_glEnableVariantClientStateEXT fp_glEnableVariantClientStateEXT; +typedef void (APIENTRYP pfn_glDisableVariantClientStateEXT) (GLuint); +extern pfn_glDisableVariantClientStateEXT fp_glDisableVariantClientStateEXT; +typedef GLuint (APIENTRYP pfn_glBindLightParameterEXT) (GLenum, GLenum); +extern pfn_glBindLightParameterEXT fp_glBindLightParameterEXT; +typedef GLuint (APIENTRYP pfn_glBindMaterialParameterEXT) (GLenum, GLenum); +extern pfn_glBindMaterialParameterEXT fp_glBindMaterialParameterEXT; +typedef GLuint (APIENTRYP pfn_glBindTexGenParameterEXT) (GLenum, GLenum, GLenum); +extern pfn_glBindTexGenParameterEXT fp_glBindTexGenParameterEXT; +typedef GLuint (APIENTRYP pfn_glBindTextureUnitParameterEXT) (GLenum, GLenum); +extern pfn_glBindTextureUnitParameterEXT fp_glBindTextureUnitParameterEXT; +typedef GLuint (APIENTRYP pfn_glBindParameterEXT) (GLenum); +extern pfn_glBindParameterEXT fp_glBindParameterEXT; +typedef GLboolean (APIENTRYP pfn_glIsVariantEnabledEXT) (GLuint, GLenum); +extern pfn_glIsVariantEnabledEXT fp_glIsVariantEnabledEXT; +typedef void (APIENTRYP pfn_glGetVariantBooleanvEXT) (GLuint, GLenum, GLboolean*); +extern pfn_glGetVariantBooleanvEXT fp_glGetVariantBooleanvEXT; +typedef void (APIENTRYP pfn_glGetVariantIntegervEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetVariantIntegervEXT fp_glGetVariantIntegervEXT; +typedef void (APIENTRYP pfn_glGetVariantFloatvEXT) (GLuint, GLenum, GLfloat*); +extern pfn_glGetVariantFloatvEXT fp_glGetVariantFloatvEXT; +typedef void (APIENTRYP pfn_glGetVariantPointervEXT) (GLuint, GLenum, void**); +extern pfn_glGetVariantPointervEXT fp_glGetVariantPointervEXT; +typedef void (APIENTRYP pfn_glGetInvariantBooleanvEXT) (GLuint, GLenum, GLboolean*); +extern pfn_glGetInvariantBooleanvEXT fp_glGetInvariantBooleanvEXT; +typedef void (APIENTRYP pfn_glGetInvariantIntegervEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetInvariantIntegervEXT fp_glGetInvariantIntegervEXT; +typedef void (APIENTRYP pfn_glGetInvariantFloatvEXT) (GLuint, GLenum, GLfloat*); +extern pfn_glGetInvariantFloatvEXT fp_glGetInvariantFloatvEXT; +typedef void (APIENTRYP pfn_glGetLocalConstantBooleanvEXT) (GLuint, GLenum, GLboolean*); +extern pfn_glGetLocalConstantBooleanvEXT fp_glGetLocalConstantBooleanvEXT; +typedef void (APIENTRYP pfn_glGetLocalConstantIntegervEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetLocalConstantIntegervEXT fp_glGetLocalConstantIntegervEXT; +typedef void (APIENTRYP pfn_glGetLocalConstantFloatvEXT) (GLuint, GLenum, GLfloat*); +extern pfn_glGetLocalConstantFloatvEXT fp_glGetLocalConstantFloatvEXT; + + /* GL_EXT_vertex_weighting */ +extern GLboolean GLAD_EXT_vertex_weighting; +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +typedef void (APIENTRYP pfn_glVertexWeightfEXT) (GLfloat); +extern pfn_glVertexWeightfEXT fp_glVertexWeightfEXT; +typedef void (APIENTRYP pfn_glVertexWeightfvEXT) (const GLfloat*); +extern pfn_glVertexWeightfvEXT fp_glVertexWeightfvEXT; +typedef void (APIENTRYP pfn_glVertexWeightPointerEXT) (GLint, GLenum, GLsizei, const void*); +extern pfn_glVertexWeightPointerEXT fp_glVertexWeightPointerEXT; + + /* GL_EXT_x11_sync_object */ +extern GLboolean GLAD_EXT_x11_sync_object; +#define GL_SYNC_X11_FENCE_EXT 0x90E1 +typedef GLsync (APIENTRYP pfn_glImportSyncEXT) (GLenum, GLintptr, GLbitfield); +extern pfn_glImportSyncEXT fp_glImportSyncEXT; + + /* GL_OES_byte_coordinates */ +extern GLboolean GLAD_OES_byte_coordinates; +typedef void (APIENTRYP pfn_glMultiTexCoord1bOES) (GLenum, GLbyte); +extern pfn_glMultiTexCoord1bOES fp_glMultiTexCoord1bOES; +typedef void (APIENTRYP pfn_glMultiTexCoord1bvOES) (GLenum, const GLbyte*); +extern pfn_glMultiTexCoord1bvOES fp_glMultiTexCoord1bvOES; +typedef void (APIENTRYP pfn_glMultiTexCoord2bOES) (GLenum, GLbyte, GLbyte); +extern pfn_glMultiTexCoord2bOES fp_glMultiTexCoord2bOES; +typedef void (APIENTRYP pfn_glMultiTexCoord2bvOES) (GLenum, const GLbyte*); +extern pfn_glMultiTexCoord2bvOES fp_glMultiTexCoord2bvOES; +typedef void (APIENTRYP pfn_glMultiTexCoord3bOES) (GLenum, GLbyte, GLbyte, GLbyte); +extern pfn_glMultiTexCoord3bOES fp_glMultiTexCoord3bOES; +typedef void (APIENTRYP pfn_glMultiTexCoord3bvOES) (GLenum, const GLbyte*); +extern pfn_glMultiTexCoord3bvOES fp_glMultiTexCoord3bvOES; +typedef void (APIENTRYP pfn_glMultiTexCoord4bOES) (GLenum, GLbyte, GLbyte, GLbyte, GLbyte); +extern pfn_glMultiTexCoord4bOES fp_glMultiTexCoord4bOES; +typedef void (APIENTRYP pfn_glMultiTexCoord4bvOES) (GLenum, const GLbyte*); +extern pfn_glMultiTexCoord4bvOES fp_glMultiTexCoord4bvOES; +typedef void (APIENTRYP pfn_glTexCoord1bOES) (GLbyte); +extern pfn_glTexCoord1bOES fp_glTexCoord1bOES; +typedef void (APIENTRYP pfn_glTexCoord1bvOES) (const GLbyte*); +extern pfn_glTexCoord1bvOES fp_glTexCoord1bvOES; +typedef void (APIENTRYP pfn_glTexCoord2bOES) (GLbyte, GLbyte); +extern pfn_glTexCoord2bOES fp_glTexCoord2bOES; +typedef void (APIENTRYP pfn_glTexCoord2bvOES) (const GLbyte*); +extern pfn_glTexCoord2bvOES fp_glTexCoord2bvOES; +typedef void (APIENTRYP pfn_glTexCoord3bOES) (GLbyte, GLbyte, GLbyte); +extern pfn_glTexCoord3bOES fp_glTexCoord3bOES; +typedef void (APIENTRYP pfn_glTexCoord3bvOES) (const GLbyte*); +extern pfn_glTexCoord3bvOES fp_glTexCoord3bvOES; +typedef void (APIENTRYP pfn_glTexCoord4bOES) (GLbyte, GLbyte, GLbyte, GLbyte); +extern pfn_glTexCoord4bOES fp_glTexCoord4bOES; +typedef void (APIENTRYP pfn_glTexCoord4bvOES) (const GLbyte*); +extern pfn_glTexCoord4bvOES fp_glTexCoord4bvOES; +typedef void (APIENTRYP pfn_glVertex2bOES) (GLbyte); +extern pfn_glVertex2bOES fp_glVertex2bOES; +typedef void (APIENTRYP pfn_glVertex2bvOES) (const GLbyte*); +extern pfn_glVertex2bvOES fp_glVertex2bvOES; +typedef void (APIENTRYP pfn_glVertex3bOES) (GLbyte, GLbyte); +extern pfn_glVertex3bOES fp_glVertex3bOES; +typedef void (APIENTRYP pfn_glVertex3bvOES) (const GLbyte*); +extern pfn_glVertex3bvOES fp_glVertex3bvOES; +typedef void (APIENTRYP pfn_glVertex4bOES) (GLbyte, GLbyte, GLbyte); +extern pfn_glVertex4bOES fp_glVertex4bOES; +typedef void (APIENTRYP pfn_glVertex4bvOES) (const GLbyte*); +extern pfn_glVertex4bvOES fp_glVertex4bvOES; + + /* GL_OES_compressed_ETC1_RGB8_texture */ +extern GLboolean GLAD_OES_compressed_ETC1_RGB8_texture; +#define GL_ETC1_RGB8_OES 0x8D64 + + /* GL_OES_compressed_paletted_texture */ +extern GLboolean GLAD_OES_compressed_paletted_texture; +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 + + /* GL_OES_depth24 */ +extern GLboolean GLAD_OES_depth24; +#define GL_DEPTH_COMPONENT24_OES 0x81A6 + + /* GL_OES_depth32 */ +extern GLboolean GLAD_OES_depth32; +#define GL_DEPTH_COMPONENT32_OES 0x81A7 + + /* GL_OES_depth_texture */ +extern GLboolean GLAD_OES_depth_texture; + + /* GL_OES_EGL_image */ +extern GLboolean GLAD_OES_EGL_image; +typedef void (APIENTRYP pfn_glEGLImageTargetTexture2DOES) (GLenum, GLeglImageOES); +extern pfn_glEGLImageTargetTexture2DOES fp_glEGLImageTargetTexture2DOES; +typedef void (APIENTRYP pfn_glEGLImageTargetRenderbufferStorageOES) (GLenum, GLeglImageOES); +extern pfn_glEGLImageTargetRenderbufferStorageOES fp_glEGLImageTargetRenderbufferStorageOES; + + /* GL_OES_EGL_image_external */ +extern GLboolean GLAD_OES_EGL_image_external; +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 + + /* GL_OES_element_index_uint */ +extern GLboolean GLAD_OES_element_index_uint; + + /* GL_OES_fbo_render_mipmap */ +extern GLboolean GLAD_OES_fbo_render_mipmap; + + /* GL_OES_fixed_point */ +extern GLboolean GLAD_OES_fixed_point; +#define GL_FIXED_OES 0x140C +typedef void (APIENTRYP pfn_glAlphaFuncxOES) (GLenum, GLfixed); +extern pfn_glAlphaFuncxOES fp_glAlphaFuncxOES; +typedef void (APIENTRYP pfn_glClearColorxOES) (GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glClearColorxOES fp_glClearColorxOES; +typedef void (APIENTRYP pfn_glClearDepthxOES) (GLfixed); +extern pfn_glClearDepthxOES fp_glClearDepthxOES; +typedef void (APIENTRYP pfn_glClipPlanexOES) (GLenum, const GLfixed*); +extern pfn_glClipPlanexOES fp_glClipPlanexOES; +typedef void (APIENTRYP pfn_glColor4xOES) (GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glColor4xOES fp_glColor4xOES; +typedef void (APIENTRYP pfn_glDepthRangexOES) (GLfixed, GLfixed); +extern pfn_glDepthRangexOES fp_glDepthRangexOES; +typedef void (APIENTRYP pfn_glFogxOES) (GLenum, GLfixed); +extern pfn_glFogxOES fp_glFogxOES; +typedef void (APIENTRYP pfn_glFogxvOES) (GLenum, const GLfixed*); +extern pfn_glFogxvOES fp_glFogxvOES; +typedef void (APIENTRYP pfn_glFrustumxOES) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glFrustumxOES fp_glFrustumxOES; +typedef void (APIENTRYP pfn_glGetClipPlanexOES) (GLenum, GLfixed*); +extern pfn_glGetClipPlanexOES fp_glGetClipPlanexOES; +typedef void (APIENTRYP pfn_glGetFixedvOES) (GLenum, GLfixed*); +extern pfn_glGetFixedvOES fp_glGetFixedvOES; +typedef void (APIENTRYP pfn_glGetTexEnvxvOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetTexEnvxvOES fp_glGetTexEnvxvOES; +typedef void (APIENTRYP pfn_glGetTexParameterxvOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetTexParameterxvOES fp_glGetTexParameterxvOES; +typedef void (APIENTRYP pfn_glLightModelxOES) (GLenum, GLfixed); +extern pfn_glLightModelxOES fp_glLightModelxOES; +typedef void (APIENTRYP pfn_glLightModelxvOES) (GLenum, const GLfixed*); +extern pfn_glLightModelxvOES fp_glLightModelxvOES; +typedef void (APIENTRYP pfn_glLightxOES) (GLenum, GLenum, GLfixed); +extern pfn_glLightxOES fp_glLightxOES; +typedef void (APIENTRYP pfn_glLightxvOES) (GLenum, GLenum, const GLfixed*); +extern pfn_glLightxvOES fp_glLightxvOES; +typedef void (APIENTRYP pfn_glLineWidthxOES) (GLfixed); +extern pfn_glLineWidthxOES fp_glLineWidthxOES; +typedef void (APIENTRYP pfn_glLoadMatrixxOES) (const GLfixed*); +extern pfn_glLoadMatrixxOES fp_glLoadMatrixxOES; +typedef void (APIENTRYP pfn_glMaterialxOES) (GLenum, GLenum, GLfixed); +extern pfn_glMaterialxOES fp_glMaterialxOES; +typedef void (APIENTRYP pfn_glMaterialxvOES) (GLenum, GLenum, const GLfixed*); +extern pfn_glMaterialxvOES fp_glMaterialxvOES; +typedef void (APIENTRYP pfn_glMultMatrixxOES) (const GLfixed*); +extern pfn_glMultMatrixxOES fp_glMultMatrixxOES; +typedef void (APIENTRYP pfn_glMultiTexCoord4xOES) (GLenum, GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glMultiTexCoord4xOES fp_glMultiTexCoord4xOES; +typedef void (APIENTRYP pfn_glNormal3xOES) (GLfixed, GLfixed, GLfixed); +extern pfn_glNormal3xOES fp_glNormal3xOES; +typedef void (APIENTRYP pfn_glOrthoxOES) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glOrthoxOES fp_glOrthoxOES; +typedef void (APIENTRYP pfn_glPointParameterxvOES) (GLenum, const GLfixed*); +extern pfn_glPointParameterxvOES fp_glPointParameterxvOES; +typedef void (APIENTRYP pfn_glPointSizexOES) (GLfixed); +extern pfn_glPointSizexOES fp_glPointSizexOES; +typedef void (APIENTRYP pfn_glPolygonOffsetxOES) (GLfixed, GLfixed); +extern pfn_glPolygonOffsetxOES fp_glPolygonOffsetxOES; +typedef void (APIENTRYP pfn_glRotatexOES) (GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glRotatexOES fp_glRotatexOES; +typedef void (APIENTRYP pfn_glSampleCoverageOES) (GLfixed, GLboolean); +extern pfn_glSampleCoverageOES fp_glSampleCoverageOES; +typedef void (APIENTRYP pfn_glScalexOES) (GLfixed, GLfixed, GLfixed); +extern pfn_glScalexOES fp_glScalexOES; +typedef void (APIENTRYP pfn_glTexEnvxOES) (GLenum, GLenum, GLfixed); +extern pfn_glTexEnvxOES fp_glTexEnvxOES; +typedef void (APIENTRYP pfn_glTexEnvxvOES) (GLenum, GLenum, const GLfixed*); +extern pfn_glTexEnvxvOES fp_glTexEnvxvOES; +typedef void (APIENTRYP pfn_glTexParameterxOES) (GLenum, GLenum, GLfixed); +extern pfn_glTexParameterxOES fp_glTexParameterxOES; +typedef void (APIENTRYP pfn_glTexParameterxvOES) (GLenum, GLenum, const GLfixed*); +extern pfn_glTexParameterxvOES fp_glTexParameterxvOES; +typedef void (APIENTRYP pfn_glTranslatexOES) (GLfixed, GLfixed, GLfixed); +extern pfn_glTranslatexOES fp_glTranslatexOES; +typedef void (APIENTRYP pfn_glGetLightxvOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetLightxvOES fp_glGetLightxvOES; +typedef void (APIENTRYP pfn_glGetMaterialxvOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetMaterialxvOES fp_glGetMaterialxvOES; +typedef void (APIENTRYP pfn_glPointParameterxOES) (GLenum, GLfixed); +extern pfn_glPointParameterxOES fp_glPointParameterxOES; +typedef void (APIENTRYP pfn_glSampleCoveragexOES) (GLclampx, GLboolean); +extern pfn_glSampleCoveragexOES fp_glSampleCoveragexOES; +typedef void (APIENTRYP pfn_glAccumxOES) (GLenum, GLfixed); +extern pfn_glAccumxOES fp_glAccumxOES; +typedef void (APIENTRYP pfn_glBitmapxOES) (GLsizei, GLsizei, GLfixed, GLfixed, GLfixed, GLfixed, const GLubyte*); +extern pfn_glBitmapxOES fp_glBitmapxOES; +typedef void (APIENTRYP pfn_glBlendColorxOES) (GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glBlendColorxOES fp_glBlendColorxOES; +typedef void (APIENTRYP pfn_glClearAccumxOES) (GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glClearAccumxOES fp_glClearAccumxOES; +typedef void (APIENTRYP pfn_glColor3xOES) (GLfixed, GLfixed, GLfixed); +extern pfn_glColor3xOES fp_glColor3xOES; +typedef void (APIENTRYP pfn_glColor3xvOES) (const GLfixed*); +extern pfn_glColor3xvOES fp_glColor3xvOES; +typedef void (APIENTRYP pfn_glColor4xvOES) (const GLfixed*); +extern pfn_glColor4xvOES fp_glColor4xvOES; +typedef void (APIENTRYP pfn_glConvolutionParameterxOES) (GLenum, GLenum, GLfixed); +extern pfn_glConvolutionParameterxOES fp_glConvolutionParameterxOES; +typedef void (APIENTRYP pfn_glConvolutionParameterxvOES) (GLenum, GLenum, const GLfixed*); +extern pfn_glConvolutionParameterxvOES fp_glConvolutionParameterxvOES; +typedef void (APIENTRYP pfn_glEvalCoord1xOES) (GLfixed); +extern pfn_glEvalCoord1xOES fp_glEvalCoord1xOES; +typedef void (APIENTRYP pfn_glEvalCoord1xvOES) (const GLfixed*); +extern pfn_glEvalCoord1xvOES fp_glEvalCoord1xvOES; +typedef void (APIENTRYP pfn_glEvalCoord2xOES) (GLfixed, GLfixed); +extern pfn_glEvalCoord2xOES fp_glEvalCoord2xOES; +typedef void (APIENTRYP pfn_glEvalCoord2xvOES) (const GLfixed*); +extern pfn_glEvalCoord2xvOES fp_glEvalCoord2xvOES; +typedef void (APIENTRYP pfn_glFeedbackBufferxOES) (GLsizei, GLenum, const GLfixed*); +extern pfn_glFeedbackBufferxOES fp_glFeedbackBufferxOES; +typedef void (APIENTRYP pfn_glGetConvolutionParameterxvOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetConvolutionParameterxvOES fp_glGetConvolutionParameterxvOES; +typedef void (APIENTRYP pfn_glGetHistogramParameterxvOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetHistogramParameterxvOES fp_glGetHistogramParameterxvOES; +typedef void (APIENTRYP pfn_glGetLightxOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetLightxOES fp_glGetLightxOES; +typedef void (APIENTRYP pfn_glGetMapxvOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetMapxvOES fp_glGetMapxvOES; +typedef void (APIENTRYP pfn_glGetMaterialxOES) (GLenum, GLenum, GLfixed); +extern pfn_glGetMaterialxOES fp_glGetMaterialxOES; +typedef void (APIENTRYP pfn_glGetPixelMapxv) (GLenum, GLint, GLfixed*); +extern pfn_glGetPixelMapxv fp_glGetPixelMapxv; +typedef void (APIENTRYP pfn_glGetTexGenxvOES) (GLenum, GLenum, GLfixed*); +extern pfn_glGetTexGenxvOES fp_glGetTexGenxvOES; +typedef void (APIENTRYP pfn_glGetTexLevelParameterxvOES) (GLenum, GLint, GLenum, GLfixed*); +extern pfn_glGetTexLevelParameterxvOES fp_glGetTexLevelParameterxvOES; +typedef void (APIENTRYP pfn_glIndexxOES) (GLfixed); +extern pfn_glIndexxOES fp_glIndexxOES; +typedef void (APIENTRYP pfn_glIndexxvOES) (const GLfixed*); +extern pfn_glIndexxvOES fp_glIndexxvOES; +typedef void (APIENTRYP pfn_glLoadTransposeMatrixxOES) (const GLfixed*); +extern pfn_glLoadTransposeMatrixxOES fp_glLoadTransposeMatrixxOES; +typedef void (APIENTRYP pfn_glMap1xOES) (GLenum, GLfixed, GLfixed, GLint, GLint, GLfixed); +extern pfn_glMap1xOES fp_glMap1xOES; +typedef void (APIENTRYP pfn_glMap2xOES) (GLenum, GLfixed, GLfixed, GLint, GLint, GLfixed, GLfixed, GLint, GLint, GLfixed); +extern pfn_glMap2xOES fp_glMap2xOES; +typedef void (APIENTRYP pfn_glMapGrid1xOES) (GLint, GLfixed, GLfixed); +extern pfn_glMapGrid1xOES fp_glMapGrid1xOES; +typedef void (APIENTRYP pfn_glMapGrid2xOES) (GLint, GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glMapGrid2xOES fp_glMapGrid2xOES; +typedef void (APIENTRYP pfn_glMultTransposeMatrixxOES) (const GLfixed*); +extern pfn_glMultTransposeMatrixxOES fp_glMultTransposeMatrixxOES; +typedef void (APIENTRYP pfn_glMultiTexCoord1xOES) (GLenum, GLfixed); +extern pfn_glMultiTexCoord1xOES fp_glMultiTexCoord1xOES; +typedef void (APIENTRYP pfn_glMultiTexCoord1xvOES) (GLenum, const GLfixed*); +extern pfn_glMultiTexCoord1xvOES fp_glMultiTexCoord1xvOES; +typedef void (APIENTRYP pfn_glMultiTexCoord2xOES) (GLenum, GLfixed, GLfixed); +extern pfn_glMultiTexCoord2xOES fp_glMultiTexCoord2xOES; +typedef void (APIENTRYP pfn_glMultiTexCoord2xvOES) (GLenum, const GLfixed*); +extern pfn_glMultiTexCoord2xvOES fp_glMultiTexCoord2xvOES; +typedef void (APIENTRYP pfn_glMultiTexCoord3xOES) (GLenum, GLfixed, GLfixed, GLfixed); +extern pfn_glMultiTexCoord3xOES fp_glMultiTexCoord3xOES; +typedef void (APIENTRYP pfn_glMultiTexCoord3xvOES) (GLenum, const GLfixed*); +extern pfn_glMultiTexCoord3xvOES fp_glMultiTexCoord3xvOES; +typedef void (APIENTRYP pfn_glMultiTexCoord4xvOES) (GLenum, const GLfixed*); +extern pfn_glMultiTexCoord4xvOES fp_glMultiTexCoord4xvOES; +typedef void (APIENTRYP pfn_glNormal3xvOES) (const GLfixed*); +extern pfn_glNormal3xvOES fp_glNormal3xvOES; +typedef void (APIENTRYP pfn_glPassThroughxOES) (GLfixed); +extern pfn_glPassThroughxOES fp_glPassThroughxOES; +typedef void (APIENTRYP pfn_glPixelMapx) (GLenum, GLint, const GLfixed*); +extern pfn_glPixelMapx fp_glPixelMapx; +typedef void (APIENTRYP pfn_glPixelStorex) (GLenum, GLfixed); +extern pfn_glPixelStorex fp_glPixelStorex; +typedef void (APIENTRYP pfn_glPixelTransferxOES) (GLenum, GLfixed); +extern pfn_glPixelTransferxOES fp_glPixelTransferxOES; +typedef void (APIENTRYP pfn_glPixelZoomxOES) (GLfixed, GLfixed); +extern pfn_glPixelZoomxOES fp_glPixelZoomxOES; +typedef void (APIENTRYP pfn_glPrioritizeTexturesxOES) (GLsizei, const GLuint*, const GLfixed*); +extern pfn_glPrioritizeTexturesxOES fp_glPrioritizeTexturesxOES; +typedef void (APIENTRYP pfn_glRasterPos2xOES) (GLfixed, GLfixed); +extern pfn_glRasterPos2xOES fp_glRasterPos2xOES; +typedef void (APIENTRYP pfn_glRasterPos2xvOES) (const GLfixed*); +extern pfn_glRasterPos2xvOES fp_glRasterPos2xvOES; +typedef void (APIENTRYP pfn_glRasterPos3xOES) (GLfixed, GLfixed, GLfixed); +extern pfn_glRasterPos3xOES fp_glRasterPos3xOES; +typedef void (APIENTRYP pfn_glRasterPos3xvOES) (const GLfixed*); +extern pfn_glRasterPos3xvOES fp_glRasterPos3xvOES; +typedef void (APIENTRYP pfn_glRasterPos4xOES) (GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glRasterPos4xOES fp_glRasterPos4xOES; +typedef void (APIENTRYP pfn_glRasterPos4xvOES) (const GLfixed*); +extern pfn_glRasterPos4xvOES fp_glRasterPos4xvOES; +typedef void (APIENTRYP pfn_glRectxOES) (GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glRectxOES fp_glRectxOES; +typedef void (APIENTRYP pfn_glRectxvOES) (const GLfixed*, const GLfixed*); +extern pfn_glRectxvOES fp_glRectxvOES; +typedef void (APIENTRYP pfn_glTexCoord1xOES) (GLfixed); +extern pfn_glTexCoord1xOES fp_glTexCoord1xOES; +typedef void (APIENTRYP pfn_glTexCoord1xvOES) (const GLfixed*); +extern pfn_glTexCoord1xvOES fp_glTexCoord1xvOES; +typedef void (APIENTRYP pfn_glTexCoord2xOES) (GLfixed, GLfixed); +extern pfn_glTexCoord2xOES fp_glTexCoord2xOES; +typedef void (APIENTRYP pfn_glTexCoord2xvOES) (const GLfixed*); +extern pfn_glTexCoord2xvOES fp_glTexCoord2xvOES; +typedef void (APIENTRYP pfn_glTexCoord3xOES) (GLfixed, GLfixed, GLfixed); +extern pfn_glTexCoord3xOES fp_glTexCoord3xOES; +typedef void (APIENTRYP pfn_glTexCoord3xvOES) (const GLfixed*); +extern pfn_glTexCoord3xvOES fp_glTexCoord3xvOES; +typedef void (APIENTRYP pfn_glTexCoord4xOES) (GLfixed, GLfixed, GLfixed, GLfixed); +extern pfn_glTexCoord4xOES fp_glTexCoord4xOES; +typedef void (APIENTRYP pfn_glTexCoord4xvOES) (const GLfixed*); +extern pfn_glTexCoord4xvOES fp_glTexCoord4xvOES; +typedef void (APIENTRYP pfn_glTexGenxOES) (GLenum, GLenum, GLfixed); +extern pfn_glTexGenxOES fp_glTexGenxOES; +typedef void (APIENTRYP pfn_glTexGenxvOES) (GLenum, GLenum, const GLfixed*); +extern pfn_glTexGenxvOES fp_glTexGenxvOES; +typedef void (APIENTRYP pfn_glVertex2xOES) (GLfixed); +extern pfn_glVertex2xOES fp_glVertex2xOES; +typedef void (APIENTRYP pfn_glVertex2xvOES) (const GLfixed*); +extern pfn_glVertex2xvOES fp_glVertex2xvOES; +typedef void (APIENTRYP pfn_glVertex3xOES) (GLfixed, GLfixed); +extern pfn_glVertex3xOES fp_glVertex3xOES; +typedef void (APIENTRYP pfn_glVertex3xvOES) (const GLfixed*); +extern pfn_glVertex3xvOES fp_glVertex3xvOES; +typedef void (APIENTRYP pfn_glVertex4xOES) (GLfixed, GLfixed, GLfixed); +extern pfn_glVertex4xOES fp_glVertex4xOES; +typedef void (APIENTRYP pfn_glVertex4xvOES) (const GLfixed*); +extern pfn_glVertex4xvOES fp_glVertex4xvOES; + + /* GL_OES_fragment_precision_high */ +extern GLboolean GLAD_OES_fragment_precision_high; + + /* GL_OES_get_program_binary */ +extern GLboolean GLAD_OES_get_program_binary; +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE +#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF +typedef void (APIENTRYP pfn_glGetProgramBinaryOES) (GLuint, GLsizei, GLsizei*, GLenum*, void*); +extern pfn_glGetProgramBinaryOES fp_glGetProgramBinaryOES; +typedef void (APIENTRYP pfn_glProgramBinaryOES) (GLuint, GLenum, const void*, GLint); +extern pfn_glProgramBinaryOES fp_glProgramBinaryOES; + + /* GL_OES_mapbuffer */ +extern GLboolean GLAD_OES_mapbuffer; +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +typedef void* (APIENTRYP pfn_glMapBufferOES) (GLenum, GLenum); +extern pfn_glMapBufferOES fp_glMapBufferOES; +typedef GLboolean (APIENTRYP pfn_glUnmapBufferOES) (GLenum); +extern pfn_glUnmapBufferOES fp_glUnmapBufferOES; +typedef void (APIENTRYP pfn_glGetBufferPointervOES) (GLenum, GLenum, void**); +extern pfn_glGetBufferPointervOES fp_glGetBufferPointervOES; + + /* GL_OES_packed_depth_stencil */ +extern GLboolean GLAD_OES_packed_depth_stencil; +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH24_STENCIL8_OES 0x88F0 + + /* GL_OES_query_matrix */ +extern GLboolean GLAD_OES_query_matrix; +typedef GLbitfield (APIENTRYP pfn_glQueryMatrixxOES) (GLfixed*, GLint*); +extern pfn_glQueryMatrixxOES fp_glQueryMatrixxOES; + + /* GL_OES_read_format */ +extern GLboolean GLAD_OES_read_format; +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B + + /* GL_OES_required_internalformat */ +extern GLboolean GLAD_OES_required_internalformat; +#define GL_ALPHA8_OES 0x803C +#define GL_DEPTH_COMPONENT16_OES 0x81A5 +#define GL_LUMINANCE4_ALPHA4_OES 0x8043 +#define GL_LUMINANCE8_ALPHA8_OES 0x8045 +#define GL_LUMINANCE8_OES 0x8040 +#define GL_RGBA4_OES 0x8056 +#define GL_RGB5_A1_OES 0x8057 +#define GL_RGB565_OES 0x8D62 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 + + /* GL_OES_rgb8_rgba8 */ +extern GLboolean GLAD_OES_rgb8_rgba8; + + /* GL_OES_single_precision */ +extern GLboolean GLAD_OES_single_precision; +typedef void (APIENTRYP pfn_glClearDepthfOES) (GLclampf); +extern pfn_glClearDepthfOES fp_glClearDepthfOES; +typedef void (APIENTRYP pfn_glClipPlanefOES) (GLenum, const GLfloat*); +extern pfn_glClipPlanefOES fp_glClipPlanefOES; +typedef void (APIENTRYP pfn_glDepthRangefOES) (GLclampf, GLclampf); +extern pfn_glDepthRangefOES fp_glDepthRangefOES; +typedef void (APIENTRYP pfn_glFrustumfOES) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glFrustumfOES fp_glFrustumfOES; +typedef void (APIENTRYP pfn_glGetClipPlanefOES) (GLenum, GLfloat*); +extern pfn_glGetClipPlanefOES fp_glGetClipPlanefOES; +typedef void (APIENTRYP pfn_glOrthofOES) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glOrthofOES fp_glOrthofOES; + + /* GL_OES_standard_derivatives */ +extern GLboolean GLAD_OES_standard_derivatives; +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B + + /* GL_OES_stencil1 */ +extern GLboolean GLAD_OES_stencil1; +#define GL_STENCIL_INDEX1_OES 0x8D46 + + /* GL_OES_stencil4 */ +extern GLboolean GLAD_OES_stencil4; +#define GL_STENCIL_INDEX4_OES 0x8D47 + + /* GL_OES_surfaceless_context */ +extern GLboolean GLAD_OES_surfaceless_context; +#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 + + /* GL_OES_texture_3D */ +extern GLboolean GLAD_OES_texture_3D; +#define GL_TEXTURE_WRAP_R_OES 0x8072 +#define GL_TEXTURE_3D_OES 0x806F +#define GL_TEXTURE_BINDING_3D_OES 0x806A +#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 +#define GL_SAMPLER_3D_OES 0x8B5F +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 +typedef void (APIENTRYP pfn_glTexImage3DOES) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void*); +extern pfn_glTexImage3DOES fp_glTexImage3DOES; +typedef void (APIENTRYP pfn_glTexSubImage3DOES) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void*); +extern pfn_glTexSubImage3DOES fp_glTexSubImage3DOES; +typedef void (APIENTRYP pfn_glCopyTexSubImage3DOES) (GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei); +extern pfn_glCopyTexSubImage3DOES fp_glCopyTexSubImage3DOES; +typedef void (APIENTRYP pfn_glCompressedTexImage3DOES) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void*); +extern pfn_glCompressedTexImage3DOES fp_glCompressedTexImage3DOES; +typedef void (APIENTRYP pfn_glCompressedTexSubImage3DOES) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void*); +extern pfn_glCompressedTexSubImage3DOES fp_glCompressedTexSubImage3DOES; +typedef void (APIENTRYP pfn_glFramebufferTexture3DOES) (GLenum, GLenum, GLenum, GLuint, GLint, GLint); +extern pfn_glFramebufferTexture3DOES fp_glFramebufferTexture3DOES; + + /* GL_OES_texture_compression_astc */ +extern GLboolean GLAD_OES_texture_compression_astc; + + /* GL_OES_texture_float */ +extern GLboolean GLAD_OES_texture_float; + + /* GL_OES_texture_float_linear */ +extern GLboolean GLAD_OES_texture_float_linear; + + /* GL_OES_texture_half_float */ +extern GLboolean GLAD_OES_texture_half_float; +#define GL_HALF_FLOAT_OES 0x8D61 + + /* GL_OES_texture_half_float_linear */ +extern GLboolean GLAD_OES_texture_half_float_linear; + + /* GL_OES_texture_npot */ +extern GLboolean GLAD_OES_texture_npot; + + /* GL_OES_vertex_array_object */ +extern GLboolean GLAD_OES_vertex_array_object; +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 +typedef void (APIENTRYP pfn_glBindVertexArrayOES) (GLuint); +extern pfn_glBindVertexArrayOES fp_glBindVertexArrayOES; +typedef void (APIENTRYP pfn_glDeleteVertexArraysOES) (GLsizei, const GLuint*); +extern pfn_glDeleteVertexArraysOES fp_glDeleteVertexArraysOES; +typedef void (APIENTRYP pfn_glGenVertexArraysOES) (GLsizei, GLuint*); +extern pfn_glGenVertexArraysOES fp_glGenVertexArraysOES; +typedef GLboolean (APIENTRYP pfn_glIsVertexArrayOES) (GLuint); +extern pfn_glIsVertexArrayOES fp_glIsVertexArrayOES; + + /* GL_OES_vertex_half_float */ +extern GLboolean GLAD_OES_vertex_half_float; + + /* GL_OES_vertex_type_10_10_10_2 */ +extern GLboolean GLAD_OES_vertex_type_10_10_10_2; +#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 +#define GL_INT_10_10_10_2_OES 0x8DF7 + + /* GL_AMD_blend_minmax_factor */ +extern GLboolean GLAD_AMD_blend_minmax_factor; +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D + + /* GL_AMD_compressed_3DC_texture */ +extern GLboolean GLAD_AMD_compressed_3DC_texture; +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA + + /* GL_AMD_compressed_ATC_texture */ +extern GLboolean GLAD_AMD_compressed_ATC_texture; +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE + + /* GL_AMD_conservative_depth */ +extern GLboolean GLAD_AMD_conservative_depth; + + /* GL_AMD_debug_output */ +extern GLboolean GLAD_AMD_debug_output; +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +typedef void (APIENTRYP pfn_glDebugMessageEnableAMD) (GLenum, GLenum, GLsizei, const GLuint*, GLboolean); +extern pfn_glDebugMessageEnableAMD fp_glDebugMessageEnableAMD; +typedef void (APIENTRYP pfn_glDebugMessageInsertAMD) (GLenum, GLenum, GLuint, GLsizei, const GLchar*); +extern pfn_glDebugMessageInsertAMD fp_glDebugMessageInsertAMD; +typedef void (APIENTRYP pfn_glDebugMessageCallbackAMD) (GLDEBUGPROCAMD, void*); +extern pfn_glDebugMessageCallbackAMD fp_glDebugMessageCallbackAMD; +typedef GLuint (APIENTRYP pfn_glGetDebugMessageLogAMD) (GLuint, GLsizei, GLenum*, GLuint*, GLuint*, GLsizei*, GLchar*); +extern pfn_glGetDebugMessageLogAMD fp_glGetDebugMessageLogAMD; + + /* GL_AMD_depth_clamp_separate */ +extern GLboolean GLAD_AMD_depth_clamp_separate; +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F + + /* GL_AMD_draw_buffers_blend */ +extern GLboolean GLAD_AMD_draw_buffers_blend; +typedef void (APIENTRYP pfn_glBlendFuncIndexedAMD) (GLuint, GLenum, GLenum); +extern pfn_glBlendFuncIndexedAMD fp_glBlendFuncIndexedAMD; +typedef void (APIENTRYP pfn_glBlendFuncSeparateIndexedAMD) (GLuint, GLenum, GLenum, GLenum, GLenum); +extern pfn_glBlendFuncSeparateIndexedAMD fp_glBlendFuncSeparateIndexedAMD; +typedef void (APIENTRYP pfn_glBlendEquationIndexedAMD) (GLuint, GLenum); +extern pfn_glBlendEquationIndexedAMD fp_glBlendEquationIndexedAMD; +typedef void (APIENTRYP pfn_glBlendEquationSeparateIndexedAMD) (GLuint, GLenum, GLenum); +extern pfn_glBlendEquationSeparateIndexedAMD fp_glBlendEquationSeparateIndexedAMD; + + /* GL_AMD_interleaved_elements */ +extern GLboolean GLAD_AMD_interleaved_elements; +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 +typedef void (APIENTRYP pfn_glVertexAttribParameteriAMD) (GLuint, GLenum, GLint); +extern pfn_glVertexAttribParameteriAMD fp_glVertexAttribParameteriAMD; + + /* GL_AMD_multi_draw_indirect */ +extern GLboolean GLAD_AMD_multi_draw_indirect; +typedef void (APIENTRYP pfn_glMultiDrawArraysIndirectAMD) (GLenum, const void*, GLsizei, GLsizei); +extern pfn_glMultiDrawArraysIndirectAMD fp_glMultiDrawArraysIndirectAMD; +typedef void (APIENTRYP pfn_glMultiDrawElementsIndirectAMD) (GLenum, GLenum, const void*, GLsizei, GLsizei); +extern pfn_glMultiDrawElementsIndirectAMD fp_glMultiDrawElementsIndirectAMD; + + /* GL_AMD_name_gen_delete */ +extern GLboolean GLAD_AMD_name_gen_delete; +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +typedef void (APIENTRYP pfn_glGenNamesAMD) (GLenum, GLuint, GLuint*); +extern pfn_glGenNamesAMD fp_glGenNamesAMD; +typedef void (APIENTRYP pfn_glDeleteNamesAMD) (GLenum, GLuint, const GLuint*); +extern pfn_glDeleteNamesAMD fp_glDeleteNamesAMD; +typedef GLboolean (APIENTRYP pfn_glIsNameAMD) (GLenum, GLuint); +extern pfn_glIsNameAMD fp_glIsNameAMD; + + /* GL_AMD_performance_monitor */ +extern GLboolean GLAD_AMD_performance_monitor; +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (APIENTRYP pfn_glGetPerfMonitorGroupsAMD) (GLint*, GLsizei, GLuint*); +extern pfn_glGetPerfMonitorGroupsAMD fp_glGetPerfMonitorGroupsAMD; +typedef void (APIENTRYP pfn_glGetPerfMonitorCountersAMD) (GLuint, GLint*, GLint*, GLsizei, GLuint*); +extern pfn_glGetPerfMonitorCountersAMD fp_glGetPerfMonitorCountersAMD; +typedef void (APIENTRYP pfn_glGetPerfMonitorGroupStringAMD) (GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetPerfMonitorGroupStringAMD fp_glGetPerfMonitorGroupStringAMD; +typedef void (APIENTRYP pfn_glGetPerfMonitorCounterStringAMD) (GLuint, GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetPerfMonitorCounterStringAMD fp_glGetPerfMonitorCounterStringAMD; +typedef void (APIENTRYP pfn_glGetPerfMonitorCounterInfoAMD) (GLuint, GLuint, GLenum, void*); +extern pfn_glGetPerfMonitorCounterInfoAMD fp_glGetPerfMonitorCounterInfoAMD; +typedef void (APIENTRYP pfn_glGenPerfMonitorsAMD) (GLsizei, GLuint*); +extern pfn_glGenPerfMonitorsAMD fp_glGenPerfMonitorsAMD; +typedef void (APIENTRYP pfn_glDeletePerfMonitorsAMD) (GLsizei, GLuint*); +extern pfn_glDeletePerfMonitorsAMD fp_glDeletePerfMonitorsAMD; +typedef void (APIENTRYP pfn_glSelectPerfMonitorCountersAMD) (GLuint, GLboolean, GLuint, GLint, GLuint*); +extern pfn_glSelectPerfMonitorCountersAMD fp_glSelectPerfMonitorCountersAMD; +typedef void (APIENTRYP pfn_glBeginPerfMonitorAMD) (GLuint); +extern pfn_glBeginPerfMonitorAMD fp_glBeginPerfMonitorAMD; +typedef void (APIENTRYP pfn_glEndPerfMonitorAMD) (GLuint); +extern pfn_glEndPerfMonitorAMD fp_glEndPerfMonitorAMD; +typedef void (APIENTRYP pfn_glGetPerfMonitorCounterDataAMD) (GLuint, GLenum, GLsizei, GLuint*, GLint*); +extern pfn_glGetPerfMonitorCounterDataAMD fp_glGetPerfMonitorCounterDataAMD; + + /* GL_AMD_pinned_memory */ +extern GLboolean GLAD_AMD_pinned_memory; +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 + + /* GL_AMD_program_binary_Z400 */ +extern GLboolean GLAD_AMD_program_binary_Z400; +#define GL_Z400_BINARY_AMD 0x8740 + + /* GL_AMD_query_buffer_object */ +extern GLboolean GLAD_AMD_query_buffer_object; +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 + + /* GL_AMD_sample_positions */ +extern GLboolean GLAD_AMD_sample_positions; +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +typedef void (APIENTRYP pfn_glSetMultisamplefvAMD) (GLenum, GLuint, const GLfloat*); +extern pfn_glSetMultisamplefvAMD fp_glSetMultisamplefvAMD; + + /* GL_AMD_seamless_cubemap_per_texture */ +extern GLboolean GLAD_AMD_seamless_cubemap_per_texture; + + /* GL_AMD_shader_atomic_counter_ops */ +extern GLboolean GLAD_AMD_shader_atomic_counter_ops; + + /* GL_AMD_shader_stencil_export */ +extern GLboolean GLAD_AMD_shader_stencil_export; + + /* GL_AMD_shader_trinary_minmax */ +extern GLboolean GLAD_AMD_shader_trinary_minmax; + + /* GL_AMD_sparse_texture */ +extern GLboolean GLAD_AMD_sparse_texture; +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +typedef void (APIENTRYP pfn_glTexStorageSparseAMD) (GLenum, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLbitfield); +extern pfn_glTexStorageSparseAMD fp_glTexStorageSparseAMD; +typedef void (APIENTRYP pfn_glTextureStorageSparseAMD) (GLuint, GLenum, GLenum, GLsizei, GLsizei, GLsizei, GLsizei, GLbitfield); +extern pfn_glTextureStorageSparseAMD fp_glTextureStorageSparseAMD; + + /* GL_AMD_stencil_operation_extended */ +extern GLboolean GLAD_AMD_stencil_operation_extended; +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +typedef void (APIENTRYP pfn_glStencilOpValueAMD) (GLenum, GLuint); +extern pfn_glStencilOpValueAMD fp_glStencilOpValueAMD; + + /* GL_AMD_texture_texture4 */ +extern GLboolean GLAD_AMD_texture_texture4; + + /* GL_AMD_transform_feedback3_lines_triangles */ +extern GLboolean GLAD_AMD_transform_feedback3_lines_triangles; + + /* GL_AMD_vertex_shader_layer */ +extern GLboolean GLAD_AMD_vertex_shader_layer; + + /* GL_AMD_vertex_shader_tessellator */ +extern GLboolean GLAD_AMD_vertex_shader_tessellator; +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +typedef void (APIENTRYP pfn_glTessellationFactorAMD) (GLfloat); +extern pfn_glTessellationFactorAMD fp_glTessellationFactorAMD; +typedef void (APIENTRYP pfn_glTessellationModeAMD) (GLenum); +extern pfn_glTessellationModeAMD fp_glTessellationModeAMD; + + /* GL_AMD_vertex_shader_viewport_index */ +extern GLboolean GLAD_AMD_vertex_shader_viewport_index; + + /* GL_ANGLE_depth_texture */ +extern GLboolean GLAD_ANGLE_depth_texture; + + /* GL_ANGLE_framebuffer_blit */ +extern GLboolean GLAD_ANGLE_framebuffer_blit; +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA +typedef void (APIENTRYP pfn_glBlitFramebufferANGLE) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +extern pfn_glBlitFramebufferANGLE fp_glBlitFramebufferANGLE; + + /* GL_ANGLE_framebuffer_multisample */ +extern GLboolean GLAD_ANGLE_framebuffer_multisample; +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 +typedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleANGLE) (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorageMultisampleANGLE fp_glRenderbufferStorageMultisampleANGLE; + + /* GL_ANGLE_instanced_arrays */ +extern GLboolean GLAD_ANGLE_instanced_arrays; +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE +typedef void (APIENTRYP pfn_glDrawArraysInstancedANGLE) (GLenum, GLint, GLsizei, GLsizei); +extern pfn_glDrawArraysInstancedANGLE fp_glDrawArraysInstancedANGLE; +typedef void (APIENTRYP pfn_glDrawElementsInstancedANGLE) (GLenum, GLsizei, GLenum, const void*, GLsizei); +extern pfn_glDrawElementsInstancedANGLE fp_glDrawElementsInstancedANGLE; +typedef void (APIENTRYP pfn_glVertexAttribDivisorANGLE) (GLuint, GLuint); +extern pfn_glVertexAttribDivisorANGLE fp_glVertexAttribDivisorANGLE; + + /* GL_ANGLE_pack_reverse_row_order */ +extern GLboolean GLAD_ANGLE_pack_reverse_row_order; +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 + + /* GL_ANGLE_program_binary */ +extern GLboolean GLAD_ANGLE_program_binary; +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 + + /* GL_ANGLE_texture_compression_dxt3 */ +extern GLboolean GLAD_ANGLE_texture_compression_dxt3; +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 + + /* GL_ANGLE_texture_compression_dxt5 */ +extern GLboolean GLAD_ANGLE_texture_compression_dxt5; +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + + /* GL_ANGLE_texture_usage */ +extern GLboolean GLAD_ANGLE_texture_usage; +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 + + /* GL_ANGLE_translated_shader_source */ +extern GLboolean GLAD_ANGLE_translated_shader_source; +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 +typedef void (APIENTRYP pfn_glGetTranslatedShaderSourceANGLE) (GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetTranslatedShaderSourceANGLE fp_glGetTranslatedShaderSourceANGLE; + + /* GL_APPLE_aux_depth_stencil */ +extern GLboolean GLAD_APPLE_aux_depth_stencil; +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 + + /* GL_APPLE_client_storage */ +extern GLboolean GLAD_APPLE_client_storage; +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + + /* GL_APPLE_copy_texture_levels */ +extern GLboolean GLAD_APPLE_copy_texture_levels; +typedef void (APIENTRYP pfn_glCopyTextureLevelsAPPLE) (GLuint, GLuint, GLint, GLsizei); +extern pfn_glCopyTextureLevelsAPPLE fp_glCopyTextureLevelsAPPLE; + + /* GL_APPLE_element_array */ +extern GLboolean GLAD_APPLE_element_array; +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +typedef void (APIENTRYP pfn_glElementPointerAPPLE) (GLenum, const void*); +extern pfn_glElementPointerAPPLE fp_glElementPointerAPPLE; +typedef void (APIENTRYP pfn_glDrawElementArrayAPPLE) (GLenum, GLint, GLsizei); +extern pfn_glDrawElementArrayAPPLE fp_glDrawElementArrayAPPLE; +typedef void (APIENTRYP pfn_glDrawRangeElementArrayAPPLE) (GLenum, GLuint, GLuint, GLint, GLsizei); +extern pfn_glDrawRangeElementArrayAPPLE fp_glDrawRangeElementArrayAPPLE; +typedef void (APIENTRYP pfn_glMultiDrawElementArrayAPPLE) (GLenum, const GLint*, const GLsizei*, GLsizei); +extern pfn_glMultiDrawElementArrayAPPLE fp_glMultiDrawElementArrayAPPLE; +typedef void (APIENTRYP pfn_glMultiDrawRangeElementArrayAPPLE) (GLenum, GLuint, GLuint, const GLint*, const GLsizei*, GLsizei); +extern pfn_glMultiDrawRangeElementArrayAPPLE fp_glMultiDrawRangeElementArrayAPPLE; + + /* GL_APPLE_fence */ +extern GLboolean GLAD_APPLE_fence; +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +typedef void (APIENTRYP pfn_glGenFencesAPPLE) (GLsizei, GLuint*); +extern pfn_glGenFencesAPPLE fp_glGenFencesAPPLE; +typedef void (APIENTRYP pfn_glDeleteFencesAPPLE) (GLsizei, const GLuint*); +extern pfn_glDeleteFencesAPPLE fp_glDeleteFencesAPPLE; +typedef void (APIENTRYP pfn_glSetFenceAPPLE) (GLuint); +extern pfn_glSetFenceAPPLE fp_glSetFenceAPPLE; +typedef GLboolean (APIENTRYP pfn_glIsFenceAPPLE) (GLuint); +extern pfn_glIsFenceAPPLE fp_glIsFenceAPPLE; +typedef GLboolean (APIENTRYP pfn_glTestFenceAPPLE) (GLuint); +extern pfn_glTestFenceAPPLE fp_glTestFenceAPPLE; +typedef void (APIENTRYP pfn_glFinishFenceAPPLE) (GLuint); +extern pfn_glFinishFenceAPPLE fp_glFinishFenceAPPLE; +typedef GLboolean (APIENTRYP pfn_glTestObjectAPPLE) (GLenum, GLuint); +extern pfn_glTestObjectAPPLE fp_glTestObjectAPPLE; +typedef void (APIENTRYP pfn_glFinishObjectAPPLE) (GLenum, GLint); +extern pfn_glFinishObjectAPPLE fp_glFinishObjectAPPLE; + + /* GL_APPLE_float_pixels */ +extern GLboolean GLAD_APPLE_float_pixels; +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F + + /* GL_APPLE_flush_buffer_range */ +extern GLboolean GLAD_APPLE_flush_buffer_range; +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +typedef void (APIENTRYP pfn_glBufferParameteriAPPLE) (GLenum, GLenum, GLint); +extern pfn_glBufferParameteriAPPLE fp_glBufferParameteriAPPLE; +typedef void (APIENTRYP pfn_glFlushMappedBufferRangeAPPLE) (GLenum, GLintptr, GLsizeiptr); +extern pfn_glFlushMappedBufferRangeAPPLE fp_glFlushMappedBufferRangeAPPLE; + + /* GL_APPLE_framebuffer_multisample */ +extern GLboolean GLAD_APPLE_framebuffer_multisample; +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +typedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleAPPLE) (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorageMultisampleAPPLE fp_glRenderbufferStorageMultisampleAPPLE; +typedef void (APIENTRYP pfn_glResolveMultisampleFramebufferAPPLE) (); +extern pfn_glResolveMultisampleFramebufferAPPLE fp_glResolveMultisampleFramebufferAPPLE; + + /* GL_APPLE_object_purgeable */ +extern GLboolean GLAD_APPLE_object_purgeable; +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +typedef GLenum (APIENTRYP pfn_glObjectPurgeableAPPLE) (GLenum, GLuint, GLenum); +extern pfn_glObjectPurgeableAPPLE fp_glObjectPurgeableAPPLE; +typedef GLenum (APIENTRYP pfn_glObjectUnpurgeableAPPLE) (GLenum, GLuint, GLenum); +extern pfn_glObjectUnpurgeableAPPLE fp_glObjectUnpurgeableAPPLE; +typedef void (APIENTRYP pfn_glGetObjectParameterivAPPLE) (GLenum, GLuint, GLenum, GLint*); +extern pfn_glGetObjectParameterivAPPLE fp_glGetObjectParameterivAPPLE; + + /* GL_APPLE_rgb_422 */ +extern GLboolean GLAD_APPLE_rgb_422; +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 + + /* GL_APPLE_row_bytes */ +extern GLboolean GLAD_APPLE_row_bytes; +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 + + /* GL_APPLE_specular_vector */ +extern GLboolean GLAD_APPLE_specular_vector; +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 + + /* GL_APPLE_sync */ +extern GLboolean GLAD_APPLE_sync; +#define GL_SYNC_OBJECT_APPLE 0x8A53 +#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 +#define GL_OBJECT_TYPE_APPLE 0x9112 +#define GL_SYNC_CONDITION_APPLE 0x9113 +#define GL_SYNC_STATUS_APPLE 0x9114 +#define GL_SYNC_FLAGS_APPLE 0x9115 +#define GL_SYNC_FENCE_APPLE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 +#define GL_UNSIGNALED_APPLE 0x9118 +#define GL_SIGNALED_APPLE 0x9119 +#define GL_ALREADY_SIGNALED_APPLE 0x911A +#define GL_TIMEOUT_EXPIRED_APPLE 0x911B +#define GL_CONDITION_SATISFIED_APPLE 0x911C +#define GL_WAIT_FAILED_APPLE 0x911D +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFF +typedef GLsync (APIENTRYP pfn_glFenceSyncAPPLE) (GLenum, GLbitfield); +extern pfn_glFenceSyncAPPLE fp_glFenceSyncAPPLE; +typedef GLboolean (APIENTRYP pfn_glIsSyncAPPLE) (GLsync); +extern pfn_glIsSyncAPPLE fp_glIsSyncAPPLE; +typedef void (APIENTRYP pfn_glDeleteSyncAPPLE) (GLsync); +extern pfn_glDeleteSyncAPPLE fp_glDeleteSyncAPPLE; +typedef GLenum (APIENTRYP pfn_glClientWaitSyncAPPLE) (GLsync, GLbitfield, GLuint64); +extern pfn_glClientWaitSyncAPPLE fp_glClientWaitSyncAPPLE; +typedef void (APIENTRYP pfn_glWaitSyncAPPLE) (GLsync, GLbitfield, GLuint64); +extern pfn_glWaitSyncAPPLE fp_glWaitSyncAPPLE; +typedef void (APIENTRYP pfn_glGetInteger64vAPPLE) (GLenum, GLint64*); +extern pfn_glGetInteger64vAPPLE fp_glGetInteger64vAPPLE; +typedef void (APIENTRYP pfn_glGetSyncivAPPLE) (GLsync, GLenum, GLsizei, GLsizei*, GLint*); +extern pfn_glGetSyncivAPPLE fp_glGetSyncivAPPLE; + + /* GL_APPLE_texture_format_BGRA8888 */ +extern GLboolean GLAD_APPLE_texture_format_BGRA8888; + + /* GL_APPLE_texture_max_level */ +extern GLboolean GLAD_APPLE_texture_max_level; +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D + + /* GL_APPLE_texture_range */ +extern GLboolean GLAD_APPLE_texture_range; +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +typedef void (APIENTRYP pfn_glTextureRangeAPPLE) (GLenum, GLsizei, const void*); +extern pfn_glTextureRangeAPPLE fp_glTextureRangeAPPLE; +typedef void (APIENTRYP pfn_glGetTexParameterPointervAPPLE) (GLenum, GLenum, void**); +extern pfn_glGetTexParameterPointervAPPLE fp_glGetTexParameterPointervAPPLE; + + /* GL_APPLE_transform_hint */ +extern GLboolean GLAD_APPLE_transform_hint; +#define GL_TRANSFORM_HINT_APPLE 0x85B1 + + /* GL_APPLE_vertex_array_object */ +extern GLboolean GLAD_APPLE_vertex_array_object; +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +typedef void (APIENTRYP pfn_glBindVertexArrayAPPLE) (GLuint); +extern pfn_glBindVertexArrayAPPLE fp_glBindVertexArrayAPPLE; +typedef void (APIENTRYP pfn_glDeleteVertexArraysAPPLE) (GLsizei, const GLuint*); +extern pfn_glDeleteVertexArraysAPPLE fp_glDeleteVertexArraysAPPLE; +typedef void (APIENTRYP pfn_glGenVertexArraysAPPLE) (GLsizei, GLuint*); +extern pfn_glGenVertexArraysAPPLE fp_glGenVertexArraysAPPLE; +typedef GLboolean (APIENTRYP pfn_glIsVertexArrayAPPLE) (GLuint); +extern pfn_glIsVertexArrayAPPLE fp_glIsVertexArrayAPPLE; + + /* GL_APPLE_vertex_array_range */ +extern GLboolean GLAD_APPLE_vertex_array_range; +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +typedef void (APIENTRYP pfn_glVertexArrayRangeAPPLE) (GLsizei, void*); +extern pfn_glVertexArrayRangeAPPLE fp_glVertexArrayRangeAPPLE; +typedef void (APIENTRYP pfn_glFlushVertexArrayRangeAPPLE) (GLsizei, void*); +extern pfn_glFlushVertexArrayRangeAPPLE fp_glFlushVertexArrayRangeAPPLE; +typedef void (APIENTRYP pfn_glVertexArrayParameteriAPPLE) (GLenum, GLint); +extern pfn_glVertexArrayParameteriAPPLE fp_glVertexArrayParameteriAPPLE; + + /* GL_APPLE_vertex_program_evaluators */ +extern GLboolean GLAD_APPLE_vertex_program_evaluators; +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +typedef void (APIENTRYP pfn_glEnableVertexAttribAPPLE) (GLuint, GLenum); +extern pfn_glEnableVertexAttribAPPLE fp_glEnableVertexAttribAPPLE; +typedef void (APIENTRYP pfn_glDisableVertexAttribAPPLE) (GLuint, GLenum); +extern pfn_glDisableVertexAttribAPPLE fp_glDisableVertexAttribAPPLE; +typedef GLboolean (APIENTRYP pfn_glIsVertexAttribEnabledAPPLE) (GLuint, GLenum); +extern pfn_glIsVertexAttribEnabledAPPLE fp_glIsVertexAttribEnabledAPPLE; +typedef void (APIENTRYP pfn_glMapVertexAttrib1dAPPLE) (GLuint, GLuint, GLdouble, GLdouble, GLint, GLint, const GLdouble*); +extern pfn_glMapVertexAttrib1dAPPLE fp_glMapVertexAttrib1dAPPLE; +typedef void (APIENTRYP pfn_glMapVertexAttrib1fAPPLE) (GLuint, GLuint, GLfloat, GLfloat, GLint, GLint, const GLfloat*); +extern pfn_glMapVertexAttrib1fAPPLE fp_glMapVertexAttrib1fAPPLE; +typedef void (APIENTRYP pfn_glMapVertexAttrib2dAPPLE) (GLuint, GLuint, GLdouble, GLdouble, GLint, GLint, GLdouble, GLdouble, GLint, GLint, const GLdouble*); +extern pfn_glMapVertexAttrib2dAPPLE fp_glMapVertexAttrib2dAPPLE; +typedef void (APIENTRYP pfn_glMapVertexAttrib2fAPPLE) (GLuint, GLuint, GLfloat, GLfloat, GLint, GLint, GLfloat, GLfloat, GLint, GLint, const GLfloat*); +extern pfn_glMapVertexAttrib2fAPPLE fp_glMapVertexAttrib2fAPPLE; + + /* GL_APPLE_ycbcr_422 */ +extern GLboolean GLAD_APPLE_ycbcr_422; +#define GL_YCBCR_422_APPLE 0x85B9 + + /* GL_ARM_mali_program_binary */ +extern GLboolean GLAD_ARM_mali_program_binary; +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 + + /* GL_ARM_mali_shader_binary */ +extern GLboolean GLAD_ARM_mali_shader_binary; +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 + + /* GL_ARM_rgba8 */ +extern GLboolean GLAD_ARM_rgba8; + + /* GL_ATI_draw_buffers */ +extern GLboolean GLAD_ATI_draw_buffers; +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +typedef void (APIENTRYP pfn_glDrawBuffersATI) (GLsizei, const GLenum*); +extern pfn_glDrawBuffersATI fp_glDrawBuffersATI; + + /* GL_ATI_element_array */ +extern GLboolean GLAD_ATI_element_array; +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +typedef void (APIENTRYP pfn_glElementPointerATI) (GLenum, const void*); +extern pfn_glElementPointerATI fp_glElementPointerATI; +typedef void (APIENTRYP pfn_glDrawElementArrayATI) (GLenum, GLsizei); +extern pfn_glDrawElementArrayATI fp_glDrawElementArrayATI; +typedef void (APIENTRYP pfn_glDrawRangeElementArrayATI) (GLenum, GLuint, GLuint, GLsizei); +extern pfn_glDrawRangeElementArrayATI fp_glDrawRangeElementArrayATI; + + /* GL_ATI_envmap_bumpmap */ +extern GLboolean GLAD_ATI_envmap_bumpmap; +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +typedef void (APIENTRYP pfn_glTexBumpParameterivATI) (GLenum, const GLint*); +extern pfn_glTexBumpParameterivATI fp_glTexBumpParameterivATI; +typedef void (APIENTRYP pfn_glTexBumpParameterfvATI) (GLenum, const GLfloat*); +extern pfn_glTexBumpParameterfvATI fp_glTexBumpParameterfvATI; +typedef void (APIENTRYP pfn_glGetTexBumpParameterivATI) (GLenum, GLint*); +extern pfn_glGetTexBumpParameterivATI fp_glGetTexBumpParameterivATI; +typedef void (APIENTRYP pfn_glGetTexBumpParameterfvATI) (GLenum, GLfloat*); +extern pfn_glGetTexBumpParameterfvATI fp_glGetTexBumpParameterfvATI; + + /* GL_ATI_fragment_shader */ +extern GLboolean GLAD_ATI_fragment_shader; +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +typedef GLuint (APIENTRYP pfn_glGenFragmentShadersATI) (GLuint); +extern pfn_glGenFragmentShadersATI fp_glGenFragmentShadersATI; +typedef void (APIENTRYP pfn_glBindFragmentShaderATI) (GLuint); +extern pfn_glBindFragmentShaderATI fp_glBindFragmentShaderATI; +typedef void (APIENTRYP pfn_glDeleteFragmentShaderATI) (GLuint); +extern pfn_glDeleteFragmentShaderATI fp_glDeleteFragmentShaderATI; +typedef void (APIENTRYP pfn_glBeginFragmentShaderATI) (); +extern pfn_glBeginFragmentShaderATI fp_glBeginFragmentShaderATI; +typedef void (APIENTRYP pfn_glEndFragmentShaderATI) (); +extern pfn_glEndFragmentShaderATI fp_glEndFragmentShaderATI; +typedef void (APIENTRYP pfn_glPassTexCoordATI) (GLuint, GLuint, GLenum); +extern pfn_glPassTexCoordATI fp_glPassTexCoordATI; +typedef void (APIENTRYP pfn_glSampleMapATI) (GLuint, GLuint, GLenum); +extern pfn_glSampleMapATI fp_glSampleMapATI; +typedef void (APIENTRYP pfn_glColorFragmentOp1ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glColorFragmentOp1ATI fp_glColorFragmentOp1ATI; +typedef void (APIENTRYP pfn_glColorFragmentOp2ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glColorFragmentOp2ATI fp_glColorFragmentOp2ATI; +typedef void (APIENTRYP pfn_glColorFragmentOp3ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glColorFragmentOp3ATI fp_glColorFragmentOp3ATI; +typedef void (APIENTRYP pfn_glAlphaFragmentOp1ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glAlphaFragmentOp1ATI fp_glAlphaFragmentOp1ATI; +typedef void (APIENTRYP pfn_glAlphaFragmentOp2ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glAlphaFragmentOp2ATI fp_glAlphaFragmentOp2ATI; +typedef void (APIENTRYP pfn_glAlphaFragmentOp3ATI) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glAlphaFragmentOp3ATI fp_glAlphaFragmentOp3ATI; +typedef void (APIENTRYP pfn_glSetFragmentShaderConstantATI) (GLuint, const GLfloat*); +extern pfn_glSetFragmentShaderConstantATI fp_glSetFragmentShaderConstantATI; + + /* GL_ATI_map_object_buffer */ +extern GLboolean GLAD_ATI_map_object_buffer; +typedef void* (APIENTRYP pfn_glMapObjectBufferATI) (GLuint); +extern pfn_glMapObjectBufferATI fp_glMapObjectBufferATI; +typedef void (APIENTRYP pfn_glUnmapObjectBufferATI) (GLuint); +extern pfn_glUnmapObjectBufferATI fp_glUnmapObjectBufferATI; + + /* GL_ATI_meminfo */ +extern GLboolean GLAD_ATI_meminfo; +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD + + /* GL_ATI_pixel_format_float */ +extern GLboolean GLAD_ATI_pixel_format_float; +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 + + /* GL_ATI_pn_triangles */ +extern GLboolean GLAD_ATI_pn_triangles; +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +typedef void (APIENTRYP pfn_glPNTrianglesiATI) (GLenum, GLint); +extern pfn_glPNTrianglesiATI fp_glPNTrianglesiATI; +typedef void (APIENTRYP pfn_glPNTrianglesfATI) (GLenum, GLfloat); +extern pfn_glPNTrianglesfATI fp_glPNTrianglesfATI; + + /* GL_ATI_separate_stencil */ +extern GLboolean GLAD_ATI_separate_stencil; +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +typedef void (APIENTRYP pfn_glStencilOpSeparateATI) (GLenum, GLenum, GLenum, GLenum); +extern pfn_glStencilOpSeparateATI fp_glStencilOpSeparateATI; +typedef void (APIENTRYP pfn_glStencilFuncSeparateATI) (GLenum, GLenum, GLint, GLuint); +extern pfn_glStencilFuncSeparateATI fp_glStencilFuncSeparateATI; + + /* GL_ATI_text_fragment_shader */ +extern GLboolean GLAD_ATI_text_fragment_shader; +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 + + /* GL_ATI_texture_env_combine3 */ +extern GLboolean GLAD_ATI_texture_env_combine3; +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 + + /* GL_ATI_texture_float */ +extern GLboolean GLAD_ATI_texture_float; +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F + + /* GL_ATI_texture_mirror_once */ +extern GLboolean GLAD_ATI_texture_mirror_once; +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 + + /* GL_ATI_vertex_array_object */ +extern GLboolean GLAD_ATI_vertex_array_object; +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +typedef GLuint (APIENTRYP pfn_glNewObjectBufferATI) (GLsizei, const void*, GLenum); +extern pfn_glNewObjectBufferATI fp_glNewObjectBufferATI; +typedef GLboolean (APIENTRYP pfn_glIsObjectBufferATI) (GLuint); +extern pfn_glIsObjectBufferATI fp_glIsObjectBufferATI; +typedef void (APIENTRYP pfn_glUpdateObjectBufferATI) (GLuint, GLuint, GLsizei, const void*, GLenum); +extern pfn_glUpdateObjectBufferATI fp_glUpdateObjectBufferATI; +typedef void (APIENTRYP pfn_glGetObjectBufferfvATI) (GLuint, GLenum, GLfloat*); +extern pfn_glGetObjectBufferfvATI fp_glGetObjectBufferfvATI; +typedef void (APIENTRYP pfn_glGetObjectBufferivATI) (GLuint, GLenum, GLint*); +extern pfn_glGetObjectBufferivATI fp_glGetObjectBufferivATI; +typedef void (APIENTRYP pfn_glFreeObjectBufferATI) (GLuint); +extern pfn_glFreeObjectBufferATI fp_glFreeObjectBufferATI; +typedef void (APIENTRYP pfn_glArrayObjectATI) (GLenum, GLint, GLenum, GLsizei, GLuint, GLuint); +extern pfn_glArrayObjectATI fp_glArrayObjectATI; +typedef void (APIENTRYP pfn_glGetArrayObjectfvATI) (GLenum, GLenum, GLfloat*); +extern pfn_glGetArrayObjectfvATI fp_glGetArrayObjectfvATI; +typedef void (APIENTRYP pfn_glGetArrayObjectivATI) (GLenum, GLenum, GLint*); +extern pfn_glGetArrayObjectivATI fp_glGetArrayObjectivATI; +typedef void (APIENTRYP pfn_glVariantArrayObjectATI) (GLuint, GLenum, GLsizei, GLuint, GLuint); +extern pfn_glVariantArrayObjectATI fp_glVariantArrayObjectATI; +typedef void (APIENTRYP pfn_glGetVariantArrayObjectfvATI) (GLuint, GLenum, GLfloat*); +extern pfn_glGetVariantArrayObjectfvATI fp_glGetVariantArrayObjectfvATI; +typedef void (APIENTRYP pfn_glGetVariantArrayObjectivATI) (GLuint, GLenum, GLint*); +extern pfn_glGetVariantArrayObjectivATI fp_glGetVariantArrayObjectivATI; + + /* GL_ATI_vertex_attrib_array_object */ +extern GLboolean GLAD_ATI_vertex_attrib_array_object; +typedef void (APIENTRYP pfn_glVertexAttribArrayObjectATI) (GLuint, GLint, GLenum, GLboolean, GLsizei, GLuint, GLuint); +extern pfn_glVertexAttribArrayObjectATI fp_glVertexAttribArrayObjectATI; +typedef void (APIENTRYP pfn_glGetVertexAttribArrayObjectfvATI) (GLuint, GLenum, GLfloat*); +extern pfn_glGetVertexAttribArrayObjectfvATI fp_glGetVertexAttribArrayObjectfvATI; +typedef void (APIENTRYP pfn_glGetVertexAttribArrayObjectivATI) (GLuint, GLenum, GLint*); +extern pfn_glGetVertexAttribArrayObjectivATI fp_glGetVertexAttribArrayObjectivATI; + + /* GL_ATI_vertex_streams */ +extern GLboolean GLAD_ATI_vertex_streams; +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +typedef void (APIENTRYP pfn_glVertexStream1sATI) (GLenum, GLshort); +extern pfn_glVertexStream1sATI fp_glVertexStream1sATI; +typedef void (APIENTRYP pfn_glVertexStream1svATI) (GLenum, const GLshort*); +extern pfn_glVertexStream1svATI fp_glVertexStream1svATI; +typedef void (APIENTRYP pfn_glVertexStream1iATI) (GLenum, GLint); +extern pfn_glVertexStream1iATI fp_glVertexStream1iATI; +typedef void (APIENTRYP pfn_glVertexStream1ivATI) (GLenum, const GLint*); +extern pfn_glVertexStream1ivATI fp_glVertexStream1ivATI; +typedef void (APIENTRYP pfn_glVertexStream1fATI) (GLenum, GLfloat); +extern pfn_glVertexStream1fATI fp_glVertexStream1fATI; +typedef void (APIENTRYP pfn_glVertexStream1fvATI) (GLenum, const GLfloat*); +extern pfn_glVertexStream1fvATI fp_glVertexStream1fvATI; +typedef void (APIENTRYP pfn_glVertexStream1dATI) (GLenum, GLdouble); +extern pfn_glVertexStream1dATI fp_glVertexStream1dATI; +typedef void (APIENTRYP pfn_glVertexStream1dvATI) (GLenum, const GLdouble*); +extern pfn_glVertexStream1dvATI fp_glVertexStream1dvATI; +typedef void (APIENTRYP pfn_glVertexStream2sATI) (GLenum, GLshort, GLshort); +extern pfn_glVertexStream2sATI fp_glVertexStream2sATI; +typedef void (APIENTRYP pfn_glVertexStream2svATI) (GLenum, const GLshort*); +extern pfn_glVertexStream2svATI fp_glVertexStream2svATI; +typedef void (APIENTRYP pfn_glVertexStream2iATI) (GLenum, GLint, GLint); +extern pfn_glVertexStream2iATI fp_glVertexStream2iATI; +typedef void (APIENTRYP pfn_glVertexStream2ivATI) (GLenum, const GLint*); +extern pfn_glVertexStream2ivATI fp_glVertexStream2ivATI; +typedef void (APIENTRYP pfn_glVertexStream2fATI) (GLenum, GLfloat, GLfloat); +extern pfn_glVertexStream2fATI fp_glVertexStream2fATI; +typedef void (APIENTRYP pfn_glVertexStream2fvATI) (GLenum, const GLfloat*); +extern pfn_glVertexStream2fvATI fp_glVertexStream2fvATI; +typedef void (APIENTRYP pfn_glVertexStream2dATI) (GLenum, GLdouble, GLdouble); +extern pfn_glVertexStream2dATI fp_glVertexStream2dATI; +typedef void (APIENTRYP pfn_glVertexStream2dvATI) (GLenum, const GLdouble*); +extern pfn_glVertexStream2dvATI fp_glVertexStream2dvATI; +typedef void (APIENTRYP pfn_glVertexStream3sATI) (GLenum, GLshort, GLshort, GLshort); +extern pfn_glVertexStream3sATI fp_glVertexStream3sATI; +typedef void (APIENTRYP pfn_glVertexStream3svATI) (GLenum, const GLshort*); +extern pfn_glVertexStream3svATI fp_glVertexStream3svATI; +typedef void (APIENTRYP pfn_glVertexStream3iATI) (GLenum, GLint, GLint, GLint); +extern pfn_glVertexStream3iATI fp_glVertexStream3iATI; +typedef void (APIENTRYP pfn_glVertexStream3ivATI) (GLenum, const GLint*); +extern pfn_glVertexStream3ivATI fp_glVertexStream3ivATI; +typedef void (APIENTRYP pfn_glVertexStream3fATI) (GLenum, GLfloat, GLfloat, GLfloat); +extern pfn_glVertexStream3fATI fp_glVertexStream3fATI; +typedef void (APIENTRYP pfn_glVertexStream3fvATI) (GLenum, const GLfloat*); +extern pfn_glVertexStream3fvATI fp_glVertexStream3fvATI; +typedef void (APIENTRYP pfn_glVertexStream3dATI) (GLenum, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexStream3dATI fp_glVertexStream3dATI; +typedef void (APIENTRYP pfn_glVertexStream3dvATI) (GLenum, const GLdouble*); +extern pfn_glVertexStream3dvATI fp_glVertexStream3dvATI; +typedef void (APIENTRYP pfn_glVertexStream4sATI) (GLenum, GLshort, GLshort, GLshort, GLshort); +extern pfn_glVertexStream4sATI fp_glVertexStream4sATI; +typedef void (APIENTRYP pfn_glVertexStream4svATI) (GLenum, const GLshort*); +extern pfn_glVertexStream4svATI fp_glVertexStream4svATI; +typedef void (APIENTRYP pfn_glVertexStream4iATI) (GLenum, GLint, GLint, GLint, GLint); +extern pfn_glVertexStream4iATI fp_glVertexStream4iATI; +typedef void (APIENTRYP pfn_glVertexStream4ivATI) (GLenum, const GLint*); +extern pfn_glVertexStream4ivATI fp_glVertexStream4ivATI; +typedef void (APIENTRYP pfn_glVertexStream4fATI) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glVertexStream4fATI fp_glVertexStream4fATI; +typedef void (APIENTRYP pfn_glVertexStream4fvATI) (GLenum, const GLfloat*); +extern pfn_glVertexStream4fvATI fp_glVertexStream4fvATI; +typedef void (APIENTRYP pfn_glVertexStream4dATI) (GLenum, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexStream4dATI fp_glVertexStream4dATI; +typedef void (APIENTRYP pfn_glVertexStream4dvATI) (GLenum, const GLdouble*); +extern pfn_glVertexStream4dvATI fp_glVertexStream4dvATI; +typedef void (APIENTRYP pfn_glNormalStream3bATI) (GLenum, GLbyte, GLbyte, GLbyte); +extern pfn_glNormalStream3bATI fp_glNormalStream3bATI; +typedef void (APIENTRYP pfn_glNormalStream3bvATI) (GLenum, const GLbyte*); +extern pfn_glNormalStream3bvATI fp_glNormalStream3bvATI; +typedef void (APIENTRYP pfn_glNormalStream3sATI) (GLenum, GLshort, GLshort, GLshort); +extern pfn_glNormalStream3sATI fp_glNormalStream3sATI; +typedef void (APIENTRYP pfn_glNormalStream3svATI) (GLenum, const GLshort*); +extern pfn_glNormalStream3svATI fp_glNormalStream3svATI; +typedef void (APIENTRYP pfn_glNormalStream3iATI) (GLenum, GLint, GLint, GLint); +extern pfn_glNormalStream3iATI fp_glNormalStream3iATI; +typedef void (APIENTRYP pfn_glNormalStream3ivATI) (GLenum, const GLint*); +extern pfn_glNormalStream3ivATI fp_glNormalStream3ivATI; +typedef void (APIENTRYP pfn_glNormalStream3fATI) (GLenum, GLfloat, GLfloat, GLfloat); +extern pfn_glNormalStream3fATI fp_glNormalStream3fATI; +typedef void (APIENTRYP pfn_glNormalStream3fvATI) (GLenum, const GLfloat*); +extern pfn_glNormalStream3fvATI fp_glNormalStream3fvATI; +typedef void (APIENTRYP pfn_glNormalStream3dATI) (GLenum, GLdouble, GLdouble, GLdouble); +extern pfn_glNormalStream3dATI fp_glNormalStream3dATI; +typedef void (APIENTRYP pfn_glNormalStream3dvATI) (GLenum, const GLdouble*); +extern pfn_glNormalStream3dvATI fp_glNormalStream3dvATI; +typedef void (APIENTRYP pfn_glClientActiveVertexStreamATI) (GLenum); +extern pfn_glClientActiveVertexStreamATI fp_glClientActiveVertexStreamATI; +typedef void (APIENTRYP pfn_glVertexBlendEnviATI) (GLenum, GLint); +extern pfn_glVertexBlendEnviATI fp_glVertexBlendEnviATI; +typedef void (APIENTRYP pfn_glVertexBlendEnvfATI) (GLenum, GLfloat); +extern pfn_glVertexBlendEnvfATI fp_glVertexBlendEnvfATI; + + /* GL_DMP_shader_binary */ +extern GLboolean GLAD_DMP_shader_binary; +#define GL_SHADER_BINARY_DMP 0x9250 + + /* GL_FJ_shader_binary_GCCSO */ +extern GLboolean GLAD_FJ_shader_binary_GCCSO; +#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 + + /* GL_GREMEDY_frame_terminator */ +extern GLboolean GLAD_GREMEDY_frame_terminator; +typedef void (APIENTRYP pfn_glFrameTerminatorGREMEDY) (); +extern pfn_glFrameTerminatorGREMEDY fp_glFrameTerminatorGREMEDY; + + /* GL_GREMEDY_string_marker */ +extern GLboolean GLAD_GREMEDY_string_marker; +typedef void (APIENTRYP pfn_glStringMarkerGREMEDY) (GLsizei, const void*); +extern pfn_glStringMarkerGREMEDY fp_glStringMarkerGREMEDY; + + /* GL_IBM_rasterpos_clip */ +extern GLboolean GLAD_IBM_rasterpos_clip; +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 + + /* GL_IMG_multisampled_render_to_texture */ +extern GLboolean GLAD_IMG_multisampled_render_to_texture; +#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 +#define GL_MAX_SAMPLES_IMG 0x9135 +#define GL_TEXTURE_SAMPLES_IMG 0x9136 +typedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleIMG) (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorageMultisampleIMG fp_glRenderbufferStorageMultisampleIMG; +typedef void (APIENTRYP pfn_glFramebufferTexture2DMultisampleIMG) (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei); +extern pfn_glFramebufferTexture2DMultisampleIMG fp_glFramebufferTexture2DMultisampleIMG; + + /* GL_IMG_program_binary */ +extern GLboolean GLAD_IMG_program_binary; +#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 + + /* GL_IMG_read_format */ +extern GLboolean GLAD_IMG_read_format; +#define GL_BGRA_IMG 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 + + /* GL_IMG_shader_binary */ +extern GLboolean GLAD_IMG_shader_binary; +#define GL_SGX_BINARY_IMG 0x8C0A + + /* GL_IMG_texture_compression_pvrtc */ +extern GLboolean GLAD_IMG_texture_compression_pvrtc; +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 + + /* GL_IMG_texture_compression_pvrtc2 */ +extern GLboolean GLAD_IMG_texture_compression_pvrtc2; +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 + + /* GL_INGR_blend_func_separate */ +extern GLboolean GLAD_INGR_blend_func_separate; +typedef void (APIENTRYP pfn_glBlendFuncSeparateINGR) (GLenum, GLenum, GLenum, GLenum); +extern pfn_glBlendFuncSeparateINGR fp_glBlendFuncSeparateINGR; + + /* GL_INTEL_fragment_shader_ordering */ +extern GLboolean GLAD_INTEL_fragment_shader_ordering; + + /* GL_INTEL_map_texture */ +extern GLboolean GLAD_INTEL_map_texture; +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +typedef void (APIENTRYP pfn_glSyncTextureINTEL) (GLuint); +extern pfn_glSyncTextureINTEL fp_glSyncTextureINTEL; +typedef void (APIENTRYP pfn_glUnmapTexture2DINTEL) (GLuint, GLint); +extern pfn_glUnmapTexture2DINTEL fp_glUnmapTexture2DINTEL; +typedef void* (APIENTRYP pfn_glMapTexture2DINTEL) (GLuint, GLint, GLbitfield, GLint*, GLenum*); +extern pfn_glMapTexture2DINTEL fp_glMapTexture2DINTEL; + + /* GL_INTEL_parallel_arrays */ +extern GLboolean GLAD_INTEL_parallel_arrays; +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +typedef void (APIENTRYP pfn_glVertexPointervINTEL) (GLint, GLenum, const void**); +extern pfn_glVertexPointervINTEL fp_glVertexPointervINTEL; +typedef void (APIENTRYP pfn_glNormalPointervINTEL) (GLenum, const void**); +extern pfn_glNormalPointervINTEL fp_glNormalPointervINTEL; +typedef void (APIENTRYP pfn_glColorPointervINTEL) (GLint, GLenum, const void**); +extern pfn_glColorPointervINTEL fp_glColorPointervINTEL; +typedef void (APIENTRYP pfn_glTexCoordPointervINTEL) (GLint, GLenum, const void**); +extern pfn_glTexCoordPointervINTEL fp_glTexCoordPointervINTEL; + + /* GL_MESA_pack_invert */ +extern GLboolean GLAD_MESA_pack_invert; +#define GL_PACK_INVERT_MESA 0x8758 + + /* GL_MESA_resize_buffers */ +extern GLboolean GLAD_MESA_resize_buffers; +typedef void (APIENTRYP pfn_glResizeBuffersMESA) (); +extern pfn_glResizeBuffersMESA fp_glResizeBuffersMESA; + + /* GL_MESA_window_pos */ +extern GLboolean GLAD_MESA_window_pos; +typedef void (APIENTRYP pfn_glWindowPos2dMESA) (GLdouble, GLdouble); +extern pfn_glWindowPos2dMESA fp_glWindowPos2dMESA; +typedef void (APIENTRYP pfn_glWindowPos2dvMESA) (const GLdouble*); +extern pfn_glWindowPos2dvMESA fp_glWindowPos2dvMESA; +typedef void (APIENTRYP pfn_glWindowPos2fMESA) (GLfloat, GLfloat); +extern pfn_glWindowPos2fMESA fp_glWindowPos2fMESA; +typedef void (APIENTRYP pfn_glWindowPos2fvMESA) (const GLfloat*); +extern pfn_glWindowPos2fvMESA fp_glWindowPos2fvMESA; +typedef void (APIENTRYP pfn_glWindowPos2iMESA) (GLint, GLint); +extern pfn_glWindowPos2iMESA fp_glWindowPos2iMESA; +typedef void (APIENTRYP pfn_glWindowPos2ivMESA) (const GLint*); +extern pfn_glWindowPos2ivMESA fp_glWindowPos2ivMESA; +typedef void (APIENTRYP pfn_glWindowPos2sMESA) (GLshort, GLshort); +extern pfn_glWindowPos2sMESA fp_glWindowPos2sMESA; +typedef void (APIENTRYP pfn_glWindowPos2svMESA) (const GLshort*); +extern pfn_glWindowPos2svMESA fp_glWindowPos2svMESA; +typedef void (APIENTRYP pfn_glWindowPos3dMESA) (GLdouble, GLdouble, GLdouble); +extern pfn_glWindowPos3dMESA fp_glWindowPos3dMESA; +typedef void (APIENTRYP pfn_glWindowPos3dvMESA) (const GLdouble*); +extern pfn_glWindowPos3dvMESA fp_glWindowPos3dvMESA; +typedef void (APIENTRYP pfn_glWindowPos3fMESA) (GLfloat, GLfloat, GLfloat); +extern pfn_glWindowPos3fMESA fp_glWindowPos3fMESA; +typedef void (APIENTRYP pfn_glWindowPos3fvMESA) (const GLfloat*); +extern pfn_glWindowPos3fvMESA fp_glWindowPos3fvMESA; +typedef void (APIENTRYP pfn_glWindowPos3iMESA) (GLint, GLint, GLint); +extern pfn_glWindowPos3iMESA fp_glWindowPos3iMESA; +typedef void (APIENTRYP pfn_glWindowPos3ivMESA) (const GLint*); +extern pfn_glWindowPos3ivMESA fp_glWindowPos3ivMESA; +typedef void (APIENTRYP pfn_glWindowPos3sMESA) (GLshort, GLshort, GLshort); +extern pfn_glWindowPos3sMESA fp_glWindowPos3sMESA; +typedef void (APIENTRYP pfn_glWindowPos3svMESA) (const GLshort*); +extern pfn_glWindowPos3svMESA fp_glWindowPos3svMESA; +typedef void (APIENTRYP pfn_glWindowPos4dMESA) (GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glWindowPos4dMESA fp_glWindowPos4dMESA; +typedef void (APIENTRYP pfn_glWindowPos4dvMESA) (const GLdouble*); +extern pfn_glWindowPos4dvMESA fp_glWindowPos4dvMESA; +typedef void (APIENTRYP pfn_glWindowPos4fMESA) (GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glWindowPos4fMESA fp_glWindowPos4fMESA; +typedef void (APIENTRYP pfn_glWindowPos4fvMESA) (const GLfloat*); +extern pfn_glWindowPos4fvMESA fp_glWindowPos4fvMESA; +typedef void (APIENTRYP pfn_glWindowPos4iMESA) (GLint, GLint, GLint, GLint); +extern pfn_glWindowPos4iMESA fp_glWindowPos4iMESA; +typedef void (APIENTRYP pfn_glWindowPos4ivMESA) (const GLint*); +extern pfn_glWindowPos4ivMESA fp_glWindowPos4ivMESA; +typedef void (APIENTRYP pfn_glWindowPos4sMESA) (GLshort, GLshort, GLshort, GLshort); +extern pfn_glWindowPos4sMESA fp_glWindowPos4sMESA; +typedef void (APIENTRYP pfn_glWindowPos4svMESA) (const GLshort*); +extern pfn_glWindowPos4svMESA fp_glWindowPos4svMESA; + + /* GL_MESA_ycbcr_texture */ +extern GLboolean GLAD_MESA_ycbcr_texture; +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 + + /* GL_MESAX_texture_stack */ +extern GLboolean GLAD_MESAX_texture_stack; +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E + + /* GL_NV_bindless_multi_draw_indirect */ +extern GLboolean GLAD_NV_bindless_multi_draw_indirect; +typedef void (APIENTRYP pfn_glMultiDrawArraysIndirectBindlessNV) (GLenum, const void*, GLsizei, GLsizei, GLint); +extern pfn_glMultiDrawArraysIndirectBindlessNV fp_glMultiDrawArraysIndirectBindlessNV; +typedef void (APIENTRYP pfn_glMultiDrawElementsIndirectBindlessNV) (GLenum, GLenum, const void*, GLsizei, GLsizei, GLint); +extern pfn_glMultiDrawElementsIndirectBindlessNV fp_glMultiDrawElementsIndirectBindlessNV; + + /* GL_NV_bindless_texture */ +extern GLboolean GLAD_NV_bindless_texture; +typedef GLuint64 (APIENTRYP pfn_glGetTextureHandleNV) (GLuint); +extern pfn_glGetTextureHandleNV fp_glGetTextureHandleNV; +typedef GLuint64 (APIENTRYP pfn_glGetTextureSamplerHandleNV) (GLuint, GLuint); +extern pfn_glGetTextureSamplerHandleNV fp_glGetTextureSamplerHandleNV; +typedef void (APIENTRYP pfn_glMakeTextureHandleResidentNV) (GLuint64); +extern pfn_glMakeTextureHandleResidentNV fp_glMakeTextureHandleResidentNV; +typedef void (APIENTRYP pfn_glMakeTextureHandleNonResidentNV) (GLuint64); +extern pfn_glMakeTextureHandleNonResidentNV fp_glMakeTextureHandleNonResidentNV; +typedef GLuint64 (APIENTRYP pfn_glGetImageHandleNV) (GLuint, GLint, GLboolean, GLint, GLenum); +extern pfn_glGetImageHandleNV fp_glGetImageHandleNV; +typedef void (APIENTRYP pfn_glMakeImageHandleResidentNV) (GLuint64, GLenum); +extern pfn_glMakeImageHandleResidentNV fp_glMakeImageHandleResidentNV; +typedef void (APIENTRYP pfn_glMakeImageHandleNonResidentNV) (GLuint64); +extern pfn_glMakeImageHandleNonResidentNV fp_glMakeImageHandleNonResidentNV; +typedef void (APIENTRYP pfn_glUniformHandleui64NV) (GLint, GLuint64); +extern pfn_glUniformHandleui64NV fp_glUniformHandleui64NV; +typedef void (APIENTRYP pfn_glUniformHandleui64vNV) (GLint, GLsizei, const GLuint64*); +extern pfn_glUniformHandleui64vNV fp_glUniformHandleui64vNV; +typedef void (APIENTRYP pfn_glProgramUniformHandleui64NV) (GLuint, GLint, GLuint64); +extern pfn_glProgramUniformHandleui64NV fp_glProgramUniformHandleui64NV; +typedef void (APIENTRYP pfn_glProgramUniformHandleui64vNV) (GLuint, GLint, GLsizei, const GLuint64*); +extern pfn_glProgramUniformHandleui64vNV fp_glProgramUniformHandleui64vNV; +typedef GLboolean (APIENTRYP pfn_glIsTextureHandleResidentNV) (GLuint64); +extern pfn_glIsTextureHandleResidentNV fp_glIsTextureHandleResidentNV; +typedef GLboolean (APIENTRYP pfn_glIsImageHandleResidentNV) (GLuint64); +extern pfn_glIsImageHandleResidentNV fp_glIsImageHandleResidentNV; + + /* GL_NV_blend_equation_advanced */ +extern GLboolean GLAD_NV_blend_equation_advanced; +#define GL_BLUE_NV 0x1905 +#define GL_GREEN_NV 0x1904 +#define GL_RED_NV 0x1903 +#define GL_XOR_NV 0x1506 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +typedef void (APIENTRYP pfn_glBlendParameteriNV) (GLenum, GLint); +extern pfn_glBlendParameteriNV fp_glBlendParameteriNV; +typedef void (APIENTRYP pfn_glBlendBarrierNV) (); +extern pfn_glBlendBarrierNV fp_glBlendBarrierNV; + + /* GL_NV_blend_equation_advanced_coherent */ +extern GLboolean GLAD_NV_blend_equation_advanced_coherent; +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 + + /* GL_NV_blend_square */ +extern GLboolean GLAD_NV_blend_square; + + /* GL_NV_compute_program5 */ +extern GLboolean GLAD_NV_compute_program5; +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC + + /* GL_NV_conditional_render */ +extern GLboolean GLAD_NV_conditional_render; +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (APIENTRYP pfn_glBeginConditionalRenderNV) (GLuint, GLenum); +extern pfn_glBeginConditionalRenderNV fp_glBeginConditionalRenderNV; +typedef void (APIENTRYP pfn_glEndConditionalRenderNV) (); +extern pfn_glEndConditionalRenderNV fp_glEndConditionalRenderNV; + + /* GL_NV_copy_buffer */ +extern GLboolean GLAD_NV_copy_buffer; +#define GL_COPY_READ_BUFFER_NV 0x8F36 +#define GL_COPY_WRITE_BUFFER_NV 0x8F37 +typedef void (APIENTRYP pfn_glCopyBufferSubDataNV) (GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr); +extern pfn_glCopyBufferSubDataNV fp_glCopyBufferSubDataNV; + + /* GL_NV_copy_depth_to_color */ +extern GLboolean GLAD_NV_copy_depth_to_color; +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F + + /* GL_NV_copy_image */ +extern GLboolean GLAD_NV_copy_image; +typedef void (APIENTRYP pfn_glCopyImageSubDataNV) (GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei); +extern pfn_glCopyImageSubDataNV fp_glCopyImageSubDataNV; + + /* GL_NV_coverage_sample */ +extern GLboolean GLAD_NV_coverage_sample; +#define GL_COVERAGE_COMPONENT_NV 0x8ED0 +#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 +#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 +#define GL_COVERAGE_BUFFERS_NV 0x8ED3 +#define GL_COVERAGE_SAMPLES_NV 0x8ED4 +#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 +#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 +#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 +#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000 +typedef void (APIENTRYP pfn_glCoverageMaskNV) (GLboolean); +extern pfn_glCoverageMaskNV fp_glCoverageMaskNV; +typedef void (APIENTRYP pfn_glCoverageOperationNV) (GLenum); +extern pfn_glCoverageOperationNV fp_glCoverageOperationNV; + + /* GL_NV_deep_texture3D */ +extern GLboolean GLAD_NV_deep_texture3D; +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 + + /* GL_NV_depth_buffer_float */ +extern GLboolean GLAD_NV_depth_buffer_float; +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +typedef void (APIENTRYP pfn_glDepthRangedNV) (GLdouble, GLdouble); +extern pfn_glDepthRangedNV fp_glDepthRangedNV; +typedef void (APIENTRYP pfn_glClearDepthdNV) (GLdouble); +extern pfn_glClearDepthdNV fp_glClearDepthdNV; +typedef void (APIENTRYP pfn_glDepthBoundsdNV) (GLdouble, GLdouble); +extern pfn_glDepthBoundsdNV fp_glDepthBoundsdNV; + + /* GL_NV_depth_clamp */ +extern GLboolean GLAD_NV_depth_clamp; +#define GL_DEPTH_CLAMP_NV 0x864F + + /* GL_NV_depth_nonlinear */ +extern GLboolean GLAD_NV_depth_nonlinear; +#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C + + /* GL_NV_draw_buffers */ +extern GLboolean GLAD_NV_draw_buffers; +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF +typedef void (APIENTRYP pfn_glDrawBuffersNV) (GLsizei, const GLenum*); +extern pfn_glDrawBuffersNV fp_glDrawBuffersNV; + + /* GL_NV_draw_instanced */ +extern GLboolean GLAD_NV_draw_instanced; +typedef void (APIENTRYP pfn_glDrawArraysInstancedNV) (GLenum, GLint, GLsizei, GLsizei); +extern pfn_glDrawArraysInstancedNV fp_glDrawArraysInstancedNV; +typedef void (APIENTRYP pfn_glDrawElementsInstancedNV) (GLenum, GLsizei, GLenum, const void*, GLsizei); +extern pfn_glDrawElementsInstancedNV fp_glDrawElementsInstancedNV; + + /* GL_NV_draw_texture */ +extern GLboolean GLAD_NV_draw_texture; +typedef void (APIENTRYP pfn_glDrawTextureNV) (GLuint, GLuint, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glDrawTextureNV fp_glDrawTextureNV; + + /* GL_NV_evaluators */ +extern GLboolean GLAD_NV_evaluators; +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +typedef void (APIENTRYP pfn_glMapControlPointsNV) (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLint, GLint, GLboolean, const void*); +extern pfn_glMapControlPointsNV fp_glMapControlPointsNV; +typedef void (APIENTRYP pfn_glMapParameterivNV) (GLenum, GLenum, const GLint*); +extern pfn_glMapParameterivNV fp_glMapParameterivNV; +typedef void (APIENTRYP pfn_glMapParameterfvNV) (GLenum, GLenum, const GLfloat*); +extern pfn_glMapParameterfvNV fp_glMapParameterfvNV; +typedef void (APIENTRYP pfn_glGetMapControlPointsNV) (GLenum, GLuint, GLenum, GLsizei, GLsizei, GLboolean, void*); +extern pfn_glGetMapControlPointsNV fp_glGetMapControlPointsNV; +typedef void (APIENTRYP pfn_glGetMapParameterivNV) (GLenum, GLenum, GLint*); +extern pfn_glGetMapParameterivNV fp_glGetMapParameterivNV; +typedef void (APIENTRYP pfn_glGetMapParameterfvNV) (GLenum, GLenum, GLfloat*); +extern pfn_glGetMapParameterfvNV fp_glGetMapParameterfvNV; +typedef void (APIENTRYP pfn_glGetMapAttribParameterivNV) (GLenum, GLuint, GLenum, GLint*); +extern pfn_glGetMapAttribParameterivNV fp_glGetMapAttribParameterivNV; +typedef void (APIENTRYP pfn_glGetMapAttribParameterfvNV) (GLenum, GLuint, GLenum, GLfloat*); +extern pfn_glGetMapAttribParameterfvNV fp_glGetMapAttribParameterfvNV; +typedef void (APIENTRYP pfn_glEvalMapsNV) (GLenum, GLenum); +extern pfn_glEvalMapsNV fp_glEvalMapsNV; + + /* GL_NV_explicit_attrib_location */ +extern GLboolean GLAD_NV_explicit_attrib_location; + + /* GL_NV_explicit_multisample */ +extern GLboolean GLAD_NV_explicit_multisample; +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +typedef void (APIENTRYP pfn_glGetMultisamplefvNV) (GLenum, GLuint, GLfloat*); +extern pfn_glGetMultisamplefvNV fp_glGetMultisamplefvNV; +typedef void (APIENTRYP pfn_glSampleMaskIndexedNV) (GLuint, GLbitfield); +extern pfn_glSampleMaskIndexedNV fp_glSampleMaskIndexedNV; +typedef void (APIENTRYP pfn_glTexRenderbufferNV) (GLenum, GLuint); +extern pfn_glTexRenderbufferNV fp_glTexRenderbufferNV; + + /* GL_NV_fbo_color_attachments */ +extern GLboolean GLAD_NV_fbo_color_attachments; +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF + + /* GL_NV_fence */ +extern GLboolean GLAD_NV_fence; +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (APIENTRYP pfn_glDeleteFencesNV) (GLsizei, const GLuint*); +extern pfn_glDeleteFencesNV fp_glDeleteFencesNV; +typedef void (APIENTRYP pfn_glGenFencesNV) (GLsizei, GLuint*); +extern pfn_glGenFencesNV fp_glGenFencesNV; +typedef GLboolean (APIENTRYP pfn_glIsFenceNV) (GLuint); +extern pfn_glIsFenceNV fp_glIsFenceNV; +typedef GLboolean (APIENTRYP pfn_glTestFenceNV) (GLuint); +extern pfn_glTestFenceNV fp_glTestFenceNV; +typedef void (APIENTRYP pfn_glGetFenceivNV) (GLuint, GLenum, GLint*); +extern pfn_glGetFenceivNV fp_glGetFenceivNV; +typedef void (APIENTRYP pfn_glFinishFenceNV) (GLuint); +extern pfn_glFinishFenceNV fp_glFinishFenceNV; +typedef void (APIENTRYP pfn_glSetFenceNV) (GLuint, GLenum); +extern pfn_glSetFenceNV fp_glSetFenceNV; + + /* GL_NV_float_buffer */ +extern GLboolean GLAD_NV_float_buffer; +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + + /* GL_NV_fog_distance */ +extern GLboolean GLAD_NV_fog_distance; +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C + + /* GL_NV_fragment_program */ +extern GLboolean GLAD_NV_fragment_program; +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +typedef void (APIENTRYP pfn_glProgramNamedParameter4fNV) (GLuint, GLsizei, const GLubyte*, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glProgramNamedParameter4fNV fp_glProgramNamedParameter4fNV; +typedef void (APIENTRYP pfn_glProgramNamedParameter4fvNV) (GLuint, GLsizei, const GLubyte*, const GLfloat*); +extern pfn_glProgramNamedParameter4fvNV fp_glProgramNamedParameter4fvNV; +typedef void (APIENTRYP pfn_glProgramNamedParameter4dNV) (GLuint, GLsizei, const GLubyte*, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glProgramNamedParameter4dNV fp_glProgramNamedParameter4dNV; +typedef void (APIENTRYP pfn_glProgramNamedParameter4dvNV) (GLuint, GLsizei, const GLubyte*, const GLdouble*); +extern pfn_glProgramNamedParameter4dvNV fp_glProgramNamedParameter4dvNV; +typedef void (APIENTRYP pfn_glGetProgramNamedParameterfvNV) (GLuint, GLsizei, const GLubyte*, GLfloat*); +extern pfn_glGetProgramNamedParameterfvNV fp_glGetProgramNamedParameterfvNV; +typedef void (APIENTRYP pfn_glGetProgramNamedParameterdvNV) (GLuint, GLsizei, const GLubyte*, GLdouble*); +extern pfn_glGetProgramNamedParameterdvNV fp_glGetProgramNamedParameterdvNV; + + /* GL_NV_fragment_program2 */ +extern GLboolean GLAD_NV_fragment_program2; +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + + /* GL_NV_fragment_program4 */ +extern GLboolean GLAD_NV_fragment_program4; + + /* GL_NV_fragment_program_option */ +extern GLboolean GLAD_NV_fragment_program_option; + + /* GL_NV_framebuffer_blit */ +extern GLboolean GLAD_NV_framebuffer_blit; +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA +typedef void (APIENTRYP pfn_glBlitFramebufferNV) (GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum); +extern pfn_glBlitFramebufferNV fp_glBlitFramebufferNV; + + /* GL_NV_framebuffer_multisample */ +extern GLboolean GLAD_NV_framebuffer_multisample; +#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 +#define GL_MAX_SAMPLES_NV 0x8D57 +typedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleNV) (GLenum, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorageMultisampleNV fp_glRenderbufferStorageMultisampleNV; + + /* GL_NV_framebuffer_multisample_coverage */ +extern GLboolean GLAD_NV_framebuffer_multisample_coverage; +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +typedef void (APIENTRYP pfn_glRenderbufferStorageMultisampleCoverageNV) (GLenum, GLsizei, GLsizei, GLenum, GLsizei, GLsizei); +extern pfn_glRenderbufferStorageMultisampleCoverageNV fp_glRenderbufferStorageMultisampleCoverageNV; + + /* GL_NV_generate_mipmap_sRGB */ +extern GLboolean GLAD_NV_generate_mipmap_sRGB; + + /* GL_NV_geometry_program4 */ +extern GLboolean GLAD_NV_geometry_program4; +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +typedef void (APIENTRYP pfn_glProgramVertexLimitNV) (GLenum, GLint); +extern pfn_glProgramVertexLimitNV fp_glProgramVertexLimitNV; +typedef void (APIENTRYP pfn_glFramebufferTextureEXT) (GLenum, GLenum, GLuint, GLint); +extern pfn_glFramebufferTextureEXT fp_glFramebufferTextureEXT; +typedef void (APIENTRYP pfn_glFramebufferTextureLayerEXT) (GLenum, GLenum, GLuint, GLint, GLint); +extern pfn_glFramebufferTextureLayerEXT fp_glFramebufferTextureLayerEXT; +typedef void (APIENTRYP pfn_glFramebufferTextureFaceEXT) (GLenum, GLenum, GLuint, GLint, GLenum); +extern pfn_glFramebufferTextureFaceEXT fp_glFramebufferTextureFaceEXT; + + /* GL_NV_geometry_shader4 */ +extern GLboolean GLAD_NV_geometry_shader4; + + /* GL_NV_gpu_program4 */ +extern GLboolean GLAD_NV_gpu_program4; +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +typedef void (APIENTRYP pfn_glProgramLocalParameterI4iNV) (GLenum, GLuint, GLint, GLint, GLint, GLint); +extern pfn_glProgramLocalParameterI4iNV fp_glProgramLocalParameterI4iNV; +typedef void (APIENTRYP pfn_glProgramLocalParameterI4ivNV) (GLenum, GLuint, const GLint*); +extern pfn_glProgramLocalParameterI4ivNV fp_glProgramLocalParameterI4ivNV; +typedef void (APIENTRYP pfn_glProgramLocalParametersI4ivNV) (GLenum, GLuint, GLsizei, const GLint*); +extern pfn_glProgramLocalParametersI4ivNV fp_glProgramLocalParametersI4ivNV; +typedef void (APIENTRYP pfn_glProgramLocalParameterI4uiNV) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glProgramLocalParameterI4uiNV fp_glProgramLocalParameterI4uiNV; +typedef void (APIENTRYP pfn_glProgramLocalParameterI4uivNV) (GLenum, GLuint, const GLuint*); +extern pfn_glProgramLocalParameterI4uivNV fp_glProgramLocalParameterI4uivNV; +typedef void (APIENTRYP pfn_glProgramLocalParametersI4uivNV) (GLenum, GLuint, GLsizei, const GLuint*); +extern pfn_glProgramLocalParametersI4uivNV fp_glProgramLocalParametersI4uivNV; +typedef void (APIENTRYP pfn_glProgramEnvParameterI4iNV) (GLenum, GLuint, GLint, GLint, GLint, GLint); +extern pfn_glProgramEnvParameterI4iNV fp_glProgramEnvParameterI4iNV; +typedef void (APIENTRYP pfn_glProgramEnvParameterI4ivNV) (GLenum, GLuint, const GLint*); +extern pfn_glProgramEnvParameterI4ivNV fp_glProgramEnvParameterI4ivNV; +typedef void (APIENTRYP pfn_glProgramEnvParametersI4ivNV) (GLenum, GLuint, GLsizei, const GLint*); +extern pfn_glProgramEnvParametersI4ivNV fp_glProgramEnvParametersI4ivNV; +typedef void (APIENTRYP pfn_glProgramEnvParameterI4uiNV) (GLenum, GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glProgramEnvParameterI4uiNV fp_glProgramEnvParameterI4uiNV; +typedef void (APIENTRYP pfn_glProgramEnvParameterI4uivNV) (GLenum, GLuint, const GLuint*); +extern pfn_glProgramEnvParameterI4uivNV fp_glProgramEnvParameterI4uivNV; +typedef void (APIENTRYP pfn_glProgramEnvParametersI4uivNV) (GLenum, GLuint, GLsizei, const GLuint*); +extern pfn_glProgramEnvParametersI4uivNV fp_glProgramEnvParametersI4uivNV; +typedef void (APIENTRYP pfn_glGetProgramLocalParameterIivNV) (GLenum, GLuint, GLint*); +extern pfn_glGetProgramLocalParameterIivNV fp_glGetProgramLocalParameterIivNV; +typedef void (APIENTRYP pfn_glGetProgramLocalParameterIuivNV) (GLenum, GLuint, GLuint*); +extern pfn_glGetProgramLocalParameterIuivNV fp_glGetProgramLocalParameterIuivNV; +typedef void (APIENTRYP pfn_glGetProgramEnvParameterIivNV) (GLenum, GLuint, GLint*); +extern pfn_glGetProgramEnvParameterIivNV fp_glGetProgramEnvParameterIivNV; +typedef void (APIENTRYP pfn_glGetProgramEnvParameterIuivNV) (GLenum, GLuint, GLuint*); +extern pfn_glGetProgramEnvParameterIuivNV fp_glGetProgramEnvParameterIuivNV; + + /* GL_NV_gpu_program5 */ +extern GLboolean GLAD_NV_gpu_program5; +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +typedef void (APIENTRYP pfn_glProgramSubroutineParametersuivNV) (GLenum, GLsizei, const GLuint*); +extern pfn_glProgramSubroutineParametersuivNV fp_glProgramSubroutineParametersuivNV; +typedef void (APIENTRYP pfn_glGetProgramSubroutineParameteruivNV) (GLenum, GLuint, GLuint*); +extern pfn_glGetProgramSubroutineParameteruivNV fp_glGetProgramSubroutineParameteruivNV; + + /* GL_NV_gpu_program5_mem_extended */ +extern GLboolean GLAD_NV_gpu_program5_mem_extended; + + /* GL_NV_gpu_shader5 */ +extern GLboolean GLAD_NV_gpu_shader5; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +typedef void (APIENTRYP pfn_glUniform1i64NV) (GLint, GLint64EXT); +extern pfn_glUniform1i64NV fp_glUniform1i64NV; +typedef void (APIENTRYP pfn_glUniform2i64NV) (GLint, GLint64EXT, GLint64EXT); +extern pfn_glUniform2i64NV fp_glUniform2i64NV; +typedef void (APIENTRYP pfn_glUniform3i64NV) (GLint, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glUniform3i64NV fp_glUniform3i64NV; +typedef void (APIENTRYP pfn_glUniform4i64NV) (GLint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glUniform4i64NV fp_glUniform4i64NV; +typedef void (APIENTRYP pfn_glUniform1i64vNV) (GLint, GLsizei, const GLint64EXT*); +extern pfn_glUniform1i64vNV fp_glUniform1i64vNV; +typedef void (APIENTRYP pfn_glUniform2i64vNV) (GLint, GLsizei, const GLint64EXT*); +extern pfn_glUniform2i64vNV fp_glUniform2i64vNV; +typedef void (APIENTRYP pfn_glUniform3i64vNV) (GLint, GLsizei, const GLint64EXT*); +extern pfn_glUniform3i64vNV fp_glUniform3i64vNV; +typedef void (APIENTRYP pfn_glUniform4i64vNV) (GLint, GLsizei, const GLint64EXT*); +extern pfn_glUniform4i64vNV fp_glUniform4i64vNV; +typedef void (APIENTRYP pfn_glUniform1ui64NV) (GLint, GLuint64EXT); +extern pfn_glUniform1ui64NV fp_glUniform1ui64NV; +typedef void (APIENTRYP pfn_glUniform2ui64NV) (GLint, GLuint64EXT, GLuint64EXT); +extern pfn_glUniform2ui64NV fp_glUniform2ui64NV; +typedef void (APIENTRYP pfn_glUniform3ui64NV) (GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glUniform3ui64NV fp_glUniform3ui64NV; +typedef void (APIENTRYP pfn_glUniform4ui64NV) (GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glUniform4ui64NV fp_glUniform4ui64NV; +typedef void (APIENTRYP pfn_glUniform1ui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniform1ui64vNV fp_glUniform1ui64vNV; +typedef void (APIENTRYP pfn_glUniform2ui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniform2ui64vNV fp_glUniform2ui64vNV; +typedef void (APIENTRYP pfn_glUniform3ui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniform3ui64vNV fp_glUniform3ui64vNV; +typedef void (APIENTRYP pfn_glUniform4ui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniform4ui64vNV fp_glUniform4ui64vNV; +typedef void (APIENTRYP pfn_glGetUniformi64vNV) (GLuint, GLint, GLint64EXT*); +extern pfn_glGetUniformi64vNV fp_glGetUniformi64vNV; +typedef void (APIENTRYP pfn_glProgramUniform1i64NV) (GLuint, GLint, GLint64EXT); +extern pfn_glProgramUniform1i64NV fp_glProgramUniform1i64NV; +typedef void (APIENTRYP pfn_glProgramUniform2i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT); +extern pfn_glProgramUniform2i64NV fp_glProgramUniform2i64NV; +typedef void (APIENTRYP pfn_glProgramUniform3i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glProgramUniform3i64NV fp_glProgramUniform3i64NV; +typedef void (APIENTRYP pfn_glProgramUniform4i64NV) (GLuint, GLint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glProgramUniform4i64NV fp_glProgramUniform4i64NV; +typedef void (APIENTRYP pfn_glProgramUniform1i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); +extern pfn_glProgramUniform1i64vNV fp_glProgramUniform1i64vNV; +typedef void (APIENTRYP pfn_glProgramUniform2i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); +extern pfn_glProgramUniform2i64vNV fp_glProgramUniform2i64vNV; +typedef void (APIENTRYP pfn_glProgramUniform3i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); +extern pfn_glProgramUniform3i64vNV fp_glProgramUniform3i64vNV; +typedef void (APIENTRYP pfn_glProgramUniform4i64vNV) (GLuint, GLint, GLsizei, const GLint64EXT*); +extern pfn_glProgramUniform4i64vNV fp_glProgramUniform4i64vNV; +typedef void (APIENTRYP pfn_glProgramUniform1ui64NV) (GLuint, GLint, GLuint64EXT); +extern pfn_glProgramUniform1ui64NV fp_glProgramUniform1ui64NV; +typedef void (APIENTRYP pfn_glProgramUniform2ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT); +extern pfn_glProgramUniform2ui64NV fp_glProgramUniform2ui64NV; +typedef void (APIENTRYP pfn_glProgramUniform3ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glProgramUniform3ui64NV fp_glProgramUniform3ui64NV; +typedef void (APIENTRYP pfn_glProgramUniform4ui64NV) (GLuint, GLint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glProgramUniform4ui64NV fp_glProgramUniform4ui64NV; +typedef void (APIENTRYP pfn_glProgramUniform1ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniform1ui64vNV fp_glProgramUniform1ui64vNV; +typedef void (APIENTRYP pfn_glProgramUniform2ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniform2ui64vNV fp_glProgramUniform2ui64vNV; +typedef void (APIENTRYP pfn_glProgramUniform3ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniform3ui64vNV fp_glProgramUniform3ui64vNV; +typedef void (APIENTRYP pfn_glProgramUniform4ui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniform4ui64vNV fp_glProgramUniform4ui64vNV; + + /* GL_NV_half_float */ +extern GLboolean GLAD_NV_half_float; +#define GL_HALF_FLOAT_NV 0x140B +typedef void (APIENTRYP pfn_glVertex2hNV) (GLhalfNV, GLhalfNV); +extern pfn_glVertex2hNV fp_glVertex2hNV; +typedef void (APIENTRYP pfn_glVertex2hvNV) (const GLhalfNV*); +extern pfn_glVertex2hvNV fp_glVertex2hvNV; +typedef void (APIENTRYP pfn_glVertex3hNV) (GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glVertex3hNV fp_glVertex3hNV; +typedef void (APIENTRYP pfn_glVertex3hvNV) (const GLhalfNV*); +extern pfn_glVertex3hvNV fp_glVertex3hvNV; +typedef void (APIENTRYP pfn_glVertex4hNV) (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glVertex4hNV fp_glVertex4hNV; +typedef void (APIENTRYP pfn_glVertex4hvNV) (const GLhalfNV*); +extern pfn_glVertex4hvNV fp_glVertex4hvNV; +typedef void (APIENTRYP pfn_glNormal3hNV) (GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glNormal3hNV fp_glNormal3hNV; +typedef void (APIENTRYP pfn_glNormal3hvNV) (const GLhalfNV*); +extern pfn_glNormal3hvNV fp_glNormal3hvNV; +typedef void (APIENTRYP pfn_glColor3hNV) (GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glColor3hNV fp_glColor3hNV; +typedef void (APIENTRYP pfn_glColor3hvNV) (const GLhalfNV*); +extern pfn_glColor3hvNV fp_glColor3hvNV; +typedef void (APIENTRYP pfn_glColor4hNV) (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glColor4hNV fp_glColor4hNV; +typedef void (APIENTRYP pfn_glColor4hvNV) (const GLhalfNV*); +extern pfn_glColor4hvNV fp_glColor4hvNV; +typedef void (APIENTRYP pfn_glTexCoord1hNV) (GLhalfNV); +extern pfn_glTexCoord1hNV fp_glTexCoord1hNV; +typedef void (APIENTRYP pfn_glTexCoord1hvNV) (const GLhalfNV*); +extern pfn_glTexCoord1hvNV fp_glTexCoord1hvNV; +typedef void (APIENTRYP pfn_glTexCoord2hNV) (GLhalfNV, GLhalfNV); +extern pfn_glTexCoord2hNV fp_glTexCoord2hNV; +typedef void (APIENTRYP pfn_glTexCoord2hvNV) (const GLhalfNV*); +extern pfn_glTexCoord2hvNV fp_glTexCoord2hvNV; +typedef void (APIENTRYP pfn_glTexCoord3hNV) (GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glTexCoord3hNV fp_glTexCoord3hNV; +typedef void (APIENTRYP pfn_glTexCoord3hvNV) (const GLhalfNV*); +extern pfn_glTexCoord3hvNV fp_glTexCoord3hvNV; +typedef void (APIENTRYP pfn_glTexCoord4hNV) (GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glTexCoord4hNV fp_glTexCoord4hNV; +typedef void (APIENTRYP pfn_glTexCoord4hvNV) (const GLhalfNV*); +extern pfn_glTexCoord4hvNV fp_glTexCoord4hvNV; +typedef void (APIENTRYP pfn_glMultiTexCoord1hNV) (GLenum, GLhalfNV); +extern pfn_glMultiTexCoord1hNV fp_glMultiTexCoord1hNV; +typedef void (APIENTRYP pfn_glMultiTexCoord1hvNV) (GLenum, const GLhalfNV*); +extern pfn_glMultiTexCoord1hvNV fp_glMultiTexCoord1hvNV; +typedef void (APIENTRYP pfn_glMultiTexCoord2hNV) (GLenum, GLhalfNV, GLhalfNV); +extern pfn_glMultiTexCoord2hNV fp_glMultiTexCoord2hNV; +typedef void (APIENTRYP pfn_glMultiTexCoord2hvNV) (GLenum, const GLhalfNV*); +extern pfn_glMultiTexCoord2hvNV fp_glMultiTexCoord2hvNV; +typedef void (APIENTRYP pfn_glMultiTexCoord3hNV) (GLenum, GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glMultiTexCoord3hNV fp_glMultiTexCoord3hNV; +typedef void (APIENTRYP pfn_glMultiTexCoord3hvNV) (GLenum, const GLhalfNV*); +extern pfn_glMultiTexCoord3hvNV fp_glMultiTexCoord3hvNV; +typedef void (APIENTRYP pfn_glMultiTexCoord4hNV) (GLenum, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glMultiTexCoord4hNV fp_glMultiTexCoord4hNV; +typedef void (APIENTRYP pfn_glMultiTexCoord4hvNV) (GLenum, const GLhalfNV*); +extern pfn_glMultiTexCoord4hvNV fp_glMultiTexCoord4hvNV; +typedef void (APIENTRYP pfn_glFogCoordhNV) (GLhalfNV); +extern pfn_glFogCoordhNV fp_glFogCoordhNV; +typedef void (APIENTRYP pfn_glFogCoordhvNV) (const GLhalfNV*); +extern pfn_glFogCoordhvNV fp_glFogCoordhvNV; +typedef void (APIENTRYP pfn_glSecondaryColor3hNV) (GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glSecondaryColor3hNV fp_glSecondaryColor3hNV; +typedef void (APIENTRYP pfn_glSecondaryColor3hvNV) (const GLhalfNV*); +extern pfn_glSecondaryColor3hvNV fp_glSecondaryColor3hvNV; +typedef void (APIENTRYP pfn_glVertexWeighthNV) (GLhalfNV); +extern pfn_glVertexWeighthNV fp_glVertexWeighthNV; +typedef void (APIENTRYP pfn_glVertexWeighthvNV) (const GLhalfNV*); +extern pfn_glVertexWeighthvNV fp_glVertexWeighthvNV; +typedef void (APIENTRYP pfn_glVertexAttrib1hNV) (GLuint, GLhalfNV); +extern pfn_glVertexAttrib1hNV fp_glVertexAttrib1hNV; +typedef void (APIENTRYP pfn_glVertexAttrib1hvNV) (GLuint, const GLhalfNV*); +extern pfn_glVertexAttrib1hvNV fp_glVertexAttrib1hvNV; +typedef void (APIENTRYP pfn_glVertexAttrib2hNV) (GLuint, GLhalfNV, GLhalfNV); +extern pfn_glVertexAttrib2hNV fp_glVertexAttrib2hNV; +typedef void (APIENTRYP pfn_glVertexAttrib2hvNV) (GLuint, const GLhalfNV*); +extern pfn_glVertexAttrib2hvNV fp_glVertexAttrib2hvNV; +typedef void (APIENTRYP pfn_glVertexAttrib3hNV) (GLuint, GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glVertexAttrib3hNV fp_glVertexAttrib3hNV; +typedef void (APIENTRYP pfn_glVertexAttrib3hvNV) (GLuint, const GLhalfNV*); +extern pfn_glVertexAttrib3hvNV fp_glVertexAttrib3hvNV; +typedef void (APIENTRYP pfn_glVertexAttrib4hNV) (GLuint, GLhalfNV, GLhalfNV, GLhalfNV, GLhalfNV); +extern pfn_glVertexAttrib4hNV fp_glVertexAttrib4hNV; +typedef void (APIENTRYP pfn_glVertexAttrib4hvNV) (GLuint, const GLhalfNV*); +extern pfn_glVertexAttrib4hvNV fp_glVertexAttrib4hvNV; +typedef void (APIENTRYP pfn_glVertexAttribs1hvNV) (GLuint, GLsizei, const GLhalfNV*); +extern pfn_glVertexAttribs1hvNV fp_glVertexAttribs1hvNV; +typedef void (APIENTRYP pfn_glVertexAttribs2hvNV) (GLuint, GLsizei, const GLhalfNV*); +extern pfn_glVertexAttribs2hvNV fp_glVertexAttribs2hvNV; +typedef void (APIENTRYP pfn_glVertexAttribs3hvNV) (GLuint, GLsizei, const GLhalfNV*); +extern pfn_glVertexAttribs3hvNV fp_glVertexAttribs3hvNV; +typedef void (APIENTRYP pfn_glVertexAttribs4hvNV) (GLuint, GLsizei, const GLhalfNV*); +extern pfn_glVertexAttribs4hvNV fp_glVertexAttribs4hvNV; + + /* GL_NV_instanced_arrays */ +extern GLboolean GLAD_NV_instanced_arrays; +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE +typedef void (APIENTRYP pfn_glVertexAttribDivisorNV) (GLuint, GLuint); +extern pfn_glVertexAttribDivisorNV fp_glVertexAttribDivisorNV; + + /* GL_NV_light_max_exponent */ +extern GLboolean GLAD_NV_light_max_exponent; +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + + /* GL_NV_multisample_coverage */ +extern GLboolean GLAD_NV_multisample_coverage; +#define GL_COLOR_SAMPLES_NV 0x8E20 + + /* GL_NV_multisample_filter_hint */ +extern GLboolean GLAD_NV_multisample_filter_hint; +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 + + /* GL_NV_non_square_matrices */ +extern GLboolean GLAD_NV_non_square_matrices; +#define GL_FLOAT_MAT2x3_NV 0x8B65 +#define GL_FLOAT_MAT2x4_NV 0x8B66 +#define GL_FLOAT_MAT3x2_NV 0x8B67 +#define GL_FLOAT_MAT3x4_NV 0x8B68 +#define GL_FLOAT_MAT4x2_NV 0x8B69 +#define GL_FLOAT_MAT4x3_NV 0x8B6A +typedef void (APIENTRYP pfn_glUniformMatrix2x3fvNV) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix2x3fvNV fp_glUniformMatrix2x3fvNV; +typedef void (APIENTRYP pfn_glUniformMatrix3x2fvNV) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix3x2fvNV fp_glUniformMatrix3x2fvNV; +typedef void (APIENTRYP pfn_glUniformMatrix2x4fvNV) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix2x4fvNV fp_glUniformMatrix2x4fvNV; +typedef void (APIENTRYP pfn_glUniformMatrix4x2fvNV) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix4x2fvNV fp_glUniformMatrix4x2fvNV; +typedef void (APIENTRYP pfn_glUniformMatrix3x4fvNV) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix3x4fvNV fp_glUniformMatrix3x4fvNV; +typedef void (APIENTRYP pfn_glUniformMatrix4x3fvNV) (GLint, GLsizei, GLboolean, const GLfloat*); +extern pfn_glUniformMatrix4x3fvNV fp_glUniformMatrix4x3fvNV; + + /* GL_NV_occlusion_query */ +extern GLboolean GLAD_NV_occlusion_query; +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +typedef void (APIENTRYP pfn_glGenOcclusionQueriesNV) (GLsizei, GLuint*); +extern pfn_glGenOcclusionQueriesNV fp_glGenOcclusionQueriesNV; +typedef void (APIENTRYP pfn_glDeleteOcclusionQueriesNV) (GLsizei, const GLuint*); +extern pfn_glDeleteOcclusionQueriesNV fp_glDeleteOcclusionQueriesNV; +typedef GLboolean (APIENTRYP pfn_glIsOcclusionQueryNV) (GLuint); +extern pfn_glIsOcclusionQueryNV fp_glIsOcclusionQueryNV; +typedef void (APIENTRYP pfn_glBeginOcclusionQueryNV) (GLuint); +extern pfn_glBeginOcclusionQueryNV fp_glBeginOcclusionQueryNV; +typedef void (APIENTRYP pfn_glEndOcclusionQueryNV) (); +extern pfn_glEndOcclusionQueryNV fp_glEndOcclusionQueryNV; +typedef void (APIENTRYP pfn_glGetOcclusionQueryivNV) (GLuint, GLenum, GLint*); +extern pfn_glGetOcclusionQueryivNV fp_glGetOcclusionQueryivNV; +typedef void (APIENTRYP pfn_glGetOcclusionQueryuivNV) (GLuint, GLenum, GLuint*); +extern pfn_glGetOcclusionQueryuivNV fp_glGetOcclusionQueryuivNV; + + /* GL_NV_packed_depth_stencil */ +extern GLboolean GLAD_NV_packed_depth_stencil; +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA + + /* GL_NV_parameter_buffer_object */ +extern GLboolean GLAD_NV_parameter_buffer_object; +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +typedef void (APIENTRYP pfn_glProgramBufferParametersfvNV) (GLenum, GLuint, GLuint, GLsizei, const GLfloat*); +extern pfn_glProgramBufferParametersfvNV fp_glProgramBufferParametersfvNV; +typedef void (APIENTRYP pfn_glProgramBufferParametersIivNV) (GLenum, GLuint, GLuint, GLsizei, const GLint*); +extern pfn_glProgramBufferParametersIivNV fp_glProgramBufferParametersIivNV; +typedef void (APIENTRYP pfn_glProgramBufferParametersIuivNV) (GLenum, GLuint, GLuint, GLsizei, const GLuint*); +extern pfn_glProgramBufferParametersIuivNV fp_glProgramBufferParametersIuivNV; + + /* GL_NV_parameter_buffer_object2 */ +extern GLboolean GLAD_NV_parameter_buffer_object2; + + /* GL_NV_path_rendering */ +extern GLboolean GLAD_NV_path_rendering; +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_BOLD_BIT_NV 0x01 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +typedef GLuint (APIENTRYP pfn_glGenPathsNV) (GLsizei); +extern pfn_glGenPathsNV fp_glGenPathsNV; +typedef void (APIENTRYP pfn_glDeletePathsNV) (GLuint, GLsizei); +extern pfn_glDeletePathsNV fp_glDeletePathsNV; +typedef GLboolean (APIENTRYP pfn_glIsPathNV) (GLuint); +extern pfn_glIsPathNV fp_glIsPathNV; +typedef void (APIENTRYP pfn_glPathCommandsNV) (GLuint, GLsizei, const GLubyte*, GLsizei, GLenum, const void*); +extern pfn_glPathCommandsNV fp_glPathCommandsNV; +typedef void (APIENTRYP pfn_glPathCoordsNV) (GLuint, GLsizei, GLenum, const void*); +extern pfn_glPathCoordsNV fp_glPathCoordsNV; +typedef void (APIENTRYP pfn_glPathSubCommandsNV) (GLuint, GLsizei, GLsizei, GLsizei, const GLubyte*, GLsizei, GLenum, const void*); +extern pfn_glPathSubCommandsNV fp_glPathSubCommandsNV; +typedef void (APIENTRYP pfn_glPathSubCoordsNV) (GLuint, GLsizei, GLsizei, GLenum, const void*); +extern pfn_glPathSubCoordsNV fp_glPathSubCoordsNV; +typedef void (APIENTRYP pfn_glPathStringNV) (GLuint, GLenum, GLsizei, const void*); +extern pfn_glPathStringNV fp_glPathStringNV; +typedef void (APIENTRYP pfn_glPathGlyphsNV) (GLuint, GLenum, const void*, GLbitfield, GLsizei, GLenum, const void*, GLenum, GLuint, GLfloat); +extern pfn_glPathGlyphsNV fp_glPathGlyphsNV; +typedef void (APIENTRYP pfn_glPathGlyphRangeNV) (GLuint, GLenum, const void*, GLbitfield, GLuint, GLsizei, GLenum, GLuint, GLfloat); +extern pfn_glPathGlyphRangeNV fp_glPathGlyphRangeNV; +typedef void (APIENTRYP pfn_glWeightPathsNV) (GLuint, GLsizei, const GLuint*, const GLfloat*); +extern pfn_glWeightPathsNV fp_glWeightPathsNV; +typedef void (APIENTRYP pfn_glCopyPathNV) (GLuint, GLuint); +extern pfn_glCopyPathNV fp_glCopyPathNV; +typedef void (APIENTRYP pfn_glInterpolatePathsNV) (GLuint, GLuint, GLuint, GLfloat); +extern pfn_glInterpolatePathsNV fp_glInterpolatePathsNV; +typedef void (APIENTRYP pfn_glTransformPathNV) (GLuint, GLuint, GLenum, const GLfloat*); +extern pfn_glTransformPathNV fp_glTransformPathNV; +typedef void (APIENTRYP pfn_glPathParameterivNV) (GLuint, GLenum, const GLint*); +extern pfn_glPathParameterivNV fp_glPathParameterivNV; +typedef void (APIENTRYP pfn_glPathParameteriNV) (GLuint, GLenum, GLint); +extern pfn_glPathParameteriNV fp_glPathParameteriNV; +typedef void (APIENTRYP pfn_glPathParameterfvNV) (GLuint, GLenum, const GLfloat*); +extern pfn_glPathParameterfvNV fp_glPathParameterfvNV; +typedef void (APIENTRYP pfn_glPathParameterfNV) (GLuint, GLenum, GLfloat); +extern pfn_glPathParameterfNV fp_glPathParameterfNV; +typedef void (APIENTRYP pfn_glPathDashArrayNV) (GLuint, GLsizei, const GLfloat*); +extern pfn_glPathDashArrayNV fp_glPathDashArrayNV; +typedef void (APIENTRYP pfn_glPathStencilFuncNV) (GLenum, GLint, GLuint); +extern pfn_glPathStencilFuncNV fp_glPathStencilFuncNV; +typedef void (APIENTRYP pfn_glPathStencilDepthOffsetNV) (GLfloat, GLfloat); +extern pfn_glPathStencilDepthOffsetNV fp_glPathStencilDepthOffsetNV; +typedef void (APIENTRYP pfn_glStencilFillPathNV) (GLuint, GLenum, GLuint); +extern pfn_glStencilFillPathNV fp_glStencilFillPathNV; +typedef void (APIENTRYP pfn_glStencilStrokePathNV) (GLuint, GLint, GLuint); +extern pfn_glStencilStrokePathNV fp_glStencilStrokePathNV; +typedef void (APIENTRYP pfn_glStencilFillPathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLenum, GLuint, GLenum, const GLfloat*); +extern pfn_glStencilFillPathInstancedNV fp_glStencilFillPathInstancedNV; +typedef void (APIENTRYP pfn_glStencilStrokePathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLint, GLuint, GLenum, const GLfloat*); +extern pfn_glStencilStrokePathInstancedNV fp_glStencilStrokePathInstancedNV; +typedef void (APIENTRYP pfn_glPathCoverDepthFuncNV) (GLenum); +extern pfn_glPathCoverDepthFuncNV fp_glPathCoverDepthFuncNV; +typedef void (APIENTRYP pfn_glPathColorGenNV) (GLenum, GLenum, GLenum, const GLfloat*); +extern pfn_glPathColorGenNV fp_glPathColorGenNV; +typedef void (APIENTRYP pfn_glPathTexGenNV) (GLenum, GLenum, GLint, const GLfloat*); +extern pfn_glPathTexGenNV fp_glPathTexGenNV; +typedef void (APIENTRYP pfn_glPathFogGenNV) (GLenum); +extern pfn_glPathFogGenNV fp_glPathFogGenNV; +typedef void (APIENTRYP pfn_glCoverFillPathNV) (GLuint, GLenum); +extern pfn_glCoverFillPathNV fp_glCoverFillPathNV; +typedef void (APIENTRYP pfn_glCoverStrokePathNV) (GLuint, GLenum); +extern pfn_glCoverStrokePathNV fp_glCoverStrokePathNV; +typedef void (APIENTRYP pfn_glCoverFillPathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLenum, GLenum, const GLfloat*); +extern pfn_glCoverFillPathInstancedNV fp_glCoverFillPathInstancedNV; +typedef void (APIENTRYP pfn_glCoverStrokePathInstancedNV) (GLsizei, GLenum, const void*, GLuint, GLenum, GLenum, const GLfloat*); +extern pfn_glCoverStrokePathInstancedNV fp_glCoverStrokePathInstancedNV; +typedef void (APIENTRYP pfn_glGetPathParameterivNV) (GLuint, GLenum, GLint*); +extern pfn_glGetPathParameterivNV fp_glGetPathParameterivNV; +typedef void (APIENTRYP pfn_glGetPathParameterfvNV) (GLuint, GLenum, GLfloat*); +extern pfn_glGetPathParameterfvNV fp_glGetPathParameterfvNV; +typedef void (APIENTRYP pfn_glGetPathCommandsNV) (GLuint, GLubyte*); +extern pfn_glGetPathCommandsNV fp_glGetPathCommandsNV; +typedef void (APIENTRYP pfn_glGetPathCoordsNV) (GLuint, GLfloat*); +extern pfn_glGetPathCoordsNV fp_glGetPathCoordsNV; +typedef void (APIENTRYP pfn_glGetPathDashArrayNV) (GLuint, GLfloat*); +extern pfn_glGetPathDashArrayNV fp_glGetPathDashArrayNV; +typedef void (APIENTRYP pfn_glGetPathMetricsNV) (GLbitfield, GLsizei, GLenum, const void*, GLuint, GLsizei, GLfloat*); +extern pfn_glGetPathMetricsNV fp_glGetPathMetricsNV; +typedef void (APIENTRYP pfn_glGetPathMetricRangeNV) (GLbitfield, GLuint, GLsizei, GLsizei, GLfloat*); +extern pfn_glGetPathMetricRangeNV fp_glGetPathMetricRangeNV; +typedef void (APIENTRYP pfn_glGetPathSpacingNV) (GLenum, GLsizei, GLenum, const void*, GLuint, GLfloat, GLfloat, GLenum, GLfloat*); +extern pfn_glGetPathSpacingNV fp_glGetPathSpacingNV; +typedef void (APIENTRYP pfn_glGetPathColorGenivNV) (GLenum, GLenum, GLint*); +extern pfn_glGetPathColorGenivNV fp_glGetPathColorGenivNV; +typedef void (APIENTRYP pfn_glGetPathColorGenfvNV) (GLenum, GLenum, GLfloat*); +extern pfn_glGetPathColorGenfvNV fp_glGetPathColorGenfvNV; +typedef void (APIENTRYP pfn_glGetPathTexGenivNV) (GLenum, GLenum, GLint*); +extern pfn_glGetPathTexGenivNV fp_glGetPathTexGenivNV; +typedef void (APIENTRYP pfn_glGetPathTexGenfvNV) (GLenum, GLenum, GLfloat*); +extern pfn_glGetPathTexGenfvNV fp_glGetPathTexGenfvNV; +typedef GLboolean (APIENTRYP pfn_glIsPointInFillPathNV) (GLuint, GLuint, GLfloat, GLfloat); +extern pfn_glIsPointInFillPathNV fp_glIsPointInFillPathNV; +typedef GLboolean (APIENTRYP pfn_glIsPointInStrokePathNV) (GLuint, GLfloat, GLfloat); +extern pfn_glIsPointInStrokePathNV fp_glIsPointInStrokePathNV; +typedef GLfloat (APIENTRYP pfn_glGetPathLengthNV) (GLuint, GLsizei, GLsizei); +extern pfn_glGetPathLengthNV fp_glGetPathLengthNV; +typedef GLboolean (APIENTRYP pfn_glPointAlongPathNV) (GLuint, GLsizei, GLsizei, GLfloat, GLfloat*, GLfloat*, GLfloat*, GLfloat*); +extern pfn_glPointAlongPathNV fp_glPointAlongPathNV; + + /* GL_NV_pixel_data_range */ +extern GLboolean GLAD_NV_pixel_data_range; +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +typedef void (APIENTRYP pfn_glPixelDataRangeNV) (GLenum, GLsizei, const void*); +extern pfn_glPixelDataRangeNV fp_glPixelDataRangeNV; +typedef void (APIENTRYP pfn_glFlushPixelDataRangeNV) (GLenum); +extern pfn_glFlushPixelDataRangeNV fp_glFlushPixelDataRangeNV; + + /* GL_NV_point_sprite */ +extern GLboolean GLAD_NV_point_sprite; +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +typedef void (APIENTRYP pfn_glPointParameteriNV) (GLenum, GLint); +extern pfn_glPointParameteriNV fp_glPointParameteriNV; +typedef void (APIENTRYP pfn_glPointParameterivNV) (GLenum, const GLint*); +extern pfn_glPointParameterivNV fp_glPointParameterivNV; + + /* GL_NV_present_video */ +extern GLboolean GLAD_NV_present_video; +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +typedef void (APIENTRYP pfn_glPresentFrameKeyedNV) (GLuint, GLuint64EXT, GLuint, GLuint, GLenum, GLenum, GLuint, GLuint, GLenum, GLuint, GLuint); +extern pfn_glPresentFrameKeyedNV fp_glPresentFrameKeyedNV; +typedef void (APIENTRYP pfn_glPresentFrameDualFillNV) (GLuint, GLuint64EXT, GLuint, GLuint, GLenum, GLenum, GLuint, GLenum, GLuint, GLenum, GLuint, GLenum, GLuint); +extern pfn_glPresentFrameDualFillNV fp_glPresentFrameDualFillNV; +typedef void (APIENTRYP pfn_glGetVideoivNV) (GLuint, GLenum, GLint*); +extern pfn_glGetVideoivNV fp_glGetVideoivNV; +typedef void (APIENTRYP pfn_glGetVideouivNV) (GLuint, GLenum, GLuint*); +extern pfn_glGetVideouivNV fp_glGetVideouivNV; +typedef void (APIENTRYP pfn_glGetVideoi64vNV) (GLuint, GLenum, GLint64EXT*); +extern pfn_glGetVideoi64vNV fp_glGetVideoi64vNV; +typedef void (APIENTRYP pfn_glGetVideoui64vNV) (GLuint, GLenum, GLuint64EXT*); +extern pfn_glGetVideoui64vNV fp_glGetVideoui64vNV; + + /* GL_NV_primitive_restart */ +extern GLboolean GLAD_NV_primitive_restart; +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +typedef void (APIENTRYP pfn_glPrimitiveRestartNV) (); +extern pfn_glPrimitiveRestartNV fp_glPrimitiveRestartNV; +typedef void (APIENTRYP pfn_glPrimitiveRestartIndexNV) (GLuint); +extern pfn_glPrimitiveRestartIndexNV fp_glPrimitiveRestartIndexNV; + + /* GL_NV_read_buffer */ +extern GLboolean GLAD_NV_read_buffer; +#define GL_READ_BUFFER_NV 0x0C02 +typedef void (APIENTRYP pfn_glReadBufferNV) (GLenum); +extern pfn_glReadBufferNV fp_glReadBufferNV; + + /* GL_NV_read_buffer_front */ +extern GLboolean GLAD_NV_read_buffer_front; + + /* GL_NV_read_depth */ +extern GLboolean GLAD_NV_read_depth; + + /* GL_NV_read_depth_stencil */ +extern GLboolean GLAD_NV_read_depth_stencil; + + /* GL_NV_read_stencil */ +extern GLboolean GLAD_NV_read_stencil; + + /* GL_NV_register_combiners */ +extern GLboolean GLAD_NV_register_combiners; +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +typedef void (APIENTRYP pfn_glCombinerParameterfvNV) (GLenum, const GLfloat*); +extern pfn_glCombinerParameterfvNV fp_glCombinerParameterfvNV; +typedef void (APIENTRYP pfn_glCombinerParameterfNV) (GLenum, GLfloat); +extern pfn_glCombinerParameterfNV fp_glCombinerParameterfNV; +typedef void (APIENTRYP pfn_glCombinerParameterivNV) (GLenum, const GLint*); +extern pfn_glCombinerParameterivNV fp_glCombinerParameterivNV; +typedef void (APIENTRYP pfn_glCombinerParameteriNV) (GLenum, GLint); +extern pfn_glCombinerParameteriNV fp_glCombinerParameteriNV; +typedef void (APIENTRYP pfn_glCombinerInputNV) (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum); +extern pfn_glCombinerInputNV fp_glCombinerInputNV; +typedef void (APIENTRYP pfn_glCombinerOutputNV) (GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLenum, GLboolean, GLboolean, GLboolean); +extern pfn_glCombinerOutputNV fp_glCombinerOutputNV; +typedef void (APIENTRYP pfn_glFinalCombinerInputNV) (GLenum, GLenum, GLenum, GLenum); +extern pfn_glFinalCombinerInputNV fp_glFinalCombinerInputNV; +typedef void (APIENTRYP pfn_glGetCombinerInputParameterfvNV) (GLenum, GLenum, GLenum, GLenum, GLfloat*); +extern pfn_glGetCombinerInputParameterfvNV fp_glGetCombinerInputParameterfvNV; +typedef void (APIENTRYP pfn_glGetCombinerInputParameterivNV) (GLenum, GLenum, GLenum, GLenum, GLint*); +extern pfn_glGetCombinerInputParameterivNV fp_glGetCombinerInputParameterivNV; +typedef void (APIENTRYP pfn_glGetCombinerOutputParameterfvNV) (GLenum, GLenum, GLenum, GLfloat*); +extern pfn_glGetCombinerOutputParameterfvNV fp_glGetCombinerOutputParameterfvNV; +typedef void (APIENTRYP pfn_glGetCombinerOutputParameterivNV) (GLenum, GLenum, GLenum, GLint*); +extern pfn_glGetCombinerOutputParameterivNV fp_glGetCombinerOutputParameterivNV; +typedef void (APIENTRYP pfn_glGetFinalCombinerInputParameterfvNV) (GLenum, GLenum, GLfloat*); +extern pfn_glGetFinalCombinerInputParameterfvNV fp_glGetFinalCombinerInputParameterfvNV; +typedef void (APIENTRYP pfn_glGetFinalCombinerInputParameterivNV) (GLenum, GLenum, GLint*); +extern pfn_glGetFinalCombinerInputParameterivNV fp_glGetFinalCombinerInputParameterivNV; + + /* GL_NV_register_combiners2 */ +extern GLboolean GLAD_NV_register_combiners2; +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +typedef void (APIENTRYP pfn_glCombinerStageParameterfvNV) (GLenum, GLenum, const GLfloat*); +extern pfn_glCombinerStageParameterfvNV fp_glCombinerStageParameterfvNV; +typedef void (APIENTRYP pfn_glGetCombinerStageParameterfvNV) (GLenum, GLenum, GLfloat*); +extern pfn_glGetCombinerStageParameterfvNV fp_glGetCombinerStageParameterfvNV; + + /* GL_NV_shader_atomic_counters */ +extern GLboolean GLAD_NV_shader_atomic_counters; + + /* GL_NV_shader_atomic_float */ +extern GLboolean GLAD_NV_shader_atomic_float; + + /* GL_NV_shader_buffer_load */ +extern GLboolean GLAD_NV_shader_buffer_load; +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +typedef void (APIENTRYP pfn_glMakeBufferResidentNV) (GLenum, GLenum); +extern pfn_glMakeBufferResidentNV fp_glMakeBufferResidentNV; +typedef void (APIENTRYP pfn_glMakeBufferNonResidentNV) (GLenum); +extern pfn_glMakeBufferNonResidentNV fp_glMakeBufferNonResidentNV; +typedef GLboolean (APIENTRYP pfn_glIsBufferResidentNV) (GLenum); +extern pfn_glIsBufferResidentNV fp_glIsBufferResidentNV; +typedef void (APIENTRYP pfn_glMakeNamedBufferResidentNV) (GLuint, GLenum); +extern pfn_glMakeNamedBufferResidentNV fp_glMakeNamedBufferResidentNV; +typedef void (APIENTRYP pfn_glMakeNamedBufferNonResidentNV) (GLuint); +extern pfn_glMakeNamedBufferNonResidentNV fp_glMakeNamedBufferNonResidentNV; +typedef GLboolean (APIENTRYP pfn_glIsNamedBufferResidentNV) (GLuint); +extern pfn_glIsNamedBufferResidentNV fp_glIsNamedBufferResidentNV; +typedef void (APIENTRYP pfn_glGetBufferParameterui64vNV) (GLenum, GLenum, GLuint64EXT*); +extern pfn_glGetBufferParameterui64vNV fp_glGetBufferParameterui64vNV; +typedef void (APIENTRYP pfn_glGetNamedBufferParameterui64vNV) (GLuint, GLenum, GLuint64EXT*); +extern pfn_glGetNamedBufferParameterui64vNV fp_glGetNamedBufferParameterui64vNV; +typedef void (APIENTRYP pfn_glGetIntegerui64vNV) (GLenum, GLuint64EXT*); +extern pfn_glGetIntegerui64vNV fp_glGetIntegerui64vNV; +typedef void (APIENTRYP pfn_glUniformui64NV) (GLint, GLuint64EXT); +extern pfn_glUniformui64NV fp_glUniformui64NV; +typedef void (APIENTRYP pfn_glUniformui64vNV) (GLint, GLsizei, const GLuint64EXT*); +extern pfn_glUniformui64vNV fp_glUniformui64vNV; +typedef void (APIENTRYP pfn_glGetUniformui64vNV) (GLuint, GLint, GLuint64EXT*); +extern pfn_glGetUniformui64vNV fp_glGetUniformui64vNV; +typedef void (APIENTRYP pfn_glProgramUniformui64NV) (GLuint, GLint, GLuint64EXT); +extern pfn_glProgramUniformui64NV fp_glProgramUniformui64NV; +typedef void (APIENTRYP pfn_glProgramUniformui64vNV) (GLuint, GLint, GLsizei, const GLuint64EXT*); +extern pfn_glProgramUniformui64vNV fp_glProgramUniformui64vNV; + + /* GL_NV_shader_buffer_store */ +extern GLboolean GLAD_NV_shader_buffer_store; +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 + + /* GL_NV_shader_storage_buffer_object */ +extern GLboolean GLAD_NV_shader_storage_buffer_object; + + /* GL_NV_shadow_samplers_array */ +extern GLboolean GLAD_NV_shadow_samplers_array; +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 + + /* GL_NV_shadow_samplers_cube */ +extern GLboolean GLAD_NV_shadow_samplers_cube; +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 + + /* GL_NV_sRGB_formats */ +extern GLboolean GLAD_NV_sRGB_formats; +#define GL_SLUMINANCE_NV 0x8C46 +#define GL_SLUMINANCE_ALPHA_NV 0x8C44 +#define GL_SRGB8_NV 0x8C41 +#define GL_SLUMINANCE8_NV 0x8C47 +#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F +#define GL_ETC1_SRGB8_NV 0x88EE + + /* GL_NV_tessellation_program5 */ +extern GLboolean GLAD_NV_tessellation_program5; +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 + + /* GL_NV_texgen_emboss */ +extern GLboolean GLAD_NV_texgen_emboss; +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F + + /* GL_NV_texgen_reflection */ +extern GLboolean GLAD_NV_texgen_reflection; +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 + + /* GL_NV_texture_barrier */ +extern GLboolean GLAD_NV_texture_barrier; +typedef void (APIENTRYP pfn_glTextureBarrierNV) (); +extern pfn_glTextureBarrierNV fp_glTextureBarrierNV; + + /* GL_NV_texture_border_clamp */ +extern GLboolean GLAD_NV_texture_border_clamp; +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_CLAMP_TO_BORDER_NV 0x812D + + /* GL_NV_texture_compression_s3tc_update */ +extern GLboolean GLAD_NV_texture_compression_s3tc_update; + + /* GL_NV_texture_compression_vtc */ +extern GLboolean GLAD_NV_texture_compression_vtc; + + /* GL_NV_texture_env_combine4 */ +extern GLboolean GLAD_NV_texture_env_combine4; +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B + + /* GL_NV_texture_expand_normal */ +extern GLboolean GLAD_NV_texture_expand_normal; +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F + + /* GL_NV_texture_multisample */ +extern GLboolean GLAD_NV_texture_multisample; +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 +typedef void (APIENTRYP pfn_glTexImage2DMultisampleCoverageNV) (GLenum, GLsizei, GLsizei, GLint, GLsizei, GLsizei, GLboolean); +extern pfn_glTexImage2DMultisampleCoverageNV fp_glTexImage2DMultisampleCoverageNV; +typedef void (APIENTRYP pfn_glTexImage3DMultisampleCoverageNV) (GLenum, GLsizei, GLsizei, GLint, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTexImage3DMultisampleCoverageNV fp_glTexImage3DMultisampleCoverageNV; +typedef void (APIENTRYP pfn_glTextureImage2DMultisampleNV) (GLuint, GLenum, GLsizei, GLint, GLsizei, GLsizei, GLboolean); +extern pfn_glTextureImage2DMultisampleNV fp_glTextureImage2DMultisampleNV; +typedef void (APIENTRYP pfn_glTextureImage3DMultisampleNV) (GLuint, GLenum, GLsizei, GLint, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTextureImage3DMultisampleNV fp_glTextureImage3DMultisampleNV; +typedef void (APIENTRYP pfn_glTextureImage2DMultisampleCoverageNV) (GLuint, GLenum, GLsizei, GLsizei, GLint, GLsizei, GLsizei, GLboolean); +extern pfn_glTextureImage2DMultisampleCoverageNV fp_glTextureImage2DMultisampleCoverageNV; +typedef void (APIENTRYP pfn_glTextureImage3DMultisampleCoverageNV) (GLuint, GLenum, GLsizei, GLsizei, GLint, GLsizei, GLsizei, GLsizei, GLboolean); +extern pfn_glTextureImage3DMultisampleCoverageNV fp_glTextureImage3DMultisampleCoverageNV; + + /* GL_NV_texture_npot_2D_mipmap */ +extern GLboolean GLAD_NV_texture_npot_2D_mipmap; + + /* GL_NV_texture_rectangle */ +extern GLboolean GLAD_NV_texture_rectangle; +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 + + /* GL_NV_texture_shader */ +extern GLboolean GLAD_NV_texture_shader; +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F + + /* GL_NV_texture_shader2 */ +extern GLboolean GLAD_NV_texture_shader2; +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF + + /* GL_NV_texture_shader3 */ +extern GLboolean GLAD_NV_texture_shader3; +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 + + /* GL_NV_transform_feedback */ +extern GLboolean GLAD_NV_transform_feedback; +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 +typedef void (APIENTRYP pfn_glBeginTransformFeedbackNV) (GLenum); +extern pfn_glBeginTransformFeedbackNV fp_glBeginTransformFeedbackNV; +typedef void (APIENTRYP pfn_glEndTransformFeedbackNV) (); +extern pfn_glEndTransformFeedbackNV fp_glEndTransformFeedbackNV; +typedef void (APIENTRYP pfn_glTransformFeedbackAttribsNV) (GLuint, const GLint*, GLenum); +extern pfn_glTransformFeedbackAttribsNV fp_glTransformFeedbackAttribsNV; +typedef void (APIENTRYP pfn_glBindBufferRangeNV) (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr); +extern pfn_glBindBufferRangeNV fp_glBindBufferRangeNV; +typedef void (APIENTRYP pfn_glBindBufferOffsetNV) (GLenum, GLuint, GLuint, GLintptr); +extern pfn_glBindBufferOffsetNV fp_glBindBufferOffsetNV; +typedef void (APIENTRYP pfn_glBindBufferBaseNV) (GLenum, GLuint, GLuint); +extern pfn_glBindBufferBaseNV fp_glBindBufferBaseNV; +typedef void (APIENTRYP pfn_glTransformFeedbackVaryingsNV) (GLuint, GLsizei, const GLint*, GLenum); +extern pfn_glTransformFeedbackVaryingsNV fp_glTransformFeedbackVaryingsNV; +typedef void (APIENTRYP pfn_glActiveVaryingNV) (GLuint, const GLchar*); +extern pfn_glActiveVaryingNV fp_glActiveVaryingNV; +typedef GLint (APIENTRYP pfn_glGetVaryingLocationNV) (GLuint, const GLchar*); +extern pfn_glGetVaryingLocationNV fp_glGetVaryingLocationNV; +typedef void (APIENTRYP pfn_glGetActiveVaryingNV) (GLuint, GLuint, GLsizei, GLsizei*, GLsizei*, GLenum*, GLchar*); +extern pfn_glGetActiveVaryingNV fp_glGetActiveVaryingNV; +typedef void (APIENTRYP pfn_glGetTransformFeedbackVaryingNV) (GLuint, GLuint, GLint*); +extern pfn_glGetTransformFeedbackVaryingNV fp_glGetTransformFeedbackVaryingNV; +typedef void (APIENTRYP pfn_glTransformFeedbackStreamAttribsNV) (GLsizei, const GLint*, GLsizei, const GLint*, GLenum); +extern pfn_glTransformFeedbackStreamAttribsNV fp_glTransformFeedbackStreamAttribsNV; + + /* GL_NV_transform_feedback2 */ +extern GLboolean GLAD_NV_transform_feedback2; +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +typedef void (APIENTRYP pfn_glBindTransformFeedbackNV) (GLenum, GLuint); +extern pfn_glBindTransformFeedbackNV fp_glBindTransformFeedbackNV; +typedef void (APIENTRYP pfn_glDeleteTransformFeedbacksNV) (GLsizei, const GLuint*); +extern pfn_glDeleteTransformFeedbacksNV fp_glDeleteTransformFeedbacksNV; +typedef void (APIENTRYP pfn_glGenTransformFeedbacksNV) (GLsizei, GLuint*); +extern pfn_glGenTransformFeedbacksNV fp_glGenTransformFeedbacksNV; +typedef GLboolean (APIENTRYP pfn_glIsTransformFeedbackNV) (GLuint); +extern pfn_glIsTransformFeedbackNV fp_glIsTransformFeedbackNV; +typedef void (APIENTRYP pfn_glPauseTransformFeedbackNV) (); +extern pfn_glPauseTransformFeedbackNV fp_glPauseTransformFeedbackNV; +typedef void (APIENTRYP pfn_glResumeTransformFeedbackNV) (); +extern pfn_glResumeTransformFeedbackNV fp_glResumeTransformFeedbackNV; +typedef void (APIENTRYP pfn_glDrawTransformFeedbackNV) (GLenum, GLuint); +extern pfn_glDrawTransformFeedbackNV fp_glDrawTransformFeedbackNV; + + /* GL_NV_vdpau_interop */ +extern GLboolean GLAD_NV_vdpau_interop; +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +typedef void (APIENTRYP pfn_glVDPAUInitNV) (const void*, const void*); +extern pfn_glVDPAUInitNV fp_glVDPAUInitNV; +typedef void (APIENTRYP pfn_glVDPAUFiniNV) (); +extern pfn_glVDPAUFiniNV fp_glVDPAUFiniNV; +typedef GLvdpauSurfaceNV (APIENTRYP pfn_glVDPAURegisterVideoSurfaceNV) (const void*, GLenum, GLsizei, const GLuint*); +extern pfn_glVDPAURegisterVideoSurfaceNV fp_glVDPAURegisterVideoSurfaceNV; +typedef GLvdpauSurfaceNV (APIENTRYP pfn_glVDPAURegisterOutputSurfaceNV) (const void*, GLenum, GLsizei, const GLuint*); +extern pfn_glVDPAURegisterOutputSurfaceNV fp_glVDPAURegisterOutputSurfaceNV; +typedef void (APIENTRYP pfn_glVDPAUIsSurfaceNV) (GLvdpauSurfaceNV); +extern pfn_glVDPAUIsSurfaceNV fp_glVDPAUIsSurfaceNV; +typedef void (APIENTRYP pfn_glVDPAUUnregisterSurfaceNV) (GLvdpauSurfaceNV); +extern pfn_glVDPAUUnregisterSurfaceNV fp_glVDPAUUnregisterSurfaceNV; +typedef void (APIENTRYP pfn_glVDPAUGetSurfaceivNV) (GLvdpauSurfaceNV, GLenum, GLsizei, GLsizei*, GLint*); +extern pfn_glVDPAUGetSurfaceivNV fp_glVDPAUGetSurfaceivNV; +typedef void (APIENTRYP pfn_glVDPAUSurfaceAccessNV) (GLvdpauSurfaceNV, GLenum); +extern pfn_glVDPAUSurfaceAccessNV fp_glVDPAUSurfaceAccessNV; +typedef void (APIENTRYP pfn_glVDPAUMapSurfacesNV) (GLsizei, const GLvdpauSurfaceNV*); +extern pfn_glVDPAUMapSurfacesNV fp_glVDPAUMapSurfacesNV; +typedef void (APIENTRYP pfn_glVDPAUUnmapSurfacesNV) (GLsizei, const GLvdpauSurfaceNV*); +extern pfn_glVDPAUUnmapSurfacesNV fp_glVDPAUUnmapSurfacesNV; + + /* GL_NV_vertex_array_range */ +extern GLboolean GLAD_NV_vertex_array_range; +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +typedef void (APIENTRYP pfn_glFlushVertexArrayRangeNV) (); +extern pfn_glFlushVertexArrayRangeNV fp_glFlushVertexArrayRangeNV; +typedef void (APIENTRYP pfn_glVertexArrayRangeNV) (GLsizei, const void*); +extern pfn_glVertexArrayRangeNV fp_glVertexArrayRangeNV; + + /* GL_NV_vertex_array_range2 */ +extern GLboolean GLAD_NV_vertex_array_range2; +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 + + /* GL_NV_vertex_attrib_integer_64bit */ +extern GLboolean GLAD_NV_vertex_attrib_integer_64bit; +typedef void (APIENTRYP pfn_glVertexAttribL1i64NV) (GLuint, GLint64EXT); +extern pfn_glVertexAttribL1i64NV fp_glVertexAttribL1i64NV; +typedef void (APIENTRYP pfn_glVertexAttribL2i64NV) (GLuint, GLint64EXT, GLint64EXT); +extern pfn_glVertexAttribL2i64NV fp_glVertexAttribL2i64NV; +typedef void (APIENTRYP pfn_glVertexAttribL3i64NV) (GLuint, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glVertexAttribL3i64NV fp_glVertexAttribL3i64NV; +typedef void (APIENTRYP pfn_glVertexAttribL4i64NV) (GLuint, GLint64EXT, GLint64EXT, GLint64EXT, GLint64EXT); +extern pfn_glVertexAttribL4i64NV fp_glVertexAttribL4i64NV; +typedef void (APIENTRYP pfn_glVertexAttribL1i64vNV) (GLuint, const GLint64EXT*); +extern pfn_glVertexAttribL1i64vNV fp_glVertexAttribL1i64vNV; +typedef void (APIENTRYP pfn_glVertexAttribL2i64vNV) (GLuint, const GLint64EXT*); +extern pfn_glVertexAttribL2i64vNV fp_glVertexAttribL2i64vNV; +typedef void (APIENTRYP pfn_glVertexAttribL3i64vNV) (GLuint, const GLint64EXT*); +extern pfn_glVertexAttribL3i64vNV fp_glVertexAttribL3i64vNV; +typedef void (APIENTRYP pfn_glVertexAttribL4i64vNV) (GLuint, const GLint64EXT*); +extern pfn_glVertexAttribL4i64vNV fp_glVertexAttribL4i64vNV; +typedef void (APIENTRYP pfn_glVertexAttribL1ui64NV) (GLuint, GLuint64EXT); +extern pfn_glVertexAttribL1ui64NV fp_glVertexAttribL1ui64NV; +typedef void (APIENTRYP pfn_glVertexAttribL2ui64NV) (GLuint, GLuint64EXT, GLuint64EXT); +extern pfn_glVertexAttribL2ui64NV fp_glVertexAttribL2ui64NV; +typedef void (APIENTRYP pfn_glVertexAttribL3ui64NV) (GLuint, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glVertexAttribL3ui64NV fp_glVertexAttribL3ui64NV; +typedef void (APIENTRYP pfn_glVertexAttribL4ui64NV) (GLuint, GLuint64EXT, GLuint64EXT, GLuint64EXT, GLuint64EXT); +extern pfn_glVertexAttribL4ui64NV fp_glVertexAttribL4ui64NV; +typedef void (APIENTRYP pfn_glVertexAttribL1ui64vNV) (GLuint, const GLuint64EXT*); +extern pfn_glVertexAttribL1ui64vNV fp_glVertexAttribL1ui64vNV; +typedef void (APIENTRYP pfn_glVertexAttribL2ui64vNV) (GLuint, const GLuint64EXT*); +extern pfn_glVertexAttribL2ui64vNV fp_glVertexAttribL2ui64vNV; +typedef void (APIENTRYP pfn_glVertexAttribL3ui64vNV) (GLuint, const GLuint64EXT*); +extern pfn_glVertexAttribL3ui64vNV fp_glVertexAttribL3ui64vNV; +typedef void (APIENTRYP pfn_glVertexAttribL4ui64vNV) (GLuint, const GLuint64EXT*); +extern pfn_glVertexAttribL4ui64vNV fp_glVertexAttribL4ui64vNV; +typedef void (APIENTRYP pfn_glGetVertexAttribLi64vNV) (GLuint, GLenum, GLint64EXT*); +extern pfn_glGetVertexAttribLi64vNV fp_glGetVertexAttribLi64vNV; +typedef void (APIENTRYP pfn_glGetVertexAttribLui64vNV) (GLuint, GLenum, GLuint64EXT*); +extern pfn_glGetVertexAttribLui64vNV fp_glGetVertexAttribLui64vNV; +typedef void (APIENTRYP pfn_glVertexAttribLFormatNV) (GLuint, GLint, GLenum, GLsizei); +extern pfn_glVertexAttribLFormatNV fp_glVertexAttribLFormatNV; + + /* GL_NV_vertex_buffer_unified_memory */ +extern GLboolean GLAD_NV_vertex_buffer_unified_memory; +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +typedef void (APIENTRYP pfn_glBufferAddressRangeNV) (GLenum, GLuint, GLuint64EXT, GLsizeiptr); +extern pfn_glBufferAddressRangeNV fp_glBufferAddressRangeNV; +typedef void (APIENTRYP pfn_glVertexFormatNV) (GLint, GLenum, GLsizei); +extern pfn_glVertexFormatNV fp_glVertexFormatNV; +typedef void (APIENTRYP pfn_glNormalFormatNV) (GLenum, GLsizei); +extern pfn_glNormalFormatNV fp_glNormalFormatNV; +typedef void (APIENTRYP pfn_glColorFormatNV) (GLint, GLenum, GLsizei); +extern pfn_glColorFormatNV fp_glColorFormatNV; +typedef void (APIENTRYP pfn_glIndexFormatNV) (GLenum, GLsizei); +extern pfn_glIndexFormatNV fp_glIndexFormatNV; +typedef void (APIENTRYP pfn_glTexCoordFormatNV) (GLint, GLenum, GLsizei); +extern pfn_glTexCoordFormatNV fp_glTexCoordFormatNV; +typedef void (APIENTRYP pfn_glEdgeFlagFormatNV) (GLsizei); +extern pfn_glEdgeFlagFormatNV fp_glEdgeFlagFormatNV; +typedef void (APIENTRYP pfn_glSecondaryColorFormatNV) (GLint, GLenum, GLsizei); +extern pfn_glSecondaryColorFormatNV fp_glSecondaryColorFormatNV; +typedef void (APIENTRYP pfn_glFogCoordFormatNV) (GLenum, GLsizei); +extern pfn_glFogCoordFormatNV fp_glFogCoordFormatNV; +typedef void (APIENTRYP pfn_glVertexAttribFormatNV) (GLuint, GLint, GLenum, GLboolean, GLsizei); +extern pfn_glVertexAttribFormatNV fp_glVertexAttribFormatNV; +typedef void (APIENTRYP pfn_glVertexAttribIFormatNV) (GLuint, GLint, GLenum, GLsizei); +extern pfn_glVertexAttribIFormatNV fp_glVertexAttribIFormatNV; +typedef void (APIENTRYP pfn_glGetIntegerui64i_vNV) (GLenum, GLuint, GLuint64EXT*); +extern pfn_glGetIntegerui64i_vNV fp_glGetIntegerui64i_vNV; + + /* GL_NV_vertex_program */ +extern GLboolean GLAD_NV_vertex_program; +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +typedef GLboolean (APIENTRYP pfn_glAreProgramsResidentNV) (GLsizei, const GLuint*, GLboolean*); +extern pfn_glAreProgramsResidentNV fp_glAreProgramsResidentNV; +typedef void (APIENTRYP pfn_glBindProgramNV) (GLenum, GLuint); +extern pfn_glBindProgramNV fp_glBindProgramNV; +typedef void (APIENTRYP pfn_glDeleteProgramsNV) (GLsizei, const GLuint*); +extern pfn_glDeleteProgramsNV fp_glDeleteProgramsNV; +typedef void (APIENTRYP pfn_glExecuteProgramNV) (GLenum, GLuint, const GLfloat*); +extern pfn_glExecuteProgramNV fp_glExecuteProgramNV; +typedef void (APIENTRYP pfn_glGenProgramsNV) (GLsizei, GLuint*); +extern pfn_glGenProgramsNV fp_glGenProgramsNV; +typedef void (APIENTRYP pfn_glGetProgramParameterdvNV) (GLenum, GLuint, GLenum, GLdouble*); +extern pfn_glGetProgramParameterdvNV fp_glGetProgramParameterdvNV; +typedef void (APIENTRYP pfn_glGetProgramParameterfvNV) (GLenum, GLuint, GLenum, GLfloat*); +extern pfn_glGetProgramParameterfvNV fp_glGetProgramParameterfvNV; +typedef void (APIENTRYP pfn_glGetProgramivNV) (GLuint, GLenum, GLint*); +extern pfn_glGetProgramivNV fp_glGetProgramivNV; +typedef void (APIENTRYP pfn_glGetProgramStringNV) (GLuint, GLenum, GLubyte*); +extern pfn_glGetProgramStringNV fp_glGetProgramStringNV; +typedef void (APIENTRYP pfn_glGetTrackMatrixivNV) (GLenum, GLuint, GLenum, GLint*); +extern pfn_glGetTrackMatrixivNV fp_glGetTrackMatrixivNV; +typedef void (APIENTRYP pfn_glGetVertexAttribdvNV) (GLuint, GLenum, GLdouble*); +extern pfn_glGetVertexAttribdvNV fp_glGetVertexAttribdvNV; +typedef void (APIENTRYP pfn_glGetVertexAttribfvNV) (GLuint, GLenum, GLfloat*); +extern pfn_glGetVertexAttribfvNV fp_glGetVertexAttribfvNV; +typedef void (APIENTRYP pfn_glGetVertexAttribivNV) (GLuint, GLenum, GLint*); +extern pfn_glGetVertexAttribivNV fp_glGetVertexAttribivNV; +typedef void (APIENTRYP pfn_glGetVertexAttribPointervNV) (GLuint, GLenum, void**); +extern pfn_glGetVertexAttribPointervNV fp_glGetVertexAttribPointervNV; +typedef GLboolean (APIENTRYP pfn_glIsProgramNV) (GLuint); +extern pfn_glIsProgramNV fp_glIsProgramNV; +typedef void (APIENTRYP pfn_glLoadProgramNV) (GLenum, GLuint, GLsizei, const GLubyte*); +extern pfn_glLoadProgramNV fp_glLoadProgramNV; +typedef void (APIENTRYP pfn_glProgramParameter4dNV) (GLenum, GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glProgramParameter4dNV fp_glProgramParameter4dNV; +typedef void (APIENTRYP pfn_glProgramParameter4dvNV) (GLenum, GLuint, const GLdouble*); +extern pfn_glProgramParameter4dvNV fp_glProgramParameter4dvNV; +typedef void (APIENTRYP pfn_glProgramParameter4fNV) (GLenum, GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glProgramParameter4fNV fp_glProgramParameter4fNV; +typedef void (APIENTRYP pfn_glProgramParameter4fvNV) (GLenum, GLuint, const GLfloat*); +extern pfn_glProgramParameter4fvNV fp_glProgramParameter4fvNV; +typedef void (APIENTRYP pfn_glProgramParameters4dvNV) (GLenum, GLuint, GLsizei, const GLdouble*); +extern pfn_glProgramParameters4dvNV fp_glProgramParameters4dvNV; +typedef void (APIENTRYP pfn_glProgramParameters4fvNV) (GLenum, GLuint, GLsizei, const GLfloat*); +extern pfn_glProgramParameters4fvNV fp_glProgramParameters4fvNV; +typedef void (APIENTRYP pfn_glRequestResidentProgramsNV) (GLsizei, const GLuint*); +extern pfn_glRequestResidentProgramsNV fp_glRequestResidentProgramsNV; +typedef void (APIENTRYP pfn_glTrackMatrixNV) (GLenum, GLuint, GLenum, GLenum); +extern pfn_glTrackMatrixNV fp_glTrackMatrixNV; +typedef void (APIENTRYP pfn_glVertexAttribPointerNV) (GLuint, GLint, GLenum, GLsizei, const void*); +extern pfn_glVertexAttribPointerNV fp_glVertexAttribPointerNV; +typedef void (APIENTRYP pfn_glVertexAttrib1dNV) (GLuint, GLdouble); +extern pfn_glVertexAttrib1dNV fp_glVertexAttrib1dNV; +typedef void (APIENTRYP pfn_glVertexAttrib1dvNV) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib1dvNV fp_glVertexAttrib1dvNV; +typedef void (APIENTRYP pfn_glVertexAttrib1fNV) (GLuint, GLfloat); +extern pfn_glVertexAttrib1fNV fp_glVertexAttrib1fNV; +typedef void (APIENTRYP pfn_glVertexAttrib1fvNV) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib1fvNV fp_glVertexAttrib1fvNV; +typedef void (APIENTRYP pfn_glVertexAttrib1sNV) (GLuint, GLshort); +extern pfn_glVertexAttrib1sNV fp_glVertexAttrib1sNV; +typedef void (APIENTRYP pfn_glVertexAttrib1svNV) (GLuint, const GLshort*); +extern pfn_glVertexAttrib1svNV fp_glVertexAttrib1svNV; +typedef void (APIENTRYP pfn_glVertexAttrib2dNV) (GLuint, GLdouble, GLdouble); +extern pfn_glVertexAttrib2dNV fp_glVertexAttrib2dNV; +typedef void (APIENTRYP pfn_glVertexAttrib2dvNV) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib2dvNV fp_glVertexAttrib2dvNV; +typedef void (APIENTRYP pfn_glVertexAttrib2fNV) (GLuint, GLfloat, GLfloat); +extern pfn_glVertexAttrib2fNV fp_glVertexAttrib2fNV; +typedef void (APIENTRYP pfn_glVertexAttrib2fvNV) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib2fvNV fp_glVertexAttrib2fvNV; +typedef void (APIENTRYP pfn_glVertexAttrib2sNV) (GLuint, GLshort, GLshort); +extern pfn_glVertexAttrib2sNV fp_glVertexAttrib2sNV; +typedef void (APIENTRYP pfn_glVertexAttrib2svNV) (GLuint, const GLshort*); +extern pfn_glVertexAttrib2svNV fp_glVertexAttrib2svNV; +typedef void (APIENTRYP pfn_glVertexAttrib3dNV) (GLuint, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttrib3dNV fp_glVertexAttrib3dNV; +typedef void (APIENTRYP pfn_glVertexAttrib3dvNV) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib3dvNV fp_glVertexAttrib3dvNV; +typedef void (APIENTRYP pfn_glVertexAttrib3fNV) (GLuint, GLfloat, GLfloat, GLfloat); +extern pfn_glVertexAttrib3fNV fp_glVertexAttrib3fNV; +typedef void (APIENTRYP pfn_glVertexAttrib3fvNV) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib3fvNV fp_glVertexAttrib3fvNV; +typedef void (APIENTRYP pfn_glVertexAttrib3sNV) (GLuint, GLshort, GLshort, GLshort); +extern pfn_glVertexAttrib3sNV fp_glVertexAttrib3sNV; +typedef void (APIENTRYP pfn_glVertexAttrib3svNV) (GLuint, const GLshort*); +extern pfn_glVertexAttrib3svNV fp_glVertexAttrib3svNV; +typedef void (APIENTRYP pfn_glVertexAttrib4dNV) (GLuint, GLdouble, GLdouble, GLdouble, GLdouble); +extern pfn_glVertexAttrib4dNV fp_glVertexAttrib4dNV; +typedef void (APIENTRYP pfn_glVertexAttrib4dvNV) (GLuint, const GLdouble*); +extern pfn_glVertexAttrib4dvNV fp_glVertexAttrib4dvNV; +typedef void (APIENTRYP pfn_glVertexAttrib4fNV) (GLuint, GLfloat, GLfloat, GLfloat, GLfloat); +extern pfn_glVertexAttrib4fNV fp_glVertexAttrib4fNV; +typedef void (APIENTRYP pfn_glVertexAttrib4fvNV) (GLuint, const GLfloat*); +extern pfn_glVertexAttrib4fvNV fp_glVertexAttrib4fvNV; +typedef void (APIENTRYP pfn_glVertexAttrib4sNV) (GLuint, GLshort, GLshort, GLshort, GLshort); +extern pfn_glVertexAttrib4sNV fp_glVertexAttrib4sNV; +typedef void (APIENTRYP pfn_glVertexAttrib4svNV) (GLuint, const GLshort*); +extern pfn_glVertexAttrib4svNV fp_glVertexAttrib4svNV; +typedef void (APIENTRYP pfn_glVertexAttrib4ubNV) (GLuint, GLubyte, GLubyte, GLubyte, GLubyte); +extern pfn_glVertexAttrib4ubNV fp_glVertexAttrib4ubNV; +typedef void (APIENTRYP pfn_glVertexAttrib4ubvNV) (GLuint, const GLubyte*); +extern pfn_glVertexAttrib4ubvNV fp_glVertexAttrib4ubvNV; +typedef void (APIENTRYP pfn_glVertexAttribs1dvNV) (GLuint, GLsizei, const GLdouble*); +extern pfn_glVertexAttribs1dvNV fp_glVertexAttribs1dvNV; +typedef void (APIENTRYP pfn_glVertexAttribs1fvNV) (GLuint, GLsizei, const GLfloat*); +extern pfn_glVertexAttribs1fvNV fp_glVertexAttribs1fvNV; +typedef void (APIENTRYP pfn_glVertexAttribs1svNV) (GLuint, GLsizei, const GLshort*); +extern pfn_glVertexAttribs1svNV fp_glVertexAttribs1svNV; +typedef void (APIENTRYP pfn_glVertexAttribs2dvNV) (GLuint, GLsizei, const GLdouble*); +extern pfn_glVertexAttribs2dvNV fp_glVertexAttribs2dvNV; +typedef void (APIENTRYP pfn_glVertexAttribs2fvNV) (GLuint, GLsizei, const GLfloat*); +extern pfn_glVertexAttribs2fvNV fp_glVertexAttribs2fvNV; +typedef void (APIENTRYP pfn_glVertexAttribs2svNV) (GLuint, GLsizei, const GLshort*); +extern pfn_glVertexAttribs2svNV fp_glVertexAttribs2svNV; +typedef void (APIENTRYP pfn_glVertexAttribs3dvNV) (GLuint, GLsizei, const GLdouble*); +extern pfn_glVertexAttribs3dvNV fp_glVertexAttribs3dvNV; +typedef void (APIENTRYP pfn_glVertexAttribs3fvNV) (GLuint, GLsizei, const GLfloat*); +extern pfn_glVertexAttribs3fvNV fp_glVertexAttribs3fvNV; +typedef void (APIENTRYP pfn_glVertexAttribs3svNV) (GLuint, GLsizei, const GLshort*); +extern pfn_glVertexAttribs3svNV fp_glVertexAttribs3svNV; +typedef void (APIENTRYP pfn_glVertexAttribs4dvNV) (GLuint, GLsizei, const GLdouble*); +extern pfn_glVertexAttribs4dvNV fp_glVertexAttribs4dvNV; +typedef void (APIENTRYP pfn_glVertexAttribs4fvNV) (GLuint, GLsizei, const GLfloat*); +extern pfn_glVertexAttribs4fvNV fp_glVertexAttribs4fvNV; +typedef void (APIENTRYP pfn_glVertexAttribs4svNV) (GLuint, GLsizei, const GLshort*); +extern pfn_glVertexAttribs4svNV fp_glVertexAttribs4svNV; +typedef void (APIENTRYP pfn_glVertexAttribs4ubvNV) (GLuint, GLsizei, const GLubyte*); +extern pfn_glVertexAttribs4ubvNV fp_glVertexAttribs4ubvNV; + + /* GL_NV_vertex_program1_1 */ +extern GLboolean GLAD_NV_vertex_program1_1; + + /* GL_NV_vertex_program2 */ +extern GLboolean GLAD_NV_vertex_program2; + + /* GL_NV_vertex_program2_option */ +extern GLboolean GLAD_NV_vertex_program2_option; + + /* GL_NV_vertex_program3 */ +extern GLboolean GLAD_NV_vertex_program3; + + /* GL_NV_vertex_program4 */ +extern GLboolean GLAD_NV_vertex_program4; +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +typedef void (APIENTRYP pfn_glVertexAttribI1iEXT) (GLuint, GLint); +extern pfn_glVertexAttribI1iEXT fp_glVertexAttribI1iEXT; +typedef void (APIENTRYP pfn_glVertexAttribI2iEXT) (GLuint, GLint, GLint); +extern pfn_glVertexAttribI2iEXT fp_glVertexAttribI2iEXT; +typedef void (APIENTRYP pfn_glVertexAttribI3iEXT) (GLuint, GLint, GLint, GLint); +extern pfn_glVertexAttribI3iEXT fp_glVertexAttribI3iEXT; +typedef void (APIENTRYP pfn_glVertexAttribI4iEXT) (GLuint, GLint, GLint, GLint, GLint); +extern pfn_glVertexAttribI4iEXT fp_glVertexAttribI4iEXT; +typedef void (APIENTRYP pfn_glVertexAttribI1uiEXT) (GLuint, GLuint); +extern pfn_glVertexAttribI1uiEXT fp_glVertexAttribI1uiEXT; +typedef void (APIENTRYP pfn_glVertexAttribI2uiEXT) (GLuint, GLuint, GLuint); +extern pfn_glVertexAttribI2uiEXT fp_glVertexAttribI2uiEXT; +typedef void (APIENTRYP pfn_glVertexAttribI3uiEXT) (GLuint, GLuint, GLuint, GLuint); +extern pfn_glVertexAttribI3uiEXT fp_glVertexAttribI3uiEXT; +typedef void (APIENTRYP pfn_glVertexAttribI4uiEXT) (GLuint, GLuint, GLuint, GLuint, GLuint); +extern pfn_glVertexAttribI4uiEXT fp_glVertexAttribI4uiEXT; +typedef void (APIENTRYP pfn_glVertexAttribI1ivEXT) (GLuint, const GLint*); +extern pfn_glVertexAttribI1ivEXT fp_glVertexAttribI1ivEXT; +typedef void (APIENTRYP pfn_glVertexAttribI2ivEXT) (GLuint, const GLint*); +extern pfn_glVertexAttribI2ivEXT fp_glVertexAttribI2ivEXT; +typedef void (APIENTRYP pfn_glVertexAttribI3ivEXT) (GLuint, const GLint*); +extern pfn_glVertexAttribI3ivEXT fp_glVertexAttribI3ivEXT; +typedef void (APIENTRYP pfn_glVertexAttribI4ivEXT) (GLuint, const GLint*); +extern pfn_glVertexAttribI4ivEXT fp_glVertexAttribI4ivEXT; +typedef void (APIENTRYP pfn_glVertexAttribI1uivEXT) (GLuint, const GLuint*); +extern pfn_glVertexAttribI1uivEXT fp_glVertexAttribI1uivEXT; +typedef void (APIENTRYP pfn_glVertexAttribI2uivEXT) (GLuint, const GLuint*); +extern pfn_glVertexAttribI2uivEXT fp_glVertexAttribI2uivEXT; +typedef void (APIENTRYP pfn_glVertexAttribI3uivEXT) (GLuint, const GLuint*); +extern pfn_glVertexAttribI3uivEXT fp_glVertexAttribI3uivEXT; +typedef void (APIENTRYP pfn_glVertexAttribI4uivEXT) (GLuint, const GLuint*); +extern pfn_glVertexAttribI4uivEXT fp_glVertexAttribI4uivEXT; +typedef void (APIENTRYP pfn_glVertexAttribI4bvEXT) (GLuint, const GLbyte*); +extern pfn_glVertexAttribI4bvEXT fp_glVertexAttribI4bvEXT; +typedef void (APIENTRYP pfn_glVertexAttribI4svEXT) (GLuint, const GLshort*); +extern pfn_glVertexAttribI4svEXT fp_glVertexAttribI4svEXT; +typedef void (APIENTRYP pfn_glVertexAttribI4ubvEXT) (GLuint, const GLubyte*); +extern pfn_glVertexAttribI4ubvEXT fp_glVertexAttribI4ubvEXT; +typedef void (APIENTRYP pfn_glVertexAttribI4usvEXT) (GLuint, const GLushort*); +extern pfn_glVertexAttribI4usvEXT fp_glVertexAttribI4usvEXT; +typedef void (APIENTRYP pfn_glVertexAttribIPointerEXT) (GLuint, GLint, GLenum, GLsizei, const void*); +extern pfn_glVertexAttribIPointerEXT fp_glVertexAttribIPointerEXT; +typedef void (APIENTRYP pfn_glGetVertexAttribIivEXT) (GLuint, GLenum, GLint*); +extern pfn_glGetVertexAttribIivEXT fp_glGetVertexAttribIivEXT; +typedef void (APIENTRYP pfn_glGetVertexAttribIuivEXT) (GLuint, GLenum, GLuint*); +extern pfn_glGetVertexAttribIuivEXT fp_glGetVertexAttribIuivEXT; + + /* GL_NV_video_capture */ +extern GLboolean GLAD_NV_video_capture; +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +typedef void (APIENTRYP pfn_glBeginVideoCaptureNV) (GLuint); +extern pfn_glBeginVideoCaptureNV fp_glBeginVideoCaptureNV; +typedef void (APIENTRYP pfn_glBindVideoCaptureStreamBufferNV) (GLuint, GLuint, GLenum, GLintptrARB); +extern pfn_glBindVideoCaptureStreamBufferNV fp_glBindVideoCaptureStreamBufferNV; +typedef void (APIENTRYP pfn_glBindVideoCaptureStreamTextureNV) (GLuint, GLuint, GLenum, GLenum, GLuint); +extern pfn_glBindVideoCaptureStreamTextureNV fp_glBindVideoCaptureStreamTextureNV; +typedef void (APIENTRYP pfn_glEndVideoCaptureNV) (GLuint); +extern pfn_glEndVideoCaptureNV fp_glEndVideoCaptureNV; +typedef void (APIENTRYP pfn_glGetVideoCaptureivNV) (GLuint, GLenum, GLint*); +extern pfn_glGetVideoCaptureivNV fp_glGetVideoCaptureivNV; +typedef void (APIENTRYP pfn_glGetVideoCaptureStreamivNV) (GLuint, GLuint, GLenum, GLint*); +extern pfn_glGetVideoCaptureStreamivNV fp_glGetVideoCaptureStreamivNV; +typedef void (APIENTRYP pfn_glGetVideoCaptureStreamfvNV) (GLuint, GLuint, GLenum, GLfloat*); +extern pfn_glGetVideoCaptureStreamfvNV fp_glGetVideoCaptureStreamfvNV; +typedef void (APIENTRYP pfn_glGetVideoCaptureStreamdvNV) (GLuint, GLuint, GLenum, GLdouble*); +extern pfn_glGetVideoCaptureStreamdvNV fp_glGetVideoCaptureStreamdvNV; +typedef GLenum (APIENTRYP pfn_glVideoCaptureNV) (GLuint, GLuint*, GLuint64EXT*); +extern pfn_glVideoCaptureNV fp_glVideoCaptureNV; +typedef void (APIENTRYP pfn_glVideoCaptureStreamParameterivNV) (GLuint, GLuint, GLenum, const GLint*); +extern pfn_glVideoCaptureStreamParameterivNV fp_glVideoCaptureStreamParameterivNV; +typedef void (APIENTRYP pfn_glVideoCaptureStreamParameterfvNV) (GLuint, GLuint, GLenum, const GLfloat*); +extern pfn_glVideoCaptureStreamParameterfvNV fp_glVideoCaptureStreamParameterfvNV; +typedef void (APIENTRYP pfn_glVideoCaptureStreamParameterdvNV) (GLuint, GLuint, GLenum, const GLdouble*); +extern pfn_glVideoCaptureStreamParameterdvNV fp_glVideoCaptureStreamParameterdvNV; + + /* GL_NVX_conditional_render */ +extern GLboolean GLAD_NVX_conditional_render; +typedef void (APIENTRYP pfn_glBeginConditionalRenderNVX) (GLuint); +extern pfn_glBeginConditionalRenderNVX fp_glBeginConditionalRenderNVX; +typedef void (APIENTRYP pfn_glEndConditionalRenderNVX) (); +extern pfn_glEndConditionalRenderNVX fp_glEndConditionalRenderNVX; + + /* GL_OML_interlace */ +extern GLboolean GLAD_OML_interlace; +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 + + /* GL_OML_resample */ +extern GLboolean GLAD_OML_resample; +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 + + /* GL_OML_subsample */ +extern GLboolean GLAD_OML_subsample; +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 + + /* GL_PGI_misc_hints */ +extern GLboolean GLAD_PGI_misc_hints; +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +typedef void (APIENTRYP pfn_glHintPGI) (GLenum, GLint); +extern pfn_glHintPGI fp_glHintPGI; + + /* GL_PGI_vertex_hints */ +extern GLboolean GLAD_PGI_vertex_hints; +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 + + /* GL_QCOM_alpha_test */ +extern GLboolean GLAD_QCOM_alpha_test; +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 +typedef void (APIENTRYP pfn_glAlphaFuncQCOM) (GLenum, GLclampf); +extern pfn_glAlphaFuncQCOM fp_glAlphaFuncQCOM; + + /* GL_QCOM_binning_control */ +extern GLboolean GLAD_QCOM_binning_control; +#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 +#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 +#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 +#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 + + /* GL_QCOM_driver_control */ +extern GLboolean GLAD_QCOM_driver_control; +typedef void (APIENTRYP pfn_glGetDriverControlsQCOM) (GLint*, GLsizei, GLuint*); +extern pfn_glGetDriverControlsQCOM fp_glGetDriverControlsQCOM; +typedef void (APIENTRYP pfn_glGetDriverControlStringQCOM) (GLuint, GLsizei, GLsizei*, GLchar*); +extern pfn_glGetDriverControlStringQCOM fp_glGetDriverControlStringQCOM; +typedef void (APIENTRYP pfn_glEnableDriverControlQCOM) (GLuint); +extern pfn_glEnableDriverControlQCOM fp_glEnableDriverControlQCOM; +typedef void (APIENTRYP pfn_glDisableDriverControlQCOM) (GLuint); +extern pfn_glDisableDriverControlQCOM fp_glDisableDriverControlQCOM; + + /* GL_QCOM_extended_get */ +extern GLboolean GLAD_QCOM_extended_get; +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_STATE_RESTORE 0x8BDC +typedef void (APIENTRYP pfn_glExtGetTexturesQCOM) (GLuint*, GLint, GLint*); +extern pfn_glExtGetTexturesQCOM fp_glExtGetTexturesQCOM; +typedef void (APIENTRYP pfn_glExtGetBuffersQCOM) (GLuint*, GLint, GLint*); +extern pfn_glExtGetBuffersQCOM fp_glExtGetBuffersQCOM; +typedef void (APIENTRYP pfn_glExtGetRenderbuffersQCOM) (GLuint*, GLint, GLint*); +extern pfn_glExtGetRenderbuffersQCOM fp_glExtGetRenderbuffersQCOM; +typedef void (APIENTRYP pfn_glExtGetFramebuffersQCOM) (GLuint*, GLint, GLint*); +extern pfn_glExtGetFramebuffersQCOM fp_glExtGetFramebuffersQCOM; +typedef void (APIENTRYP pfn_glExtGetTexLevelParameterivQCOM) (GLuint, GLenum, GLint, GLenum, GLint*); +extern pfn_glExtGetTexLevelParameterivQCOM fp_glExtGetTexLevelParameterivQCOM; +typedef void (APIENTRYP pfn_glExtTexObjectStateOverrideiQCOM) (GLenum, GLenum, GLint); +extern pfn_glExtTexObjectStateOverrideiQCOM fp_glExtTexObjectStateOverrideiQCOM; +typedef void (APIENTRYP pfn_glExtGetTexSubImageQCOM) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, void*); +extern pfn_glExtGetTexSubImageQCOM fp_glExtGetTexSubImageQCOM; +typedef void (APIENTRYP pfn_glExtGetBufferPointervQCOM) (GLenum, void**); +extern pfn_glExtGetBufferPointervQCOM fp_glExtGetBufferPointervQCOM; + + /* GL_QCOM_extended_get2 */ +extern GLboolean GLAD_QCOM_extended_get2; +typedef void (APIENTRYP pfn_glExtGetShadersQCOM) (GLuint*, GLint, GLint*); +extern pfn_glExtGetShadersQCOM fp_glExtGetShadersQCOM; +typedef void (APIENTRYP pfn_glExtGetProgramsQCOM) (GLuint*, GLint, GLint*); +extern pfn_glExtGetProgramsQCOM fp_glExtGetProgramsQCOM; +typedef GLboolean (APIENTRYP pfn_glExtIsProgramBinaryQCOM) (GLuint); +extern pfn_glExtIsProgramBinaryQCOM fp_glExtIsProgramBinaryQCOM; +typedef void (APIENTRYP pfn_glExtGetProgramBinarySourceQCOM) (GLuint, GLenum, GLchar*, GLint*); +extern pfn_glExtGetProgramBinarySourceQCOM fp_glExtGetProgramBinarySourceQCOM; + + /* GL_QCOM_perfmon_global_mode */ +extern GLboolean GLAD_QCOM_perfmon_global_mode; +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 + + /* GL_QCOM_tiled_rendering */ +extern GLboolean GLAD_QCOM_tiled_rendering; +#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 +#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 +#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 +#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 +#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 +#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 +#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 +#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 +#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 +#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 +#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 +#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 +#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 +#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 +#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 +#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 +#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 +#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 +#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 +#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 +#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 +#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 +#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 +#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 +#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 +#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 +#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 +#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 +#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 +#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 +#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 +#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 +typedef void (APIENTRYP pfn_glStartTilingQCOM) (GLuint, GLuint, GLuint, GLuint, GLbitfield); +extern pfn_glStartTilingQCOM fp_glStartTilingQCOM; +typedef void (APIENTRYP pfn_glEndTilingQCOM) (GLbitfield); +extern pfn_glEndTilingQCOM fp_glEndTilingQCOM; + + /* GL_QCOM_writeonly_rendering */ +extern GLboolean GLAD_QCOM_writeonly_rendering; +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 + + /* GL_REND_screen_coordinates */ +extern GLboolean GLAD_REND_screen_coordinates; +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 + + /* GL_S3_s3tc */ +extern GLboolean GLAD_S3_s3tc; +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 + + /* GL_SGIS_generate_mipmap */ +extern GLboolean GLAD_SGIS_generate_mipmap; +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + + /* GL_SGIX_texture_lod_bias */ +extern GLboolean GLAD_SGIX_texture_lod_bias; +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 + + /* GL_VIV_shader_binary */ +extern GLboolean GLAD_VIV_shader_binary; +#define GL_SHADER_BINARY_VIV 0x8FC4 + +} /* namespace glad */ + +#endif /* __glad_hpp_ */ diff --git a/jni/love/src/libraries/glad/gladfuncs.hpp b/jni/love/src/libraries/glad/gladfuncs.hpp new file mode 100644 index 00000000..1b3d7ebe --- /dev/null +++ b/jni/love/src/libraries/glad/gladfuncs.hpp @@ -0,0 +1,2986 @@ + +/** + * The MIT License (MIT) + * + * Copyright (c) 2013 David Herberth, modified by Alex Szpakowski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + **/ + + +#ifndef __glad_funcs_hpp_ +#define __glad_funcs_hpp_ + +#include "glad.hpp" + +namespace glad { + + +/* GL_VERSION_1_0 */ +inline void glCullFace(GLenum mode) { fp_glCullFace(mode); } +inline void glFrontFace(GLenum mode) { fp_glFrontFace(mode); } +inline void glHint(GLenum target, GLenum mode) { fp_glHint(target, mode); } +inline void glLineWidth(GLfloat width) { fp_glLineWidth(width); } +inline void glPointSize(GLfloat size) { fp_glPointSize(size); } +inline void glPolygonMode(GLenum face, GLenum mode) { fp_glPolygonMode(face, mode); } +inline void glScissor(GLint x, GLint y, GLsizei width, GLsizei height) { fp_glScissor(x, y, width, height); } +inline void glTexParameterf(GLenum target, GLenum pname, GLfloat param) { fp_glTexParameterf(target, pname, param); } +inline void glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params) { fp_glTexParameterfv(target, pname, params); } +inline void glTexParameteri(GLenum target, GLenum pname, GLint param) { fp_glTexParameteri(target, pname, param); } +inline void glTexParameteriv(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameteriv(target, pname, params); } +inline void glTexImage1D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage1D(target, level, internalformat, width, border, format, type, pixels); } +inline void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels); } +inline void glDrawBuffer(GLenum mode) { fp_glDrawBuffer(mode); } +inline void glClear(GLbitfield mask) { fp_glClear(mask); } +inline void glClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glClearColor(red, green, blue, alpha); } +inline void glClearStencil(GLint s) { fp_glClearStencil(s); } +inline void glClearDepth(GLdouble depth) { fp_glClearDepth(depth); } +inline void glStencilMask(GLuint mask) { fp_glStencilMask(mask); } +inline void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { fp_glColorMask(red, green, blue, alpha); } +inline void glDepthMask(GLboolean flag) { fp_glDepthMask(flag); } +inline void glDisable(GLenum cap) { fp_glDisable(cap); } +inline void glEnable(GLenum cap) { fp_glEnable(cap); } +inline void glFinish() { fp_glFinish(); } +inline void glFlush() { fp_glFlush(); } +inline void glBlendFunc(GLenum sfactor, GLenum dfactor) { fp_glBlendFunc(sfactor, dfactor); } +inline void glLogicOp(GLenum opcode) { fp_glLogicOp(opcode); } +inline void glStencilFunc(GLenum func, GLint ref, GLuint mask) { fp_glStencilFunc(func, ref, mask); } +inline void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass) { fp_glStencilOp(fail, zfail, zpass); } +inline void glDepthFunc(GLenum func) { fp_glDepthFunc(func); } +inline void glPixelStoref(GLenum pname, GLfloat param) { fp_glPixelStoref(pname, param); } +inline void glPixelStorei(GLenum pname, GLint param) { fp_glPixelStorei(pname, param); } +inline void glReadBuffer(GLenum mode) { fp_glReadBuffer(mode); } +inline void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) { fp_glReadPixels(x, y, width, height, format, type, pixels); } +inline void glGetBooleanv(GLenum pname, GLboolean* data) { fp_glGetBooleanv(pname, data); } +inline void glGetDoublev(GLenum pname, GLdouble* data) { fp_glGetDoublev(pname, data); } +inline GLenum glGetError() { return fp_glGetError(); } +inline void glGetFloatv(GLenum pname, GLfloat* data) { fp_glGetFloatv(pname, data); } +inline void glGetIntegerv(GLenum pname, GLint* data) { fp_glGetIntegerv(pname, data); } +inline const GLubyte* glGetString(GLenum name) { return fp_glGetString(name); } +inline void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void* pixels) { fp_glGetTexImage(target, level, format, type, pixels); } +inline void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) { fp_glGetTexParameterfv(target, pname, params); } +inline void glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameteriv(target, pname, params); } +inline void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat* params) { fp_glGetTexLevelParameterfv(target, level, pname, params); } +inline void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint* params) { fp_glGetTexLevelParameteriv(target, level, pname, params); } +inline GLboolean glIsEnabled(GLenum cap) { return fp_glIsEnabled(cap); } +inline void glDepthRange(GLdouble near, GLdouble far) { fp_glDepthRange(near, far); } +inline void glViewport(GLint x, GLint y, GLsizei width, GLsizei height) { fp_glViewport(x, y, width, height); } +inline void glNewList(GLuint list, GLenum mode) { fp_glNewList(list, mode); } +inline void glEndList() { fp_glEndList(); } +inline void glCallList(GLuint list) { fp_glCallList(list); } +inline void glCallLists(GLsizei n, GLenum type, const void* lists) { fp_glCallLists(n, type, lists); } +inline void glDeleteLists(GLuint list, GLsizei range) { fp_glDeleteLists(list, range); } +inline GLuint glGenLists(GLsizei range) { return fp_glGenLists(range); } +inline void glListBase(GLuint base) { fp_glListBase(base); } +inline void glBegin(GLenum mode) { fp_glBegin(mode); } +inline void glBitmap(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte* bitmap) { fp_glBitmap(width, height, xorig, yorig, xmove, ymove, bitmap); } +inline void glColor3b(GLbyte red, GLbyte green, GLbyte blue) { fp_glColor3b(red, green, blue); } +inline void glColor3bv(const GLbyte* v) { fp_glColor3bv(v); } +inline void glColor3d(GLdouble red, GLdouble green, GLdouble blue) { fp_glColor3d(red, green, blue); } +inline void glColor3dv(const GLdouble* v) { fp_glColor3dv(v); } +inline void glColor3f(GLfloat red, GLfloat green, GLfloat blue) { fp_glColor3f(red, green, blue); } +inline void glColor3fv(const GLfloat* v) { fp_glColor3fv(v); } +inline void glColor3i(GLint red, GLint green, GLint blue) { fp_glColor3i(red, green, blue); } +inline void glColor3iv(const GLint* v) { fp_glColor3iv(v); } +inline void glColor3s(GLshort red, GLshort green, GLshort blue) { fp_glColor3s(red, green, blue); } +inline void glColor3sv(const GLshort* v) { fp_glColor3sv(v); } +inline void glColor3ub(GLubyte red, GLubyte green, GLubyte blue) { fp_glColor3ub(red, green, blue); } +inline void glColor3ubv(const GLubyte* v) { fp_glColor3ubv(v); } +inline void glColor3ui(GLuint red, GLuint green, GLuint blue) { fp_glColor3ui(red, green, blue); } +inline void glColor3uiv(const GLuint* v) { fp_glColor3uiv(v); } +inline void glColor3us(GLushort red, GLushort green, GLushort blue) { fp_glColor3us(red, green, blue); } +inline void glColor3usv(const GLushort* v) { fp_glColor3usv(v); } +inline void glColor4b(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) { fp_glColor4b(red, green, blue, alpha); } +inline void glColor4bv(const GLbyte* v) { fp_glColor4bv(v); } +inline void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) { fp_glColor4d(red, green, blue, alpha); } +inline void glColor4dv(const GLdouble* v) { fp_glColor4dv(v); } +inline void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glColor4f(red, green, blue, alpha); } +inline void glColor4fv(const GLfloat* v) { fp_glColor4fv(v); } +inline void glColor4i(GLint red, GLint green, GLint blue, GLint alpha) { fp_glColor4i(red, green, blue, alpha); } +inline void glColor4iv(const GLint* v) { fp_glColor4iv(v); } +inline void glColor4s(GLshort red, GLshort green, GLshort blue, GLshort alpha) { fp_glColor4s(red, green, blue, alpha); } +inline void glColor4sv(const GLshort* v) { fp_glColor4sv(v); } +inline void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) { fp_glColor4ub(red, green, blue, alpha); } +inline void glColor4ubv(const GLubyte* v) { fp_glColor4ubv(v); } +inline void glColor4ui(GLuint red, GLuint green, GLuint blue, GLuint alpha) { fp_glColor4ui(red, green, blue, alpha); } +inline void glColor4uiv(const GLuint* v) { fp_glColor4uiv(v); } +inline void glColor4us(GLushort red, GLushort green, GLushort blue, GLushort alpha) { fp_glColor4us(red, green, blue, alpha); } +inline void glColor4usv(const GLushort* v) { fp_glColor4usv(v); } +inline void glEdgeFlag(GLboolean flag) { fp_glEdgeFlag(flag); } +inline void glEdgeFlagv(const GLboolean* flag) { fp_glEdgeFlagv(flag); } +inline void glEnd() { fp_glEnd(); } +inline void glIndexd(GLdouble c) { fp_glIndexd(c); } +inline void glIndexdv(const GLdouble* c) { fp_glIndexdv(c); } +inline void glIndexf(GLfloat c) { fp_glIndexf(c); } +inline void glIndexfv(const GLfloat* c) { fp_glIndexfv(c); } +inline void glIndexi(GLint c) { fp_glIndexi(c); } +inline void glIndexiv(const GLint* c) { fp_glIndexiv(c); } +inline void glIndexs(GLshort c) { fp_glIndexs(c); } +inline void glIndexsv(const GLshort* c) { fp_glIndexsv(c); } +inline void glNormal3b(GLbyte nx, GLbyte ny, GLbyte nz) { fp_glNormal3b(nx, ny, nz); } +inline void glNormal3bv(const GLbyte* v) { fp_glNormal3bv(v); } +inline void glNormal3d(GLdouble nx, GLdouble ny, GLdouble nz) { fp_glNormal3d(nx, ny, nz); } +inline void glNormal3dv(const GLdouble* v) { fp_glNormal3dv(v); } +inline void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz) { fp_glNormal3f(nx, ny, nz); } +inline void glNormal3fv(const GLfloat* v) { fp_glNormal3fv(v); } +inline void glNormal3i(GLint nx, GLint ny, GLint nz) { fp_glNormal3i(nx, ny, nz); } +inline void glNormal3iv(const GLint* v) { fp_glNormal3iv(v); } +inline void glNormal3s(GLshort nx, GLshort ny, GLshort nz) { fp_glNormal3s(nx, ny, nz); } +inline void glNormal3sv(const GLshort* v) { fp_glNormal3sv(v); } +inline void glRasterPos2d(GLdouble x, GLdouble y) { fp_glRasterPos2d(x, y); } +inline void glRasterPos2dv(const GLdouble* v) { fp_glRasterPos2dv(v); } +inline void glRasterPos2f(GLfloat x, GLfloat y) { fp_glRasterPos2f(x, y); } +inline void glRasterPos2fv(const GLfloat* v) { fp_glRasterPos2fv(v); } +inline void glRasterPos2i(GLint x, GLint y) { fp_glRasterPos2i(x, y); } +inline void glRasterPos2iv(const GLint* v) { fp_glRasterPos2iv(v); } +inline void glRasterPos2s(GLshort x, GLshort y) { fp_glRasterPos2s(x, y); } +inline void glRasterPos2sv(const GLshort* v) { fp_glRasterPos2sv(v); } +inline void glRasterPos3d(GLdouble x, GLdouble y, GLdouble z) { fp_glRasterPos3d(x, y, z); } +inline void glRasterPos3dv(const GLdouble* v) { fp_glRasterPos3dv(v); } +inline void glRasterPos3f(GLfloat x, GLfloat y, GLfloat z) { fp_glRasterPos3f(x, y, z); } +inline void glRasterPos3fv(const GLfloat* v) { fp_glRasterPos3fv(v); } +inline void glRasterPos3i(GLint x, GLint y, GLint z) { fp_glRasterPos3i(x, y, z); } +inline void glRasterPos3iv(const GLint* v) { fp_glRasterPos3iv(v); } +inline void glRasterPos3s(GLshort x, GLshort y, GLshort z) { fp_glRasterPos3s(x, y, z); } +inline void glRasterPos3sv(const GLshort* v) { fp_glRasterPos3sv(v); } +inline void glRasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glRasterPos4d(x, y, z, w); } +inline void glRasterPos4dv(const GLdouble* v) { fp_glRasterPos4dv(v); } +inline void glRasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glRasterPos4f(x, y, z, w); } +inline void glRasterPos4fv(const GLfloat* v) { fp_glRasterPos4fv(v); } +inline void glRasterPos4i(GLint x, GLint y, GLint z, GLint w) { fp_glRasterPos4i(x, y, z, w); } +inline void glRasterPos4iv(const GLint* v) { fp_glRasterPos4iv(v); } +inline void glRasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) { fp_glRasterPos4s(x, y, z, w); } +inline void glRasterPos4sv(const GLshort* v) { fp_glRasterPos4sv(v); } +inline void glRectd(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) { fp_glRectd(x1, y1, x2, y2); } +inline void glRectdv(const GLdouble* v1, const GLdouble* v2) { fp_glRectdv(v1, v2); } +inline void glRectf(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) { fp_glRectf(x1, y1, x2, y2); } +inline void glRectfv(const GLfloat* v1, const GLfloat* v2) { fp_glRectfv(v1, v2); } +inline void glRecti(GLint x1, GLint y1, GLint x2, GLint y2) { fp_glRecti(x1, y1, x2, y2); } +inline void glRectiv(const GLint* v1, const GLint* v2) { fp_glRectiv(v1, v2); } +inline void glRects(GLshort x1, GLshort y1, GLshort x2, GLshort y2) { fp_glRects(x1, y1, x2, y2); } +inline void glRectsv(const GLshort* v1, const GLshort* v2) { fp_glRectsv(v1, v2); } +inline void glTexCoord1d(GLdouble s) { fp_glTexCoord1d(s); } +inline void glTexCoord1dv(const GLdouble* v) { fp_glTexCoord1dv(v); } +inline void glTexCoord1f(GLfloat s) { fp_glTexCoord1f(s); } +inline void glTexCoord1fv(const GLfloat* v) { fp_glTexCoord1fv(v); } +inline void glTexCoord1i(GLint s) { fp_glTexCoord1i(s); } +inline void glTexCoord1iv(const GLint* v) { fp_glTexCoord1iv(v); } +inline void glTexCoord1s(GLshort s) { fp_glTexCoord1s(s); } +inline void glTexCoord1sv(const GLshort* v) { fp_glTexCoord1sv(v); } +inline void glTexCoord2d(GLdouble s, GLdouble t) { fp_glTexCoord2d(s, t); } +inline void glTexCoord2dv(const GLdouble* v) { fp_glTexCoord2dv(v); } +inline void glTexCoord2f(GLfloat s, GLfloat t) { fp_glTexCoord2f(s, t); } +inline void glTexCoord2fv(const GLfloat* v) { fp_glTexCoord2fv(v); } +inline void glTexCoord2i(GLint s, GLint t) { fp_glTexCoord2i(s, t); } +inline void glTexCoord2iv(const GLint* v) { fp_glTexCoord2iv(v); } +inline void glTexCoord2s(GLshort s, GLshort t) { fp_glTexCoord2s(s, t); } +inline void glTexCoord2sv(const GLshort* v) { fp_glTexCoord2sv(v); } +inline void glTexCoord3d(GLdouble s, GLdouble t, GLdouble r) { fp_glTexCoord3d(s, t, r); } +inline void glTexCoord3dv(const GLdouble* v) { fp_glTexCoord3dv(v); } +inline void glTexCoord3f(GLfloat s, GLfloat t, GLfloat r) { fp_glTexCoord3f(s, t, r); } +inline void glTexCoord3fv(const GLfloat* v) { fp_glTexCoord3fv(v); } +inline void glTexCoord3i(GLint s, GLint t, GLint r) { fp_glTexCoord3i(s, t, r); } +inline void glTexCoord3iv(const GLint* v) { fp_glTexCoord3iv(v); } +inline void glTexCoord3s(GLshort s, GLshort t, GLshort r) { fp_glTexCoord3s(s, t, r); } +inline void glTexCoord3sv(const GLshort* v) { fp_glTexCoord3sv(v); } +inline void glTexCoord4d(GLdouble s, GLdouble t, GLdouble r, GLdouble q) { fp_glTexCoord4d(s, t, r, q); } +inline void glTexCoord4dv(const GLdouble* v) { fp_glTexCoord4dv(v); } +inline void glTexCoord4f(GLfloat s, GLfloat t, GLfloat r, GLfloat q) { fp_glTexCoord4f(s, t, r, q); } +inline void glTexCoord4fv(const GLfloat* v) { fp_glTexCoord4fv(v); } +inline void glTexCoord4i(GLint s, GLint t, GLint r, GLint q) { fp_glTexCoord4i(s, t, r, q); } +inline void glTexCoord4iv(const GLint* v) { fp_glTexCoord4iv(v); } +inline void glTexCoord4s(GLshort s, GLshort t, GLshort r, GLshort q) { fp_glTexCoord4s(s, t, r, q); } +inline void glTexCoord4sv(const GLshort* v) { fp_glTexCoord4sv(v); } +inline void glVertex2d(GLdouble x, GLdouble y) { fp_glVertex2d(x, y); } +inline void glVertex2dv(const GLdouble* v) { fp_glVertex2dv(v); } +inline void glVertex2f(GLfloat x, GLfloat y) { fp_glVertex2f(x, y); } +inline void glVertex2fv(const GLfloat* v) { fp_glVertex2fv(v); } +inline void glVertex2i(GLint x, GLint y) { fp_glVertex2i(x, y); } +inline void glVertex2iv(const GLint* v) { fp_glVertex2iv(v); } +inline void glVertex2s(GLshort x, GLshort y) { fp_glVertex2s(x, y); } +inline void glVertex2sv(const GLshort* v) { fp_glVertex2sv(v); } +inline void glVertex3d(GLdouble x, GLdouble y, GLdouble z) { fp_glVertex3d(x, y, z); } +inline void glVertex3dv(const GLdouble* v) { fp_glVertex3dv(v); } +inline void glVertex3f(GLfloat x, GLfloat y, GLfloat z) { fp_glVertex3f(x, y, z); } +inline void glVertex3fv(const GLfloat* v) { fp_glVertex3fv(v); } +inline void glVertex3i(GLint x, GLint y, GLint z) { fp_glVertex3i(x, y, z); } +inline void glVertex3iv(const GLint* v) { fp_glVertex3iv(v); } +inline void glVertex3s(GLshort x, GLshort y, GLshort z) { fp_glVertex3s(x, y, z); } +inline void glVertex3sv(const GLshort* v) { fp_glVertex3sv(v); } +inline void glVertex4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertex4d(x, y, z, w); } +inline void glVertex4dv(const GLdouble* v) { fp_glVertex4dv(v); } +inline void glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertex4f(x, y, z, w); } +inline void glVertex4fv(const GLfloat* v) { fp_glVertex4fv(v); } +inline void glVertex4i(GLint x, GLint y, GLint z, GLint w) { fp_glVertex4i(x, y, z, w); } +inline void glVertex4iv(const GLint* v) { fp_glVertex4iv(v); } +inline void glVertex4s(GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertex4s(x, y, z, w); } +inline void glVertex4sv(const GLshort* v) { fp_glVertex4sv(v); } +inline void glClipPlane(GLenum plane, const GLdouble* equation) { fp_glClipPlane(plane, equation); } +inline void glColorMaterial(GLenum face, GLenum mode) { fp_glColorMaterial(face, mode); } +inline void glFogf(GLenum pname, GLfloat param) { fp_glFogf(pname, param); } +inline void glFogfv(GLenum pname, const GLfloat* params) { fp_glFogfv(pname, params); } +inline void glFogi(GLenum pname, GLint param) { fp_glFogi(pname, param); } +inline void glFogiv(GLenum pname, const GLint* params) { fp_glFogiv(pname, params); } +inline void glLightf(GLenum light, GLenum pname, GLfloat param) { fp_glLightf(light, pname, param); } +inline void glLightfv(GLenum light, GLenum pname, const GLfloat* params) { fp_glLightfv(light, pname, params); } +inline void glLighti(GLenum light, GLenum pname, GLint param) { fp_glLighti(light, pname, param); } +inline void glLightiv(GLenum light, GLenum pname, const GLint* params) { fp_glLightiv(light, pname, params); } +inline void glLightModelf(GLenum pname, GLfloat param) { fp_glLightModelf(pname, param); } +inline void glLightModelfv(GLenum pname, const GLfloat* params) { fp_glLightModelfv(pname, params); } +inline void glLightModeli(GLenum pname, GLint param) { fp_glLightModeli(pname, param); } +inline void glLightModeliv(GLenum pname, const GLint* params) { fp_glLightModeliv(pname, params); } +inline void glLineStipple(GLint factor, GLushort pattern) { fp_glLineStipple(factor, pattern); } +inline void glMaterialf(GLenum face, GLenum pname, GLfloat param) { fp_glMaterialf(face, pname, param); } +inline void glMaterialfv(GLenum face, GLenum pname, const GLfloat* params) { fp_glMaterialfv(face, pname, params); } +inline void glMateriali(GLenum face, GLenum pname, GLint param) { fp_glMateriali(face, pname, param); } +inline void glMaterialiv(GLenum face, GLenum pname, const GLint* params) { fp_glMaterialiv(face, pname, params); } +inline void glPolygonStipple(const GLubyte* mask) { fp_glPolygonStipple(mask); } +inline void glShadeModel(GLenum mode) { fp_glShadeModel(mode); } +inline void glTexEnvf(GLenum target, GLenum pname, GLfloat param) { fp_glTexEnvf(target, pname, param); } +inline void glTexEnvfv(GLenum target, GLenum pname, const GLfloat* params) { fp_glTexEnvfv(target, pname, params); } +inline void glTexEnvi(GLenum target, GLenum pname, GLint param) { fp_glTexEnvi(target, pname, param); } +inline void glTexEnviv(GLenum target, GLenum pname, const GLint* params) { fp_glTexEnviv(target, pname, params); } +inline void glTexGend(GLenum coord, GLenum pname, GLdouble param) { fp_glTexGend(coord, pname, param); } +inline void glTexGendv(GLenum coord, GLenum pname, const GLdouble* params) { fp_glTexGendv(coord, pname, params); } +inline void glTexGenf(GLenum coord, GLenum pname, GLfloat param) { fp_glTexGenf(coord, pname, param); } +inline void glTexGenfv(GLenum coord, GLenum pname, const GLfloat* params) { fp_glTexGenfv(coord, pname, params); } +inline void glTexGeni(GLenum coord, GLenum pname, GLint param) { fp_glTexGeni(coord, pname, param); } +inline void glTexGeniv(GLenum coord, GLenum pname, const GLint* params) { fp_glTexGeniv(coord, pname, params); } +inline void glFeedbackBuffer(GLsizei size, GLenum type, GLfloat* buffer) { fp_glFeedbackBuffer(size, type, buffer); } +inline void glSelectBuffer(GLsizei size, GLuint* buffer) { fp_glSelectBuffer(size, buffer); } +inline GLint glRenderMode(GLenum mode) { return fp_glRenderMode(mode); } +inline void glInitNames() { fp_glInitNames(); } +inline void glLoadName(GLuint name) { fp_glLoadName(name); } +inline void glPassThrough(GLfloat token) { fp_glPassThrough(token); } +inline void glPopName() { fp_glPopName(); } +inline void glPushName(GLuint name) { fp_glPushName(name); } +inline void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glClearAccum(red, green, blue, alpha); } +inline void glClearIndex(GLfloat c) { fp_glClearIndex(c); } +inline void glIndexMask(GLuint mask) { fp_glIndexMask(mask); } +inline void glAccum(GLenum op, GLfloat value) { fp_glAccum(op, value); } +inline void glPopAttrib() { fp_glPopAttrib(); } +inline void glPushAttrib(GLbitfield mask) { fp_glPushAttrib(mask); } +inline void glMap1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points) { fp_glMap1d(target, u1, u2, stride, order, points); } +inline void glMap1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points) { fp_glMap1f(target, u1, u2, stride, order, points); } +inline void glMap2d(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points) { fp_glMap2d(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); } +inline void glMap2f(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points) { fp_glMap2f(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); } +inline void glMapGrid1d(GLint un, GLdouble u1, GLdouble u2) { fp_glMapGrid1d(un, u1, u2); } +inline void glMapGrid1f(GLint un, GLfloat u1, GLfloat u2) { fp_glMapGrid1f(un, u1, u2); } +inline void glMapGrid2d(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) { fp_glMapGrid2d(un, u1, u2, vn, v1, v2); } +inline void glMapGrid2f(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) { fp_glMapGrid2f(un, u1, u2, vn, v1, v2); } +inline void glEvalCoord1d(GLdouble u) { fp_glEvalCoord1d(u); } +inline void glEvalCoord1dv(const GLdouble* u) { fp_glEvalCoord1dv(u); } +inline void glEvalCoord1f(GLfloat u) { fp_glEvalCoord1f(u); } +inline void glEvalCoord1fv(const GLfloat* u) { fp_glEvalCoord1fv(u); } +inline void glEvalCoord2d(GLdouble u, GLdouble v) { fp_glEvalCoord2d(u, v); } +inline void glEvalCoord2dv(const GLdouble* u) { fp_glEvalCoord2dv(u); } +inline void glEvalCoord2f(GLfloat u, GLfloat v) { fp_glEvalCoord2f(u, v); } +inline void glEvalCoord2fv(const GLfloat* u) { fp_glEvalCoord2fv(u); } +inline void glEvalMesh1(GLenum mode, GLint i1, GLint i2) { fp_glEvalMesh1(mode, i1, i2); } +inline void glEvalPoint1(GLint i) { fp_glEvalPoint1(i); } +inline void glEvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) { fp_glEvalMesh2(mode, i1, i2, j1, j2); } +inline void glEvalPoint2(GLint i, GLint j) { fp_glEvalPoint2(i, j); } +inline void glAlphaFunc(GLenum func, GLfloat ref) { fp_glAlphaFunc(func, ref); } +inline void glPixelZoom(GLfloat xfactor, GLfloat yfactor) { fp_glPixelZoom(xfactor, yfactor); } +inline void glPixelTransferf(GLenum pname, GLfloat param) { fp_glPixelTransferf(pname, param); } +inline void glPixelTransferi(GLenum pname, GLint param) { fp_glPixelTransferi(pname, param); } +inline void glPixelMapfv(GLenum map, GLsizei mapsize, const GLfloat* values) { fp_glPixelMapfv(map, mapsize, values); } +inline void glPixelMapuiv(GLenum map, GLsizei mapsize, const GLuint* values) { fp_glPixelMapuiv(map, mapsize, values); } +inline void glPixelMapusv(GLenum map, GLsizei mapsize, const GLushort* values) { fp_glPixelMapusv(map, mapsize, values); } +inline void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) { fp_glCopyPixels(x, y, width, height, type); } +inline void glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glDrawPixels(width, height, format, type, pixels); } +inline void glGetClipPlane(GLenum plane, GLdouble* equation) { fp_glGetClipPlane(plane, equation); } +inline void glGetLightfv(GLenum light, GLenum pname, GLfloat* params) { fp_glGetLightfv(light, pname, params); } +inline void glGetLightiv(GLenum light, GLenum pname, GLint* params) { fp_glGetLightiv(light, pname, params); } +inline void glGetMapdv(GLenum target, GLenum query, GLdouble* v) { fp_glGetMapdv(target, query, v); } +inline void glGetMapfv(GLenum target, GLenum query, GLfloat* v) { fp_glGetMapfv(target, query, v); } +inline void glGetMapiv(GLenum target, GLenum query, GLint* v) { fp_glGetMapiv(target, query, v); } +inline void glGetMaterialfv(GLenum face, GLenum pname, GLfloat* params) { fp_glGetMaterialfv(face, pname, params); } +inline void glGetMaterialiv(GLenum face, GLenum pname, GLint* params) { fp_glGetMaterialiv(face, pname, params); } +inline void glGetPixelMapfv(GLenum map, GLfloat* values) { fp_glGetPixelMapfv(map, values); } +inline void glGetPixelMapuiv(GLenum map, GLuint* values) { fp_glGetPixelMapuiv(map, values); } +inline void glGetPixelMapusv(GLenum map, GLushort* values) { fp_glGetPixelMapusv(map, values); } +inline void glGetPolygonStipple(GLubyte* mask) { fp_glGetPolygonStipple(mask); } +inline void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat* params) { fp_glGetTexEnvfv(target, pname, params); } +inline void glGetTexEnviv(GLenum target, GLenum pname, GLint* params) { fp_glGetTexEnviv(target, pname, params); } +inline void glGetTexGendv(GLenum coord, GLenum pname, GLdouble* params) { fp_glGetTexGendv(coord, pname, params); } +inline void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat* params) { fp_glGetTexGenfv(coord, pname, params); } +inline void glGetTexGeniv(GLenum coord, GLenum pname, GLint* params) { fp_glGetTexGeniv(coord, pname, params); } +inline GLboolean glIsList(GLuint list) { return fp_glIsList(list); } +inline void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { fp_glFrustum(left, right, bottom, top, zNear, zFar); } +inline void glLoadIdentity() { fp_glLoadIdentity(); } +inline void glLoadMatrixf(const GLfloat* m) { fp_glLoadMatrixf(m); } +inline void glLoadMatrixd(const GLdouble* m) { fp_glLoadMatrixd(m); } +inline void glMatrixMode(GLenum mode) { fp_glMatrixMode(mode); } +inline void glMultMatrixf(const GLfloat* m) { fp_glMultMatrixf(m); } +inline void glMultMatrixd(const GLdouble* m) { fp_glMultMatrixd(m); } +inline void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { fp_glOrtho(left, right, bottom, top, zNear, zFar); } +inline void glPopMatrix() { fp_glPopMatrix(); } +inline void glPushMatrix() { fp_glPushMatrix(); } +inline void glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) { fp_glRotated(angle, x, y, z); } +inline void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { fp_glRotatef(angle, x, y, z); } +inline void glScaled(GLdouble x, GLdouble y, GLdouble z) { fp_glScaled(x, y, z); } +inline void glScalef(GLfloat x, GLfloat y, GLfloat z) { fp_glScalef(x, y, z); } +inline void glTranslated(GLdouble x, GLdouble y, GLdouble z) { fp_glTranslated(x, y, z); } +inline void glTranslatef(GLfloat x, GLfloat y, GLfloat z) { fp_glTranslatef(x, y, z); } + +/* GL_VERSION_1_1 */ +inline void glDrawArrays(GLenum mode, GLint first, GLsizei count) { fp_glDrawArrays(mode, first, count); } +inline void glDrawElements(GLenum mode, GLsizei count, GLenum type, const void* indices) { fp_glDrawElements(mode, count, type, indices); } +inline void glGetPointerv(GLenum pname, void** params) { fp_glGetPointerv(pname, params); } +inline void glPolygonOffset(GLfloat factor, GLfloat units) { fp_glPolygonOffset(factor, units); } +inline void glCopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { fp_glCopyTexImage1D(target, level, internalformat, x, y, width, border); } +inline void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { fp_glCopyTexImage2D(target, level, internalformat, x, y, width, height, border); } +inline void glCopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { fp_glCopyTexSubImage1D(target, level, xoffset, x, y, width); } +inline void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); } +inline void glTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) { fp_glTexSubImage1D(target, level, xoffset, width, format, type, pixels); } +inline void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); } +inline void glBindTexture(GLenum target, GLuint texture) { fp_glBindTexture(target, texture); } +inline void glDeleteTextures(GLsizei n, const GLuint* textures) { fp_glDeleteTextures(n, textures); } +inline void glGenTextures(GLsizei n, GLuint* textures) { fp_glGenTextures(n, textures); } +inline GLboolean glIsTexture(GLuint texture) { return fp_glIsTexture(texture); } +inline void glArrayElement(GLint i) { fp_glArrayElement(i); } +inline void glColorPointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glColorPointer(size, type, stride, pointer); } +inline void glDisableClientState(GLenum array) { fp_glDisableClientState(array); } +inline void glEdgeFlagPointer(GLsizei stride, const void* pointer) { fp_glEdgeFlagPointer(stride, pointer); } +inline void glEnableClientState(GLenum array) { fp_glEnableClientState(array); } +inline void glIndexPointer(GLenum type, GLsizei stride, const void* pointer) { fp_glIndexPointer(type, stride, pointer); } +inline void glInterleavedArrays(GLenum format, GLsizei stride, const void* pointer) { fp_glInterleavedArrays(format, stride, pointer); } +inline void glNormalPointer(GLenum type, GLsizei stride, const void* pointer) { fp_glNormalPointer(type, stride, pointer); } +inline void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glTexCoordPointer(size, type, stride, pointer); } +inline void glVertexPointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexPointer(size, type, stride, pointer); } +inline GLboolean glAreTexturesResident(GLsizei n, const GLuint* textures, GLboolean* residences) { return fp_glAreTexturesResident(n, textures, residences); } +inline void glPrioritizeTextures(GLsizei n, const GLuint* textures, const GLfloat* priorities) { fp_glPrioritizeTextures(n, textures, priorities); } +inline void glIndexub(GLubyte c) { fp_glIndexub(c); } +inline void glIndexubv(const GLubyte* c) { fp_glIndexubv(c); } +inline void glPopClientAttrib() { fp_glPopClientAttrib(); } +inline void glPushClientAttrib(GLbitfield mask) { fp_glPushClientAttrib(mask); } + +/* GL_VERSION_1_2 */ +inline void glDrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices) { fp_glDrawRangeElements(mode, start, end, count, type, indices); } +inline void glTexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels); } +inline void glTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } +inline void glCopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height); } + +/* GL_VERSION_1_3 */ +inline void glActiveTexture(GLenum texture) { fp_glActiveTexture(texture); } +inline void glSampleCoverage(GLfloat value, GLboolean invert) { fp_glSampleCoverage(value, invert); } +inline void glCompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data); } +inline void glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data); } +inline void glCompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage1D(target, level, internalformat, width, border, imageSize, data); } +inline void glCompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } +inline void glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); } +inline void glCompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data); } +inline void glGetCompressedTexImage(GLenum target, GLint level, void* img) { fp_glGetCompressedTexImage(target, level, img); } +inline void glClientActiveTexture(GLenum texture) { fp_glClientActiveTexture(texture); } +inline void glMultiTexCoord1d(GLenum target, GLdouble s) { fp_glMultiTexCoord1d(target, s); } +inline void glMultiTexCoord1dv(GLenum target, const GLdouble* v) { fp_glMultiTexCoord1dv(target, v); } +inline void glMultiTexCoord1f(GLenum target, GLfloat s) { fp_glMultiTexCoord1f(target, s); } +inline void glMultiTexCoord1fv(GLenum target, const GLfloat* v) { fp_glMultiTexCoord1fv(target, v); } +inline void glMultiTexCoord1i(GLenum target, GLint s) { fp_glMultiTexCoord1i(target, s); } +inline void glMultiTexCoord1iv(GLenum target, const GLint* v) { fp_glMultiTexCoord1iv(target, v); } +inline void glMultiTexCoord1s(GLenum target, GLshort s) { fp_glMultiTexCoord1s(target, s); } +inline void glMultiTexCoord1sv(GLenum target, const GLshort* v) { fp_glMultiTexCoord1sv(target, v); } +inline void glMultiTexCoord2d(GLenum target, GLdouble s, GLdouble t) { fp_glMultiTexCoord2d(target, s, t); } +inline void glMultiTexCoord2dv(GLenum target, const GLdouble* v) { fp_glMultiTexCoord2dv(target, v); } +inline void glMultiTexCoord2f(GLenum target, GLfloat s, GLfloat t) { fp_glMultiTexCoord2f(target, s, t); } +inline void glMultiTexCoord2fv(GLenum target, const GLfloat* v) { fp_glMultiTexCoord2fv(target, v); } +inline void glMultiTexCoord2i(GLenum target, GLint s, GLint t) { fp_glMultiTexCoord2i(target, s, t); } +inline void glMultiTexCoord2iv(GLenum target, const GLint* v) { fp_glMultiTexCoord2iv(target, v); } +inline void glMultiTexCoord2s(GLenum target, GLshort s, GLshort t) { fp_glMultiTexCoord2s(target, s, t); } +inline void glMultiTexCoord2sv(GLenum target, const GLshort* v) { fp_glMultiTexCoord2sv(target, v); } +inline void glMultiTexCoord3d(GLenum target, GLdouble s, GLdouble t, GLdouble r) { fp_glMultiTexCoord3d(target, s, t, r); } +inline void glMultiTexCoord3dv(GLenum target, const GLdouble* v) { fp_glMultiTexCoord3dv(target, v); } +inline void glMultiTexCoord3f(GLenum target, GLfloat s, GLfloat t, GLfloat r) { fp_glMultiTexCoord3f(target, s, t, r); } +inline void glMultiTexCoord3fv(GLenum target, const GLfloat* v) { fp_glMultiTexCoord3fv(target, v); } +inline void glMultiTexCoord3i(GLenum target, GLint s, GLint t, GLint r) { fp_glMultiTexCoord3i(target, s, t, r); } +inline void glMultiTexCoord3iv(GLenum target, const GLint* v) { fp_glMultiTexCoord3iv(target, v); } +inline void glMultiTexCoord3s(GLenum target, GLshort s, GLshort t, GLshort r) { fp_glMultiTexCoord3s(target, s, t, r); } +inline void glMultiTexCoord3sv(GLenum target, const GLshort* v) { fp_glMultiTexCoord3sv(target, v); } +inline void glMultiTexCoord4d(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { fp_glMultiTexCoord4d(target, s, t, r, q); } +inline void glMultiTexCoord4dv(GLenum target, const GLdouble* v) { fp_glMultiTexCoord4dv(target, v); } +inline void glMultiTexCoord4f(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) { fp_glMultiTexCoord4f(target, s, t, r, q); } +inline void glMultiTexCoord4fv(GLenum target, const GLfloat* v) { fp_glMultiTexCoord4fv(target, v); } +inline void glMultiTexCoord4i(GLenum target, GLint s, GLint t, GLint r, GLint q) { fp_glMultiTexCoord4i(target, s, t, r, q); } +inline void glMultiTexCoord4iv(GLenum target, const GLint* v) { fp_glMultiTexCoord4iv(target, v); } +inline void glMultiTexCoord4s(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { fp_glMultiTexCoord4s(target, s, t, r, q); } +inline void glMultiTexCoord4sv(GLenum target, const GLshort* v) { fp_glMultiTexCoord4sv(target, v); } +inline void glLoadTransposeMatrixf(const GLfloat* m) { fp_glLoadTransposeMatrixf(m); } +inline void glLoadTransposeMatrixd(const GLdouble* m) { fp_glLoadTransposeMatrixd(m); } +inline void glMultTransposeMatrixf(const GLfloat* m) { fp_glMultTransposeMatrixf(m); } +inline void glMultTransposeMatrixd(const GLdouble* m) { fp_glMultTransposeMatrixd(m); } + +/* GL_VERSION_1_4 */ +inline void glBlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { fp_glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } +inline void glMultiDrawArrays(GLenum mode, const GLint* first, const GLsizei* count, GLsizei drawcount) { fp_glMultiDrawArrays(mode, first, count, drawcount); } +inline void glMultiDrawElements(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei drawcount) { fp_glMultiDrawElements(mode, count, type, indices, drawcount); } +inline void glPointParameterf(GLenum pname, GLfloat param) { fp_glPointParameterf(pname, param); } +inline void glPointParameterfv(GLenum pname, const GLfloat* params) { fp_glPointParameterfv(pname, params); } +inline void glPointParameteri(GLenum pname, GLint param) { fp_glPointParameteri(pname, param); } +inline void glPointParameteriv(GLenum pname, const GLint* params) { fp_glPointParameteriv(pname, params); } +inline void glFogCoordf(GLfloat coord) { fp_glFogCoordf(coord); } +inline void glFogCoordfv(const GLfloat* coord) { fp_glFogCoordfv(coord); } +inline void glFogCoordd(GLdouble coord) { fp_glFogCoordd(coord); } +inline void glFogCoorddv(const GLdouble* coord) { fp_glFogCoorddv(coord); } +inline void glFogCoordPointer(GLenum type, GLsizei stride, const void* pointer) { fp_glFogCoordPointer(type, stride, pointer); } +inline void glSecondaryColor3b(GLbyte red, GLbyte green, GLbyte blue) { fp_glSecondaryColor3b(red, green, blue); } +inline void glSecondaryColor3bv(const GLbyte* v) { fp_glSecondaryColor3bv(v); } +inline void glSecondaryColor3d(GLdouble red, GLdouble green, GLdouble blue) { fp_glSecondaryColor3d(red, green, blue); } +inline void glSecondaryColor3dv(const GLdouble* v) { fp_glSecondaryColor3dv(v); } +inline void glSecondaryColor3f(GLfloat red, GLfloat green, GLfloat blue) { fp_glSecondaryColor3f(red, green, blue); } +inline void glSecondaryColor3fv(const GLfloat* v) { fp_glSecondaryColor3fv(v); } +inline void glSecondaryColor3i(GLint red, GLint green, GLint blue) { fp_glSecondaryColor3i(red, green, blue); } +inline void glSecondaryColor3iv(const GLint* v) { fp_glSecondaryColor3iv(v); } +inline void glSecondaryColor3s(GLshort red, GLshort green, GLshort blue) { fp_glSecondaryColor3s(red, green, blue); } +inline void glSecondaryColor3sv(const GLshort* v) { fp_glSecondaryColor3sv(v); } +inline void glSecondaryColor3ub(GLubyte red, GLubyte green, GLubyte blue) { fp_glSecondaryColor3ub(red, green, blue); } +inline void glSecondaryColor3ubv(const GLubyte* v) { fp_glSecondaryColor3ubv(v); } +inline void glSecondaryColor3ui(GLuint red, GLuint green, GLuint blue) { fp_glSecondaryColor3ui(red, green, blue); } +inline void glSecondaryColor3uiv(const GLuint* v) { fp_glSecondaryColor3uiv(v); } +inline void glSecondaryColor3us(GLushort red, GLushort green, GLushort blue) { fp_glSecondaryColor3us(red, green, blue); } +inline void glSecondaryColor3usv(const GLushort* v) { fp_glSecondaryColor3usv(v); } +inline void glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glSecondaryColorPointer(size, type, stride, pointer); } +inline void glWindowPos2d(GLdouble x, GLdouble y) { fp_glWindowPos2d(x, y); } +inline void glWindowPos2dv(const GLdouble* v) { fp_glWindowPos2dv(v); } +inline void glWindowPos2f(GLfloat x, GLfloat y) { fp_glWindowPos2f(x, y); } +inline void glWindowPos2fv(const GLfloat* v) { fp_glWindowPos2fv(v); } +inline void glWindowPos2i(GLint x, GLint y) { fp_glWindowPos2i(x, y); } +inline void glWindowPos2iv(const GLint* v) { fp_glWindowPos2iv(v); } +inline void glWindowPos2s(GLshort x, GLshort y) { fp_glWindowPos2s(x, y); } +inline void glWindowPos2sv(const GLshort* v) { fp_glWindowPos2sv(v); } +inline void glWindowPos3d(GLdouble x, GLdouble y, GLdouble z) { fp_glWindowPos3d(x, y, z); } +inline void glWindowPos3dv(const GLdouble* v) { fp_glWindowPos3dv(v); } +inline void glWindowPos3f(GLfloat x, GLfloat y, GLfloat z) { fp_glWindowPos3f(x, y, z); } +inline void glWindowPos3fv(const GLfloat* v) { fp_glWindowPos3fv(v); } +inline void glWindowPos3i(GLint x, GLint y, GLint z) { fp_glWindowPos3i(x, y, z); } +inline void glWindowPos3iv(const GLint* v) { fp_glWindowPos3iv(v); } +inline void glWindowPos3s(GLshort x, GLshort y, GLshort z) { fp_glWindowPos3s(x, y, z); } +inline void glWindowPos3sv(const GLshort* v) { fp_glWindowPos3sv(v); } +inline void glBlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glBlendColor(red, green, blue, alpha); } +inline void glBlendEquation(GLenum mode) { fp_glBlendEquation(mode); } + +/* GL_VERSION_1_5 */ +inline void glGenQueries(GLsizei n, GLuint* ids) { fp_glGenQueries(n, ids); } +inline void glDeleteQueries(GLsizei n, const GLuint* ids) { fp_glDeleteQueries(n, ids); } +inline GLboolean glIsQuery(GLuint id) { return fp_glIsQuery(id); } +inline void glBeginQuery(GLenum target, GLuint id) { fp_glBeginQuery(target, id); } +inline void glEndQuery(GLenum target) { fp_glEndQuery(target); } +inline void glGetQueryiv(GLenum target, GLenum pname, GLint* params) { fp_glGetQueryiv(target, pname, params); } +inline void glGetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { fp_glGetQueryObjectiv(id, pname, params); } +inline void glGetQueryObjectuiv(GLuint id, GLenum pname, GLuint* params) { fp_glGetQueryObjectuiv(id, pname, params); } +inline void glBindBuffer(GLenum target, GLuint buffer) { fp_glBindBuffer(target, buffer); } +inline void glDeleteBuffers(GLsizei n, const GLuint* buffers) { fp_glDeleteBuffers(n, buffers); } +inline void glGenBuffers(GLsizei n, GLuint* buffers) { fp_glGenBuffers(n, buffers); } +inline GLboolean glIsBuffer(GLuint buffer) { return fp_glIsBuffer(buffer); } +inline void glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage) { fp_glBufferData(target, size, data, usage); } +inline void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { fp_glBufferSubData(target, offset, size, data); } +inline void glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void* data) { fp_glGetBufferSubData(target, offset, size, data); } +inline void* glMapBuffer(GLenum target, GLenum access) { return fp_glMapBuffer(target, access); } +inline GLboolean glUnmapBuffer(GLenum target) { return fp_glUnmapBuffer(target); } +inline void glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params) { fp_glGetBufferParameteriv(target, pname, params); } +inline void glGetBufferPointerv(GLenum target, GLenum pname, void** params) { fp_glGetBufferPointerv(target, pname, params); } + +/* GL_VERSION_2_0 */ +inline void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparate(modeRGB, modeAlpha); } +inline void glDrawBuffers(GLsizei n, const GLenum* bufs) { fp_glDrawBuffers(n, bufs); } +inline void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { fp_glStencilOpSeparate(face, sfail, dpfail, dppass); } +inline void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { fp_glStencilFuncSeparate(face, func, ref, mask); } +inline void glStencilMaskSeparate(GLenum face, GLuint mask) { fp_glStencilMaskSeparate(face, mask); } +inline void glAttachShader(GLuint program, GLuint shader) { fp_glAttachShader(program, shader); } +inline void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name) { fp_glBindAttribLocation(program, index, name); } +inline void glCompileShader(GLuint shader) { fp_glCompileShader(shader); } +inline GLuint glCreateProgram() { return fp_glCreateProgram(); } +inline GLuint glCreateShader(GLenum type) { return fp_glCreateShader(type); } +inline void glDeleteProgram(GLuint program) { fp_glDeleteProgram(program); } +inline void glDeleteShader(GLuint shader) { fp_glDeleteShader(shader); } +inline void glDetachShader(GLuint program, GLuint shader) { fp_glDetachShader(program, shader); } +inline void glDisableVertexAttribArray(GLuint index) { fp_glDisableVertexAttribArray(index); } +inline void glEnableVertexAttribArray(GLuint index) { fp_glEnableVertexAttribArray(index); } +inline void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) { fp_glGetActiveAttrib(program, index, bufSize, length, size, type, name); } +inline void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLint* size, GLenum* type, GLchar* name) { fp_glGetActiveUniform(program, index, bufSize, length, size, type, name); } +inline void glGetAttachedShaders(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) { fp_glGetAttachedShaders(program, maxCount, count, shaders); } +inline GLint glGetAttribLocation(GLuint program, const GLchar* name) { return fp_glGetAttribLocation(program, name); } +inline void glGetProgramiv(GLuint program, GLenum pname, GLint* params) { fp_glGetProgramiv(program, pname, params); } +inline void glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { fp_glGetProgramInfoLog(program, bufSize, length, infoLog); } +inline void glGetShaderiv(GLuint shader, GLenum pname, GLint* params) { fp_glGetShaderiv(shader, pname, params); } +inline void glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { fp_glGetShaderInfoLog(shader, bufSize, length, infoLog); } +inline void glGetShaderSource(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) { fp_glGetShaderSource(shader, bufSize, length, source); } +inline GLint glGetUniformLocation(GLuint program, const GLchar* name) { return fp_glGetUniformLocation(program, name); } +inline void glGetUniformfv(GLuint program, GLint location, GLfloat* params) { fp_glGetUniformfv(program, location, params); } +inline void glGetUniformiv(GLuint program, GLint location, GLint* params) { fp_glGetUniformiv(program, location, params); } +inline void glGetVertexAttribdv(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribdv(index, pname, params); } +inline void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) { fp_glGetVertexAttribfv(index, pname, params); } +inline void glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribiv(index, pname, params); } +inline void glGetVertexAttribPointerv(GLuint index, GLenum pname, void** pointer) { fp_glGetVertexAttribPointerv(index, pname, pointer); } +inline GLboolean glIsProgram(GLuint program) { return fp_glIsProgram(program); } +inline GLboolean glIsShader(GLuint shader) { return fp_glIsShader(shader); } +inline void glLinkProgram(GLuint program) { fp_glLinkProgram(program); } +inline void glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length) { fp_glShaderSource(shader, count, string, length); } +inline void glUseProgram(GLuint program) { fp_glUseProgram(program); } +inline void glUniform1f(GLint location, GLfloat v0) { fp_glUniform1f(location, v0); } +inline void glUniform2f(GLint location, GLfloat v0, GLfloat v1) { fp_glUniform2f(location, v0, v1); } +inline void glUniform3f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { fp_glUniform3f(location, v0, v1, v2); } +inline void glUniform4f(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { fp_glUniform4f(location, v0, v1, v2, v3); } +inline void glUniform1i(GLint location, GLint v0) { fp_glUniform1i(location, v0); } +inline void glUniform2i(GLint location, GLint v0, GLint v1) { fp_glUniform2i(location, v0, v1); } +inline void glUniform3i(GLint location, GLint v0, GLint v1, GLint v2) { fp_glUniform3i(location, v0, v1, v2); } +inline void glUniform4i(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { fp_glUniform4i(location, v0, v1, v2, v3); } +inline void glUniform1fv(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform1fv(location, count, value); } +inline void glUniform2fv(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform2fv(location, count, value); } +inline void glUniform3fv(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform3fv(location, count, value); } +inline void glUniform4fv(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform4fv(location, count, value); } +inline void glUniform1iv(GLint location, GLsizei count, const GLint* value) { fp_glUniform1iv(location, count, value); } +inline void glUniform2iv(GLint location, GLsizei count, const GLint* value) { fp_glUniform2iv(location, count, value); } +inline void glUniform3iv(GLint location, GLsizei count, const GLint* value) { fp_glUniform3iv(location, count, value); } +inline void glUniform4iv(GLint location, GLsizei count, const GLint* value) { fp_glUniform4iv(location, count, value); } +inline void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2fv(location, count, transpose, value); } +inline void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3fv(location, count, transpose, value); } +inline void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4fv(location, count, transpose, value); } +inline void glValidateProgram(GLuint program) { fp_glValidateProgram(program); } +inline void glVertexAttrib1d(GLuint index, GLdouble x) { fp_glVertexAttrib1d(index, x); } +inline void glVertexAttrib1dv(GLuint index, const GLdouble* v) { fp_glVertexAttrib1dv(index, v); } +inline void glVertexAttrib1f(GLuint index, GLfloat x) { fp_glVertexAttrib1f(index, x); } +inline void glVertexAttrib1fv(GLuint index, const GLfloat* v) { fp_glVertexAttrib1fv(index, v); } +inline void glVertexAttrib1s(GLuint index, GLshort x) { fp_glVertexAttrib1s(index, x); } +inline void glVertexAttrib1sv(GLuint index, const GLshort* v) { fp_glVertexAttrib1sv(index, v); } +inline void glVertexAttrib2d(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttrib2d(index, x, y); } +inline void glVertexAttrib2dv(GLuint index, const GLdouble* v) { fp_glVertexAttrib2dv(index, v); } +inline void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y) { fp_glVertexAttrib2f(index, x, y); } +inline void glVertexAttrib2fv(GLuint index, const GLfloat* v) { fp_glVertexAttrib2fv(index, v); } +inline void glVertexAttrib2s(GLuint index, GLshort x, GLshort y) { fp_glVertexAttrib2s(index, x, y); } +inline void glVertexAttrib2sv(GLuint index, const GLshort* v) { fp_glVertexAttrib2sv(index, v); } +inline void glVertexAttrib3d(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttrib3d(index, x, y, z); } +inline void glVertexAttrib3dv(GLuint index, const GLdouble* v) { fp_glVertexAttrib3dv(index, v); } +inline void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z) { fp_glVertexAttrib3f(index, x, y, z); } +inline void glVertexAttrib3fv(GLuint index, const GLfloat* v) { fp_glVertexAttrib3fv(index, v); } +inline void glVertexAttrib3s(GLuint index, GLshort x, GLshort y, GLshort z) { fp_glVertexAttrib3s(index, x, y, z); } +inline void glVertexAttrib3sv(GLuint index, const GLshort* v) { fp_glVertexAttrib3sv(index, v); } +inline void glVertexAttrib4Nbv(GLuint index, const GLbyte* v) { fp_glVertexAttrib4Nbv(index, v); } +inline void glVertexAttrib4Niv(GLuint index, const GLint* v) { fp_glVertexAttrib4Niv(index, v); } +inline void glVertexAttrib4Nsv(GLuint index, const GLshort* v) { fp_glVertexAttrib4Nsv(index, v); } +inline void glVertexAttrib4Nub(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { fp_glVertexAttrib4Nub(index, x, y, z, w); } +inline void glVertexAttrib4Nubv(GLuint index, const GLubyte* v) { fp_glVertexAttrib4Nubv(index, v); } +inline void glVertexAttrib4Nuiv(GLuint index, const GLuint* v) { fp_glVertexAttrib4Nuiv(index, v); } +inline void glVertexAttrib4Nusv(GLuint index, const GLushort* v) { fp_glVertexAttrib4Nusv(index, v); } +inline void glVertexAttrib4bv(GLuint index, const GLbyte* v) { fp_glVertexAttrib4bv(index, v); } +inline void glVertexAttrib4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttrib4d(index, x, y, z, w); } +inline void glVertexAttrib4dv(GLuint index, const GLdouble* v) { fp_glVertexAttrib4dv(index, v); } +inline void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertexAttrib4f(index, x, y, z, w); } +inline void glVertexAttrib4fv(GLuint index, const GLfloat* v) { fp_glVertexAttrib4fv(index, v); } +inline void glVertexAttrib4iv(GLuint index, const GLint* v) { fp_glVertexAttrib4iv(index, v); } +inline void glVertexAttrib4s(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertexAttrib4s(index, x, y, z, w); } +inline void glVertexAttrib4sv(GLuint index, const GLshort* v) { fp_glVertexAttrib4sv(index, v); } +inline void glVertexAttrib4ubv(GLuint index, const GLubyte* v) { fp_glVertexAttrib4ubv(index, v); } +inline void glVertexAttrib4uiv(GLuint index, const GLuint* v) { fp_glVertexAttrib4uiv(index, v); } +inline void glVertexAttrib4usv(GLuint index, const GLushort* v) { fp_glVertexAttrib4usv(index, v); } +inline void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer) { fp_glVertexAttribPointer(index, size, type, normalized, stride, pointer); } + +/* GL_VERSION_2_1 */ +inline void glUniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x3fv(location, count, transpose, value); } +inline void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x2fv(location, count, transpose, value); } +inline void glUniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x4fv(location, count, transpose, value); } +inline void glUniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4x2fv(location, count, transpose, value); } +inline void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x4fv(location, count, transpose, value); } +inline void glUniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4x3fv(location, count, transpose, value); } + +/* GL_VERSION_3_0 */ +inline void glColorMaski(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaski(index, r, g, b, a); } +inline void glGetBooleani_v(GLenum target, GLuint index, GLboolean* data) { fp_glGetBooleani_v(target, index, data); } +inline void glGetIntegeri_v(GLenum target, GLuint index, GLint* data) { fp_glGetIntegeri_v(target, index, data); } +inline void glEnablei(GLenum target, GLuint index) { fp_glEnablei(target, index); } +inline void glDisablei(GLenum target, GLuint index) { fp_glDisablei(target, index); } +inline GLboolean glIsEnabledi(GLenum target, GLuint index) { return fp_glIsEnabledi(target, index); } +inline void glBeginTransformFeedback(GLenum primitiveMode) { fp_glBeginTransformFeedback(primitiveMode); } +inline void glEndTransformFeedback() { fp_glEndTransformFeedback(); } +inline void glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glBindBufferRange(target, index, buffer, offset, size); } +inline void glBindBufferBase(GLenum target, GLuint index, GLuint buffer) { fp_glBindBufferBase(target, index, buffer); } +inline void glTransformFeedbackVaryings(GLuint program, GLsizei count, const GLchar** varyings, GLenum bufferMode) { fp_glTransformFeedbackVaryings(program, count, varyings, bufferMode); } +inline void glGetTransformFeedbackVarying(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) { fp_glGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name); } +inline void glClampColor(GLenum target, GLenum clamp) { fp_glClampColor(target, clamp); } +inline void glBeginConditionalRender(GLuint id, GLenum mode) { fp_glBeginConditionalRender(id, mode); } +inline void glEndConditionalRender() { fp_glEndConditionalRender(); } +inline void glVertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribIPointer(index, size, type, stride, pointer); } +inline void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribIiv(index, pname, params); } +inline void glGetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params) { fp_glGetVertexAttribIuiv(index, pname, params); } +inline void glVertexAttribI1i(GLuint index, GLint x) { fp_glVertexAttribI1i(index, x); } +inline void glVertexAttribI2i(GLuint index, GLint x, GLint y) { fp_glVertexAttribI2i(index, x, y); } +inline void glVertexAttribI3i(GLuint index, GLint x, GLint y, GLint z) { fp_glVertexAttribI3i(index, x, y, z); } +inline void glVertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glVertexAttribI4i(index, x, y, z, w); } +inline void glVertexAttribI1ui(GLuint index, GLuint x) { fp_glVertexAttribI1ui(index, x); } +inline void glVertexAttribI2ui(GLuint index, GLuint x, GLuint y) { fp_glVertexAttribI2ui(index, x, y); } +inline void glVertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z) { fp_glVertexAttribI3ui(index, x, y, z); } +inline void glVertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glVertexAttribI4ui(index, x, y, z, w); } +inline void glVertexAttribI1iv(GLuint index, const GLint* v) { fp_glVertexAttribI1iv(index, v); } +inline void glVertexAttribI2iv(GLuint index, const GLint* v) { fp_glVertexAttribI2iv(index, v); } +inline void glVertexAttribI3iv(GLuint index, const GLint* v) { fp_glVertexAttribI3iv(index, v); } +inline void glVertexAttribI4iv(GLuint index, const GLint* v) { fp_glVertexAttribI4iv(index, v); } +inline void glVertexAttribI1uiv(GLuint index, const GLuint* v) { fp_glVertexAttribI1uiv(index, v); } +inline void glVertexAttribI2uiv(GLuint index, const GLuint* v) { fp_glVertexAttribI2uiv(index, v); } +inline void glVertexAttribI3uiv(GLuint index, const GLuint* v) { fp_glVertexAttribI3uiv(index, v); } +inline void glVertexAttribI4uiv(GLuint index, const GLuint* v) { fp_glVertexAttribI4uiv(index, v); } +inline void glVertexAttribI4bv(GLuint index, const GLbyte* v) { fp_glVertexAttribI4bv(index, v); } +inline void glVertexAttribI4sv(GLuint index, const GLshort* v) { fp_glVertexAttribI4sv(index, v); } +inline void glVertexAttribI4ubv(GLuint index, const GLubyte* v) { fp_glVertexAttribI4ubv(index, v); } +inline void glVertexAttribI4usv(GLuint index, const GLushort* v) { fp_glVertexAttribI4usv(index, v); } +inline void glGetUniformuiv(GLuint program, GLint location, GLuint* params) { fp_glGetUniformuiv(program, location, params); } +inline void glBindFragDataLocation(GLuint program, GLuint color, const GLchar* name) { fp_glBindFragDataLocation(program, color, name); } +inline GLint glGetFragDataLocation(GLuint program, const GLchar* name) { return fp_glGetFragDataLocation(program, name); } +inline void glUniform1ui(GLint location, GLuint v0) { fp_glUniform1ui(location, v0); } +inline void glUniform2ui(GLint location, GLuint v0, GLuint v1) { fp_glUniform2ui(location, v0, v1); } +inline void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2) { fp_glUniform3ui(location, v0, v1, v2); } +inline void glUniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { fp_glUniform4ui(location, v0, v1, v2, v3); } +inline void glUniform1uiv(GLint location, GLsizei count, const GLuint* value) { fp_glUniform1uiv(location, count, value); } +inline void glUniform2uiv(GLint location, GLsizei count, const GLuint* value) { fp_glUniform2uiv(location, count, value); } +inline void glUniform3uiv(GLint location, GLsizei count, const GLuint* value) { fp_glUniform3uiv(location, count, value); } +inline void glUniform4uiv(GLint location, GLsizei count, const GLuint* value) { fp_glUniform4uiv(location, count, value); } +inline void glTexParameterIiv(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameterIiv(target, pname, params); } +inline void glTexParameterIuiv(GLenum target, GLenum pname, const GLuint* params) { fp_glTexParameterIuiv(target, pname, params); } +inline void glGetTexParameterIiv(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameterIiv(target, pname, params); } +inline void glGetTexParameterIuiv(GLenum target, GLenum pname, GLuint* params) { fp_glGetTexParameterIuiv(target, pname, params); } +inline void glClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint* value) { fp_glClearBufferiv(buffer, drawbuffer, value); } +inline void glClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint* value) { fp_glClearBufferuiv(buffer, drawbuffer, value); } +inline void glClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat* value) { fp_glClearBufferfv(buffer, drawbuffer, value); } +inline void glClearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil) { fp_glClearBufferfi(buffer, drawbuffer, depth, stencil); } +inline const GLubyte* glGetStringi(GLenum name, GLuint index) { return fp_glGetStringi(name, index); } +inline GLboolean glIsRenderbuffer(GLuint renderbuffer) { return fp_glIsRenderbuffer(renderbuffer); } +inline void glBindRenderbuffer(GLenum target, GLuint renderbuffer) { fp_glBindRenderbuffer(target, renderbuffer); } +inline void glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers) { fp_glDeleteRenderbuffers(n, renderbuffers); } +inline void glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) { fp_glGenRenderbuffers(n, renderbuffers); } +inline void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorage(target, internalformat, width, height); } +inline void glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params) { fp_glGetRenderbufferParameteriv(target, pname, params); } +inline GLboolean glIsFramebuffer(GLuint framebuffer) { return fp_glIsFramebuffer(framebuffer); } +inline void glBindFramebuffer(GLenum target, GLuint framebuffer) { fp_glBindFramebuffer(target, framebuffer); } +inline void glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers) { fp_glDeleteFramebuffers(n, framebuffers); } +inline void glGenFramebuffers(GLsizei n, GLuint* framebuffers) { fp_glGenFramebuffers(n, framebuffers); } +inline GLenum glCheckFramebufferStatus(GLenum target) { return fp_glCheckFramebufferStatus(target); } +inline void glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glFramebufferTexture1D(target, attachment, textarget, texture, level); } +inline void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glFramebufferTexture2D(target, attachment, textarget, texture, level); } +inline void glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset); } +inline void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { fp_glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); } +inline void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params) { fp_glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); } +inline void glGenerateMipmap(GLenum target) { fp_glGenerateMipmap(target); } +inline void glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } +inline void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisample(target, samples, internalformat, width, height); } +inline void glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glFramebufferTextureLayer(target, attachment, texture, level, layer); } +inline void* glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapBufferRange(target, offset, length, access); } +inline void glFlushMappedBufferRange(GLenum target, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedBufferRange(target, offset, length); } +inline void glBindVertexArray(GLuint array) { fp_glBindVertexArray(array); } +inline void glDeleteVertexArrays(GLsizei n, const GLuint* arrays) { fp_glDeleteVertexArrays(n, arrays); } +inline void glGenVertexArrays(GLsizei n, GLuint* arrays) { fp_glGenVertexArrays(n, arrays); } +inline GLboolean glIsVertexArray(GLuint array) { return fp_glIsVertexArray(array); } + +/* GL_VERSION_3_1 */ +inline void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { fp_glDrawArraysInstanced(mode, first, count, instancecount); } +inline void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount) { fp_glDrawElementsInstanced(mode, count, type, indices, instancecount); } +inline void glTexBuffer(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBuffer(target, internalformat, buffer); } +inline void glPrimitiveRestartIndex(GLuint index) { fp_glPrimitiveRestartIndex(index); } +inline void glCopyBufferSubData(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glCopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); } +inline void glGetUniformIndices(GLuint program, GLsizei uniformCount, const GLchar** uniformNames, GLuint* uniformIndices) { fp_glGetUniformIndices(program, uniformCount, uniformNames, uniformIndices); } +inline void glGetActiveUniformsiv(GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params) { fp_glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params); } +inline void glGetActiveUniformName(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName) { fp_glGetActiveUniformName(program, uniformIndex, bufSize, length, uniformName); } +inline GLuint glGetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName) { return fp_glGetUniformBlockIndex(program, uniformBlockName); } +inline void glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params) { fp_glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params); } +inline void glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName) { fp_glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName); } +inline void glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { fp_glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); } + +/* GL_VERSION_3_2 */ +inline void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawElementsBaseVertex(mode, count, type, indices, basevertex); } +inline void glDrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void* indices, GLint basevertex) { fp_glDrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex); } +inline void glDrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex) { fp_glDrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex); } +inline void glMultiDrawElementsBaseVertex(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei drawcount, const GLint* basevertex) { fp_glMultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex); } +inline void glProvokingVertex(GLenum mode) { fp_glProvokingVertex(mode); } +inline GLsync glFenceSync(GLenum condition, GLbitfield flags) { return fp_glFenceSync(condition, flags); } +inline GLboolean glIsSync(GLsync sync) { return fp_glIsSync(sync); } +inline void glDeleteSync(GLsync sync) { fp_glDeleteSync(sync); } +inline GLenum glClientWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { return fp_glClientWaitSync(sync, flags, timeout); } +inline void glWaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout) { fp_glWaitSync(sync, flags, timeout); } +inline void glGetInteger64v(GLenum pname, GLint64* data) { fp_glGetInteger64v(pname, data); } +inline void glGetSynciv(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { fp_glGetSynciv(sync, pname, bufSize, length, values); } +inline void glGetInteger64i_v(GLenum target, GLuint index, GLint64* data) { fp_glGetInteger64i_v(target, index, data); } +inline void glGetBufferParameteri64v(GLenum target, GLenum pname, GLint64* params) { fp_glGetBufferParameteri64v(target, pname, params); } +inline void glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTexture(target, attachment, texture, level); } +inline void glTexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); } +inline void glTexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); } +inline void glGetMultisamplefv(GLenum pname, GLuint index, GLfloat* val) { fp_glGetMultisamplefv(pname, index, val); } +inline void glSampleMaski(GLuint index, GLbitfield mask) { fp_glSampleMaski(index, mask); } + +/* GL_VERSION_3_3 */ +inline void glBindFragDataLocationIndexed(GLuint program, GLuint colorNumber, GLuint index, const GLchar* name) { fp_glBindFragDataLocationIndexed(program, colorNumber, index, name); } +inline GLint glGetFragDataIndex(GLuint program, const GLchar* name) { return fp_glGetFragDataIndex(program, name); } +inline void glGenSamplers(GLsizei count, GLuint* samplers) { fp_glGenSamplers(count, samplers); } +inline void glDeleteSamplers(GLsizei count, const GLuint* samplers) { fp_glDeleteSamplers(count, samplers); } +inline GLboolean glIsSampler(GLuint sampler) { return fp_glIsSampler(sampler); } +inline void glBindSampler(GLuint unit, GLuint sampler) { fp_glBindSampler(unit, sampler); } +inline void glSamplerParameteri(GLuint sampler, GLenum pname, GLint param) { fp_glSamplerParameteri(sampler, pname, param); } +inline void glSamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param) { fp_glSamplerParameteriv(sampler, pname, param); } +inline void glSamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) { fp_glSamplerParameterf(sampler, pname, param); } +inline void glSamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param) { fp_glSamplerParameterfv(sampler, pname, param); } +inline void glSamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param) { fp_glSamplerParameterIiv(sampler, pname, param); } +inline void glSamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param) { fp_glSamplerParameterIuiv(sampler, pname, param); } +inline void glGetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) { fp_glGetSamplerParameteriv(sampler, pname, params); } +inline void glGetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params) { fp_glGetSamplerParameterIiv(sampler, pname, params); } +inline void glGetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) { fp_glGetSamplerParameterfv(sampler, pname, params); } +inline void glGetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params) { fp_glGetSamplerParameterIuiv(sampler, pname, params); } +inline void glQueryCounter(GLuint id, GLenum target) { fp_glQueryCounter(id, target); } +inline void glGetQueryObjecti64v(GLuint id, GLenum pname, GLint64* params) { fp_glGetQueryObjecti64v(id, pname, params); } +inline void glGetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) { fp_glGetQueryObjectui64v(id, pname, params); } +inline void glVertexAttribDivisor(GLuint index, GLuint divisor) { fp_glVertexAttribDivisor(index, divisor); } +inline void glVertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized, GLuint value) { fp_glVertexAttribP1ui(index, type, normalized, value); } +inline void glVertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value) { fp_glVertexAttribP1uiv(index, type, normalized, value); } +inline void glVertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized, GLuint value) { fp_glVertexAttribP2ui(index, type, normalized, value); } +inline void glVertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value) { fp_glVertexAttribP2uiv(index, type, normalized, value); } +inline void glVertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized, GLuint value) { fp_glVertexAttribP3ui(index, type, normalized, value); } +inline void glVertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value) { fp_glVertexAttribP3uiv(index, type, normalized, value); } +inline void glVertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized, GLuint value) { fp_glVertexAttribP4ui(index, type, normalized, value); } +inline void glVertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized, const GLuint* value) { fp_glVertexAttribP4uiv(index, type, normalized, value); } +inline void glVertexP2ui(GLenum type, GLuint value) { fp_glVertexP2ui(type, value); } +inline void glVertexP2uiv(GLenum type, const GLuint* value) { fp_glVertexP2uiv(type, value); } +inline void glVertexP3ui(GLenum type, GLuint value) { fp_glVertexP3ui(type, value); } +inline void glVertexP3uiv(GLenum type, const GLuint* value) { fp_glVertexP3uiv(type, value); } +inline void glVertexP4ui(GLenum type, GLuint value) { fp_glVertexP4ui(type, value); } +inline void glVertexP4uiv(GLenum type, const GLuint* value) { fp_glVertexP4uiv(type, value); } +inline void glTexCoordP1ui(GLenum type, GLuint coords) { fp_glTexCoordP1ui(type, coords); } +inline void glTexCoordP1uiv(GLenum type, const GLuint* coords) { fp_glTexCoordP1uiv(type, coords); } +inline void glTexCoordP2ui(GLenum type, GLuint coords) { fp_glTexCoordP2ui(type, coords); } +inline void glTexCoordP2uiv(GLenum type, const GLuint* coords) { fp_glTexCoordP2uiv(type, coords); } +inline void glTexCoordP3ui(GLenum type, GLuint coords) { fp_glTexCoordP3ui(type, coords); } +inline void glTexCoordP3uiv(GLenum type, const GLuint* coords) { fp_glTexCoordP3uiv(type, coords); } +inline void glTexCoordP4ui(GLenum type, GLuint coords) { fp_glTexCoordP4ui(type, coords); } +inline void glTexCoordP4uiv(GLenum type, const GLuint* coords) { fp_glTexCoordP4uiv(type, coords); } +inline void glMultiTexCoordP1ui(GLenum texture, GLenum type, GLuint coords) { fp_glMultiTexCoordP1ui(texture, type, coords); } +inline void glMultiTexCoordP1uiv(GLenum texture, GLenum type, const GLuint* coords) { fp_glMultiTexCoordP1uiv(texture, type, coords); } +inline void glMultiTexCoordP2ui(GLenum texture, GLenum type, GLuint coords) { fp_glMultiTexCoordP2ui(texture, type, coords); } +inline void glMultiTexCoordP2uiv(GLenum texture, GLenum type, const GLuint* coords) { fp_glMultiTexCoordP2uiv(texture, type, coords); } +inline void glMultiTexCoordP3ui(GLenum texture, GLenum type, GLuint coords) { fp_glMultiTexCoordP3ui(texture, type, coords); } +inline void glMultiTexCoordP3uiv(GLenum texture, GLenum type, const GLuint* coords) { fp_glMultiTexCoordP3uiv(texture, type, coords); } +inline void glMultiTexCoordP4ui(GLenum texture, GLenum type, GLuint coords) { fp_glMultiTexCoordP4ui(texture, type, coords); } +inline void glMultiTexCoordP4uiv(GLenum texture, GLenum type, const GLuint* coords) { fp_glMultiTexCoordP4uiv(texture, type, coords); } +inline void glNormalP3ui(GLenum type, GLuint coords) { fp_glNormalP3ui(type, coords); } +inline void glNormalP3uiv(GLenum type, const GLuint* coords) { fp_glNormalP3uiv(type, coords); } +inline void glColorP3ui(GLenum type, GLuint color) { fp_glColorP3ui(type, color); } +inline void glColorP3uiv(GLenum type, const GLuint* color) { fp_glColorP3uiv(type, color); } +inline void glColorP4ui(GLenum type, GLuint color) { fp_glColorP4ui(type, color); } +inline void glColorP4uiv(GLenum type, const GLuint* color) { fp_glColorP4uiv(type, color); } +inline void glSecondaryColorP3ui(GLenum type, GLuint color) { fp_glSecondaryColorP3ui(type, color); } +inline void glSecondaryColorP3uiv(GLenum type, const GLuint* color) { fp_glSecondaryColorP3uiv(type, color); } + +/* GL_VERSION_4_0 */ +inline void glMinSampleShading(GLfloat value) { fp_glMinSampleShading(value); } +inline void glBlendEquationi(GLuint buf, GLenum mode) { fp_glBlendEquationi(buf, mode); } +inline void glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparatei(buf, modeRGB, modeAlpha); } +inline void glBlendFunci(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFunci(buf, src, dst); } +inline void glBlendFuncSeparatei(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); } +inline void glDrawArraysIndirect(GLenum mode, const void* indirect) { fp_glDrawArraysIndirect(mode, indirect); } +inline void glDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect) { fp_glDrawElementsIndirect(mode, type, indirect); } +inline void glUniform1d(GLint location, GLdouble x) { fp_glUniform1d(location, x); } +inline void glUniform2d(GLint location, GLdouble x, GLdouble y) { fp_glUniform2d(location, x, y); } +inline void glUniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z) { fp_glUniform3d(location, x, y, z); } +inline void glUniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glUniform4d(location, x, y, z, w); } +inline void glUniform1dv(GLint location, GLsizei count, const GLdouble* value) { fp_glUniform1dv(location, count, value); } +inline void glUniform2dv(GLint location, GLsizei count, const GLdouble* value) { fp_glUniform2dv(location, count, value); } +inline void glUniform3dv(GLint location, GLsizei count, const GLdouble* value) { fp_glUniform3dv(location, count, value); } +inline void glUniform4dv(GLint location, GLsizei count, const GLdouble* value) { fp_glUniform4dv(location, count, value); } +inline void glUniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix2dv(location, count, transpose, value); } +inline void glUniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix3dv(location, count, transpose, value); } +inline void glUniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix4dv(location, count, transpose, value); } +inline void glUniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix2x3dv(location, count, transpose, value); } +inline void glUniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix2x4dv(location, count, transpose, value); } +inline void glUniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix3x2dv(location, count, transpose, value); } +inline void glUniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix3x4dv(location, count, transpose, value); } +inline void glUniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix4x2dv(location, count, transpose, value); } +inline void glUniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glUniformMatrix4x3dv(location, count, transpose, value); } +inline void glGetUniformdv(GLuint program, GLint location, GLdouble* params) { fp_glGetUniformdv(program, location, params); } +inline GLint glGetSubroutineUniformLocation(GLuint program, GLenum shadertype, const GLchar* name) { return fp_glGetSubroutineUniformLocation(program, shadertype, name); } +inline GLuint glGetSubroutineIndex(GLuint program, GLenum shadertype, const GLchar* name) { return fp_glGetSubroutineIndex(program, shadertype, name); } +inline void glGetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values) { fp_glGetActiveSubroutineUniformiv(program, shadertype, index, pname, values); } +inline void glGetActiveSubroutineUniformName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar* name) { fp_glGetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name); } +inline void glGetActiveSubroutineName(GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar* name) { fp_glGetActiveSubroutineName(program, shadertype, index, bufsize, length, name); } +inline void glUniformSubroutinesuiv(GLenum shadertype, GLsizei count, const GLuint* indices) { fp_glUniformSubroutinesuiv(shadertype, count, indices); } +inline void glGetUniformSubroutineuiv(GLenum shadertype, GLint location, GLuint* params) { fp_glGetUniformSubroutineuiv(shadertype, location, params); } +inline void glGetProgramStageiv(GLuint program, GLenum shadertype, GLenum pname, GLint* values) { fp_glGetProgramStageiv(program, shadertype, pname, values); } +inline void glPatchParameteri(GLenum pname, GLint value) { fp_glPatchParameteri(pname, value); } +inline void glPatchParameterfv(GLenum pname, const GLfloat* values) { fp_glPatchParameterfv(pname, values); } +inline void glBindTransformFeedback(GLenum target, GLuint id) { fp_glBindTransformFeedback(target, id); } +inline void glDeleteTransformFeedbacks(GLsizei n, const GLuint* ids) { fp_glDeleteTransformFeedbacks(n, ids); } +inline void glGenTransformFeedbacks(GLsizei n, GLuint* ids) { fp_glGenTransformFeedbacks(n, ids); } +inline GLboolean glIsTransformFeedback(GLuint id) { return fp_glIsTransformFeedback(id); } +inline void glPauseTransformFeedback() { fp_glPauseTransformFeedback(); } +inline void glResumeTransformFeedback() { fp_glResumeTransformFeedback(); } +inline void glDrawTransformFeedback(GLenum mode, GLuint id) { fp_glDrawTransformFeedback(mode, id); } +inline void glDrawTransformFeedbackStream(GLenum mode, GLuint id, GLuint stream) { fp_glDrawTransformFeedbackStream(mode, id, stream); } +inline void glBeginQueryIndexed(GLenum target, GLuint index, GLuint id) { fp_glBeginQueryIndexed(target, index, id); } +inline void glEndQueryIndexed(GLenum target, GLuint index) { fp_glEndQueryIndexed(target, index); } +inline void glGetQueryIndexediv(GLenum target, GLuint index, GLenum pname, GLint* params) { fp_glGetQueryIndexediv(target, index, pname, params); } + +/* GL_VERSION_4_1 */ +inline void glReleaseShaderCompiler() { fp_glReleaseShaderCompiler(); } +inline void glShaderBinary(GLsizei count, const GLuint* shaders, GLenum binaryformat, const void* binary, GLsizei length) { fp_glShaderBinary(count, shaders, binaryformat, binary, length); } +inline void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { fp_glGetShaderPrecisionFormat(shadertype, precisiontype, range, precision); } +inline void glDepthRangef(GLfloat n, GLfloat f) { fp_glDepthRangef(n, f); } +inline void glClearDepthf(GLfloat d) { fp_glClearDepthf(d); } +inline void glGetProgramBinary(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary) { fp_glGetProgramBinary(program, bufSize, length, binaryFormat, binary); } +inline void glProgramBinary(GLuint program, GLenum binaryFormat, const void* binary, GLsizei length) { fp_glProgramBinary(program, binaryFormat, binary, length); } +inline void glProgramParameteri(GLuint program, GLenum pname, GLint value) { fp_glProgramParameteri(program, pname, value); } +inline void glUseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program) { fp_glUseProgramStages(pipeline, stages, program); } +inline void glActiveShaderProgram(GLuint pipeline, GLuint program) { fp_glActiveShaderProgram(pipeline, program); } +inline GLuint glCreateShaderProgramv(GLenum type, GLsizei count, const GLchar** strings) { return fp_glCreateShaderProgramv(type, count, strings); } +inline void glBindProgramPipeline(GLuint pipeline) { fp_glBindProgramPipeline(pipeline); } +inline void glDeleteProgramPipelines(GLsizei n, const GLuint* pipelines) { fp_glDeleteProgramPipelines(n, pipelines); } +inline void glGenProgramPipelines(GLsizei n, GLuint* pipelines) { fp_glGenProgramPipelines(n, pipelines); } +inline GLboolean glIsProgramPipeline(GLuint pipeline) { return fp_glIsProgramPipeline(pipeline); } +inline void glGetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint* params) { fp_glGetProgramPipelineiv(pipeline, pname, params); } +inline void glProgramUniform1i(GLuint program, GLint location, GLint v0) { fp_glProgramUniform1i(program, location, v0); } +inline void glProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform1iv(program, location, count, value); } +inline void glProgramUniform1f(GLuint program, GLint location, GLfloat v0) { fp_glProgramUniform1f(program, location, v0); } +inline void glProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform1fv(program, location, count, value); } +inline void glProgramUniform1d(GLuint program, GLint location, GLdouble v0) { fp_glProgramUniform1d(program, location, v0); } +inline void glProgramUniform1dv(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform1dv(program, location, count, value); } +inline void glProgramUniform1ui(GLuint program, GLint location, GLuint v0) { fp_glProgramUniform1ui(program, location, v0); } +inline void glProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform1uiv(program, location, count, value); } +inline void glProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1) { fp_glProgramUniform2i(program, location, v0, v1); } +inline void glProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform2iv(program, location, count, value); } +inline void glProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1) { fp_glProgramUniform2f(program, location, v0, v1); } +inline void glProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform2fv(program, location, count, value); } +inline void glProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1) { fp_glProgramUniform2d(program, location, v0, v1); } +inline void glProgramUniform2dv(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform2dv(program, location, count, value); } +inline void glProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1) { fp_glProgramUniform2ui(program, location, v0, v1); } +inline void glProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform2uiv(program, location, count, value); } +inline void glProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) { fp_glProgramUniform3i(program, location, v0, v1, v2); } +inline void glProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform3iv(program, location, count, value); } +inline void glProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { fp_glProgramUniform3f(program, location, v0, v1, v2); } +inline void glProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform3fv(program, location, count, value); } +inline void glProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2) { fp_glProgramUniform3d(program, location, v0, v1, v2); } +inline void glProgramUniform3dv(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform3dv(program, location, count, value); } +inline void glProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) { fp_glProgramUniform3ui(program, location, v0, v1, v2); } +inline void glProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform3uiv(program, location, count, value); } +inline void glProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { fp_glProgramUniform4i(program, location, v0, v1, v2, v3); } +inline void glProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform4iv(program, location, count, value); } +inline void glProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { fp_glProgramUniform4f(program, location, v0, v1, v2, v3); } +inline void glProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform4fv(program, location, count, value); } +inline void glProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3) { fp_glProgramUniform4d(program, location, v0, v1, v2, v3); } +inline void glProgramUniform4dv(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform4dv(program, location, count, value); } +inline void glProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { fp_glProgramUniform4ui(program, location, v0, v1, v2, v3); } +inline void glProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform4uiv(program, location, count, value); } +inline void glProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2dv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3dv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4dv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2x3fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3x2fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2x4fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4x2fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3x4fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4x3fv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2x3dv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3x2dv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2x4dv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4x2dv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3x4dv(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4x3dv(program, location, count, transpose, value); } +inline void glValidateProgramPipeline(GLuint pipeline) { fp_glValidateProgramPipeline(pipeline); } +inline void glGetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { fp_glGetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog); } +inline void glVertexAttribL1d(GLuint index, GLdouble x) { fp_glVertexAttribL1d(index, x); } +inline void glVertexAttribL2d(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttribL2d(index, x, y); } +inline void glVertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttribL3d(index, x, y, z); } +inline void glVertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttribL4d(index, x, y, z, w); } +inline void glVertexAttribL1dv(GLuint index, const GLdouble* v) { fp_glVertexAttribL1dv(index, v); } +inline void glVertexAttribL2dv(GLuint index, const GLdouble* v) { fp_glVertexAttribL2dv(index, v); } +inline void glVertexAttribL3dv(GLuint index, const GLdouble* v) { fp_glVertexAttribL3dv(index, v); } +inline void glVertexAttribL4dv(GLuint index, const GLdouble* v) { fp_glVertexAttribL4dv(index, v); } +inline void glVertexAttribLPointer(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribLPointer(index, size, type, stride, pointer); } +inline void glGetVertexAttribLdv(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribLdv(index, pname, params); } +inline void glViewportArrayv(GLuint first, GLsizei count, const GLfloat* v) { fp_glViewportArrayv(first, count, v); } +inline void glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h) { fp_glViewportIndexedf(index, x, y, w, h); } +inline void glViewportIndexedfv(GLuint index, const GLfloat* v) { fp_glViewportIndexedfv(index, v); } +inline void glScissorArrayv(GLuint first, GLsizei count, const GLint* v) { fp_glScissorArrayv(first, count, v); } +inline void glScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height) { fp_glScissorIndexed(index, left, bottom, width, height); } +inline void glScissorIndexedv(GLuint index, const GLint* v) { fp_glScissorIndexedv(index, v); } +inline void glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble* v) { fp_glDepthRangeArrayv(first, count, v); } +inline void glDepthRangeIndexed(GLuint index, GLdouble n, GLdouble f) { fp_glDepthRangeIndexed(index, n, f); } +inline void glGetFloati_v(GLenum target, GLuint index, GLfloat* data) { fp_glGetFloati_v(target, index, data); } +inline void glGetDoublei_v(GLenum target, GLuint index, GLdouble* data) { fp_glGetDoublei_v(target, index, data); } + +/* GL_VERSION_4_2 */ +inline void glDrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance) { fp_glDrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance); } +inline void glDrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLuint baseinstance) { fp_glDrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance); } +inline void glDrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance) { fp_glDrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance); } +inline void glGetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params) { fp_glGetInternalformativ(target, internalformat, pname, bufSize, params); } +inline void glGetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex, GLenum pname, GLint* params) { fp_glGetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params); } +inline void glBindImageTexture(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) { fp_glBindImageTexture(unit, texture, level, layered, layer, access, format); } +inline void glMemoryBarrier(GLbitfield barriers) { fp_glMemoryBarrier(barriers); } +inline void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTexStorage1D(target, levels, internalformat, width); } +inline void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTexStorage2D(target, levels, internalformat, width, height); } +inline void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTexStorage3D(target, levels, internalformat, width, height, depth); } +inline void glDrawTransformFeedbackInstanced(GLenum mode, GLuint id, GLsizei instancecount) { fp_glDrawTransformFeedbackInstanced(mode, id, instancecount); } +inline void glDrawTransformFeedbackStreamInstanced(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount) { fp_glDrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount); } + +/* GL_VERSION_4_3 */ +inline void glClearBufferData(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void* data) { fp_glClearBufferData(target, internalformat, format, type, data); } +inline void glClearBufferSubData(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void* data) { fp_glClearBufferSubData(target, internalformat, offset, size, format, type, data); } +inline void glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z) { fp_glDispatchCompute(num_groups_x, num_groups_y, num_groups_z); } +inline void glDispatchComputeIndirect(GLintptr indirect) { fp_glDispatchComputeIndirect(indirect); } +inline void glCopyImageSubData(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth) { fp_glCopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); } +inline void glFramebufferParameteri(GLenum target, GLenum pname, GLint param) { fp_glFramebufferParameteri(target, pname, param); } +inline void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint* params) { fp_glGetFramebufferParameteriv(target, pname, params); } +inline void glGetInternalformati64v(GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params) { fp_glGetInternalformati64v(target, internalformat, pname, bufSize, params); } +inline void glInvalidateTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth) { fp_glInvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth); } +inline void glInvalidateTexImage(GLuint texture, GLint level) { fp_glInvalidateTexImage(texture, level); } +inline void glInvalidateBufferSubData(GLuint buffer, GLintptr offset, GLsizeiptr length) { fp_glInvalidateBufferSubData(buffer, offset, length); } +inline void glInvalidateBufferData(GLuint buffer) { fp_glInvalidateBufferData(buffer); } +inline void glInvalidateFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments) { fp_glInvalidateFramebuffer(target, numAttachments, attachments); } +inline void glInvalidateSubFramebuffer(GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height); } +inline void glMultiDrawArraysIndirect(GLenum mode, const void* indirect, GLsizei drawcount, GLsizei stride) { fp_glMultiDrawArraysIndirect(mode, indirect, drawcount, stride); } +inline void glMultiDrawElementsIndirect(GLenum mode, GLenum type, const void* indirect, GLsizei drawcount, GLsizei stride) { fp_glMultiDrawElementsIndirect(mode, type, indirect, drawcount, stride); } +inline void glGetProgramInterfaceiv(GLuint program, GLenum programInterface, GLenum pname, GLint* params) { fp_glGetProgramInterfaceiv(program, programInterface, pname, params); } +inline GLuint glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar* name) { return fp_glGetProgramResourceIndex(program, programInterface, name); } +inline void glGetProgramResourceName(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar* name) { fp_glGetProgramResourceName(program, programInterface, index, bufSize, length, name); } +inline void glGetProgramResourceiv(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei* length, GLint* params) { fp_glGetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params); } +inline GLint glGetProgramResourceLocation(GLuint program, GLenum programInterface, const GLchar* name) { return fp_glGetProgramResourceLocation(program, programInterface, name); } +inline GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInterface, const GLchar* name) { return fp_glGetProgramResourceLocationIndex(program, programInterface, name); } +inline void glShaderStorageBlockBinding(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding) { fp_glShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding); } +inline void glTexBufferRange(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTexBufferRange(target, internalformat, buffer, offset, size); } +inline void glTexStorage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations); } +inline void glTexStorage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); } +inline void glTextureView(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers) { fp_glTextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers); } +inline void glBindVertexBuffer(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { fp_glBindVertexBuffer(bindingindex, buffer, offset, stride); } +inline void glVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { fp_glVertexAttribFormat(attribindex, size, type, normalized, relativeoffset); } +inline void glVertexAttribIFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexAttribIFormat(attribindex, size, type, relativeoffset); } +inline void glVertexAttribLFormat(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexAttribLFormat(attribindex, size, type, relativeoffset); } +inline void glVertexAttribBinding(GLuint attribindex, GLuint bindingindex) { fp_glVertexAttribBinding(attribindex, bindingindex); } +inline void glVertexBindingDivisor(GLuint bindingindex, GLuint divisor) { fp_glVertexBindingDivisor(bindingindex, divisor); } +inline void glDebugMessageControl(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageControl(source, type, severity, count, ids, enabled); } +inline void glDebugMessageInsert(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsert(source, type, id, severity, length, buf); } +inline void glDebugMessageCallback(GLDEBUGPROC callback, const void* userParam) { fp_glDebugMessageCallback(callback, userParam); } +inline GLuint glGetDebugMessageLog(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { return fp_glGetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog); } +inline void glPushDebugGroup(GLenum source, GLuint id, GLsizei length, const GLchar* message) { fp_glPushDebugGroup(source, id, length, message); } +inline void glPopDebugGroup() { fp_glPopDebugGroup(); } +inline void glObjectLabel(GLenum identifier, GLuint name, GLsizei length, const GLchar* label) { fp_glObjectLabel(identifier, name, length, label); } +inline void glGetObjectLabel(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectLabel(identifier, name, bufSize, length, label); } +inline void glObjectPtrLabel(const void* ptr, GLsizei length, const GLchar* label) { fp_glObjectPtrLabel(ptr, length, label); } +inline void glGetObjectPtrLabel(const void* ptr, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectPtrLabel(ptr, bufSize, length, label); } + +/* GL_VERSION_4_4 */ +inline void glBufferStorage(GLenum target, GLsizeiptr size, const void* data, GLbitfield flags) { fp_glBufferStorage(target, size, data, flags); } +inline void glClearTexImage(GLuint texture, GLint level, GLenum format, GLenum type, const void* data) { fp_glClearTexImage(texture, level, format, type, data); } +inline void glClearTexSubImage(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* data) { fp_glClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); } +inline void glBindBuffersBase(GLenum target, GLuint first, GLsizei count, const GLuint* buffers) { fp_glBindBuffersBase(target, first, count, buffers); } +inline void glBindBuffersRange(GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizeiptr* sizes) { fp_glBindBuffersRange(target, first, count, buffers, offsets, sizes); } +inline void glBindTextures(GLuint first, GLsizei count, const GLuint* textures) { fp_glBindTextures(first, count, textures); } +inline void glBindSamplers(GLuint first, GLsizei count, const GLuint* samplers) { fp_glBindSamplers(first, count, samplers); } +inline void glBindImageTextures(GLuint first, GLsizei count, const GLuint* textures) { fp_glBindImageTextures(first, count, textures); } +inline void glBindVertexBuffers(GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides) { fp_glBindVertexBuffers(first, count, buffers, offsets, strides); } + +/* GL_KHR_debug */ +inline void glDebugMessageControlKHR(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageControlKHR(source, type, severity, count, ids, enabled); } +inline void glDebugMessageInsertKHR(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsertKHR(source, type, id, severity, length, buf); } +inline void glDebugMessageCallbackKHR(GLDEBUGPROCKHR callback, const void* userParam) { fp_glDebugMessageCallbackKHR(callback, userParam); } +inline GLuint glGetDebugMessageLogKHR(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { return fp_glGetDebugMessageLogKHR(count, bufSize, sources, types, ids, severities, lengths, messageLog); } +inline void glPushDebugGroupKHR(GLenum source, GLuint id, GLsizei length, const GLchar* message) { fp_glPushDebugGroupKHR(source, id, length, message); } +inline void glPopDebugGroupKHR() { fp_glPopDebugGroupKHR(); } +inline void glObjectLabelKHR(GLenum identifier, GLuint name, GLsizei length, const GLchar* label) { fp_glObjectLabelKHR(identifier, name, length, label); } +inline void glGetObjectLabelKHR(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectLabelKHR(identifier, name, bufSize, length, label); } +inline void glObjectPtrLabelKHR(const void* ptr, GLsizei length, const GLchar* label) { fp_glObjectPtrLabelKHR(ptr, length, label); } +inline void glGetObjectPtrLabelKHR(const void* ptr, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectPtrLabelKHR(ptr, bufSize, length, label); } +inline void glGetPointervKHR(GLenum pname, void** params) { fp_glGetPointervKHR(pname, params); } + +/* GL_ARB_bindless_texture */ +inline GLuint64 glGetTextureHandleARB(GLuint texture) { return fp_glGetTextureHandleARB(texture); } +inline GLuint64 glGetTextureSamplerHandleARB(GLuint texture, GLuint sampler) { return fp_glGetTextureSamplerHandleARB(texture, sampler); } +inline void glMakeTextureHandleResidentARB(GLuint64 handle) { fp_glMakeTextureHandleResidentARB(handle); } +inline void glMakeTextureHandleNonResidentARB(GLuint64 handle) { fp_glMakeTextureHandleNonResidentARB(handle); } +inline GLuint64 glGetImageHandleARB(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format) { return fp_glGetImageHandleARB(texture, level, layered, layer, format); } +inline void glMakeImageHandleResidentARB(GLuint64 handle, GLenum access) { fp_glMakeImageHandleResidentARB(handle, access); } +inline void glMakeImageHandleNonResidentARB(GLuint64 handle) { fp_glMakeImageHandleNonResidentARB(handle); } +inline void glUniformHandleui64ARB(GLint location, GLuint64 value) { fp_glUniformHandleui64ARB(location, value); } +inline void glUniformHandleui64vARB(GLint location, GLsizei count, const GLuint64* value) { fp_glUniformHandleui64vARB(location, count, value); } +inline void glProgramUniformHandleui64ARB(GLuint program, GLint location, GLuint64 value) { fp_glProgramUniformHandleui64ARB(program, location, value); } +inline void glProgramUniformHandleui64vARB(GLuint program, GLint location, GLsizei count, const GLuint64* values) { fp_glProgramUniformHandleui64vARB(program, location, count, values); } +inline GLboolean glIsTextureHandleResidentARB(GLuint64 handle) { return fp_glIsTextureHandleResidentARB(handle); } +inline GLboolean glIsImageHandleResidentARB(GLuint64 handle) { return fp_glIsImageHandleResidentARB(handle); } +inline void glVertexAttribL1ui64ARB(GLuint index, GLuint64EXT x) { fp_glVertexAttribL1ui64ARB(index, x); } +inline void glVertexAttribL1ui64vARB(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL1ui64vARB(index, v); } +inline void glGetVertexAttribLui64vARB(GLuint index, GLenum pname, GLuint64EXT* params) { fp_glGetVertexAttribLui64vARB(index, pname, params); } + +/* GL_ARB_cl_event */ +inline GLsync glCreateSyncFromCLeventARB(struct _cl_context* context, struct _cl_event* event, GLbitfield flags) { return fp_glCreateSyncFromCLeventARB(context, event, flags); } + +/* GL_ARB_color_buffer_float */ +inline void glClampColorARB(GLenum target, GLenum clamp) { fp_glClampColorARB(target, clamp); } + +/* GL_ARB_compute_variable_group_size */ +inline void glDispatchComputeGroupSizeARB(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z) { fp_glDispatchComputeGroupSizeARB(num_groups_x, num_groups_y, num_groups_z, group_size_x, group_size_y, group_size_z); } + +/* GL_ARB_debug_output */ +inline void glDebugMessageControlARB(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageControlARB(source, type, severity, count, ids, enabled); } +inline void glDebugMessageInsertARB(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsertARB(source, type, id, severity, length, buf); } +inline void glDebugMessageCallbackARB(GLDEBUGPROCARB callback, const void* userParam) { fp_glDebugMessageCallbackARB(callback, userParam); } +inline GLuint glGetDebugMessageLogARB(GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog) { return fp_glGetDebugMessageLogARB(count, bufSize, sources, types, ids, severities, lengths, messageLog); } + +/* GL_ARB_draw_buffers */ +inline void glDrawBuffersARB(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersARB(n, bufs); } + +/* GL_ARB_draw_buffers_blend */ +inline void glBlendEquationiARB(GLuint buf, GLenum mode) { fp_glBlendEquationiARB(buf, mode); } +inline void glBlendEquationSeparateiARB(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateiARB(buf, modeRGB, modeAlpha); } +inline void glBlendFunciARB(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFunciARB(buf, src, dst); } +inline void glBlendFuncSeparateiARB(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparateiARB(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); } + +/* GL_ARB_draw_instanced */ +inline void glDrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedARB(mode, first, count, primcount); } +inline void glDrawElementsInstancedARB(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedARB(mode, count, type, indices, primcount); } + +/* GL_ARB_fragment_program */ +inline void glProgramStringARB(GLenum target, GLenum format, GLsizei len, const void* string) { fp_glProgramStringARB(target, format, len, string); } +inline void glBindProgramARB(GLenum target, GLuint program) { fp_glBindProgramARB(target, program); } +inline void glDeleteProgramsARB(GLsizei n, const GLuint* programs) { fp_glDeleteProgramsARB(n, programs); } +inline void glGenProgramsARB(GLsizei n, GLuint* programs) { fp_glGenProgramsARB(n, programs); } +inline void glProgramEnvParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramEnvParameter4dARB(target, index, x, y, z, w); } +inline void glProgramEnvParameter4dvARB(GLenum target, GLuint index, const GLdouble* params) { fp_glProgramEnvParameter4dvARB(target, index, params); } +inline void glProgramEnvParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glProgramEnvParameter4fARB(target, index, x, y, z, w); } +inline void glProgramEnvParameter4fvARB(GLenum target, GLuint index, const GLfloat* params) { fp_glProgramEnvParameter4fvARB(target, index, params); } +inline void glProgramLocalParameter4dARB(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramLocalParameter4dARB(target, index, x, y, z, w); } +inline void glProgramLocalParameter4dvARB(GLenum target, GLuint index, const GLdouble* params) { fp_glProgramLocalParameter4dvARB(target, index, params); } +inline void glProgramLocalParameter4fARB(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glProgramLocalParameter4fARB(target, index, x, y, z, w); } +inline void glProgramLocalParameter4fvARB(GLenum target, GLuint index, const GLfloat* params) { fp_glProgramLocalParameter4fvARB(target, index, params); } +inline void glGetProgramEnvParameterdvARB(GLenum target, GLuint index, GLdouble* params) { fp_glGetProgramEnvParameterdvARB(target, index, params); } +inline void glGetProgramEnvParameterfvARB(GLenum target, GLuint index, GLfloat* params) { fp_glGetProgramEnvParameterfvARB(target, index, params); } +inline void glGetProgramLocalParameterdvARB(GLenum target, GLuint index, GLdouble* params) { fp_glGetProgramLocalParameterdvARB(target, index, params); } +inline void glGetProgramLocalParameterfvARB(GLenum target, GLuint index, GLfloat* params) { fp_glGetProgramLocalParameterfvARB(target, index, params); } +inline void glGetProgramivARB(GLenum target, GLenum pname, GLint* params) { fp_glGetProgramivARB(target, pname, params); } +inline void glGetProgramStringARB(GLenum target, GLenum pname, void* string) { fp_glGetProgramStringARB(target, pname, string); } +inline GLboolean glIsProgramARB(GLuint program) { return fp_glIsProgramARB(program); } + +/* GL_ARB_geometry_shader4 */ +inline void glProgramParameteriARB(GLuint program, GLenum pname, GLint value) { fp_glProgramParameteriARB(program, pname, value); } +inline void glFramebufferTextureARB(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureARB(target, attachment, texture, level); } +inline void glFramebufferTextureLayerARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glFramebufferTextureLayerARB(target, attachment, texture, level, layer); } +inline void glFramebufferTextureFaceARB(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) { fp_glFramebufferTextureFaceARB(target, attachment, texture, level, face); } + +/* GL_ARB_indirect_parameters */ +inline void glMultiDrawArraysIndirectCountARB(GLenum mode, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride) { fp_glMultiDrawArraysIndirectCountARB(mode, indirect, drawcount, maxdrawcount, stride); } +inline void glMultiDrawElementsIndirectCountARB(GLenum mode, GLenum type, GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride) { fp_glMultiDrawElementsIndirectCountARB(mode, type, indirect, drawcount, maxdrawcount, stride); } + +/* GL_ARB_instanced_arrays */ +inline void glVertexAttribDivisorARB(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorARB(index, divisor); } + +/* GL_ARB_matrix_palette */ +inline void glCurrentPaletteMatrixARB(GLint index) { fp_glCurrentPaletteMatrixARB(index); } +inline void glMatrixIndexubvARB(GLint size, const GLubyte* indices) { fp_glMatrixIndexubvARB(size, indices); } +inline void glMatrixIndexusvARB(GLint size, const GLushort* indices) { fp_glMatrixIndexusvARB(size, indices); } +inline void glMatrixIndexuivARB(GLint size, const GLuint* indices) { fp_glMatrixIndexuivARB(size, indices); } +inline void glMatrixIndexPointerARB(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glMatrixIndexPointerARB(size, type, stride, pointer); } + +/* GL_ARB_multisample */ +inline void glSampleCoverageARB(GLfloat value, GLboolean invert) { fp_glSampleCoverageARB(value, invert); } + +/* GL_ARB_multitexture */ +inline void glActiveTextureARB(GLenum texture) { fp_glActiveTextureARB(texture); } +inline void glClientActiveTextureARB(GLenum texture) { fp_glClientActiveTextureARB(texture); } +inline void glMultiTexCoord1dARB(GLenum target, GLdouble s) { fp_glMultiTexCoord1dARB(target, s); } +inline void glMultiTexCoord1dvARB(GLenum target, const GLdouble* v) { fp_glMultiTexCoord1dvARB(target, v); } +inline void glMultiTexCoord1fARB(GLenum target, GLfloat s) { fp_glMultiTexCoord1fARB(target, s); } +inline void glMultiTexCoord1fvARB(GLenum target, const GLfloat* v) { fp_glMultiTexCoord1fvARB(target, v); } +inline void glMultiTexCoord1iARB(GLenum target, GLint s) { fp_glMultiTexCoord1iARB(target, s); } +inline void glMultiTexCoord1ivARB(GLenum target, const GLint* v) { fp_glMultiTexCoord1ivARB(target, v); } +inline void glMultiTexCoord1sARB(GLenum target, GLshort s) { fp_glMultiTexCoord1sARB(target, s); } +inline void glMultiTexCoord1svARB(GLenum target, const GLshort* v) { fp_glMultiTexCoord1svARB(target, v); } +inline void glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t) { fp_glMultiTexCoord2dARB(target, s, t); } +inline void glMultiTexCoord2dvARB(GLenum target, const GLdouble* v) { fp_glMultiTexCoord2dvARB(target, v); } +inline void glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t) { fp_glMultiTexCoord2fARB(target, s, t); } +inline void glMultiTexCoord2fvARB(GLenum target, const GLfloat* v) { fp_glMultiTexCoord2fvARB(target, v); } +inline void glMultiTexCoord2iARB(GLenum target, GLint s, GLint t) { fp_glMultiTexCoord2iARB(target, s, t); } +inline void glMultiTexCoord2ivARB(GLenum target, const GLint* v) { fp_glMultiTexCoord2ivARB(target, v); } +inline void glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t) { fp_glMultiTexCoord2sARB(target, s, t); } +inline void glMultiTexCoord2svARB(GLenum target, const GLshort* v) { fp_glMultiTexCoord2svARB(target, v); } +inline void glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r) { fp_glMultiTexCoord3dARB(target, s, t, r); } +inline void glMultiTexCoord3dvARB(GLenum target, const GLdouble* v) { fp_glMultiTexCoord3dvARB(target, v); } +inline void glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r) { fp_glMultiTexCoord3fARB(target, s, t, r); } +inline void glMultiTexCoord3fvARB(GLenum target, const GLfloat* v) { fp_glMultiTexCoord3fvARB(target, v); } +inline void glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r) { fp_glMultiTexCoord3iARB(target, s, t, r); } +inline void glMultiTexCoord3ivARB(GLenum target, const GLint* v) { fp_glMultiTexCoord3ivARB(target, v); } +inline void glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r) { fp_glMultiTexCoord3sARB(target, s, t, r); } +inline void glMultiTexCoord3svARB(GLenum target, const GLshort* v) { fp_glMultiTexCoord3svARB(target, v); } +inline void glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q) { fp_glMultiTexCoord4dARB(target, s, t, r, q); } +inline void glMultiTexCoord4dvARB(GLenum target, const GLdouble* v) { fp_glMultiTexCoord4dvARB(target, v); } +inline void glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) { fp_glMultiTexCoord4fARB(target, s, t, r, q); } +inline void glMultiTexCoord4fvARB(GLenum target, const GLfloat* v) { fp_glMultiTexCoord4fvARB(target, v); } +inline void glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q) { fp_glMultiTexCoord4iARB(target, s, t, r, q); } +inline void glMultiTexCoord4ivARB(GLenum target, const GLint* v) { fp_glMultiTexCoord4ivARB(target, v); } +inline void glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q) { fp_glMultiTexCoord4sARB(target, s, t, r, q); } +inline void glMultiTexCoord4svARB(GLenum target, const GLshort* v) { fp_glMultiTexCoord4svARB(target, v); } + +/* GL_ARB_occlusion_query */ +inline void glGenQueriesARB(GLsizei n, GLuint* ids) { fp_glGenQueriesARB(n, ids); } +inline void glDeleteQueriesARB(GLsizei n, const GLuint* ids) { fp_glDeleteQueriesARB(n, ids); } +inline GLboolean glIsQueryARB(GLuint id) { return fp_glIsQueryARB(id); } +inline void glBeginQueryARB(GLenum target, GLuint id) { fp_glBeginQueryARB(target, id); } +inline void glEndQueryARB(GLenum target) { fp_glEndQueryARB(target); } +inline void glGetQueryivARB(GLenum target, GLenum pname, GLint* params) { fp_glGetQueryivARB(target, pname, params); } +inline void glGetQueryObjectivARB(GLuint id, GLenum pname, GLint* params) { fp_glGetQueryObjectivARB(id, pname, params); } +inline void glGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint* params) { fp_glGetQueryObjectuivARB(id, pname, params); } + +/* GL_ARB_point_parameters */ +inline void glPointParameterfARB(GLenum pname, GLfloat param) { fp_glPointParameterfARB(pname, param); } +inline void glPointParameterfvARB(GLenum pname, const GLfloat* params) { fp_glPointParameterfvARB(pname, params); } + +/* GL_ARB_robustness */ +inline GLenum glGetGraphicsResetStatusARB() { return fp_glGetGraphicsResetStatusARB(); } +inline void glGetnTexImageARB(GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img) { fp_glGetnTexImageARB(target, level, format, type, bufSize, img); } +inline void glReadnPixelsARB(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixelsARB(x, y, width, height, format, type, bufSize, data); } +inline void glGetnCompressedTexImageARB(GLenum target, GLint lod, GLsizei bufSize, void* img) { fp_glGetnCompressedTexImageARB(target, lod, bufSize, img); } +inline void glGetnUniformfvARB(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfvARB(program, location, bufSize, params); } +inline void glGetnUniformivARB(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformivARB(program, location, bufSize, params); } +inline void glGetnUniformuivARB(GLuint program, GLint location, GLsizei bufSize, GLuint* params) { fp_glGetnUniformuivARB(program, location, bufSize, params); } +inline void glGetnUniformdvARB(GLuint program, GLint location, GLsizei bufSize, GLdouble* params) { fp_glGetnUniformdvARB(program, location, bufSize, params); } +inline void glGetnMapdvARB(GLenum target, GLenum query, GLsizei bufSize, GLdouble* v) { fp_glGetnMapdvARB(target, query, bufSize, v); } +inline void glGetnMapfvARB(GLenum target, GLenum query, GLsizei bufSize, GLfloat* v) { fp_glGetnMapfvARB(target, query, bufSize, v); } +inline void glGetnMapivARB(GLenum target, GLenum query, GLsizei bufSize, GLint* v) { fp_glGetnMapivARB(target, query, bufSize, v); } +inline void glGetnPixelMapfvARB(GLenum map, GLsizei bufSize, GLfloat* values) { fp_glGetnPixelMapfvARB(map, bufSize, values); } +inline void glGetnPixelMapuivARB(GLenum map, GLsizei bufSize, GLuint* values) { fp_glGetnPixelMapuivARB(map, bufSize, values); } +inline void glGetnPixelMapusvARB(GLenum map, GLsizei bufSize, GLushort* values) { fp_glGetnPixelMapusvARB(map, bufSize, values); } +inline void glGetnPolygonStippleARB(GLsizei bufSize, GLubyte* pattern) { fp_glGetnPolygonStippleARB(bufSize, pattern); } +inline void glGetnColorTableARB(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table) { fp_glGetnColorTableARB(target, format, type, bufSize, table); } +inline void glGetnConvolutionFilterARB(GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image) { fp_glGetnConvolutionFilterARB(target, format, type, bufSize, image); } +inline void glGetnSeparableFilterARB(GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void* column, void* span) { fp_glGetnSeparableFilterARB(target, format, type, rowBufSize, row, columnBufSize, column, span); } +inline void glGetnHistogramARB(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values) { fp_glGetnHistogramARB(target, reset, format, type, bufSize, values); } +inline void glGetnMinmaxARB(GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values) { fp_glGetnMinmaxARB(target, reset, format, type, bufSize, values); } + +/* GL_ARB_sample_shading */ +inline void glMinSampleShadingARB(GLfloat value) { fp_glMinSampleShadingARB(value); } + +/* GL_ARB_shader_objects */ +inline void glDeleteObjectARB(GLhandleARB obj) { fp_glDeleteObjectARB(obj); } +inline GLhandleARB glGetHandleARB(GLenum pname) { return fp_glGetHandleARB(pname); } +inline void glDetachObjectARB(GLhandleARB containerObj, GLhandleARB attachedObj) { fp_glDetachObjectARB(containerObj, attachedObj); } +inline GLhandleARB glCreateShaderObjectARB(GLenum shaderType) { return fp_glCreateShaderObjectARB(shaderType); } +inline void glShaderSourceARB(GLhandleARB shaderObj, GLsizei count, const GLcharARB** string, const GLint* length) { fp_glShaderSourceARB(shaderObj, count, string, length); } +inline void glCompileShaderARB(GLhandleARB shaderObj) { fp_glCompileShaderARB(shaderObj); } +inline GLhandleARB glCreateProgramObjectARB() { return fp_glCreateProgramObjectARB(); } +inline void glAttachObjectARB(GLhandleARB containerObj, GLhandleARB obj) { fp_glAttachObjectARB(containerObj, obj); } +inline void glLinkProgramARB(GLhandleARB programObj) { fp_glLinkProgramARB(programObj); } +inline void glUseProgramObjectARB(GLhandleARB programObj) { fp_glUseProgramObjectARB(programObj); } +inline void glValidateProgramARB(GLhandleARB programObj) { fp_glValidateProgramARB(programObj); } +inline void glUniform1fARB(GLint location, GLfloat v0) { fp_glUniform1fARB(location, v0); } +inline void glUniform2fARB(GLint location, GLfloat v0, GLfloat v1) { fp_glUniform2fARB(location, v0, v1); } +inline void glUniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { fp_glUniform3fARB(location, v0, v1, v2); } +inline void glUniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { fp_glUniform4fARB(location, v0, v1, v2, v3); } +inline void glUniform1iARB(GLint location, GLint v0) { fp_glUniform1iARB(location, v0); } +inline void glUniform2iARB(GLint location, GLint v0, GLint v1) { fp_glUniform2iARB(location, v0, v1); } +inline void glUniform3iARB(GLint location, GLint v0, GLint v1, GLint v2) { fp_glUniform3iARB(location, v0, v1, v2); } +inline void glUniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { fp_glUniform4iARB(location, v0, v1, v2, v3); } +inline void glUniform1fvARB(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform1fvARB(location, count, value); } +inline void glUniform2fvARB(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform2fvARB(location, count, value); } +inline void glUniform3fvARB(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform3fvARB(location, count, value); } +inline void glUniform4fvARB(GLint location, GLsizei count, const GLfloat* value) { fp_glUniform4fvARB(location, count, value); } +inline void glUniform1ivARB(GLint location, GLsizei count, const GLint* value) { fp_glUniform1ivARB(location, count, value); } +inline void glUniform2ivARB(GLint location, GLsizei count, const GLint* value) { fp_glUniform2ivARB(location, count, value); } +inline void glUniform3ivARB(GLint location, GLsizei count, const GLint* value) { fp_glUniform3ivARB(location, count, value); } +inline void glUniform4ivARB(GLint location, GLsizei count, const GLint* value) { fp_glUniform4ivARB(location, count, value); } +inline void glUniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2fvARB(location, count, transpose, value); } +inline void glUniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3fvARB(location, count, transpose, value); } +inline void glUniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4fvARB(location, count, transpose, value); } +inline void glGetObjectParameterfvARB(GLhandleARB obj, GLenum pname, GLfloat* params) { fp_glGetObjectParameterfvARB(obj, pname, params); } +inline void glGetObjectParameterivARB(GLhandleARB obj, GLenum pname, GLint* params) { fp_glGetObjectParameterivARB(obj, pname, params); } +inline void glGetInfoLogARB(GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB* infoLog) { fp_glGetInfoLogARB(obj, maxLength, length, infoLog); } +inline void glGetAttachedObjectsARB(GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB* obj) { fp_glGetAttachedObjectsARB(containerObj, maxCount, count, obj); } +inline GLint glGetUniformLocationARB(GLhandleARB programObj, const GLcharARB* name) { return fp_glGetUniformLocationARB(programObj, name); } +inline void glGetActiveUniformARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLcharARB* name) { fp_glGetActiveUniformARB(programObj, index, maxLength, length, size, type, name); } +inline void glGetUniformfvARB(GLhandleARB programObj, GLint location, GLfloat* params) { fp_glGetUniformfvARB(programObj, location, params); } +inline void glGetUniformivARB(GLhandleARB programObj, GLint location, GLint* params) { fp_glGetUniformivARB(programObj, location, params); } +inline void glGetShaderSourceARB(GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB* source) { fp_glGetShaderSourceARB(obj, maxLength, length, source); } + +/* GL_ARB_shading_language_include */ +inline void glNamedStringARB(GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar* string) { fp_glNamedStringARB(type, namelen, name, stringlen, string); } +inline void glDeleteNamedStringARB(GLint namelen, const GLchar* name) { fp_glDeleteNamedStringARB(namelen, name); } +inline void glCompileShaderIncludeARB(GLuint shader, GLsizei count, const GLchar** path, const GLint* length) { fp_glCompileShaderIncludeARB(shader, count, path, length); } +inline GLboolean glIsNamedStringARB(GLint namelen, const GLchar* name) { return fp_glIsNamedStringARB(namelen, name); } +inline void glGetNamedStringARB(GLint namelen, const GLchar* name, GLsizei bufSize, GLint* stringlen, GLchar* string) { fp_glGetNamedStringARB(namelen, name, bufSize, stringlen, string); } +inline void glGetNamedStringivARB(GLint namelen, const GLchar* name, GLenum pname, GLint* params) { fp_glGetNamedStringivARB(namelen, name, pname, params); } + +/* GL_ARB_sparse_texture */ +inline void glTexPageCommitmentARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident) { fp_glTexPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height, depth, resident); } + +/* GL_ARB_texture_buffer_object */ +inline void glTexBufferARB(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferARB(target, internalformat, buffer); } + +/* GL_ARB_texture_compression */ +inline void glCompressedTexImage3DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage3DARB(target, level, internalformat, width, height, depth, border, imageSize, data); } +inline void glCompressedTexImage2DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage2DARB(target, level, internalformat, width, height, border, imageSize, data); } +inline void glCompressedTexImage1DARB(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage1DARB(target, level, internalformat, width, border, imageSize, data); } +inline void glCompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage3DARB(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } +inline void glCompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage2DARB(target, level, xoffset, yoffset, width, height, format, imageSize, data); } +inline void glCompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage1DARB(target, level, xoffset, width, format, imageSize, data); } +inline void glGetCompressedTexImageARB(GLenum target, GLint level, void* img) { fp_glGetCompressedTexImageARB(target, level, img); } + +/* GL_ARB_transpose_matrix */ +inline void glLoadTransposeMatrixfARB(const GLfloat* m) { fp_glLoadTransposeMatrixfARB(m); } +inline void glLoadTransposeMatrixdARB(const GLdouble* m) { fp_glLoadTransposeMatrixdARB(m); } +inline void glMultTransposeMatrixfARB(const GLfloat* m) { fp_glMultTransposeMatrixfARB(m); } +inline void glMultTransposeMatrixdARB(const GLdouble* m) { fp_glMultTransposeMatrixdARB(m); } + +/* GL_ARB_vertex_blend */ +inline void glWeightbvARB(GLint size, const GLbyte* weights) { fp_glWeightbvARB(size, weights); } +inline void glWeightsvARB(GLint size, const GLshort* weights) { fp_glWeightsvARB(size, weights); } +inline void glWeightivARB(GLint size, const GLint* weights) { fp_glWeightivARB(size, weights); } +inline void glWeightfvARB(GLint size, const GLfloat* weights) { fp_glWeightfvARB(size, weights); } +inline void glWeightdvARB(GLint size, const GLdouble* weights) { fp_glWeightdvARB(size, weights); } +inline void glWeightubvARB(GLint size, const GLubyte* weights) { fp_glWeightubvARB(size, weights); } +inline void glWeightusvARB(GLint size, const GLushort* weights) { fp_glWeightusvARB(size, weights); } +inline void glWeightuivARB(GLint size, const GLuint* weights) { fp_glWeightuivARB(size, weights); } +inline void glWeightPointerARB(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glWeightPointerARB(size, type, stride, pointer); } +inline void glVertexBlendARB(GLint count) { fp_glVertexBlendARB(count); } + +/* GL_ARB_vertex_buffer_object */ +inline void glBindBufferARB(GLenum target, GLuint buffer) { fp_glBindBufferARB(target, buffer); } +inline void glDeleteBuffersARB(GLsizei n, const GLuint* buffers) { fp_glDeleteBuffersARB(n, buffers); } +inline void glGenBuffersARB(GLsizei n, GLuint* buffers) { fp_glGenBuffersARB(n, buffers); } +inline GLboolean glIsBufferARB(GLuint buffer) { return fp_glIsBufferARB(buffer); } +inline void glBufferDataARB(GLenum target, GLsizeiptrARB size, const void* data, GLenum usage) { fp_glBufferDataARB(target, size, data, usage); } +inline void glBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void* data) { fp_glBufferSubDataARB(target, offset, size, data); } +inline void glGetBufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, void* data) { fp_glGetBufferSubDataARB(target, offset, size, data); } +inline void* glMapBufferARB(GLenum target, GLenum access) { return fp_glMapBufferARB(target, access); } +inline GLboolean glUnmapBufferARB(GLenum target) { return fp_glUnmapBufferARB(target); } +inline void glGetBufferParameterivARB(GLenum target, GLenum pname, GLint* params) { fp_glGetBufferParameterivARB(target, pname, params); } +inline void glGetBufferPointervARB(GLenum target, GLenum pname, void** params) { fp_glGetBufferPointervARB(target, pname, params); } + +/* GL_ARB_vertex_program */ +inline void glVertexAttrib1dARB(GLuint index, GLdouble x) { fp_glVertexAttrib1dARB(index, x); } +inline void glVertexAttrib1dvARB(GLuint index, const GLdouble* v) { fp_glVertexAttrib1dvARB(index, v); } +inline void glVertexAttrib1fARB(GLuint index, GLfloat x) { fp_glVertexAttrib1fARB(index, x); } +inline void glVertexAttrib1fvARB(GLuint index, const GLfloat* v) { fp_glVertexAttrib1fvARB(index, v); } +inline void glVertexAttrib1sARB(GLuint index, GLshort x) { fp_glVertexAttrib1sARB(index, x); } +inline void glVertexAttrib1svARB(GLuint index, const GLshort* v) { fp_glVertexAttrib1svARB(index, v); } +inline void glVertexAttrib2dARB(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttrib2dARB(index, x, y); } +inline void glVertexAttrib2dvARB(GLuint index, const GLdouble* v) { fp_glVertexAttrib2dvARB(index, v); } +inline void glVertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y) { fp_glVertexAttrib2fARB(index, x, y); } +inline void glVertexAttrib2fvARB(GLuint index, const GLfloat* v) { fp_glVertexAttrib2fvARB(index, v); } +inline void glVertexAttrib2sARB(GLuint index, GLshort x, GLshort y) { fp_glVertexAttrib2sARB(index, x, y); } +inline void glVertexAttrib2svARB(GLuint index, const GLshort* v) { fp_glVertexAttrib2svARB(index, v); } +inline void glVertexAttrib3dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttrib3dARB(index, x, y, z); } +inline void glVertexAttrib3dvARB(GLuint index, const GLdouble* v) { fp_glVertexAttrib3dvARB(index, v); } +inline void glVertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z) { fp_glVertexAttrib3fARB(index, x, y, z); } +inline void glVertexAttrib3fvARB(GLuint index, const GLfloat* v) { fp_glVertexAttrib3fvARB(index, v); } +inline void glVertexAttrib3sARB(GLuint index, GLshort x, GLshort y, GLshort z) { fp_glVertexAttrib3sARB(index, x, y, z); } +inline void glVertexAttrib3svARB(GLuint index, const GLshort* v) { fp_glVertexAttrib3svARB(index, v); } +inline void glVertexAttrib4NbvARB(GLuint index, const GLbyte* v) { fp_glVertexAttrib4NbvARB(index, v); } +inline void glVertexAttrib4NivARB(GLuint index, const GLint* v) { fp_glVertexAttrib4NivARB(index, v); } +inline void glVertexAttrib4NsvARB(GLuint index, const GLshort* v) { fp_glVertexAttrib4NsvARB(index, v); } +inline void glVertexAttrib4NubARB(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { fp_glVertexAttrib4NubARB(index, x, y, z, w); } +inline void glVertexAttrib4NubvARB(GLuint index, const GLubyte* v) { fp_glVertexAttrib4NubvARB(index, v); } +inline void glVertexAttrib4NuivARB(GLuint index, const GLuint* v) { fp_glVertexAttrib4NuivARB(index, v); } +inline void glVertexAttrib4NusvARB(GLuint index, const GLushort* v) { fp_glVertexAttrib4NusvARB(index, v); } +inline void glVertexAttrib4bvARB(GLuint index, const GLbyte* v) { fp_glVertexAttrib4bvARB(index, v); } +inline void glVertexAttrib4dARB(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttrib4dARB(index, x, y, z, w); } +inline void glVertexAttrib4dvARB(GLuint index, const GLdouble* v) { fp_glVertexAttrib4dvARB(index, v); } +inline void glVertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertexAttrib4fARB(index, x, y, z, w); } +inline void glVertexAttrib4fvARB(GLuint index, const GLfloat* v) { fp_glVertexAttrib4fvARB(index, v); } +inline void glVertexAttrib4ivARB(GLuint index, const GLint* v) { fp_glVertexAttrib4ivARB(index, v); } +inline void glVertexAttrib4sARB(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertexAttrib4sARB(index, x, y, z, w); } +inline void glVertexAttrib4svARB(GLuint index, const GLshort* v) { fp_glVertexAttrib4svARB(index, v); } +inline void glVertexAttrib4ubvARB(GLuint index, const GLubyte* v) { fp_glVertexAttrib4ubvARB(index, v); } +inline void glVertexAttrib4uivARB(GLuint index, const GLuint* v) { fp_glVertexAttrib4uivARB(index, v); } +inline void glVertexAttrib4usvARB(GLuint index, const GLushort* v) { fp_glVertexAttrib4usvARB(index, v); } +inline void glVertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer) { fp_glVertexAttribPointerARB(index, size, type, normalized, stride, pointer); } +inline void glEnableVertexAttribArrayARB(GLuint index) { fp_glEnableVertexAttribArrayARB(index); } +inline void glDisableVertexAttribArrayARB(GLuint index) { fp_glDisableVertexAttribArrayARB(index); } +inline void glGetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribdvARB(index, pname, params); } +inline void glGetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat* params) { fp_glGetVertexAttribfvARB(index, pname, params); } +inline void glGetVertexAttribivARB(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribivARB(index, pname, params); } +inline void glGetVertexAttribPointervARB(GLuint index, GLenum pname, void** pointer) { fp_glGetVertexAttribPointervARB(index, pname, pointer); } + +/* GL_ARB_vertex_shader */ +inline void glBindAttribLocationARB(GLhandleARB programObj, GLuint index, const GLcharARB* name) { fp_glBindAttribLocationARB(programObj, index, name); } +inline void glGetActiveAttribARB(GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLcharARB* name) { fp_glGetActiveAttribARB(programObj, index, maxLength, length, size, type, name); } +inline GLint glGetAttribLocationARB(GLhandleARB programObj, const GLcharARB* name) { return fp_glGetAttribLocationARB(programObj, name); } + +/* GL_ARB_window_pos */ +inline void glWindowPos2dARB(GLdouble x, GLdouble y) { fp_glWindowPos2dARB(x, y); } +inline void glWindowPos2dvARB(const GLdouble* v) { fp_glWindowPos2dvARB(v); } +inline void glWindowPos2fARB(GLfloat x, GLfloat y) { fp_glWindowPos2fARB(x, y); } +inline void glWindowPos2fvARB(const GLfloat* v) { fp_glWindowPos2fvARB(v); } +inline void glWindowPos2iARB(GLint x, GLint y) { fp_glWindowPos2iARB(x, y); } +inline void glWindowPos2ivARB(const GLint* v) { fp_glWindowPos2ivARB(v); } +inline void glWindowPos2sARB(GLshort x, GLshort y) { fp_glWindowPos2sARB(x, y); } +inline void glWindowPos2svARB(const GLshort* v) { fp_glWindowPos2svARB(v); } +inline void glWindowPos3dARB(GLdouble x, GLdouble y, GLdouble z) { fp_glWindowPos3dARB(x, y, z); } +inline void glWindowPos3dvARB(const GLdouble* v) { fp_glWindowPos3dvARB(v); } +inline void glWindowPos3fARB(GLfloat x, GLfloat y, GLfloat z) { fp_glWindowPos3fARB(x, y, z); } +inline void glWindowPos3fvARB(const GLfloat* v) { fp_glWindowPos3fvARB(v); } +inline void glWindowPos3iARB(GLint x, GLint y, GLint z) { fp_glWindowPos3iARB(x, y, z); } +inline void glWindowPos3ivARB(const GLint* v) { fp_glWindowPos3ivARB(v); } +inline void glWindowPos3sARB(GLshort x, GLshort y, GLshort z) { fp_glWindowPos3sARB(x, y, z); } +inline void glWindowPos3svARB(const GLshort* v) { fp_glWindowPos3svARB(v); } + +/* GL_EXT_bindable_uniform */ +inline void glUniformBufferEXT(GLuint program, GLint location, GLuint buffer) { fp_glUniformBufferEXT(program, location, buffer); } +inline GLint glGetUniformBufferSizeEXT(GLuint program, GLint location) { return fp_glGetUniformBufferSizeEXT(program, location); } +inline GLintptr glGetUniformOffsetEXT(GLuint program, GLint location) { return fp_glGetUniformOffsetEXT(program, location); } + +/* GL_EXT_blend_color */ +inline void glBlendColorEXT(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) { fp_glBlendColorEXT(red, green, blue, alpha); } + +/* GL_EXT_blend_equation_separate */ +inline void glBlendEquationSeparateEXT(GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateEXT(modeRGB, modeAlpha); } + +/* GL_EXT_blend_func_separate */ +inline void glBlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { fp_glBlendFuncSeparateEXT(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } + +/* GL_EXT_blend_minmax */ +inline void glBlendEquationEXT(GLenum mode) { fp_glBlendEquationEXT(mode); } + +/* GL_EXT_color_subtable */ +inline void glColorSubTableEXT(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void* data) { fp_glColorSubTableEXT(target, start, count, format, type, data); } +inline void glCopyColorSubTableEXT(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width) { fp_glCopyColorSubTableEXT(target, start, x, y, width); } + +/* GL_EXT_compiled_vertex_array */ +inline void glLockArraysEXT(GLint first, GLsizei count) { fp_glLockArraysEXT(first, count); } +inline void glUnlockArraysEXT() { fp_glUnlockArraysEXT(); } + +/* GL_EXT_convolution */ +inline void glConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void* image) { fp_glConvolutionFilter1DEXT(target, internalformat, width, format, type, image); } +inline void glConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* image) { fp_glConvolutionFilter2DEXT(target, internalformat, width, height, format, type, image); } +inline void glConvolutionParameterfEXT(GLenum target, GLenum pname, GLfloat params) { fp_glConvolutionParameterfEXT(target, pname, params); } +inline void glConvolutionParameterfvEXT(GLenum target, GLenum pname, const GLfloat* params) { fp_glConvolutionParameterfvEXT(target, pname, params); } +inline void glConvolutionParameteriEXT(GLenum target, GLenum pname, GLint params) { fp_glConvolutionParameteriEXT(target, pname, params); } +inline void glConvolutionParameterivEXT(GLenum target, GLenum pname, const GLint* params) { fp_glConvolutionParameterivEXT(target, pname, params); } +inline void glCopyConvolutionFilter1DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width) { fp_glCopyConvolutionFilter1DEXT(target, internalformat, x, y, width); } +inline void glCopyConvolutionFilter2DEXT(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyConvolutionFilter2DEXT(target, internalformat, x, y, width, height); } +inline void glGetConvolutionFilterEXT(GLenum target, GLenum format, GLenum type, void* image) { fp_glGetConvolutionFilterEXT(target, format, type, image); } +inline void glGetConvolutionParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetConvolutionParameterfvEXT(target, pname, params); } +inline void glGetConvolutionParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetConvolutionParameterivEXT(target, pname, params); } +inline void glGetSeparableFilterEXT(GLenum target, GLenum format, GLenum type, void* row, void* column, void* span) { fp_glGetSeparableFilterEXT(target, format, type, row, column, span); } +inline void glSeparableFilter2DEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* row, const void* column) { fp_glSeparableFilter2DEXT(target, internalformat, width, height, format, type, row, column); } + +/* GL_EXT_coordinate_frame */ +inline void glTangent3bEXT(GLbyte tx, GLbyte ty, GLbyte tz) { fp_glTangent3bEXT(tx, ty, tz); } +inline void glTangent3bvEXT(const GLbyte* v) { fp_glTangent3bvEXT(v); } +inline void glTangent3dEXT(GLdouble tx, GLdouble ty, GLdouble tz) { fp_glTangent3dEXT(tx, ty, tz); } +inline void glTangent3dvEXT(const GLdouble* v) { fp_glTangent3dvEXT(v); } +inline void glTangent3fEXT(GLfloat tx, GLfloat ty, GLfloat tz) { fp_glTangent3fEXT(tx, ty, tz); } +inline void glTangent3fvEXT(const GLfloat* v) { fp_glTangent3fvEXT(v); } +inline void glTangent3iEXT(GLint tx, GLint ty, GLint tz) { fp_glTangent3iEXT(tx, ty, tz); } +inline void glTangent3ivEXT(const GLint* v) { fp_glTangent3ivEXT(v); } +inline void glTangent3sEXT(GLshort tx, GLshort ty, GLshort tz) { fp_glTangent3sEXT(tx, ty, tz); } +inline void glTangent3svEXT(const GLshort* v) { fp_glTangent3svEXT(v); } +inline void glBinormal3bEXT(GLbyte bx, GLbyte by, GLbyte bz) { fp_glBinormal3bEXT(bx, by, bz); } +inline void glBinormal3bvEXT(const GLbyte* v) { fp_glBinormal3bvEXT(v); } +inline void glBinormal3dEXT(GLdouble bx, GLdouble by, GLdouble bz) { fp_glBinormal3dEXT(bx, by, bz); } +inline void glBinormal3dvEXT(const GLdouble* v) { fp_glBinormal3dvEXT(v); } +inline void glBinormal3fEXT(GLfloat bx, GLfloat by, GLfloat bz) { fp_glBinormal3fEXT(bx, by, bz); } +inline void glBinormal3fvEXT(const GLfloat* v) { fp_glBinormal3fvEXT(v); } +inline void glBinormal3iEXT(GLint bx, GLint by, GLint bz) { fp_glBinormal3iEXT(bx, by, bz); } +inline void glBinormal3ivEXT(const GLint* v) { fp_glBinormal3ivEXT(v); } +inline void glBinormal3sEXT(GLshort bx, GLshort by, GLshort bz) { fp_glBinormal3sEXT(bx, by, bz); } +inline void glBinormal3svEXT(const GLshort* v) { fp_glBinormal3svEXT(v); } +inline void glTangentPointerEXT(GLenum type, GLsizei stride, const void* pointer) { fp_glTangentPointerEXT(type, stride, pointer); } +inline void glBinormalPointerEXT(GLenum type, GLsizei stride, const void* pointer) { fp_glBinormalPointerEXT(type, stride, pointer); } + +/* GL_EXT_cull_vertex */ +inline void glCullParameterdvEXT(GLenum pname, GLdouble* params) { fp_glCullParameterdvEXT(pname, params); } +inline void glCullParameterfvEXT(GLenum pname, GLfloat* params) { fp_glCullParameterfvEXT(pname, params); } + +/* GL_EXT_debug_label */ +inline void glLabelObjectEXT(GLenum type, GLuint object, GLsizei length, const GLchar* label) { fp_glLabelObjectEXT(type, object, length, label); } +inline void glGetObjectLabelEXT(GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar* label) { fp_glGetObjectLabelEXT(type, object, bufSize, length, label); } + +/* GL_EXT_debug_marker */ +inline void glInsertEventMarkerEXT(GLsizei length, const GLchar* marker) { fp_glInsertEventMarkerEXT(length, marker); } +inline void glPushGroupMarkerEXT(GLsizei length, const GLchar* marker) { fp_glPushGroupMarkerEXT(length, marker); } +inline void glPopGroupMarkerEXT() { fp_glPopGroupMarkerEXT(); } + +/* GL_EXT_depth_bounds_test */ +inline void glDepthBoundsEXT(GLclampd zmin, GLclampd zmax) { fp_glDepthBoundsEXT(zmin, zmax); } + +/* GL_EXT_direct_state_access */ +inline void glMatrixLoadfEXT(GLenum mode, const GLfloat* m) { fp_glMatrixLoadfEXT(mode, m); } +inline void glMatrixLoaddEXT(GLenum mode, const GLdouble* m) { fp_glMatrixLoaddEXT(mode, m); } +inline void glMatrixMultfEXT(GLenum mode, const GLfloat* m) { fp_glMatrixMultfEXT(mode, m); } +inline void glMatrixMultdEXT(GLenum mode, const GLdouble* m) { fp_glMatrixMultdEXT(mode, m); } +inline void glMatrixLoadIdentityEXT(GLenum mode) { fp_glMatrixLoadIdentityEXT(mode); } +inline void glMatrixRotatefEXT(GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z) { fp_glMatrixRotatefEXT(mode, angle, x, y, z); } +inline void glMatrixRotatedEXT(GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z) { fp_glMatrixRotatedEXT(mode, angle, x, y, z); } +inline void glMatrixScalefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z) { fp_glMatrixScalefEXT(mode, x, y, z); } +inline void glMatrixScaledEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z) { fp_glMatrixScaledEXT(mode, x, y, z); } +inline void glMatrixTranslatefEXT(GLenum mode, GLfloat x, GLfloat y, GLfloat z) { fp_glMatrixTranslatefEXT(mode, x, y, z); } +inline void glMatrixTranslatedEXT(GLenum mode, GLdouble x, GLdouble y, GLdouble z) { fp_glMatrixTranslatedEXT(mode, x, y, z); } +inline void glMatrixFrustumEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { fp_glMatrixFrustumEXT(mode, left, right, bottom, top, zNear, zFar); } +inline void glMatrixOrthoEXT(GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { fp_glMatrixOrthoEXT(mode, left, right, bottom, top, zNear, zFar); } +inline void glMatrixPopEXT(GLenum mode) { fp_glMatrixPopEXT(mode); } +inline void glMatrixPushEXT(GLenum mode) { fp_glMatrixPushEXT(mode); } +inline void glClientAttribDefaultEXT(GLbitfield mask) { fp_glClientAttribDefaultEXT(mask); } +inline void glPushClientAttribDefaultEXT(GLbitfield mask) { fp_glPushClientAttribDefaultEXT(mask); } +inline void glTextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param) { fp_glTextureParameterfEXT(texture, target, pname, param); } +inline void glTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, const GLfloat* params) { fp_glTextureParameterfvEXT(texture, target, pname, params); } +inline void glTextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param) { fp_glTextureParameteriEXT(texture, target, pname, param); } +inline void glTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, const GLint* params) { fp_glTextureParameterivEXT(texture, target, pname, params); } +inline void glTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTextureImage1DEXT(texture, target, level, internalformat, width, border, format, type, pixels); } +inline void glTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTextureImage2DEXT(texture, target, level, internalformat, width, height, border, format, type, pixels); } +inline void glTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage1DEXT(texture, target, level, xoffset, width, format, type, pixels); } +inline void glTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, type, pixels); } +inline void glCopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { fp_glCopyTextureImage1DEXT(texture, target, level, internalformat, x, y, width, border); } +inline void glCopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { fp_glCopyTextureImage2DEXT(texture, target, level, internalformat, x, y, width, height, border); } +inline void glCopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { fp_glCopyTextureSubImage1DEXT(texture, target, level, xoffset, x, y, width); } +inline void glCopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, x, y, width, height); } +inline void glGetTextureImageEXT(GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels) { fp_glGetTextureImageEXT(texture, target, level, format, type, pixels); } +inline void glGetTextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname, GLfloat* params) { fp_glGetTextureParameterfvEXT(texture, target, pname, params); } +inline void glGetTextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, GLint* params) { fp_glGetTextureParameterivEXT(texture, target, pname, params); } +inline void glGetTextureLevelParameterfvEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params) { fp_glGetTextureLevelParameterfvEXT(texture, target, level, pname, params); } +inline void glGetTextureLevelParameterivEXT(GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params) { fp_glGetTextureLevelParameterivEXT(texture, target, level, pname, params); } +inline void glTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, format, type, pixels); } +inline void glTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } +inline void glCopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, x, y, width, height); } +inline void glBindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture) { fp_glBindMultiTextureEXT(texunit, target, texture); } +inline void glMultiTexCoordPointerEXT(GLenum texunit, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glMultiTexCoordPointerEXT(texunit, size, type, stride, pointer); } +inline void glMultiTexEnvfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) { fp_glMultiTexEnvfEXT(texunit, target, pname, param); } +inline void glMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat* params) { fp_glMultiTexEnvfvEXT(texunit, target, pname, params); } +inline void glMultiTexEnviEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) { fp_glMultiTexEnviEXT(texunit, target, pname, param); } +inline void glMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params) { fp_glMultiTexEnvivEXT(texunit, target, pname, params); } +inline void glMultiTexGendEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble param) { fp_glMultiTexGendEXT(texunit, coord, pname, param); } +inline void glMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params) { fp_glMultiTexGendvEXT(texunit, coord, pname, params); } +inline void glMultiTexGenfEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat param) { fp_glMultiTexGenfEXT(texunit, coord, pname, param); } +inline void glMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params) { fp_glMultiTexGenfvEXT(texunit, coord, pname, params); } +inline void glMultiTexGeniEXT(GLenum texunit, GLenum coord, GLenum pname, GLint param) { fp_glMultiTexGeniEXT(texunit, coord, pname, param); } +inline void glMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, const GLint* params) { fp_glMultiTexGenivEXT(texunit, coord, pname, params); } +inline void glGetMultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat* params) { fp_glGetMultiTexEnvfvEXT(texunit, target, pname, params); } +inline void glGetMultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params) { fp_glGetMultiTexEnvivEXT(texunit, target, pname, params); } +inline void glGetMultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble* params) { fp_glGetMultiTexGendvEXT(texunit, coord, pname, params); } +inline void glGetMultiTexGenfvEXT(GLenum texunit, GLenum coord, GLenum pname, GLfloat* params) { fp_glGetMultiTexGenfvEXT(texunit, coord, pname, params); } +inline void glGetMultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, GLint* params) { fp_glGetMultiTexGenivEXT(texunit, coord, pname, params); } +inline void glMultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param) { fp_glMultiTexParameteriEXT(texunit, target, pname, param); } +inline void glMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params) { fp_glMultiTexParameterivEXT(texunit, target, pname, params); } +inline void glMultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param) { fp_glMultiTexParameterfEXT(texunit, target, pname, param); } +inline void glMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat* params) { fp_glMultiTexParameterfvEXT(texunit, target, pname, params); } +inline void glMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, format, type, pixels); } +inline void glMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, format, type, pixels); } +inline void glMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, type, pixels); } +inline void glMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, type, pixels); } +inline void glCopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { fp_glCopyMultiTexImage1DEXT(texunit, target, level, internalformat, x, y, width, border); } +inline void glCopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { fp_glCopyMultiTexImage2DEXT(texunit, target, level, internalformat, x, y, width, height, border); } +inline void glCopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { fp_glCopyMultiTexSubImage1DEXT(texunit, target, level, xoffset, x, y, width); } +inline void glCopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, x, y, width, height); } +inline void glGetMultiTexImageEXT(GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void* pixels) { fp_glGetMultiTexImageEXT(texunit, target, level, format, type, pixels); } +inline void glGetMultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat* params) { fp_glGetMultiTexParameterfvEXT(texunit, target, pname, params); } +inline void glGetMultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params) { fp_glGetMultiTexParameterivEXT(texunit, target, pname, params); } +inline void glGetMultiTexLevelParameterfvEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params) { fp_glGetMultiTexLevelParameterfvEXT(texunit, target, level, pname, params); } +inline void glGetMultiTexLevelParameterivEXT(GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params) { fp_glGetMultiTexLevelParameterivEXT(texunit, target, level, pname, params); } +inline void glMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, format, type, pixels); } +inline void glMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } +inline void glCopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, x, y, width, height); } +inline void glEnableClientStateIndexedEXT(GLenum array, GLuint index) { fp_glEnableClientStateIndexedEXT(array, index); } +inline void glDisableClientStateIndexedEXT(GLenum array, GLuint index) { fp_glDisableClientStateIndexedEXT(array, index); } +inline void glGetFloatIndexedvEXT(GLenum target, GLuint index, GLfloat* data) { fp_glGetFloatIndexedvEXT(target, index, data); } +inline void glGetDoubleIndexedvEXT(GLenum target, GLuint index, GLdouble* data) { fp_glGetDoubleIndexedvEXT(target, index, data); } +inline void glGetPointerIndexedvEXT(GLenum target, GLuint index, void** data) { fp_glGetPointerIndexedvEXT(target, index, data); } +inline void glEnableIndexedEXT(GLenum target, GLuint index) { fp_glEnableIndexedEXT(target, index); } +inline void glDisableIndexedEXT(GLenum target, GLuint index) { fp_glDisableIndexedEXT(target, index); } +inline GLboolean glIsEnabledIndexedEXT(GLenum target, GLuint index) { return fp_glIsEnabledIndexedEXT(target, index); } +inline void glGetIntegerIndexedvEXT(GLenum target, GLuint index, GLint* data) { fp_glGetIntegerIndexedvEXT(target, index, data); } +inline void glGetBooleanIndexedvEXT(GLenum target, GLuint index, GLboolean* data) { fp_glGetBooleanIndexedvEXT(target, index, data); } +inline void glCompressedTextureImage3DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedTextureImage3DEXT(texture, target, level, internalformat, width, height, depth, border, imageSize, bits); } +inline void glCompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedTextureImage2DEXT(texture, target, level, internalformat, width, height, border, imageSize, bits); } +inline void glCompressedTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedTextureImage1DEXT(texture, target, level, internalformat, width, border, imageSize, bits); } +inline void glCompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedTextureSubImage3DEXT(texture, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits); } +inline void glCompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedTextureSubImage2DEXT(texture, target, level, xoffset, yoffset, width, height, format, imageSize, bits); } +inline void glCompressedTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedTextureSubImage1DEXT(texture, target, level, xoffset, width, format, imageSize, bits); } +inline void glGetCompressedTextureImageEXT(GLuint texture, GLenum target, GLint lod, void* img) { fp_glGetCompressedTextureImageEXT(texture, target, lod, img); } +inline void glCompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexImage3DEXT(texunit, target, level, internalformat, width, height, depth, border, imageSize, bits); } +inline void glCompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexImage2DEXT(texunit, target, level, internalformat, width, height, border, imageSize, bits); } +inline void glCompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexImage1DEXT(texunit, target, level, internalformat, width, border, imageSize, bits); } +inline void glCompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexSubImage3DEXT(texunit, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, bits); } +inline void glCompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexSubImage2DEXT(texunit, target, level, xoffset, yoffset, width, height, format, imageSize, bits); } +inline void glCompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* bits) { fp_glCompressedMultiTexSubImage1DEXT(texunit, target, level, xoffset, width, format, imageSize, bits); } +inline void glGetCompressedMultiTexImageEXT(GLenum texunit, GLenum target, GLint lod, void* img) { fp_glGetCompressedMultiTexImageEXT(texunit, target, lod, img); } +inline void glMatrixLoadTransposefEXT(GLenum mode, const GLfloat* m) { fp_glMatrixLoadTransposefEXT(mode, m); } +inline void glMatrixLoadTransposedEXT(GLenum mode, const GLdouble* m) { fp_glMatrixLoadTransposedEXT(mode, m); } +inline void glMatrixMultTransposefEXT(GLenum mode, const GLfloat* m) { fp_glMatrixMultTransposefEXT(mode, m); } +inline void glMatrixMultTransposedEXT(GLenum mode, const GLdouble* m) { fp_glMatrixMultTransposedEXT(mode, m); } +inline void glNamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const void* data, GLenum usage) { fp_glNamedBufferDataEXT(buffer, size, data, usage); } +inline void glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data) { fp_glNamedBufferSubDataEXT(buffer, offset, size, data); } +inline void* glMapNamedBufferEXT(GLuint buffer, GLenum access) { return fp_glMapNamedBufferEXT(buffer, access); } +inline GLboolean glUnmapNamedBufferEXT(GLuint buffer) { return fp_glUnmapNamedBufferEXT(buffer); } +inline void glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint* params) { fp_glGetNamedBufferParameterivEXT(buffer, pname, params); } +inline void glGetNamedBufferPointervEXT(GLuint buffer, GLenum pname, void** params) { fp_glGetNamedBufferPointervEXT(buffer, pname, params); } +inline void glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, void* data) { fp_glGetNamedBufferSubDataEXT(buffer, offset, size, data); } +inline void glProgramUniform1fEXT(GLuint program, GLint location, GLfloat v0) { fp_glProgramUniform1fEXT(program, location, v0); } +inline void glProgramUniform2fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1) { fp_glProgramUniform2fEXT(program, location, v0, v1); } +inline void glProgramUniform3fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { fp_glProgramUniform3fEXT(program, location, v0, v1, v2); } +inline void glProgramUniform4fEXT(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { fp_glProgramUniform4fEXT(program, location, v0, v1, v2, v3); } +inline void glProgramUniform1iEXT(GLuint program, GLint location, GLint v0) { fp_glProgramUniform1iEXT(program, location, v0); } +inline void glProgramUniform2iEXT(GLuint program, GLint location, GLint v0, GLint v1) { fp_glProgramUniform2iEXT(program, location, v0, v1); } +inline void glProgramUniform3iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) { fp_glProgramUniform3iEXT(program, location, v0, v1, v2); } +inline void glProgramUniform4iEXT(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { fp_glProgramUniform4iEXT(program, location, v0, v1, v2, v3); } +inline void glProgramUniform1fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform1fvEXT(program, location, count, value); } +inline void glProgramUniform2fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform2fvEXT(program, location, count, value); } +inline void glProgramUniform3fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform3fvEXT(program, location, count, value); } +inline void glProgramUniform4fvEXT(GLuint program, GLint location, GLsizei count, const GLfloat* value) { fp_glProgramUniform4fvEXT(program, location, count, value); } +inline void glProgramUniform1ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform1ivEXT(program, location, count, value); } +inline void glProgramUniform2ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform2ivEXT(program, location, count, value); } +inline void glProgramUniform3ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform3ivEXT(program, location, count, value); } +inline void glProgramUniform4ivEXT(GLuint program, GLint location, GLsizei count, const GLint* value) { fp_glProgramUniform4ivEXT(program, location, count, value); } +inline void glProgramUniformMatrix2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2fvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3fvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4fvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2x3fvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3x2fvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix2x4fvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4x2fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4x2fvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3x4fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix3x4fvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4x3fvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glProgramUniformMatrix4x3fvEXT(program, location, count, transpose, value); } +inline void glTextureBufferEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer) { fp_glTextureBufferEXT(texture, target, internalformat, buffer); } +inline void glMultiTexBufferEXT(GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer) { fp_glMultiTexBufferEXT(texunit, target, internalformat, buffer); } +inline void glTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, const GLint* params) { fp_glTextureParameterIivEXT(texture, target, pname, params); } +inline void glTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, const GLuint* params) { fp_glTextureParameterIuivEXT(texture, target, pname, params); } +inline void glGetTextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, GLint* params) { fp_glGetTextureParameterIivEXT(texture, target, pname, params); } +inline void glGetTextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, GLuint* params) { fp_glGetTextureParameterIuivEXT(texture, target, pname, params); } +inline void glMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint* params) { fp_glMultiTexParameterIivEXT(texunit, target, pname, params); } +inline void glMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint* params) { fp_glMultiTexParameterIuivEXT(texunit, target, pname, params); } +inline void glGetMultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, GLint* params) { fp_glGetMultiTexParameterIivEXT(texunit, target, pname, params); } +inline void glGetMultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, GLuint* params) { fp_glGetMultiTexParameterIuivEXT(texunit, target, pname, params); } +inline void glProgramUniform1uiEXT(GLuint program, GLint location, GLuint v0) { fp_glProgramUniform1uiEXT(program, location, v0); } +inline void glProgramUniform2uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1) { fp_glProgramUniform2uiEXT(program, location, v0, v1); } +inline void glProgramUniform3uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) { fp_glProgramUniform3uiEXT(program, location, v0, v1, v2); } +inline void glProgramUniform4uiEXT(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { fp_glProgramUniform4uiEXT(program, location, v0, v1, v2, v3); } +inline void glProgramUniform1uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform1uivEXT(program, location, count, value); } +inline void glProgramUniform2uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform2uivEXT(program, location, count, value); } +inline void glProgramUniform3uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform3uivEXT(program, location, count, value); } +inline void glProgramUniform4uivEXT(GLuint program, GLint location, GLsizei count, const GLuint* value) { fp_glProgramUniform4uivEXT(program, location, count, value); } +inline void glNamedProgramLocalParameters4fvEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params) { fp_glNamedProgramLocalParameters4fvEXT(program, target, index, count, params); } +inline void glNamedProgramLocalParameterI4iEXT(GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glNamedProgramLocalParameterI4iEXT(program, target, index, x, y, z, w); } +inline void glNamedProgramLocalParameterI4ivEXT(GLuint program, GLenum target, GLuint index, const GLint* params) { fp_glNamedProgramLocalParameterI4ivEXT(program, target, index, params); } +inline void glNamedProgramLocalParametersI4ivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params) { fp_glNamedProgramLocalParametersI4ivEXT(program, target, index, count, params); } +inline void glNamedProgramLocalParameterI4uiEXT(GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glNamedProgramLocalParameterI4uiEXT(program, target, index, x, y, z, w); } +inline void glNamedProgramLocalParameterI4uivEXT(GLuint program, GLenum target, GLuint index, const GLuint* params) { fp_glNamedProgramLocalParameterI4uivEXT(program, target, index, params); } +inline void glNamedProgramLocalParametersI4uivEXT(GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params) { fp_glNamedProgramLocalParametersI4uivEXT(program, target, index, count, params); } +inline void glGetNamedProgramLocalParameterIivEXT(GLuint program, GLenum target, GLuint index, GLint* params) { fp_glGetNamedProgramLocalParameterIivEXT(program, target, index, params); } +inline void glGetNamedProgramLocalParameterIuivEXT(GLuint program, GLenum target, GLuint index, GLuint* params) { fp_glGetNamedProgramLocalParameterIuivEXT(program, target, index, params); } +inline void glEnableClientStateiEXT(GLenum array, GLuint index) { fp_glEnableClientStateiEXT(array, index); } +inline void glDisableClientStateiEXT(GLenum array, GLuint index) { fp_glDisableClientStateiEXT(array, index); } +inline void glGetFloati_vEXT(GLenum pname, GLuint index, GLfloat* params) { fp_glGetFloati_vEXT(pname, index, params); } +inline void glGetDoublei_vEXT(GLenum pname, GLuint index, GLdouble* params) { fp_glGetDoublei_vEXT(pname, index, params); } +inline void glGetPointeri_vEXT(GLenum pname, GLuint index, void** params) { fp_glGetPointeri_vEXT(pname, index, params); } +inline void glNamedProgramStringEXT(GLuint program, GLenum target, GLenum format, GLsizei len, const void* string) { fp_glNamedProgramStringEXT(program, target, format, len, string); } +inline void glNamedProgramLocalParameter4dEXT(GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glNamedProgramLocalParameter4dEXT(program, target, index, x, y, z, w); } +inline void glNamedProgramLocalParameter4dvEXT(GLuint program, GLenum target, GLuint index, const GLdouble* params) { fp_glNamedProgramLocalParameter4dvEXT(program, target, index, params); } +inline void glNamedProgramLocalParameter4fEXT(GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glNamedProgramLocalParameter4fEXT(program, target, index, x, y, z, w); } +inline void glNamedProgramLocalParameter4fvEXT(GLuint program, GLenum target, GLuint index, const GLfloat* params) { fp_glNamedProgramLocalParameter4fvEXT(program, target, index, params); } +inline void glGetNamedProgramLocalParameterdvEXT(GLuint program, GLenum target, GLuint index, GLdouble* params) { fp_glGetNamedProgramLocalParameterdvEXT(program, target, index, params); } +inline void glGetNamedProgramLocalParameterfvEXT(GLuint program, GLenum target, GLuint index, GLfloat* params) { fp_glGetNamedProgramLocalParameterfvEXT(program, target, index, params); } +inline void glGetNamedProgramivEXT(GLuint program, GLenum target, GLenum pname, GLint* params) { fp_glGetNamedProgramivEXT(program, target, pname, params); } +inline void glGetNamedProgramStringEXT(GLuint program, GLenum target, GLenum pname, void* string) { fp_glGetNamedProgramStringEXT(program, target, pname, string); } +inline void glNamedRenderbufferStorageEXT(GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorageEXT(renderbuffer, internalformat, width, height); } +inline void glGetNamedRenderbufferParameterivEXT(GLuint renderbuffer, GLenum pname, GLint* params) { fp_glGetNamedRenderbufferParameterivEXT(renderbuffer, pname, params); } +inline void glNamedRenderbufferStorageMultisampleEXT(GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorageMultisampleEXT(renderbuffer, samples, internalformat, width, height); } +inline void glNamedRenderbufferStorageMultisampleCoverageEXT(GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glNamedRenderbufferStorageMultisampleCoverageEXT(renderbuffer, coverageSamples, colorSamples, internalformat, width, height); } +inline GLenum glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target) { return fp_glCheckNamedFramebufferStatusEXT(framebuffer, target); } +inline void glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level); } +inline void glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level); } +inline void glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset); } +inline void glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { fp_glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer); } +inline void glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params) { fp_glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, pname, params); } +inline void glGenerateTextureMipmapEXT(GLuint texture, GLenum target) { fp_glGenerateTextureMipmapEXT(texture, target); } +inline void glGenerateMultiTexMipmapEXT(GLenum texunit, GLenum target) { fp_glGenerateMultiTexMipmapEXT(texunit, target); } +inline void glFramebufferDrawBufferEXT(GLuint framebuffer, GLenum mode) { fp_glFramebufferDrawBufferEXT(framebuffer, mode); } +inline void glFramebufferDrawBuffersEXT(GLuint framebuffer, GLsizei n, const GLenum* bufs) { fp_glFramebufferDrawBuffersEXT(framebuffer, n, bufs); } +inline void glFramebufferReadBufferEXT(GLuint framebuffer, GLenum mode) { fp_glFramebufferReadBufferEXT(framebuffer, mode); } +inline void glGetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint* params) { fp_glGetFramebufferParameterivEXT(framebuffer, pname, params); } +inline void glNamedCopyBufferSubDataEXT(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glNamedCopyBufferSubDataEXT(readBuffer, writeBuffer, readOffset, writeOffset, size); } +inline void glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level) { fp_glNamedFramebufferTextureEXT(framebuffer, attachment, texture, level); } +inline void glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer); } +inline void glNamedFramebufferTextureFaceEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face) { fp_glNamedFramebufferTextureFaceEXT(framebuffer, attachment, texture, level, face); } +inline void glTextureRenderbufferEXT(GLuint texture, GLenum target, GLuint renderbuffer) { fp_glTextureRenderbufferEXT(texture, target, renderbuffer); } +inline void glMultiTexRenderbufferEXT(GLenum texunit, GLenum target, GLuint renderbuffer) { fp_glMultiTexRenderbufferEXT(texunit, target, renderbuffer); } +inline void glVertexArrayVertexOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayVertexOffsetEXT(vaobj, buffer, size, type, stride, offset); } +inline void glVertexArrayColorOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayColorOffsetEXT(vaobj, buffer, size, type, stride, offset); } +inline void glVertexArrayEdgeFlagOffsetEXT(GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset) { fp_glVertexArrayEdgeFlagOffsetEXT(vaobj, buffer, stride, offset); } +inline void glVertexArrayIndexOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayIndexOffsetEXT(vaobj, buffer, type, stride, offset); } +inline void glVertexArrayNormalOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayNormalOffsetEXT(vaobj, buffer, type, stride, offset); } +inline void glVertexArrayTexCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayTexCoordOffsetEXT(vaobj, buffer, size, type, stride, offset); } +inline void glVertexArrayMultiTexCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayMultiTexCoordOffsetEXT(vaobj, buffer, texunit, size, type, stride, offset); } +inline void glVertexArrayFogCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayFogCoordOffsetEXT(vaobj, buffer, type, stride, offset); } +inline void glVertexArraySecondaryColorOffsetEXT(GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArraySecondaryColorOffsetEXT(vaobj, buffer, size, type, stride, offset); } +inline void glVertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset) { fp_glVertexArrayVertexAttribOffsetEXT(vaobj, buffer, index, size, type, normalized, stride, offset); } +inline void glVertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayVertexAttribIOffsetEXT(vaobj, buffer, index, size, type, stride, offset); } +inline void glEnableVertexArrayEXT(GLuint vaobj, GLenum array) { fp_glEnableVertexArrayEXT(vaobj, array); } +inline void glDisableVertexArrayEXT(GLuint vaobj, GLenum array) { fp_glDisableVertexArrayEXT(vaobj, array); } +inline void glEnableVertexArrayAttribEXT(GLuint vaobj, GLuint index) { fp_glEnableVertexArrayAttribEXT(vaobj, index); } +inline void glDisableVertexArrayAttribEXT(GLuint vaobj, GLuint index) { fp_glDisableVertexArrayAttribEXT(vaobj, index); } +inline void glGetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint* param) { fp_glGetVertexArrayIntegervEXT(vaobj, pname, param); } +inline void glGetVertexArrayPointervEXT(GLuint vaobj, GLenum pname, void** param) { fp_glGetVertexArrayPointervEXT(vaobj, pname, param); } +inline void glGetVertexArrayIntegeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLint* param) { fp_glGetVertexArrayIntegeri_vEXT(vaobj, index, pname, param); } +inline void glGetVertexArrayPointeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, void** param) { fp_glGetVertexArrayPointeri_vEXT(vaobj, index, pname, param); } +inline void* glMapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapNamedBufferRangeEXT(buffer, offset, length, access); } +inline void glFlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedNamedBufferRangeEXT(buffer, offset, length); } +inline void glNamedBufferStorageEXT(GLuint buffer, GLsizeiptr size, const void* data, GLbitfield flags) { fp_glNamedBufferStorageEXT(buffer, size, data, flags); } +inline void glClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void* data) { fp_glClearNamedBufferDataEXT(buffer, internalformat, format, type, data); } +inline void glClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, GLenum format, GLenum type, GLsizeiptr offset, GLsizeiptr size, const void* data) { fp_glClearNamedBufferSubDataEXT(buffer, internalformat, format, type, offset, size, data); } +inline void glNamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, GLint param) { fp_glNamedFramebufferParameteriEXT(framebuffer, pname, param); } +inline void glGetNamedFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, GLint* params) { fp_glGetNamedFramebufferParameterivEXT(framebuffer, pname, params); } +inline void glProgramUniform1dEXT(GLuint program, GLint location, GLdouble x) { fp_glProgramUniform1dEXT(program, location, x); } +inline void glProgramUniform2dEXT(GLuint program, GLint location, GLdouble x, GLdouble y) { fp_glProgramUniform2dEXT(program, location, x, y); } +inline void glProgramUniform3dEXT(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z) { fp_glProgramUniform3dEXT(program, location, x, y, z); } +inline void glProgramUniform4dEXT(GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramUniform4dEXT(program, location, x, y, z, w); } +inline void glProgramUniform1dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform1dvEXT(program, location, count, value); } +inline void glProgramUniform2dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform2dvEXT(program, location, count, value); } +inline void glProgramUniform3dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform3dvEXT(program, location, count, value); } +inline void glProgramUniform4dvEXT(GLuint program, GLint location, GLsizei count, const GLdouble* value) { fp_glProgramUniform4dvEXT(program, location, count, value); } +inline void glProgramUniformMatrix2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2dvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3dvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4dvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2x3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2x3dvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix2x4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix2x4dvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3x2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3x2dvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix3x4dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix3x4dvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4x2dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4x2dvEXT(program, location, count, transpose, value); } +inline void glProgramUniformMatrix4x3dvEXT(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value) { fp_glProgramUniformMatrix4x3dvEXT(program, location, count, transpose, value); } +inline void glTextureBufferRangeEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glTextureBufferRangeEXT(texture, target, internalformat, buffer, offset, size); } +inline void glTextureStorage1DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTextureStorage1DEXT(texture, target, levels, internalformat, width); } +inline void glTextureStorage2DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTextureStorage2DEXT(texture, target, levels, internalformat, width, height); } +inline void glTextureStorage3DEXT(GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTextureStorage3DEXT(texture, target, levels, internalformat, width, height, depth); } +inline void glTextureStorage2DMultisampleEXT(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations) { fp_glTextureStorage2DMultisampleEXT(texture, target, samples, internalformat, width, height, fixedsamplelocations); } +inline void glTextureStorage3DMultisampleEXT(GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { fp_glTextureStorage3DMultisampleEXT(texture, target, samples, internalformat, width, height, depth, fixedsamplelocations); } +inline void glVertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride) { fp_glVertexArrayBindVertexBufferEXT(vaobj, bindingindex, buffer, offset, stride); } +inline void glVertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset) { fp_glVertexArrayVertexAttribFormatEXT(vaobj, attribindex, size, type, normalized, relativeoffset); } +inline void glVertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexArrayVertexAttribIFormatEXT(vaobj, attribindex, size, type, relativeoffset); } +inline void glVertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset) { fp_glVertexArrayVertexAttribLFormatEXT(vaobj, attribindex, size, type, relativeoffset); } +inline void glVertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribindex, GLuint bindingindex) { fp_glVertexArrayVertexAttribBindingEXT(vaobj, attribindex, bindingindex); } +inline void glVertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingindex, GLuint divisor) { fp_glVertexArrayVertexBindingDivisorEXT(vaobj, bindingindex, divisor); } +inline void glVertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset) { fp_glVertexArrayVertexAttribLOffsetEXT(vaobj, buffer, index, size, type, stride, offset); } +inline void glTexturePageCommitmentEXT(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean resident) { fp_glTexturePageCommitmentEXT(texture, level, xoffset, yoffset, zoffset, width, height, depth, resident); } +inline void glVertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint index, GLuint divisor) { fp_glVertexArrayVertexAttribDivisorEXT(vaobj, index, divisor); } + +/* GL_EXT_discard_framebuffer */ +inline void glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments) { fp_glDiscardFramebufferEXT(target, numAttachments, attachments); } + +/* GL_EXT_disjoint_timer_query */ +inline void glGenQueriesEXT(GLsizei n, GLuint* ids) { fp_glGenQueriesEXT(n, ids); } +inline void glDeleteQueriesEXT(GLsizei n, const GLuint* ids) { fp_glDeleteQueriesEXT(n, ids); } +inline GLboolean glIsQueryEXT(GLuint id) { return fp_glIsQueryEXT(id); } +inline void glBeginQueryEXT(GLenum target, GLuint id) { fp_glBeginQueryEXT(target, id); } +inline void glEndQueryEXT(GLenum target) { fp_glEndQueryEXT(target); } +inline void glQueryCounterEXT(GLuint id, GLenum target) { fp_glQueryCounterEXT(id, target); } +inline void glGetQueryivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetQueryivEXT(target, pname, params); } +inline void glGetQueryObjectivEXT(GLuint id, GLenum pname, GLint* params) { fp_glGetQueryObjectivEXT(id, pname, params); } +inline void glGetQueryObjectuivEXT(GLuint id, GLenum pname, GLuint* params) { fp_glGetQueryObjectuivEXT(id, pname, params); } +inline void glGetQueryObjecti64vEXT(GLuint id, GLenum pname, GLint64* params) { fp_glGetQueryObjecti64vEXT(id, pname, params); } +inline void glGetQueryObjectui64vEXT(GLuint id, GLenum pname, GLuint64* params) { fp_glGetQueryObjectui64vEXT(id, pname, params); } + +/* GL_EXT_draw_buffers */ +inline void glDrawBuffersEXT(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersEXT(n, bufs); } + +/* GL_EXT_draw_buffers2 */ +inline void glColorMaskIndexedEXT(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a) { fp_glColorMaskIndexedEXT(index, r, g, b, a); } + +/* GL_EXT_draw_instanced */ +inline void glDrawArraysInstancedEXT(GLenum mode, GLint start, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedEXT(mode, start, count, primcount); } +inline void glDrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedEXT(mode, count, type, indices, primcount); } + +/* GL_EXT_fog_coord */ +inline void glFogCoordfEXT(GLfloat coord) { fp_glFogCoordfEXT(coord); } +inline void glFogCoordfvEXT(const GLfloat* coord) { fp_glFogCoordfvEXT(coord); } +inline void glFogCoorddEXT(GLdouble coord) { fp_glFogCoorddEXT(coord); } +inline void glFogCoorddvEXT(const GLdouble* coord) { fp_glFogCoorddvEXT(coord); } +inline void glFogCoordPointerEXT(GLenum type, GLsizei stride, const void* pointer) { fp_glFogCoordPointerEXT(type, stride, pointer); } + +/* GL_EXT_framebuffer_blit */ +inline void glBlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } + +/* GL_EXT_framebuffer_multisample */ +inline void glRenderbufferStorageMultisampleEXT(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleEXT(target, samples, internalformat, width, height); } + +/* GL_EXT_framebuffer_object */ +inline GLboolean glIsRenderbufferEXT(GLuint renderbuffer) { return fp_glIsRenderbufferEXT(renderbuffer); } +inline void glBindRenderbufferEXT(GLenum target, GLuint renderbuffer) { fp_glBindRenderbufferEXT(target, renderbuffer); } +inline void glDeleteRenderbuffersEXT(GLsizei n, const GLuint* renderbuffers) { fp_glDeleteRenderbuffersEXT(n, renderbuffers); } +inline void glGenRenderbuffersEXT(GLsizei n, GLuint* renderbuffers) { fp_glGenRenderbuffersEXT(n, renderbuffers); } +inline void glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageEXT(target, internalformat, width, height); } +inline void glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetRenderbufferParameterivEXT(target, pname, params); } +inline GLboolean glIsFramebufferEXT(GLuint framebuffer) { return fp_glIsFramebufferEXT(framebuffer); } +inline void glBindFramebufferEXT(GLenum target, GLuint framebuffer) { fp_glBindFramebufferEXT(target, framebuffer); } +inline void glDeleteFramebuffersEXT(GLsizei n, const GLuint* framebuffers) { fp_glDeleteFramebuffersEXT(n, framebuffers); } +inline void glGenFramebuffersEXT(GLsizei n, GLuint* framebuffers) { fp_glGenFramebuffersEXT(n, framebuffers); } +inline GLenum glCheckFramebufferStatusEXT(GLenum target) { return fp_glCheckFramebufferStatusEXT(target); } +inline void glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glFramebufferTexture1DEXT(target, attachment, textarget, texture, level); } +inline void glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { fp_glFramebufferTexture2DEXT(target, attachment, textarget, texture, level); } +inline void glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glFramebufferTexture3DEXT(target, attachment, textarget, texture, level, zoffset); } +inline void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) { fp_glFramebufferRenderbufferEXT(target, attachment, renderbuffertarget, renderbuffer); } +inline void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint* params) { fp_glGetFramebufferAttachmentParameterivEXT(target, attachment, pname, params); } +inline void glGenerateMipmapEXT(GLenum target) { fp_glGenerateMipmapEXT(target); } + +/* GL_EXT_geometry_shader4 */ +inline void glProgramParameteriEXT(GLuint program, GLenum pname, GLint value) { fp_glProgramParameteriEXT(program, pname, value); } + +/* GL_EXT_gpu_program_parameters */ +inline void glProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat* params) { fp_glProgramEnvParameters4fvEXT(target, index, count, params); } +inline void glProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count, const GLfloat* params) { fp_glProgramLocalParameters4fvEXT(target, index, count, params); } + +/* GL_EXT_gpu_shader4 */ +inline void glGetUniformuivEXT(GLuint program, GLint location, GLuint* params) { fp_glGetUniformuivEXT(program, location, params); } +inline void glBindFragDataLocationEXT(GLuint program, GLuint color, const GLchar* name) { fp_glBindFragDataLocationEXT(program, color, name); } +inline GLint glGetFragDataLocationEXT(GLuint program, const GLchar* name) { return fp_glGetFragDataLocationEXT(program, name); } +inline void glUniform1uiEXT(GLint location, GLuint v0) { fp_glUniform1uiEXT(location, v0); } +inline void glUniform2uiEXT(GLint location, GLuint v0, GLuint v1) { fp_glUniform2uiEXT(location, v0, v1); } +inline void glUniform3uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2) { fp_glUniform3uiEXT(location, v0, v1, v2); } +inline void glUniform4uiEXT(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { fp_glUniform4uiEXT(location, v0, v1, v2, v3); } +inline void glUniform1uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform1uivEXT(location, count, value); } +inline void glUniform2uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform2uivEXT(location, count, value); } +inline void glUniform3uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform3uivEXT(location, count, value); } +inline void glUniform4uivEXT(GLint location, GLsizei count, const GLuint* value) { fp_glUniform4uivEXT(location, count, value); } + +/* GL_EXT_histogram */ +inline void glGetHistogramEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, void* values) { fp_glGetHistogramEXT(target, reset, format, type, values); } +inline void glGetHistogramParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetHistogramParameterfvEXT(target, pname, params); } +inline void glGetHistogramParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetHistogramParameterivEXT(target, pname, params); } +inline void glGetMinmaxEXT(GLenum target, GLboolean reset, GLenum format, GLenum type, void* values) { fp_glGetMinmaxEXT(target, reset, format, type, values); } +inline void glGetMinmaxParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetMinmaxParameterfvEXT(target, pname, params); } +inline void glGetMinmaxParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetMinmaxParameterivEXT(target, pname, params); } +inline void glHistogramEXT(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink) { fp_glHistogramEXT(target, width, internalformat, sink); } +inline void glMinmaxEXT(GLenum target, GLenum internalformat, GLboolean sink) { fp_glMinmaxEXT(target, internalformat, sink); } +inline void glResetHistogramEXT(GLenum target) { fp_glResetHistogramEXT(target); } +inline void glResetMinmaxEXT(GLenum target) { fp_glResetMinmaxEXT(target); } + +/* GL_EXT_index_func */ +inline void glIndexFuncEXT(GLenum func, GLclampf ref) { fp_glIndexFuncEXT(func, ref); } + +/* GL_EXT_index_material */ +inline void glIndexMaterialEXT(GLenum face, GLenum mode) { fp_glIndexMaterialEXT(face, mode); } + +/* GL_EXT_instanced_arrays */ +inline void glVertexAttribDivisorEXT(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorEXT(index, divisor); } + +/* GL_EXT_light_texture */ +inline void glApplyTextureEXT(GLenum mode) { fp_glApplyTextureEXT(mode); } +inline void glTextureLightEXT(GLenum pname) { fp_glTextureLightEXT(pname); } +inline void glTextureMaterialEXT(GLenum face, GLenum mode) { fp_glTextureMaterialEXT(face, mode); } + +/* GL_EXT_map_buffer_range */ +inline void* glMapBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) { return fp_glMapBufferRangeEXT(target, offset, length, access); } +inline void glFlushMappedBufferRangeEXT(GLenum target, GLintptr offset, GLsizeiptr length) { fp_glFlushMappedBufferRangeEXT(target, offset, length); } + +/* GL_EXT_multi_draw_arrays */ +inline void glMultiDrawArraysEXT(GLenum mode, const GLint* first, const GLsizei* count, GLsizei primcount) { fp_glMultiDrawArraysEXT(mode, first, count, primcount); } +inline void glMultiDrawElementsEXT(GLenum mode, const GLsizei* count, GLenum type, const void** indices, GLsizei primcount) { fp_glMultiDrawElementsEXT(mode, count, type, indices, primcount); } + +/* GL_EXT_multisample */ +inline void glSampleMaskEXT(GLclampf value, GLboolean invert) { fp_glSampleMaskEXT(value, invert); } +inline void glSamplePatternEXT(GLenum pattern) { fp_glSamplePatternEXT(pattern); } + +/* GL_EXT_multisampled_render_to_texture */ +inline void glFramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { fp_glFramebufferTexture2DMultisampleEXT(target, attachment, textarget, texture, level, samples); } + +/* GL_EXT_multiview_draw_buffers */ +inline void glReadBufferIndexedEXT(GLenum src, GLint index) { fp_glReadBufferIndexedEXT(src, index); } +inline void glDrawBuffersIndexedEXT(GLint n, const GLenum* location, const GLint* indices) { fp_glDrawBuffersIndexedEXT(n, location, indices); } +inline void glGetIntegeri_vEXT(GLenum target, GLuint index, GLint* data) { fp_glGetIntegeri_vEXT(target, index, data); } + +/* GL_EXT_paletted_texture */ +inline void glColorTableEXT(GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void* table) { fp_glColorTableEXT(target, internalFormat, width, format, type, table); } +inline void glGetColorTableEXT(GLenum target, GLenum format, GLenum type, void* data) { fp_glGetColorTableEXT(target, format, type, data); } +inline void glGetColorTableParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetColorTableParameterivEXT(target, pname, params); } +inline void glGetColorTableParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetColorTableParameterfvEXT(target, pname, params); } + +/* GL_EXT_pixel_transform */ +inline void glPixelTransformParameteriEXT(GLenum target, GLenum pname, GLint param) { fp_glPixelTransformParameteriEXT(target, pname, param); } +inline void glPixelTransformParameterfEXT(GLenum target, GLenum pname, GLfloat param) { fp_glPixelTransformParameterfEXT(target, pname, param); } +inline void glPixelTransformParameterivEXT(GLenum target, GLenum pname, const GLint* params) { fp_glPixelTransformParameterivEXT(target, pname, params); } +inline void glPixelTransformParameterfvEXT(GLenum target, GLenum pname, const GLfloat* params) { fp_glPixelTransformParameterfvEXT(target, pname, params); } +inline void glGetPixelTransformParameterivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetPixelTransformParameterivEXT(target, pname, params); } +inline void glGetPixelTransformParameterfvEXT(GLenum target, GLenum pname, GLfloat* params) { fp_glGetPixelTransformParameterfvEXT(target, pname, params); } + +/* GL_EXT_point_parameters */ +inline void glPointParameterfEXT(GLenum pname, GLfloat param) { fp_glPointParameterfEXT(pname, param); } +inline void glPointParameterfvEXT(GLenum pname, const GLfloat* params) { fp_glPointParameterfvEXT(pname, params); } + +/* GL_EXT_provoking_vertex */ +inline void glProvokingVertexEXT(GLenum mode) { fp_glProvokingVertexEXT(mode); } + +/* GL_EXT_robustness */ +inline GLenum glGetGraphicsResetStatusEXT() { return fp_glGetGraphicsResetStatusEXT(); } +inline void glReadnPixelsEXT(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data) { fp_glReadnPixelsEXT(x, y, width, height, format, type, bufSize, data); } +inline void glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params) { fp_glGetnUniformfvEXT(program, location, bufSize, params); } +inline void glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params) { fp_glGetnUniformivEXT(program, location, bufSize, params); } + +/* GL_EXT_secondary_color */ +inline void glSecondaryColor3bEXT(GLbyte red, GLbyte green, GLbyte blue) { fp_glSecondaryColor3bEXT(red, green, blue); } +inline void glSecondaryColor3bvEXT(const GLbyte* v) { fp_glSecondaryColor3bvEXT(v); } +inline void glSecondaryColor3dEXT(GLdouble red, GLdouble green, GLdouble blue) { fp_glSecondaryColor3dEXT(red, green, blue); } +inline void glSecondaryColor3dvEXT(const GLdouble* v) { fp_glSecondaryColor3dvEXT(v); } +inline void glSecondaryColor3fEXT(GLfloat red, GLfloat green, GLfloat blue) { fp_glSecondaryColor3fEXT(red, green, blue); } +inline void glSecondaryColor3fvEXT(const GLfloat* v) { fp_glSecondaryColor3fvEXT(v); } +inline void glSecondaryColor3iEXT(GLint red, GLint green, GLint blue) { fp_glSecondaryColor3iEXT(red, green, blue); } +inline void glSecondaryColor3ivEXT(const GLint* v) { fp_glSecondaryColor3ivEXT(v); } +inline void glSecondaryColor3sEXT(GLshort red, GLshort green, GLshort blue) { fp_glSecondaryColor3sEXT(red, green, blue); } +inline void glSecondaryColor3svEXT(const GLshort* v) { fp_glSecondaryColor3svEXT(v); } +inline void glSecondaryColor3ubEXT(GLubyte red, GLubyte green, GLubyte blue) { fp_glSecondaryColor3ubEXT(red, green, blue); } +inline void glSecondaryColor3ubvEXT(const GLubyte* v) { fp_glSecondaryColor3ubvEXT(v); } +inline void glSecondaryColor3uiEXT(GLuint red, GLuint green, GLuint blue) { fp_glSecondaryColor3uiEXT(red, green, blue); } +inline void glSecondaryColor3uivEXT(const GLuint* v) { fp_glSecondaryColor3uivEXT(v); } +inline void glSecondaryColor3usEXT(GLushort red, GLushort green, GLushort blue) { fp_glSecondaryColor3usEXT(red, green, blue); } +inline void glSecondaryColor3usvEXT(const GLushort* v) { fp_glSecondaryColor3usvEXT(v); } +inline void glSecondaryColorPointerEXT(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glSecondaryColorPointerEXT(size, type, stride, pointer); } + +/* GL_EXT_separate_shader_objects */ +inline void glUseShaderProgramEXT(GLenum type, GLuint program) { fp_glUseShaderProgramEXT(type, program); } +inline void glActiveProgramEXT(GLuint program) { fp_glActiveProgramEXT(program); } +inline GLuint glCreateShaderProgramEXT(GLenum type, const GLchar* string) { return fp_glCreateShaderProgramEXT(type, string); } +inline void glActiveShaderProgramEXT(GLuint pipeline, GLuint program) { fp_glActiveShaderProgramEXT(pipeline, program); } +inline void glBindProgramPipelineEXT(GLuint pipeline) { fp_glBindProgramPipelineEXT(pipeline); } +inline GLuint glCreateShaderProgramvEXT(GLenum type, GLsizei count, const GLchar** strings) { return fp_glCreateShaderProgramvEXT(type, count, strings); } +inline void glDeleteProgramPipelinesEXT(GLsizei n, const GLuint* pipelines) { fp_glDeleteProgramPipelinesEXT(n, pipelines); } +inline void glGenProgramPipelinesEXT(GLsizei n, GLuint* pipelines) { fp_glGenProgramPipelinesEXT(n, pipelines); } +inline void glGetProgramPipelineInfoLogEXT(GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { fp_glGetProgramPipelineInfoLogEXT(pipeline, bufSize, length, infoLog); } +inline void glGetProgramPipelineivEXT(GLuint pipeline, GLenum pname, GLint* params) { fp_glGetProgramPipelineivEXT(pipeline, pname, params); } +inline GLboolean glIsProgramPipelineEXT(GLuint pipeline) { return fp_glIsProgramPipelineEXT(pipeline); } +inline void glUseProgramStagesEXT(GLuint pipeline, GLbitfield stages, GLuint program) { fp_glUseProgramStagesEXT(pipeline, stages, program); } +inline void glValidateProgramPipelineEXT(GLuint pipeline) { fp_glValidateProgramPipelineEXT(pipeline); } + +/* GL_EXT_shader_image_load_store */ +inline void glBindImageTextureEXT(GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format) { fp_glBindImageTextureEXT(index, texture, level, layered, layer, access, format); } +inline void glMemoryBarrierEXT(GLbitfield barriers) { fp_glMemoryBarrierEXT(barriers); } + +/* GL_EXT_stencil_clear_tag */ +inline void glStencilClearTagEXT(GLsizei stencilTagBits, GLuint stencilClearTag) { fp_glStencilClearTagEXT(stencilTagBits, stencilClearTag); } + +/* GL_EXT_stencil_two_side */ +inline void glActiveStencilFaceEXT(GLenum face) { fp_glActiveStencilFaceEXT(face); } + +/* GL_EXT_texture_buffer_object */ +inline void glTexBufferEXT(GLenum target, GLenum internalformat, GLuint buffer) { fp_glTexBufferEXT(target, internalformat, buffer); } + +/* GL_EXT_texture_integer */ +inline void glTexParameterIivEXT(GLenum target, GLenum pname, const GLint* params) { fp_glTexParameterIivEXT(target, pname, params); } +inline void glTexParameterIuivEXT(GLenum target, GLenum pname, const GLuint* params) { fp_glTexParameterIuivEXT(target, pname, params); } +inline void glGetTexParameterIivEXT(GLenum target, GLenum pname, GLint* params) { fp_glGetTexParameterIivEXT(target, pname, params); } +inline void glGetTexParameterIuivEXT(GLenum target, GLenum pname, GLuint* params) { fp_glGetTexParameterIuivEXT(target, pname, params); } +inline void glClearColorIiEXT(GLint red, GLint green, GLint blue, GLint alpha) { fp_glClearColorIiEXT(red, green, blue, alpha); } +inline void glClearColorIuiEXT(GLuint red, GLuint green, GLuint blue, GLuint alpha) { fp_glClearColorIuiEXT(red, green, blue, alpha); } + +/* GL_EXT_texture_perturb_normal */ +inline void glTextureNormalEXT(GLenum mode) { fp_glTextureNormalEXT(mode); } + +/* GL_EXT_texture_storage */ +inline void glTexStorage1DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width) { fp_glTexStorage1DEXT(target, levels, internalformat, width); } +inline void glTexStorage2DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height) { fp_glTexStorage2DEXT(target, levels, internalformat, width, height); } +inline void glTexStorage3DEXT(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { fp_glTexStorage3DEXT(target, levels, internalformat, width, height, depth); } + +/* GL_EXT_transform_feedback */ +inline void glBeginTransformFeedbackEXT(GLenum primitiveMode) { fp_glBeginTransformFeedbackEXT(primitiveMode); } +inline void glEndTransformFeedbackEXT() { fp_glEndTransformFeedbackEXT(); } +inline void glBindBufferRangeEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glBindBufferRangeEXT(target, index, buffer, offset, size); } +inline void glBindBufferOffsetEXT(GLenum target, GLuint index, GLuint buffer, GLintptr offset) { fp_glBindBufferOffsetEXT(target, index, buffer, offset); } +inline void glBindBufferBaseEXT(GLenum target, GLuint index, GLuint buffer) { fp_glBindBufferBaseEXT(target, index, buffer); } +inline void glTransformFeedbackVaryingsEXT(GLuint program, GLsizei count, const GLchar** varyings, GLenum bufferMode) { fp_glTransformFeedbackVaryingsEXT(program, count, varyings, bufferMode); } +inline void glGetTransformFeedbackVaryingEXT(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) { fp_glGetTransformFeedbackVaryingEXT(program, index, bufSize, length, size, type, name); } + +/* GL_EXT_vertex_attrib_64bit */ +inline void glVertexAttribL1dEXT(GLuint index, GLdouble x) { fp_glVertexAttribL1dEXT(index, x); } +inline void glVertexAttribL2dEXT(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttribL2dEXT(index, x, y); } +inline void glVertexAttribL3dEXT(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttribL3dEXT(index, x, y, z); } +inline void glVertexAttribL4dEXT(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttribL4dEXT(index, x, y, z, w); } +inline void glVertexAttribL1dvEXT(GLuint index, const GLdouble* v) { fp_glVertexAttribL1dvEXT(index, v); } +inline void glVertexAttribL2dvEXT(GLuint index, const GLdouble* v) { fp_glVertexAttribL2dvEXT(index, v); } +inline void glVertexAttribL3dvEXT(GLuint index, const GLdouble* v) { fp_glVertexAttribL3dvEXT(index, v); } +inline void glVertexAttribL4dvEXT(GLuint index, const GLdouble* v) { fp_glVertexAttribL4dvEXT(index, v); } +inline void glVertexAttribLPointerEXT(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribLPointerEXT(index, size, type, stride, pointer); } +inline void glGetVertexAttribLdvEXT(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribLdvEXT(index, pname, params); } + +/* GL_EXT_vertex_shader */ +inline void glBeginVertexShaderEXT() { fp_glBeginVertexShaderEXT(); } +inline void glEndVertexShaderEXT() { fp_glEndVertexShaderEXT(); } +inline void glBindVertexShaderEXT(GLuint id) { fp_glBindVertexShaderEXT(id); } +inline GLuint glGenVertexShadersEXT(GLuint range) { return fp_glGenVertexShadersEXT(range); } +inline void glDeleteVertexShaderEXT(GLuint id) { fp_glDeleteVertexShaderEXT(id); } +inline void glShaderOp1EXT(GLenum op, GLuint res, GLuint arg1) { fp_glShaderOp1EXT(op, res, arg1); } +inline void glShaderOp2EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2) { fp_glShaderOp2EXT(op, res, arg1, arg2); } +inline void glShaderOp3EXT(GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3) { fp_glShaderOp3EXT(op, res, arg1, arg2, arg3); } +inline void glSwizzleEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { fp_glSwizzleEXT(res, in, outX, outY, outZ, outW); } +inline void glWriteMaskEXT(GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW) { fp_glWriteMaskEXT(res, in, outX, outY, outZ, outW); } +inline void glInsertComponentEXT(GLuint res, GLuint src, GLuint num) { fp_glInsertComponentEXT(res, src, num); } +inline void glExtractComponentEXT(GLuint res, GLuint src, GLuint num) { fp_glExtractComponentEXT(res, src, num); } +inline GLuint glGenSymbolsEXT(GLenum datatype, GLenum storagetype, GLenum range, GLuint components) { return fp_glGenSymbolsEXT(datatype, storagetype, range, components); } +inline void glSetInvariantEXT(GLuint id, GLenum type, const void* addr) { fp_glSetInvariantEXT(id, type, addr); } +inline void glSetLocalConstantEXT(GLuint id, GLenum type, const void* addr) { fp_glSetLocalConstantEXT(id, type, addr); } +inline void glVariantbvEXT(GLuint id, const GLbyte* addr) { fp_glVariantbvEXT(id, addr); } +inline void glVariantsvEXT(GLuint id, const GLshort* addr) { fp_glVariantsvEXT(id, addr); } +inline void glVariantivEXT(GLuint id, const GLint* addr) { fp_glVariantivEXT(id, addr); } +inline void glVariantfvEXT(GLuint id, const GLfloat* addr) { fp_glVariantfvEXT(id, addr); } +inline void glVariantdvEXT(GLuint id, const GLdouble* addr) { fp_glVariantdvEXT(id, addr); } +inline void glVariantubvEXT(GLuint id, const GLubyte* addr) { fp_glVariantubvEXT(id, addr); } +inline void glVariantusvEXT(GLuint id, const GLushort* addr) { fp_glVariantusvEXT(id, addr); } +inline void glVariantuivEXT(GLuint id, const GLuint* addr) { fp_glVariantuivEXT(id, addr); } +inline void glVariantPointerEXT(GLuint id, GLenum type, GLuint stride, const void* addr) { fp_glVariantPointerEXT(id, type, stride, addr); } +inline void glEnableVariantClientStateEXT(GLuint id) { fp_glEnableVariantClientStateEXT(id); } +inline void glDisableVariantClientStateEXT(GLuint id) { fp_glDisableVariantClientStateEXT(id); } +inline GLuint glBindLightParameterEXT(GLenum light, GLenum value) { return fp_glBindLightParameterEXT(light, value); } +inline GLuint glBindMaterialParameterEXT(GLenum face, GLenum value) { return fp_glBindMaterialParameterEXT(face, value); } +inline GLuint glBindTexGenParameterEXT(GLenum unit, GLenum coord, GLenum value) { return fp_glBindTexGenParameterEXT(unit, coord, value); } +inline GLuint glBindTextureUnitParameterEXT(GLenum unit, GLenum value) { return fp_glBindTextureUnitParameterEXT(unit, value); } +inline GLuint glBindParameterEXT(GLenum value) { return fp_glBindParameterEXT(value); } +inline GLboolean glIsVariantEnabledEXT(GLuint id, GLenum cap) { return fp_glIsVariantEnabledEXT(id, cap); } +inline void glGetVariantBooleanvEXT(GLuint id, GLenum value, GLboolean* data) { fp_glGetVariantBooleanvEXT(id, value, data); } +inline void glGetVariantIntegervEXT(GLuint id, GLenum value, GLint* data) { fp_glGetVariantIntegervEXT(id, value, data); } +inline void glGetVariantFloatvEXT(GLuint id, GLenum value, GLfloat* data) { fp_glGetVariantFloatvEXT(id, value, data); } +inline void glGetVariantPointervEXT(GLuint id, GLenum value, void** data) { fp_glGetVariantPointervEXT(id, value, data); } +inline void glGetInvariantBooleanvEXT(GLuint id, GLenum value, GLboolean* data) { fp_glGetInvariantBooleanvEXT(id, value, data); } +inline void glGetInvariantIntegervEXT(GLuint id, GLenum value, GLint* data) { fp_glGetInvariantIntegervEXT(id, value, data); } +inline void glGetInvariantFloatvEXT(GLuint id, GLenum value, GLfloat* data) { fp_glGetInvariantFloatvEXT(id, value, data); } +inline void glGetLocalConstantBooleanvEXT(GLuint id, GLenum value, GLboolean* data) { fp_glGetLocalConstantBooleanvEXT(id, value, data); } +inline void glGetLocalConstantIntegervEXT(GLuint id, GLenum value, GLint* data) { fp_glGetLocalConstantIntegervEXT(id, value, data); } +inline void glGetLocalConstantFloatvEXT(GLuint id, GLenum value, GLfloat* data) { fp_glGetLocalConstantFloatvEXT(id, value, data); } + +/* GL_EXT_vertex_weighting */ +inline void glVertexWeightfEXT(GLfloat weight) { fp_glVertexWeightfEXT(weight); } +inline void glVertexWeightfvEXT(const GLfloat* weight) { fp_glVertexWeightfvEXT(weight); } +inline void glVertexWeightPointerEXT(GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexWeightPointerEXT(size, type, stride, pointer); } + +/* GL_EXT_x11_sync_object */ +inline GLsync glImportSyncEXT(GLenum external_sync_type, GLintptr external_sync, GLbitfield flags) { return fp_glImportSyncEXT(external_sync_type, external_sync, flags); } + +/* GL_OES_byte_coordinates */ +inline void glMultiTexCoord1bOES(GLenum texture, GLbyte s) { fp_glMultiTexCoord1bOES(texture, s); } +inline void glMultiTexCoord1bvOES(GLenum texture, const GLbyte* coords) { fp_glMultiTexCoord1bvOES(texture, coords); } +inline void glMultiTexCoord2bOES(GLenum texture, GLbyte s, GLbyte t) { fp_glMultiTexCoord2bOES(texture, s, t); } +inline void glMultiTexCoord2bvOES(GLenum texture, const GLbyte* coords) { fp_glMultiTexCoord2bvOES(texture, coords); } +inline void glMultiTexCoord3bOES(GLenum texture, GLbyte s, GLbyte t, GLbyte r) { fp_glMultiTexCoord3bOES(texture, s, t, r); } +inline void glMultiTexCoord3bvOES(GLenum texture, const GLbyte* coords) { fp_glMultiTexCoord3bvOES(texture, coords); } +inline void glMultiTexCoord4bOES(GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q) { fp_glMultiTexCoord4bOES(texture, s, t, r, q); } +inline void glMultiTexCoord4bvOES(GLenum texture, const GLbyte* coords) { fp_glMultiTexCoord4bvOES(texture, coords); } +inline void glTexCoord1bOES(GLbyte s) { fp_glTexCoord1bOES(s); } +inline void glTexCoord1bvOES(const GLbyte* coords) { fp_glTexCoord1bvOES(coords); } +inline void glTexCoord2bOES(GLbyte s, GLbyte t) { fp_glTexCoord2bOES(s, t); } +inline void glTexCoord2bvOES(const GLbyte* coords) { fp_glTexCoord2bvOES(coords); } +inline void glTexCoord3bOES(GLbyte s, GLbyte t, GLbyte r) { fp_glTexCoord3bOES(s, t, r); } +inline void glTexCoord3bvOES(const GLbyte* coords) { fp_glTexCoord3bvOES(coords); } +inline void glTexCoord4bOES(GLbyte s, GLbyte t, GLbyte r, GLbyte q) { fp_glTexCoord4bOES(s, t, r, q); } +inline void glTexCoord4bvOES(const GLbyte* coords) { fp_glTexCoord4bvOES(coords); } +inline void glVertex2bOES(GLbyte x) { fp_glVertex2bOES(x); } +inline void glVertex2bvOES(const GLbyte* coords) { fp_glVertex2bvOES(coords); } +inline void glVertex3bOES(GLbyte x, GLbyte y) { fp_glVertex3bOES(x, y); } +inline void glVertex3bvOES(const GLbyte* coords) { fp_glVertex3bvOES(coords); } +inline void glVertex4bOES(GLbyte x, GLbyte y, GLbyte z) { fp_glVertex4bOES(x, y, z); } +inline void glVertex4bvOES(const GLbyte* coords) { fp_glVertex4bvOES(coords); } + +/* GL_OES_EGL_image */ +inline void glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) { fp_glEGLImageTargetTexture2DOES(target, image); } +inline void glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image) { fp_glEGLImageTargetRenderbufferStorageOES(target, image); } + +/* GL_OES_fixed_point */ +inline void glAlphaFuncxOES(GLenum func, GLfixed ref) { fp_glAlphaFuncxOES(func, ref); } +inline void glClearColorxOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { fp_glClearColorxOES(red, green, blue, alpha); } +inline void glClearDepthxOES(GLfixed depth) { fp_glClearDepthxOES(depth); } +inline void glClipPlanexOES(GLenum plane, const GLfixed* equation) { fp_glClipPlanexOES(plane, equation); } +inline void glColor4xOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { fp_glColor4xOES(red, green, blue, alpha); } +inline void glDepthRangexOES(GLfixed n, GLfixed f) { fp_glDepthRangexOES(n, f); } +inline void glFogxOES(GLenum pname, GLfixed param) { fp_glFogxOES(pname, param); } +inline void glFogxvOES(GLenum pname, const GLfixed* param) { fp_glFogxvOES(pname, param); } +inline void glFrustumxOES(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f) { fp_glFrustumxOES(l, r, b, t, n, f); } +inline void glGetClipPlanexOES(GLenum plane, GLfixed* equation) { fp_glGetClipPlanexOES(plane, equation); } +inline void glGetFixedvOES(GLenum pname, GLfixed* params) { fp_glGetFixedvOES(pname, params); } +inline void glGetTexEnvxvOES(GLenum target, GLenum pname, GLfixed* params) { fp_glGetTexEnvxvOES(target, pname, params); } +inline void glGetTexParameterxvOES(GLenum target, GLenum pname, GLfixed* params) { fp_glGetTexParameterxvOES(target, pname, params); } +inline void glLightModelxOES(GLenum pname, GLfixed param) { fp_glLightModelxOES(pname, param); } +inline void glLightModelxvOES(GLenum pname, const GLfixed* param) { fp_glLightModelxvOES(pname, param); } +inline void glLightxOES(GLenum light, GLenum pname, GLfixed param) { fp_glLightxOES(light, pname, param); } +inline void glLightxvOES(GLenum light, GLenum pname, const GLfixed* params) { fp_glLightxvOES(light, pname, params); } +inline void glLineWidthxOES(GLfixed width) { fp_glLineWidthxOES(width); } +inline void glLoadMatrixxOES(const GLfixed* m) { fp_glLoadMatrixxOES(m); } +inline void glMaterialxOES(GLenum face, GLenum pname, GLfixed param) { fp_glMaterialxOES(face, pname, param); } +inline void glMaterialxvOES(GLenum face, GLenum pname, const GLfixed* param) { fp_glMaterialxvOES(face, pname, param); } +inline void glMultMatrixxOES(const GLfixed* m) { fp_glMultMatrixxOES(m); } +inline void glMultiTexCoord4xOES(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q) { fp_glMultiTexCoord4xOES(texture, s, t, r, q); } +inline void glNormal3xOES(GLfixed nx, GLfixed ny, GLfixed nz) { fp_glNormal3xOES(nx, ny, nz); } +inline void glOrthoxOES(GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f) { fp_glOrthoxOES(l, r, b, t, n, f); } +inline void glPointParameterxvOES(GLenum pname, const GLfixed* params) { fp_glPointParameterxvOES(pname, params); } +inline void glPointSizexOES(GLfixed size) { fp_glPointSizexOES(size); } +inline void glPolygonOffsetxOES(GLfixed factor, GLfixed units) { fp_glPolygonOffsetxOES(factor, units); } +inline void glRotatexOES(GLfixed angle, GLfixed x, GLfixed y, GLfixed z) { fp_glRotatexOES(angle, x, y, z); } +inline void glSampleCoverageOES(GLfixed value, GLboolean invert) { fp_glSampleCoverageOES(value, invert); } +inline void glScalexOES(GLfixed x, GLfixed y, GLfixed z) { fp_glScalexOES(x, y, z); } +inline void glTexEnvxOES(GLenum target, GLenum pname, GLfixed param) { fp_glTexEnvxOES(target, pname, param); } +inline void glTexEnvxvOES(GLenum target, GLenum pname, const GLfixed* params) { fp_glTexEnvxvOES(target, pname, params); } +inline void glTexParameterxOES(GLenum target, GLenum pname, GLfixed param) { fp_glTexParameterxOES(target, pname, param); } +inline void glTexParameterxvOES(GLenum target, GLenum pname, const GLfixed* params) { fp_glTexParameterxvOES(target, pname, params); } +inline void glTranslatexOES(GLfixed x, GLfixed y, GLfixed z) { fp_glTranslatexOES(x, y, z); } +inline void glGetLightxvOES(GLenum light, GLenum pname, GLfixed* params) { fp_glGetLightxvOES(light, pname, params); } +inline void glGetMaterialxvOES(GLenum face, GLenum pname, GLfixed* params) { fp_glGetMaterialxvOES(face, pname, params); } +inline void glPointParameterxOES(GLenum pname, GLfixed param) { fp_glPointParameterxOES(pname, param); } +inline void glSampleCoveragexOES(GLclampx value, GLboolean invert) { fp_glSampleCoveragexOES(value, invert); } +inline void glAccumxOES(GLenum op, GLfixed value) { fp_glAccumxOES(op, value); } +inline void glBitmapxOES(GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte* bitmap) { fp_glBitmapxOES(width, height, xorig, yorig, xmove, ymove, bitmap); } +inline void glBlendColorxOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { fp_glBlendColorxOES(red, green, blue, alpha); } +inline void glClearAccumxOES(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) { fp_glClearAccumxOES(red, green, blue, alpha); } +inline void glColor3xOES(GLfixed red, GLfixed green, GLfixed blue) { fp_glColor3xOES(red, green, blue); } +inline void glColor3xvOES(const GLfixed* components) { fp_glColor3xvOES(components); } +inline void glColor4xvOES(const GLfixed* components) { fp_glColor4xvOES(components); } +inline void glConvolutionParameterxOES(GLenum target, GLenum pname, GLfixed param) { fp_glConvolutionParameterxOES(target, pname, param); } +inline void glConvolutionParameterxvOES(GLenum target, GLenum pname, const GLfixed* params) { fp_glConvolutionParameterxvOES(target, pname, params); } +inline void glEvalCoord1xOES(GLfixed u) { fp_glEvalCoord1xOES(u); } +inline void glEvalCoord1xvOES(const GLfixed* coords) { fp_glEvalCoord1xvOES(coords); } +inline void glEvalCoord2xOES(GLfixed u, GLfixed v) { fp_glEvalCoord2xOES(u, v); } +inline void glEvalCoord2xvOES(const GLfixed* coords) { fp_glEvalCoord2xvOES(coords); } +inline void glFeedbackBufferxOES(GLsizei n, GLenum type, const GLfixed* buffer) { fp_glFeedbackBufferxOES(n, type, buffer); } +inline void glGetConvolutionParameterxvOES(GLenum target, GLenum pname, GLfixed* params) { fp_glGetConvolutionParameterxvOES(target, pname, params); } +inline void glGetHistogramParameterxvOES(GLenum target, GLenum pname, GLfixed* params) { fp_glGetHistogramParameterxvOES(target, pname, params); } +inline void glGetLightxOES(GLenum light, GLenum pname, GLfixed* params) { fp_glGetLightxOES(light, pname, params); } +inline void glGetMapxvOES(GLenum target, GLenum query, GLfixed* v) { fp_glGetMapxvOES(target, query, v); } +inline void glGetMaterialxOES(GLenum face, GLenum pname, GLfixed param) { fp_glGetMaterialxOES(face, pname, param); } +inline void glGetPixelMapxv(GLenum map, GLint size, GLfixed* values) { fp_glGetPixelMapxv(map, size, values); } +inline void glGetTexGenxvOES(GLenum coord, GLenum pname, GLfixed* params) { fp_glGetTexGenxvOES(coord, pname, params); } +inline void glGetTexLevelParameterxvOES(GLenum target, GLint level, GLenum pname, GLfixed* params) { fp_glGetTexLevelParameterxvOES(target, level, pname, params); } +inline void glIndexxOES(GLfixed component) { fp_glIndexxOES(component); } +inline void glIndexxvOES(const GLfixed* component) { fp_glIndexxvOES(component); } +inline void glLoadTransposeMatrixxOES(const GLfixed* m) { fp_glLoadTransposeMatrixxOES(m); } +inline void glMap1xOES(GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points) { fp_glMap1xOES(target, u1, u2, stride, order, points); } +inline void glMap2xOES(GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points) { fp_glMap2xOES(target, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); } +inline void glMapGrid1xOES(GLint n, GLfixed u1, GLfixed u2) { fp_glMapGrid1xOES(n, u1, u2); } +inline void glMapGrid2xOES(GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2) { fp_glMapGrid2xOES(n, u1, u2, v1, v2); } +inline void glMultTransposeMatrixxOES(const GLfixed* m) { fp_glMultTransposeMatrixxOES(m); } +inline void glMultiTexCoord1xOES(GLenum texture, GLfixed s) { fp_glMultiTexCoord1xOES(texture, s); } +inline void glMultiTexCoord1xvOES(GLenum texture, const GLfixed* coords) { fp_glMultiTexCoord1xvOES(texture, coords); } +inline void glMultiTexCoord2xOES(GLenum texture, GLfixed s, GLfixed t) { fp_glMultiTexCoord2xOES(texture, s, t); } +inline void glMultiTexCoord2xvOES(GLenum texture, const GLfixed* coords) { fp_glMultiTexCoord2xvOES(texture, coords); } +inline void glMultiTexCoord3xOES(GLenum texture, GLfixed s, GLfixed t, GLfixed r) { fp_glMultiTexCoord3xOES(texture, s, t, r); } +inline void glMultiTexCoord3xvOES(GLenum texture, const GLfixed* coords) { fp_glMultiTexCoord3xvOES(texture, coords); } +inline void glMultiTexCoord4xvOES(GLenum texture, const GLfixed* coords) { fp_glMultiTexCoord4xvOES(texture, coords); } +inline void glNormal3xvOES(const GLfixed* coords) { fp_glNormal3xvOES(coords); } +inline void glPassThroughxOES(GLfixed token) { fp_glPassThroughxOES(token); } +inline void glPixelMapx(GLenum map, GLint size, const GLfixed* values) { fp_glPixelMapx(map, size, values); } +inline void glPixelStorex(GLenum pname, GLfixed param) { fp_glPixelStorex(pname, param); } +inline void glPixelTransferxOES(GLenum pname, GLfixed param) { fp_glPixelTransferxOES(pname, param); } +inline void glPixelZoomxOES(GLfixed xfactor, GLfixed yfactor) { fp_glPixelZoomxOES(xfactor, yfactor); } +inline void glPrioritizeTexturesxOES(GLsizei n, const GLuint* textures, const GLfixed* priorities) { fp_glPrioritizeTexturesxOES(n, textures, priorities); } +inline void glRasterPos2xOES(GLfixed x, GLfixed y) { fp_glRasterPos2xOES(x, y); } +inline void glRasterPos2xvOES(const GLfixed* coords) { fp_glRasterPos2xvOES(coords); } +inline void glRasterPos3xOES(GLfixed x, GLfixed y, GLfixed z) { fp_glRasterPos3xOES(x, y, z); } +inline void glRasterPos3xvOES(const GLfixed* coords) { fp_glRasterPos3xvOES(coords); } +inline void glRasterPos4xOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w) { fp_glRasterPos4xOES(x, y, z, w); } +inline void glRasterPos4xvOES(const GLfixed* coords) { fp_glRasterPos4xvOES(coords); } +inline void glRectxOES(GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2) { fp_glRectxOES(x1, y1, x2, y2); } +inline void glRectxvOES(const GLfixed* v1, const GLfixed* v2) { fp_glRectxvOES(v1, v2); } +inline void glTexCoord1xOES(GLfixed s) { fp_glTexCoord1xOES(s); } +inline void glTexCoord1xvOES(const GLfixed* coords) { fp_glTexCoord1xvOES(coords); } +inline void glTexCoord2xOES(GLfixed s, GLfixed t) { fp_glTexCoord2xOES(s, t); } +inline void glTexCoord2xvOES(const GLfixed* coords) { fp_glTexCoord2xvOES(coords); } +inline void glTexCoord3xOES(GLfixed s, GLfixed t, GLfixed r) { fp_glTexCoord3xOES(s, t, r); } +inline void glTexCoord3xvOES(const GLfixed* coords) { fp_glTexCoord3xvOES(coords); } +inline void glTexCoord4xOES(GLfixed s, GLfixed t, GLfixed r, GLfixed q) { fp_glTexCoord4xOES(s, t, r, q); } +inline void glTexCoord4xvOES(const GLfixed* coords) { fp_glTexCoord4xvOES(coords); } +inline void glTexGenxOES(GLenum coord, GLenum pname, GLfixed param) { fp_glTexGenxOES(coord, pname, param); } +inline void glTexGenxvOES(GLenum coord, GLenum pname, const GLfixed* params) { fp_glTexGenxvOES(coord, pname, params); } +inline void glVertex2xOES(GLfixed x) { fp_glVertex2xOES(x); } +inline void glVertex2xvOES(const GLfixed* coords) { fp_glVertex2xvOES(coords); } +inline void glVertex3xOES(GLfixed x, GLfixed y) { fp_glVertex3xOES(x, y); } +inline void glVertex3xvOES(const GLfixed* coords) { fp_glVertex3xvOES(coords); } +inline void glVertex4xOES(GLfixed x, GLfixed y, GLfixed z) { fp_glVertex4xOES(x, y, z); } +inline void glVertex4xvOES(const GLfixed* coords) { fp_glVertex4xvOES(coords); } + +/* GL_OES_get_program_binary */ +inline void glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary) { fp_glGetProgramBinaryOES(program, bufSize, length, binaryFormat, binary); } +inline void glProgramBinaryOES(GLuint program, GLenum binaryFormat, const void* binary, GLint length) { fp_glProgramBinaryOES(program, binaryFormat, binary, length); } + +/* GL_OES_mapbuffer */ +inline void* glMapBufferOES(GLenum target, GLenum access) { return fp_glMapBufferOES(target, access); } +inline GLboolean glUnmapBufferOES(GLenum target) { return fp_glUnmapBufferOES(target); } +inline void glGetBufferPointervOES(GLenum target, GLenum pname, void** params) { fp_glGetBufferPointervOES(target, pname, params); } + +/* GL_OES_query_matrix */ +inline GLbitfield glQueryMatrixxOES(GLfixed* mantissa, GLint* exponent) { return fp_glQueryMatrixxOES(mantissa, exponent); } + +/* GL_OES_single_precision */ +inline void glClearDepthfOES(GLclampf depth) { fp_glClearDepthfOES(depth); } +inline void glClipPlanefOES(GLenum plane, const GLfloat* equation) { fp_glClipPlanefOES(plane, equation); } +inline void glDepthRangefOES(GLclampf n, GLclampf f) { fp_glDepthRangefOES(n, f); } +inline void glFrustumfOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) { fp_glFrustumfOES(l, r, b, t, n, f); } +inline void glGetClipPlanefOES(GLenum plane, GLfloat* equation) { fp_glGetClipPlanefOES(plane, equation); } +inline void glOrthofOES(GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f) { fp_glOrthofOES(l, r, b, t, n, f); } + +/* GL_OES_texture_3D */ +inline void glTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { fp_glTexImage3DOES(target, level, internalformat, width, height, depth, border, format, type, pixels); } +inline void glTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { fp_glTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); } +inline void glCopyTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { fp_glCopyTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, x, y, width, height); } +inline void glCompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) { fp_glCompressedTexImage3DOES(target, level, internalformat, width, height, depth, border, imageSize, data); } +inline void glCompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { fp_glCompressedTexSubImage3DOES(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); } +inline void glFramebufferTexture3DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) { fp_glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset); } + +/* GL_OES_vertex_array_object */ +inline void glBindVertexArrayOES(GLuint array) { fp_glBindVertexArrayOES(array); } +inline void glDeleteVertexArraysOES(GLsizei n, const GLuint* arrays) { fp_glDeleteVertexArraysOES(n, arrays); } +inline void glGenVertexArraysOES(GLsizei n, GLuint* arrays) { fp_glGenVertexArraysOES(n, arrays); } +inline GLboolean glIsVertexArrayOES(GLuint array) { return fp_glIsVertexArrayOES(array); } + +/* GL_AMD_debug_output */ +inline void glDebugMessageEnableAMD(GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled) { fp_glDebugMessageEnableAMD(category, severity, count, ids, enabled); } +inline void glDebugMessageInsertAMD(GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf) { fp_glDebugMessageInsertAMD(category, severity, id, length, buf); } +inline void glDebugMessageCallbackAMD(GLDEBUGPROCAMD callback, void* userParam) { fp_glDebugMessageCallbackAMD(callback, userParam); } +inline GLuint glGetDebugMessageLogAMD(GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message) { return fp_glGetDebugMessageLogAMD(count, bufsize, categories, severities, ids, lengths, message); } + +/* GL_AMD_draw_buffers_blend */ +inline void glBlendFuncIndexedAMD(GLuint buf, GLenum src, GLenum dst) { fp_glBlendFuncIndexedAMD(buf, src, dst); } +inline void glBlendFuncSeparateIndexedAMD(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { fp_glBlendFuncSeparateIndexedAMD(buf, srcRGB, dstRGB, srcAlpha, dstAlpha); } +inline void glBlendEquationIndexedAMD(GLuint buf, GLenum mode) { fp_glBlendEquationIndexedAMD(buf, mode); } +inline void glBlendEquationSeparateIndexedAMD(GLuint buf, GLenum modeRGB, GLenum modeAlpha) { fp_glBlendEquationSeparateIndexedAMD(buf, modeRGB, modeAlpha); } + +/* GL_AMD_interleaved_elements */ +inline void glVertexAttribParameteriAMD(GLuint index, GLenum pname, GLint param) { fp_glVertexAttribParameteriAMD(index, pname, param); } + +/* GL_AMD_multi_draw_indirect */ +inline void glMultiDrawArraysIndirectAMD(GLenum mode, const void* indirect, GLsizei primcount, GLsizei stride) { fp_glMultiDrawArraysIndirectAMD(mode, indirect, primcount, stride); } +inline void glMultiDrawElementsIndirectAMD(GLenum mode, GLenum type, const void* indirect, GLsizei primcount, GLsizei stride) { fp_glMultiDrawElementsIndirectAMD(mode, type, indirect, primcount, stride); } + +/* GL_AMD_name_gen_delete */ +inline void glGenNamesAMD(GLenum identifier, GLuint num, GLuint* names) { fp_glGenNamesAMD(identifier, num, names); } +inline void glDeleteNamesAMD(GLenum identifier, GLuint num, const GLuint* names) { fp_glDeleteNamesAMD(identifier, num, names); } +inline GLboolean glIsNameAMD(GLenum identifier, GLuint name) { return fp_glIsNameAMD(identifier, name); } + +/* GL_AMD_performance_monitor */ +inline void glGetPerfMonitorGroupsAMD(GLint* numGroups, GLsizei groupsSize, GLuint* groups) { fp_glGetPerfMonitorGroupsAMD(numGroups, groupsSize, groups); } +inline void glGetPerfMonitorCountersAMD(GLuint group, GLint* numCounters, GLint* maxActiveCounters, GLsizei counterSize, GLuint* counters) { fp_glGetPerfMonitorCountersAMD(group, numCounters, maxActiveCounters, counterSize, counters); } +inline void glGetPerfMonitorGroupStringAMD(GLuint group, GLsizei bufSize, GLsizei* length, GLchar* groupString) { fp_glGetPerfMonitorGroupStringAMD(group, bufSize, length, groupString); } +inline void glGetPerfMonitorCounterStringAMD(GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar* counterString) { fp_glGetPerfMonitorCounterStringAMD(group, counter, bufSize, length, counterString); } +inline void glGetPerfMonitorCounterInfoAMD(GLuint group, GLuint counter, GLenum pname, void* data) { fp_glGetPerfMonitorCounterInfoAMD(group, counter, pname, data); } +inline void glGenPerfMonitorsAMD(GLsizei n, GLuint* monitors) { fp_glGenPerfMonitorsAMD(n, monitors); } +inline void glDeletePerfMonitorsAMD(GLsizei n, GLuint* monitors) { fp_glDeletePerfMonitorsAMD(n, monitors); } +inline void glSelectPerfMonitorCountersAMD(GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList) { fp_glSelectPerfMonitorCountersAMD(monitor, enable, group, numCounters, counterList); } +inline void glBeginPerfMonitorAMD(GLuint monitor) { fp_glBeginPerfMonitorAMD(monitor); } +inline void glEndPerfMonitorAMD(GLuint monitor) { fp_glEndPerfMonitorAMD(monitor); } +inline void glGetPerfMonitorCounterDataAMD(GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint* bytesWritten) { fp_glGetPerfMonitorCounterDataAMD(monitor, pname, dataSize, data, bytesWritten); } + +/* GL_AMD_sample_positions */ +inline void glSetMultisamplefvAMD(GLenum pname, GLuint index, const GLfloat* val) { fp_glSetMultisamplefvAMD(pname, index, val); } + +/* GL_AMD_sparse_texture */ +inline void glTexStorageSparseAMD(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags) { fp_glTexStorageSparseAMD(target, internalFormat, width, height, depth, layers, flags); } +inline void glTextureStorageSparseAMD(GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags) { fp_glTextureStorageSparseAMD(texture, target, internalFormat, width, height, depth, layers, flags); } + +/* GL_AMD_stencil_operation_extended */ +inline void glStencilOpValueAMD(GLenum face, GLuint value) { fp_glStencilOpValueAMD(face, value); } + +/* GL_AMD_vertex_shader_tessellator */ +inline void glTessellationFactorAMD(GLfloat factor) { fp_glTessellationFactorAMD(factor); } +inline void glTessellationModeAMD(GLenum mode) { fp_glTessellationModeAMD(mode); } + +/* GL_ANGLE_framebuffer_blit */ +inline void glBlitFramebufferANGLE(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebufferANGLE(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } + +/* GL_ANGLE_framebuffer_multisample */ +inline void glRenderbufferStorageMultisampleANGLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleANGLE(target, samples, internalformat, width, height); } + +/* GL_ANGLE_instanced_arrays */ +inline void glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedANGLE(mode, first, count, primcount); } +inline void glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedANGLE(mode, count, type, indices, primcount); } +inline void glVertexAttribDivisorANGLE(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorANGLE(index, divisor); } + +/* GL_ANGLE_translated_shader_source */ +inline void glGetTranslatedShaderSourceANGLE(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source) { fp_glGetTranslatedShaderSourceANGLE(shader, bufsize, length, source); } + +/* GL_APPLE_copy_texture_levels */ +inline void glCopyTextureLevelsAPPLE(GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount) { fp_glCopyTextureLevelsAPPLE(destinationTexture, sourceTexture, sourceBaseLevel, sourceLevelCount); } + +/* GL_APPLE_element_array */ +inline void glElementPointerAPPLE(GLenum type, const void* pointer) { fp_glElementPointerAPPLE(type, pointer); } +inline void glDrawElementArrayAPPLE(GLenum mode, GLint first, GLsizei count) { fp_glDrawElementArrayAPPLE(mode, first, count); } +inline void glDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count) { fp_glDrawRangeElementArrayAPPLE(mode, start, end, first, count); } +inline void glMultiDrawElementArrayAPPLE(GLenum mode, const GLint* first, const GLsizei* count, GLsizei primcount) { fp_glMultiDrawElementArrayAPPLE(mode, first, count, primcount); } +inline void glMultiDrawRangeElementArrayAPPLE(GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei* count, GLsizei primcount) { fp_glMultiDrawRangeElementArrayAPPLE(mode, start, end, first, count, primcount); } + +/* GL_APPLE_fence */ +inline void glGenFencesAPPLE(GLsizei n, GLuint* fences) { fp_glGenFencesAPPLE(n, fences); } +inline void glDeleteFencesAPPLE(GLsizei n, const GLuint* fences) { fp_glDeleteFencesAPPLE(n, fences); } +inline void glSetFenceAPPLE(GLuint fence) { fp_glSetFenceAPPLE(fence); } +inline GLboolean glIsFenceAPPLE(GLuint fence) { return fp_glIsFenceAPPLE(fence); } +inline GLboolean glTestFenceAPPLE(GLuint fence) { return fp_glTestFenceAPPLE(fence); } +inline void glFinishFenceAPPLE(GLuint fence) { fp_glFinishFenceAPPLE(fence); } +inline GLboolean glTestObjectAPPLE(GLenum object, GLuint name) { return fp_glTestObjectAPPLE(object, name); } +inline void glFinishObjectAPPLE(GLenum object, GLint name) { fp_glFinishObjectAPPLE(object, name); } + +/* GL_APPLE_flush_buffer_range */ +inline void glBufferParameteriAPPLE(GLenum target, GLenum pname, GLint param) { fp_glBufferParameteriAPPLE(target, pname, param); } +inline void glFlushMappedBufferRangeAPPLE(GLenum target, GLintptr offset, GLsizeiptr size) { fp_glFlushMappedBufferRangeAPPLE(target, offset, size); } + +/* GL_APPLE_framebuffer_multisample */ +inline void glRenderbufferStorageMultisampleAPPLE(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleAPPLE(target, samples, internalformat, width, height); } +inline void glResolveMultisampleFramebufferAPPLE() { fp_glResolveMultisampleFramebufferAPPLE(); } + +/* GL_APPLE_object_purgeable */ +inline GLenum glObjectPurgeableAPPLE(GLenum objectType, GLuint name, GLenum option) { return fp_glObjectPurgeableAPPLE(objectType, name, option); } +inline GLenum glObjectUnpurgeableAPPLE(GLenum objectType, GLuint name, GLenum option) { return fp_glObjectUnpurgeableAPPLE(objectType, name, option); } +inline void glGetObjectParameterivAPPLE(GLenum objectType, GLuint name, GLenum pname, GLint* params) { fp_glGetObjectParameterivAPPLE(objectType, name, pname, params); } + +/* GL_APPLE_sync */ +inline GLsync glFenceSyncAPPLE(GLenum condition, GLbitfield flags) { return fp_glFenceSyncAPPLE(condition, flags); } +inline GLboolean glIsSyncAPPLE(GLsync sync) { return fp_glIsSyncAPPLE(sync); } +inline void glDeleteSyncAPPLE(GLsync sync) { fp_glDeleteSyncAPPLE(sync); } +inline GLenum glClientWaitSyncAPPLE(GLsync sync, GLbitfield flags, GLuint64 timeout) { return fp_glClientWaitSyncAPPLE(sync, flags, timeout); } +inline void glWaitSyncAPPLE(GLsync sync, GLbitfield flags, GLuint64 timeout) { fp_glWaitSyncAPPLE(sync, flags, timeout); } +inline void glGetInteger64vAPPLE(GLenum pname, GLint64* params) { fp_glGetInteger64vAPPLE(pname, params); } +inline void glGetSyncivAPPLE(GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { fp_glGetSyncivAPPLE(sync, pname, bufSize, length, values); } + +/* GL_APPLE_texture_range */ +inline void glTextureRangeAPPLE(GLenum target, GLsizei length, const void* pointer) { fp_glTextureRangeAPPLE(target, length, pointer); } +inline void glGetTexParameterPointervAPPLE(GLenum target, GLenum pname, void** params) { fp_glGetTexParameterPointervAPPLE(target, pname, params); } + +/* GL_APPLE_vertex_array_object */ +inline void glBindVertexArrayAPPLE(GLuint array) { fp_glBindVertexArrayAPPLE(array); } +inline void glDeleteVertexArraysAPPLE(GLsizei n, const GLuint* arrays) { fp_glDeleteVertexArraysAPPLE(n, arrays); } +inline void glGenVertexArraysAPPLE(GLsizei n, GLuint* arrays) { fp_glGenVertexArraysAPPLE(n, arrays); } +inline GLboolean glIsVertexArrayAPPLE(GLuint array) { return fp_glIsVertexArrayAPPLE(array); } + +/* GL_APPLE_vertex_array_range */ +inline void glVertexArrayRangeAPPLE(GLsizei length, void* pointer) { fp_glVertexArrayRangeAPPLE(length, pointer); } +inline void glFlushVertexArrayRangeAPPLE(GLsizei length, void* pointer) { fp_glFlushVertexArrayRangeAPPLE(length, pointer); } +inline void glVertexArrayParameteriAPPLE(GLenum pname, GLint param) { fp_glVertexArrayParameteriAPPLE(pname, param); } + +/* GL_APPLE_vertex_program_evaluators */ +inline void glEnableVertexAttribAPPLE(GLuint index, GLenum pname) { fp_glEnableVertexAttribAPPLE(index, pname); } +inline void glDisableVertexAttribAPPLE(GLuint index, GLenum pname) { fp_glDisableVertexAttribAPPLE(index, pname); } +inline GLboolean glIsVertexAttribEnabledAPPLE(GLuint index, GLenum pname) { return fp_glIsVertexAttribEnabledAPPLE(index, pname); } +inline void glMapVertexAttrib1dAPPLE(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points) { fp_glMapVertexAttrib1dAPPLE(index, size, u1, u2, stride, order, points); } +inline void glMapVertexAttrib1fAPPLE(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points) { fp_glMapVertexAttrib1fAPPLE(index, size, u1, u2, stride, order, points); } +inline void glMapVertexAttrib2dAPPLE(GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points) { fp_glMapVertexAttrib2dAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); } +inline void glMapVertexAttrib2fAPPLE(GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points) { fp_glMapVertexAttrib2fAPPLE(index, size, u1, u2, ustride, uorder, v1, v2, vstride, vorder, points); } + +/* GL_ATI_draw_buffers */ +inline void glDrawBuffersATI(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersATI(n, bufs); } + +/* GL_ATI_element_array */ +inline void glElementPointerATI(GLenum type, const void* pointer) { fp_glElementPointerATI(type, pointer); } +inline void glDrawElementArrayATI(GLenum mode, GLsizei count) { fp_glDrawElementArrayATI(mode, count); } +inline void glDrawRangeElementArrayATI(GLenum mode, GLuint start, GLuint end, GLsizei count) { fp_glDrawRangeElementArrayATI(mode, start, end, count); } + +/* GL_ATI_envmap_bumpmap */ +inline void glTexBumpParameterivATI(GLenum pname, const GLint* param) { fp_glTexBumpParameterivATI(pname, param); } +inline void glTexBumpParameterfvATI(GLenum pname, const GLfloat* param) { fp_glTexBumpParameterfvATI(pname, param); } +inline void glGetTexBumpParameterivATI(GLenum pname, GLint* param) { fp_glGetTexBumpParameterivATI(pname, param); } +inline void glGetTexBumpParameterfvATI(GLenum pname, GLfloat* param) { fp_glGetTexBumpParameterfvATI(pname, param); } + +/* GL_ATI_fragment_shader */ +inline GLuint glGenFragmentShadersATI(GLuint range) { return fp_glGenFragmentShadersATI(range); } +inline void glBindFragmentShaderATI(GLuint id) { fp_glBindFragmentShaderATI(id); } +inline void glDeleteFragmentShaderATI(GLuint id) { fp_glDeleteFragmentShaderATI(id); } +inline void glBeginFragmentShaderATI() { fp_glBeginFragmentShaderATI(); } +inline void glEndFragmentShaderATI() { fp_glEndFragmentShaderATI(); } +inline void glPassTexCoordATI(GLuint dst, GLuint coord, GLenum swizzle) { fp_glPassTexCoordATI(dst, coord, swizzle); } +inline void glSampleMapATI(GLuint dst, GLuint interp, GLenum swizzle) { fp_glSampleMapATI(dst, interp, swizzle); } +inline void glColorFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) { fp_glColorFragmentOp1ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod); } +inline void glColorFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) { fp_glColorFragmentOp2ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); } +inline void glColorFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) { fp_glColorFragmentOp3ATI(op, dst, dstMask, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); } +inline void glAlphaFragmentOp1ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod) { fp_glAlphaFragmentOp1ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod); } +inline void glAlphaFragmentOp2ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod) { fp_glAlphaFragmentOp2ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod); } +inline void glAlphaFragmentOp3ATI(GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod) { fp_glAlphaFragmentOp3ATI(op, dst, dstMod, arg1, arg1Rep, arg1Mod, arg2, arg2Rep, arg2Mod, arg3, arg3Rep, arg3Mod); } +inline void glSetFragmentShaderConstantATI(GLuint dst, const GLfloat* value) { fp_glSetFragmentShaderConstantATI(dst, value); } + +/* GL_ATI_map_object_buffer */ +inline void* glMapObjectBufferATI(GLuint buffer) { return fp_glMapObjectBufferATI(buffer); } +inline void glUnmapObjectBufferATI(GLuint buffer) { fp_glUnmapObjectBufferATI(buffer); } + +/* GL_ATI_pn_triangles */ +inline void glPNTrianglesiATI(GLenum pname, GLint param) { fp_glPNTrianglesiATI(pname, param); } +inline void glPNTrianglesfATI(GLenum pname, GLfloat param) { fp_glPNTrianglesfATI(pname, param); } + +/* GL_ATI_separate_stencil */ +inline void glStencilOpSeparateATI(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass) { fp_glStencilOpSeparateATI(face, sfail, dpfail, dppass); } +inline void glStencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask) { fp_glStencilFuncSeparateATI(frontfunc, backfunc, ref, mask); } + +/* GL_ATI_vertex_array_object */ +inline GLuint glNewObjectBufferATI(GLsizei size, const void* pointer, GLenum usage) { return fp_glNewObjectBufferATI(size, pointer, usage); } +inline GLboolean glIsObjectBufferATI(GLuint buffer) { return fp_glIsObjectBufferATI(buffer); } +inline void glUpdateObjectBufferATI(GLuint buffer, GLuint offset, GLsizei size, const void* pointer, GLenum preserve) { fp_glUpdateObjectBufferATI(buffer, offset, size, pointer, preserve); } +inline void glGetObjectBufferfvATI(GLuint buffer, GLenum pname, GLfloat* params) { fp_glGetObjectBufferfvATI(buffer, pname, params); } +inline void glGetObjectBufferivATI(GLuint buffer, GLenum pname, GLint* params) { fp_glGetObjectBufferivATI(buffer, pname, params); } +inline void glFreeObjectBufferATI(GLuint buffer) { fp_glFreeObjectBufferATI(buffer); } +inline void glArrayObjectATI(GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) { fp_glArrayObjectATI(array, size, type, stride, buffer, offset); } +inline void glGetArrayObjectfvATI(GLenum array, GLenum pname, GLfloat* params) { fp_glGetArrayObjectfvATI(array, pname, params); } +inline void glGetArrayObjectivATI(GLenum array, GLenum pname, GLint* params) { fp_glGetArrayObjectivATI(array, pname, params); } +inline void glVariantArrayObjectATI(GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset) { fp_glVariantArrayObjectATI(id, type, stride, buffer, offset); } +inline void glGetVariantArrayObjectfvATI(GLuint id, GLenum pname, GLfloat* params) { fp_glGetVariantArrayObjectfvATI(id, pname, params); } +inline void glGetVariantArrayObjectivATI(GLuint id, GLenum pname, GLint* params) { fp_glGetVariantArrayObjectivATI(id, pname, params); } + +/* GL_ATI_vertex_attrib_array_object */ +inline void glVertexAttribArrayObjectATI(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset) { fp_glVertexAttribArrayObjectATI(index, size, type, normalized, stride, buffer, offset); } +inline void glGetVertexAttribArrayObjectfvATI(GLuint index, GLenum pname, GLfloat* params) { fp_glGetVertexAttribArrayObjectfvATI(index, pname, params); } +inline void glGetVertexAttribArrayObjectivATI(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribArrayObjectivATI(index, pname, params); } + +/* GL_ATI_vertex_streams */ +inline void glVertexStream1sATI(GLenum stream, GLshort x) { fp_glVertexStream1sATI(stream, x); } +inline void glVertexStream1svATI(GLenum stream, const GLshort* coords) { fp_glVertexStream1svATI(stream, coords); } +inline void glVertexStream1iATI(GLenum stream, GLint x) { fp_glVertexStream1iATI(stream, x); } +inline void glVertexStream1ivATI(GLenum stream, const GLint* coords) { fp_glVertexStream1ivATI(stream, coords); } +inline void glVertexStream1fATI(GLenum stream, GLfloat x) { fp_glVertexStream1fATI(stream, x); } +inline void glVertexStream1fvATI(GLenum stream, const GLfloat* coords) { fp_glVertexStream1fvATI(stream, coords); } +inline void glVertexStream1dATI(GLenum stream, GLdouble x) { fp_glVertexStream1dATI(stream, x); } +inline void glVertexStream1dvATI(GLenum stream, const GLdouble* coords) { fp_glVertexStream1dvATI(stream, coords); } +inline void glVertexStream2sATI(GLenum stream, GLshort x, GLshort y) { fp_glVertexStream2sATI(stream, x, y); } +inline void glVertexStream2svATI(GLenum stream, const GLshort* coords) { fp_glVertexStream2svATI(stream, coords); } +inline void glVertexStream2iATI(GLenum stream, GLint x, GLint y) { fp_glVertexStream2iATI(stream, x, y); } +inline void glVertexStream2ivATI(GLenum stream, const GLint* coords) { fp_glVertexStream2ivATI(stream, coords); } +inline void glVertexStream2fATI(GLenum stream, GLfloat x, GLfloat y) { fp_glVertexStream2fATI(stream, x, y); } +inline void glVertexStream2fvATI(GLenum stream, const GLfloat* coords) { fp_glVertexStream2fvATI(stream, coords); } +inline void glVertexStream2dATI(GLenum stream, GLdouble x, GLdouble y) { fp_glVertexStream2dATI(stream, x, y); } +inline void glVertexStream2dvATI(GLenum stream, const GLdouble* coords) { fp_glVertexStream2dvATI(stream, coords); } +inline void glVertexStream3sATI(GLenum stream, GLshort x, GLshort y, GLshort z) { fp_glVertexStream3sATI(stream, x, y, z); } +inline void glVertexStream3svATI(GLenum stream, const GLshort* coords) { fp_glVertexStream3svATI(stream, coords); } +inline void glVertexStream3iATI(GLenum stream, GLint x, GLint y, GLint z) { fp_glVertexStream3iATI(stream, x, y, z); } +inline void glVertexStream3ivATI(GLenum stream, const GLint* coords) { fp_glVertexStream3ivATI(stream, coords); } +inline void glVertexStream3fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z) { fp_glVertexStream3fATI(stream, x, y, z); } +inline void glVertexStream3fvATI(GLenum stream, const GLfloat* coords) { fp_glVertexStream3fvATI(stream, coords); } +inline void glVertexStream3dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexStream3dATI(stream, x, y, z); } +inline void glVertexStream3dvATI(GLenum stream, const GLdouble* coords) { fp_glVertexStream3dvATI(stream, coords); } +inline void glVertexStream4sATI(GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertexStream4sATI(stream, x, y, z, w); } +inline void glVertexStream4svATI(GLenum stream, const GLshort* coords) { fp_glVertexStream4svATI(stream, coords); } +inline void glVertexStream4iATI(GLenum stream, GLint x, GLint y, GLint z, GLint w) { fp_glVertexStream4iATI(stream, x, y, z, w); } +inline void glVertexStream4ivATI(GLenum stream, const GLint* coords) { fp_glVertexStream4ivATI(stream, coords); } +inline void glVertexStream4fATI(GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertexStream4fATI(stream, x, y, z, w); } +inline void glVertexStream4fvATI(GLenum stream, const GLfloat* coords) { fp_glVertexStream4fvATI(stream, coords); } +inline void glVertexStream4dATI(GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexStream4dATI(stream, x, y, z, w); } +inline void glVertexStream4dvATI(GLenum stream, const GLdouble* coords) { fp_glVertexStream4dvATI(stream, coords); } +inline void glNormalStream3bATI(GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz) { fp_glNormalStream3bATI(stream, nx, ny, nz); } +inline void glNormalStream3bvATI(GLenum stream, const GLbyte* coords) { fp_glNormalStream3bvATI(stream, coords); } +inline void glNormalStream3sATI(GLenum stream, GLshort nx, GLshort ny, GLshort nz) { fp_glNormalStream3sATI(stream, nx, ny, nz); } +inline void glNormalStream3svATI(GLenum stream, const GLshort* coords) { fp_glNormalStream3svATI(stream, coords); } +inline void glNormalStream3iATI(GLenum stream, GLint nx, GLint ny, GLint nz) { fp_glNormalStream3iATI(stream, nx, ny, nz); } +inline void glNormalStream3ivATI(GLenum stream, const GLint* coords) { fp_glNormalStream3ivATI(stream, coords); } +inline void glNormalStream3fATI(GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz) { fp_glNormalStream3fATI(stream, nx, ny, nz); } +inline void glNormalStream3fvATI(GLenum stream, const GLfloat* coords) { fp_glNormalStream3fvATI(stream, coords); } +inline void glNormalStream3dATI(GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz) { fp_glNormalStream3dATI(stream, nx, ny, nz); } +inline void glNormalStream3dvATI(GLenum stream, const GLdouble* coords) { fp_glNormalStream3dvATI(stream, coords); } +inline void glClientActiveVertexStreamATI(GLenum stream) { fp_glClientActiveVertexStreamATI(stream); } +inline void glVertexBlendEnviATI(GLenum pname, GLint param) { fp_glVertexBlendEnviATI(pname, param); } +inline void glVertexBlendEnvfATI(GLenum pname, GLfloat param) { fp_glVertexBlendEnvfATI(pname, param); } + +/* GL_GREMEDY_frame_terminator */ +inline void glFrameTerminatorGREMEDY() { fp_glFrameTerminatorGREMEDY(); } + +/* GL_GREMEDY_string_marker */ +inline void glStringMarkerGREMEDY(GLsizei len, const void* string) { fp_glStringMarkerGREMEDY(len, string); } + +/* GL_IMG_multisampled_render_to_texture */ +inline void glRenderbufferStorageMultisampleIMG(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleIMG(target, samples, internalformat, width, height); } +inline void glFramebufferTexture2DMultisampleIMG(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples) { fp_glFramebufferTexture2DMultisampleIMG(target, attachment, textarget, texture, level, samples); } + +/* GL_INGR_blend_func_separate */ +inline void glBlendFuncSeparateINGR(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha) { fp_glBlendFuncSeparateINGR(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); } + +/* GL_INTEL_map_texture */ +inline void glSyncTextureINTEL(GLuint texture) { fp_glSyncTextureINTEL(texture); } +inline void glUnmapTexture2DINTEL(GLuint texture, GLint level) { fp_glUnmapTexture2DINTEL(texture, level); } +inline void* glMapTexture2DINTEL(GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum* layout) { return fp_glMapTexture2DINTEL(texture, level, access, stride, layout); } + +/* GL_INTEL_parallel_arrays */ +inline void glVertexPointervINTEL(GLint size, GLenum type, const void** pointer) { fp_glVertexPointervINTEL(size, type, pointer); } +inline void glNormalPointervINTEL(GLenum type, const void** pointer) { fp_glNormalPointervINTEL(type, pointer); } +inline void glColorPointervINTEL(GLint size, GLenum type, const void** pointer) { fp_glColorPointervINTEL(size, type, pointer); } +inline void glTexCoordPointervINTEL(GLint size, GLenum type, const void** pointer) { fp_glTexCoordPointervINTEL(size, type, pointer); } + +/* GL_MESA_resize_buffers */ +inline void glResizeBuffersMESA() { fp_glResizeBuffersMESA(); } + +/* GL_MESA_window_pos */ +inline void glWindowPos2dMESA(GLdouble x, GLdouble y) { fp_glWindowPos2dMESA(x, y); } +inline void glWindowPos2dvMESA(const GLdouble* v) { fp_glWindowPos2dvMESA(v); } +inline void glWindowPos2fMESA(GLfloat x, GLfloat y) { fp_glWindowPos2fMESA(x, y); } +inline void glWindowPos2fvMESA(const GLfloat* v) { fp_glWindowPos2fvMESA(v); } +inline void glWindowPos2iMESA(GLint x, GLint y) { fp_glWindowPos2iMESA(x, y); } +inline void glWindowPos2ivMESA(const GLint* v) { fp_glWindowPos2ivMESA(v); } +inline void glWindowPos2sMESA(GLshort x, GLshort y) { fp_glWindowPos2sMESA(x, y); } +inline void glWindowPos2svMESA(const GLshort* v) { fp_glWindowPos2svMESA(v); } +inline void glWindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) { fp_glWindowPos3dMESA(x, y, z); } +inline void glWindowPos3dvMESA(const GLdouble* v) { fp_glWindowPos3dvMESA(v); } +inline void glWindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) { fp_glWindowPos3fMESA(x, y, z); } +inline void glWindowPos3fvMESA(const GLfloat* v) { fp_glWindowPos3fvMESA(v); } +inline void glWindowPos3iMESA(GLint x, GLint y, GLint z) { fp_glWindowPos3iMESA(x, y, z); } +inline void glWindowPos3ivMESA(const GLint* v) { fp_glWindowPos3ivMESA(v); } +inline void glWindowPos3sMESA(GLshort x, GLshort y, GLshort z) { fp_glWindowPos3sMESA(x, y, z); } +inline void glWindowPos3svMESA(const GLshort* v) { fp_glWindowPos3svMESA(v); } +inline void glWindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glWindowPos4dMESA(x, y, z, w); } +inline void glWindowPos4dvMESA(const GLdouble* v) { fp_glWindowPos4dvMESA(v); } +inline void glWindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glWindowPos4fMESA(x, y, z, w); } +inline void glWindowPos4fvMESA(const GLfloat* v) { fp_glWindowPos4fvMESA(v); } +inline void glWindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) { fp_glWindowPos4iMESA(x, y, z, w); } +inline void glWindowPos4ivMESA(const GLint* v) { fp_glWindowPos4ivMESA(v); } +inline void glWindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) { fp_glWindowPos4sMESA(x, y, z, w); } +inline void glWindowPos4svMESA(const GLshort* v) { fp_glWindowPos4svMESA(v); } + +/* GL_NV_bindless_multi_draw_indirect */ +inline void glMultiDrawArraysIndirectBindlessNV(GLenum mode, const void* indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawArraysIndirectBindlessNV(mode, indirect, drawCount, stride, vertexBufferCount); } +inline void glMultiDrawElementsIndirectBindlessNV(GLenum mode, GLenum type, const void* indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount) { fp_glMultiDrawElementsIndirectBindlessNV(mode, type, indirect, drawCount, stride, vertexBufferCount); } + +/* GL_NV_bindless_texture */ +inline GLuint64 glGetTextureHandleNV(GLuint texture) { return fp_glGetTextureHandleNV(texture); } +inline GLuint64 glGetTextureSamplerHandleNV(GLuint texture, GLuint sampler) { return fp_glGetTextureSamplerHandleNV(texture, sampler); } +inline void glMakeTextureHandleResidentNV(GLuint64 handle) { fp_glMakeTextureHandleResidentNV(handle); } +inline void glMakeTextureHandleNonResidentNV(GLuint64 handle) { fp_glMakeTextureHandleNonResidentNV(handle); } +inline GLuint64 glGetImageHandleNV(GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format) { return fp_glGetImageHandleNV(texture, level, layered, layer, format); } +inline void glMakeImageHandleResidentNV(GLuint64 handle, GLenum access) { fp_glMakeImageHandleResidentNV(handle, access); } +inline void glMakeImageHandleNonResidentNV(GLuint64 handle) { fp_glMakeImageHandleNonResidentNV(handle); } +inline void glUniformHandleui64NV(GLint location, GLuint64 value) { fp_glUniformHandleui64NV(location, value); } +inline void glUniformHandleui64vNV(GLint location, GLsizei count, const GLuint64* value) { fp_glUniformHandleui64vNV(location, count, value); } +inline void glProgramUniformHandleui64NV(GLuint program, GLint location, GLuint64 value) { fp_glProgramUniformHandleui64NV(program, location, value); } +inline void glProgramUniformHandleui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64* values) { fp_glProgramUniformHandleui64vNV(program, location, count, values); } +inline GLboolean glIsTextureHandleResidentNV(GLuint64 handle) { return fp_glIsTextureHandleResidentNV(handle); } +inline GLboolean glIsImageHandleResidentNV(GLuint64 handle) { return fp_glIsImageHandleResidentNV(handle); } + +/* GL_NV_blend_equation_advanced */ +inline void glBlendParameteriNV(GLenum pname, GLint value) { fp_glBlendParameteriNV(pname, value); } +inline void glBlendBarrierNV() { fp_glBlendBarrierNV(); } + +/* GL_NV_conditional_render */ +inline void glBeginConditionalRenderNV(GLuint id, GLenum mode) { fp_glBeginConditionalRenderNV(id, mode); } +inline void glEndConditionalRenderNV() { fp_glEndConditionalRenderNV(); } + +/* GL_NV_copy_buffer */ +inline void glCopyBufferSubDataNV(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) { fp_glCopyBufferSubDataNV(readTarget, writeTarget, readOffset, writeOffset, size); } + +/* GL_NV_copy_image */ +inline void glCopyImageSubDataNV(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth) { fp_glCopyImageSubDataNV(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, width, height, depth); } + +/* GL_NV_coverage_sample */ +inline void glCoverageMaskNV(GLboolean mask) { fp_glCoverageMaskNV(mask); } +inline void glCoverageOperationNV(GLenum operation) { fp_glCoverageOperationNV(operation); } + +/* GL_NV_depth_buffer_float */ +inline void glDepthRangedNV(GLdouble zNear, GLdouble zFar) { fp_glDepthRangedNV(zNear, zFar); } +inline void glClearDepthdNV(GLdouble depth) { fp_glClearDepthdNV(depth); } +inline void glDepthBoundsdNV(GLdouble zmin, GLdouble zmax) { fp_glDepthBoundsdNV(zmin, zmax); } + +/* GL_NV_draw_buffers */ +inline void glDrawBuffersNV(GLsizei n, const GLenum* bufs) { fp_glDrawBuffersNV(n, bufs); } + +/* GL_NV_draw_instanced */ +inline void glDrawArraysInstancedNV(GLenum mode, GLint first, GLsizei count, GLsizei primcount) { fp_glDrawArraysInstancedNV(mode, first, count, primcount); } +inline void glDrawElementsInstancedNV(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) { fp_glDrawElementsInstancedNV(mode, count, type, indices, primcount); } + +/* GL_NV_draw_texture */ +inline void glDrawTextureNV(GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1) { fp_glDrawTextureNV(texture, sampler, x0, y0, x1, y1, z, s0, t0, s1, t1); } + +/* GL_NV_evaluators */ +inline void glMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void* points) { fp_glMapControlPointsNV(target, index, type, ustride, vstride, uorder, vorder, packed, points); } +inline void glMapParameterivNV(GLenum target, GLenum pname, const GLint* params) { fp_glMapParameterivNV(target, pname, params); } +inline void glMapParameterfvNV(GLenum target, GLenum pname, const GLfloat* params) { fp_glMapParameterfvNV(target, pname, params); } +inline void glGetMapControlPointsNV(GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void* points) { fp_glGetMapControlPointsNV(target, index, type, ustride, vstride, packed, points); } +inline void glGetMapParameterivNV(GLenum target, GLenum pname, GLint* params) { fp_glGetMapParameterivNV(target, pname, params); } +inline void glGetMapParameterfvNV(GLenum target, GLenum pname, GLfloat* params) { fp_glGetMapParameterfvNV(target, pname, params); } +inline void glGetMapAttribParameterivNV(GLenum target, GLuint index, GLenum pname, GLint* params) { fp_glGetMapAttribParameterivNV(target, index, pname, params); } +inline void glGetMapAttribParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat* params) { fp_glGetMapAttribParameterfvNV(target, index, pname, params); } +inline void glEvalMapsNV(GLenum target, GLenum mode) { fp_glEvalMapsNV(target, mode); } + +/* GL_NV_explicit_multisample */ +inline void glGetMultisamplefvNV(GLenum pname, GLuint index, GLfloat* val) { fp_glGetMultisamplefvNV(pname, index, val); } +inline void glSampleMaskIndexedNV(GLuint index, GLbitfield mask) { fp_glSampleMaskIndexedNV(index, mask); } +inline void glTexRenderbufferNV(GLenum target, GLuint renderbuffer) { fp_glTexRenderbufferNV(target, renderbuffer); } + +/* GL_NV_fence */ +inline void glDeleteFencesNV(GLsizei n, const GLuint* fences) { fp_glDeleteFencesNV(n, fences); } +inline void glGenFencesNV(GLsizei n, GLuint* fences) { fp_glGenFencesNV(n, fences); } +inline GLboolean glIsFenceNV(GLuint fence) { return fp_glIsFenceNV(fence); } +inline GLboolean glTestFenceNV(GLuint fence) { return fp_glTestFenceNV(fence); } +inline void glGetFenceivNV(GLuint fence, GLenum pname, GLint* params) { fp_glGetFenceivNV(fence, pname, params); } +inline void glFinishFenceNV(GLuint fence) { fp_glFinishFenceNV(fence); } +inline void glSetFenceNV(GLuint fence, GLenum condition) { fp_glSetFenceNV(fence, condition); } + +/* GL_NV_fragment_program */ +inline void glProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glProgramNamedParameter4fNV(id, len, name, x, y, z, w); } +inline void glProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte* name, const GLfloat* v) { fp_glProgramNamedParameter4fvNV(id, len, name, v); } +inline void glProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramNamedParameter4dNV(id, len, name, x, y, z, w); } +inline void glProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte* name, const GLdouble* v) { fp_glProgramNamedParameter4dvNV(id, len, name, v); } +inline void glGetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte* name, GLfloat* params) { fp_glGetProgramNamedParameterfvNV(id, len, name, params); } +inline void glGetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte* name, GLdouble* params) { fp_glGetProgramNamedParameterdvNV(id, len, name, params); } + +/* GL_NV_framebuffer_blit */ +inline void glBlitFramebufferNV(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { fp_glBlitFramebufferNV(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } + +/* GL_NV_framebuffer_multisample */ +inline void glRenderbufferStorageMultisampleNV(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleNV(target, samples, internalformat, width, height); } + +/* GL_NV_framebuffer_multisample_coverage */ +inline void glRenderbufferStorageMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height) { fp_glRenderbufferStorageMultisampleCoverageNV(target, coverageSamples, colorSamples, internalformat, width, height); } + +/* GL_NV_geometry_program4 */ +inline void glProgramVertexLimitNV(GLenum target, GLint limit) { fp_glProgramVertexLimitNV(target, limit); } +inline void glFramebufferTextureEXT(GLenum target, GLenum attachment, GLuint texture, GLint level) { fp_glFramebufferTextureEXT(target, attachment, texture, level); } +inline void glFramebufferTextureLayerEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer) { fp_glFramebufferTextureLayerEXT(target, attachment, texture, level, layer); } +inline void glFramebufferTextureFaceEXT(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face) { fp_glFramebufferTextureFaceEXT(target, attachment, texture, level, face); } + +/* GL_NV_gpu_program4 */ +inline void glProgramLocalParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glProgramLocalParameterI4iNV(target, index, x, y, z, w); } +inline void glProgramLocalParameterI4ivNV(GLenum target, GLuint index, const GLint* params) { fp_glProgramLocalParameterI4ivNV(target, index, params); } +inline void glProgramLocalParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint* params) { fp_glProgramLocalParametersI4ivNV(target, index, count, params); } +inline void glProgramLocalParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glProgramLocalParameterI4uiNV(target, index, x, y, z, w); } +inline void glProgramLocalParameterI4uivNV(GLenum target, GLuint index, const GLuint* params) { fp_glProgramLocalParameterI4uivNV(target, index, params); } +inline void glProgramLocalParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint* params) { fp_glProgramLocalParametersI4uivNV(target, index, count, params); } +inline void glProgramEnvParameterI4iNV(GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glProgramEnvParameterI4iNV(target, index, x, y, z, w); } +inline void glProgramEnvParameterI4ivNV(GLenum target, GLuint index, const GLint* params) { fp_glProgramEnvParameterI4ivNV(target, index, params); } +inline void glProgramEnvParametersI4ivNV(GLenum target, GLuint index, GLsizei count, const GLint* params) { fp_glProgramEnvParametersI4ivNV(target, index, count, params); } +inline void glProgramEnvParameterI4uiNV(GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glProgramEnvParameterI4uiNV(target, index, x, y, z, w); } +inline void glProgramEnvParameterI4uivNV(GLenum target, GLuint index, const GLuint* params) { fp_glProgramEnvParameterI4uivNV(target, index, params); } +inline void glProgramEnvParametersI4uivNV(GLenum target, GLuint index, GLsizei count, const GLuint* params) { fp_glProgramEnvParametersI4uivNV(target, index, count, params); } +inline void glGetProgramLocalParameterIivNV(GLenum target, GLuint index, GLint* params) { fp_glGetProgramLocalParameterIivNV(target, index, params); } +inline void glGetProgramLocalParameterIuivNV(GLenum target, GLuint index, GLuint* params) { fp_glGetProgramLocalParameterIuivNV(target, index, params); } +inline void glGetProgramEnvParameterIivNV(GLenum target, GLuint index, GLint* params) { fp_glGetProgramEnvParameterIivNV(target, index, params); } +inline void glGetProgramEnvParameterIuivNV(GLenum target, GLuint index, GLuint* params) { fp_glGetProgramEnvParameterIuivNV(target, index, params); } + +/* GL_NV_gpu_program5 */ +inline void glProgramSubroutineParametersuivNV(GLenum target, GLsizei count, const GLuint* params) { fp_glProgramSubroutineParametersuivNV(target, count, params); } +inline void glGetProgramSubroutineParameteruivNV(GLenum target, GLuint index, GLuint* param) { fp_glGetProgramSubroutineParameteruivNV(target, index, param); } + +/* GL_NV_gpu_shader5 */ +inline void glUniform1i64NV(GLint location, GLint64EXT x) { fp_glUniform1i64NV(location, x); } +inline void glUniform2i64NV(GLint location, GLint64EXT x, GLint64EXT y) { fp_glUniform2i64NV(location, x, y); } +inline void glUniform3i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glUniform3i64NV(location, x, y, z); } +inline void glUniform4i64NV(GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glUniform4i64NV(location, x, y, z, w); } +inline void glUniform1i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform1i64vNV(location, count, value); } +inline void glUniform2i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform2i64vNV(location, count, value); } +inline void glUniform3i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform3i64vNV(location, count, value); } +inline void glUniform4i64vNV(GLint location, GLsizei count, const GLint64EXT* value) { fp_glUniform4i64vNV(location, count, value); } +inline void glUniform1ui64NV(GLint location, GLuint64EXT x) { fp_glUniform1ui64NV(location, x); } +inline void glUniform2ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y) { fp_glUniform2ui64NV(location, x, y); } +inline void glUniform3ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glUniform3ui64NV(location, x, y, z); } +inline void glUniform4ui64NV(GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glUniform4ui64NV(location, x, y, z, w); } +inline void glUniform1ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform1ui64vNV(location, count, value); } +inline void glUniform2ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform2ui64vNV(location, count, value); } +inline void glUniform3ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform3ui64vNV(location, count, value); } +inline void glUniform4ui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniform4ui64vNV(location, count, value); } +inline void glGetUniformi64vNV(GLuint program, GLint location, GLint64EXT* params) { fp_glGetUniformi64vNV(program, location, params); } +inline void glProgramUniform1i64NV(GLuint program, GLint location, GLint64EXT x) { fp_glProgramUniform1i64NV(program, location, x); } +inline void glProgramUniform2i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y) { fp_glProgramUniform2i64NV(program, location, x, y); } +inline void glProgramUniform3i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glProgramUniform3i64NV(program, location, x, y, z); } +inline void glProgramUniform4i64NV(GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glProgramUniform4i64NV(program, location, x, y, z, w); } +inline void glProgramUniform1i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform1i64vNV(program, location, count, value); } +inline void glProgramUniform2i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform2i64vNV(program, location, count, value); } +inline void glProgramUniform3i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform3i64vNV(program, location, count, value); } +inline void glProgramUniform4i64vNV(GLuint program, GLint location, GLsizei count, const GLint64EXT* value) { fp_glProgramUniform4i64vNV(program, location, count, value); } +inline void glProgramUniform1ui64NV(GLuint program, GLint location, GLuint64EXT x) { fp_glProgramUniform1ui64NV(program, location, x); } +inline void glProgramUniform2ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y) { fp_glProgramUniform2ui64NV(program, location, x, y); } +inline void glProgramUniform3ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glProgramUniform3ui64NV(program, location, x, y, z); } +inline void glProgramUniform4ui64NV(GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glProgramUniform4ui64NV(program, location, x, y, z, w); } +inline void glProgramUniform1ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform1ui64vNV(program, location, count, value); } +inline void glProgramUniform2ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform2ui64vNV(program, location, count, value); } +inline void glProgramUniform3ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform3ui64vNV(program, location, count, value); } +inline void glProgramUniform4ui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniform4ui64vNV(program, location, count, value); } + +/* GL_NV_half_float */ +inline void glVertex2hNV(GLhalfNV x, GLhalfNV y) { fp_glVertex2hNV(x, y); } +inline void glVertex2hvNV(const GLhalfNV* v) { fp_glVertex2hvNV(v); } +inline void glVertex3hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z) { fp_glVertex3hNV(x, y, z); } +inline void glVertex3hvNV(const GLhalfNV* v) { fp_glVertex3hvNV(v); } +inline void glVertex4hNV(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) { fp_glVertex4hNV(x, y, z, w); } +inline void glVertex4hvNV(const GLhalfNV* v) { fp_glVertex4hvNV(v); } +inline void glNormal3hNV(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz) { fp_glNormal3hNV(nx, ny, nz); } +inline void glNormal3hvNV(const GLhalfNV* v) { fp_glNormal3hvNV(v); } +inline void glColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue) { fp_glColor3hNV(red, green, blue); } +inline void glColor3hvNV(const GLhalfNV* v) { fp_glColor3hvNV(v); } +inline void glColor4hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha) { fp_glColor4hNV(red, green, blue, alpha); } +inline void glColor4hvNV(const GLhalfNV* v) { fp_glColor4hvNV(v); } +inline void glTexCoord1hNV(GLhalfNV s) { fp_glTexCoord1hNV(s); } +inline void glTexCoord1hvNV(const GLhalfNV* v) { fp_glTexCoord1hvNV(v); } +inline void glTexCoord2hNV(GLhalfNV s, GLhalfNV t) { fp_glTexCoord2hNV(s, t); } +inline void glTexCoord2hvNV(const GLhalfNV* v) { fp_glTexCoord2hvNV(v); } +inline void glTexCoord3hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r) { fp_glTexCoord3hNV(s, t, r); } +inline void glTexCoord3hvNV(const GLhalfNV* v) { fp_glTexCoord3hvNV(v); } +inline void glTexCoord4hNV(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) { fp_glTexCoord4hNV(s, t, r, q); } +inline void glTexCoord4hvNV(const GLhalfNV* v) { fp_glTexCoord4hvNV(v); } +inline void glMultiTexCoord1hNV(GLenum target, GLhalfNV s) { fp_glMultiTexCoord1hNV(target, s); } +inline void glMultiTexCoord1hvNV(GLenum target, const GLhalfNV* v) { fp_glMultiTexCoord1hvNV(target, v); } +inline void glMultiTexCoord2hNV(GLenum target, GLhalfNV s, GLhalfNV t) { fp_glMultiTexCoord2hNV(target, s, t); } +inline void glMultiTexCoord2hvNV(GLenum target, const GLhalfNV* v) { fp_glMultiTexCoord2hvNV(target, v); } +inline void glMultiTexCoord3hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r) { fp_glMultiTexCoord3hNV(target, s, t, r); } +inline void glMultiTexCoord3hvNV(GLenum target, const GLhalfNV* v) { fp_glMultiTexCoord3hvNV(target, v); } +inline void glMultiTexCoord4hNV(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q) { fp_glMultiTexCoord4hNV(target, s, t, r, q); } +inline void glMultiTexCoord4hvNV(GLenum target, const GLhalfNV* v) { fp_glMultiTexCoord4hvNV(target, v); } +inline void glFogCoordhNV(GLhalfNV fog) { fp_glFogCoordhNV(fog); } +inline void glFogCoordhvNV(const GLhalfNV* fog) { fp_glFogCoordhvNV(fog); } +inline void glSecondaryColor3hNV(GLhalfNV red, GLhalfNV green, GLhalfNV blue) { fp_glSecondaryColor3hNV(red, green, blue); } +inline void glSecondaryColor3hvNV(const GLhalfNV* v) { fp_glSecondaryColor3hvNV(v); } +inline void glVertexWeighthNV(GLhalfNV weight) { fp_glVertexWeighthNV(weight); } +inline void glVertexWeighthvNV(const GLhalfNV* weight) { fp_glVertexWeighthvNV(weight); } +inline void glVertexAttrib1hNV(GLuint index, GLhalfNV x) { fp_glVertexAttrib1hNV(index, x); } +inline void glVertexAttrib1hvNV(GLuint index, const GLhalfNV* v) { fp_glVertexAttrib1hvNV(index, v); } +inline void glVertexAttrib2hNV(GLuint index, GLhalfNV x, GLhalfNV y) { fp_glVertexAttrib2hNV(index, x, y); } +inline void glVertexAttrib2hvNV(GLuint index, const GLhalfNV* v) { fp_glVertexAttrib2hvNV(index, v); } +inline void glVertexAttrib3hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z) { fp_glVertexAttrib3hNV(index, x, y, z); } +inline void glVertexAttrib3hvNV(GLuint index, const GLhalfNV* v) { fp_glVertexAttrib3hvNV(index, v); } +inline void glVertexAttrib4hNV(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w) { fp_glVertexAttrib4hNV(index, x, y, z, w); } +inline void glVertexAttrib4hvNV(GLuint index, const GLhalfNV* v) { fp_glVertexAttrib4hvNV(index, v); } +inline void glVertexAttribs1hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { fp_glVertexAttribs1hvNV(index, n, v); } +inline void glVertexAttribs2hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { fp_glVertexAttribs2hvNV(index, n, v); } +inline void glVertexAttribs3hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { fp_glVertexAttribs3hvNV(index, n, v); } +inline void glVertexAttribs4hvNV(GLuint index, GLsizei n, const GLhalfNV* v) { fp_glVertexAttribs4hvNV(index, n, v); } + +/* GL_NV_instanced_arrays */ +inline void glVertexAttribDivisorNV(GLuint index, GLuint divisor) { fp_glVertexAttribDivisorNV(index, divisor); } + +/* GL_NV_non_square_matrices */ +inline void glUniformMatrix2x3fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x3fvNV(location, count, transpose, value); } +inline void glUniformMatrix3x2fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x2fvNV(location, count, transpose, value); } +inline void glUniformMatrix2x4fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix2x4fvNV(location, count, transpose, value); } +inline void glUniformMatrix4x2fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4x2fvNV(location, count, transpose, value); } +inline void glUniformMatrix3x4fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix3x4fvNV(location, count, transpose, value); } +inline void glUniformMatrix4x3fvNV(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { fp_glUniformMatrix4x3fvNV(location, count, transpose, value); } + +/* GL_NV_occlusion_query */ +inline void glGenOcclusionQueriesNV(GLsizei n, GLuint* ids) { fp_glGenOcclusionQueriesNV(n, ids); } +inline void glDeleteOcclusionQueriesNV(GLsizei n, const GLuint* ids) { fp_glDeleteOcclusionQueriesNV(n, ids); } +inline GLboolean glIsOcclusionQueryNV(GLuint id) { return fp_glIsOcclusionQueryNV(id); } +inline void glBeginOcclusionQueryNV(GLuint id) { fp_glBeginOcclusionQueryNV(id); } +inline void glEndOcclusionQueryNV() { fp_glEndOcclusionQueryNV(); } +inline void glGetOcclusionQueryivNV(GLuint id, GLenum pname, GLint* params) { fp_glGetOcclusionQueryivNV(id, pname, params); } +inline void glGetOcclusionQueryuivNV(GLuint id, GLenum pname, GLuint* params) { fp_glGetOcclusionQueryuivNV(id, pname, params); } + +/* GL_NV_parameter_buffer_object */ +inline void glProgramBufferParametersfvNV(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat* params) { fp_glProgramBufferParametersfvNV(target, bindingIndex, wordIndex, count, params); } +inline void glProgramBufferParametersIivNV(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint* params) { fp_glProgramBufferParametersIivNV(target, bindingIndex, wordIndex, count, params); } +inline void glProgramBufferParametersIuivNV(GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint* params) { fp_glProgramBufferParametersIuivNV(target, bindingIndex, wordIndex, count, params); } + +/* GL_NV_path_rendering */ +inline GLuint glGenPathsNV(GLsizei range) { return fp_glGenPathsNV(range); } +inline void glDeletePathsNV(GLuint path, GLsizei range) { fp_glDeletePathsNV(path, range); } +inline GLboolean glIsPathNV(GLuint path) { return fp_glIsPathNV(path); } +inline void glPathCommandsNV(GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void* coords) { fp_glPathCommandsNV(path, numCommands, commands, numCoords, coordType, coords); } +inline void glPathCoordsNV(GLuint path, GLsizei numCoords, GLenum coordType, const void* coords) { fp_glPathCoordsNV(path, numCoords, coordType, coords); } +inline void glPathSubCommandsNV(GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void* coords) { fp_glPathSubCommandsNV(path, commandStart, commandsToDelete, numCommands, commands, numCoords, coordType, coords); } +inline void glPathSubCoordsNV(GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void* coords) { fp_glPathSubCoordsNV(path, coordStart, numCoords, coordType, coords); } +inline void glPathStringNV(GLuint path, GLenum format, GLsizei length, const void* pathString) { fp_glPathStringNV(path, format, length, pathString); } +inline void glPathGlyphsNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void* charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { fp_glPathGlyphsNV(firstPathName, fontTarget, fontName, fontStyle, numGlyphs, type, charcodes, handleMissingGlyphs, pathParameterTemplate, emScale); } +inline void glPathGlyphRangeNV(GLuint firstPathName, GLenum fontTarget, const void* fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale) { fp_glPathGlyphRangeNV(firstPathName, fontTarget, fontName, fontStyle, firstGlyph, numGlyphs, handleMissingGlyphs, pathParameterTemplate, emScale); } +inline void glWeightPathsNV(GLuint resultPath, GLsizei numPaths, const GLuint* paths, const GLfloat* weights) { fp_glWeightPathsNV(resultPath, numPaths, paths, weights); } +inline void glCopyPathNV(GLuint resultPath, GLuint srcPath) { fp_glCopyPathNV(resultPath, srcPath); } +inline void glInterpolatePathsNV(GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight) { fp_glInterpolatePathsNV(resultPath, pathA, pathB, weight); } +inline void glTransformPathNV(GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues) { fp_glTransformPathNV(resultPath, srcPath, transformType, transformValues); } +inline void glPathParameterivNV(GLuint path, GLenum pname, const GLint* value) { fp_glPathParameterivNV(path, pname, value); } +inline void glPathParameteriNV(GLuint path, GLenum pname, GLint value) { fp_glPathParameteriNV(path, pname, value); } +inline void glPathParameterfvNV(GLuint path, GLenum pname, const GLfloat* value) { fp_glPathParameterfvNV(path, pname, value); } +inline void glPathParameterfNV(GLuint path, GLenum pname, GLfloat value) { fp_glPathParameterfNV(path, pname, value); } +inline void glPathDashArrayNV(GLuint path, GLsizei dashCount, const GLfloat* dashArray) { fp_glPathDashArrayNV(path, dashCount, dashArray); } +inline void glPathStencilFuncNV(GLenum func, GLint ref, GLuint mask) { fp_glPathStencilFuncNV(func, ref, mask); } +inline void glPathStencilDepthOffsetNV(GLfloat factor, GLfloat units) { fp_glPathStencilDepthOffsetNV(factor, units); } +inline void glStencilFillPathNV(GLuint path, GLenum fillMode, GLuint mask) { fp_glStencilFillPathNV(path, fillMode, mask); } +inline void glStencilStrokePathNV(GLuint path, GLint reference, GLuint mask) { fp_glStencilStrokePathNV(path, reference, mask); } +inline void glStencilFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat* transformValues) { fp_glStencilFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, fillMode, mask, transformType, transformValues); } +inline void glStencilStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat* transformValues) { fp_glStencilStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, reference, mask, transformType, transformValues); } +inline void glPathCoverDepthFuncNV(GLenum func) { fp_glPathCoverDepthFuncNV(func); } +inline void glPathColorGenNV(GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs) { fp_glPathColorGenNV(color, genMode, colorFormat, coeffs); } +inline void glPathTexGenNV(GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs) { fp_glPathTexGenNV(texCoordSet, genMode, components, coeffs); } +inline void glPathFogGenNV(GLenum genMode) { fp_glPathFogGenNV(genMode); } +inline void glCoverFillPathNV(GLuint path, GLenum coverMode) { fp_glCoverFillPathNV(path, coverMode); } +inline void glCoverStrokePathNV(GLuint path, GLenum coverMode) { fp_glCoverStrokePathNV(path, coverMode); } +inline void glCoverFillPathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glCoverFillPathInstancedNV(numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues); } +inline void glCoverStrokePathInstancedNV(GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat* transformValues) { fp_glCoverStrokePathInstancedNV(numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues); } +inline void glGetPathParameterivNV(GLuint path, GLenum pname, GLint* value) { fp_glGetPathParameterivNV(path, pname, value); } +inline void glGetPathParameterfvNV(GLuint path, GLenum pname, GLfloat* value) { fp_glGetPathParameterfvNV(path, pname, value); } +inline void glGetPathCommandsNV(GLuint path, GLubyte* commands) { fp_glGetPathCommandsNV(path, commands); } +inline void glGetPathCoordsNV(GLuint path, GLfloat* coords) { fp_glGetPathCoordsNV(path, coords); } +inline void glGetPathDashArrayNV(GLuint path, GLfloat* dashArray) { fp_glGetPathDashArrayNV(path, dashArray); } +inline void glGetPathMetricsNV(GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLsizei stride, GLfloat* metrics) { fp_glGetPathMetricsNV(metricQueryMask, numPaths, pathNameType, paths, pathBase, stride, metrics); } +inline void glGetPathMetricRangeNV(GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics) { fp_glGetPathMetricRangeNV(metricQueryMask, firstPathName, numPaths, stride, metrics); } +inline void glGetPathSpacingNV(GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void* paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat* returnedSpacing) { fp_glGetPathSpacingNV(pathListMode, numPaths, pathNameType, paths, pathBase, advanceScale, kerningScale, transformType, returnedSpacing); } +inline void glGetPathColorGenivNV(GLenum color, GLenum pname, GLint* value) { fp_glGetPathColorGenivNV(color, pname, value); } +inline void glGetPathColorGenfvNV(GLenum color, GLenum pname, GLfloat* value) { fp_glGetPathColorGenfvNV(color, pname, value); } +inline void glGetPathTexGenivNV(GLenum texCoordSet, GLenum pname, GLint* value) { fp_glGetPathTexGenivNV(texCoordSet, pname, value); } +inline void glGetPathTexGenfvNV(GLenum texCoordSet, GLenum pname, GLfloat* value) { fp_glGetPathTexGenfvNV(texCoordSet, pname, value); } +inline GLboolean glIsPointInFillPathNV(GLuint path, GLuint mask, GLfloat x, GLfloat y) { return fp_glIsPointInFillPathNV(path, mask, x, y); } +inline GLboolean glIsPointInStrokePathNV(GLuint path, GLfloat x, GLfloat y) { return fp_glIsPointInStrokePathNV(path, x, y); } +inline GLfloat glGetPathLengthNV(GLuint path, GLsizei startSegment, GLsizei numSegments) { return fp_glGetPathLengthNV(path, startSegment, numSegments); } +inline GLboolean glPointAlongPathNV(GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat* y, GLfloat* tangentX, GLfloat* tangentY) { return fp_glPointAlongPathNV(path, startSegment, numSegments, distance, x, y, tangentX, tangentY); } + +/* GL_NV_pixel_data_range */ +inline void glPixelDataRangeNV(GLenum target, GLsizei length, const void* pointer) { fp_glPixelDataRangeNV(target, length, pointer); } +inline void glFlushPixelDataRangeNV(GLenum target) { fp_glFlushPixelDataRangeNV(target); } + +/* GL_NV_point_sprite */ +inline void glPointParameteriNV(GLenum pname, GLint param) { fp_glPointParameteriNV(pname, param); } +inline void glPointParameterivNV(GLenum pname, const GLint* params) { fp_glPointParameterivNV(pname, params); } + +/* GL_NV_present_video */ +inline void glPresentFrameKeyedNV(GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1) { fp_glPresentFrameKeyedNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, key0, target1, fill1, key1); } +inline void glPresentFrameDualFillNV(GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3) { fp_glPresentFrameDualFillNV(video_slot, minPresentTime, beginPresentTimeId, presentDurationId, type, target0, fill0, target1, fill1, target2, fill2, target3, fill3); } +inline void glGetVideoivNV(GLuint video_slot, GLenum pname, GLint* params) { fp_glGetVideoivNV(video_slot, pname, params); } +inline void glGetVideouivNV(GLuint video_slot, GLenum pname, GLuint* params) { fp_glGetVideouivNV(video_slot, pname, params); } +inline void glGetVideoi64vNV(GLuint video_slot, GLenum pname, GLint64EXT* params) { fp_glGetVideoi64vNV(video_slot, pname, params); } +inline void glGetVideoui64vNV(GLuint video_slot, GLenum pname, GLuint64EXT* params) { fp_glGetVideoui64vNV(video_slot, pname, params); } + +/* GL_NV_primitive_restart */ +inline void glPrimitiveRestartNV() { fp_glPrimitiveRestartNV(); } +inline void glPrimitiveRestartIndexNV(GLuint index) { fp_glPrimitiveRestartIndexNV(index); } + +/* GL_NV_read_buffer */ +inline void glReadBufferNV(GLenum mode) { fp_glReadBufferNV(mode); } + +/* GL_NV_register_combiners */ +inline void glCombinerParameterfvNV(GLenum pname, const GLfloat* params) { fp_glCombinerParameterfvNV(pname, params); } +inline void glCombinerParameterfNV(GLenum pname, GLfloat param) { fp_glCombinerParameterfNV(pname, param); } +inline void glCombinerParameterivNV(GLenum pname, const GLint* params) { fp_glCombinerParameterivNV(pname, params); } +inline void glCombinerParameteriNV(GLenum pname, GLint param) { fp_glCombinerParameteriNV(pname, param); } +inline void glCombinerInputNV(GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) { fp_glCombinerInputNV(stage, portion, variable, input, mapping, componentUsage); } +inline void glCombinerOutputNV(GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum) { fp_glCombinerOutputNV(stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum); } +inline void glFinalCombinerInputNV(GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage) { fp_glFinalCombinerInputNV(variable, input, mapping, componentUsage); } +inline void glGetCombinerInputParameterfvNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params) { fp_glGetCombinerInputParameterfvNV(stage, portion, variable, pname, params); } +inline void glGetCombinerInputParameterivNV(GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params) { fp_glGetCombinerInputParameterivNV(stage, portion, variable, pname, params); } +inline void glGetCombinerOutputParameterfvNV(GLenum stage, GLenum portion, GLenum pname, GLfloat* params) { fp_glGetCombinerOutputParameterfvNV(stage, portion, pname, params); } +inline void glGetCombinerOutputParameterivNV(GLenum stage, GLenum portion, GLenum pname, GLint* params) { fp_glGetCombinerOutputParameterivNV(stage, portion, pname, params); } +inline void glGetFinalCombinerInputParameterfvNV(GLenum variable, GLenum pname, GLfloat* params) { fp_glGetFinalCombinerInputParameterfvNV(variable, pname, params); } +inline void glGetFinalCombinerInputParameterivNV(GLenum variable, GLenum pname, GLint* params) { fp_glGetFinalCombinerInputParameterivNV(variable, pname, params); } + +/* GL_NV_register_combiners2 */ +inline void glCombinerStageParameterfvNV(GLenum stage, GLenum pname, const GLfloat* params) { fp_glCombinerStageParameterfvNV(stage, pname, params); } +inline void glGetCombinerStageParameterfvNV(GLenum stage, GLenum pname, GLfloat* params) { fp_glGetCombinerStageParameterfvNV(stage, pname, params); } + +/* GL_NV_shader_buffer_load */ +inline void glMakeBufferResidentNV(GLenum target, GLenum access) { fp_glMakeBufferResidentNV(target, access); } +inline void glMakeBufferNonResidentNV(GLenum target) { fp_glMakeBufferNonResidentNV(target); } +inline GLboolean glIsBufferResidentNV(GLenum target) { return fp_glIsBufferResidentNV(target); } +inline void glMakeNamedBufferResidentNV(GLuint buffer, GLenum access) { fp_glMakeNamedBufferResidentNV(buffer, access); } +inline void glMakeNamedBufferNonResidentNV(GLuint buffer) { fp_glMakeNamedBufferNonResidentNV(buffer); } +inline GLboolean glIsNamedBufferResidentNV(GLuint buffer) { return fp_glIsNamedBufferResidentNV(buffer); } +inline void glGetBufferParameterui64vNV(GLenum target, GLenum pname, GLuint64EXT* params) { fp_glGetBufferParameterui64vNV(target, pname, params); } +inline void glGetNamedBufferParameterui64vNV(GLuint buffer, GLenum pname, GLuint64EXT* params) { fp_glGetNamedBufferParameterui64vNV(buffer, pname, params); } +inline void glGetIntegerui64vNV(GLenum value, GLuint64EXT* result) { fp_glGetIntegerui64vNV(value, result); } +inline void glUniformui64NV(GLint location, GLuint64EXT value) { fp_glUniformui64NV(location, value); } +inline void glUniformui64vNV(GLint location, GLsizei count, const GLuint64EXT* value) { fp_glUniformui64vNV(location, count, value); } +inline void glGetUniformui64vNV(GLuint program, GLint location, GLuint64EXT* params) { fp_glGetUniformui64vNV(program, location, params); } +inline void glProgramUniformui64NV(GLuint program, GLint location, GLuint64EXT value) { fp_glProgramUniformui64NV(program, location, value); } +inline void glProgramUniformui64vNV(GLuint program, GLint location, GLsizei count, const GLuint64EXT* value) { fp_glProgramUniformui64vNV(program, location, count, value); } + +/* GL_NV_texture_barrier */ +inline void glTextureBarrierNV() { fp_glTextureBarrierNV(); } + +/* GL_NV_texture_multisample */ +inline void glTexImage2DMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { fp_glTexImage2DMultisampleCoverageNV(target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations); } +inline void glTexImage3DMultisampleCoverageNV(GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { fp_glTexImage3DMultisampleCoverageNV(target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations); } +inline void glTextureImage2DMultisampleNV(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { fp_glTextureImage2DMultisampleNV(texture, target, samples, internalFormat, width, height, fixedSampleLocations); } +inline void glTextureImage3DMultisampleNV(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { fp_glTextureImage3DMultisampleNV(texture, target, samples, internalFormat, width, height, depth, fixedSampleLocations); } +inline void glTextureImage2DMultisampleCoverageNV(GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations) { fp_glTextureImage2DMultisampleCoverageNV(texture, target, coverageSamples, colorSamples, internalFormat, width, height, fixedSampleLocations); } +inline void glTextureImage3DMultisampleCoverageNV(GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations) { fp_glTextureImage3DMultisampleCoverageNV(texture, target, coverageSamples, colorSamples, internalFormat, width, height, depth, fixedSampleLocations); } + +/* GL_NV_transform_feedback */ +inline void glBeginTransformFeedbackNV(GLenum primitiveMode) { fp_glBeginTransformFeedbackNV(primitiveMode); } +inline void glEndTransformFeedbackNV() { fp_glEndTransformFeedbackNV(); } +inline void glTransformFeedbackAttribsNV(GLuint count, const GLint* attribs, GLenum bufferMode) { fp_glTransformFeedbackAttribsNV(count, attribs, bufferMode); } +inline void glBindBufferRangeNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size) { fp_glBindBufferRangeNV(target, index, buffer, offset, size); } +inline void glBindBufferOffsetNV(GLenum target, GLuint index, GLuint buffer, GLintptr offset) { fp_glBindBufferOffsetNV(target, index, buffer, offset); } +inline void glBindBufferBaseNV(GLenum target, GLuint index, GLuint buffer) { fp_glBindBufferBaseNV(target, index, buffer); } +inline void glTransformFeedbackVaryingsNV(GLuint program, GLsizei count, const GLint* locations, GLenum bufferMode) { fp_glTransformFeedbackVaryingsNV(program, count, locations, bufferMode); } +inline void glActiveVaryingNV(GLuint program, const GLchar* name) { fp_glActiveVaryingNV(program, name); } +inline GLint glGetVaryingLocationNV(GLuint program, const GLchar* name) { return fp_glGetVaryingLocationNV(program, name); } +inline void glGetActiveVaryingNV(GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name) { fp_glGetActiveVaryingNV(program, index, bufSize, length, size, type, name); } +inline void glGetTransformFeedbackVaryingNV(GLuint program, GLuint index, GLint* location) { fp_glGetTransformFeedbackVaryingNV(program, index, location); } +inline void glTransformFeedbackStreamAttribsNV(GLsizei count, const GLint* attribs, GLsizei nbuffers, const GLint* bufstreams, GLenum bufferMode) { fp_glTransformFeedbackStreamAttribsNV(count, attribs, nbuffers, bufstreams, bufferMode); } + +/* GL_NV_transform_feedback2 */ +inline void glBindTransformFeedbackNV(GLenum target, GLuint id) { fp_glBindTransformFeedbackNV(target, id); } +inline void glDeleteTransformFeedbacksNV(GLsizei n, const GLuint* ids) { fp_glDeleteTransformFeedbacksNV(n, ids); } +inline void glGenTransformFeedbacksNV(GLsizei n, GLuint* ids) { fp_glGenTransformFeedbacksNV(n, ids); } +inline GLboolean glIsTransformFeedbackNV(GLuint id) { return fp_glIsTransformFeedbackNV(id); } +inline void glPauseTransformFeedbackNV() { fp_glPauseTransformFeedbackNV(); } +inline void glResumeTransformFeedbackNV() { fp_glResumeTransformFeedbackNV(); } +inline void glDrawTransformFeedbackNV(GLenum mode, GLuint id) { fp_glDrawTransformFeedbackNV(mode, id); } + +/* GL_NV_vdpau_interop */ +inline void glVDPAUInitNV(const void* vdpDevice, const void* getProcAddress) { fp_glVDPAUInitNV(vdpDevice, getProcAddress); } +inline void glVDPAUFiniNV() { fp_glVDPAUFiniNV(); } +inline GLvdpauSurfaceNV glVDPAURegisterVideoSurfaceNV(const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint* textureNames) { return fp_glVDPAURegisterVideoSurfaceNV(vdpSurface, target, numTextureNames, textureNames); } +inline GLvdpauSurfaceNV glVDPAURegisterOutputSurfaceNV(const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint* textureNames) { return fp_glVDPAURegisterOutputSurfaceNV(vdpSurface, target, numTextureNames, textureNames); } +inline void glVDPAUIsSurfaceNV(GLvdpauSurfaceNV surface) { fp_glVDPAUIsSurfaceNV(surface); } +inline void glVDPAUUnregisterSurfaceNV(GLvdpauSurfaceNV surface) { fp_glVDPAUUnregisterSurfaceNV(surface); } +inline void glVDPAUGetSurfaceivNV(GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) { fp_glVDPAUGetSurfaceivNV(surface, pname, bufSize, length, values); } +inline void glVDPAUSurfaceAccessNV(GLvdpauSurfaceNV surface, GLenum access) { fp_glVDPAUSurfaceAccessNV(surface, access); } +inline void glVDPAUMapSurfacesNV(GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces) { fp_glVDPAUMapSurfacesNV(numSurfaces, surfaces); } +inline void glVDPAUUnmapSurfacesNV(GLsizei numSurface, const GLvdpauSurfaceNV* surfaces) { fp_glVDPAUUnmapSurfacesNV(numSurface, surfaces); } + +/* GL_NV_vertex_array_range */ +inline void glFlushVertexArrayRangeNV() { fp_glFlushVertexArrayRangeNV(); } +inline void glVertexArrayRangeNV(GLsizei length, const void* pointer) { fp_glVertexArrayRangeNV(length, pointer); } + +/* GL_NV_vertex_attrib_integer_64bit */ +inline void glVertexAttribL1i64NV(GLuint index, GLint64EXT x) { fp_glVertexAttribL1i64NV(index, x); } +inline void glVertexAttribL2i64NV(GLuint index, GLint64EXT x, GLint64EXT y) { fp_glVertexAttribL2i64NV(index, x, y); } +inline void glVertexAttribL3i64NV(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z) { fp_glVertexAttribL3i64NV(index, x, y, z); } +inline void glVertexAttribL4i64NV(GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w) { fp_glVertexAttribL4i64NV(index, x, y, z, w); } +inline void glVertexAttribL1i64vNV(GLuint index, const GLint64EXT* v) { fp_glVertexAttribL1i64vNV(index, v); } +inline void glVertexAttribL2i64vNV(GLuint index, const GLint64EXT* v) { fp_glVertexAttribL2i64vNV(index, v); } +inline void glVertexAttribL3i64vNV(GLuint index, const GLint64EXT* v) { fp_glVertexAttribL3i64vNV(index, v); } +inline void glVertexAttribL4i64vNV(GLuint index, const GLint64EXT* v) { fp_glVertexAttribL4i64vNV(index, v); } +inline void glVertexAttribL1ui64NV(GLuint index, GLuint64EXT x) { fp_glVertexAttribL1ui64NV(index, x); } +inline void glVertexAttribL2ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y) { fp_glVertexAttribL2ui64NV(index, x, y); } +inline void glVertexAttribL3ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z) { fp_glVertexAttribL3ui64NV(index, x, y, z); } +inline void glVertexAttribL4ui64NV(GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w) { fp_glVertexAttribL4ui64NV(index, x, y, z, w); } +inline void glVertexAttribL1ui64vNV(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL1ui64vNV(index, v); } +inline void glVertexAttribL2ui64vNV(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL2ui64vNV(index, v); } +inline void glVertexAttribL3ui64vNV(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL3ui64vNV(index, v); } +inline void glVertexAttribL4ui64vNV(GLuint index, const GLuint64EXT* v) { fp_glVertexAttribL4ui64vNV(index, v); } +inline void glGetVertexAttribLi64vNV(GLuint index, GLenum pname, GLint64EXT* params) { fp_glGetVertexAttribLi64vNV(index, pname, params); } +inline void glGetVertexAttribLui64vNV(GLuint index, GLenum pname, GLuint64EXT* params) { fp_glGetVertexAttribLui64vNV(index, pname, params); } +inline void glVertexAttribLFormatNV(GLuint index, GLint size, GLenum type, GLsizei stride) { fp_glVertexAttribLFormatNV(index, size, type, stride); } + +/* GL_NV_vertex_buffer_unified_memory */ +inline void glBufferAddressRangeNV(GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length) { fp_glBufferAddressRangeNV(pname, index, address, length); } +inline void glVertexFormatNV(GLint size, GLenum type, GLsizei stride) { fp_glVertexFormatNV(size, type, stride); } +inline void glNormalFormatNV(GLenum type, GLsizei stride) { fp_glNormalFormatNV(type, stride); } +inline void glColorFormatNV(GLint size, GLenum type, GLsizei stride) { fp_glColorFormatNV(size, type, stride); } +inline void glIndexFormatNV(GLenum type, GLsizei stride) { fp_glIndexFormatNV(type, stride); } +inline void glTexCoordFormatNV(GLint size, GLenum type, GLsizei stride) { fp_glTexCoordFormatNV(size, type, stride); } +inline void glEdgeFlagFormatNV(GLsizei stride) { fp_glEdgeFlagFormatNV(stride); } +inline void glSecondaryColorFormatNV(GLint size, GLenum type, GLsizei stride) { fp_glSecondaryColorFormatNV(size, type, stride); } +inline void glFogCoordFormatNV(GLenum type, GLsizei stride) { fp_glFogCoordFormatNV(type, stride); } +inline void glVertexAttribFormatNV(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride) { fp_glVertexAttribFormatNV(index, size, type, normalized, stride); } +inline void glVertexAttribIFormatNV(GLuint index, GLint size, GLenum type, GLsizei stride) { fp_glVertexAttribIFormatNV(index, size, type, stride); } +inline void glGetIntegerui64i_vNV(GLenum value, GLuint index, GLuint64EXT* result) { fp_glGetIntegerui64i_vNV(value, index, result); } + +/* GL_NV_vertex_program */ +inline GLboolean glAreProgramsResidentNV(GLsizei n, const GLuint* programs, GLboolean* residences) { return fp_glAreProgramsResidentNV(n, programs, residences); } +inline void glBindProgramNV(GLenum target, GLuint id) { fp_glBindProgramNV(target, id); } +inline void glDeleteProgramsNV(GLsizei n, const GLuint* programs) { fp_glDeleteProgramsNV(n, programs); } +inline void glExecuteProgramNV(GLenum target, GLuint id, const GLfloat* params) { fp_glExecuteProgramNV(target, id, params); } +inline void glGenProgramsNV(GLsizei n, GLuint* programs) { fp_glGenProgramsNV(n, programs); } +inline void glGetProgramParameterdvNV(GLenum target, GLuint index, GLenum pname, GLdouble* params) { fp_glGetProgramParameterdvNV(target, index, pname, params); } +inline void glGetProgramParameterfvNV(GLenum target, GLuint index, GLenum pname, GLfloat* params) { fp_glGetProgramParameterfvNV(target, index, pname, params); } +inline void glGetProgramivNV(GLuint id, GLenum pname, GLint* params) { fp_glGetProgramivNV(id, pname, params); } +inline void glGetProgramStringNV(GLuint id, GLenum pname, GLubyte* program) { fp_glGetProgramStringNV(id, pname, program); } +inline void glGetTrackMatrixivNV(GLenum target, GLuint address, GLenum pname, GLint* params) { fp_glGetTrackMatrixivNV(target, address, pname, params); } +inline void glGetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble* params) { fp_glGetVertexAttribdvNV(index, pname, params); } +inline void glGetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat* params) { fp_glGetVertexAttribfvNV(index, pname, params); } +inline void glGetVertexAttribivNV(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribivNV(index, pname, params); } +inline void glGetVertexAttribPointervNV(GLuint index, GLenum pname, void** pointer) { fp_glGetVertexAttribPointervNV(index, pname, pointer); } +inline GLboolean glIsProgramNV(GLuint id) { return fp_glIsProgramNV(id); } +inline void glLoadProgramNV(GLenum target, GLuint id, GLsizei len, const GLubyte* program) { fp_glLoadProgramNV(target, id, len, program); } +inline void glProgramParameter4dNV(GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glProgramParameter4dNV(target, index, x, y, z, w); } +inline void glProgramParameter4dvNV(GLenum target, GLuint index, const GLdouble* v) { fp_glProgramParameter4dvNV(target, index, v); } +inline void glProgramParameter4fNV(GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glProgramParameter4fNV(target, index, x, y, z, w); } +inline void glProgramParameter4fvNV(GLenum target, GLuint index, const GLfloat* v) { fp_glProgramParameter4fvNV(target, index, v); } +inline void glProgramParameters4dvNV(GLenum target, GLuint index, GLsizei count, const GLdouble* v) { fp_glProgramParameters4dvNV(target, index, count, v); } +inline void glProgramParameters4fvNV(GLenum target, GLuint index, GLsizei count, const GLfloat* v) { fp_glProgramParameters4fvNV(target, index, count, v); } +inline void glRequestResidentProgramsNV(GLsizei n, const GLuint* programs) { fp_glRequestResidentProgramsNV(n, programs); } +inline void glTrackMatrixNV(GLenum target, GLuint address, GLenum matrix, GLenum transform) { fp_glTrackMatrixNV(target, address, matrix, transform); } +inline void glVertexAttribPointerNV(GLuint index, GLint fsize, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribPointerNV(index, fsize, type, stride, pointer); } +inline void glVertexAttrib1dNV(GLuint index, GLdouble x) { fp_glVertexAttrib1dNV(index, x); } +inline void glVertexAttrib1dvNV(GLuint index, const GLdouble* v) { fp_glVertexAttrib1dvNV(index, v); } +inline void glVertexAttrib1fNV(GLuint index, GLfloat x) { fp_glVertexAttrib1fNV(index, x); } +inline void glVertexAttrib1fvNV(GLuint index, const GLfloat* v) { fp_glVertexAttrib1fvNV(index, v); } +inline void glVertexAttrib1sNV(GLuint index, GLshort x) { fp_glVertexAttrib1sNV(index, x); } +inline void glVertexAttrib1svNV(GLuint index, const GLshort* v) { fp_glVertexAttrib1svNV(index, v); } +inline void glVertexAttrib2dNV(GLuint index, GLdouble x, GLdouble y) { fp_glVertexAttrib2dNV(index, x, y); } +inline void glVertexAttrib2dvNV(GLuint index, const GLdouble* v) { fp_glVertexAttrib2dvNV(index, v); } +inline void glVertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y) { fp_glVertexAttrib2fNV(index, x, y); } +inline void glVertexAttrib2fvNV(GLuint index, const GLfloat* v) { fp_glVertexAttrib2fvNV(index, v); } +inline void glVertexAttrib2sNV(GLuint index, GLshort x, GLshort y) { fp_glVertexAttrib2sNV(index, x, y); } +inline void glVertexAttrib2svNV(GLuint index, const GLshort* v) { fp_glVertexAttrib2svNV(index, v); } +inline void glVertexAttrib3dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z) { fp_glVertexAttrib3dNV(index, x, y, z); } +inline void glVertexAttrib3dvNV(GLuint index, const GLdouble* v) { fp_glVertexAttrib3dvNV(index, v); } +inline void glVertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z) { fp_glVertexAttrib3fNV(index, x, y, z); } +inline void glVertexAttrib3fvNV(GLuint index, const GLfloat* v) { fp_glVertexAttrib3fvNV(index, v); } +inline void glVertexAttrib3sNV(GLuint index, GLshort x, GLshort y, GLshort z) { fp_glVertexAttrib3sNV(index, x, y, z); } +inline void glVertexAttrib3svNV(GLuint index, const GLshort* v) { fp_glVertexAttrib3svNV(index, v); } +inline void glVertexAttrib4dNV(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w) { fp_glVertexAttrib4dNV(index, x, y, z, w); } +inline void glVertexAttrib4dvNV(GLuint index, const GLdouble* v) { fp_glVertexAttrib4dvNV(index, v); } +inline void glVertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { fp_glVertexAttrib4fNV(index, x, y, z, w); } +inline void glVertexAttrib4fvNV(GLuint index, const GLfloat* v) { fp_glVertexAttrib4fvNV(index, v); } +inline void glVertexAttrib4sNV(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w) { fp_glVertexAttrib4sNV(index, x, y, z, w); } +inline void glVertexAttrib4svNV(GLuint index, const GLshort* v) { fp_glVertexAttrib4svNV(index, v); } +inline void glVertexAttrib4ubNV(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w) { fp_glVertexAttrib4ubNV(index, x, y, z, w); } +inline void glVertexAttrib4ubvNV(GLuint index, const GLubyte* v) { fp_glVertexAttrib4ubvNV(index, v); } +inline void glVertexAttribs1dvNV(GLuint index, GLsizei count, const GLdouble* v) { fp_glVertexAttribs1dvNV(index, count, v); } +inline void glVertexAttribs1fvNV(GLuint index, GLsizei count, const GLfloat* v) { fp_glVertexAttribs1fvNV(index, count, v); } +inline void glVertexAttribs1svNV(GLuint index, GLsizei count, const GLshort* v) { fp_glVertexAttribs1svNV(index, count, v); } +inline void glVertexAttribs2dvNV(GLuint index, GLsizei count, const GLdouble* v) { fp_glVertexAttribs2dvNV(index, count, v); } +inline void glVertexAttribs2fvNV(GLuint index, GLsizei count, const GLfloat* v) { fp_glVertexAttribs2fvNV(index, count, v); } +inline void glVertexAttribs2svNV(GLuint index, GLsizei count, const GLshort* v) { fp_glVertexAttribs2svNV(index, count, v); } +inline void glVertexAttribs3dvNV(GLuint index, GLsizei count, const GLdouble* v) { fp_glVertexAttribs3dvNV(index, count, v); } +inline void glVertexAttribs3fvNV(GLuint index, GLsizei count, const GLfloat* v) { fp_glVertexAttribs3fvNV(index, count, v); } +inline void glVertexAttribs3svNV(GLuint index, GLsizei count, const GLshort* v) { fp_glVertexAttribs3svNV(index, count, v); } +inline void glVertexAttribs4dvNV(GLuint index, GLsizei count, const GLdouble* v) { fp_glVertexAttribs4dvNV(index, count, v); } +inline void glVertexAttribs4fvNV(GLuint index, GLsizei count, const GLfloat* v) { fp_glVertexAttribs4fvNV(index, count, v); } +inline void glVertexAttribs4svNV(GLuint index, GLsizei count, const GLshort* v) { fp_glVertexAttribs4svNV(index, count, v); } +inline void glVertexAttribs4ubvNV(GLuint index, GLsizei count, const GLubyte* v) { fp_glVertexAttribs4ubvNV(index, count, v); } + +/* GL_NV_vertex_program4 */ +inline void glVertexAttribI1iEXT(GLuint index, GLint x) { fp_glVertexAttribI1iEXT(index, x); } +inline void glVertexAttribI2iEXT(GLuint index, GLint x, GLint y) { fp_glVertexAttribI2iEXT(index, x, y); } +inline void glVertexAttribI3iEXT(GLuint index, GLint x, GLint y, GLint z) { fp_glVertexAttribI3iEXT(index, x, y, z); } +inline void glVertexAttribI4iEXT(GLuint index, GLint x, GLint y, GLint z, GLint w) { fp_glVertexAttribI4iEXT(index, x, y, z, w); } +inline void glVertexAttribI1uiEXT(GLuint index, GLuint x) { fp_glVertexAttribI1uiEXT(index, x); } +inline void glVertexAttribI2uiEXT(GLuint index, GLuint x, GLuint y) { fp_glVertexAttribI2uiEXT(index, x, y); } +inline void glVertexAttribI3uiEXT(GLuint index, GLuint x, GLuint y, GLuint z) { fp_glVertexAttribI3uiEXT(index, x, y, z); } +inline void glVertexAttribI4uiEXT(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w) { fp_glVertexAttribI4uiEXT(index, x, y, z, w); } +inline void glVertexAttribI1ivEXT(GLuint index, const GLint* v) { fp_glVertexAttribI1ivEXT(index, v); } +inline void glVertexAttribI2ivEXT(GLuint index, const GLint* v) { fp_glVertexAttribI2ivEXT(index, v); } +inline void glVertexAttribI3ivEXT(GLuint index, const GLint* v) { fp_glVertexAttribI3ivEXT(index, v); } +inline void glVertexAttribI4ivEXT(GLuint index, const GLint* v) { fp_glVertexAttribI4ivEXT(index, v); } +inline void glVertexAttribI1uivEXT(GLuint index, const GLuint* v) { fp_glVertexAttribI1uivEXT(index, v); } +inline void glVertexAttribI2uivEXT(GLuint index, const GLuint* v) { fp_glVertexAttribI2uivEXT(index, v); } +inline void glVertexAttribI3uivEXT(GLuint index, const GLuint* v) { fp_glVertexAttribI3uivEXT(index, v); } +inline void glVertexAttribI4uivEXT(GLuint index, const GLuint* v) { fp_glVertexAttribI4uivEXT(index, v); } +inline void glVertexAttribI4bvEXT(GLuint index, const GLbyte* v) { fp_glVertexAttribI4bvEXT(index, v); } +inline void glVertexAttribI4svEXT(GLuint index, const GLshort* v) { fp_glVertexAttribI4svEXT(index, v); } +inline void glVertexAttribI4ubvEXT(GLuint index, const GLubyte* v) { fp_glVertexAttribI4ubvEXT(index, v); } +inline void glVertexAttribI4usvEXT(GLuint index, const GLushort* v) { fp_glVertexAttribI4usvEXT(index, v); } +inline void glVertexAttribIPointerEXT(GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer) { fp_glVertexAttribIPointerEXT(index, size, type, stride, pointer); } +inline void glGetVertexAttribIivEXT(GLuint index, GLenum pname, GLint* params) { fp_glGetVertexAttribIivEXT(index, pname, params); } +inline void glGetVertexAttribIuivEXT(GLuint index, GLenum pname, GLuint* params) { fp_glGetVertexAttribIuivEXT(index, pname, params); } + +/* GL_NV_video_capture */ +inline void glBeginVideoCaptureNV(GLuint video_capture_slot) { fp_glBeginVideoCaptureNV(video_capture_slot); } +inline void glBindVideoCaptureStreamBufferNV(GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset) { fp_glBindVideoCaptureStreamBufferNV(video_capture_slot, stream, frame_region, offset); } +inline void glBindVideoCaptureStreamTextureNV(GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture) { fp_glBindVideoCaptureStreamTextureNV(video_capture_slot, stream, frame_region, target, texture); } +inline void glEndVideoCaptureNV(GLuint video_capture_slot) { fp_glEndVideoCaptureNV(video_capture_slot); } +inline void glGetVideoCaptureivNV(GLuint video_capture_slot, GLenum pname, GLint* params) { fp_glGetVideoCaptureivNV(video_capture_slot, pname, params); } +inline void glGetVideoCaptureStreamivNV(GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params) { fp_glGetVideoCaptureStreamivNV(video_capture_slot, stream, pname, params); } +inline void glGetVideoCaptureStreamfvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params) { fp_glGetVideoCaptureStreamfvNV(video_capture_slot, stream, pname, params); } +inline void glGetVideoCaptureStreamdvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params) { fp_glGetVideoCaptureStreamdvNV(video_capture_slot, stream, pname, params); } +inline GLenum glVideoCaptureNV(GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT* capture_time) { return fp_glVideoCaptureNV(video_capture_slot, sequence_num, capture_time); } +inline void glVideoCaptureStreamParameterivNV(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params) { fp_glVideoCaptureStreamParameterivNV(video_capture_slot, stream, pname, params); } +inline void glVideoCaptureStreamParameterfvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params) { fp_glVideoCaptureStreamParameterfvNV(video_capture_slot, stream, pname, params); } +inline void glVideoCaptureStreamParameterdvNV(GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params) { fp_glVideoCaptureStreamParameterdvNV(video_capture_slot, stream, pname, params); } + +/* GL_NVX_conditional_render */ +inline void glBeginConditionalRenderNVX(GLuint id) { fp_glBeginConditionalRenderNVX(id); } +inline void glEndConditionalRenderNVX() { fp_glEndConditionalRenderNVX(); } + +/* GL_PGI_misc_hints */ +inline void glHintPGI(GLenum target, GLint mode) { fp_glHintPGI(target, mode); } + +/* GL_QCOM_alpha_test */ +inline void glAlphaFuncQCOM(GLenum func, GLclampf ref) { fp_glAlphaFuncQCOM(func, ref); } + +/* GL_QCOM_driver_control */ +inline void glGetDriverControlsQCOM(GLint* num, GLsizei size, GLuint* driverControls) { fp_glGetDriverControlsQCOM(num, size, driverControls); } +inline void glGetDriverControlStringQCOM(GLuint driverControl, GLsizei bufSize, GLsizei* length, GLchar* driverControlString) { fp_glGetDriverControlStringQCOM(driverControl, bufSize, length, driverControlString); } +inline void glEnableDriverControlQCOM(GLuint driverControl) { fp_glEnableDriverControlQCOM(driverControl); } +inline void glDisableDriverControlQCOM(GLuint driverControl) { fp_glDisableDriverControlQCOM(driverControl); } + +/* GL_QCOM_extended_get */ +inline void glExtGetTexturesQCOM(GLuint* textures, GLint maxTextures, GLint* numTextures) { fp_glExtGetTexturesQCOM(textures, maxTextures, numTextures); } +inline void glExtGetBuffersQCOM(GLuint* buffers, GLint maxBuffers, GLint* numBuffers) { fp_glExtGetBuffersQCOM(buffers, maxBuffers, numBuffers); } +inline void glExtGetRenderbuffersQCOM(GLuint* renderbuffers, GLint maxRenderbuffers, GLint* numRenderbuffers) { fp_glExtGetRenderbuffersQCOM(renderbuffers, maxRenderbuffers, numRenderbuffers); } +inline void glExtGetFramebuffersQCOM(GLuint* framebuffers, GLint maxFramebuffers, GLint* numFramebuffers) { fp_glExtGetFramebuffersQCOM(framebuffers, maxFramebuffers, numFramebuffers); } +inline void glExtGetTexLevelParameterivQCOM(GLuint texture, GLenum face, GLint level, GLenum pname, GLint* params) { fp_glExtGetTexLevelParameterivQCOM(texture, face, level, pname, params); } +inline void glExtTexObjectStateOverrideiQCOM(GLenum target, GLenum pname, GLint param) { fp_glExtTexObjectStateOverrideiQCOM(target, pname, param); } +inline void glExtGetTexSubImageQCOM(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void* texels) { fp_glExtGetTexSubImageQCOM(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texels); } +inline void glExtGetBufferPointervQCOM(GLenum target, void** params) { fp_glExtGetBufferPointervQCOM(target, params); } + +/* GL_QCOM_extended_get2 */ +inline void glExtGetShadersQCOM(GLuint* shaders, GLint maxShaders, GLint* numShaders) { fp_glExtGetShadersQCOM(shaders, maxShaders, numShaders); } +inline void glExtGetProgramsQCOM(GLuint* programs, GLint maxPrograms, GLint* numPrograms) { fp_glExtGetProgramsQCOM(programs, maxPrograms, numPrograms); } +inline GLboolean glExtIsProgramBinaryQCOM(GLuint program) { return fp_glExtIsProgramBinaryQCOM(program); } +inline void glExtGetProgramBinarySourceQCOM(GLuint program, GLenum shadertype, GLchar* source, GLint* length) { fp_glExtGetProgramBinarySourceQCOM(program, shadertype, source, length); } + +/* GL_QCOM_tiled_rendering */ +inline void glStartTilingQCOM(GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask) { fp_glStartTilingQCOM(x, y, width, height, preserveMask); } +inline void glEndTilingQCOM(GLbitfield preserveMask) { fp_glEndTilingQCOM(preserveMask); } + +} /* namespace glad */ + +#endif /* __glad_funcs_hpp_ */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/auxiliar.c b/jni/love/src/libraries/luasocket/libluasocket/auxiliar.c new file mode 100644 index 00000000..95149701 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/auxiliar.c @@ -0,0 +1,149 @@ +/*=========================================================================*\ +* Auxiliar routines for class hierarchy manipulation +* LuaSocket toolkit +* +* RCS ID: $Id: auxiliar.c,v 1.14 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include +#include + +#include "auxiliar.h" + +/*=========================================================================*\ +* Exported functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Initializes the module +\*-------------------------------------------------------------------------*/ +int auxiliar_open(lua_State *L) { + (void) L; + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Creates a new class with given methods +* Methods whose names start with __ are passed directly to the metatable. +\*-------------------------------------------------------------------------*/ +void auxiliar_newclass(lua_State *L, const char *classname, luaL_reg *func) { + luaL_newmetatable(L, classname); /* mt */ + /* create __index table to place methods */ + lua_pushstring(L, "__index"); /* mt,"__index" */ + lua_newtable(L); /* mt,"__index",it */ + /* put class name into class metatable */ + lua_pushstring(L, "class"); /* mt,"__index",it,"class" */ + lua_pushstring(L, classname); /* mt,"__index",it,"class",classname */ + lua_rawset(L, -3); /* mt,"__index",it */ + /* pass all methods that start with _ to the metatable, and all others + * to the index table */ + for (; func->name; func++) { /* mt,"__index",it */ + lua_pushstring(L, func->name); + lua_pushcfunction(L, func->func); + lua_rawset(L, func->name[0] == '_' ? -5: -3); + } + lua_rawset(L, -3); /* mt */ + lua_pop(L, 1); +} + +/*-------------------------------------------------------------------------*\ +* Prints the value of a class in a nice way +\*-------------------------------------------------------------------------*/ +int auxiliar_tostring(lua_State *L) { + char buf[32]; + if (!lua_getmetatable(L, 1)) goto error; + lua_pushstring(L, "__index"); + lua_gettable(L, -2); + if (!lua_istable(L, -1)) goto error; + lua_pushstring(L, "class"); + lua_gettable(L, -2); + if (!lua_isstring(L, -1)) goto error; + sprintf(buf, "%p", lua_touserdata(L, 1)); + lua_pushfstring(L, "%s: %s", lua_tostring(L, -1), buf); + return 1; +error: + lua_pushstring(L, "invalid object passed to 'auxiliar.c:__tostring'"); + lua_error(L); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Insert class into group +\*-------------------------------------------------------------------------*/ +void auxiliar_add2group(lua_State *L, const char *classname, const char *groupname) { + luaL_getmetatable(L, classname); + lua_pushstring(L, groupname); + lua_pushboolean(L, 1); + lua_rawset(L, -3); + lua_pop(L, 1); +} + +/*-------------------------------------------------------------------------*\ +* Make sure argument is a boolean +\*-------------------------------------------------------------------------*/ +int auxiliar_checkboolean(lua_State *L, int objidx) { + if (!lua_isboolean(L, objidx)) + luaL_typerror(L, objidx, lua_typename(L, LUA_TBOOLEAN)); + return lua_toboolean(L, objidx); +} + +/*-------------------------------------------------------------------------*\ +* Return userdata pointer if object belongs to a given class, abort with +* error otherwise +\*-------------------------------------------------------------------------*/ +void *auxiliar_checkclass(lua_State *L, const char *classname, int objidx) { + void *data = auxiliar_getclassudata(L, classname, objidx); + if (!data) { + char msg[45]; + sprintf(msg, "%.35s expected", classname); + luaL_argerror(L, objidx, msg); + } + return data; +} + +/*-------------------------------------------------------------------------*\ +* Return userdata pointer if object belongs to a given group, abort with +* error otherwise +\*-------------------------------------------------------------------------*/ +void *auxiliar_checkgroup(lua_State *L, const char *groupname, int objidx) { + void *data = auxiliar_getgroupudata(L, groupname, objidx); + if (!data) { + char msg[45]; + sprintf(msg, "%.35s expected", groupname); + luaL_argerror(L, objidx, msg); + } + return data; +} + +/*-------------------------------------------------------------------------*\ +* Set object class +\*-------------------------------------------------------------------------*/ +void auxiliar_setclass(lua_State *L, const char *classname, int objidx) { + luaL_getmetatable(L, classname); + if (objidx < 0) objidx--; + lua_setmetatable(L, objidx); +} + +/*-------------------------------------------------------------------------*\ +* Get a userdata pointer if object belongs to a given group. Return NULL +* otherwise +\*-------------------------------------------------------------------------*/ +void *auxiliar_getgroupudata(lua_State *L, const char *groupname, int objidx) { + if (!lua_getmetatable(L, objidx)) + return NULL; + lua_pushstring(L, groupname); + lua_rawget(L, -2); + if (lua_isnil(L, -1)) { + lua_pop(L, 2); + return NULL; + } else { + lua_pop(L, 2); + return lua_touserdata(L, objidx); + } +} + +/*-------------------------------------------------------------------------*\ +* Get a userdata pointer if object belongs to a given class. Return NULL +* otherwise +\*-------------------------------------------------------------------------*/ +void *auxiliar_getclassudata(lua_State *L, const char *classname, int objidx) { + return luaL_checkudata(L, objidx, classname); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/auxiliar.h b/jni/love/src/libraries/luasocket/libluasocket/auxiliar.h new file mode 100644 index 00000000..18b84955 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/auxiliar.h @@ -0,0 +1,48 @@ +#ifndef AUXILIAR_H +#define AUXILIAR_H +/*=========================================================================*\ +* Auxiliar routines for class hierarchy manipulation +* LuaSocket toolkit (but completely independent of other LuaSocket modules) +* +* A LuaSocket class is a name associated with Lua metatables. A LuaSocket +* group is a name associated with a class. A class can belong to any number +* of groups. This module provides the functionality to: +* +* - create new classes +* - add classes to groups +* - set the class of objects +* - check if an object belongs to a given class or group +* - get the userdata associated to objects +* - print objects in a pretty way +* +* LuaSocket class names follow the convention {}. Modules +* can define any number of classes and groups. The module tcp.c, for +* example, defines the classes tcp{master}, tcp{client} and tcp{server} and +* the groups tcp{client,server} and tcp{any}. Module functions can then +* perform type-checking on their arguments by either class or group. +* +* LuaSocket metatables define the __index metamethod as being a table. This +* table has one field for each method supported by the class, and a field +* "class" with the class name. +* +* The mapping from class name to the corresponding metatable and the +* reverse mapping are done using lauxlib. +* +* RCS ID: $Id: auxiliar.h,v 1.9 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ + +#include "lua.h" +#include "lauxlib.h" + +int auxiliar_open(lua_State *L); +void auxiliar_newclass(lua_State *L, const char *classname, luaL_reg *func); +void auxiliar_add2group(lua_State *L, const char *classname, const char *group); +void auxiliar_setclass(lua_State *L, const char *classname, int objidx); +void *auxiliar_checkclass(lua_State *L, const char *classname, int objidx); +void *auxiliar_checkgroup(lua_State *L, const char *groupname, int objidx); +void *auxiliar_getclassudata(lua_State *L, const char *groupname, int objidx); +void *auxiliar_getgroupudata(lua_State *L, const char *groupname, int objidx); +int auxiliar_checkboolean(lua_State *L, int objidx); +int auxiliar_tostring(lua_State *L); + +#endif /* AUXILIAR_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/buffer.c b/jni/love/src/libraries/luasocket/libluasocket/buffer.c new file mode 100644 index 00000000..73f4ffa8 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/buffer.c @@ -0,0 +1,268 @@ +/*=========================================================================*\ +* Input/Output interface for Lua programs +* LuaSocket toolkit +* +* RCS ID: $Id: buffer.c,v 1.28 2007/06/11 23:44:54 diego Exp $ +\*=========================================================================*/ +#include "lua.h" +#include "lauxlib.h" + +#include "buffer.h" + +/*=========================================================================*\ +* Internal function prototypes +\*=========================================================================*/ +static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b); +static int recvline(p_buffer buf, luaL_Buffer *b); +static int recvall(p_buffer buf, luaL_Buffer *b); +static int buffer_get(p_buffer buf, const char **data, size_t *count); +static void buffer_skip(p_buffer buf, size_t count); +static int sendraw(p_buffer buf, const char *data, size_t count, size_t *sent); + +/* min and max macros */ +#ifndef MIN +#define MIN(x, y) ((x) < (y) ? x : y) +#endif +#ifndef MAX +#define MAX(x, y) ((x) > (y) ? x : y) +#endif + +/*=========================================================================*\ +* Exported functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int buffer_open(lua_State *L) { + (void) L; + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Initializes C structure +\*-------------------------------------------------------------------------*/ +void buffer_init(p_buffer buf, p_io io, p_timeout tm) { + buf->first = buf->last = 0; + buf->io = io; + buf->tm = tm; + buf->received = buf->sent = 0; + buf->birthday = timeout_gettime(); +} + +/*-------------------------------------------------------------------------*\ +* object:getstats() interface +\*-------------------------------------------------------------------------*/ +int buffer_meth_getstats(lua_State *L, p_buffer buf) { + lua_pushnumber(L, buf->received); + lua_pushnumber(L, buf->sent); + lua_pushnumber(L, timeout_gettime() - buf->birthday); + return 3; +} + +/*-------------------------------------------------------------------------*\ +* object:setstats() interface +\*-------------------------------------------------------------------------*/ +int buffer_meth_setstats(lua_State *L, p_buffer buf) { + buf->received = (long) luaL_optnumber(L, 2, buf->received); + buf->sent = (long) luaL_optnumber(L, 3, buf->sent); + if (lua_isnumber(L, 4)) buf->birthday = timeout_gettime() - lua_tonumber(L, 4); + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* object:send() interface +\*-------------------------------------------------------------------------*/ +int buffer_meth_send(lua_State *L, p_buffer buf) { + int top = lua_gettop(L); + int err = IO_DONE; + size_t size = 0, sent = 0; + const char *data = luaL_checklstring(L, 2, &size); + long start = (long) luaL_optnumber(L, 3, 1); + long end = (long) luaL_optnumber(L, 4, -1); + p_timeout tm = timeout_markstart(buf->tm); + if (start < 0) start = (long) (size+start+1); + if (end < 0) end = (long) (size+end+1); + if (start < 1) start = (long) 1; + if (end > (long) size) end = (long) size; + if (start <= end) err = sendraw(buf, data+start-1, end-start+1, &sent); + /* check if there was an error */ + if (err != IO_DONE) { + lua_pushnil(L); + lua_pushstring(L, buf->io->error(buf->io->ctx, err)); + lua_pushnumber(L, sent+start-1); + } else { + lua_pushnumber(L, sent+start-1); + lua_pushnil(L); + lua_pushnil(L); + } +#ifdef LUASOCKET_DEBUG + /* push time elapsed during operation as the last return value */ + lua_pushnumber(L, timeout_gettime() - timeout_getstart(tm)); +#endif + return lua_gettop(L) - top; +} + +/*-------------------------------------------------------------------------*\ +* object:receive() interface +\*-------------------------------------------------------------------------*/ +int buffer_meth_receive(lua_State *L, p_buffer buf) { + int err = IO_DONE, top = lua_gettop(L); + luaL_Buffer b; + size_t size; + const char *part = luaL_optlstring(L, 3, "", &size); + p_timeout tm = timeout_markstart(buf->tm); + /* initialize buffer with optional extra prefix + * (useful for concatenating previous partial results) */ + luaL_buffinit(L, &b); + luaL_addlstring(&b, part, size); + /* receive new patterns */ + if (!lua_isnumber(L, 2)) { + const char *p= luaL_optstring(L, 2, "*l"); + if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b); + else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b); + else luaL_argcheck(L, 0, 2, "invalid receive pattern"); + /* get a fixed number of bytes (minus what was already partially + * received) */ + } else err = recvraw(buf, (size_t) lua_tonumber(L, 2)-size, &b); + /* check if there was an error */ + if (err != IO_DONE) { + /* we can't push anyting in the stack before pushing the + * contents of the buffer. this is the reason for the complication */ + luaL_pushresult(&b); + lua_pushstring(L, buf->io->error(buf->io->ctx, err)); + lua_pushvalue(L, -2); + lua_pushnil(L); + lua_replace(L, -4); + } else { + luaL_pushresult(&b); + lua_pushnil(L); + lua_pushnil(L); + } +#ifdef LUASOCKET_DEBUG + /* push time elapsed during operation as the last return value */ + lua_pushnumber(L, timeout_gettime() - timeout_getstart(tm)); +#endif + return lua_gettop(L) - top; +} + +/*-------------------------------------------------------------------------*\ +* Determines if there is any data in the read buffer +\*-------------------------------------------------------------------------*/ +int buffer_isempty(p_buffer buf) { + return buf->first >= buf->last; +} + +/*=========================================================================*\ +* Internal functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Sends a block of data (unbuffered) +\*-------------------------------------------------------------------------*/ +#define STEPSIZE 8192 +static int sendraw(p_buffer buf, const char *data, size_t count, size_t *sent) { + p_io io = buf->io; + p_timeout tm = buf->tm; + size_t total = 0; + int err = IO_DONE; + while (total < count && err == IO_DONE) { + size_t done; + size_t step = (count-total <= STEPSIZE)? count-total: STEPSIZE; + err = io->send(io->ctx, data+total, step, &done, tm); + total += done; + } + *sent = total; + buf->sent += total; + return err; +} + +/*-------------------------------------------------------------------------*\ +* Reads a fixed number of bytes (buffered) +\*-------------------------------------------------------------------------*/ +static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b) { + int err = IO_DONE; + size_t total = 0; + while (err == IO_DONE) { + size_t count; const char *data; + err = buffer_get(buf, &data, &count); + count = MIN(count, wanted - total); + luaL_addlstring(b, data, count); + buffer_skip(buf, count); + total += count; + if (total >= wanted) break; + } + return err; +} + +/*-------------------------------------------------------------------------*\ +* Reads everything until the connection is closed (buffered) +\*-------------------------------------------------------------------------*/ +static int recvall(p_buffer buf, luaL_Buffer *b) { + int err = IO_DONE; + size_t total = 0; + while (err == IO_DONE) { + const char *data; size_t count; + err = buffer_get(buf, &data, &count); + total += count; + luaL_addlstring(b, data, count); + buffer_skip(buf, count); + } + if (err == IO_CLOSED) { + if (total > 0) return IO_DONE; + else return IO_CLOSED; + } else return err; +} + +/*-------------------------------------------------------------------------*\ +* Reads a line terminated by a CR LF pair or just by a LF. The CR and LF +* are not returned by the function and are discarded from the buffer +\*-------------------------------------------------------------------------*/ +static int recvline(p_buffer buf, luaL_Buffer *b) { + int err = IO_DONE; + while (err == IO_DONE) { + size_t count, pos; const char *data; + err = buffer_get(buf, &data, &count); + pos = 0; + while (pos < count && data[pos] != '\n') { + /* we ignore all \r's */ + if (data[pos] != '\r') luaL_putchar(b, data[pos]); + pos++; + } + if (pos < count) { /* found '\n' */ + buffer_skip(buf, pos+1); /* skip '\n' too */ + break; /* we are done */ + } else /* reached the end of the buffer */ + buffer_skip(buf, pos); + } + return err; +} + +/*-------------------------------------------------------------------------*\ +* Skips a given number of bytes from read buffer. No data is read from the +* transport layer +\*-------------------------------------------------------------------------*/ +static void buffer_skip(p_buffer buf, size_t count) { + buf->received += count; + buf->first += count; + if (buffer_isempty(buf)) + buf->first = buf->last = 0; +} + +/*-------------------------------------------------------------------------*\ +* Return any data available in buffer, or get more data from transport layer +* if buffer is empty +\*-------------------------------------------------------------------------*/ +static int buffer_get(p_buffer buf, const char **data, size_t *count) { + int err = IO_DONE; + p_io io = buf->io; + p_timeout tm = buf->tm; + if (buffer_isempty(buf)) { + size_t got; + err = io->recv(io->ctx, buf->data, BUF_SIZE, &got, tm); + buf->first = 0; + buf->last = got; + } + *count = buf->last - buf->first; + *data = buf->data + buf->first; + return err; +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/buffer.h b/jni/love/src/libraries/luasocket/libluasocket/buffer.h new file mode 100644 index 00000000..baf93caa --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/buffer.h @@ -0,0 +1,47 @@ +#ifndef BUF_H +#define BUF_H +/*=========================================================================*\ +* Input/Output interface for Lua programs +* LuaSocket toolkit +* +* Line patterns require buffering. Reading one character at a time involves +* too many system calls and is very slow. This module implements the +* LuaSocket interface for input/output on connected objects, as seen by +* Lua programs. +* +* Input is buffered. Output is *not* buffered because there was no simple +* way of making sure the buffered output data would ever be sent. +* +* The module is built on top of the I/O abstraction defined in io.h and the +* timeout management is done with the timeout.h interface. +* +* RCS ID: $Id: buffer.h,v 1.12 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include "lua.h" + +#include "io.h" +#include "timeout.h" + +/* buffer size in bytes */ +#define BUF_SIZE 8192 + +/* buffer control structure */ +typedef struct t_buffer_ { + double birthday; /* throttle support info: creation time, */ + size_t sent, received; /* bytes sent, and bytes received */ + p_io io; /* IO driver used for this buffer */ + p_timeout tm; /* timeout management for this buffer */ + size_t first, last; /* index of first and last bytes of stored data */ + char data[BUF_SIZE]; /* storage space for buffer data */ +} t_buffer; +typedef t_buffer *p_buffer; + +int buffer_open(lua_State *L); +void buffer_init(p_buffer buf, p_io io, p_timeout tm); +int buffer_meth_send(lua_State *L, p_buffer buf); +int buffer_meth_receive(lua_State *L, p_buffer buf); +int buffer_meth_getstats(lua_State *L, p_buffer buf); +int buffer_meth_setstats(lua_State *L, p_buffer buf); +int buffer_isempty(p_buffer buf); + +#endif /* BUF_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/except.c b/jni/love/src/libraries/luasocket/libluasocket/except.c new file mode 100644 index 00000000..5faa5be0 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/except.c @@ -0,0 +1,99 @@ +/*=========================================================================*\ +* Simple exception support +* LuaSocket toolkit +* +* RCS ID: $Id: except.c,v 1.8 2005/09/29 06:11:41 diego Exp $ +\*=========================================================================*/ +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "except.h" + +/*=========================================================================*\ +* Internal function prototypes. +\*=========================================================================*/ +static int global_protect(lua_State *L); +static int global_newtry(lua_State *L); +static int protected_(lua_State *L); +static int finalize(lua_State *L); +static int do_nothing(lua_State *L); + +/* except functions */ +static luaL_reg func[] = { + {"newtry", global_newtry}, + {"protect", global_protect}, + {NULL, NULL} +}; + +/*-------------------------------------------------------------------------*\ +* Try factory +\*-------------------------------------------------------------------------*/ +static void wrap(lua_State *L) { + lua_newtable(L); + lua_pushnumber(L, 1); + lua_pushvalue(L, -3); + lua_settable(L, -3); + lua_insert(L, -2); + lua_pop(L, 1); +} + +static int finalize(lua_State *L) { + if (!lua_toboolean(L, 1)) { + lua_pushvalue(L, lua_upvalueindex(1)); + lua_pcall(L, 0, 0, 0); + lua_settop(L, 2); + wrap(L); + lua_error(L); + return 0; + } else return lua_gettop(L); +} + +static int do_nothing(lua_State *L) { + (void) L; + return 0; +} + +static int global_newtry(lua_State *L) { + lua_settop(L, 1); + if (lua_isnil(L, 1)) lua_pushcfunction(L, do_nothing); + lua_pushcclosure(L, finalize, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Protect factory +\*-------------------------------------------------------------------------*/ +static int unwrap(lua_State *L) { + if (lua_istable(L, -1)) { + lua_pushnumber(L, 1); + lua_gettable(L, -2); + lua_pushnil(L); + lua_insert(L, -2); + return 1; + } else return 0; +} + +static int protected_(lua_State *L) { + lua_pushvalue(L, lua_upvalueindex(1)); + lua_insert(L, 1); + if (lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0) != 0) { + if (unwrap(L)) return 2; + else lua_error(L); + return 0; + } else return lua_gettop(L); +} + +static int global_protect(lua_State *L) { + lua_pushcclosure(L, protected_, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Init module +\*-------------------------------------------------------------------------*/ +int except_open(lua_State *L) { + luaL_openlib(L, NULL, func, 0); + return 0; +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/except.h b/jni/love/src/libraries/luasocket/libluasocket/except.h new file mode 100644 index 00000000..81efb29b --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/except.h @@ -0,0 +1,35 @@ +#ifndef EXCEPT_H +#define EXCEPT_H +/*=========================================================================*\ +* Exception control +* LuaSocket toolkit (but completely independent from other modules) +* +* This provides support for simple exceptions in Lua. During the +* development of the HTTP/FTP/SMTP support, it became aparent that +* error checking was taking a substantial amount of the coding. These +* function greatly simplify the task of checking errors. +* +* The main idea is that functions should return nil as its first return +* value when it finds an error, and return an error message (or value) +* following nil. In case of success, as long as the first value is not nil, +* the other values don't matter. +* +* The idea is to nest function calls with the "try" function. This function +* checks the first value, and calls "error" on the second if the first is +* nil. Otherwise, it returns all values it received. +* +* The protect function returns a new function that behaves exactly like the +* function it receives, but the new function doesn't throw exceptions: it +* returns nil followed by the error message instead. +* +* With these two function, it's easy to write functions that throw +* exceptions on error, but that don't interrupt the user script. +* +* RCS ID: $Id: except.h,v 1.2 2005/09/29 06:11:41 diego Exp $ +\*=========================================================================*/ + +#include "lua.h" + +int except_open(lua_State *L); + +#endif diff --git a/jni/love/src/libraries/luasocket/libluasocket/ftp.lua b/jni/love/src/libraries/luasocket/libluasocket/ftp.lua new file mode 100644 index 00000000..598f65dc --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/ftp.lua @@ -0,0 +1,281 @@ +----------------------------------------------------------------------------- +-- FTP support for the Lua language +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: ftp.lua,v 1.45 2007/07/11 19:25:47 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local table = require("table") +local string = require("string") +local math = require("math") +local socket = require("socket") +local url = require("socket.url") +local tp = require("socket.tp") +local ltn12 = require("ltn12") +module("socket.ftp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- timeout in seconds before the program gives up on a connection +TIMEOUT = 60 +-- default port for ftp service +PORT = 21 +-- this is the default anonymous password. used when no password is +-- provided in url. should be changed to your e-mail. +USER = "ftp" +PASSWORD = "anonymous@anonymous.org" + +----------------------------------------------------------------------------- +-- Low level FTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function open(server, port, create) + local tp = socket.try(tp.connect(server, port or PORT, TIMEOUT, create)) + local f = base.setmetatable({ tp = tp }, metat) + -- make sure everything gets closed in an exception + f.try = socket.newtry(function() f:close() end) + return f +end + +function metat.__index:portconnect() + self.try(self.server:settimeout(TIMEOUT)) + self.data = self.try(self.server:accept()) + self.try(self.data:settimeout(TIMEOUT)) +end + +function metat.__index:pasvconnect() + self.data = self.try(socket.tcp()) + self.try(self.data:settimeout(TIMEOUT)) + self.try(self.data:connect(self.pasvt.ip, self.pasvt.port)) +end + +function metat.__index:login(user, password) + self.try(self.tp:command("user", user or USER)) + local code, reply = self.try(self.tp:check{"2..", 331}) + if code == 331 then + self.try(self.tp:command("pass", password or PASSWORD)) + self.try(self.tp:check("2..")) + end + return 1 +end + +function metat.__index:pasv() + self.try(self.tp:command("pasv")) + local code, reply = self.try(self.tp:check("2..")) + local pattern = "(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)" + local a, b, c, d, p1, p2 = socket.skip(2, string.find(reply, pattern)) + self.try(a and b and c and d and p1 and p2, reply) + self.pasvt = { + ip = string.format("%d.%d.%d.%d", a, b, c, d), + port = p1*256 + p2 + } + if self.server then + self.server:close() + self.server = nil + end + return self.pasvt.ip, self.pasvt.port +end + +function metat.__index:port(ip, port) + self.pasvt = nil + if not ip then + ip, port = self.try(self.tp:getcontrol():getsockname()) + self.server = self.try(socket.bind(ip, 0)) + ip, port = self.try(self.server:getsockname()) + self.try(self.server:settimeout(TIMEOUT)) + end + local pl = math.mod(port, 256) + local ph = (port - pl)/256 + local arg = string.gsub(string.format("%s,%d,%d", ip, ph, pl), "%.", ",") + self.try(self.tp:command("port", arg)) + self.try(self.tp:check("2..")) + return 1 +end + +function metat.__index:send(sendt) + self.try(self.pasvt or self.server, "need port or pasv first") + -- if there is a pasvt table, we already sent a PASV command + -- we just get the data connection into self.data + if self.pasvt then self:pasvconnect() end + -- get the transfer argument and command + local argument = sendt.argument or + url.unescape(string.gsub(sendt.path or "", "^[/\\]", "")) + if argument == "" then argument = nil end + local command = sendt.command or "stor" + -- send the transfer command and check the reply + self.try(self.tp:command(command, argument)) + local code, reply = self.try(self.tp:check{"2..", "1.."}) + -- if there is not a a pasvt table, then there is a server + -- and we already sent a PORT command + if not self.pasvt then self:portconnect() end + -- get the sink, source and step for the transfer + local step = sendt.step or ltn12.pump.step + local readt = {self.tp.c} + local checkstep = function(src, snk) + -- check status in control connection while downloading + local readyt = socket.select(readt, nil, 0) + if readyt[tp] then code = self.try(self.tp:check("2..")) end + return step(src, snk) + end + local sink = socket.sink("close-when-done", self.data) + -- transfer all data and check error + self.try(ltn12.pump.all(sendt.source, sink, checkstep)) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + -- done with data connection + self.data:close() + -- find out how many bytes were sent + local sent = socket.skip(1, self.data:getstats()) + self.data = nil + return sent +end + +function metat.__index:receive(recvt) + self.try(self.pasvt or self.server, "need port or pasv first") + if self.pasvt then self:pasvconnect() end + local argument = recvt.argument or + url.unescape(string.gsub(recvt.path or "", "^[/\\]", "")) + if argument == "" then argument = nil end + local command = recvt.command or "retr" + self.try(self.tp:command(command, argument)) + local code = self.try(self.tp:check{"1..", "2.."}) + if not self.pasvt then self:portconnect() end + local source = socket.source("until-closed", self.data) + local step = recvt.step or ltn12.pump.step + self.try(ltn12.pump.all(source, recvt.sink, step)) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + self.data:close() + self.data = nil + return 1 +end + +function metat.__index:cwd(dir) + self.try(self.tp:command("cwd", dir)) + self.try(self.tp:check(250)) + return 1 +end + +function metat.__index:type(type) + self.try(self.tp:command("type", type)) + self.try(self.tp:check(200)) + return 1 +end + +function metat.__index:greet() + local code = self.try(self.tp:check{"1..", "2.."}) + if string.find(code, "1..") then self.try(self.tp:check("2..")) end + return 1 +end + +function metat.__index:quit() + self.try(self.tp:command("quit")) + self.try(self.tp:check("2..")) + return 1 +end + +function metat.__index:close() + if self.data then self.data:close() end + if self.server then self.server:close() end + return self.tp:close() +end + +----------------------------------------------------------------------------- +-- High level FTP API +----------------------------------------------------------------------------- +local function override(t) + if t.url then + local u = url.parse(t.url) + for i,v in base.pairs(t) do + u[i] = v + end + return u + else return t end +end + +local function tput(putt) + putt = override(putt) + socket.try(putt.host, "missing hostname") + local f = open(putt.host, putt.port, putt.create) + f:greet() + f:login(putt.user, putt.password) + if putt.type then f:type(putt.type) end + f:pasv() + local sent = f:send(putt) + f:quit() + f:close() + return sent +end + +local default = { + path = "/", + scheme = "ftp" +} + +local function parse(u) + local t = socket.try(url.parse(u, default)) + socket.try(t.scheme == "ftp", "wrong scheme '" .. t.scheme .. "'") + socket.try(t.host, "missing hostname") + local pat = "^type=(.)$" + if t.params then + t.type = socket.skip(2, string.find(t.params, pat)) + socket.try(t.type == "a" or t.type == "i", + "invalid type '" .. t.type .. "'") + end + return t +end + +local function sput(u, body) + local putt = parse(u) + putt.source = ltn12.source.string(body) + return tput(putt) +end + +put = socket.protect(function(putt, body) + if base.type(putt) == "string" then return sput(putt, body) + else return tput(putt) end +end) + +local function tget(gett) + gett = override(gett) + socket.try(gett.host, "missing hostname") + local f = open(gett.host, gett.port, gett.create) + f:greet() + f:login(gett.user, gett.password) + if gett.type then f:type(gett.type) end + f:pasv() + f:receive(gett) + f:quit() + return f:close() +end + +local function sget(u) + local gett = parse(u) + local t = {} + gett.sink = ltn12.sink.table(t) + tget(gett) + return table.concat(t) +end + +command = socket.protect(function(cmdt) + cmdt = override(cmdt) + socket.try(cmdt.host, "missing hostname") + socket.try(cmdt.command, "missing command") + local f = open(cmdt.host, cmdt.port, cmdt.create) + f:greet() + f:login(cmdt.user, cmdt.password) + f.try(f.tp:command(cmdt.command, cmdt.argument)) + if cmdt.check then f.try(f.tp:check(cmdt.check)) end + f:quit() + return f:close() +end) + +get = socket.protect(function(gett) + if base.type(gett) == "string" then return sget(gett) + else return tget(gett) end +end) + diff --git a/jni/love/src/libraries/luasocket/libluasocket/ftp.lua.h b/jni/love/src/libraries/luasocket/libluasocket/ftp.lua.h new file mode 100644 index 00000000..0f6c8153 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/ftp.lua.h @@ -0,0 +1,468 @@ +/* code automatically generated by bin2c -- DO NOT EDIT */ +{ +/* #include'ing this file in a C program is equivalent to calling + if (luaL_loadfile(L,"ftp.lua")==0) lua_call(L, 0, 0); +*/ +/* ftp.lua */ +static const unsigned char B1[]={ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 70, 84, 80, 32,115,117,112,112,111,114,116, 32,102,111,114, 32,116,104,101, + 32, 76,117, 97, 32,108, 97,110,103,117, 97,103,101, 10, 45, 45, 32, 76,117, 97, + 83,111, 99,107,101,116, 32,116,111,111,108,107,105,116, 46, 10, 45, 45, 32, 65, +117,116,104,111,114, 58, 32, 68,105,101,103,111, 32, 78,101,104, 97, 98, 10, 45, + 45, 32, 82, 67, 83, 32, 73, 68, 58, 32, 36, 73,100, 58, 32,102,116,112, 46,108, +117, 97, 44,118, 32, 49, 46, 52, 53, 32, 50, 48, 48, 55, 47, 48, 55, 47, 49, 49, + 32, 49, 57, 58, 50, 53, 58, 52, 55, 32,100,105,101,103,111, 32, 69,120,112, 32, + 36, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, + 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, + 45, 32, 68,101, 99,108, 97,114,101, 32,109,111,100,117,108,101, 32, 97,110,100, + 32,105,109,112,111,114,116, 32,100,101,112,101,110,100,101,110, 99,105,101,115, + 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108, +111, 99, 97,108, 32, 98, 97,115,101, 32, 61, 32, 95, 71, 10,108,111, 99, 97,108, + 32,116, 97, 98,108,101, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,116, 97, + 98,108,101, 34, 41, 10,108,111, 99, 97,108, 32,115,116,114,105,110,103, 32, 61, + 32,114,101,113,117,105,114,101, 40, 34,115,116,114,105,110,103, 34, 41, 10,108, +111, 99, 97,108, 32,109, 97,116,104, 32, 61, 32,114,101,113,117,105,114,101, 40, + 34,109, 97,116,104, 34, 41, 10,108,111, 99, 97,108, 32,115,111, 99,107,101,116, + 32, 61, 32,114,101,113,117,105,114,101, 40, 34,115,111, 99,107,101,116, 34, 41, + 10,108,111, 99, 97,108, 32,117,114,108, 32, 61, 32,114,101,113,117,105,114,101, + 40, 34,115,111, 99,107,101,116, 46,117,114,108, 34, 41, 10,108,111, 99, 97,108, + 32,116,112, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,115,111, 99,107,101, +116, 46,116,112, 34, 41, 10,108,111, 99, 97,108, 32,108,116,110, 49, 50, 32, 61, + 32,114,101,113,117,105,114,101, 40, 34,108,116,110, 49, 50, 34, 41, 10,109,111, +100,117,108,101, 40, 34,115,111, 99,107,101,116, 46,102,116,112, 34, 41, 10, 10, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 80,114,111,103,114, 97,109, 32, 99,111,110,115,116, 97,110,116,115, 10, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, +116,105,109,101,111,117,116, 32,105,110, 32,115,101, 99,111,110,100,115, 32, 98, +101,102,111,114,101, 32,116,104,101, 32,112,114,111,103,114, 97,109, 32,103,105, +118,101,115, 32,117,112, 32,111,110, 32, 97, 32, 99,111,110,110,101, 99,116,105, +111,110, 10, 84, 73, 77, 69, 79, 85, 84, 32, 61, 32, 54, 48, 10, 45, 45, 32,100, +101,102, 97,117,108,116, 32,112,111,114,116, 32,102,111,114, 32,102,116,112, 32, +115,101,114,118,105, 99,101, 10, 80, 79, 82, 84, 32, 61, 32, 50, 49, 10, 45, 45, + 32,116,104,105,115, 32,105,115, 32,116,104,101, 32,100,101,102, 97,117,108,116, + 32, 97,110,111,110,121,109,111,117,115, 32,112, 97,115,115,119,111,114,100, 46, + 32,117,115,101,100, 32,119,104,101,110, 32,110,111, 32,112, 97,115,115,119,111, +114,100, 32,105,115, 10, 45, 45, 32,112,114,111,118,105,100,101,100, 32,105,110, + 32,117,114,108, 46, 32,115,104,111,117,108,100, 32, 98,101, 32, 99,104, 97,110, +103,101,100, 32,116,111, 32,121,111,117,114, 32,101, 45,109, 97,105,108, 46, 10, + 85, 83, 69, 82, 32, 61, 32, 34,102,116,112, 34, 10, 80, 65, 83, 83, 87, 79, 82, + 68, 32, 61, 32, 34, 97,110,111,110,121,109,111,117,115, 64, 97,110,111,110,121, +109,111,117,115, 46,111,114,103, 34, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 76,111,119, 32,108,101,118,101, +108, 32, 70, 84, 80, 32, 65, 80, 73, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32,109,101,116, 97,116, 32, + 61, 32,123, 32, 95, 95,105,110,100,101,120, 32, 61, 32,123,125, 32,125, 10, 10, +102,117,110, 99,116,105,111,110, 32,111,112,101,110, 40,115,101,114,118,101,114, + 44, 32,112,111,114,116, 44, 32, 99,114,101, 97,116,101, 41, 10, 32, 32, 32, 32, +108,111, 99, 97,108, 32,116,112, 32, 61, 32,115,111, 99,107,101,116, 46,116,114, +121, 40,116,112, 46, 99,111,110,110,101, 99,116, 40,115,101,114,118,101,114, 44, + 32,112,111,114,116, 32,111,114, 32, 80, 79, 82, 84, 44, 32, 84, 73, 77, 69, 79, + 85, 84, 44, 32, 99,114,101, 97,116,101, 41, 41, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,102, 32, 61, 32, 98, 97,115,101, 46,115,101,116,109,101,116, 97,116, + 97, 98,108,101, 40,123, 32,116,112, 32, 61, 32,116,112, 32,125, 44, 32,109,101, +116, 97,116, 41, 10, 32, 32, 32, 32, 45, 45, 32,109, 97,107,101, 32,115,117,114, +101, 32,101,118,101,114,121,116,104,105,110,103, 32,103,101,116,115, 32, 99,108, +111,115,101,100, 32,105,110, 32, 97,110, 32,101,120, 99,101,112,116,105,111,110, + 10, 32, 32, 32, 32,102, 46,116,114,121, 32, 61, 32,115,111, 99,107,101,116, 46, +110,101,119,116,114,121, 40,102,117,110, 99,116,105,111,110, 40, 41, 32,102, 58, + 99,108,111,115,101, 40, 41, 32,101,110,100, 41, 10, 32, 32, 32, 32,114,101,116, +117,114,110, 32,102, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, +109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,112,111,114,116, 99,111, +110,110,101, 99,116, 40, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, + 40,115,101,108,102, 46,115,101,114,118,101,114, 58,115,101,116,116,105,109,101, +111,117,116, 40, 84, 73, 77, 69, 79, 85, 84, 41, 41, 10, 32, 32, 32, 32,115,101, +108,102, 46,100, 97,116, 97, 32, 61, 32,115,101,108,102, 46,116,114,121, 40,115, +101,108,102, 46,115,101,114,118,101,114, 58, 97, 99, 99,101,112,116, 40, 41, 41, + 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,100, + 97,116, 97, 58,115,101,116,116,105,109,101,111,117,116, 40, 84, 73, 77, 69, 79, + 85, 84, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109, +101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,112, 97,115,118, 99,111,110, +110,101, 99,116, 40, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,100, 97,116, 97, + 32, 61, 32,115,101,108,102, 46,116,114,121, 40,115,111, 99,107,101,116, 46,116, + 99,112, 40, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115, +101,108,102, 46,100, 97,116, 97, 58,115,101,116,116,105,109,101,111,117,116, 40, + 84, 73, 77, 69, 79, 85, 84, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116, +114,121, 40,115,101,108,102, 46,100, 97,116, 97, 58, 99,111,110,110,101, 99,116, + 40,115,101,108,102, 46,112, 97,115,118,116, 46,105,112, 44, 32,115,101,108,102, + 46,112, 97,115,118,116, 46,112,111,114,116, 41, 41, 10,101,110,100, 10, 10,102, +117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101, +120, 58,108,111,103,105,110, 40,117,115,101,114, 44, 32,112, 97,115,115,119,111, +114,100, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108, +102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40, 34,117,115,101,114, 34, 44, + 32,117,115,101,114, 32,111,114, 32, 85, 83, 69, 82, 41, 41, 10, 32, 32, 32, 32, +108,111, 99, 97,108, 32, 99,111,100,101, 44, 32,114,101,112,108,121, 32, 61, 32, +115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, + 99,107,123, 34, 50, 46, 46, 34, 44, 32, 51, 51, 49,125, 41, 10, 32, 32, 32, 32, +105,102, 32, 99,111,100,101, 32, 61, 61, 32, 51, 51, 49, 32,116,104,101,110, 10, + 32, 32, 32, 32, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108, +102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40, 34,112, 97,115,115, 34, 44, + 32,112, 97,115,115,119,111,114,100, 32,111,114, 32, 80, 65, 83, 83, 87, 79, 82, + 68, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, + 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 34, 50, 46, 46, 34, + 41, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,114,101,116,117,114, +110, 32, 49, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101, +116, 97,116, 46, 95, 95,105,110,100,101,120, 58,112, 97,115,118, 40, 41, 10, 32, + 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, + 99,111,109,109, 97,110,100, 40, 34,112, 97,115,118, 34, 41, 41, 10, 32, 32, 32, + 32,108,111, 99, 97,108, 32, 99,111,100,101, 44, 32,114,101,112,108,121, 32, 61, + 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,104, +101, 99,107, 40, 34, 50, 46, 46, 34, 41, 41, 10, 32, 32, 32, 32,108,111, 99, 97, +108, 32,112, 97,116,116,101,114,110, 32, 61, 32, 34, 40, 37,100, 43, 41, 37, 68, + 40, 37,100, 43, 41, 37, 68, 40, 37,100, 43, 41, 37, 68, 40, 37,100, 43, 41, 37, + 68, 40, 37,100, 43, 41, 37, 68, 40, 37,100, 43, 41, 34, 10, 32, 32, 32, 32,108, +111, 99, 97,108, 32, 97, 44, 32, 98, 44, 32, 99, 44, 32,100, 44, 32,112, 49, 44, + 32,112, 50, 32, 61, 32,115,111, 99,107,101,116, 46,115,107,105,112, 40, 50, 44, + 32,115,116,114,105,110,103, 46,102,105,110,100, 40,114,101,112,108,121, 44, 32, +112, 97,116,116,101,114,110, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116, +114,121, 40, 97, 32, 97,110,100, 32, 98, 32, 97,110,100, 32, 99, 32, 97,110,100, + 32,100, 32, 97,110,100, 32,112, 49, 32, 97,110,100, 32,112, 50, 44, 32,114,101, +112,108,121, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,112, 97,115,118,116, 32, + 61, 32,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,112, 32, 61, 32,115,116,114, +105,110,103, 46,102,111,114,109, 97,116, 40, 34, 37,100, 46, 37,100, 46, 37,100, + 46, 37,100, 34, 44, 32, 97, 44, 32, 98, 44, 32, 99, 44, 32,100, 41, 44, 10, 32, + 32, 32, 32, 32, 32, 32, 32,112,111,114,116, 32, 61, 32,112, 49, 42, 50, 53, 54, + 32, 43, 32,112, 50, 10, 32, 32, 32, 32,125, 10, 32, 32, 32, 32,105,102, 32,115, +101,108,102, 46,115,101,114,118,101,114, 32,116,104,101,110, 10, 32, 32, 32, 32, + 32, 32, 32, 32,115,101,108,102, 46,115,101,114,118,101,114, 58, 99,108,111,115, +101, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,101,108,102, 46,115,101,114, +118,101,114, 32, 61, 32,110,105,108, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, + 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46,112, 97,115,118,116, 46, +105,112, 44, 32,115,101,108,102, 46,112, 97,115,118,116, 46,112,111,114,116, 10, +101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, + 95, 95,105,110,100,101,120, 58,112,111,114,116, 40,105,112, 44, 32,112,111,114, +116, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,112, 97,115,118,116, 32, 61, 32, +110,105,108, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32,105,112, 32,116,104, +101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,112, 44, 32,112,111,114,116, 32, + 61, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58,103, +101,116, 99,111,110,116,114,111,108, 40, 41, 58,103,101,116,115,111, 99,107,110, + 97,109,101, 40, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,101,108,102, 46, +115,101,114,118,101,114, 32, 61, 32,115,101,108,102, 46,116,114,121, 40,115,111, + 99,107,101,116, 46, 98,105,110,100, 40,105,112, 44, 32, 48, 41, 41, 10, 32, 32, + 32, 32, 32, 32, 32, 32,105,112, 44, 32,112,111,114,116, 32, 61, 32,115,101,108, +102, 46,116,114,121, 40,115,101,108,102, 46,115,101,114,118,101,114, 58,103,101, +116,115,111, 99,107,110, 97,109,101, 40, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, + 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,115,101,114,118,101, +114, 58,115,101,116,116,105,109,101,111,117,116, 40, 84, 73, 77, 69, 79, 85, 84, + 41, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,108,111, 99, 97,108, + 32,112,108, 32, 61, 32,109, 97,116,104, 46,109,111,100, 40,112,111,114,116, 44, + 32, 50, 53, 54, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,112,104, 32, 61, + 32, 40,112,111,114,116, 32, 45, 32,112,108, 41, 47, 50, 53, 54, 10, 32, 32, 32, + 32,108,111, 99, 97,108, 32, 97,114,103, 32, 61, 32,115,116,114,105,110,103, 46, +103,115,117, 98, 40,115,116,114,105,110,103, 46,102,111,114,109, 97,116, 40, 34, + 37,115, 44, 37,100, 44, 37,100, 34, 44, 32,105,112, 44, 32,112,104, 44, 32,112, +108, 41, 44, 32, 34, 37, 46, 34, 44, 32, 34, 44, 34, 41, 10, 32, 32, 32, 32,115, +101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,111,109,109, + 97,110,100, 40, 34,112,111,114,116, 34, 44, 32, 97,114,103, 41, 41, 10, 32, 32, + 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99, +104,101, 99,107, 40, 34, 50, 46, 46, 34, 41, 41, 10, 32, 32, 32, 32,114,101,116, +117,114,110, 32, 49, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, +109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,115,101,110,100, 40,115, +101,110,100,116, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115, +101,108,102, 46,112, 97,115,118,116, 32,111,114, 32,115,101,108,102, 46,115,101, +114,118,101,114, 44, 32, 34,110,101,101,100, 32,112,111,114,116, 32,111,114, 32, +112, 97,115,118, 32,102,105,114,115,116, 34, 41, 10, 32, 32, 32, 32, 45, 45, 32, +105,102, 32,116,104,101,114,101, 32,105,115, 32, 97, 32,112, 97,115,118,116, 32, +116, 97, 98,108,101, 44, 32,119,101, 32, 97,108,114,101, 97,100,121, 32,115,101, +110,116, 32, 97, 32, 80, 65, 83, 86, 32, 99,111,109,109, 97,110,100, 10, 32, 32, + 32, 32, 45, 45, 32,119,101, 32,106,117,115,116, 32,103,101,116, 32,116,104,101, + 32,100, 97,116, 97, 32, 99,111,110,110,101, 99,116,105,111,110, 32,105,110,116, +111, 32,115,101,108,102, 46,100, 97,116, 97, 10, 32, 32, 32, 32,105,102, 32,115, +101,108,102, 46,112, 97,115,118,116, 32,116,104,101,110, 32,115,101,108,102, 58, +112, 97,115,118, 99,111,110,110,101, 99,116, 40, 41, 32,101,110,100, 10, 32, 32, + 32, 32, 45, 45, 32,103,101,116, 32,116,104,101, 32,116,114, 97,110,115,102,101, +114, 32, 97,114,103,117,109,101,110,116, 32, 97,110,100, 32, 99,111,109,109, 97, +110,100, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 97,114,103,117,109,101,110, +116, 32, 61, 32,115,101,110,100,116, 46, 97,114,103,117,109,101,110,116, 32,111, +114, 10, 32, 32, 32, 32, 32, 32, 32, 32,117,114,108, 46,117,110,101,115, 99, 97, +112,101, 40,115,116,114,105,110,103, 46,103,115,117, 98, 40,115,101,110,100,116, + 46,112, 97,116,104, 32,111,114, 32, 34, 34, 44, 32, 34, 94, 91, 47, 92, 92, 93, + 34, 44, 32, 34, 34, 41, 41, 10, 32, 32, 32, 32,105,102, 32, 97,114,103,117,109, +101,110,116, 32, 61, 61, 32, 34, 34, 32,116,104,101,110, 32, 97,114,103,117,109, +101,110,116, 32, 61, 32,110,105,108, 32,101,110,100, 10, 32, 32, 32, 32,108,111, + 99, 97,108, 32, 99,111,109,109, 97,110,100, 32, 61, 32,115,101,110,100,116, 46, + 99,111,109,109, 97,110,100, 32,111,114, 32, 34,115,116,111,114, 34, 10, 32, 32, + 32, 32, 45, 45, 32,115,101,110,100, 32,116,104,101, 32,116,114, 97,110,115,102, +101,114, 32, 99,111,109,109, 97,110,100, 32, 97,110,100, 32, 99,104,101, 99,107, + 32,116,104,101, 32,114,101,112,108,121, 10, 32, 32, 32, 32,115,101,108,102, 46, +116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40, + 99,111,109,109, 97,110,100, 44, 32, 97,114,103,117,109,101,110,116, 41, 41, 10, + 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,111,100,101, 44, 32,114,101,112,108, +121, 32, 61, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, + 58, 99,104,101, 99,107,123, 34, 50, 46, 46, 34, 44, 32, 34, 49, 46, 46, 34,125, + 41, 10, 32, 32, 32, 32, 45, 45, 32,105,102, 32,116,104,101,114,101, 32,105,115, + 32,110,111,116, 32, 97, 32, 97, 32,112, 97,115,118,116, 32,116, 97, 98,108,101, + 44, 32,116,104,101,110, 32,116,104,101,114,101, 32,105,115, 32, 97, 32,115,101, +114,118,101,114, 10, 32, 32, 32, 32, 45, 45, 32, 97,110,100, 32,119,101, 32, 97, +108,114,101, 97,100,121, 32,115,101,110,116, 32, 97, 32, 80, 79, 82, 84, 32, 99, +111,109,109, 97,110,100, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32,115,101, +108,102, 46,112, 97,115,118,116, 32,116,104,101,110, 32,115,101,108,102, 58,112, +111,114,116, 99,111,110,110,101, 99,116, 40, 41, 32,101,110,100, 10, 32, 32, 32, + 32, 45, 45, 32,103,101,116, 32,116,104,101, 32,115,105,110,107, 44, 32,115,111, +117,114, 99,101, 32, 97,110,100, 32,115,116,101,112, 32,102,111,114, 32,116,104, +101, 32,116,114, 97,110,115,102,101,114, 10, 32, 32, 32, 32,108,111, 99, 97,108, + 32,115,116,101,112, 32, 61, 32,115,101,110,100,116, 46,115,116,101,112, 32,111, +114, 32,108,116,110, 49, 50, 46,112,117,109,112, 46,115,116,101,112, 10, 32, 32, + 32, 32,108,111, 99, 97,108, 32,114,101, 97,100,116, 32, 61, 32,123,115,101,108, +102, 46,116,112, 46, 99,125, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,104, +101, 99,107,115,116,101,112, 32, 61, 32,102,117,110, 99,116,105,111,110, 40,115, +114, 99, 44, 32,115,110,107, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 32, + 99,104,101, 99,107, 32,115,116, 97,116,117,115, 32,105,110, 32, 99,111,110,116, +114,111,108, 32, 99,111,110,110,101, 99,116,105,111,110, 32,119,104,105,108,101, + 32,100,111,119,110,108,111, 97,100,105,110,103, 10, 32, 32, 32, 32, 32, 32, 32, + 32,108,111, 99, 97,108, 32,114,101, 97,100,121,116, 32, 61, 32,115,111, 99,107, +101,116, 46,115,101,108,101, 99,116, 40,114,101, 97,100,116, 44, 32,110,105,108, + 44, 32, 48, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,114,101, 97,100, +121,116, 91,116,112, 93, 32,116,104,101,110, 32, 99,111,100,101, 32, 61, 32,115, +101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99, +107, 40, 34, 50, 46, 46, 34, 41, 41, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, + 32, 32,114,101,116,117,114,110, 32,115,116,101,112, 40,115,114, 99, 44, 32,115, +110,107, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,108,111, 99, 97, +108, 32,115,105,110,107, 32, 61, 32,115,111, 99,107,101,116, 46,115,105,110,107, + 40, 34, 99,108,111,115,101, 45,119,104,101,110, 45,100,111,110,101, 34, 44, 32, +115,101,108,102, 46,100, 97,116, 97, 41, 10, 32, 32, 32, 32, 45, 45, 32,116,114, + 97,110,115,102,101,114, 32, 97,108,108, 32,100, 97,116, 97, 32, 97,110,100, 32, + 99,104,101, 99,107, 32,101,114,114,111,114, 10, 32, 32, 32, 32,115,101,108,102, + 46,116,114,121, 40,108,116,110, 49, 50, 46,112,117,109,112, 46, 97,108,108, 40, +115,101,110,100,116, 46,115,111,117,114, 99,101, 44, 32,115,105,110,107, 44, 32, + 99,104,101, 99,107,115,116,101,112, 41, 41, 10, 32, 32, 32, 32,105,102, 32,115, +116,114,105,110,103, 46,102,105,110,100, 40, 99,111,100,101, 44, 32, 34, 49, 46, + 46, 34, 41, 32,116,104,101,110, 32,115,101,108,102, 46,116,114,121, 40,115,101, +108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 34, 50, 46, 46, 34, 41, 41, 32, +101,110,100, 10, 32, 32, 32, 32, 45, 45, 32,100,111,110,101, 32,119,105,116,104, + 32,100, 97,116, 97, 32, 99,111,110,110,101, 99,116,105,111,110, 10, 32, 32, 32, + 32,115,101,108,102, 46,100, 97,116, 97, 58, 99,108,111,115,101, 40, 41, 10, 32, + 32, 32, 32, 45, 45, 32,102,105,110,100, 32,111,117,116, 32,104,111,119, 32,109, + 97,110,121, 32, 98,121,116,101,115, 32,119,101,114,101, 32,115,101,110,116, 10, + 32, 32, 32, 32,108,111, 99, 97,108, 32,115,101,110,116, 32, 61, 32,115,111, 99, +107,101,116, 46,115,107,105,112, 40, 49, 44, 32,115,101,108,102, 46,100, 97,116, + 97, 58,103,101,116,115,116, 97,116,115, 40, 41, 41, 10, 32, 32, 32, 32,115,101, +108,102, 46,100, 97,116, 97, 32, 61, 32,110,105,108, 10, 32, 32, 32, 32,114,101, +116,117,114,110, 32,115,101,110,116, 10,101,110,100, 10, 10,102,117,110, 99,116, +105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,114,101, + 99,101,105,118,101, 40,114,101, 99,118,116, 41, 10, 32, 32, 32, 32,115,101,108, +102, 46,116,114,121, 40,115,101,108,102, 46,112, 97,115,118,116, 32,111,114, 32, +115,101,108,102, 46,115,101,114,118,101,114, 44, 32, 34,110,101,101,100, 32,112, +111,114,116, 32,111,114, 32,112, 97,115,118, 32,102,105,114,115,116, 34, 41, 10, + 32, 32, 32, 32,105,102, 32,115,101,108,102, 46,112, 97,115,118,116, 32,116,104, +101,110, 32,115,101,108,102, 58,112, 97,115,118, 99,111,110,110,101, 99,116, 40, + 41, 32,101,110,100, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 97,114,103,117, +109,101,110,116, 32, 61, 32,114,101, 99,118,116, 46, 97,114,103,117,109,101,110, +116, 32,111,114, 10, 32, 32, 32, 32, 32, 32, 32, 32,117,114,108, 46,117,110,101, +115, 99, 97,112,101, 40,115,116,114,105,110,103, 46,103,115,117, 98, 40,114,101, + 99,118,116, 46,112, 97,116,104, 32,111,114, 32, 34, 34, 44, 32, 34, 94, 91, 47, + 92, 92, 93, 34, 44, 32, 34, 34, 41, 41, 10, 32, 32, 32, 32,105,102, 32, 97,114, +103,117,109,101,110,116, 32, 61, 61, 32, 34, 34, 32,116,104,101,110, 32, 97,114, +103,117,109,101,110,116, 32, 61, 32,110,105,108, 32,101,110,100, 10, 32, 32, 32, + 32,108,111, 99, 97,108, 32, 99,111,109,109, 97,110,100, 32, 61, 32,114,101, 99, +118,116, 46, 99,111,109,109, 97,110,100, 32,111,114, 32, 34,114,101,116,114, 34, + 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116, +112, 58, 99,111,109,109, 97,110,100, 40, 99,111,109,109, 97,110,100, 44, 32, 97, +114,103,117,109,101,110,116, 41, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, + 99,111,100,101, 32, 61, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, + 46,116,112, 58, 99,104,101, 99,107,123, 34, 49, 46, 46, 34, 44, 32, 34, 50, 46, + 46, 34,125, 41, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32,115,101,108,102, + 46,112, 97,115,118,116, 32,116,104,101,110, 32,115,101,108,102, 58,112,111,114, +116, 99,111,110,110,101, 99,116, 40, 41, 32,101,110,100, 10, 32, 32, 32, 32,108, +111, 99, 97,108, 32,115,111,117,114, 99,101, 32, 61, 32,115,111, 99,107,101,116, + 46,115,111,117,114, 99,101, 40, 34,117,110,116,105,108, 45, 99,108,111,115,101, +100, 34, 44, 32,115,101,108,102, 46,100, 97,116, 97, 41, 10, 32, 32, 32, 32,108, +111, 99, 97,108, 32,115,116,101,112, 32, 61, 32,114,101, 99,118,116, 46,115,116, +101,112, 32,111,114, 32,108,116,110, 49, 50, 46,112,117,109,112, 46,115,116,101, +112, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,108,116,110, 49, 50, + 46,112,117,109,112, 46, 97,108,108, 40,115,111,117,114, 99,101, 44, 32,114,101, + 99,118,116, 46,115,105,110,107, 44, 32,115,116,101,112, 41, 41, 10, 32, 32, 32, + 32,105,102, 32,115,116,114,105,110,103, 46,102,105,110,100, 40, 99,111,100,101, + 44, 32, 34, 49, 46, 46, 34, 41, 32,116,104,101,110, 32,115,101,108,102, 46,116, +114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 34, 50, 46, + 46, 34, 41, 41, 32,101,110,100, 10, 32, 32, 32, 32,115,101,108,102, 46,100, 97, +116, 97, 58, 99,108,111,115,101, 40, 41, 10, 32, 32, 32, 32,115,101,108,102, 46, +100, 97,116, 97, 32, 61, 32,110,105,108, 10, 32, 32, 32, 32,114,101,116,117,114, +110, 32, 49, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101, +116, 97,116, 46, 95, 95,105,110,100,101,120, 58, 99,119,100, 40,100,105,114, 41, + 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116, +112, 58, 99,111,109,109, 97,110,100, 40, 34, 99,119,100, 34, 44, 32,100,105,114, + 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, + 46,116,112, 58, 99,104,101, 99,107, 40, 50, 53, 48, 41, 41, 10, 32, 32, 32, 32, +114,101,116,117,114,110, 32, 49, 10,101,110,100, 10, 10,102,117,110, 99,116,105, +111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,116,121,112, +101, 40,116,121,112,101, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, + 40,115,101,108,102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40, 34,116,121, +112,101, 34, 44, 32,116,121,112,101, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, + 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 50, + 48, 48, 41, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, 49, 10,101,110, +100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95, +105,110,100,101,120, 58,103,114,101,101,116, 40, 41, 10, 32, 32, 32, 32,108,111, + 99, 97,108, 32, 99,111,100,101, 32, 61, 32,115,101,108,102, 46,116,114,121, 40, +115,101,108,102, 46,116,112, 58, 99,104,101, 99,107,123, 34, 49, 46, 46, 34, 44, + 32, 34, 50, 46, 46, 34,125, 41, 10, 32, 32, 32, 32,105,102, 32,115,116,114,105, +110,103, 46,102,105,110,100, 40, 99,111,100,101, 44, 32, 34, 49, 46, 46, 34, 41, + 32,116,104,101,110, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46, +116,112, 58, 99,104,101, 99,107, 40, 34, 50, 46, 46, 34, 41, 41, 32,101,110,100, + 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, 49, 10,101,110,100, 10, 10,102, +117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101, +120, 58,113,117,105,116, 40, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114, +121, 40,115,101,108,102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40, 34,113, +117,105,116, 34, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40, +115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 34, 50, 46, 46, 34, 41, + 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, 49, 10,101,110,100, 10, 10, +102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100, +101,120, 58, 99,108,111,115,101, 40, 41, 10, 32, 32, 32, 32,105,102, 32,115,101, +108,102, 46,100, 97,116, 97, 32,116,104,101,110, 32,115,101,108,102, 46,100, 97, +116, 97, 58, 99,108,111,115,101, 40, 41, 32,101,110,100, 10, 32, 32, 32, 32,105, +102, 32,115,101,108,102, 46,115,101,114,118,101,114, 32,116,104,101,110, 32,115, +101,108,102, 46,115,101,114,118,101,114, 58, 99,108,111,115,101, 40, 41, 32,101, +110,100, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46,116, +112, 58, 99,108,111,115,101, 40, 41, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 72,105,103,104, + 32,108,101,118,101,108, 32, 70, 84, 80, 32, 65, 80, 73, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32,102, +117,110, 99,116,105,111,110, 32,111,118,101,114,114,105,100,101, 40,116, 41, 10, + 32, 32, 32, 32,105,102, 32,116, 46,117,114,108, 32,116,104,101,110, 10, 32, 32, + 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32,117, 32, 61, 32,117,114,108, 46, +112, 97,114,115,101, 40,116, 46,117,114,108, 41, 10, 32, 32, 32, 32, 32, 32, 32, + 32,102,111,114, 32,105, 44,118, 32,105,110, 32, 98, 97,115,101, 46,112, 97,105, +114,115, 40,116, 41, 32,100,111, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32,117, 91,105, 93, 32, 61, 32,118, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110, +100, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32,117, 10, 32, + 32, 32, 32,101,108,115,101, 32,114,101,116,117,114,110, 32,116, 32,101,110,100, + 10,101,110,100, 10, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, + 32,116,112,117,116, 40,112,117,116,116, 41, 10, 32, 32, 32, 32,112,117,116,116, + 32, 61, 32,111,118,101,114,114,105,100,101, 40,112,117,116,116, 41, 10, 32, 32, + 32, 32,115,111, 99,107,101,116, 46,116,114,121, 40,112,117,116,116, 46,104,111, +115,116, 44, 32, 34,109,105,115,115,105,110,103, 32,104,111,115,116,110, 97,109, +101, 34, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,102, 32, 61, 32,111,112, +101,110, 40,112,117,116,116, 46,104,111,115,116, 44, 32,112,117,116,116, 46,112, +111,114,116, 44, 32,112,117,116,116, 46, 99,114,101, 97,116,101, 41, 10, 32, 32, + 32, 32,102, 58,103,114,101,101,116, 40, 41, 10, 32, 32, 32, 32,102, 58,108,111, +103,105,110, 40,112,117,116,116, 46,117,115,101,114, 44, 32,112,117,116,116, 46, +112, 97,115,115,119,111,114,100, 41, 10, 32, 32, 32, 32,105,102, 32,112,117,116, +116, 46,116,121,112,101, 32,116,104,101,110, 32,102, 58,116,121,112,101, 40,112, +117,116,116, 46,116,121,112,101, 41, 32,101,110,100, 10, 32, 32, 32, 32,102, 58, +112, 97,115,118, 40, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,115,101,110, +116, 32, 61, 32,102, 58,115,101,110,100, 40,112,117,116,116, 41, 10, 32, 32, 32, + 32,102, 58,113,117,105,116, 40, 41, 10, 32, 32, 32, 32,102, 58, 99,108,111,115, +101, 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,110,116, 10, +101,110,100, 10, 10,108,111, 99, 97,108, 32,100,101,102, 97,117,108,116, 32, 61, + 32,123, 10, 9,112, 97,116,104, 32, 61, 32, 34, 47, 34, 44, 10, 9,115, 99,104, +101,109,101, 32, 61, 32, 34,102,116,112, 34, 10,125, 10, 10,108,111, 99, 97,108, + 32,102,117,110, 99,116,105,111,110, 32,112, 97,114,115,101, 40,117, 41, 10, 32, + 32, 32, 32,108,111, 99, 97,108, 32,116, 32, 61, 32,115,111, 99,107,101,116, 46, +116,114,121, 40,117,114,108, 46,112, 97,114,115,101, 40,117, 44, 32,100,101,102, + 97,117,108,116, 41, 41, 10, 32, 32, 32, 32,115,111, 99,107,101,116, 46,116,114, +121, 40,116, 46,115, 99,104,101,109,101, 32, 61, 61, 32, 34,102,116,112, 34, 44, + 32, 34,119,114,111,110,103, 32,115, 99,104,101,109,101, 32, 39, 34, 32, 46, 46, + 32,116, 46,115, 99,104,101,109,101, 32, 46, 46, 32, 34, 39, 34, 41, 10, 32, 32, + 32, 32,115,111, 99,107,101,116, 46,116,114,121, 40,116, 46,104,111,115,116, 44, + 32, 34,109,105,115,115,105,110,103, 32,104,111,115,116,110, 97,109,101, 34, 41, + 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,112, 97,116, 32, 61, 32, 34, 94,116, +121,112,101, 61, 40, 46, 41, 36, 34, 10, 32, 32, 32, 32,105,102, 32,116, 46,112, + 97,114, 97,109,115, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,116, + 46,116,121,112,101, 32, 61, 32,115,111, 99,107,101,116, 46,115,107,105,112, 40, + 50, 44, 32,115,116,114,105,110,103, 46,102,105,110,100, 40,116, 46,112, 97,114, + 97,109,115, 44, 32,112, 97,116, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,115, +111, 99,107,101,116, 46,116,114,121, 40,116, 46,116,121,112,101, 32, 61, 61, 32, + 34, 97, 34, 32,111,114, 32,116, 46,116,121,112,101, 32, 61, 61, 32, 34,105, 34, + 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 34,105,110,118, 97,108, +105,100, 32,116,121,112,101, 32, 39, 34, 32, 46, 46, 32,116, 46,116,121,112,101, + 32, 46, 46, 32, 34, 39, 34, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, + 32,114,101,116,117,114,110, 32,116, 10,101,110,100, 10, 10,108,111, 99, 97,108, + 32,102,117,110, 99,116,105,111,110, 32,115,112,117,116, 40,117, 44, 32, 98,111, +100,121, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,112,117,116,116, 32, 61, + 32,112, 97,114,115,101, 40,117, 41, 10, 32, 32, 32, 32,112,117,116,116, 46,115, +111,117,114, 99,101, 32, 61, 32,108,116,110, 49, 50, 46,115,111,117,114, 99,101, + 46,115,116,114,105,110,103, 40, 98,111,100,121, 41, 10, 32, 32, 32, 32,114,101, +116,117,114,110, 32,116,112,117,116, 40,112,117,116,116, 41, 10,101,110,100, 10, + 10,112,117,116, 32, 61, 32,115,111, 99,107,101,116, 46,112,114,111,116,101, 99, +116, 40,102,117,110, 99,116,105,111,110, 40,112,117,116,116, 44, 32, 98,111,100, +121, 41, 10, 32, 32, 32, 32,105,102, 32, 98, 97,115,101, 46,116,121,112,101, 40, +112,117,116,116, 41, 32, 61, 61, 32, 34,115,116,114,105,110,103, 34, 32,116,104, +101,110, 32,114,101,116,117,114,110, 32,115,112,117,116, 40,112,117,116,116, 44, + 32, 98,111,100,121, 41, 10, 32, 32, 32, 32,101,108,115,101, 32,114,101,116,117, +114,110, 32,116,112,117,116, 40,112,117,116,116, 41, 32,101,110,100, 10,101,110, +100, 41, 10, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,116, +103,101,116, 40,103,101,116,116, 41, 10, 32, 32, 32, 32,103,101,116,116, 32, 61, + 32,111,118,101,114,114,105,100,101, 40,103,101,116,116, 41, 10, 32, 32, 32, 32, +115,111, 99,107,101,116, 46,116,114,121, 40,103,101,116,116, 46,104,111,115,116, + 44, 32, 34,109,105,115,115,105,110,103, 32,104,111,115,116,110, 97,109,101, 34, + 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,102, 32, 61, 32,111,112,101,110, + 40,103,101,116,116, 46,104,111,115,116, 44, 32,103,101,116,116, 46,112,111,114, +116, 44, 32,103,101,116,116, 46, 99,114,101, 97,116,101, 41, 10, 32, 32, 32, 32, +102, 58,103,114,101,101,116, 40, 41, 10, 32, 32, 32, 32,102, 58,108,111,103,105, +110, 40,103,101,116,116, 46,117,115,101,114, 44, 32,103,101,116,116, 46,112, 97, +115,115,119,111,114,100, 41, 10, 32, 32, 32, 32,105,102, 32,103,101,116,116, 46, +116,121,112,101, 32,116,104,101,110, 32,102, 58,116,121,112,101, 40,103,101,116, +116, 46,116,121,112,101, 41, 32,101,110,100, 10, 32, 32, 32, 32,102, 58,112, 97, +115,118, 40, 41, 10, 32, 32, 32, 32,102, 58,114,101, 99,101,105,118,101, 40,103, +101,116,116, 41, 10, 32, 32, 32, 32,102, 58,113,117,105,116, 40, 41, 10, 32, 32, + 32, 32,114,101,116,117,114,110, 32,102, 58, 99,108,111,115,101, 40, 41, 10,101, +110,100, 10, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,115, +103,101,116, 40,117, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,103,101,116, +116, 32, 61, 32,112, 97,114,115,101, 40,117, 41, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,116, 32, 61, 32,123,125, 10, 32, 32, 32, 32,103,101,116,116, 46,115, +105,110,107, 32, 61, 32,108,116,110, 49, 50, 46,115,105,110,107, 46,116, 97, 98, +108,101, 40,116, 41, 10, 32, 32, 32, 32,116,103,101,116, 40,103,101,116,116, 41, + 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,116, 97, 98,108,101, 46, 99,111, +110, 99, 97,116, 40,116, 41, 10,101,110,100, 10, 10, 99,111,109,109, 97,110,100, + 32, 61, 32,115,111, 99,107,101,116, 46,112,114,111,116,101, 99,116, 40,102,117, +110, 99,116,105,111,110, 40, 99,109,100,116, 41, 10, 32, 32, 32, 32, 99,109,100, +116, 32, 61, 32,111,118,101,114,114,105,100,101, 40, 99,109,100,116, 41, 10, 32, + 32, 32, 32,115,111, 99,107,101,116, 46,116,114,121, 40, 99,109,100,116, 46,104, +111,115,116, 44, 32, 34,109,105,115,115,105,110,103, 32,104,111,115,116,110, 97, +109,101, 34, 41, 10, 32, 32, 32, 32,115,111, 99,107,101,116, 46,116,114,121, 40, + 99,109,100,116, 46, 99,111,109,109, 97,110,100, 44, 32, 34,109,105,115,115,105, +110,103, 32, 99,111,109,109, 97,110,100, 34, 41, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,102, 32, 61, 32,111,112,101,110, 40, 99,109,100,116, 46,104,111,115, +116, 44, 32, 99,109,100,116, 46,112,111,114,116, 44, 32, 99,109,100,116, 46, 99, +114,101, 97,116,101, 41, 10, 32, 32, 32, 32,102, 58,103,114,101,101,116, 40, 41, + 10, 32, 32, 32, 32,102, 58,108,111,103,105,110, 40, 99,109,100,116, 46,117,115, +101,114, 44, 32, 99,109,100,116, 46,112, 97,115,115,119,111,114,100, 41, 10, 32, + 32, 32, 32,102, 46,116,114,121, 40,102, 46,116,112, 58, 99,111,109,109, 97,110, +100, 40, 99,109,100,116, 46, 99,111,109,109, 97,110,100, 44, 32, 99,109,100,116, + 46, 97,114,103,117,109,101,110,116, 41, 41, 10, 32, 32, 32, 32,105,102, 32, 99, +109,100,116, 46, 99,104,101, 99,107, 32,116,104,101,110, 32,102, 46,116,114,121, + 40,102, 46,116,112, 58, 99,104,101, 99,107, 40, 99,109,100,116, 46, 99,104,101, + 99,107, 41, 41, 32,101,110,100, 10, 32, 32, 32, 32,102, 58,113,117,105,116, 40, + 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,102, 58, 99,108,111,115,101, + 40, 41, 10,101,110,100, 41, 10, 10,103,101,116, 32, 61, 32,115,111, 99,107,101, +116, 46,112,114,111,116,101, 99,116, 40,102,117,110, 99,116,105,111,110, 40,103, +101,116,116, 41, 10, 32, 32, 32, 32,105,102, 32, 98, 97,115,101, 46,116,121,112, +101, 40,103,101,116,116, 41, 32, 61, 61, 32, 34,115,116,114,105,110,103, 34, 32, +116,104,101,110, 32,114,101,116,117,114,110, 32,115,103,101,116, 40,103,101,116, +116, 41, 10, 32, 32, 32, 32,101,108,115,101, 32,114,101,116,117,114,110, 32,116, +103,101,116, 40,103,101,116,116, 41, 32,101,110,100, 10,101,110,100, 41, 10, 10, + +}; + + if (luaL_loadbuffer(L,(const char*)B1,sizeof(B1),"ftp.lua")==0) lua_call(L, 0, 0); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/http.lua b/jni/love/src/libraries/luasocket/libluasocket/http.lua new file mode 100644 index 00000000..ad8db1ee --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/http.lua @@ -0,0 +1,350 @@ +----------------------------------------------------------------------------- +-- HTTP/1.1 client support for the Lua language. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: http.lua,v 1.71 2007/10/13 23:55:20 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +------------------------------------------------------------------------------- +local socket = require("socket") +local url = require("socket.url") +local ltn12 = require("ltn12") +local mime = require("mime") +local string = require("string") +local base = _G +local table = require("table") +module("socket.http") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- connection timeout in seconds +TIMEOUT = 60 +-- default port for document retrieval +PORT = 80 +-- user agent field sent in request +USERAGENT = socket._VERSION + +----------------------------------------------------------------------------- +-- Reads MIME headers from a connection, unfolding where needed +----------------------------------------------------------------------------- +local function receiveheaders(sock, headers) + local line, name, value, err + headers = headers or {} + -- get first line + line, err = sock:receive() + if err then return nil, err end + -- headers go until a blank line is found + while line ~= "" do + -- get field-name and value + name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)")) + if not (name and value) then return nil, "malformed reponse headers" end + name = string.lower(name) + -- get next line (value might be folded) + line, err = sock:receive() + if err then return nil, err end + -- unfold any folded values + while string.find(line, "^%s") do + value = value .. line + line = sock:receive() + if err then return nil, err end + end + -- save pair in table + if headers[name] then headers[name] = headers[name] .. ", " .. value + else headers[name] = value end + end + return headers +end + +----------------------------------------------------------------------------- +-- Extra sources and sinks +----------------------------------------------------------------------------- +socket.sourcet["http-chunked"] = function(sock, headers) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + -- get chunk size, skip extention + local line, err = sock:receive() + if err then return nil, err end + local size = base.tonumber(string.gsub(line, ";.*", ""), 16) + if not size then return nil, "invalid chunk size" end + -- was it the last chunk? + if size > 0 then + -- if not, get chunk and skip terminating CRLF + local chunk, err, part = sock:receive(size) + if chunk then sock:receive() end + return chunk, err + else + -- if it was, read trailers into headers table + headers, err = receiveheaders(sock, headers) + if not headers then return nil, err end + end + end + }) +end + +socket.sinkt["http-chunked"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if not chunk then return sock:send("0\r\n\r\n") end + local size = string.format("%X\r\n", string.len(chunk)) + return sock:send(size .. chunk .. "\r\n") + end + }) +end + +----------------------------------------------------------------------------- +-- Low level HTTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function open(host, port, create) + -- create socket with user connect function, or with default + local c = socket.try((create or socket.tcp)()) + local h = base.setmetatable({ c = c }, metat) + -- create finalized try + h.try = socket.newtry(function() h:close() end) + -- set timeout before connecting + h.try(c:settimeout(TIMEOUT)) + h.try(c:connect(host, port or PORT)) + -- here everything worked + return h +end + +function metat.__index:sendrequestline(method, uri) + local reqline = string.format("%s %s HTTP/1.1\r\n", method or "GET", uri) + return self.try(self.c:send(reqline)) +end + +function metat.__index:sendheaders(headers) + local h = "\r\n" + for i, v in base.pairs(headers) do + h = i .. ": " .. v .. "\r\n" .. h + end + self.try(self.c:send(h)) + return 1 +end + +function metat.__index:sendbody(headers, source, step) + source = source or ltn12.source.empty() + step = step or ltn12.pump.step + -- if we don't know the size in advance, send chunked and hope for the best + local mode = "http-chunked" + if headers["content-length"] then mode = "keep-open" end + return self.try(ltn12.pump.all(source, socket.sink(mode, self.c), step)) +end + +function metat.__index:receivestatusline() + local status = self.try(self.c:receive(5)) + -- identify HTTP/0.9 responses, which do not contain a status line + -- this is just a heuristic, but is what the RFC recommends + if status ~= "HTTP/" then return nil, status end + -- otherwise proceed reading a status line + status = self.try(self.c:receive("*l", status)) + local code = socket.skip(2, string.find(status, "HTTP/%d*%.%d* (%d%d%d)")) + return self.try(base.tonumber(code), status) +end + +function metat.__index:receiveheaders() + return self.try(receiveheaders(self.c)) +end + +function metat.__index:receivebody(headers, sink, step) + sink = sink or ltn12.sink.null() + step = step or ltn12.pump.step + local length = base.tonumber(headers["content-length"]) + local t = headers["transfer-encoding"] -- shortcut + local mode = "default" -- connection close + if t and t ~= "identity" then mode = "http-chunked" + elseif base.tonumber(headers["content-length"]) then mode = "by-length" end + return self.try(ltn12.pump.all(socket.source(mode, self.c, length), + sink, step)) +end + +function metat.__index:receive09body(status, sink, step) + local source = ltn12.source.rewind(socket.source("until-closed", self.c)) + source(status) + return self.try(ltn12.pump.all(source, sink, step)) +end + +function metat.__index:close() + return self.c:close() +end + +----------------------------------------------------------------------------- +-- High level HTTP API +----------------------------------------------------------------------------- +local function adjusturi(reqt) + local u = reqt + -- if there is a proxy, we need the full url. otherwise, just a part. + if not reqt.proxy and not PROXY then + u = { + path = socket.try(reqt.path, "invalid path 'nil'"), + params = reqt.params, + query = reqt.query, + fragment = reqt.fragment + } + end + return url.build(u) +end + +local function adjustproxy(reqt) + local proxy = reqt.proxy or PROXY + if proxy then + proxy = url.parse(proxy) + return proxy.host, proxy.port or 3128 + else + return reqt.host, reqt.port + end +end + +local function adjustheaders(reqt) + -- default headers + local lower = { + ["user-agent"] = USERAGENT, + ["host"] = reqt.host, + ["connection"] = "close, TE", + ["te"] = "trailers" + } + -- if we have authentication information, pass it along + if reqt.user and reqt.password then + lower["authorization"] = + "Basic " .. (mime.b64(reqt.user .. ":" .. reqt.password)) + end + -- override with user headers + for i,v in base.pairs(reqt.headers or lower) do + lower[string.lower(i)] = v + end + return lower +end + +-- default url parts +local default = { + host = "", + port = PORT, + path ="/", + scheme = "http" +} + +local function adjustrequest(reqt) + -- parse url if provided + local nreqt = reqt.url and url.parse(reqt.url, default) or {} + -- explicit components override url + for i,v in base.pairs(reqt) do nreqt[i] = v end + if nreqt.port == "" then nreqt.port = 80 end + socket.try(nreqt.host and nreqt.host ~= "", + "invalid host '" .. base.tostring(nreqt.host) .. "'") + -- compute uri if user hasn't overriden + nreqt.uri = reqt.uri or adjusturi(nreqt) + -- ajust host and port if there is a proxy + nreqt.host, nreqt.port = adjustproxy(nreqt) + -- adjust headers in request + nreqt.headers = adjustheaders(nreqt) + return nreqt +end + +local function shouldredirect(reqt, code, headers) + return headers.location and + string.gsub(headers.location, "%s", "") ~= "" and + (reqt.redirect ~= false) and + (code == 301 or code == 302) and + (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD") + and (not reqt.nredirects or reqt.nredirects < 5) +end + +local function shouldreceivebody(reqt, code) + if reqt.method == "HEAD" then return nil end + if code == 204 or code == 304 then return nil end + if code >= 100 and code < 200 then return nil end + return 1 +end + +-- forward declarations +local trequest, tredirect + +function tredirect(reqt, location) + local result, code, headers, status = trequest { + -- the RFC says the redirect URL has to be absolute, but some + -- servers do not respect that + url = url.absolute(reqt.url, location), + source = reqt.source, + sink = reqt.sink, + headers = reqt.headers, + proxy = reqt.proxy, + nredirects = (reqt.nredirects or 0) + 1, + create = reqt.create + } + -- pass location header back as a hint we redirected + headers = headers or {} + headers.location = headers.location or location + return result, code, headers, status +end + +function trequest(reqt) + -- we loop until we get what we want, or + -- until we are sure there is no way to get it + local nreqt = adjustrequest(reqt) + local h = open(nreqt.host, nreqt.port, nreqt.create) + -- send request line and headers + h:sendrequestline(nreqt.method, nreqt.uri) + h:sendheaders(nreqt.headers) + -- if there is a body, send it + if nreqt.source then + h:sendbody(nreqt.headers, nreqt.source, nreqt.step) + end + local code, status = h:receivestatusline() + -- if it is an HTTP/0.9 server, simply get the body and we are done + if not code then + h:receive09body(status, nreqt.sink, nreqt.step) + return 1, 200 + end + local headers + -- ignore any 100-continue messages + while code == 100 do + headers = h:receiveheaders() + code, status = h:receivestatusline() + end + headers = h:receiveheaders() + -- at this point we should have a honest reply from the server + -- we can't redirect if we already used the source, so we report the error + if shouldredirect(nreqt, code, headers) and not nreqt.source then + h:close() + return tredirect(reqt, headers.location) + end + -- here we are finally done + if shouldreceivebody(nreqt, code) then + h:receivebody(headers, nreqt.sink, nreqt.step) + end + h:close() + return 1, code, headers, status +end + +local function srequest(u, b) + local t = {} + local reqt = { + url = u, + sink = ltn12.sink.table(t) + } + if b then + reqt.source = ltn12.source.string(b) + reqt.headers = { + ["content-length"] = string.len(b), + ["content-type"] = "application/x-www-form-urlencoded" + } + reqt.method = "POST" + end + local code, headers, status = socket.skip(1, trequest(reqt)) + return table.concat(t), code, headers, status +end + +request = socket.protect(function(reqt, body) + if base.type(reqt) == "string" then return srequest(reqt, body) + else return trequest(reqt) end +end) diff --git a/jni/love/src/libraries/luasocket/libluasocket/http.lua.h b/jni/love/src/libraries/luasocket/libluasocket/http.lua.h new file mode 100644 index 00000000..556a57bb --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/http.lua.h @@ -0,0 +1,621 @@ +/* code automatically generated by bin2c -- DO NOT EDIT */ +/* #include'ing this file in a C program is equivalent to calling + if (luaL_loadfile(L,"http.lua")==0) lua_call(L, 0, 0); +*/ +{ +/* http.lua */ +static const unsigned char B1[]={ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 72, 84, 84, 80, 47, 49, 46, 49, 32, 99,108,105,101,110,116, 32,115,117,112, +112,111,114,116, 32,102,111,114, 32,116,104,101, 32, 76,117, 97, 32,108, 97,110, +103,117, 97,103,101, 46, 10, 45, 45, 32, 76,117, 97, 83,111, 99,107,101,116, 32, +116,111,111,108,107,105,116, 46, 10, 45, 45, 32, 65,117,116,104,111,114, 58, 32, + 68,105,101,103,111, 32, 78,101,104, 97, 98, 10, 45, 45, 32, 82, 67, 83, 32, 73, + 68, 58, 32, 36, 73,100, 58, 32,104,116,116,112, 46,108,117, 97, 44,118, 32, 49, + 46, 55, 49, 32, 50, 48, 48, 55, 47, 49, 48, 47, 49, 51, 32, 50, 51, 58, 53, 53, + 58, 50, 48, 32,100,105,101,103,111, 32, 69,120,112, 32, 36, 10, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 68,101, 99,108, + 97,114,101, 32,109,111,100,117,108,101, 32, 97,110,100, 32,105,109,112,111,114, +116, 32,100,101,112,101,110,100,101,110, 99,105,101,115, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, + 32,115,111, 99,107,101,116, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,115, +111, 99,107,101,116, 34, 41, 10,108,111, 99, 97,108, 32,117,114,108, 32, 61, 32, +114,101,113,117,105,114,101, 40, 34,115,111, 99,107,101,116, 46,117,114,108, 34, + 41, 10,108,111, 99, 97,108, 32,108,116,110, 49, 50, 32, 61, 32,114,101,113,117, +105,114,101, 40, 34,108,116,110, 49, 50, 34, 41, 10,108,111, 99, 97,108, 32,109, +105,109,101, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,109,105,109,101, 34, + 41, 10,108,111, 99, 97,108, 32,115,116,114,105,110,103, 32, 61, 32,114,101,113, +117,105,114,101, 40, 34,115,116,114,105,110,103, 34, 41, 10,108,111, 99, 97,108, + 32, 98, 97,115,101, 32, 61, 32, 95, 71, 10,108,111, 99, 97,108, 32,116, 97, 98, +108,101, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,116, 97, 98,108,101, 34, + 41, 10,109,111,100,117,108,101, 40, 34,115,111, 99,107,101,116, 46,104,116,116, +112, 34, 41, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 10, 45, 45, 32, 80,114,111,103,114, 97,109, 32, 99,111,110,115,116, 97, +110,116,115, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 10, 45, 45, 32, 99,111,110,110,101, 99,116,105,111,110, 32,116,105,109,101, +111,117,116, 32,105,110, 32,115,101, 99,111,110,100,115, 10, 84, 73, 77, 69, 79, + 85, 84, 32, 61, 32, 54, 48, 10, 45, 45, 32,100,101,102, 97,117,108,116, 32,112, +111,114,116, 32,102,111,114, 32,100,111, 99,117,109,101,110,116, 32,114,101,116, +114,105,101,118, 97,108, 10, 80, 79, 82, 84, 32, 61, 32, 56, 48, 10, 45, 45, 32, +117,115,101,114, 32, 97,103,101,110,116, 32,102,105,101,108,100, 32,115,101,110, +116, 32,105,110, 32,114,101,113,117,101,115,116, 10, 85, 83, 69, 82, 65, 71, 69, + 78, 84, 32, 61, 32,115,111, 99,107,101,116, 46, 95, 86, 69, 82, 83, 73, 79, 78, + 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, + 45, 45, 32, 82,101, 97,100,115, 32, 77, 73, 77, 69, 32,104,101, 97,100,101,114, +115, 32,102,114,111,109, 32, 97, 32, 99,111,110,110,101, 99,116,105,111,110, 44, + 32,117,110,102,111,108,100,105,110,103, 32,119,104,101,114,101, 32,110,101,101, +100,101,100, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,114,101, 99, +101,105,118,101,104,101, 97,100,101,114,115, 40,115,111, 99,107, 44, 32,104,101, + 97,100,101,114,115, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,108,105,110, +101, 44, 32,110, 97,109,101, 44, 32,118, 97,108,117,101, 44, 32,101,114,114, 10, + 32, 32, 32, 32,104,101, 97,100,101,114,115, 32, 61, 32,104,101, 97,100,101,114, +115, 32,111,114, 32,123,125, 10, 32, 32, 32, 32, 45, 45, 32,103,101,116, 32,102, +105,114,115,116, 32,108,105,110,101, 10, 32, 32, 32, 32,108,105,110,101, 44, 32, +101,114,114, 32, 61, 32,115,111, 99,107, 58,114,101, 99,101,105,118,101, 40, 41, + 10, 32, 32, 32, 32,105,102, 32,101,114,114, 32,116,104,101,110, 32,114,101,116, +117,114,110, 32,110,105,108, 44, 32,101,114,114, 32,101,110,100, 10, 32, 32, 32, + 32, 45, 45, 32,104,101, 97,100,101,114,115, 32,103,111, 32,117,110,116,105,108, + 32, 97, 32, 98,108, 97,110,107, 32,108,105,110,101, 32,105,115, 32,102,111,117, +110,100, 10, 32, 32, 32, 32,119,104,105,108,101, 32,108,105,110,101, 32,126, 61, + 32, 34, 34, 32,100,111, 10, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 32,103,101, +116, 32,102,105,101,108,100, 45,110, 97,109,101, 32, 97,110,100, 32,118, 97,108, +117,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,110, 97,109,101, 44, 32,118, 97,108, +117,101, 32, 61, 32,115,111, 99,107,101,116, 46,115,107,105,112, 40, 50, 44, 32, +115,116,114,105,110,103, 46,102,105,110,100, 40,108,105,110,101, 44, 32, 34, 94, + 40, 46, 45, 41, 58, 37,115, 42, 40, 46, 42, 41, 34, 41, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32,105,102, 32,110,111,116, 32, 40,110, 97,109,101, 32, 97,110,100, + 32,118, 97,108,117,101, 41, 32,116,104,101,110, 32,114,101,116,117,114,110, 32, +110,105,108, 44, 32, 34,109, 97,108,102,111,114,109,101,100, 32,114,101,112,111, +110,115,101, 32,104,101, 97,100,101,114,115, 34, 32,101,110,100, 10, 32, 32, 32, + 32, 32, 32, 32, 32,110, 97,109,101, 32, 61, 32,115,116,114,105,110,103, 46,108, +111,119,101,114, 40,110, 97,109,101, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 45, + 45, 32,103,101,116, 32,110,101,120,116, 32,108,105,110,101, 32, 40,118, 97,108, +117,101, 32,109,105,103,104,116, 32, 98,101, 32,102,111,108,100,101,100, 41, 10, + 32, 32, 32, 32, 32, 32, 32, 32,108,105,110,101, 44, 32,101,114,114, 32, 32, 61, + 32,115,111, 99,107, 58,114,101, 99,101,105,118,101, 40, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32,105,102, 32,101,114,114, 32,116,104,101,110, 32,114,101,116,117, +114,110, 32,110,105,108, 44, 32,101,114,114, 32,101,110,100, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 45, 45, 32,117,110,102,111,108,100, 32, 97,110,121, 32,102,111, +108,100,101,100, 32,118, 97,108,117,101,115, 10, 32, 32, 32, 32, 32, 32, 32, 32, +119,104,105,108,101, 32,115,116,114,105,110,103, 46,102,105,110,100, 40,108,105, +110,101, 44, 32, 34, 94, 37,115, 34, 41, 32,100,111, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32,118, 97,108,117,101, 32, 61, 32,118, 97,108,117,101, 32, + 46, 46, 32,108,105,110,101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +108,105,110,101, 32, 61, 32,115,111, 99,107, 58,114,101, 99,101,105,118,101, 40, + 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,101,114,114, + 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114, +114, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 45, 45, 32,115, 97,118,101, 32,112, 97,105,114, 32,105, +110, 32,116, 97, 98,108,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,104, +101, 97,100,101,114,115, 91,110, 97,109,101, 93, 32,116,104,101,110, 32,104,101, + 97,100,101,114,115, 91,110, 97,109,101, 93, 32, 61, 32,104,101, 97,100,101,114, +115, 91,110, 97,109,101, 93, 32, 46, 46, 32, 34, 44, 32, 34, 32, 46, 46, 32,118, + 97,108,117,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 32,104,101, + 97,100,101,114,115, 91,110, 97,109,101, 93, 32, 61, 32,118, 97,108,117,101, 32, +101,110,100, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,114,101,116,117, +114,110, 32,104,101, 97,100,101,114,115, 10,101,110,100, 10, 10, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 69,120,116, +114, 97, 32,115,111,117,114, 99,101,115, 32, 97,110,100, 32,115,105,110,107,115, + 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,115, +111, 99,107,101,116, 46,115,111,117,114, 99,101,116, 91, 34,104,116,116,112, 45, + 99,104,117,110,107,101,100, 34, 93, 32, 61, 32,102,117,110, 99,116,105,111,110, + 40,115,111, 99,107, 44, 32,104,101, 97,100,101,114,115, 41, 10, 32, 32, 32, 32, +114,101,116,117,114,110, 32, 98, 97,115,101, 46,115,101,116,109,101,116, 97,116, + 97, 98,108,101, 40,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,103,101,116,102,100, + 32, 61, 32,102,117,110, 99,116,105,111,110, 40, 41, 32,114,101,116,117,114,110, + 32,115,111, 99,107, 58,103,101,116,102,100, 40, 41, 32,101,110,100, 44, 10, 32, + 32, 32, 32, 32, 32, 32, 32,100,105,114,116,121, 32, 61, 32,102,117,110, 99,116, +105,111,110, 40, 41, 32,114,101,116,117,114,110, 32,115,111, 99,107, 58,100,105, +114,116,121, 40, 41, 32,101,110,100, 10, 32, 32, 32, 32,125, 44, 32,123, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 95, 95, 99, 97,108,108, 32, 61, 32,102,117,110, 99, +116,105,111,110, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, + 45, 32,103,101,116, 32, 99,104,117,110,107, 32,115,105,122,101, 44, 32,115,107, +105,112, 32,101,120,116,101,110,116,105,111,110, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,108,111, 99, 97,108, 32,108,105,110,101, 44, 32,101,114,114, + 32, 61, 32,115,111, 99,107, 58,114,101, 99,101,105,118,101, 40, 41, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,101,114,114, 32,116,104,101, +110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114,114, 32,101,110, +100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32, +115,105,122,101, 32, 61, 32, 98, 97,115,101, 46,116,111,110,117,109, 98,101,114, + 40,115,116,114,105,110,103, 46,103,115,117, 98, 40,108,105,110,101, 44, 32, 34, + 59, 46, 42, 34, 44, 32, 34, 34, 41, 44, 32, 49, 54, 41, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32,115,105,122,101, 32,116, +104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32, 34,105,110,118, + 97,108,105,100, 32, 99,104,117,110,107, 32,115,105,122,101, 34, 32,101,110,100, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 32,119, 97,115, 32, +105,116, 32,116,104,101, 32,108, 97,115,116, 32, 99,104,117,110,107, 63, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,115,105,122,101, 32, 62, + 32, 48, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 45, 45, 32,105,102, 32,110,111,116, 44, 32,103,101,116, 32, 99, +104,117,110,107, 32, 97,110,100, 32,115,107,105,112, 32,116,101,114,109,105,110, + 97,116,105,110,103, 32, 67, 82, 76, 70, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,104,117,110,107, 44, 32, +101,114,114, 44, 32,112, 97,114,116, 32, 61, 32,115,111, 99,107, 58,114,101, 99, +101,105,118,101, 40,115,105,122,101, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,105,102, 32, 99,104,117,110,107, 32,116,104,101,110, + 32,115,111, 99,107, 58,114,101, 99,101,105,118,101, 40, 41, 32,101,110,100, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117, +114,110, 32, 99,104,117,110,107, 44, 32,101,114,114, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 45, 45, 32,105,102, 32,105,116, 32,119, 97,115, 44, + 32,114,101, 97,100, 32,116,114, 97,105,108,101,114,115, 32,105,110,116,111, 32, +104,101, 97,100,101,114,115, 32,116, 97, 98,108,101, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104,101, 97,100,101,114,115, 44, 32,101, +114,114, 32, 61, 32,114,101, 99,101,105,118,101,104,101, 97,100,101,114,115, 40, +115,111, 99,107, 44, 32,104,101, 97,100,101,114,115, 41, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32,104,101, + 97,100,101,114,115, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105, +108, 44, 32,101,114,114, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, + 32, 32, 32,125, 41, 10,101,110,100, 10, 10,115,111, 99,107,101,116, 46,115,105, +110,107,116, 91, 34,104,116,116,112, 45, 99,104,117,110,107,101,100, 34, 93, 32, + 61, 32,102,117,110, 99,116,105,111,110, 40,115,111, 99,107, 41, 10, 32, 32, 32, + 32,114,101,116,117,114,110, 32, 98, 97,115,101, 46,115,101,116,109,101,116, 97, +116, 97, 98,108,101, 40,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,103,101,116,102, +100, 32, 61, 32,102,117,110, 99,116,105,111,110, 40, 41, 32,114,101,116,117,114, +110, 32,115,111, 99,107, 58,103,101,116,102,100, 40, 41, 32,101,110,100, 44, 10, + 32, 32, 32, 32, 32, 32, 32, 32,100,105,114,116,121, 32, 61, 32,102,117,110, 99, +116,105,111,110, 40, 41, 32,114,101,116,117,114,110, 32,115,111, 99,107, 58,100, +105,114,116,121, 40, 41, 32,101,110,100, 10, 32, 32, 32, 32,125, 44, 32,123, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 95, 95, 99, 97,108,108, 32, 61, 32,102,117,110, + 99,116,105,111,110, 40,115,101,108,102, 44, 32, 99,104,117,110,107, 44, 32,101, +114,114, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110, +111,116, 32, 99,104,117,110,107, 32,116,104,101,110, 32,114,101,116,117,114,110, + 32,115,111, 99,107, 58,115,101,110,100, 40, 34, 48, 92,114, 92,110, 92,114, 92, +110, 34, 41, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +108,111, 99, 97,108, 32,115,105,122,101, 32, 61, 32,115,116,114,105,110,103, 46, +102,111,114,109, 97,116, 40, 34, 37, 88, 92,114, 92,110, 34, 44, 32,115,116,114, +105,110,103, 46,108,101,110, 40, 99,104,117,110,107, 41, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,111, 99,107, 58, +115,101,110,100, 40,115,105,122,101, 32, 46, 46, 32, 32, 99,104,117,110,107, 32, + 46, 46, 32, 34, 92,114, 92,110, 34, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,101, +110,100, 10, 32, 32, 32, 32,125, 41, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 76,111,119, 32, +108,101,118,101,108, 32, 72, 84, 84, 80, 32, 65, 80, 73, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32,109, +101,116, 97,116, 32, 61, 32,123, 32, 95, 95,105,110,100,101,120, 32, 61, 32,123, +125, 32,125, 10, 10,102,117,110, 99,116,105,111,110, 32,111,112,101,110, 40,104, +111,115,116, 44, 32,112,111,114,116, 44, 32, 99,114,101, 97,116,101, 41, 10, 32, + 32, 32, 32, 45, 45, 32, 99,114,101, 97,116,101, 32,115,111, 99,107,101,116, 32, +119,105,116,104, 32,117,115,101,114, 32, 99,111,110,110,101, 99,116, 32,102,117, +110, 99,116,105,111,110, 44, 32,111,114, 32,119,105,116,104, 32,100,101,102, 97, +117,108,116, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99, 32, 61, 32,115,111, + 99,107,101,116, 46,116,114,121, 40, 40, 99,114,101, 97,116,101, 32,111,114, 32, +115,111, 99,107,101,116, 46,116, 99,112, 41, 40, 41, 41, 10, 32, 32, 32, 32,108, +111, 99, 97,108, 32,104, 32, 61, 32, 98, 97,115,101, 46,115,101,116,109,101,116, + 97,116, 97, 98,108,101, 40,123, 32, 99, 32, 61, 32, 99, 32,125, 44, 32,109,101, +116, 97,116, 41, 10, 32, 32, 32, 32, 45, 45, 32, 99,114,101, 97,116,101, 32,102, +105,110, 97,108,105,122,101,100, 32,116,114,121, 10, 32, 32, 32, 32,104, 46,116, +114,121, 32, 61, 32,115,111, 99,107,101,116, 46,110,101,119,116,114,121, 40,102, +117,110, 99,116,105,111,110, 40, 41, 32,104, 58, 99,108,111,115,101, 40, 41, 32, +101,110,100, 41, 10, 32, 32, 32, 32, 45, 45, 32,115,101,116, 32,116,105,109,101, +111,117,116, 32, 98,101,102,111,114,101, 32, 99,111,110,110,101, 99,116,105,110, +103, 10, 32, 32, 32, 32,104, 46,116,114,121, 40, 99, 58,115,101,116,116,105,109, +101,111,117,116, 40, 84, 73, 77, 69, 79, 85, 84, 41, 41, 10, 32, 32, 32, 32,104, + 46,116,114,121, 40, 99, 58, 99,111,110,110,101, 99,116, 40,104,111,115,116, 44, + 32,112,111,114,116, 32,111,114, 32, 80, 79, 82, 84, 41, 41, 10, 32, 32, 32, 32, + 45, 45, 32,104,101,114,101, 32,101,118,101,114,121,116,104,105,110,103, 32,119, +111,114,107,101,100, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,104, 10,101, +110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, + 95,105,110,100,101,120, 58,115,101,110,100,114,101,113,117,101,115,116,108,105, +110,101, 40,109,101,116,104,111,100, 44, 32,117,114,105, 41, 10, 32, 32, 32, 32, +108,111, 99, 97,108, 32,114,101,113,108,105,110,101, 32, 61, 32,115,116,114,105, +110,103, 46,102,111,114,109, 97,116, 40, 34, 37,115, 32, 37,115, 32, 72, 84, 84, + 80, 47, 49, 46, 49, 92,114, 92,110, 34, 44, 32,109,101,116,104,111,100, 32,111, +114, 32, 34, 71, 69, 84, 34, 44, 32,117,114,105, 41, 10, 32, 32, 32, 32,114,101, +116,117,114,110, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46, 99, + 58,115,101,110,100, 40,114,101,113,108,105,110,101, 41, 41, 10,101,110,100, 10, + 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110, +100,101,120, 58,115,101,110,100,104,101, 97,100,101,114,115, 40,104,101, 97,100, +101,114,115, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,104, 32, 61, 32, 34, + 92,114, 92,110, 34, 10, 32, 32, 32, 32,102,111,114, 32,105, 44, 32,118, 32,105, +110, 32, 98, 97,115,101, 46,112, 97,105,114,115, 40,104,101, 97,100,101,114,115, + 41, 32,100,111, 10, 32, 32, 32, 32, 32, 32, 32, 32,104, 32, 61, 32,105, 32, 46, + 46, 32, 34, 58, 32, 34, 32, 46, 46, 32,118, 32, 46, 46, 32, 34, 92,114, 92,110, + 34, 32, 46, 46, 32,104, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,115, +101,108,102, 46,116,114,121, 40,115,101,108,102, 46, 99, 58,115,101,110,100, 40, +104, 41, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, 49, 10,101,110,100, + 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105, +110,100,101,120, 58,115,101,110,100, 98,111,100,121, 40,104,101, 97,100,101,114, +115, 44, 32,115,111,117,114, 99,101, 44, 32,115,116,101,112, 41, 10, 32, 32, 32, + 32,115,111,117,114, 99,101, 32, 61, 32,115,111,117,114, 99,101, 32,111,114, 32, +108,116,110, 49, 50, 46,115,111,117,114, 99,101, 46,101,109,112,116,121, 40, 41, + 10, 32, 32, 32, 32,115,116,101,112, 32, 61, 32,115,116,101,112, 32,111,114, 32, +108,116,110, 49, 50, 46,112,117,109,112, 46,115,116,101,112, 10, 32, 32, 32, 32, + 45, 45, 32,105,102, 32,119,101, 32,100,111,110, 39,116, 32,107,110,111,119, 32, +116,104,101, 32,115,105,122,101, 32,105,110, 32, 97,100,118, 97,110, 99,101, 44, + 32,115,101,110,100, 32, 99,104,117,110,107,101,100, 32, 97,110,100, 32,104,111, +112,101, 32,102,111,114, 32,116,104,101, 32, 98,101,115,116, 10, 32, 32, 32, 32, +108,111, 99, 97,108, 32,109,111,100,101, 32, 61, 32, 34,104,116,116,112, 45, 99, +104,117,110,107,101,100, 34, 10, 32, 32, 32, 32,105,102, 32,104,101, 97,100,101, +114,115, 91, 34, 99,111,110,116,101,110,116, 45,108,101,110,103,116,104, 34, 93, + 32,116,104,101,110, 32,109,111,100,101, 32, 61, 32, 34,107,101,101,112, 45,111, +112,101,110, 34, 32,101,110,100, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, +115,101,108,102, 46,116,114,121, 40,108,116,110, 49, 50, 46,112,117,109,112, 46, + 97,108,108, 40,115,111,117,114, 99,101, 44, 32,115,111, 99,107,101,116, 46,115, +105,110,107, 40,109,111,100,101, 44, 32,115,101,108,102, 46, 99, 41, 44, 32,115, +116,101,112, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, +109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,114,101, 99,101,105,118, +101,115,116, 97,116,117,115,108,105,110,101, 40, 41, 10, 32, 32, 32, 32,108,111, + 99, 97,108, 32,115,116, 97,116,117,115, 32, 61, 32,115,101,108,102, 46,116,114, +121, 40,115,101,108,102, 46, 99, 58,114,101, 99,101,105,118,101, 40, 53, 41, 41, + 10, 32, 32, 32, 32, 45, 45, 32,105,100,101,110,116,105,102,121, 32, 72, 84, 84, + 80, 47, 48, 46, 57, 32,114,101,115,112,111,110,115,101,115, 44, 32,119,104,105, + 99,104, 32,100,111, 32,110,111,116, 32, 99,111,110,116, 97,105,110, 32, 97, 32, +115,116, 97,116,117,115, 32,108,105,110,101, 10, 32, 32, 32, 32, 45, 45, 32,116, +104,105,115, 32,105,115, 32,106,117,115,116, 32, 97, 32,104,101,117,114,105,115, +116,105, 99, 44, 32, 98,117,116, 32,105,115, 32,119,104, 97,116, 32,116,104,101, + 32, 82, 70, 67, 32,114,101, 99,111,109,109,101,110,100,115, 10, 32, 32, 32, 32, +105,102, 32,115,116, 97,116,117,115, 32,126, 61, 32, 34, 72, 84, 84, 80, 47, 34, + 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,115,116, + 97,116,117,115, 32,101,110,100, 10, 32, 32, 32, 32, 45, 45, 32,111,116,104,101, +114,119,105,115,101, 32,112,114,111, 99,101,101,100, 32,114,101, 97,100,105,110, +103, 32, 97, 32,115,116, 97,116,117,115, 32,108,105,110,101, 10, 32, 32, 32, 32, +115,116, 97,116,117,115, 32, 61, 32,115,101,108,102, 46,116,114,121, 40,115,101, +108,102, 46, 99, 58,114,101, 99,101,105,118,101, 40, 34, 42,108, 34, 44, 32,115, +116, 97,116,117,115, 41, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,111, +100,101, 32, 61, 32,115,111, 99,107,101,116, 46,115,107,105,112, 40, 50, 44, 32, +115,116,114,105,110,103, 46,102,105,110,100, 40,115,116, 97,116,117,115, 44, 32, + 34, 72, 84, 84, 80, 47, 37,100, 42, 37, 46, 37,100, 42, 32, 40, 37,100, 37,100, + 37,100, 41, 34, 41, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101, +108,102, 46,116,114,121, 40, 98, 97,115,101, 46,116,111,110,117,109, 98,101,114, + 40, 99,111,100,101, 41, 44, 32,115,116, 97,116,117,115, 41, 10,101,110,100, 10, + 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110, +100,101,120, 58,114,101, 99,101,105,118,101,104,101, 97,100,101,114,115, 40, 41, + 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46,116,114,121, + 40,114,101, 99,101,105,118,101,104,101, 97,100,101,114,115, 40,115,101,108,102, + 46, 99, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109, +101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,114,101, 99,101,105,118,101, + 98,111,100,121, 40,104,101, 97,100,101,114,115, 44, 32,115,105,110,107, 44, 32, +115,116,101,112, 41, 10, 32, 32, 32, 32,115,105,110,107, 32, 61, 32,115,105,110, +107, 32,111,114, 32,108,116,110, 49, 50, 46,115,105,110,107, 46,110,117,108,108, + 40, 41, 10, 32, 32, 32, 32,115,116,101,112, 32, 61, 32,115,116,101,112, 32,111, +114, 32,108,116,110, 49, 50, 46,112,117,109,112, 46,115,116,101,112, 10, 32, 32, + 32, 32,108,111, 99, 97,108, 32,108,101,110,103,116,104, 32, 61, 32, 98, 97,115, +101, 46,116,111,110,117,109, 98,101,114, 40,104,101, 97,100,101,114,115, 91, 34, + 99,111,110,116,101,110,116, 45,108,101,110,103,116,104, 34, 93, 41, 10, 32, 32, + 32, 32,108,111, 99, 97,108, 32,116, 32, 61, 32,104,101, 97,100,101,114,115, 91, + 34,116,114, 97,110,115,102,101,114, 45,101,110, 99,111,100,105,110,103, 34, 93, + 32, 45, 45, 32,115,104,111,114,116, 99,117,116, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,109,111,100,101, 32, 61, 32, 34,100,101,102, 97,117,108,116, 34, 32, + 45, 45, 32, 99,111,110,110,101, 99,116,105,111,110, 32, 99,108,111,115,101, 10, + 32, 32, 32, 32,105,102, 32,116, 32, 97,110,100, 32,116, 32,126, 61, 32, 34,105, +100,101,110,116,105,116,121, 34, 32,116,104,101,110, 32,109,111,100,101, 32, 61, + 32, 34,104,116,116,112, 45, 99,104,117,110,107,101,100, 34, 10, 32, 32, 32, 32, +101,108,115,101,105,102, 32, 98, 97,115,101, 46,116,111,110,117,109, 98,101,114, + 40,104,101, 97,100,101,114,115, 91, 34, 99,111,110,116,101,110,116, 45,108,101, +110,103,116,104, 34, 93, 41, 32,116,104,101,110, 32,109,111,100,101, 32, 61, 32, + 34, 98,121, 45,108,101,110,103,116,104, 34, 32,101,110,100, 10, 32, 32, 32, 32, +114,101,116,117,114,110, 32,115,101,108,102, 46,116,114,121, 40,108,116,110, 49, + 50, 46,112,117,109,112, 46, 97,108,108, 40,115,111, 99,107,101,116, 46,115,111, +117,114, 99,101, 40,109,111,100,101, 44, 32,115,101,108,102, 46, 99, 44, 32,108, +101,110,103,116,104, 41, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,105,110,107, + 44, 32,115,116,101,112, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105, +111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,114,101, 99, +101,105,118,101, 48, 57, 98,111,100,121, 40,115,116, 97,116,117,115, 44, 32,115, +105,110,107, 44, 32,115,116,101,112, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, + 32,115,111,117,114, 99,101, 32, 61, 32,108,116,110, 49, 50, 46,115,111,117,114, + 99,101, 46,114,101,119,105,110,100, 40,115,111, 99,107,101,116, 46,115,111,117, +114, 99,101, 40, 34,117,110,116,105,108, 45, 99,108,111,115,101,100, 34, 44, 32, +115,101,108,102, 46, 99, 41, 41, 10, 32, 32, 32, 32,115,111,117,114, 99,101, 40, +115,116, 97,116,117,115, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115, +101,108,102, 46,116,114,121, 40,108,116,110, 49, 50, 46,112,117,109,112, 46, 97, +108,108, 40,115,111,117,114, 99,101, 44, 32,115,105,110,107, 44, 32,115,116,101, +112, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101, +116, 97,116, 46, 95, 95,105,110,100,101,120, 58, 99,108,111,115,101, 40, 41, 10, + 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46, 99, 58, 99,108, +111,115,101, 40, 41, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 72,105,103,104, 32,108,101,118, +101,108, 32, 72, 84, 84, 80, 32, 65, 80, 73, 10, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32,102,117,110, 99, +116,105,111,110, 32, 97,100,106,117,115,116,117,114,105, 40,114,101,113,116, 41, + 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,117, 32, 61, 32,114,101,113,116, 10, + 32, 32, 32, 32, 45, 45, 32,105,102, 32,116,104,101,114,101, 32,105,115, 32, 97, + 32,112,114,111,120,121, 44, 32,119,101, 32,110,101,101,100, 32,116,104,101, 32, +102,117,108,108, 32,117,114,108, 46, 32,111,116,104,101,114,119,105,115,101, 44, + 32,106,117,115,116, 32, 97, 32,112, 97,114,116, 46, 10, 32, 32, 32, 32,105,102, + 32,110,111,116, 32,114,101,113,116, 46,112,114,111,120,121, 32, 97,110,100, 32, +110,111,116, 32, 80, 82, 79, 88, 89, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, + 32, 32, 32,117, 32, 61, 32,123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +112, 97,116,104, 32, 61, 32,115,111, 99,107,101,116, 46,116,114,121, 40,114,101, +113,116, 46,112, 97,116,104, 44, 32, 34,105,110,118, 97,108,105,100, 32,112, 97, +116,104, 32, 39,110,105,108, 39, 34, 41, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,112, 97,114, 97,109,115, 32, 61, 32,114,101,113,116, 46,112, 97,114, + 97,109,115, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,113,117,101,114, +121, 32, 61, 32,114,101,113,116, 46,113,117,101,114,121, 44, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,102,114, 97,103,109,101,110,116, 32, 61, 32,114,101, +113,116, 46,102,114, 97,103,109,101,110,116, 10, 32, 32, 32, 32, 32, 32, 32, 32, +125, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,114,101,116,117,114,110, + 32,117,114,108, 46, 98,117,105,108,100, 40,117, 41, 10,101,110,100, 10, 10,108, +111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32, 97,100,106,117,115,116, +112,114,111,120,121, 40,114,101,113,116, 41, 10, 32, 32, 32, 32,108,111, 99, 97, +108, 32,112,114,111,120,121, 32, 61, 32,114,101,113,116, 46,112,114,111,120,121, + 32,111,114, 32, 80, 82, 79, 88, 89, 10, 32, 32, 32, 32,105,102, 32,112,114,111, +120,121, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,112,114,111,120, +121, 32, 61, 32,117,114,108, 46,112, 97,114,115,101, 40,112,114,111,120,121, 41, + 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32,112,114,111,120, +121, 46,104,111,115,116, 44, 32,112,114,111,120,121, 46,112,111,114,116, 32,111, +114, 32, 51, 49, 50, 56, 10, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, + 32, 32, 32, 32,114,101,116,117,114,110, 32,114,101,113,116, 46,104,111,115,116, + 44, 32,114,101,113,116, 46,112,111,114,116, 10, 32, 32, 32, 32,101,110,100, 10, +101,110,100, 10, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32, + 97,100,106,117,115,116,104,101, 97,100,101,114,115, 40,114,101,113,116, 41, 10, + 32, 32, 32, 32, 45, 45, 32,100,101,102, 97,117,108,116, 32,104,101, 97,100,101, +114,115, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,108,111,119,101,114, 32, 61, + 32,123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 91, 34,117,115,101,114, 45, 97,103, +101,110,116, 34, 93, 32, 61, 32, 85, 83, 69, 82, 65, 71, 69, 78, 84, 44, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 91, 34,104,111,115,116, 34, 93, 32, 61, 32,114,101, +113,116, 46,104,111,115,116, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 91, 34, 99, +111,110,110,101, 99,116,105,111,110, 34, 93, 32, 61, 32, 34, 99,108,111,115,101, + 44, 32, 84, 69, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 91, 34,116,101, 34, + 93, 32, 61, 32, 34,116,114, 97,105,108,101,114,115, 34, 10, 32, 32, 32, 32,125, + 10, 32, 32, 32, 32, 45, 45, 32,105,102, 32,119,101, 32,104, 97,118,101, 32, 97, +117,116,104,101,110,116,105, 99, 97,116,105,111,110, 32,105,110,102,111,114,109, + 97,116,105,111,110, 44, 32,112, 97,115,115, 32,105,116, 32, 97,108,111,110,103, + 10, 32, 32, 32, 32,105,102, 32,114,101,113,116, 46,117,115,101,114, 32, 97,110, +100, 32,114,101,113,116, 46,112, 97,115,115,119,111,114,100, 32,116,104,101,110, + 10, 32, 32, 32, 32, 32, 32, 32, 32,108,111,119,101,114, 91, 34, 97,117,116,104, +111,114,105,122, 97,116,105,111,110, 34, 93, 32, 61, 32, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 34, 66, 97,115,105, 99, 32, 34, 32, 46, 46, 32, 32, + 40,109,105,109,101, 46, 98, 54, 52, 40,114,101,113,116, 46,117,115,101,114, 32, + 46, 46, 32, 34, 58, 34, 32, 46, 46, 32,114,101,113,116, 46,112, 97,115,115,119, +111,114,100, 41, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 45, 45, + 32,111,118,101,114,114,105,100,101, 32,119,105,116,104, 32,117,115,101,114, 32, +104,101, 97,100,101,114,115, 10, 32, 32, 32, 32,102,111,114, 32,105, 44,118, 32, +105,110, 32, 98, 97,115,101, 46,112, 97,105,114,115, 40,114,101,113,116, 46,104, +101, 97,100,101,114,115, 32,111,114, 32,108,111,119,101,114, 41, 32,100,111, 10, + 32, 32, 32, 32, 32, 32, 32, 32,108,111,119,101,114, 91,115,116,114,105,110,103, + 46,108,111,119,101,114, 40,105, 41, 93, 32, 61, 32,118, 10, 32, 32, 32, 32,101, +110,100, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,108,111,119,101,114, 10, +101,110,100, 10, 10, 45, 45, 32,100,101,102, 97,117,108,116, 32,117,114,108, 32, +112, 97,114,116,115, 10,108,111, 99, 97,108, 32,100,101,102, 97,117,108,116, 32, + 61, 32,123, 10, 32, 32, 32, 32,104,111,115,116, 32, 61, 32, 34, 34, 44, 10, 32, + 32, 32, 32,112,111,114,116, 32, 61, 32, 80, 79, 82, 84, 44, 10, 32, 32, 32, 32, +112, 97,116,104, 32, 61, 34, 47, 34, 44, 10, 32, 32, 32, 32,115, 99,104,101,109, +101, 32, 61, 32, 34,104,116,116,112, 34, 10,125, 10, 10,108,111, 99, 97,108, 32, +102,117,110, 99,116,105,111,110, 32, 97,100,106,117,115,116,114,101,113,117,101, +115,116, 40,114,101,113,116, 41, 10, 32, 32, 32, 32, 45, 45, 32,112, 97,114,115, +101, 32,117,114,108, 32,105,102, 32,112,114,111,118,105,100,101,100, 10, 32, 32, + 32, 32,108,111, 99, 97,108, 32,110,114,101,113,116, 32, 61, 32,114,101,113,116, + 46,117,114,108, 32, 97,110,100, 32,117,114,108, 46,112, 97,114,115,101, 40,114, +101,113,116, 46,117,114,108, 44, 32,100,101,102, 97,117,108,116, 41, 32,111,114, + 32,123,125, 10, 32, 32, 32, 32, 45, 45, 32,101,120,112,108,105, 99,105,116, 32, + 99,111,109,112,111,110,101,110,116,115, 32,111,118,101,114,114,105,100,101, 32, +117,114,108, 10, 32, 32, 32, 32,102,111,114, 32,105, 44,118, 32,105,110, 32, 98, + 97,115,101, 46,112, 97,105,114,115, 40,114,101,113,116, 41, 32,100,111, 32,110, +114,101,113,116, 91,105, 93, 32, 61, 32,118, 32,101,110,100, 10, 32, 32, 32, 32, +105,102, 32,110,114,101,113,116, 46,112,111,114,116, 32, 61, 61, 32, 34, 34, 32, +116,104,101,110, 32,110,114,101,113,116, 46,112,111,114,116, 32, 61, 32, 56, 48, + 32,101,110,100, 10, 32, 32, 32, 32,115,111, 99,107,101,116, 46,116,114,121, 40, +110,114,101,113,116, 46,104,111,115,116, 32, 97,110,100, 32,110,114,101,113,116, + 46,104,111,115,116, 32,126, 61, 32, 34, 34, 44, 32, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 34,105,110,118, 97,108,105,100, 32,104,111,115,116, 32, 39, 34, 32, 46, + 46, 32, 98, 97,115,101, 46,116,111,115,116,114,105,110,103, 40,110,114,101,113, +116, 46,104,111,115,116, 41, 32, 46, 46, 32, 34, 39, 34, 41, 10, 32, 32, 32, 32, + 45, 45, 32, 99,111,109,112,117,116,101, 32,117,114,105, 32,105,102, 32,117,115, +101,114, 32,104, 97,115,110, 39,116, 32,111,118,101,114,114,105,100,101,110, 10, + 32, 32, 32, 32,110,114,101,113,116, 46,117,114,105, 32, 61, 32,114,101,113,116, + 46,117,114,105, 32,111,114, 32, 97,100,106,117,115,116,117,114,105, 40,110,114, +101,113,116, 41, 10, 32, 32, 32, 32, 45, 45, 32, 97,106,117,115,116, 32,104,111, +115,116, 32, 97,110,100, 32,112,111,114,116, 32,105,102, 32,116,104,101,114,101, + 32,105,115, 32, 97, 32,112,114,111,120,121, 10, 32, 32, 32, 32,110,114,101,113, +116, 46,104,111,115,116, 44, 32,110,114,101,113,116, 46,112,111,114,116, 32, 61, + 32, 97,100,106,117,115,116,112,114,111,120,121, 40,110,114,101,113,116, 41, 10, + 32, 32, 32, 32, 45, 45, 32, 97,100,106,117,115,116, 32,104,101, 97,100,101,114, +115, 32,105,110, 32,114,101,113,117,101,115,116, 10, 32, 32, 32, 32,110,114,101, +113,116, 46,104,101, 97,100,101,114,115, 32, 61, 32, 97,100,106,117,115,116,104, +101, 97,100,101,114,115, 40,110,114,101,113,116, 41, 10, 32, 32, 32, 32,114,101, +116,117,114,110, 32,110,114,101,113,116, 10,101,110,100, 10, 10,108,111, 99, 97, +108, 32,102,117,110, 99,116,105,111,110, 32,115,104,111,117,108,100,114,101,100, +105,114,101, 99,116, 40,114,101,113,116, 44, 32, 99,111,100,101, 44, 32,104,101, + 97,100,101,114,115, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,104,101, + 97,100,101,114,115, 46,108,111, 99, 97,116,105,111,110, 32, 97,110,100, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115,116,114,105,110,103, 46,103,115,117, + 98, 40,104,101, 97,100,101,114,115, 46,108,111, 99, 97,116,105,111,110, 44, 32, + 34, 37,115, 34, 44, 32, 34, 34, 41, 32,126, 61, 32, 34, 34, 32, 97,110,100, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40,114,101,113,116, 46,114,101,100, +105,114,101, 99,116, 32,126, 61, 32,102, 97,108,115,101, 41, 32, 97,110,100, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 99,111,100,101, 32, 61, 61, 32, + 51, 48, 49, 32,111,114, 32, 99,111,100,101, 32, 61, 61, 32, 51, 48, 50, 41, 32, + 97,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40,110,111,116, 32, +114,101,113,116, 46,109,101,116,104,111,100, 32,111,114, 32,114,101,113,116, 46, +109,101,116,104,111,100, 32, 61, 61, 32, 34, 71, 69, 84, 34, 32,111,114, 32,114, +101,113,116, 46,109,101,116,104,111,100, 32, 61, 61, 32, 34, 72, 69, 65, 68, 34, + 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97,110,100, 32, 40,110,111, +116, 32,114,101,113,116, 46,110,114,101,100,105,114,101, 99,116,115, 32,111,114, + 32,114,101,113,116, 46,110,114,101,100,105,114,101, 99,116,115, 32, 60, 32, 53, + 41, 10,101,110,100, 10, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111, +110, 32,115,104,111,117,108,100,114,101, 99,101,105,118,101, 98,111,100,121, 40, +114,101,113,116, 44, 32, 99,111,100,101, 41, 10, 32, 32, 32, 32,105,102, 32,114, +101,113,116, 46,109,101,116,104,111,100, 32, 61, 61, 32, 34, 72, 69, 65, 68, 34, + 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 32,101,110,100, + 10, 32, 32, 32, 32,105,102, 32, 99,111,100,101, 32, 61, 61, 32, 50, 48, 52, 32, +111,114, 32, 99,111,100,101, 32, 61, 61, 32, 51, 48, 52, 32,116,104,101,110, 32, +114,101,116,117,114,110, 32,110,105,108, 32,101,110,100, 10, 32, 32, 32, 32,105, +102, 32, 99,111,100,101, 32, 62, 61, 32, 49, 48, 48, 32, 97,110,100, 32, 99,111, +100,101, 32, 60, 32, 50, 48, 48, 32,116,104,101,110, 32,114,101,116,117,114,110, + 32,110,105,108, 32,101,110,100, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, + 49, 10,101,110,100, 10, 10, 45, 45, 32,102,111,114,119, 97,114,100, 32,100,101, + 99,108, 97,114, 97,116,105,111,110,115, 10,108,111, 99, 97,108, 32,116,114,101, +113,117,101,115,116, 44, 32,116,114,101,100,105,114,101, 99,116, 10, 10,102,117, +110, 99,116,105,111,110, 32,116,114,101,100,105,114,101, 99,116, 40,114,101,113, +116, 44, 32,108,111, 99, 97,116,105,111,110, 41, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,114,101,115,117,108,116, 44, 32, 99,111,100,101, 44, 32,104,101, 97, +100,101,114,115, 44, 32,115,116, 97,116,117,115, 32, 61, 32,116,114,101,113,117, +101,115,116, 32,123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 32,116,104,101, + 32, 82, 70, 67, 32,115, 97,121,115, 32,116,104,101, 32,114,101,100,105,114,101, + 99,116, 32, 85, 82, 76, 32,104, 97,115, 32,116,111, 32, 98,101, 32, 97, 98,115, +111,108,117,116,101, 44, 32, 98,117,116, 32,115,111,109,101, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 45, 45, 32,115,101,114,118,101,114,115, 32,100,111, 32,110,111, +116, 32,114,101,115,112,101, 99,116, 32,116,104, 97,116, 10, 32, 32, 32, 32, 32, + 32, 32, 32,117,114,108, 32, 61, 32,117,114,108, 46, 97, 98,115,111,108,117,116, +101, 40,114,101,113,116, 46,117,114,108, 44, 32,108,111, 99, 97,116,105,111,110, + 41, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,111,117,114, 99,101, 32, 61, 32, +114,101,113,116, 46,115,111,117,114, 99,101, 44, 10, 32, 32, 32, 32, 32, 32, 32, + 32,115,105,110,107, 32, 61, 32,114,101,113,116, 46,115,105,110,107, 44, 10, 32, + 32, 32, 32, 32, 32, 32, 32,104,101, 97,100,101,114,115, 32, 61, 32,114,101,113, +116, 46,104,101, 97,100,101,114,115, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32,112, +114,111,120,121, 32, 61, 32,114,101,113,116, 46,112,114,111,120,121, 44, 32, 10, + 32, 32, 32, 32, 32, 32, 32, 32,110,114,101,100,105,114,101, 99,116,115, 32, 61, + 32, 40,114,101,113,116, 46,110,114,101,100,105,114,101, 99,116,115, 32,111,114, + 32, 48, 41, 32, 43, 32, 49, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99,114,101, + 97,116,101, 32, 61, 32,114,101,113,116, 46, 99,114,101, 97,116,101, 10, 32, 32, + 32, 32,125, 32, 32, 32, 10, 32, 32, 32, 32, 45, 45, 32,112, 97,115,115, 32,108, +111, 99, 97,116,105,111,110, 32,104,101, 97,100,101,114, 32, 98, 97, 99,107, 32, + 97,115, 32, 97, 32,104,105,110,116, 32,119,101, 32,114,101,100,105,114,101, 99, +116,101,100, 10, 32, 32, 32, 32,104,101, 97,100,101,114,115, 32, 61, 32,104,101, + 97,100,101,114,115, 32,111,114, 32,123,125, 10, 32, 32, 32, 32,104,101, 97,100, +101,114,115, 46,108,111, 99, 97,116,105,111,110, 32, 61, 32,104,101, 97,100,101, +114,115, 46,108,111, 99, 97,116,105,111,110, 32,111,114, 32,108,111, 99, 97,116, +105,111,110, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,114,101,115,117,108, +116, 44, 32, 99,111,100,101, 44, 32,104,101, 97,100,101,114,115, 44, 32,115,116, + 97,116,117,115, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,116, +114,101,113,117,101,115,116, 40,114,101,113,116, 41, 10, 32, 32, 32, 32, 45, 45, + 32,119,101, 32,108,111,111,112, 32,117,110,116,105,108, 32,119,101, 32,103,101, +116, 32,119,104, 97,116, 32,119,101, 32,119, 97,110,116, 44, 32,111,114, 10, 32, + 32, 32, 32, 45, 45, 32,117,110,116,105,108, 32,119,101, 32, 97,114,101, 32,115, +117,114,101, 32,116,104,101,114,101, 32,105,115, 32,110,111, 32,119, 97,121, 32, +116,111, 32,103,101,116, 32,105,116, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, +110,114,101,113,116, 32, 61, 32, 97,100,106,117,115,116,114,101,113,117,101,115, +116, 40,114,101,113,116, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,104, 32, + 61, 32,111,112,101,110, 40,110,114,101,113,116, 46,104,111,115,116, 44, 32,110, +114,101,113,116, 46,112,111,114,116, 44, 32,110,114,101,113,116, 46, 99,114,101, + 97,116,101, 41, 10, 32, 32, 32, 32, 45, 45, 32,115,101,110,100, 32,114,101,113, +117,101,115,116, 32,108,105,110,101, 32, 97,110,100, 32,104,101, 97,100,101,114, +115, 10, 32, 32, 32, 32,104, 58,115,101,110,100,114,101,113,117,101,115,116,108, +105,110,101, 40,110,114,101,113,116, 46,109,101,116,104,111,100, 44, 32,110,114, +101,113,116, 46,117,114,105, 41, 10, 32, 32, 32, 32,104, 58,115,101,110,100,104, +101, 97,100,101,114,115, 40,110,114,101,113,116, 46,104,101, 97,100,101,114,115, + 41, 10, 32, 32, 32, 32, 45, 45, 32,105,102, 32,116,104,101,114,101, 32,105,115, + 32, 97, 32, 98,111,100,121, 44, 32,115,101,110,100, 32,105,116, 10, 32, 32, 32, + 32,105,102, 32,110,114,101,113,116, 46,115,111,117,114, 99,101, 32,116,104,101, +110, 10, 32, 32, 32, 32, 32, 32, 32, 32,104, 58,115,101,110,100, 98,111,100,121, + 40,110,114,101,113,116, 46,104,101, 97,100,101,114,115, 44, 32,110,114,101,113, +116, 46,115,111,117,114, 99,101, 44, 32,110,114,101,113,116, 46,115,116,101,112, + 41, 32, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,108,111, 99, 97,108, + 32, 99,111,100,101, 44, 32,115,116, 97,116,117,115, 32, 61, 32,104, 58,114,101, + 99,101,105,118,101,115,116, 97,116,117,115,108,105,110,101, 40, 41, 10, 32, 32, + 32, 32, 45, 45, 32,105,102, 32,105,116, 32,105,115, 32, 97,110, 32, 72, 84, 84, + 80, 47, 48, 46, 57, 32,115,101,114,118,101,114, 44, 32,115,105,109,112,108,121, + 32,103,101,116, 32,116,104,101, 32, 98,111,100,121, 32, 97,110,100, 32,119,101, + 32, 97,114,101, 32,100,111,110,101, 10, 32, 32, 32, 32,105,102, 32,110,111,116, + 32, 99,111,100,101, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,104, + 58,114,101, 99,101,105,118,101, 48, 57, 98,111,100,121, 40,115,116, 97,116,117, +115, 44, 32,110,114,101,113,116, 46,115,105,110,107, 44, 32,110,114,101,113,116, + 46,115,116,101,112, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114, +110, 32, 49, 44, 32, 50, 48, 48, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, + 32,108,111, 99, 97,108, 32,104,101, 97,100,101,114,115, 10, 32, 32, 32, 32, 45, + 45, 32,105,103,110,111,114,101, 32, 97,110,121, 32, 49, 48, 48, 45, 99,111,110, +116,105,110,117,101, 32,109,101,115,115, 97,103,101,115, 10, 32, 32, 32, 32,119, +104,105,108,101, 32, 99,111,100,101, 32, 61, 61, 32, 49, 48, 48, 32,100,111, 32, + 10, 32, 32, 32, 32, 32, 32, 32, 32,104,101, 97,100,101,114,115, 32, 61, 32,104, + 58,114,101, 99,101,105,118,101,104,101, 97,100,101,114,115, 40, 41, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 99,111,100,101, 44, 32,115,116, 97,116,117,115, 32, 61, + 32,104, 58,114,101, 99,101,105,118,101,115,116, 97,116,117,115,108,105,110,101, + 40, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,104,101, 97,100,101, +114,115, 32, 61, 32,104, 58,114,101, 99,101,105,118,101,104,101, 97,100,101,114, +115, 40, 41, 10, 32, 32, 32, 32, 45, 45, 32, 97,116, 32,116,104,105,115, 32,112, +111,105,110,116, 32,119,101, 32,115,104,111,117,108,100, 32,104, 97,118,101, 32, + 97, 32,104,111,110,101,115,116, 32,114,101,112,108,121, 32,102,114,111,109, 32, +116,104,101, 32,115,101,114,118,101,114, 10, 32, 32, 32, 32, 45, 45, 32,119,101, + 32, 99, 97,110, 39,116, 32,114,101,100,105,114,101, 99,116, 32,105,102, 32,119, +101, 32, 97,108,114,101, 97,100,121, 32,117,115,101,100, 32,116,104,101, 32,115, +111,117,114, 99,101, 44, 32,115,111, 32,119,101, 32,114,101,112,111,114,116, 32, +116,104,101, 32,101,114,114,111,114, 32, 10, 32, 32, 32, 32,105,102, 32,115,104, +111,117,108,100,114,101,100,105,114,101, 99,116, 40,110,114,101,113,116, 44, 32, + 99,111,100,101, 44, 32,104,101, 97,100,101,114,115, 41, 32, 97,110,100, 32,110, +111,116, 32,110,114,101,113,116, 46,115,111,117,114, 99,101, 32,116,104,101,110, + 10, 32, 32, 32, 32, 32, 32, 32, 32,104, 58, 99,108,111,115,101, 40, 41, 10, 32, + 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32,116,114,101,100,105,114, +101, 99,116, 40,114,101,113,116, 44, 32,104,101, 97,100,101,114,115, 46,108,111, + 99, 97,116,105,111,110, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, + 45, 45, 32,104,101,114,101, 32,119,101, 32, 97,114,101, 32,102,105,110, 97,108, +108,121, 32,100,111,110,101, 10, 32, 32, 32, 32,105,102, 32,115,104,111,117,108, +100,114,101, 99,101,105,118,101, 98,111,100,121, 40,110,114,101,113,116, 44, 32, + 99,111,100,101, 41, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,104, + 58,114,101, 99,101,105,118,101, 98,111,100,121, 40,104,101, 97,100,101,114,115, + 44, 32,110,114,101,113,116, 46,115,105,110,107, 44, 32,110,114,101,113,116, 46, +115,116,101,112, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,104, 58, + 99,108,111,115,101, 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, 49, + 44, 32, 99,111,100,101, 44, 32,104,101, 97,100,101,114,115, 44, 32,115,116, 97, +116,117,115, 10,101,110,100, 10, 10,108,111, 99, 97,108, 32,102,117,110, 99,116, +105,111,110, 32,115,114,101,113,117,101,115,116, 40,117, 44, 32, 98, 41, 10, 32, + 32, 32, 32,108,111, 99, 97,108, 32,116, 32, 61, 32,123,125, 10, 32, 32, 32, 32, +108,111, 99, 97,108, 32,114,101,113,116, 32, 61, 32,123, 10, 32, 32, 32, 32, 32, + 32, 32, 32,117,114,108, 32, 61, 32,117, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, +115,105,110,107, 32, 61, 32,108,116,110, 49, 50, 46,115,105,110,107, 46,116, 97, + 98,108,101, 40,116, 41, 10, 32, 32, 32, 32,125, 10, 32, 32, 32, 32,105,102, 32, + 98, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,113,116, 46, +115,111,117,114, 99,101, 32, 61, 32,108,116,110, 49, 50, 46,115,111,117,114, 99, +101, 46,115,116,114,105,110,103, 40, 98, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, +114,101,113,116, 46,104,101, 97,100,101,114,115, 32, 61, 32,123, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 91, 34, 99,111,110,116,101,110,116, 45,108, +101,110,103,116,104, 34, 93, 32, 61, 32,115,116,114,105,110,103, 46,108,101,110, + 40, 98, 41, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 91, 34, 99, +111,110,116,101,110,116, 45,116,121,112,101, 34, 93, 32, 61, 32, 34, 97,112,112, +108,105, 99, 97,116,105,111,110, 47,120, 45,119,119,119, 45,102,111,114,109, 45, +117,114,108,101,110, 99,111,100,101,100, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, +125, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,113,116, 46,109,101,116,104,111, +100, 32, 61, 32, 34, 80, 79, 83, 84, 34, 10, 32, 32, 32, 32,101,110,100, 10, 32, + 32, 32, 32,108,111, 99, 97,108, 32, 99,111,100,101, 44, 32,104,101, 97,100,101, +114,115, 44, 32,115,116, 97,116,117,115, 32, 61, 32,115,111, 99,107,101,116, 46, +115,107,105,112, 40, 49, 44, 32,116,114,101,113,117,101,115,116, 40,114,101,113, +116, 41, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,116, 97, 98,108,101, + 46, 99,111,110, 99, 97,116, 40,116, 41, 44, 32, 99,111,100,101, 44, 32,104,101, + 97,100,101,114,115, 44, 32,115,116, 97,116,117,115, 10,101,110,100, 10, 10,114, +101,113,117,101,115,116, 32, 61, 32,115,111, 99,107,101,116, 46,112,114,111,116, +101, 99,116, 40,102,117,110, 99,116,105,111,110, 40,114,101,113,116, 44, 32, 98, +111,100,121, 41, 10, 32, 32, 32, 32,105,102, 32, 98, 97,115,101, 46,116,121,112, +101, 40,114,101,113,116, 41, 32, 61, 61, 32, 34,115,116,114,105,110,103, 34, 32, +116,104,101,110, 32,114,101,116,117,114,110, 32,115,114,101,113,117,101,115,116, + 40,114,101,113,116, 44, 32, 98,111,100,121, 41, 10, 32, 32, 32, 32,101,108,115, +101, 32,114,101,116,117,114,110, 32,116,114,101,113,117,101,115,116, 40,114,101, +113,116, 41, 32,101,110,100, 10,101,110,100, 41, 10, +}; + + if (luaL_loadbuffer(L,(const char*)B1,sizeof(B1),"http.lua")==0) lua_call(L, 0, 0); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/inet.c b/jni/love/src/libraries/luasocket/libluasocket/inet.c new file mode 100644 index 00000000..f2cddeea --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/inet.c @@ -0,0 +1,281 @@ +/*=========================================================================*\ +* Internet domain functions +* LuaSocket toolkit +* +* RCS ID: $Id: inet.c,v 1.28 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "inet.h" + +/*=========================================================================*\ +* Internal function prototypes. +\*=========================================================================*/ +static int inet_global_toip(lua_State *L); +static int inet_global_tohostname(lua_State *L); +static void inet_pushresolved(lua_State *L, struct hostent *hp); +static int inet_global_gethostname(lua_State *L); + +/* DNS functions */ +static luaL_reg func[] = { + { "toip", inet_global_toip }, + { "tohostname", inet_global_tohostname }, + { "gethostname", inet_global_gethostname}, + { NULL, NULL} +}; + +/*=========================================================================*\ +* Exported functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int inet_open(lua_State *L) +{ + lua_pushstring(L, "dns"); + lua_newtable(L); + luaL_openlib(L, NULL, func, 0); + lua_settable(L, -3); + return 0; +} + +/*=========================================================================*\ +* Global Lua functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Returns all information provided by the resolver given a host name +* or ip address +\*-------------------------------------------------------------------------*/ +static int inet_gethost(const char *address, struct hostent **hp) { + struct in_addr addr; + if (inet_aton(address, &addr)) + return socket_gethostbyaddr((char *) &addr, sizeof(addr), hp); + else + return socket_gethostbyname(address, hp); +} + +/*-------------------------------------------------------------------------*\ +* Returns all information provided by the resolver given a host name +* or ip address +\*-------------------------------------------------------------------------*/ +static int inet_global_tohostname(lua_State *L) { + const char *address = luaL_checkstring(L, 1); + struct hostent *hp = NULL; + int err = inet_gethost(address, &hp); + if (err != IO_DONE) { + lua_pushnil(L); + lua_pushstring(L, socket_hoststrerror(err)); + return 2; + } + lua_pushstring(L, hp->h_name); + inet_pushresolved(L, hp); + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Returns all information provided by the resolver given a host name +* or ip address +\*-------------------------------------------------------------------------*/ +static int inet_global_toip(lua_State *L) +{ + const char *address = luaL_checkstring(L, 1); + struct hostent *hp = NULL; + int err = inet_gethost(address, &hp); + if (err != IO_DONE) { + lua_pushnil(L); + lua_pushstring(L, socket_hoststrerror(err)); + return 2; + } + lua_pushstring(L, inet_ntoa(*((struct in_addr *) hp->h_addr))); + inet_pushresolved(L, hp); + return 2; +} + + +/*-------------------------------------------------------------------------*\ +* Gets the host name +\*-------------------------------------------------------------------------*/ +static int inet_global_gethostname(lua_State *L) +{ + char name[257]; + name[256] = '\0'; + if (gethostname(name, 256) < 0) { + lua_pushnil(L); + lua_pushstring(L, "gethostname failed"); + return 2; + } else { + lua_pushstring(L, name); + return 1; + } +} + + + +/*=========================================================================*\ +* Lua methods +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Retrieves socket peer name +\*-------------------------------------------------------------------------*/ +int inet_meth_getpeername(lua_State *L, p_socket ps) +{ + struct sockaddr_in peer; + socklen_t peer_len = sizeof(peer); + if (getpeername(*ps, (SA *) &peer, &peer_len) < 0) { + lua_pushnil(L); + lua_pushstring(L, "getpeername failed"); + } else { + lua_pushstring(L, inet_ntoa(peer.sin_addr)); + lua_pushnumber(L, ntohs(peer.sin_port)); + } + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Retrieves socket local name +\*-------------------------------------------------------------------------*/ +int inet_meth_getsockname(lua_State *L, p_socket ps) +{ + struct sockaddr_in local; + socklen_t local_len = sizeof(local); + if (getsockname(*ps, (SA *) &local, &local_len) < 0) { + lua_pushnil(L); + lua_pushstring(L, "getsockname failed"); + } else { + lua_pushstring(L, inet_ntoa(local.sin_addr)); + lua_pushnumber(L, ntohs(local.sin_port)); + } + return 2; +} + +/*=========================================================================*\ +* Internal functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Passes all resolver information to Lua as a table +\*-------------------------------------------------------------------------*/ +static void inet_pushresolved(lua_State *L, struct hostent *hp) +{ + char **alias; + struct in_addr **addr; + int i, resolved; + lua_newtable(L); resolved = lua_gettop(L); + lua_pushstring(L, "name"); + lua_pushstring(L, hp->h_name); + lua_settable(L, resolved); + lua_pushstring(L, "ip"); + lua_pushstring(L, "alias"); + i = 1; + alias = hp->h_aliases; + lua_newtable(L); + if (alias) { + while (*alias) { + lua_pushnumber(L, i); + lua_pushstring(L, *alias); + lua_settable(L, -3); + i++; alias++; + } + } + lua_settable(L, resolved); + i = 1; + lua_newtable(L); + addr = (struct in_addr **) hp->h_addr_list; + if (addr) { + while (*addr) { + lua_pushnumber(L, i); + lua_pushstring(L, inet_ntoa(**addr)); + lua_settable(L, -3); + i++; addr++; + } + } + lua_settable(L, resolved); +} + +/*-------------------------------------------------------------------------*\ +* Tries to create a new inet socket +\*-------------------------------------------------------------------------*/ +const char *inet_trycreate(p_socket ps, int type) { + return socket_strerror(socket_create(ps, AF_INET, type, 0)); +} + +/*-------------------------------------------------------------------------*\ +* Tries to connect to remote address (address, port) +\*-------------------------------------------------------------------------*/ +const char *inet_tryconnect(p_socket ps, const char *address, + unsigned short port, p_timeout tm) +{ + struct sockaddr_in remote; + int err; + memset(&remote, 0, sizeof(remote)); + remote.sin_family = AF_INET; + remote.sin_port = htons(port); + if (strcmp(address, "*")) { + if (!inet_aton(address, &remote.sin_addr)) { + struct hostent *hp = NULL; + struct in_addr **addr; + err = socket_gethostbyname(address, &hp); + if (err != IO_DONE) return socket_hoststrerror(err); + addr = (struct in_addr **) hp->h_addr_list; + memcpy(&remote.sin_addr, *addr, sizeof(struct in_addr)); + } + } else remote.sin_family = AF_UNSPEC; + err = socket_connect(ps, (SA *) &remote, sizeof(remote), tm); + return socket_strerror(err); +} + +/*-------------------------------------------------------------------------*\ +* Tries to bind socket to (address, port) +\*-------------------------------------------------------------------------*/ +const char *inet_trybind(p_socket ps, const char *address, unsigned short port) +{ + struct sockaddr_in local; + int err; + memset(&local, 0, sizeof(local)); + /* address is either wildcard or a valid ip address */ + local.sin_addr.s_addr = htonl(INADDR_ANY); + local.sin_port = htons(port); + local.sin_family = AF_INET; + if (strcmp(address, "*") && !inet_aton(address, &local.sin_addr)) { + struct hostent *hp = NULL; + struct in_addr **addr; + err = socket_gethostbyname(address, &hp); + if (err != IO_DONE) return socket_hoststrerror(err); + addr = (struct in_addr **) hp->h_addr_list; + memcpy(&local.sin_addr, *addr, sizeof(struct in_addr)); + } + err = socket_bind(ps, (SA *) &local, sizeof(local)); + if (err != IO_DONE) socket_destroy(ps); + return socket_strerror(err); +} + +/*-------------------------------------------------------------------------*\ +* Some systems do not provide this so that we provide our own. It's not +* marvelously fast, but it works just fine. +\*-------------------------------------------------------------------------*/ +#ifdef INET_ATON +int inet_aton(const char *cp, struct in_addr *inp) +{ + unsigned int a = 0, b = 0, c = 0, d = 0; + int n = 0, r; + unsigned long int addr = 0; + r = sscanf(cp, "%u.%u.%u.%u%n", &a, &b, &c, &d, &n); + if (r == 0 || n == 0) return 0; + cp += n; + if (*cp) return 0; + if (a > 255 || b > 255 || c > 255 || d > 255) return 0; + if (inp) { + addr += a; addr <<= 8; + addr += b; addr <<= 8; + addr += c; addr <<= 8; + addr += d; + inp->s_addr = htonl(addr); + } + return 1; +} +#endif + + diff --git a/jni/love/src/libraries/luasocket/libluasocket/inet.h b/jni/love/src/libraries/luasocket/libluasocket/inet.h new file mode 100644 index 00000000..76622661 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/inet.h @@ -0,0 +1,42 @@ +#ifndef INET_H +#define INET_H +/*=========================================================================*\ +* Internet domain functions +* LuaSocket toolkit +* +* This module implements the creation and connection of internet domain +* sockets, on top of the socket.h interface, and the interface of with the +* resolver. +* +* The function inet_aton is provided for the platforms where it is not +* available. The module also implements the interface of the internet +* getpeername and getsockname functions as seen by Lua programs. +* +* The Lua functions toip and tohostname are also implemented here. +* +* RCS ID: $Id: inet.h,v 1.16 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include "lua.h" +#include "socket.h" +#include "timeout.h" + +#ifdef _WIN32 +#define INET_ATON +#endif + +int inet_open(lua_State *L); + +const char *inet_trycreate(p_socket ps, int type); +const char *inet_tryconnect(p_socket ps, const char *address, + unsigned short port, p_timeout tm); +const char *inet_trybind(p_socket ps, const char *address, + unsigned short port); + +int inet_meth_getpeername(lua_State *L, p_socket ps); +int inet_meth_getsockname(lua_State *L, p_socket ps); + +#ifdef INET_ATON +int inet_aton(const char *cp, struct in_addr *inp); +#endif + +#endif /* INET_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/io.c b/jni/love/src/libraries/luasocket/libluasocket/io.c new file mode 100644 index 00000000..06dc50ec --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/io.c @@ -0,0 +1,32 @@ +/*=========================================================================*\ +* Input/Output abstraction +* LuaSocket toolkit +* +* RCS ID: $Id: io.c,v 1.6 2005/09/29 06:11:41 diego Exp $ +\*=========================================================================*/ +#include "io.h" + +/*=========================================================================*\ +* Exported functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Initializes C structure +\*-------------------------------------------------------------------------*/ +void io_init(p_io io, p_send send, p_recv recv, p_error error, void *ctx) { + io->send = send; + io->recv = recv; + io->error = error; + io->ctx = ctx; +} + +/*-------------------------------------------------------------------------*\ +* I/O error strings +\*-------------------------------------------------------------------------*/ +const char *io_strerror(int err) { + switch (err) { + case IO_DONE: return NULL; + case IO_CLOSED: return "closed"; + case IO_TIMEOUT: return "timeout"; + default: return "unknown error"; + } +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/io.h b/jni/love/src/libraries/luasocket/libluasocket/io.h new file mode 100644 index 00000000..cce3aaf5 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/io.h @@ -0,0 +1,67 @@ +#ifndef IO_H +#define IO_H +/*=========================================================================*\ +* Input/Output abstraction +* LuaSocket toolkit +* +* This module defines the interface that LuaSocket expects from the +* transport layer for streamed input/output. The idea is that if any +* transport implements this interface, then the buffer.c functions +* automatically work on it. +* +* The module socket.h implements this interface, and thus the module tcp.h +* is very simple. +* +* RCS ID: $Id: io.h,v 1.11 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include +#include "lua.h" + +#include "timeout.h" + +/* IO error codes */ +enum { + IO_DONE = 0, /* operation completed successfully */ + IO_TIMEOUT = -1, /* operation timed out */ + IO_CLOSED = -2, /* the connection has been closed */ + IO_UNKNOWN = -3 +}; + +/* interface to error message function */ +typedef const char *(*p_error) ( + void *ctx, /* context needed by send */ + int err /* error code */ +); + +/* interface to send function */ +typedef int (*p_send) ( + void *ctx, /* context needed by send */ + const char *data, /* pointer to buffer with data to send */ + size_t count, /* number of bytes to send from buffer */ + size_t *sent, /* number of bytes sent uppon return */ + p_timeout tm /* timeout control */ +); + +/* interface to recv function */ +typedef int (*p_recv) ( + void *ctx, /* context needed by recv */ + char *data, /* pointer to buffer where data will be writen */ + size_t count, /* number of bytes to receive into buffer */ + size_t *got, /* number of bytes received uppon return */ + p_timeout tm /* timeout control */ +); + +/* IO driver definition */ +typedef struct t_io_ { + void *ctx; /* context needed by send/recv */ + p_send send; /* send function pointer */ + p_recv recv; /* receive function pointer */ + p_error error; /* strerror function */ +} t_io; +typedef t_io *p_io; + +void io_init(p_io io, p_send send, p_recv recv, p_error error, void *ctx); +const char *io_strerror(int err); + +#endif /* IO_H */ + diff --git a/jni/love/src/libraries/luasocket/libluasocket/ltn12.lua b/jni/love/src/libraries/luasocket/libluasocket/ltn12.lua new file mode 100644 index 00000000..b42689a3 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/ltn12.lua @@ -0,0 +1,292 @@ +----------------------------------------------------------------------------- +-- LTN12 - Filters, sources, sinks and pumps. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: ltn12.lua,v 1.31 2006/04/03 04:45:42 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local table = require("table") +local base = _G +module("ltn12") + +filter = {} +source = {} +sink = {} +pump = {} + +-- 2048 seems to be better in windows... +BLOCKSIZE = 2048 +_VERSION = "LTN12 1.0.1" + +----------------------------------------------------------------------------- +-- Filter stuff +----------------------------------------------------------------------------- +-- returns a high level filter that cycles a low-level filter +function filter.cycle(low, ctx, extra) + base.assert(low) + return function(chunk) + local ret + ret, ctx = low(ctx, chunk, extra) + return ret + end +end + +-- chains a bunch of filters together +-- (thanks to Wim Couwenberg) +function filter.chain(...) + local n = table.getn(arg) + local top, index = 1, 1 + local retry = "" + return function(chunk) + retry = chunk and retry + while true do + if index == top then + chunk = arg[index](chunk) + if chunk == "" or top == n then return chunk + elseif chunk then index = index + 1 + else + top = top+1 + index = top + end + else + chunk = arg[index](chunk or "") + if chunk == "" then + index = index - 1 + chunk = retry + elseif chunk then + if index == n then return chunk + else index = index + 1 end + else base.error("filter returned inappropriate nil") end + end + end + end +end + +----------------------------------------------------------------------------- +-- Source stuff +----------------------------------------------------------------------------- +-- create an empty source +local function empty() + return nil +end + +function source.empty() + return empty +end + +-- returns a source that just outputs an error +function source.error(err) + return function() + return nil, err + end +end + +-- creates a file source +function source.file(handle, io_err) + if handle then + return function() + local chunk = handle:read(BLOCKSIZE) + if not chunk then handle:close() end + return chunk + end + else return source.error(io_err or "unable to open file") end +end + +-- turns a fancy source into a simple source +function source.simplify(src) + base.assert(src) + return function() + local chunk, err_or_new = src() + src = err_or_new or src + if not chunk then return nil, err_or_new + else return chunk end + end +end + +-- creates string source +function source.string(s) + if s then + local i = 1 + return function() + local chunk = string.sub(s, i, i+BLOCKSIZE-1) + i = i + BLOCKSIZE + if chunk ~= "" then return chunk + else return nil end + end + else return source.empty() end +end + +-- creates rewindable source +function source.rewind(src) + base.assert(src) + local t = {} + return function(chunk) + if not chunk then + chunk = table.remove(t) + if not chunk then return src() + else return chunk end + else + table.insert(t, chunk) + end + end +end + +function source.chain(src, f) + base.assert(src and f) + local last_in, last_out = "", "" + local state = "feeding" + local err + return function() + if not last_out then + base.error('source is empty!', 2) + end + while true do + if state == "feeding" then + last_in, err = src() + if err then return nil, err end + last_out = f(last_in) + if not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + elseif last_out ~= "" then + state = "eating" + if last_in then last_in = "" end + return last_out + end + else + last_out = f(last_in) + if last_out == "" then + if last_in == "" then + state = "feeding" + else + base.error('filter returned ""') + end + elseif not last_out then + if last_in then + base.error('filter returned inappropriate nil') + else + return nil + end + else + return last_out + end + end + end + end +end + +-- creates a source that produces contents of several sources, one after the +-- other, as if they were concatenated +-- (thanks to Wim Couwenberg) +function source.cat(...) + local src = table.remove(arg, 1) + return function() + while src do + local chunk, err = src() + if chunk then return chunk end + if err then return nil, err end + src = table.remove(arg, 1) + end + end +end + +----------------------------------------------------------------------------- +-- Sink stuff +----------------------------------------------------------------------------- +-- creates a sink that stores into a table +function sink.table(t) + t = t or {} + local f = function(chunk, err) + if chunk then table.insert(t, chunk) end + return 1 + end + return f, t +end + +-- turns a fancy sink into a simple sink +function sink.simplify(snk) + base.assert(snk) + return function(chunk, err) + local ret, err_or_new = snk(chunk, err) + if not ret then return nil, err_or_new end + snk = err_or_new or snk + return 1 + end +end + +-- creates a file sink +function sink.file(handle, io_err) + if handle then + return function(chunk, err) + if not chunk then + handle:close() + return 1 + else return handle:write(chunk) end + end + else return sink.error(io_err or "unable to open file") end +end + +-- creates a sink that discards data +local function null() + return 1 +end + +function sink.null() + return null +end + +-- creates a sink that just returns an error +function sink.error(err) + return function() + return nil, err + end +end + +-- chains a sink with a filter +function sink.chain(f, snk) + base.assert(f and snk) + return function(chunk, err) + if chunk ~= "" then + local filtered = f(chunk) + local done = chunk and "" + while true do + local ret, snkerr = snk(filtered, err) + if not ret then return nil, snkerr end + if filtered == done then return 1 end + filtered = f(done) + end + else return 1 end + end +end + +----------------------------------------------------------------------------- +-- Pump stuff +----------------------------------------------------------------------------- +-- pumps one chunk from the source to the sink +function pump.step(src, snk) + local chunk, src_err = src() + local ret, snk_err = snk(chunk, src_err) + if chunk and ret then return 1 + else return nil, src_err or snk_err end +end + +-- pumps all data from a source to a sink, using a step function +function pump.all(src, snk, step) + base.assert(src and snk) + step = step or pump.step + while true do + local ret, err = step(src, snk) + if not ret then + if err then return nil, err + else return 1 end + end + end +end + diff --git a/jni/love/src/libraries/luasocket/libluasocket/ltn12.lua.h b/jni/love/src/libraries/luasocket/libluasocket/ltn12.lua.h new file mode 100644 index 00000000..254c0683 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/ltn12.lua.h @@ -0,0 +1,420 @@ +/* code automatically generated by bin2c -- DO NOT EDIT */ +{ +/* #include'ing this file in a C program is equivalent to calling + if (luaL_loadfile(L,"ltn12.lua")==0) lua_call(L, 0, 0); +*/ +/* ltn12.lua */ +static const unsigned char B1[]={ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 76, 84, 78, 49, 50, 32, 45, 32, 70,105,108,116,101,114,115, 44, 32,115,111, +117,114, 99,101,115, 44, 32,115,105,110,107,115, 32, 97,110,100, 32,112,117,109, +112,115, 46, 10, 45, 45, 32, 76,117, 97, 83,111, 99,107,101,116, 32,116,111,111, +108,107,105,116, 46, 10, 45, 45, 32, 65,117,116,104,111,114, 58, 32, 68,105,101, +103,111, 32, 78,101,104, 97, 98, 10, 45, 45, 32, 82, 67, 83, 32, 73, 68, 58, 32, + 36, 73,100, 58, 32,108,116,110, 49, 50, 46,108,117, 97, 44,118, 32, 49, 46, 51, + 49, 32, 50, 48, 48, 54, 47, 48, 52, 47, 48, 51, 32, 48, 52, 58, 52, 53, 58, 52, + 50, 32,100,105,101,103,111, 32, 69,120,112, 32, 36, 10, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 10, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 68,101, 99,108, 97,114, +101, 32,109,111,100,117,108,101, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32,115,116,114,105,110,103, 32, + 61, 32,114,101,113,117,105,114,101, 40, 34,115,116,114,105,110,103, 34, 41, 10, +108,111, 99, 97,108, 32,116, 97, 98,108,101, 32, 61, 32,114,101,113,117,105,114, +101, 40, 34,116, 97, 98,108,101, 34, 41, 10,108,111, 99, 97,108, 32, 98, 97,115, +101, 32, 61, 32, 95, 71, 10,109,111,100,117,108,101, 40, 34,108,116,110, 49, 50, + 34, 41, 10, 10,102,105,108,116,101,114, 32, 61, 32,123,125, 10,115,111,117,114, + 99,101, 32, 61, 32,123,125, 10,115,105,110,107, 32, 61, 32,123,125, 10,112,117, +109,112, 32, 61, 32,123,125, 10, 10, 45, 45, 32, 50, 48, 52, 56, 32,115,101,101, +109,115, 32,116,111, 32, 98,101, 32, 98,101,116,116,101,114, 32,105,110, 32,119, +105,110,100,111,119,115, 46, 46, 46, 10, 66, 76, 79, 67, 75, 83, 73, 90, 69, 32, + 61, 32, 50, 48, 52, 56, 10, 95, 86, 69, 82, 83, 73, 79, 78, 32, 61, 32, 34, 76, + 84, 78, 49, 50, 32, 49, 46, 48, 46, 49, 34, 10, 10, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 70,105,108,116,101,114, + 32,115,116,117,102,102, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 10, 45, 45, 32,114,101,116,117,114,110,115, 32, 97, 32,104,105, +103,104, 32,108,101,118,101,108, 32,102,105,108,116,101,114, 32,116,104, 97,116, + 32, 99,121, 99,108,101,115, 32, 97, 32,108,111,119, 45,108,101,118,101,108, 32, +102,105,108,116,101,114, 10,102,117,110, 99,116,105,111,110, 32,102,105,108,116, +101,114, 46, 99,121, 99,108,101, 40,108,111,119, 44, 32, 99,116,120, 44, 32,101, +120,116,114, 97, 41, 10, 32, 32, 32, 32, 98, 97,115,101, 46, 97,115,115,101,114, +116, 40,108,111,119, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,102,117, +110, 99,116,105,111,110, 40, 99,104,117,110,107, 41, 10, 32, 32, 32, 32, 32, 32, + 32, 32,108,111, 99, 97,108, 32,114,101,116, 10, 32, 32, 32, 32, 32, 32, 32, 32, +114,101,116, 44, 32, 99,116,120, 32, 61, 32,108,111,119, 40, 99,116,120, 44, 32, + 99,104,117,110,107, 44, 32,101,120,116,114, 97, 41, 10, 32, 32, 32, 32, 32, 32, + 32, 32,114,101,116,117,114,110, 32,114,101,116, 10, 32, 32, 32, 32,101,110,100, + 10,101,110,100, 10, 10, 45, 45, 32, 99,104, 97,105,110,115, 32, 97, 32, 98,117, +110, 99,104, 32,111,102, 32,102,105,108,116,101,114,115, 32,116,111,103,101,116, +104,101,114, 10, 45, 45, 32, 40,116,104, 97,110,107,115, 32,116,111, 32, 87,105, +109, 32, 67,111,117,119,101,110, 98,101,114,103, 41, 10,102,117,110, 99,116,105, +111,110, 32,102,105,108,116,101,114, 46, 99,104, 97,105,110, 40, 46, 46, 46, 41, + 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,110, 32, 61, 32,116, 97, 98,108,101, + 46,103,101,116,110, 40, 97,114,103, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, + 32,116,111,112, 44, 32,105,110,100,101,120, 32, 61, 32, 49, 44, 32, 49, 10, 32, + 32, 32, 32,108,111, 99, 97,108, 32,114,101,116,114,121, 32, 61, 32, 34, 34, 10, + 32, 32, 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116,105,111,110, 40, + 99,104,117,110,107, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,114,121, + 32, 61, 32, 99,104,117,110,107, 32, 97,110,100, 32,114,101,116,114,121, 10, 32, + 32, 32, 32, 32, 32, 32, 32,119,104,105,108,101, 32,116,114,117,101, 32,100,111, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,105,110,100,101, +120, 32, 61, 61, 32,116,111,112, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99,104,117,110,107, 32, 61, 32, 97,114, +103, 91,105,110,100,101,120, 93, 40, 99,104,117,110,107, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, 99,104,117,110,107, + 32, 61, 61, 32, 34, 34, 32,111,114, 32,116,111,112, 32, 61, 61, 32,110, 32,116, +104,101,110, 32,114,101,116,117,114,110, 32, 99,104,117,110,107, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101,105,102, 32, + 99,104,117,110,107, 32,116,104,101,110, 32,105,110,100,101,120, 32, 61, 32,105, +110,100,101,120, 32, 43, 32, 49, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,116,111,112, 32, 61, 32,116,111,112, 43, + 49, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,105,110,100,101,120, 32, 61, 32,116,111,112, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 99,104,117,110,107, 32, 61, 32, 97,114,103, 91,105, +110,100,101,120, 93, 40, 99,104,117,110,107, 32,111,114, 32, 34, 34, 41, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, 99,104, +117,110,107, 32, 61, 61, 32, 34, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,110,100,101,120, + 32, 61, 32,105,110,100,101,120, 32, 45, 32, 49, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99,104,117,110,107, 32, 61, + 32,114,101,116,114,121, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,101,108,115,101,105,102, 32, 99,104,117,110,107, 32,116,104,101,110, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32,105,102, 32,105,110,100,101,120, 32, 61, 61, 32,110, 32,116,104,101,110, 32, +114,101,116,117,114,110, 32, 99,104,117,110,107, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 32,105,110, +100,101,120, 32, 61, 32,105,110,100,101,120, 32, 43, 32, 49, 32,101,110,100, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, + 32, 98, 97,115,101, 46,101,114,114,111,114, 40, 34,102,105,108,116,101,114, 32, +114,101,116,117,114,110,101,100, 32,105,110, 97,112,112,114,111,112,114,105, 97, +116,101, 32,110,105,108, 34, 41, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, + 10, 32, 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 83,111,117,114, 99, +101, 32,115,116,117,102,102, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 10, 45, 45, 32, 99,114,101, 97,116,101, 32, 97,110, 32,101, +109,112,116,121, 32,115,111,117,114, 99,101, 10,108,111, 99, 97,108, 32,102,117, +110, 99,116,105,111,110, 32,101,109,112,116,121, 40, 41, 10, 32, 32, 32, 32,114, +101,116,117,114,110, 32,110,105,108, 10,101,110,100, 10, 10,102,117,110, 99,116, +105,111,110, 32,115,111,117,114, 99,101, 46,101,109,112,116,121, 40, 41, 10, 32, + 32, 32, 32,114,101,116,117,114,110, 32,101,109,112,116,121, 10,101,110,100, 10, + 10, 45, 45, 32,114,101,116,117,114,110,115, 32, 97, 32,115,111,117,114, 99,101, + 32,116,104, 97,116, 32,106,117,115,116, 32,111,117,116,112,117,116,115, 32, 97, +110, 32,101,114,114,111,114, 10,102,117,110, 99,116,105,111,110, 32,115,111,117, +114, 99,101, 46,101,114,114,111,114, 40,101,114,114, 41, 10, 32, 32, 32, 32,114, +101,116,117,114,110, 32,102,117,110, 99,116,105,111,110, 40, 41, 10, 32, 32, 32, + 32, 32, 32, 32, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114,114, + 10, 32, 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 32, 99,114,101, + 97,116,101,115, 32, 97, 32,102,105,108,101, 32,115,111,117,114, 99,101, 10,102, +117,110, 99,116,105,111,110, 32,115,111,117,114, 99,101, 46,102,105,108,101, 40, +104, 97,110,100,108,101, 44, 32,105,111, 95,101,114,114, 41, 10, 32, 32, 32, 32, +105,102, 32,104, 97,110,100,108,101, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, + 32, 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116,105,111,110, 40, 41, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99, +104,117,110,107, 32, 61, 32,104, 97,110,100,108,101, 58,114,101, 97,100, 40, 66, + 76, 79, 67, 75, 83, 73, 90, 69, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,105,102, 32,110,111,116, 32, 99,104,117,110,107, 32,116,104,101,110, 32, +104, 97,110,100,108,101, 58, 99,108,111,115,101, 40, 41, 32,101,110,100, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32, 99,104, +117,110,107, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, +101,108,115,101, 32,114,101,116,117,114,110, 32,115,111,117,114, 99,101, 46,101, +114,114,111,114, 40,105,111, 95,101,114,114, 32,111,114, 32, 34,117,110, 97, 98, +108,101, 32,116,111, 32,111,112,101,110, 32,102,105,108,101, 34, 41, 32,101,110, +100, 10,101,110,100, 10, 10, 45, 45, 32,116,117,114,110,115, 32, 97, 32,102, 97, +110, 99,121, 32,115,111,117,114, 99,101, 32,105,110,116,111, 32, 97, 32,115,105, +109,112,108,101, 32,115,111,117,114, 99,101, 10,102,117,110, 99,116,105,111,110, + 32,115,111,117,114, 99,101, 46,115,105,109,112,108,105,102,121, 40,115,114, 99, + 41, 10, 32, 32, 32, 32, 98, 97,115,101, 46, 97,115,115,101,114,116, 40,115,114, + 99, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116,105, +111,110, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99, +104,117,110,107, 44, 32,101,114,114, 95,111,114, 95,110,101,119, 32, 61, 32,115, +114, 99, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,114, 99, 32, 61, 32,101, +114,114, 95,111,114, 95,110,101,119, 32,111,114, 32,115,114, 99, 10, 32, 32, 32, + 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32, 99,104,117,110,107, 32,116,104, +101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114,114, 95,111, +114, 95,110,101,119, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 32,114, +101,116,117,114,110, 32, 99,104,117,110,107, 32,101,110,100, 10, 32, 32, 32, 32, +101,110,100, 10,101,110,100, 10, 10, 45, 45, 32, 99,114,101, 97,116,101,115, 32, +115,116,114,105,110,103, 32,115,111,117,114, 99,101, 10,102,117,110, 99,116,105, +111,110, 32,115,111,117,114, 99,101, 46,115,116,114,105,110,103, 40,115, 41, 10, + 32, 32, 32, 32,105,102, 32,115, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, + 32, 32,108,111, 99, 97,108, 32,105, 32, 61, 32, 49, 10, 32, 32, 32, 32, 32, 32, + 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116,105,111,110, 40, 41, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,104, +117,110,107, 32, 61, 32,115,116,114,105,110,103, 46,115,117, 98, 40,115, 44, 32, +105, 44, 32,105, 43, 66, 76, 79, 67, 75, 83, 73, 90, 69, 45, 49, 41, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105, 32, 61, 32,105, 32, 43, 32, 66, 76, + 79, 67, 75, 83, 73, 90, 69, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +105,102, 32, 99,104,117,110,107, 32,126, 61, 32, 34, 34, 32,116,104,101,110, 32, +114,101,116,117,114,110, 32, 99,104,117,110,107, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,101,108,115,101, 32,114,101,116,117,114,110, 32,110,105,108, + 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, + 32,101,108,115,101, 32,114,101,116,117,114,110, 32,115,111,117,114, 99,101, 46, +101,109,112,116,121, 40, 41, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 32, + 99,114,101, 97,116,101,115, 32,114,101,119,105,110,100, 97, 98,108,101, 32,115, +111,117,114, 99,101, 10,102,117,110, 99,116,105,111,110, 32,115,111,117,114, 99, +101, 46,114,101,119,105,110,100, 40,115,114, 99, 41, 10, 32, 32, 32, 32, 98, 97, +115,101, 46, 97,115,115,101,114,116, 40,115,114, 99, 41, 10, 32, 32, 32, 32,108, +111, 99, 97,108, 32,116, 32, 61, 32,123,125, 10, 32, 32, 32, 32,114,101,116,117, +114,110, 32,102,117,110, 99,116,105,111,110, 40, 99,104,117,110,107, 41, 10, 32, + 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32, 99,104,117,110,107, 32, +116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 99,104,117, +110,107, 32, 61, 32,116, 97, 98,108,101, 46,114,101,109,111,118,101, 40,116, 41, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32, + 99,104,117,110,107, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,115,114, + 99, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, + 32,114,101,116,117,114,110, 32, 99,104,117,110,107, 32,101,110,100, 10, 32, 32, + 32, 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,116, 97, 98,108,101, 46,105,110,115,101,114,116, 40,116, 44, 32, 99, +104,117,110,107, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, + 32, 32,101,110,100, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32, +115,111,117,114, 99,101, 46, 99,104, 97,105,110, 40,115,114, 99, 44, 32,102, 41, + 10, 32, 32, 32, 32, 98, 97,115,101, 46, 97,115,115,101,114,116, 40,115,114, 99, + 32, 97,110,100, 32,102, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,108, 97, +115,116, 95,105,110, 44, 32,108, 97,115,116, 95,111,117,116, 32, 61, 32, 34, 34, + 44, 32, 34, 34, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,115,116, 97,116,101, + 32, 61, 32, 34,102,101,101,100,105,110,103, 34, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,101,114,114, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,102,117, +110, 99,116,105,111,110, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, +110,111,116, 32,108, 97,115,116, 95,111,117,116, 32,116,104,101,110, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 98, 97,115,101, 46,101,114,114,111,114, + 40, 39,115,111,117,114, 99,101, 32,105,115, 32,101,109,112,116,121, 33, 39, 44, + 32, 50, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, + 32, 32, 32, 32,119,104,105,108,101, 32,116,114,117,101, 32,100,111, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,115,116, 97,116,101, 32, 61, + 61, 32, 34,102,101,101,100,105,110,103, 34, 32,116,104,101,110, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108, 97,115,116, 95,105,110, + 44, 32,101,114,114, 32, 61, 32,115,114, 99, 40, 41, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,101,114,114, 32,116,104,101, +110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114,114, 32,101,110, +100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108, 97, +115,116, 95,111,117,116, 32, 61, 32,102, 40,108, 97,115,116, 95,105,110, 41, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110, +111,116, 32,108, 97,115,116, 95,111,117,116, 32,116,104,101,110, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, +108, 97,115,116, 95,105,110, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 98, 97,115, +101, 46,101,114,114,111,114, 40, 39,102,105,108,116,101,114, 32,114,101,116,117, +114,110,101,100, 32,105,110, 97,112,112,114,111,112,114,105, 97,116,101, 32,110, +105,108, 39, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, + 32,110,105,108, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,101,108,115,101,105,102, 32,108, 97,115,116, 95,111,117,116, + 32,126, 61, 32, 34, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115,116, 97,116,101, 32, 61, 32, + 34,101, 97,116,105,110,103, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,108, 97,115,116, 95,105,110, 32, +116,104,101,110, 32,108, 97,115,116, 95,105,110, 32, 61, 32, 34, 34, 32,101,110, +100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,114,101,116,117,114,110, 32,108, 97,115,116, 95,111,117,116, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108, 97,115,116, 95,111,117,116, 32, + 61, 32,102, 40,108, 97,115,116, 95,105,110, 41, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,108, 97,115,116, 95,111,117,116, + 32, 61, 61, 32, 34, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,108, 97,115,116, 95, +105,110, 32, 61, 61, 32, 34, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115,116, + 97,116,101, 32, 61, 32, 34,102,101,101,100,105,110,103, 34, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 98, 97,115,101, 46,101,114,114,111,114, 40, 39,102,105,108, +116,101,114, 32,114,101,116,117,114,110,101,100, 32, 34, 34, 39, 41, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,110, +100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108, +115,101,105,102, 32,110,111,116, 32,108, 97,115,116, 95,111,117,116, 32,116,104, +101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,105,102, 32,108, 97,115,116, 95,105,110, 32,116,104,101,110, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 98, 97,115,101, 46,101,114,114,111,114, 40, 39,102,105,108,116,101, +114, 32,114,101,116,117,114,110,101,100, 32,105,110, 97,112,112,114,111,112,114, +105, 97,116,101, 32,110,105,108, 39, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +114,101,116,117,114,110, 32,110,105,108, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117, +114,110, 32,108, 97,115,116, 95,111,117,116, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, + 32, 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 32, 99,114,101, 97, +116,101,115, 32, 97, 32,115,111,117,114, 99,101, 32,116,104, 97,116, 32,112,114, +111,100,117, 99,101,115, 32, 99,111,110,116,101,110,116,115, 32,111,102, 32,115, +101,118,101,114, 97,108, 32,115,111,117,114, 99,101,115, 44, 32,111,110,101, 32, + 97,102,116,101,114, 32,116,104,101, 10, 45, 45, 32,111,116,104,101,114, 44, 32, + 97,115, 32,105,102, 32,116,104,101,121, 32,119,101,114,101, 32, 99,111,110, 99, + 97,116,101,110, 97,116,101,100, 10, 45, 45, 32, 40,116,104, 97,110,107,115, 32, +116,111, 32, 87,105,109, 32, 67,111,117,119,101,110, 98,101,114,103, 41, 10,102, +117,110, 99,116,105,111,110, 32,115,111,117,114, 99,101, 46, 99, 97,116, 40, 46, + 46, 46, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,115,114, 99, 32, 61, 32, +116, 97, 98,108,101, 46,114,101,109,111,118,101, 40, 97,114,103, 44, 32, 49, 41, + 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116,105,111,110, + 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,119,104,105,108,101, 32,115,114, 99, + 32,100,111, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97, +108, 32, 99,104,117,110,107, 44, 32,101,114,114, 32, 61, 32,115,114, 99, 40, 41, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, 99,104,117,110, +107, 32,116,104,101,110, 32,114,101,116,117,114,110, 32, 99,104,117,110,107, 32, +101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,101, +114,114, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32, +101,114,114, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +115,114, 99, 32, 61, 32,116, 97, 98,108,101, 46,114,101,109,111,118,101, 40, 97, +114,103, 44, 32, 49, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, + 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 83,105,110,107, 32,115,116, +117,102,102, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 10, 45, 45, 32, 99,114,101, 97,116,101,115, 32, 97, 32,115,105,110,107, 32, +116,104, 97,116, 32,115,116,111,114,101,115, 32,105,110,116,111, 32, 97, 32,116, + 97, 98,108,101, 10,102,117,110, 99,116,105,111,110, 32,115,105,110,107, 46,116, + 97, 98,108,101, 40,116, 41, 10, 32, 32, 32, 32,116, 32, 61, 32,116, 32,111,114, + 32,123,125, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,102, 32, 61, 32,102,117, +110, 99,116,105,111,110, 40, 99,104,117,110,107, 44, 32,101,114,114, 41, 10, 32, + 32, 32, 32, 32, 32, 32, 32,105,102, 32, 99,104,117,110,107, 32,116,104,101,110, + 32,116, 97, 98,108,101, 46,105,110,115,101,114,116, 40,116, 44, 32, 99,104,117, +110,107, 41, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117, +114,110, 32, 49, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,114,101,116, +117,114,110, 32,102, 44, 32,116, 10,101,110,100, 10, 10, 45, 45, 32,116,117,114, +110,115, 32, 97, 32,102, 97,110, 99,121, 32,115,105,110,107, 32,105,110,116,111, + 32, 97, 32,115,105,109,112,108,101, 32,115,105,110,107, 10,102,117,110, 99,116, +105,111,110, 32,115,105,110,107, 46,115,105,109,112,108,105,102,121, 40,115,110, +107, 41, 10, 32, 32, 32, 32, 98, 97,115,101, 46, 97,115,115,101,114,116, 40,115, +110,107, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116, +105,111,110, 40, 99,104,117,110,107, 44, 32,101,114,114, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32,108,111, 99, 97,108, 32,114,101,116, 44, 32,101,114,114, 95,111, +114, 95,110,101,119, 32, 61, 32,115,110,107, 40, 99,104,117,110,107, 44, 32,101, +114,114, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32,114, +101,116, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32, +101,114,114, 95,111,114, 95,110,101,119, 32,101,110,100, 10, 32, 32, 32, 32, 32, + 32, 32, 32,115,110,107, 32, 61, 32,101,114,114, 95,111,114, 95,110,101,119, 32, +111,114, 32,115,110,107, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114, +110, 32, 49, 10, 32, 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 32, + 99,114,101, 97,116,101,115, 32, 97, 32,102,105,108,101, 32,115,105,110,107, 10, +102,117,110, 99,116,105,111,110, 32,115,105,110,107, 46,102,105,108,101, 40,104, + 97,110,100,108,101, 44, 32,105,111, 95,101,114,114, 41, 10, 32, 32, 32, 32,105, +102, 32,104, 97,110,100,108,101, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, + 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116,105,111,110, 40, 99,104, +117,110,107, 44, 32,101,114,114, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,105,102, 32,110,111,116, 32, 99,104,117,110,107, 32,116,104,101,110, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,104, 97,110,100, +108,101, 58, 99,108,111,115,101, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32, 49, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 32,114,101,116,117,114,110, 32, +104, 97,110,100,108,101, 58,119,114,105,116,101, 40, 99,104,117,110,107, 41, 32, +101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, +101,108,115,101, 32,114,101,116,117,114,110, 32,115,105,110,107, 46,101,114,114, +111,114, 40,105,111, 95,101,114,114, 32,111,114, 32, 34,117,110, 97, 98,108,101, + 32,116,111, 32,111,112,101,110, 32,102,105,108,101, 34, 41, 32,101,110,100, 10, +101,110,100, 10, 10, 45, 45, 32, 99,114,101, 97,116,101,115, 32, 97, 32,115,105, +110,107, 32,116,104, 97,116, 32,100,105,115, 99, 97,114,100,115, 32,100, 97,116, + 97, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,110,117,108, +108, 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, 49, 10,101,110,100, + 10, 10,102,117,110, 99,116,105,111,110, 32,115,105,110,107, 46,110,117,108,108, + 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,110,117,108,108, 10,101, +110,100, 10, 10, 45, 45, 32, 99,114,101, 97,116,101,115, 32, 97, 32,115,105,110, +107, 32,116,104, 97,116, 32,106,117,115,116, 32,114,101,116,117,114,110,115, 32, + 97,110, 32,101,114,114,111,114, 10,102,117,110, 99,116,105,111,110, 32,115,105, +110,107, 46,101,114,114,111,114, 40,101,114,114, 41, 10, 32, 32, 32, 32,114,101, +116,117,114,110, 32,102,117,110, 99,116,105,111,110, 40, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114,114, 10, + 32, 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 32, 99,104, 97,105, +110,115, 32, 97, 32,115,105,110,107, 32,119,105,116,104, 32, 97, 32,102,105,108, +116,101,114, 10,102,117,110, 99,116,105,111,110, 32,115,105,110,107, 46, 99,104, + 97,105,110, 40,102, 44, 32,115,110,107, 41, 10, 32, 32, 32, 32, 98, 97,115,101, + 46, 97,115,115,101,114,116, 40,102, 32, 97,110,100, 32,115,110,107, 41, 10, 32, + 32, 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116,105,111,110, 40, 99, +104,117,110,107, 44, 32,101,114,114, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,105, +102, 32, 99,104,117,110,107, 32,126, 61, 32, 34, 34, 32,116,104,101,110, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32,102,105,108, +116,101,114,101,100, 32, 61, 32,102, 40, 99,104,117,110,107, 41, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32,100,111,110,101, 32, + 61, 32, 99,104,117,110,107, 32, 97,110,100, 32, 34, 34, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,119,104,105,108,101, 32,116,114,117,101, 32,100,111, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, + 97,108, 32,114,101,116, 44, 32,115,110,107,101,114,114, 32, 61, 32,115,110,107, + 40,102,105,108,116,101,114,101,100, 44, 32,101,114,114, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32,114, +101,116, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32, +115,110,107,101,114,114, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,105,102, 32,102,105,108,116,101,114,101,100, 32, 61, + 61, 32,100,111,110,101, 32,116,104,101,110, 32,114,101,116,117,114,110, 32, 49, + 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32,102,105,108,116,101,114,101,100, 32, 61, 32,102, 40,100,111,110,101, 41, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, + 32, 32, 32, 32,101,108,115,101, 32,114,101,116,117,114,110, 32, 49, 32,101,110, +100, 10, 32, 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 80,117,109,112, + 32,115,116,117,102,102, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 10, 45, 45, 32,112,117,109,112,115, 32,111,110,101, 32, 99,104, +117,110,107, 32,102,114,111,109, 32,116,104,101, 32,115,111,117,114, 99,101, 32, +116,111, 32,116,104,101, 32,115,105,110,107, 10,102,117,110, 99,116,105,111,110, + 32,112,117,109,112, 46,115,116,101,112, 40,115,114, 99, 44, 32,115,110,107, 41, + 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,104,117,110,107, 44, 32,115,114, + 99, 95,101,114,114, 32, 61, 32,115,114, 99, 40, 41, 10, 32, 32, 32, 32,108,111, + 99, 97,108, 32,114,101,116, 44, 32,115,110,107, 95,101,114,114, 32, 61, 32,115, +110,107, 40, 99,104,117,110,107, 44, 32,115,114, 99, 95,101,114,114, 41, 10, 32, + 32, 32, 32,105,102, 32, 99,104,117,110,107, 32, 97,110,100, 32,114,101,116, 32, +116,104,101,110, 32,114,101,116,117,114,110, 32, 49, 10, 32, 32, 32, 32,101,108, +115,101, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,115,114, 99, 95,101, +114,114, 32,111,114, 32,115,110,107, 95,101,114,114, 32,101,110,100, 10,101,110, +100, 10, 10, 45, 45, 32,112,117,109,112,115, 32, 97,108,108, 32,100, 97,116, 97, + 32,102,114,111,109, 32, 97, 32,115,111,117,114, 99,101, 32,116,111, 32, 97, 32, +115,105,110,107, 44, 32,117,115,105,110,103, 32, 97, 32,115,116,101,112, 32,102, +117,110, 99,116,105,111,110, 10,102,117,110, 99,116,105,111,110, 32,112,117,109, +112, 46, 97,108,108, 40,115,114, 99, 44, 32,115,110,107, 44, 32,115,116,101,112, + 41, 10, 32, 32, 32, 32, 98, 97,115,101, 46, 97,115,115,101,114,116, 40,115,114, + 99, 32, 97,110,100, 32,115,110,107, 41, 10, 32, 32, 32, 32,115,116,101,112, 32, + 61, 32,115,116,101,112, 32,111,114, 32,112,117,109,112, 46,115,116,101,112, 10, + 32, 32, 32, 32,119,104,105,108,101, 32,116,114,117,101, 32,100,111, 10, 32, 32, + 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32,114,101,116, 44, 32,101,114,114, + 32, 61, 32,115,116,101,112, 40,115,114, 99, 44, 32,115,110,107, 41, 10, 32, 32, + 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32,114,101,116, 32,116,104,101, +110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,101,114,114, + 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114, +114, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 32,114, +101,116,117,114,110, 32, 49, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, +101,110,100, 10, 32, 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, +}; + + if (luaL_loadbuffer(L,(const char*)B1,sizeof(B1),"ltn12.lua")==0) lua_call(L, 0, 0); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/lua.h b/jni/love/src/libraries/luasocket/libluasocket/lua.h new file mode 100644 index 00000000..e97bc2ac --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/lua.h @@ -0,0 +1,12 @@ +#define LUA_COMPAT_ALL +#include +#include +#include + +#if LUA_VERSION_NUM > 501 +# define luaL_reg luaL_Reg +# define luaL_putchar(B, c) luaL_addchar(B, c) +# define luaL_typerror(L, n, t) luax_typerror(L, n, t) + +extern int luax_typerror(lua_State *L, int narg, const char *type); +#endif diff --git a/jni/love/src/libraries/luasocket/libluasocket/luasocket.c b/jni/love/src/libraries/luasocket/libluasocket/luasocket.c new file mode 100644 index 00000000..0d10bb1d --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/luasocket.c @@ -0,0 +1,118 @@ +/*=========================================================================*\ +* LuaSocket toolkit +* Networking support for the Lua language +* Diego Nehab +* 26/11/1999 +* +* This library is part of an effort to progressively increase the network +* connectivity of the Lua language. The Lua interface to networking +* functions follows the Sockets API closely, trying to simplify all tasks +* involved in setting up both client and server connections. The provided +* IO routines, however, follow the Lua style, being very similar to the +* standard Lua read and write functions. +* +* RCS ID: $Id: luasocket.c,v 1.53 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ + +/*=========================================================================*\ +* Standard include files +\*=========================================================================*/ +#include "lua.h" +#include "lauxlib.h" + +#if !defined(LUA_VERSION_NUM) || (LUA_VERSION_NUM < 501) +#include "compat-5.1.h" +#endif + +/*=========================================================================*\ +* LuaSocket includes +\*=========================================================================*/ +#include "luasocket.h" +#include "auxiliar.h" +#include "except.h" +#include "timeout.h" +#include "buffer.h" +#include "inet.h" +#include "tcp.h" +#include "udp.h" +#include "select.h" + +/*-------------------------------------------------------------------------*\ +* Internal function prototypes +\*-------------------------------------------------------------------------*/ +static int global_skip(lua_State *L); +static int global_unload(lua_State *L); +static int base_open(lua_State *L); + +/*-------------------------------------------------------------------------*\ +* Modules and functions +\*-------------------------------------------------------------------------*/ +static const luaL_reg mod[] = { + {"auxiliar", auxiliar_open}, + {"except", except_open}, + {"timeout", timeout_open}, + {"buffer", buffer_open}, + {"inet", inet_open}, + {"tcp", tcp_open}, + {"udp", udp_open}, + {"select", select_open}, + {NULL, NULL} +}; + +static luaL_reg func[] = { + {"skip", global_skip}, + {"__unload", global_unload}, + {NULL, NULL} +}; + +/*-------------------------------------------------------------------------*\ +* Skip a few arguments +\*-------------------------------------------------------------------------*/ +static int global_skip(lua_State *L) { + int amount = luaL_checkint(L, 1); + int ret = lua_gettop(L) - amount - 1; + return ret >= 0 ? ret : 0; +} + +/*-------------------------------------------------------------------------*\ +* Unloads the library +\*-------------------------------------------------------------------------*/ +static int global_unload(lua_State *L) { + (void) L; + socket_close(); + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Setup basic stuff. +\*-------------------------------------------------------------------------*/ +static int base_open(lua_State *L) { + if (socket_open()) { + /* export functions (and leave namespace table on top of stack) */ + luaL_openlib(L, "socket", func, 0); +#ifdef LUASOCKET_DEBUG + lua_pushstring(L, "_DEBUG"); + lua_pushboolean(L, 1); + lua_rawset(L, -3); +#endif + /* make version string available to scripts */ + lua_pushstring(L, "_VERSION"); + lua_pushstring(L, LUASOCKET_VERSION); + lua_rawset(L, -3); + return 1; + } else { + lua_pushstring(L, "unable to initialize library"); + lua_error(L); + return 0; + } +} + +/*-------------------------------------------------------------------------*\ +* Initializes all library modules. +\*-------------------------------------------------------------------------*/ +int LUASOCKET_API luaopen_socket_core(lua_State *L) { + int i; + base_open(L); + for (i = 0; mod[i].name; i++) mod[i].func(L); + return 1; +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/luasocket.h b/jni/love/src/libraries/luasocket/libluasocket/luasocket.h new file mode 100644 index 00000000..67270abb --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/luasocket.h @@ -0,0 +1,32 @@ +#ifndef LUASOCKET_H +#define LUASOCKET_H +/*=========================================================================*\ +* LuaSocket toolkit +* Networking support for the Lua language +* Diego Nehab +* 9/11/1999 +* +* RCS ID: $Id: luasocket.h,v 1.25 2007/06/11 23:44:54 diego Exp $ +\*=========================================================================*/ +#include "lua.h" + +/*-------------------------------------------------------------------------*\ +* Current socket library version +\*-------------------------------------------------------------------------*/ +#define LUASOCKET_VERSION "LuaSocket 2.0.2" +#define LUASOCKET_COPYRIGHT "Copyright (C) 2004-2007 Diego Nehab" +#define LUASOCKET_AUTHORS "Diego Nehab" + +/*-------------------------------------------------------------------------*\ +* This macro prefixes all exported API functions +\*-------------------------------------------------------------------------*/ +#ifndef LUASOCKET_API +#define LUASOCKET_API extern +#endif + +/*-------------------------------------------------------------------------*\ +* Initializes the library. +\*-------------------------------------------------------------------------*/ +LUASOCKET_API int luaopen_socket_core(lua_State *L); + +#endif /* LUASOCKET_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/mime.c b/jni/love/src/libraries/luasocket/libluasocket/mime.c new file mode 100644 index 00000000..700fa05e --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/mime.c @@ -0,0 +1,711 @@ +/*=========================================================================*\ +* MIME support functions +* LuaSocket toolkit +* +* RCS ID: $Id: mime.c,v 1.28 2005/11/20 07:20:23 diego Exp $ +\*=========================================================================*/ +#include + +#include "lua.h" +#include "lauxlib.h" + +#if !defined(LUA_VERSION_NUM) || (LUA_VERSION_NUM < 501) +#include "compat-5.1.h" +#endif + +#include "mime.h" + +/*=========================================================================*\ +* Don't want to trust escape character constants +\*=========================================================================*/ +typedef unsigned char UC; +static const char CRLF[] = "\r\n"; +static const char EQCRLF[] = "=\r\n"; + +/*=========================================================================*\ +* Internal function prototypes. +\*=========================================================================*/ +static int mime_global_wrp(lua_State *L); +static int mime_global_b64(lua_State *L); +static int mime_global_unb64(lua_State *L); +static int mime_global_qp(lua_State *L); +static int mime_global_unqp(lua_State *L); +static int mime_global_qpwrp(lua_State *L); +static int mime_global_eol(lua_State *L); +static int mime_global_dot(lua_State *L); + +static size_t dot(int c, size_t state, luaL_Buffer *buffer); +static void b64setup(UC *b64unbase); +static size_t b64encode(UC c, UC *input, size_t size, luaL_Buffer *buffer); +static size_t b64pad(const UC *input, size_t size, luaL_Buffer *buffer); +static size_t b64decode(UC c, UC *input, size_t size, luaL_Buffer *buffer); + +static void qpsetup(UC *qpclass, UC *qpunbase); +static void qpquote(UC c, luaL_Buffer *buffer); +static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer); +static size_t qpencode(UC c, UC *input, size_t size, + const char *marker, luaL_Buffer *buffer); +static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer); + +/* code support functions */ +static luaL_reg func[] = { + { "dot", mime_global_dot }, + { "b64", mime_global_b64 }, + { "eol", mime_global_eol }, + { "qp", mime_global_qp }, + { "qpwrp", mime_global_qpwrp }, + { "unb64", mime_global_unb64 }, + { "unqp", mime_global_unqp }, + { "wrp", mime_global_wrp }, + { NULL, NULL } +}; + +/*-------------------------------------------------------------------------*\ +* Quoted-printable globals +\*-------------------------------------------------------------------------*/ +static UC qpclass[256]; +static UC qpbase[] = "0123456789ABCDEF"; +static UC qpunbase[256]; +enum {QP_PLAIN, QP_QUOTED, QP_CR, QP_IF_LAST}; + +/*-------------------------------------------------------------------------*\ +* Base64 globals +\*-------------------------------------------------------------------------*/ +static const UC b64base[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +static UC b64unbase[256]; + +/*=========================================================================*\ +* Exported functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +MIME_API int luaopen_mime_core(lua_State *L) +{ + luaL_openlib(L, "mime", func, 0); + /* make version string available to scripts */ + lua_pushstring(L, "_VERSION"); + lua_pushstring(L, MIME_VERSION); + lua_rawset(L, -3); + /* initialize lookup tables */ + qpsetup(qpclass, qpunbase); + b64setup(b64unbase); + return 1; +} + +/*=========================================================================*\ +* Global Lua functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Incrementaly breaks a string into lines. The string can have CRLF breaks. +* A, n = wrp(l, B, length) +* A is a copy of B, broken into lines of at most 'length' bytes. +* 'l' is how many bytes are left for the first line of B. +* 'n' is the number of bytes left in the last line of A. +\*-------------------------------------------------------------------------*/ +static int mime_global_wrp(lua_State *L) +{ + size_t size = 0; + int left = (int) luaL_checknumber(L, 1); + const UC *input = (UC *) luaL_optlstring(L, 2, NULL, &size); + const UC *last = input + size; + int length = (int) luaL_optnumber(L, 3, 76); + luaL_Buffer buffer; + /* end of input black-hole */ + if (!input) { + /* if last line has not been terminated, add a line break */ + if (left < length) lua_pushstring(L, CRLF); + /* otherwise, we are done */ + else lua_pushnil(L); + lua_pushnumber(L, length); + return 2; + } + luaL_buffinit(L, &buffer); + while (input < last) { + switch (*input) { + case '\r': + break; + case '\n': + luaL_addstring(&buffer, CRLF); + left = length; + break; + default: + if (left <= 0) { + left = length; + luaL_addstring(&buffer, CRLF); + } + luaL_putchar(&buffer, *input); + left--; + break; + } + input++; + } + luaL_pushresult(&buffer); + lua_pushnumber(L, left); + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Fill base64 decode map. +\*-------------------------------------------------------------------------*/ +static void b64setup(UC *b64unbase) +{ + int i; + for (i = 0; i <= 255; i++) b64unbase[i] = (UC) 255; + for (i = 0; i < 64; i++) b64unbase[b64base[i]] = (UC) i; + b64unbase['='] = 0; +} + +/*-------------------------------------------------------------------------*\ +* Acumulates bytes in input buffer until 3 bytes are available. +* Translate the 3 bytes into Base64 form and append to buffer. +* Returns new number of bytes in buffer. +\*-------------------------------------------------------------------------*/ +static size_t b64encode(UC c, UC *input, size_t size, + luaL_Buffer *buffer) +{ + input[size++] = c; + if (size == 3) { + UC code[4]; + unsigned long value = 0; + value += input[0]; value <<= 8; + value += input[1]; value <<= 8; + value += input[2]; + code[3] = b64base[value & 0x3f]; value >>= 6; + code[2] = b64base[value & 0x3f]; value >>= 6; + code[1] = b64base[value & 0x3f]; value >>= 6; + code[0] = b64base[value]; + luaL_addlstring(buffer, (char *) code, 4); + size = 0; + } + return size; +} + +/*-------------------------------------------------------------------------*\ +* Encodes the Base64 last 1 or 2 bytes and adds padding '=' +* Result, if any, is appended to buffer. +* Returns 0. +\*-------------------------------------------------------------------------*/ +static size_t b64pad(const UC *input, size_t size, + luaL_Buffer *buffer) +{ + unsigned long value = 0; + UC code[4] = {'=', '=', '=', '='}; + switch (size) { + case 1: + value = input[0] << 4; + code[1] = b64base[value & 0x3f]; value >>= 6; + code[0] = b64base[value]; + luaL_addlstring(buffer, (char *) code, 4); + break; + case 2: + value = input[0]; value <<= 8; + value |= input[1]; value <<= 2; + code[2] = b64base[value & 0x3f]; value >>= 6; + code[1] = b64base[value & 0x3f]; value >>= 6; + code[0] = b64base[value]; + luaL_addlstring(buffer, (char *) code, 4); + break; + default: + break; + } + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Acumulates bytes in input buffer until 4 bytes are available. +* Translate the 4 bytes from Base64 form and append to buffer. +* Returns new number of bytes in buffer. +\*-------------------------------------------------------------------------*/ +static size_t b64decode(UC c, UC *input, size_t size, + luaL_Buffer *buffer) +{ + /* ignore invalid characters */ + if (b64unbase[c] > 64) return size; + input[size++] = c; + /* decode atom */ + if (size == 4) { + UC decoded[3]; + int valid, value = 0; + value = b64unbase[input[0]]; value <<= 6; + value |= b64unbase[input[1]]; value <<= 6; + value |= b64unbase[input[2]]; value <<= 6; + value |= b64unbase[input[3]]; + decoded[2] = (UC) (value & 0xff); value >>= 8; + decoded[1] = (UC) (value & 0xff); value >>= 8; + decoded[0] = (UC) value; + /* take care of paddding */ + valid = (input[2] == '=') ? 1 : (input[3] == '=') ? 2 : 3; + luaL_addlstring(buffer, (char *) decoded, valid); + return 0; + /* need more data */ + } else return size; +} + +/*-------------------------------------------------------------------------*\ +* Incrementally applies the Base64 transfer content encoding to a string +* A, B = b64(C, D) +* A is the encoded version of the largest prefix of C .. D that is +* divisible by 3. B has the remaining bytes of C .. D, *without* encoding. +* The easiest thing would be to concatenate the two strings and +* encode the result, but we can't afford that or Lua would dupplicate +* every chunk we received. +\*-------------------------------------------------------------------------*/ +static int mime_global_b64(lua_State *L) +{ + UC atom[3]; + size_t isize = 0, asize = 0; + const UC *input = (UC *) luaL_optlstring(L, 1, NULL, &isize); + const UC *last = input + isize; + luaL_Buffer buffer; + /* end-of-input blackhole */ + if (!input) { + lua_pushnil(L); + lua_pushnil(L); + return 2; + } + /* process first part of the input */ + luaL_buffinit(L, &buffer); + while (input < last) + asize = b64encode(*input++, atom, asize, &buffer); + input = (UC *) luaL_optlstring(L, 2, NULL, &isize); + /* if second part is nil, we are done */ + if (!input) { + asize = b64pad(atom, asize, &buffer); + luaL_pushresult(&buffer); + if (!(*lua_tostring(L, -1))) lua_pushnil(L); + lua_pushnil(L); + return 2; + } + /* otherwise process the second part */ + last = input + isize; + while (input < last) + asize = b64encode(*input++, atom, asize, &buffer); + luaL_pushresult(&buffer); + lua_pushlstring(L, (char *) atom, asize); + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Incrementally removes the Base64 transfer content encoding from a string +* A, B = b64(C, D) +* A is the encoded version of the largest prefix of C .. D that is +* divisible by 4. B has the remaining bytes of C .. D, *without* encoding. +\*-------------------------------------------------------------------------*/ +static int mime_global_unb64(lua_State *L) +{ + UC atom[4]; + size_t isize = 0, asize = 0; + const UC *input = (UC *) luaL_optlstring(L, 1, NULL, &isize); + const UC *last = input + isize; + luaL_Buffer buffer; + /* end-of-input blackhole */ + if (!input) { + lua_pushnil(L); + lua_pushnil(L); + return 2; + } + /* process first part of the input */ + luaL_buffinit(L, &buffer); + while (input < last) + asize = b64decode(*input++, atom, asize, &buffer); + input = (UC *) luaL_optlstring(L, 2, NULL, &isize); + /* if second is nil, we are done */ + if (!input) { + luaL_pushresult(&buffer); + if (!(*lua_tostring(L, -1))) lua_pushnil(L); + lua_pushnil(L); + return 2; + } + /* otherwise, process the rest of the input */ + last = input + isize; + while (input < last) + asize = b64decode(*input++, atom, asize, &buffer); + luaL_pushresult(&buffer); + lua_pushlstring(L, (char *) atom, asize); + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Quoted-printable encoding scheme +* all (except CRLF in text) can be =XX +* CLRL in not text must be =XX=XX +* 33 through 60 inclusive can be plain +* 62 through 126 inclusive can be plain +* 9 and 32 can be plain, unless in the end of a line, where must be =XX +* encoded lines must be no longer than 76 not counting CRLF +* soft line-break are =CRLF +* To encode one byte, we need to see the next two. +* Worst case is when we see a space, and wonder if a CRLF is comming +\*-------------------------------------------------------------------------*/ +/*-------------------------------------------------------------------------*\ +* Split quoted-printable characters into classes +* Precompute reverse map for encoding +\*-------------------------------------------------------------------------*/ +static void qpsetup(UC *qpclass, UC *qpunbase) +{ + int i; + for (i = 0; i < 256; i++) qpclass[i] = QP_QUOTED; + for (i = 33; i <= 60; i++) qpclass[i] = QP_PLAIN; + for (i = 62; i <= 126; i++) qpclass[i] = QP_PLAIN; + qpclass['\t'] = QP_IF_LAST; + qpclass[' '] = QP_IF_LAST; + qpclass['\r'] = QP_CR; + for (i = 0; i < 256; i++) qpunbase[i] = 255; + qpunbase['0'] = 0; qpunbase['1'] = 1; qpunbase['2'] = 2; + qpunbase['3'] = 3; qpunbase['4'] = 4; qpunbase['5'] = 5; + qpunbase['6'] = 6; qpunbase['7'] = 7; qpunbase['8'] = 8; + qpunbase['9'] = 9; qpunbase['A'] = 10; qpunbase['a'] = 10; + qpunbase['B'] = 11; qpunbase['b'] = 11; qpunbase['C'] = 12; + qpunbase['c'] = 12; qpunbase['D'] = 13; qpunbase['d'] = 13; + qpunbase['E'] = 14; qpunbase['e'] = 14; qpunbase['F'] = 15; + qpunbase['f'] = 15; +} + +/*-------------------------------------------------------------------------*\ +* Output one character in form =XX +\*-------------------------------------------------------------------------*/ +static void qpquote(UC c, luaL_Buffer *buffer) +{ + luaL_putchar(buffer, '='); + luaL_putchar(buffer, qpbase[c >> 4]); + luaL_putchar(buffer, qpbase[c & 0x0F]); +} + +/*-------------------------------------------------------------------------*\ +* Accumulate characters until we are sure about how to deal with them. +* Once we are sure, output to the buffer, in the correct form. +\*-------------------------------------------------------------------------*/ +static size_t qpencode(UC c, UC *input, size_t size, + const char *marker, luaL_Buffer *buffer) +{ + input[size++] = c; + /* deal with all characters we can have */ + while (size > 0) { + switch (qpclass[input[0]]) { + /* might be the CR of a CRLF sequence */ + case QP_CR: + if (size < 2) return size; + if (input[1] == '\n') { + luaL_addstring(buffer, marker); + return 0; + } else qpquote(input[0], buffer); + break; + /* might be a space and that has to be quoted if last in line */ + case QP_IF_LAST: + if (size < 3) return size; + /* if it is the last, quote it and we are done */ + if (input[1] == '\r' && input[2] == '\n') { + qpquote(input[0], buffer); + luaL_addstring(buffer, marker); + return 0; + } else luaL_putchar(buffer, input[0]); + break; + /* might have to be quoted always */ + case QP_QUOTED: + qpquote(input[0], buffer); + break; + /* might never have to be quoted */ + default: + luaL_putchar(buffer, input[0]); + break; + } + input[0] = input[1]; input[1] = input[2]; + size--; + } + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Deal with the final characters +\*-------------------------------------------------------------------------*/ +static size_t qppad(UC *input, size_t size, luaL_Buffer *buffer) +{ + size_t i; + for (i = 0; i < size; i++) { + if (qpclass[input[i]] == QP_PLAIN) luaL_putchar(buffer, input[i]); + else qpquote(input[i], buffer); + } + if (size > 0) luaL_addstring(buffer, EQCRLF); + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Incrementally converts a string to quoted-printable +* A, B = qp(C, D, marker) +* Marker is the text to be used to replace CRLF sequences found in A. +* A is the encoded version of the largest prefix of C .. D that +* can be encoded without doubts. +* B has the remaining bytes of C .. D, *without* encoding. +\*-------------------------------------------------------------------------*/ +static int mime_global_qp(lua_State *L) +{ + + size_t asize = 0, isize = 0; + UC atom[3]; + const UC *input = (UC *) luaL_optlstring(L, 1, NULL, &isize); + const UC *last = input + isize; + const char *marker = luaL_optstring(L, 3, CRLF); + luaL_Buffer buffer; + /* end-of-input blackhole */ + if (!input) { + lua_pushnil(L); + lua_pushnil(L); + return 2; + } + /* process first part of input */ + luaL_buffinit(L, &buffer); + while (input < last) + asize = qpencode(*input++, atom, asize, marker, &buffer); + input = (UC *) luaL_optlstring(L, 2, NULL, &isize); + /* if second part is nil, we are done */ + if (!input) { + asize = qppad(atom, asize, &buffer); + luaL_pushresult(&buffer); + if (!(*lua_tostring(L, -1))) lua_pushnil(L); + lua_pushnil(L); + return 2; + } + /* otherwise process rest of input */ + last = input + isize; + while (input < last) + asize = qpencode(*input++, atom, asize, marker, &buffer); + luaL_pushresult(&buffer); + lua_pushlstring(L, (char *) atom, asize); + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Accumulate characters until we are sure about how to deal with them. +* Once we are sure, output the to the buffer, in the correct form. +\*-------------------------------------------------------------------------*/ +static size_t qpdecode(UC c, UC *input, size_t size, luaL_Buffer *buffer) { + int d; + input[size++] = c; + /* deal with all characters we can deal */ + switch (input[0]) { + /* if we have an escape character */ + case '=': + if (size < 3) return size; + /* eliminate soft line break */ + if (input[1] == '\r' && input[2] == '\n') return 0; + /* decode quoted representation */ + c = qpunbase[input[1]]; d = qpunbase[input[2]]; + /* if it is an invalid, do not decode */ + if (c > 15 || d > 15) luaL_addlstring(buffer, (char *)input, 3); + else luaL_putchar(buffer, (c << 4) + d); + return 0; + case '\r': + if (size < 2) return size; + if (input[1] == '\n') luaL_addlstring(buffer, (char *)input, 2); + return 0; + default: + if (input[0] == '\t' || (input[0] > 31 && input[0] < 127)) + luaL_putchar(buffer, input[0]); + return 0; + } +} + +/*-------------------------------------------------------------------------*\ +* Incrementally decodes a string in quoted-printable +* A, B = qp(C, D) +* A is the decoded version of the largest prefix of C .. D that +* can be decoded without doubts. +* B has the remaining bytes of C .. D, *without* decoding. +\*-------------------------------------------------------------------------*/ +static int mime_global_unqp(lua_State *L) +{ + size_t asize = 0, isize = 0; + UC atom[3]; + const UC *input = (UC *) luaL_optlstring(L, 1, NULL, &isize); + const UC *last = input + isize; + luaL_Buffer buffer; + /* end-of-input blackhole */ + if (!input) { + lua_pushnil(L); + lua_pushnil(L); + return 2; + } + /* process first part of input */ + luaL_buffinit(L, &buffer); + while (input < last) + asize = qpdecode(*input++, atom, asize, &buffer); + input = (UC *) luaL_optlstring(L, 2, NULL, &isize); + /* if second part is nil, we are done */ + if (!input) { + luaL_pushresult(&buffer); + if (!(*lua_tostring(L, -1))) lua_pushnil(L); + lua_pushnil(L); + return 2; + } + /* otherwise process rest of input */ + last = input + isize; + while (input < last) + asize = qpdecode(*input++, atom, asize, &buffer); + luaL_pushresult(&buffer); + lua_pushlstring(L, (char *) atom, asize); + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Incrementally breaks a quoted-printed string into lines +* A, n = qpwrp(l, B, length) +* A is a copy of B, broken into lines of at most 'length' bytes. +* 'l' is how many bytes are left for the first line of B. +* 'n' is the number of bytes left in the last line of A. +* There are two complications: lines can't be broken in the middle +* of an encoded =XX, and there might be line breaks already +\*-------------------------------------------------------------------------*/ +static int mime_global_qpwrp(lua_State *L) +{ + size_t size = 0; + int left = (int) luaL_checknumber(L, 1); + const UC *input = (UC *) luaL_optlstring(L, 2, NULL, &size); + const UC *last = input + size; + int length = (int) luaL_optnumber(L, 3, 76); + luaL_Buffer buffer; + /* end-of-input blackhole */ + if (!input) { + if (left < length) lua_pushstring(L, EQCRLF); + else lua_pushnil(L); + lua_pushnumber(L, length); + return 2; + } + /* process all input */ + luaL_buffinit(L, &buffer); + while (input < last) { + switch (*input) { + case '\r': + break; + case '\n': + left = length; + luaL_addstring(&buffer, CRLF); + break; + case '=': + if (left <= 3) { + left = length; + luaL_addstring(&buffer, EQCRLF); + } + luaL_putchar(&buffer, *input); + left--; + break; + default: + if (left <= 1) { + left = length; + luaL_addstring(&buffer, EQCRLF); + } + luaL_putchar(&buffer, *input); + left--; + break; + } + input++; + } + luaL_pushresult(&buffer); + lua_pushnumber(L, left); + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Here is what we do: \n, and \r are considered candidates for line +* break. We issue *one* new line marker if any of them is seen alone, or +* followed by a different one. That is, \n\n and \r\r will issue two +* end of line markers each, but \r\n, \n\r etc will only issue *one* +* marker. This covers Mac OS, Mac OS X, VMS, Unix and DOS, as well as +* probably other more obscure conventions. +* +* c is the current character being processed +* last is the previous character +\*-------------------------------------------------------------------------*/ +#define eolcandidate(c) (c == '\r' || c == '\n') +static int eolprocess(int c, int last, const char *marker, + luaL_Buffer *buffer) +{ + if (eolcandidate(c)) { + if (eolcandidate(last)) { + if (c == last) luaL_addstring(buffer, marker); + return 0; + } else { + luaL_addstring(buffer, marker); + return c; + } + } else { + luaL_putchar(buffer, c); + return 0; + } +} + +/*-------------------------------------------------------------------------*\ +* Converts a string to uniform EOL convention. +* A, n = eol(o, B, marker) +* A is the converted version of the largest prefix of B that can be +* converted unambiguously. 'o' is the context returned by the previous +* call. 'n' is the new context. +\*-------------------------------------------------------------------------*/ +static int mime_global_eol(lua_State *L) +{ + int ctx = luaL_checkint(L, 1); + size_t isize = 0; + const char *input = luaL_optlstring(L, 2, NULL, &isize); + const char *last = input + isize; + const char *marker = luaL_optstring(L, 3, CRLF); + luaL_Buffer buffer; + luaL_buffinit(L, &buffer); + /* end of input blackhole */ + if (!input) { + lua_pushnil(L); + lua_pushnumber(L, 0); + return 2; + } + /* process all input */ + while (input < last) + ctx = eolprocess(*input++, ctx, marker, &buffer); + luaL_pushresult(&buffer); + lua_pushnumber(L, ctx); + return 2; +} + +/*-------------------------------------------------------------------------*\ +* Takes one byte and stuff it if needed. +\*-------------------------------------------------------------------------*/ +static size_t dot(int c, size_t state, luaL_Buffer *buffer) +{ + luaL_putchar(buffer, c); + switch (c) { + case '\r': + return 1; + case '\n': + return (state == 1)? 2: 0; + case '.': + if (state == 2) + luaL_putchar(buffer, '.'); + default: + return 0; + } +} + +/*-------------------------------------------------------------------------*\ +* Incrementally applies smtp stuffing to a string +* A, n = dot(l, D) +\*-------------------------------------------------------------------------*/ +static int mime_global_dot(lua_State *L) +{ + size_t isize = 0, state = (size_t) luaL_checknumber(L, 1); + const char *input = luaL_optlstring(L, 2, NULL, &isize); + const char *last = input + isize; + luaL_Buffer buffer; + /* end-of-input blackhole */ + if (!input) { + lua_pushnil(L); + lua_pushnumber(L, 2); + return 2; + } + /* process all input */ + luaL_buffinit(L, &buffer); + while (input < last) + state = dot(*input++, state, &buffer); + luaL_pushresult(&buffer); + lua_pushnumber(L, state); + return 2; +} + diff --git a/jni/love/src/libraries/luasocket/libluasocket/mime.h b/jni/love/src/libraries/luasocket/libluasocket/mime.h new file mode 100644 index 00000000..85ee2a39 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/mime.h @@ -0,0 +1,31 @@ +#ifndef MIME_H +#define MIME_H +/*=========================================================================*\ +* Core MIME support +* LuaSocket toolkit +* +* This module provides functions to implement transfer content encodings +* and formatting conforming to RFC 2045. It is used by mime.lua, which +* provide a higher level interface to this functionality. +* +* RCS ID: $Id: mime.h,v 1.15 2007/06/11 23:44:54 diego Exp $ +\*=========================================================================*/ +#include "lua.h" + +/*-------------------------------------------------------------------------*\ +* Current MIME library version +\*-------------------------------------------------------------------------*/ +#define MIME_VERSION "MIME 1.0.2" +#define MIME_COPYRIGHT "Copyright (C) 2004-2007 Diego Nehab" +#define MIME_AUTHORS "Diego Nehab" + +/*-------------------------------------------------------------------------*\ +* This macro prefixes all exported API functions +\*-------------------------------------------------------------------------*/ +#ifndef MIME_API +#define MIME_API extern +#endif + +MIME_API int luaopen_mime_core(lua_State *L); + +#endif /* MIME_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/mime.lua b/jni/love/src/libraries/luasocket/libluasocket/mime.lua new file mode 100644 index 00000000..169eda29 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/mime.lua @@ -0,0 +1,87 @@ +----------------------------------------------------------------------------- +-- MIME support for the Lua language. +-- Author: Diego Nehab +-- Conforming to RFCs 2045-2049 +-- RCS ID: $Id: mime.lua,v 1.29 2007/06/11 23:44:54 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local ltn12 = require("ltn12") +local mime = require("mime.core") +local io = require("io") +local string = require("string") +module("mime") + +-- encode, decode and wrap algorithm tables +encodet = {} +decodet = {} +wrapt = {} + +-- creates a function that chooses a filter by name from a given table +local function choose(table) + return function(name, opt1, opt2) + if base.type(name) ~= "string" then + name, opt1, opt2 = "default", name, opt1 + end + local f = table[name or "nil"] + if not f then + base.error("unknown key (" .. base.tostring(name) .. ")", 3) + else return f(opt1, opt2) end + end +end + +-- define the encoding filters +encodet['base64'] = function() + return ltn12.filter.cycle(b64, "") +end + +encodet['quoted-printable'] = function(mode) + return ltn12.filter.cycle(qp, "", + (mode == "binary") and "=0D=0A" or "\r\n") +end + +-- define the decoding filters +decodet['base64'] = function() + return ltn12.filter.cycle(unb64, "") +end + +decodet['quoted-printable'] = function() + return ltn12.filter.cycle(unqp, "") +end + +local function format(chunk) + if chunk then + if chunk == "" then return "''" + else return string.len(chunk) end + else return "nil" end +end + +-- define the line-wrap filters +wrapt['text'] = function(length) + length = length or 76 + return ltn12.filter.cycle(wrp, length, length) +end +wrapt['base64'] = wrapt['text'] +wrapt['default'] = wrapt['text'] + +wrapt['quoted-printable'] = function() + return ltn12.filter.cycle(qpwrp, 76, 76) +end + +-- function that choose the encoding, decoding or wrap algorithm +encode = choose(encodet) +decode = choose(decodet) +wrap = choose(wrapt) + +-- define the end-of-line normalization filter +function normalize(marker) + return ltn12.filter.cycle(eol, 0, marker) +end + +-- high level stuffing filter +function stuff() + return ltn12.filter.cycle(dot, 2) +end diff --git a/jni/love/src/libraries/luasocket/libluasocket/mime.lua.h b/jni/love/src/libraries/luasocket/libluasocket/mime.lua.h new file mode 100644 index 00000000..c758dcd5 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/mime.lua.h @@ -0,0 +1,133 @@ +/* code automatically generated by bin2c -- DO NOT EDIT */ +{ +/* #include'ing this file in a C program is equivalent to calling + if (luaL_loadfile(L,"mime.lua")==0) lua_call(L, 0, 0); +*/ +/* mime.lua */ +static const unsigned char B1[]={ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 77, 73, 77, 69, 32,115,117,112,112,111,114,116, 32,102,111,114, 32,116,104, +101, 32, 76,117, 97, 32,108, 97,110,103,117, 97,103,101, 46, 10, 45, 45, 32, 65, +117,116,104,111,114, 58, 32, 68,105,101,103,111, 32, 78,101,104, 97, 98, 10, 45, + 45, 32, 67,111,110,102,111,114,109,105,110,103, 32,116,111, 32, 82, 70, 67,115, + 32, 50, 48, 52, 53, 45, 50, 48, 52, 57, 10, 45, 45, 32, 82, 67, 83, 32, 73, 68, + 58, 32, 36, 73,100, 58, 32,109,105,109,101, 46,108,117, 97, 44,118, 32, 49, 46, + 50, 57, 32, 50, 48, 48, 55, 47, 48, 54, 47, 49, 49, 32, 50, 51, 58, 52, 52, 58, + 53, 52, 32,100,105,101,103,111, 32, 69,120,112, 32, 36, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 10, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 68,101, 99,108, 97, +114,101, 32,109,111,100,117,108,101, 32, 97,110,100, 32,105,109,112,111,114,116, + 32,100,101,112,101,110,100,101,110, 99,105,101,115, 10, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32, 98, 97, +115,101, 32, 61, 32, 95, 71, 10,108,111, 99, 97,108, 32,108,116,110, 49, 50, 32, + 61, 32,114,101,113,117,105,114,101, 40, 34,108,116,110, 49, 50, 34, 41, 10,108, +111, 99, 97,108, 32,109,105,109,101, 32, 61, 32,114,101,113,117,105,114,101, 40, + 34,109,105,109,101, 46, 99,111,114,101, 34, 41, 10,108,111, 99, 97,108, 32,105, +111, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,105,111, 34, 41, 10,108,111, + 99, 97,108, 32,115,116,114,105,110,103, 32, 61, 32,114,101,113,117,105,114,101, + 40, 34,115,116,114,105,110,103, 34, 41, 10,109,111,100,117,108,101, 40, 34,109, +105,109,101, 34, 41, 10, 10, 45, 45, 32,101,110, 99,111,100,101, 44, 32,100,101, + 99,111,100,101, 32, 97,110,100, 32,119,114, 97,112, 32, 97,108,103,111,114,105, +116,104,109, 32,116, 97, 98,108,101,115, 10,101,110, 99,111,100,101,116, 32, 61, + 32,123,125, 10,100,101, 99,111,100,101,116, 32, 61, 32,123,125, 10,119,114, 97, +112,116, 32, 61, 32,123,125, 10, 10, 45, 45, 32, 99,114,101, 97,116,101,115, 32, + 97, 32,102,117,110, 99,116,105,111,110, 32,116,104, 97,116, 32, 99,104,111,111, +115,101,115, 32, 97, 32,102,105,108,116,101,114, 32, 98,121, 32,110, 97,109,101, + 32,102,114,111,109, 32, 97, 32,103,105,118,101,110, 32,116, 97, 98,108,101, 10, +108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32, 99,104,111,111,115, +101, 40,116, 97, 98,108,101, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, +102,117,110, 99,116,105,111,110, 40,110, 97,109,101, 44, 32,111,112,116, 49, 44, + 32,111,112,116, 50, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, 98, 97, +115,101, 46,116,121,112,101, 40,110, 97,109,101, 41, 32,126, 61, 32, 34,115,116, +114,105,110,103, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,110, 97,109,101, 44, 32,111,112,116, 49, 44, 32,111,112,116, 50, 32, + 61, 32, 34,100,101,102, 97,117,108,116, 34, 44, 32,110, 97,109,101, 44, 32,111, +112,116, 49, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, + 32, 32, 32, 32,108,111, 99, 97,108, 32,102, 32, 61, 32,116, 97, 98,108,101, 91, +110, 97,109,101, 32,111,114, 32, 34,110,105,108, 34, 93, 10, 32, 32, 32, 32, 32, + 32, 32, 32,105,102, 32,110,111,116, 32,102, 32,116,104,101,110, 32, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 98, 97,115,101, 46,101,114,114,111,114, + 40, 34,117,110,107,110,111,119,110, 32,107,101,121, 32, 40, 34, 32, 46, 46, 32, + 98, 97,115,101, 46,116,111,115,116,114,105,110,103, 40,110, 97,109,101, 41, 32, + 46, 46, 32, 34, 41, 34, 44, 32, 51, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,101, +108,115,101, 32,114,101,116,117,114,110, 32,102, 40,111,112,116, 49, 44, 32,111, +112,116, 50, 41, 32,101,110,100, 10, 32, 32, 32, 32,101,110,100, 10,101,110,100, + 10, 10, 45, 45, 32,100,101,102,105,110,101, 32,116,104,101, 32,101,110, 99,111, +100,105,110,103, 32,102,105,108,116,101,114,115, 10,101,110, 99,111,100,101,116, + 91, 39, 98, 97,115,101, 54, 52, 39, 93, 32, 61, 32,102,117,110, 99,116,105,111, +110, 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,108,116,110, 49, 50, + 46,102,105,108,116,101,114, 46, 99,121, 99,108,101, 40, 98, 54, 52, 44, 32, 34, + 34, 41, 10,101,110,100, 10, 10,101,110, 99,111,100,101,116, 91, 39,113,117,111, +116,101,100, 45,112,114,105,110,116, 97, 98,108,101, 39, 93, 32, 61, 32,102,117, +110, 99,116,105,111,110, 40,109,111,100,101, 41, 10, 32, 32, 32, 32,114,101,116, +117,114,110, 32,108,116,110, 49, 50, 46,102,105,108,116,101,114, 46, 99,121, 99, +108,101, 40,113,112, 44, 32, 34, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 40, +109,111,100,101, 32, 61, 61, 32, 34, 98,105,110, 97,114,121, 34, 41, 32, 97,110, +100, 32, 34, 61, 48, 68, 61, 48, 65, 34, 32,111,114, 32, 34, 92,114, 92,110, 34, + 41, 10,101,110,100, 10, 10, 45, 45, 32,100,101,102,105,110,101, 32,116,104,101, + 32,100,101, 99,111,100,105,110,103, 32,102,105,108,116,101,114,115, 10,100,101, + 99,111,100,101,116, 91, 39, 98, 97,115,101, 54, 52, 39, 93, 32, 61, 32,102,117, +110, 99,116,105,111,110, 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, +108,116,110, 49, 50, 46,102,105,108,116,101,114, 46, 99,121, 99,108,101, 40,117, +110, 98, 54, 52, 44, 32, 34, 34, 41, 10,101,110,100, 10, 10,100,101, 99,111,100, +101,116, 91, 39,113,117,111,116,101,100, 45,112,114,105,110,116, 97, 98,108,101, + 39, 93, 32, 61, 32,102,117,110, 99,116,105,111,110, 40, 41, 10, 32, 32, 32, 32, +114,101,116,117,114,110, 32,108,116,110, 49, 50, 46,102,105,108,116,101,114, 46, + 99,121, 99,108,101, 40,117,110,113,112, 44, 32, 34, 34, 41, 10,101,110,100, 10, + 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,102,111,114,109, + 97,116, 40, 99,104,117,110,107, 41, 10, 32, 32, 32, 32,105,102, 32, 99,104,117, +110,107, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, 99, +104,117,110,107, 32, 61, 61, 32, 34, 34, 32,116,104,101,110, 32,114,101,116,117, +114,110, 32, 34, 39, 39, 34, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, + 32,114,101,116,117,114,110, 32,115,116,114,105,110,103, 46,108,101,110, 40, 99, +104,117,110,107, 41, 32,101,110,100, 10, 32, 32, 32, 32,101,108,115,101, 32,114, +101,116,117,114,110, 32, 34,110,105,108, 34, 32,101,110,100, 10,101,110,100, 10, + 10, 45, 45, 32,100,101,102,105,110,101, 32,116,104,101, 32,108,105,110,101, 45, +119,114, 97,112, 32,102,105,108,116,101,114,115, 10,119,114, 97,112,116, 91, 39, +116,101,120,116, 39, 93, 32, 61, 32,102,117,110, 99,116,105,111,110, 40,108,101, +110,103,116,104, 41, 10, 32, 32, 32, 32,108,101,110,103,116,104, 32, 61, 32,108, +101,110,103,116,104, 32,111,114, 32, 55, 54, 10, 32, 32, 32, 32,114,101,116,117, +114,110, 32,108,116,110, 49, 50, 46,102,105,108,116,101,114, 46, 99,121, 99,108, +101, 40,119,114,112, 44, 32,108,101,110,103,116,104, 44, 32,108,101,110,103,116, +104, 41, 10,101,110,100, 10,119,114, 97,112,116, 91, 39, 98, 97,115,101, 54, 52, + 39, 93, 32, 61, 32,119,114, 97,112,116, 91, 39,116,101,120,116, 39, 93, 10,119, +114, 97,112,116, 91, 39,100,101,102, 97,117,108,116, 39, 93, 32, 61, 32,119,114, + 97,112,116, 91, 39,116,101,120,116, 39, 93, 10, 10,119,114, 97,112,116, 91, 39, +113,117,111,116,101,100, 45,112,114,105,110,116, 97, 98,108,101, 39, 93, 32, 61, + 32,102,117,110, 99,116,105,111,110, 40, 41, 10, 32, 32, 32, 32,114,101,116,117, +114,110, 32,108,116,110, 49, 50, 46,102,105,108,116,101,114, 46, 99,121, 99,108, +101, 40,113,112,119,114,112, 44, 32, 55, 54, 44, 32, 55, 54, 41, 10,101,110,100, + 10, 10, 45, 45, 32,102,117,110, 99,116,105,111,110, 32,116,104, 97,116, 32, 99, +104,111,111,115,101, 32,116,104,101, 32,101,110, 99,111,100,105,110,103, 44, 32, +100,101, 99,111,100,105,110,103, 32,111,114, 32,119,114, 97,112, 32, 97,108,103, +111,114,105,116,104,109, 10,101,110, 99,111,100,101, 32, 61, 32, 99,104,111,111, +115,101, 40,101,110, 99,111,100,101,116, 41, 10,100,101, 99,111,100,101, 32, 61, + 32, 99,104,111,111,115,101, 40,100,101, 99,111,100,101,116, 41, 10,119,114, 97, +112, 32, 61, 32, 99,104,111,111,115,101, 40,119,114, 97,112,116, 41, 10, 10, 45, + 45, 32,100,101,102,105,110,101, 32,116,104,101, 32,101,110,100, 45,111,102, 45, +108,105,110,101, 32,110,111,114,109, 97,108,105,122, 97,116,105,111,110, 32,102, +105,108,116,101,114, 10,102,117,110, 99,116,105,111,110, 32,110,111,114,109, 97, +108,105,122,101, 40,109, 97,114,107,101,114, 41, 10, 32, 32, 32, 32,114,101,116, +117,114,110, 32,108,116,110, 49, 50, 46,102,105,108,116,101,114, 46, 99,121, 99, +108,101, 40,101,111,108, 44, 32, 48, 44, 32,109, 97,114,107,101,114, 41, 10,101, +110,100, 10, 10, 45, 45, 32,104,105,103,104, 32,108,101,118,101,108, 32,115,116, +117,102,102,105,110,103, 32,102,105,108,116,101,114, 10,102,117,110, 99,116,105, +111,110, 32,115,116,117,102,102, 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114, +110, 32,108,116,110, 49, 50, 46,102,105,108,116,101,114, 46, 99,121, 99,108,101, + 40,100,111,116, 44, 32, 50, 41, 10,101,110,100, 10, +}; + + if (luaL_loadbuffer(L,(const char*)B1,sizeof(B1),"mime.lua")==0) lua_call(L, 0, 0); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/options.c b/jni/love/src/libraries/luasocket/libluasocket/options.c new file mode 100644 index 00000000..5da3c518 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/options.c @@ -0,0 +1,149 @@ +/*=========================================================================*\ +* Common option interface +* LuaSocket toolkit +* +* RCS ID: $Id: options.c,v 1.6 2005/11/20 07:20:23 diego Exp $ +\*=========================================================================*/ +#include + +#include "lauxlib.h" + +#include "auxiliar.h" +#include "options.h" +#include "inet.h" + + +/*=========================================================================*\ +* Internal functions prototypes +\*=========================================================================*/ +static int opt_setmembership(lua_State *L, p_socket ps, int level, int name); +static int opt_setboolean(lua_State *L, p_socket ps, int level, int name); +static int opt_set(lua_State *L, p_socket ps, int level, int name, + void *val, int len); + +/*=========================================================================*\ +* Exported functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Calls appropriate option handler +\*-------------------------------------------------------------------------*/ +int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps) +{ + const char *name = luaL_checkstring(L, 2); /* obj, name, ... */ + while (opt->name && strcmp(name, opt->name)) + opt++; + if (!opt->func) { + char msg[45]; + sprintf(msg, "unsupported option `%.35s'", name); + luaL_argerror(L, 2, msg); + } + return opt->func(L, ps); +} + +/* enables reuse of local address */ +int opt_reuseaddr(lua_State *L, p_socket ps) +{ + return opt_setboolean(L, ps, SOL_SOCKET, SO_REUSEADDR); +} + +/* disables the Naggle algorithm */ +int opt_tcp_nodelay(lua_State *L, p_socket ps) +{ + return opt_setboolean(L, ps, IPPROTO_TCP, TCP_NODELAY); +} + +int opt_keepalive(lua_State *L, p_socket ps) +{ + return opt_setboolean(L, ps, SOL_SOCKET, SO_KEEPALIVE); +} + +int opt_dontroute(lua_State *L, p_socket ps) +{ + return opt_setboolean(L, ps, SOL_SOCKET, SO_DONTROUTE); +} + +int opt_broadcast(lua_State *L, p_socket ps) +{ + return opt_setboolean(L, ps, SOL_SOCKET, SO_BROADCAST); +} + +int opt_ip_multicast_loop(lua_State *L, p_socket ps) +{ + return opt_setboolean(L, ps, IPPROTO_IP, IP_MULTICAST_LOOP); +} + +int opt_linger(lua_State *L, p_socket ps) +{ + struct linger li; /* obj, name, table */ + if (!lua_istable(L, 3)) luaL_typerror(L, 3, lua_typename(L, LUA_TTABLE)); + lua_pushstring(L, "on"); + lua_gettable(L, 3); + if (!lua_isboolean(L, -1)) + luaL_argerror(L, 3, "boolean 'on' field expected"); + li.l_onoff = (u_short) lua_toboolean(L, -1); + lua_pushstring(L, "timeout"); + lua_gettable(L, 3); + if (!lua_isnumber(L, -1)) + luaL_argerror(L, 3, "number 'timeout' field expected"); + li.l_linger = (u_short) lua_tonumber(L, -1); + return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(li)); +} + +int opt_ip_multicast_ttl(lua_State *L, p_socket ps) +{ + int val = (int) luaL_checknumber(L, 3); /* obj, name, int */ + return opt_set(L, ps, SOL_SOCKET, SO_LINGER, (char *) &val, sizeof(val)); +} + +int opt_ip_add_membership(lua_State *L, p_socket ps) +{ + return opt_setmembership(L, ps, IPPROTO_IP, IP_ADD_MEMBERSHIP); +} + +int opt_ip_drop_membersip(lua_State *L, p_socket ps) +{ + return opt_setmembership(L, ps, IPPROTO_IP, IP_DROP_MEMBERSHIP); +} + +/*=========================================================================*\ +* Auxiliar functions +\*=========================================================================*/ +static int opt_setmembership(lua_State *L, p_socket ps, int level, int name) +{ + struct ip_mreq val; /* obj, name, table */ + if (!lua_istable(L, 3)) luaL_typerror(L, 3, lua_typename(L, LUA_TTABLE)); + lua_pushstring(L, "multiaddr"); + lua_gettable(L, 3); + if (!lua_isstring(L, -1)) + luaL_argerror(L, 3, "string 'multiaddr' field expected"); + if (!inet_aton(lua_tostring(L, -1), &val.imr_multiaddr)) + luaL_argerror(L, 3, "invalid 'multiaddr' ip address"); + lua_pushstring(L, "interface"); + lua_gettable(L, 3); + if (!lua_isstring(L, -1)) + luaL_argerror(L, 3, "string 'interface' field expected"); + val.imr_interface.s_addr = htonl(INADDR_ANY); + if (strcmp(lua_tostring(L, -1), "*") && + !inet_aton(lua_tostring(L, -1), &val.imr_interface)) + luaL_argerror(L, 3, "invalid 'interface' ip address"); + return opt_set(L, ps, level, name, (char *) &val, sizeof(val)); +} + +static +int opt_set(lua_State *L, p_socket ps, int level, int name, void *val, int len) +{ + if (setsockopt(*ps, level, name, (char *) val, len) < 0) { + lua_pushnil(L); + lua_pushstring(L, "setsockopt failed"); + return 2; + } + lua_pushnumber(L, 1); + return 1; +} + +static int opt_setboolean(lua_State *L, p_socket ps, int level, int name) +{ + int val = auxiliar_checkboolean(L, 3); /* obj, name, bool */ + return opt_set(L, ps, level, name, (char *) &val, sizeof(val)); +} + diff --git a/jni/love/src/libraries/luasocket/libluasocket/options.h b/jni/love/src/libraries/luasocket/libluasocket/options.h new file mode 100644 index 00000000..4981cf2a --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/options.h @@ -0,0 +1,39 @@ +#ifndef OPTIONS_H +#define OPTIONS_H +/*=========================================================================*\ +* Common option interface +* LuaSocket toolkit +* +* This module provides a common interface to socket options, used mainly by +* modules UDP and TCP. +* +* RCS ID: $Id: options.h,v 1.4 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ + +#include "lua.h" +#include "socket.h" + +/* option registry */ +typedef struct t_opt { + const char *name; + int (*func)(lua_State *L, p_socket ps); +} t_opt; +typedef t_opt *p_opt; + +/* supported options */ +int opt_dontroute(lua_State *L, p_socket ps); +int opt_broadcast(lua_State *L, p_socket ps); +int opt_reuseaddr(lua_State *L, p_socket ps); +int opt_tcp_nodelay(lua_State *L, p_socket ps); +int opt_keepalive(lua_State *L, p_socket ps); +int opt_linger(lua_State *L, p_socket ps); +int opt_reuseaddr(lua_State *L, p_socket ps); +int opt_ip_multicast_ttl(lua_State *L, p_socket ps); +int opt_ip_multicast_loop(lua_State *L, p_socket ps); +int opt_ip_add_membership(lua_State *L, p_socket ps); +int opt_ip_drop_membersip(lua_State *L, p_socket ps); + +/* invokes the appropriate option handler */ +int opt_meth_setoption(lua_State *L, p_opt opt, p_socket ps); + +#endif diff --git a/jni/love/src/libraries/luasocket/libluasocket/pre.lua b/jni/love/src/libraries/luasocket/libluasocket/pre.lua new file mode 100644 index 00000000..fd6ebb15 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/pre.lua @@ -0,0 +1 @@ +if not socket then error("No socket.") end diff --git a/jni/love/src/libraries/luasocket/libluasocket/select.c b/jni/love/src/libraries/luasocket/libluasocket/select.c new file mode 100644 index 00000000..d70f6627 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/select.c @@ -0,0 +1,200 @@ +/*=========================================================================*\ +* Select implementation +* LuaSocket toolkit +* +* RCS ID: $Id: select.c,v 1.22 2005/11/20 07:20:23 diego Exp $ +\*=========================================================================*/ +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "socket.h" +#include "timeout.h" +#include "select.h" + +/*=========================================================================*\ +* Internal function prototypes. +\*=========================================================================*/ +static t_socket getfd(lua_State *L); +static int dirty(lua_State *L); +static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, + int itab, fd_set *set); +static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set); +static void return_fd(lua_State *L, fd_set *set, t_socket max_fd, + int itab, int tab, int start); +static void make_assoc(lua_State *L, int tab); +static int global_select(lua_State *L); + +/* functions in library namespace */ +static luaL_reg func[] = { + {"select", global_select}, + {NULL, NULL} +}; + +/*=========================================================================*\ +* Exported functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int select_open(lua_State *L) { + luaL_openlib(L, NULL, func, 0); + return 0; +} + +/*=========================================================================*\ +* Global Lua functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Waits for a set of sockets until a condition is met or timeout. +\*-------------------------------------------------------------------------*/ +static int global_select(lua_State *L) { + int rtab, wtab, itab, ret, ndirty; + t_socket max_fd; + fd_set rset, wset; + t_timeout tm; + double t = luaL_optnumber(L, 3, -1); + FD_ZERO(&rset); FD_ZERO(&wset); + lua_settop(L, 3); + lua_newtable(L); itab = lua_gettop(L); + lua_newtable(L); rtab = lua_gettop(L); + lua_newtable(L); wtab = lua_gettop(L); + max_fd = collect_fd(L, 1, SOCKET_INVALID, itab, &rset); + ndirty = check_dirty(L, 1, rtab, &rset); + t = ndirty > 0? 0.0: t; + timeout_init(&tm, t, -1); + timeout_markstart(&tm); + max_fd = collect_fd(L, 2, max_fd, itab, &wset); + ret = socket_select(max_fd+1, &rset, &wset, NULL, &tm); + if (ret > 0 || ndirty > 0) { + return_fd(L, &rset, max_fd+1, itab, rtab, ndirty); + return_fd(L, &wset, max_fd+1, itab, wtab, 0); + make_assoc(L, rtab); + make_assoc(L, wtab); + return 2; + } else if (ret == 0) { + lua_pushstring(L, "timeout"); + return 3; + } else { + lua_pushstring(L, "error"); + return 3; + } +} + +/*=========================================================================*\ +* Internal functions +\*=========================================================================*/ +static t_socket getfd(lua_State *L) { + t_socket fd = SOCKET_INVALID; + lua_pushstring(L, "getfd"); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + lua_pushvalue(L, -2); + lua_call(L, 1, 1); + if (lua_isnumber(L, -1)) + fd = (t_socket) lua_tonumber(L, -1); + } + lua_pop(L, 1); + return fd; +} + +static int dirty(lua_State *L) { + int is = 0; + lua_pushstring(L, "dirty"); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + lua_pushvalue(L, -2); + lua_call(L, 1, 1); + is = lua_toboolean(L, -1); + } + lua_pop(L, 1); + return is; +} + +static t_socket collect_fd(lua_State *L, int tab, t_socket max_fd, + int itab, fd_set *set) { + int i = 1; + if (lua_isnil(L, tab)) + return max_fd; + while (1) { + t_socket fd; + lua_pushnumber(L, i); + lua_gettable(L, tab); + if (lua_isnil(L, -1)) { + lua_pop(L, 1); + break; + } + fd = getfd(L); + if (fd != SOCKET_INVALID) { + FD_SET(fd, set); + if (max_fd == SOCKET_INVALID || max_fd < fd) + max_fd = fd; + lua_pushnumber(L, fd); + lua_pushvalue(L, -2); + lua_settable(L, itab); + } + lua_pop(L, 1); + i = i + 1; + } + return max_fd; +} + +static int check_dirty(lua_State *L, int tab, int dtab, fd_set *set) { + int ndirty = 0, i = 1; + if (lua_isnil(L, tab)) + return 0; + while (1) { + t_socket fd; + lua_pushnumber(L, i); + lua_gettable(L, tab); + if (lua_isnil(L, -1)) { + lua_pop(L, 1); + break; + } + fd = getfd(L); + if (fd != SOCKET_INVALID && dirty(L)) { + lua_pushnumber(L, ++ndirty); + lua_pushvalue(L, -2); + lua_settable(L, dtab); + FD_CLR(fd, set); + } + lua_pop(L, 1); + i = i + 1; + } + return ndirty; +} + +static void return_fd(lua_State *L, fd_set *set, t_socket max_fd, + int itab, int tab, int start) { + t_socket fd; + for (fd = 0; fd < max_fd; fd++) { + if (FD_ISSET(fd, set)) { + lua_pushnumber(L, ++start); + lua_pushnumber(L, fd); + lua_gettable(L, itab); + lua_settable(L, tab); + } + } +} + +static void make_assoc(lua_State *L, int tab) { + int i = 1, atab; + lua_newtable(L); atab = lua_gettop(L); + while (1) { + lua_pushnumber(L, i); + lua_gettable(L, tab); + if (!lua_isnil(L, -1)) { + lua_pushnumber(L, i); + lua_pushvalue(L, -2); + lua_settable(L, atab); + lua_pushnumber(L, i); + lua_settable(L, atab); + } else { + lua_pop(L, 1); + break; + } + i = i+1; + } +} + diff --git a/jni/love/src/libraries/luasocket/libluasocket/select.h b/jni/love/src/libraries/luasocket/libluasocket/select.h new file mode 100644 index 00000000..aa3db4ad --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/select.h @@ -0,0 +1,17 @@ +#ifndef SELECT_H +#define SELECT_H +/*=========================================================================*\ +* Select implementation +* LuaSocket toolkit +* +* Each object that can be passed to the select function has to export +* method getfd() which returns the descriptor to be passed to the +* underlying select function. Another method, dirty(), should return +* true if there is data ready for reading (required for buffered input). +* +* RCS ID: $Id: select.h,v 1.7 2004/06/16 01:02:07 diego Exp $ +\*=========================================================================*/ + +int select_open(lua_State *L); + +#endif /* SELECT_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/smtp.lua b/jni/love/src/libraries/luasocket/libluasocket/smtp.lua new file mode 100644 index 00000000..8f3cfcff --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/smtp.lua @@ -0,0 +1,251 @@ +----------------------------------------------------------------------------- +-- SMTP client support for the Lua language. +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: smtp.lua,v 1.46 2007/03/12 04:08:40 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local coroutine = require("coroutine") +local string = require("string") +local math = require("math") +local os = require("os") +local socket = require("socket") +local tp = require("socket.tp") +local ltn12 = require("ltn12") +local mime = require("mime") +module("socket.smtp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +-- timeout for connection +TIMEOUT = 60 +-- default server used to send e-mails +SERVER = "localhost" +-- default port +PORT = 25 +-- domain used in HELO command and default sendmail +-- If we are under a CGI, try to get from environment +DOMAIN = os.getenv("SERVER_NAME") or "localhost" +-- default time zone (means we don't know) +ZONE = "-0000" + +--------------------------------------------------------------------------- +-- Low level SMTP API +----------------------------------------------------------------------------- +local metat = { __index = {} } + +function metat.__index:greet(domain) + self.try(self.tp:check("2..")) + self.try(self.tp:command("EHLO", domain or DOMAIN)) + return socket.skip(1, self.try(self.tp:check("2.."))) +end + +function metat.__index:mail(from) + self.try(self.tp:command("MAIL", "FROM:" .. from)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:rcpt(to) + self.try(self.tp:command("RCPT", "TO:" .. to)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:data(src, step) + self.try(self.tp:command("DATA")) + self.try(self.tp:check("3..")) + self.try(self.tp:source(src, step)) + self.try(self.tp:send("\r\n.\r\n")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:quit() + self.try(self.tp:command("QUIT")) + return self.try(self.tp:check("2..")) +end + +function metat.__index:close() + return self.tp:close() +end + +function metat.__index:login(user, password) + self.try(self.tp:command("AUTH", "LOGIN")) + self.try(self.tp:check("3..")) + self.try(self.tp:command(mime.b64(user))) + self.try(self.tp:check("3..")) + self.try(self.tp:command(mime.b64(password))) + return self.try(self.tp:check("2..")) +end + +function metat.__index:plain(user, password) + local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password) + self.try(self.tp:command("AUTH", auth)) + return self.try(self.tp:check("2..")) +end + +function metat.__index:auth(user, password, ext) + if not user or not password then return 1 end + if string.find(ext, "AUTH[^\n]+LOGIN") then + return self:login(user, password) + elseif string.find(ext, "AUTH[^\n]+PLAIN") then + return self:plain(user, password) + else + self.try(nil, "authentication not supported") + end +end + +-- send message or throw an exception +function metat.__index:send(mailt) + self:mail(mailt.from) + if base.type(mailt.rcpt) == "table" then + for i,v in base.ipairs(mailt.rcpt) do + self:rcpt(v) + end + else + self:rcpt(mailt.rcpt) + end + self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step) +end + +function open(server, port, create) + local tp = socket.try(tp.connect(server or SERVER, port or PORT, + TIMEOUT, create)) + local s = base.setmetatable({tp = tp}, metat) + -- make sure tp is closed if we get an exception + s.try = socket.newtry(function() + s:close() + end) + return s +end + +-- convert headers to lowercase +local function lower_headers(headers) + local lower = {} + for i,v in base.pairs(headers or lower) do + lower[string.lower(i)] = v + end + return lower +end + +--------------------------------------------------------------------------- +-- Multipart message source +----------------------------------------------------------------------------- +-- returns a hopefully unique mime boundary +local seqno = 0 +local function newboundary() + seqno = seqno + 1 + return string.format('%s%05d==%05u', os.date('%d%m%Y%H%M%S'), + math.random(0, 99999), seqno) +end + +-- send_message forward declaration +local send_message + +-- yield the headers all at once, it's faster +local function send_headers(headers) + local h = "\r\n" + for i,v in base.pairs(headers) do + h = i .. ': ' .. v .. "\r\n" .. h + end + coroutine.yield(h) +end + +-- yield multipart message body from a multipart message table +local function send_multipart(mesgt) + -- make sure we have our boundary and send headers + local bd = newboundary() + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or 'multipart/mixed' + headers['content-type'] = headers['content-type'] .. + '; boundary="' .. bd .. '"' + send_headers(headers) + -- send preamble + if mesgt.body.preamble then + coroutine.yield(mesgt.body.preamble) + coroutine.yield("\r\n") + end + -- send each part separated by a boundary + for i, m in base.ipairs(mesgt.body) do + coroutine.yield("\r\n--" .. bd .. "\r\n") + send_message(m) + end + -- send last boundary + coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n") + -- send epilogue + if mesgt.body.epilogue then + coroutine.yield(mesgt.body.epilogue) + coroutine.yield("\r\n") + end +end + +-- yield message body from a source +local function send_source(mesgt) + -- make sure we have a content-type + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or + 'text/plain; charset="iso-8859-1"' + send_headers(headers) + -- send body from source + while true do + local chunk, err = mesgt.body() + if err then coroutine.yield(nil, err) + elseif chunk then coroutine.yield(chunk) + else break end + end +end + +-- yield message body from a string +local function send_string(mesgt) + -- make sure we have a content-type + local headers = lower_headers(mesgt.headers or {}) + headers['content-type'] = headers['content-type'] or + 'text/plain; charset="iso-8859-1"' + send_headers(headers) + -- send body from string + coroutine.yield(mesgt.body) +end + +-- message source +function send_message(mesgt) + if base.type(mesgt.body) == "table" then send_multipart(mesgt) + elseif base.type(mesgt.body) == "function" then send_source(mesgt) + else send_string(mesgt) end +end + +-- set defaul headers +local function adjust_headers(mesgt) + local lower = lower_headers(mesgt.headers) + lower["date"] = lower["date"] or + os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or ZONE) + lower["x-mailer"] = lower["x-mailer"] or socket._VERSION + -- this can't be overriden + lower["mime-version"] = "1.0" + return lower +end + +function message(mesgt) + mesgt.headers = adjust_headers(mesgt) + -- create and return message source + local co = coroutine.create(function() send_message(mesgt) end) + return function() + local ret, a, b = coroutine.resume(co) + if ret then return a, b + else return nil, a end + end +end + +--------------------------------------------------------------------------- +-- High level SMTP API +----------------------------------------------------------------------------- +send = socket.protect(function(mailt) + local s = open(mailt.server, mailt.port, mailt.create) + local ext = s:greet(mailt.domain) + s:auth(mailt.user, mailt.password, ext) + s:send(mailt) + s:quit() + return s:close() +end) diff --git a/jni/love/src/libraries/luasocket/libluasocket/smtp.lua.h b/jni/love/src/libraries/luasocket/libluasocket/smtp.lua.h new file mode 100644 index 00000000..e8d7f987 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/smtp.lua.h @@ -0,0 +1,410 @@ +/* code automatically generated by bin2c -- DO NOT EDIT */ +{ +/* #include'ing this file in a C program is equivalent to calling + if (luaL_loadfile(L,"smtp.lua")==0) lua_call(L, 0, 0); +*/ +/* smtp.lua */ +static const unsigned char B1[]={ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 83, 77, 84, 80, 32, 99,108,105,101,110,116, 32,115,117,112,112,111,114,116, + 32,102,111,114, 32,116,104,101, 32, 76,117, 97, 32,108, 97,110,103,117, 97,103, +101, 46, 10, 45, 45, 32, 76,117, 97, 83,111, 99,107,101,116, 32,116,111,111,108, +107,105,116, 46, 10, 45, 45, 32, 65,117,116,104,111,114, 58, 32, 68,105,101,103, +111, 32, 78,101,104, 97, 98, 10, 45, 45, 32, 82, 67, 83, 32, 73, 68, 58, 32, 36, + 73,100, 58, 32,115,109,116,112, 46,108,117, 97, 44,118, 32, 49, 46, 52, 54, 32, + 50, 48, 48, 55, 47, 48, 51, 47, 49, 50, 32, 48, 52, 58, 48, 56, 58, 52, 48, 32, +100,105,101,103,111, 32, 69,120,112, 32, 36, 10, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 68,101, 99,108, 97,114,101, 32, +109,111,100,117,108,101, 32, 97,110,100, 32,105,109,112,111,114,116, 32,100,101, +112,101,110,100,101,110, 99,105,101,115, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32, 98, 97,115,101, 32, + 61, 32, 95, 71, 10,108,111, 99, 97,108, 32, 99,111,114,111,117,116,105,110,101, + 32, 61, 32,114,101,113,117,105,114,101, 40, 34, 99,111,114,111,117,116,105,110, +101, 34, 41, 10,108,111, 99, 97,108, 32,115,116,114,105,110,103, 32, 61, 32,114, +101,113,117,105,114,101, 40, 34,115,116,114,105,110,103, 34, 41, 10,108,111, 99, + 97,108, 32,109, 97,116,104, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,109, + 97,116,104, 34, 41, 10,108,111, 99, 97,108, 32,111,115, 32, 61, 32,114,101,113, +117,105,114,101, 40, 34,111,115, 34, 41, 10,108,111, 99, 97,108, 32,115,111, 99, +107,101,116, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,115,111, 99,107,101, +116, 34, 41, 10,108,111, 99, 97,108, 32,116,112, 32, 61, 32,114,101,113,117,105, +114,101, 40, 34,115,111, 99,107,101,116, 46,116,112, 34, 41, 10,108,111, 99, 97, +108, 32,108,116,110, 49, 50, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,108, +116,110, 49, 50, 34, 41, 10,108,111, 99, 97,108, 32,109,105,109,101, 32, 61, 32, +114,101,113,117,105,114,101, 40, 34,109,105,109,101, 34, 41, 10,109,111,100,117, +108,101, 40, 34,115,111, 99,107,101,116, 46,115,109,116,112, 34, 41, 10, 10, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, + 80,114,111,103,114, 97,109, 32, 99,111,110,115,116, 97,110,116,115, 10, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32,116, +105,109,101,111,117,116, 32,102,111,114, 32, 99,111,110,110,101, 99,116,105,111, +110, 10, 84, 73, 77, 69, 79, 85, 84, 32, 61, 32, 54, 48, 10, 45, 45, 32,100,101, +102, 97,117,108,116, 32,115,101,114,118,101,114, 32,117,115,101,100, 32,116,111, + 32,115,101,110,100, 32,101, 45,109, 97,105,108,115, 10, 83, 69, 82, 86, 69, 82, + 32, 61, 32, 34,108,111, 99, 97,108,104,111,115,116, 34, 10, 45, 45, 32,100,101, +102, 97,117,108,116, 32,112,111,114,116, 10, 80, 79, 82, 84, 32, 61, 32, 50, 53, + 10, 45, 45, 32,100,111,109, 97,105,110, 32,117,115,101,100, 32,105,110, 32, 72, + 69, 76, 79, 32, 99,111,109,109, 97,110,100, 32, 97,110,100, 32,100,101,102, 97, +117,108,116, 32,115,101,110,100,109, 97,105,108, 10, 45, 45, 32, 73,102, 32,119, +101, 32, 97,114,101, 32,117,110,100,101,114, 32, 97, 32, 67, 71, 73, 44, 32,116, +114,121, 32,116,111, 32,103,101,116, 32,102,114,111,109, 32,101,110,118,105,114, +111,110,109,101,110,116, 10, 68, 79, 77, 65, 73, 78, 32, 61, 32,111,115, 46,103, +101,116,101,110,118, 40, 34, 83, 69, 82, 86, 69, 82, 95, 78, 65, 77, 69, 34, 41, + 32,111,114, 32, 34,108,111, 99, 97,108,104,111,115,116, 34, 10, 45, 45, 32,100, +101,102, 97,117,108,116, 32,116,105,109,101, 32,122,111,110,101, 32, 40,109,101, + 97,110,115, 32,119,101, 32,100,111,110, 39,116, 32,107,110,111,119, 41, 10, 90, + 79, 78, 69, 32, 61, 32, 34, 45, 48, 48, 48, 48, 34, 10, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 76,111,119, 32,108,101, +118,101,108, 32, 83, 77, 84, 80, 32, 65, 80, 73, 10, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32,109,101,116, + 97,116, 32, 61, 32,123, 32, 95, 95,105,110,100,101,120, 32, 61, 32,123,125, 32, +125, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95, +105,110,100,101,120, 58,103,114,101,101,116, 40,100,111,109, 97,105,110, 41, 10, + 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, + 58, 99,104,101, 99,107, 40, 34, 50, 46, 46, 34, 41, 41, 10, 32, 32, 32, 32,115, +101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,111,109,109, + 97,110,100, 40, 34, 69, 72, 76, 79, 34, 44, 32,100,111,109, 97,105,110, 32,111, +114, 32, 68, 79, 77, 65, 73, 78, 41, 41, 10, 32, 32, 32, 32,114,101,116,117,114, +110, 32,115,111, 99,107,101,116, 46,115,107,105,112, 40, 49, 44, 32,115,101,108, +102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, + 34, 50, 46, 46, 34, 41, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105, +111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,109, 97,105, +108, 40,102,114,111,109, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, + 40,115,101,108,102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40, 34, 77, 65, + 73, 76, 34, 44, 32, 34, 70, 82, 79, 77, 58, 34, 32, 46, 46, 32,102,114,111,109, + 41, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46,116, +114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 34, 50, 46, + 46, 34, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109, +101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,114, 99,112,116, 40,116,111, + 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46, +116,112, 58, 99,111,109,109, 97,110,100, 40, 34, 82, 67, 80, 84, 34, 44, 32, 34, + 84, 79, 58, 34, 32, 46, 46, 32,116,111, 41, 41, 10, 32, 32, 32, 32,114,101,116, +117,114,110, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, + 58, 99,104,101, 99,107, 40, 34, 50, 46, 46, 34, 41, 41, 10,101,110,100, 10, 10, +102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100, +101,120, 58,100, 97,116, 97, 40,115,114, 99, 44, 32,115,116,101,112, 41, 10, 32, + 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, + 99,111,109,109, 97,110,100, 40, 34, 68, 65, 84, 65, 34, 41, 41, 10, 32, 32, 32, + 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,104, +101, 99,107, 40, 34, 51, 46, 46, 34, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, + 46,116,114,121, 40,115,101,108,102, 46,116,112, 58,115,111,117,114, 99,101, 40, +115,114, 99, 44, 32,115,116,101,112, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, + 46,116,114,121, 40,115,101,108,102, 46,116,112, 58,115,101,110,100, 40, 34, 92, +114, 92,110, 46, 92,114, 92,110, 34, 41, 41, 10, 32, 32, 32, 32,114,101,116,117, +114,110, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, + 99,104,101, 99,107, 40, 34, 50, 46, 46, 34, 41, 41, 10,101,110,100, 10, 10,102, +117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101, +120, 58,113,117,105,116, 40, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114, +121, 40,115,101,108,102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40, 34, 81, + 85, 73, 84, 34, 41, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101, +108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, + 40, 34, 50, 46, 46, 34, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105, +111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58, 99,108,111, +115,101, 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, + 46,116,112, 58, 99,108,111,115,101, 40, 41, 10,101,110,100, 10, 10,102,117,110, + 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58, +108,111,103,105,110, 40,117,115,101,114, 44, 32,112, 97,115,115,119,111,114,100, + 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46, +116,112, 58, 99,111,109,109, 97,110,100, 40, 34, 65, 85, 84, 72, 34, 44, 32, 34, + 76, 79, 71, 73, 78, 34, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114, +121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 34, 51, 46, 46, + 34, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108, +102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40,109,105,109,101, 46, 98, 54, + 52, 40,117,115,101,114, 41, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116, +114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 34, 51, 46, + 46, 34, 41, 41, 10, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101, +108,102, 46,116,112, 58, 99,111,109,109, 97,110,100, 40,109,105,109,101, 46, 98, + 54, 52, 40,112, 97,115,115,119,111,114,100, 41, 41, 41, 10, 32, 32, 32, 32,114, +101,116,117,114,110, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46, +116,112, 58, 99,104,101, 99,107, 40, 34, 50, 46, 46, 34, 41, 41, 10,101,110,100, + 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105, +110,100,101,120, 58,112,108, 97,105,110, 40,117,115,101,114, 44, 32,112, 97,115, +115,119,111,114,100, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 97,117,116, +104, 32, 61, 32, 34, 80, 76, 65, 73, 78, 32, 34, 32, 46, 46, 32,109,105,109,101, + 46, 98, 54, 52, 40, 34, 92, 48, 34, 32, 46, 46, 32,117,115,101,114, 32, 46, 46, + 32, 34, 92, 48, 34, 32, 46, 46, 32,112, 97,115,115,119,111,114,100, 41, 10, 32, + 32, 32, 32,115,101,108,102, 46,116,114,121, 40,115,101,108,102, 46,116,112, 58, + 99,111,109,109, 97,110,100, 40, 34, 65, 85, 84, 72, 34, 44, 32, 97,117,116,104, + 41, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46,116, +114,121, 40,115,101,108,102, 46,116,112, 58, 99,104,101, 99,107, 40, 34, 50, 46, + 46, 34, 41, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109, +101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58, 97,117,116,104, 40,117,115, +101,114, 44, 32,112, 97,115,115,119,111,114,100, 44, 32,101,120,116, 41, 10, 32, + 32, 32, 32,105,102, 32,110,111,116, 32,117,115,101,114, 32,111,114, 32,110,111, +116, 32,112, 97,115,115,119,111,114,100, 32,116,104,101,110, 32,114,101,116,117, +114,110, 32, 49, 32,101,110,100, 10, 32, 32, 32, 32,105,102, 32,115,116,114,105, +110,103, 46,102,105,110,100, 40,101,120,116, 44, 32, 34, 65, 85, 84, 72, 91, 94, + 92,110, 93, 43, 76, 79, 71, 73, 78, 34, 41, 32,116,104,101,110, 10, 32, 32, 32, + 32, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 58,108,111,103, +105,110, 40,117,115,101,114, 44, 32,112, 97,115,115,119,111,114,100, 41, 10, 32, + 32, 32, 32,101,108,115,101,105,102, 32,115,116,114,105,110,103, 46,102,105,110, +100, 40,101,120,116, 44, 32, 34, 65, 85, 84, 72, 91, 94, 92,110, 93, 43, 80, 76, + 65, 73, 78, 34, 41, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,114, +101,116,117,114,110, 32,115,101,108,102, 58,112,108, 97,105,110, 40,117,115,101, +114, 44, 32,112, 97,115,115,119,111,114,100, 41, 10, 32, 32, 32, 32,101,108,115, +101, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,101,108,102, 46,116,114,121, 40,110, +105,108, 44, 32, 34, 97,117,116,104,101,110,116,105, 99, 97,116,105,111,110, 32, +110,111,116, 32,115,117,112,112,111,114,116,101,100, 34, 41, 10, 32, 32, 32, 32, +101,110,100, 10,101,110,100, 10, 10, 45, 45, 32,115,101,110,100, 32,109,101,115, +115, 97,103,101, 32,111,114, 32,116,104,114,111,119, 32, 97,110, 32,101,120, 99, +101,112,116,105,111,110, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97, +116, 46, 95, 95,105,110,100,101,120, 58,115,101,110,100, 40,109, 97,105,108,116, + 41, 10, 32, 32, 32, 32,115,101,108,102, 58,109, 97,105,108, 40,109, 97,105,108, +116, 46,102,114,111,109, 41, 10, 32, 32, 32, 32,105,102, 32, 98, 97,115,101, 46, +116,121,112,101, 40,109, 97,105,108,116, 46,114, 99,112,116, 41, 32, 61, 61, 32, + 34,116, 97, 98,108,101, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, + 32,102,111,114, 32,105, 44,118, 32,105,110, 32, 98, 97,115,101, 46,105,112, 97, +105,114,115, 40,109, 97,105,108,116, 46,114, 99,112,116, 41, 32,100,111, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115,101,108,102, 58,114, 99,112,116, + 40,118, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, +101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,101,108,102, 58,114, 99, +112,116, 40,109, 97,105,108,116, 46,114, 99,112,116, 41, 10, 32, 32, 32, 32,101, +110,100, 10, 32, 32, 32, 32,115,101,108,102, 58,100, 97,116, 97, 40,108,116,110, + 49, 50, 46,115,111,117,114, 99,101, 46, 99,104, 97,105,110, 40,109, 97,105,108, +116, 46,115,111,117,114, 99,101, 44, 32,109,105,109,101, 46,115,116,117,102,102, + 40, 41, 41, 44, 32,109, 97,105,108,116, 46,115,116,101,112, 41, 10,101,110,100, + 10, 10,102,117,110, 99,116,105,111,110, 32,111,112,101,110, 40,115,101,114,118, +101,114, 44, 32,112,111,114,116, 44, 32, 99,114,101, 97,116,101, 41, 10, 32, 32, + 32, 32,108,111, 99, 97,108, 32,116,112, 32, 61, 32,115,111, 99,107,101,116, 46, +116,114,121, 40,116,112, 46, 99,111,110,110,101, 99,116, 40,115,101,114,118,101, +114, 32,111,114, 32, 83, 69, 82, 86, 69, 82, 44, 32,112,111,114,116, 32,111,114, + 32, 80, 79, 82, 84, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 84, 73, 77, 69, 79, + 85, 84, 44, 32, 99,114,101, 97,116,101, 41, 41, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,115, 32, 61, 32, 98, 97,115,101, 46,115,101,116,109,101,116, 97,116, + 97, 98,108,101, 40,123,116,112, 32, 61, 32,116,112,125, 44, 32,109,101,116, 97, +116, 41, 10, 32, 32, 32, 32, 45, 45, 32,109, 97,107,101, 32,115,117,114,101, 32, +116,112, 32,105,115, 32, 99,108,111,115,101,100, 32,105,102, 32,119,101, 32,103, +101,116, 32, 97,110, 32,101,120, 99,101,112,116,105,111,110, 10, 32, 32, 32, 32, +115, 46,116,114,121, 32, 61, 32,115,111, 99,107,101,116, 46,110,101,119,116,114, +121, 40,102,117,110, 99,116,105,111,110, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, + 32,115, 58, 99,108,111,115,101, 40, 41, 10, 32, 32, 32, 32,101,110,100, 41, 10, + 32, 32, 32, 32,114,101,116,117,114,110, 32,115, 10,101,110,100, 10, 10, 45, 45, + 32, 99,111,110,118,101,114,116, 32,104,101, 97,100,101,114,115, 32,116,111, 32, +108,111,119,101,114, 99, 97,115,101, 10,108,111, 99, 97,108, 32,102,117,110, 99, +116,105,111,110, 32,108,111,119,101,114, 95,104,101, 97,100,101,114,115, 40,104, +101, 97,100,101,114,115, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,108,111, +119,101,114, 32, 61, 32,123,125, 10, 32, 32, 32, 32,102,111,114, 32,105, 44,118, + 32,105,110, 32, 98, 97,115,101, 46,112, 97,105,114,115, 40,104,101, 97,100,101, +114,115, 32,111,114, 32,108,111,119,101,114, 41, 32,100,111, 10, 32, 32, 32, 32, + 32, 32, 32, 32,108,111,119,101,114, 91,115,116,114,105,110,103, 46,108,111,119, +101,114, 40,105, 41, 93, 32, 61, 32,118, 10, 32, 32, 32, 32,101,110,100, 10, 32, + 32, 32, 32,114,101,116,117,114,110, 32,108,111,119,101,114, 10,101,110,100, 10, + 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, + 77,117,108,116,105,112, 97,114,116, 32,109,101,115,115, 97,103,101, 32,115,111, +117,114, 99,101, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 10, 45, 45, 32,114,101,116,117,114,110,115, 32, 97, 32,104,111,112,101, +102,117,108,108,121, 32,117,110,105,113,117,101, 32,109,105,109,101, 32, 98,111, +117,110,100, 97,114,121, 10,108,111, 99, 97,108, 32,115,101,113,110,111, 32, 61, + 32, 48, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,110,101, +119, 98,111,117,110,100, 97,114,121, 40, 41, 10, 32, 32, 32, 32,115,101,113,110, +111, 32, 61, 32,115,101,113,110,111, 32, 43, 32, 49, 10, 32, 32, 32, 32,114,101, +116,117,114,110, 32,115,116,114,105,110,103, 46,102,111,114,109, 97,116, 40, 39, + 37,115, 37, 48, 53,100, 61, 61, 37, 48, 53,117, 39, 44, 32,111,115, 46,100, 97, +116,101, 40, 39, 37,100, 37,109, 37, 89, 37, 72, 37, 77, 37, 83, 39, 41, 44, 10, + 32, 32, 32, 32, 32, 32, 32, 32,109, 97,116,104, 46,114, 97,110,100,111,109, 40, + 48, 44, 32, 57, 57, 57, 57, 57, 41, 44, 32,115,101,113,110,111, 41, 10,101,110, +100, 10, 10, 45, 45, 32,115,101,110,100, 95,109,101,115,115, 97,103,101, 32,102, +111,114,119, 97,114,100, 32,100,101, 99,108, 97,114, 97,116,105,111,110, 10,108, +111, 99, 97,108, 32,115,101,110,100, 95,109,101,115,115, 97,103,101, 10, 10, 45, + 45, 32,121,105,101,108,100, 32,116,104,101, 32,104,101, 97,100,101,114,115, 32, + 97,108,108, 32, 97,116, 32,111,110, 99,101, 44, 32,105,116, 39,115, 32,102, 97, +115,116,101,114, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32, +115,101,110,100, 95,104,101, 97,100,101,114,115, 40,104,101, 97,100,101,114,115, + 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,104, 32, 61, 32, 34, 92,114, 92, +110, 34, 10, 32, 32, 32, 32,102,111,114, 32,105, 44,118, 32,105,110, 32, 98, 97, +115,101, 46,112, 97,105,114,115, 40,104,101, 97,100,101,114,115, 41, 32,100,111, + 10, 32, 32, 32, 32, 32, 32, 32, 32,104, 32, 61, 32,105, 32, 46, 46, 32, 39, 58, + 32, 39, 32, 46, 46, 32,118, 32, 46, 46, 32, 34, 92,114, 92,110, 34, 32, 46, 46, + 32,104, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 99,111,114,111,117, +116,105,110,101, 46,121,105,101,108,100, 40,104, 41, 10,101,110,100, 10, 10, 45, + 45, 32,121,105,101,108,100, 32,109,117,108,116,105,112, 97,114,116, 32,109,101, +115,115, 97,103,101, 32, 98,111,100,121, 32,102,114,111,109, 32, 97, 32,109,117, +108,116,105,112, 97,114,116, 32,109,101,115,115, 97,103,101, 32,116, 97, 98,108, +101, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,115,101,110, +100, 95,109,117,108,116,105,112, 97,114,116, 40,109,101,115,103,116, 41, 10, 32, + 32, 32, 32, 45, 45, 32,109, 97,107,101, 32,115,117,114,101, 32,119,101, 32,104, + 97,118,101, 32,111,117,114, 32, 98,111,117,110,100, 97,114,121, 32, 97,110,100, + 32,115,101,110,100, 32,104,101, 97,100,101,114,115, 10, 32, 32, 32, 32,108,111, + 99, 97,108, 32, 98,100, 32, 61, 32,110,101,119, 98,111,117,110,100, 97,114,121, + 40, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,104,101, 97,100,101,114,115, + 32, 61, 32,108,111,119,101,114, 95,104,101, 97,100,101,114,115, 40,109,101,115, +103,116, 46,104,101, 97,100,101,114,115, 32,111,114, 32,123,125, 41, 10, 32, 32, + 32, 32,104,101, 97,100,101,114,115, 91, 39, 99,111,110,116,101,110,116, 45,116, +121,112,101, 39, 93, 32, 61, 32,104,101, 97,100,101,114,115, 91, 39, 99,111,110, +116,101,110,116, 45,116,121,112,101, 39, 93, 32,111,114, 32, 39,109,117,108,116, +105,112, 97,114,116, 47,109,105,120,101,100, 39, 10, 32, 32, 32, 32,104,101, 97, +100,101,114,115, 91, 39, 99,111,110,116,101,110,116, 45,116,121,112,101, 39, 93, + 32, 61, 32,104,101, 97,100,101,114,115, 91, 39, 99,111,110,116,101,110,116, 45, +116,121,112,101, 39, 93, 32, 46, 46, 10, 32, 32, 32, 32, 32, 32, 32, 32, 39, 59, + 32, 98,111,117,110,100, 97,114,121, 61, 34, 39, 32, 46, 46, 32, 32, 98,100, 32, + 46, 46, 32, 39, 34, 39, 10, 32, 32, 32, 32,115,101,110,100, 95,104,101, 97,100, +101,114,115, 40,104,101, 97,100,101,114,115, 41, 10, 32, 32, 32, 32, 45, 45, 32, +115,101,110,100, 32,112,114,101, 97,109, 98,108,101, 10, 32, 32, 32, 32,105,102, + 32,109,101,115,103,116, 46, 98,111,100,121, 46,112,114,101, 97,109, 98,108,101, + 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99,111,114,111,117,116, +105,110,101, 46,121,105,101,108,100, 40,109,101,115,103,116, 46, 98,111,100,121, + 46,112,114,101, 97,109, 98,108,101, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, +111,114,111,117,116,105,110,101, 46,121,105,101,108,100, 40, 34, 92,114, 92,110, + 34, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 45, 45, 32,115,101, +110,100, 32,101, 97, 99,104, 32,112, 97,114,116, 32,115,101,112, 97,114, 97,116, +101,100, 32, 98,121, 32, 97, 32, 98,111,117,110,100, 97,114,121, 10, 32, 32, 32, + 32,102,111,114, 32,105, 44, 32,109, 32,105,110, 32, 98, 97,115,101, 46,105,112, + 97,105,114,115, 40,109,101,115,103,116, 46, 98,111,100,121, 41, 32,100,111, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 99,111,114,111,117,116,105,110,101, 46,121,105, +101,108,100, 40, 34, 92,114, 92,110, 45, 45, 34, 32, 46, 46, 32, 98,100, 32, 46, + 46, 32, 34, 92,114, 92,110, 34, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,115,101, +110,100, 95,109,101,115,115, 97,103,101, 40,109, 41, 10, 32, 32, 32, 32,101,110, +100, 10, 32, 32, 32, 32, 45, 45, 32,115,101,110,100, 32,108, 97,115,116, 32, 98, +111,117,110,100, 97,114,121, 10, 32, 32, 32, 32, 99,111,114,111,117,116,105,110, +101, 46,121,105,101,108,100, 40, 34, 92,114, 92,110, 45, 45, 34, 32, 46, 46, 32, + 98,100, 32, 46, 46, 32, 34, 45, 45, 92,114, 92,110, 92,114, 92,110, 34, 41, 10, + 32, 32, 32, 32, 45, 45, 32,115,101,110,100, 32,101,112,105,108,111,103,117,101, + 10, 32, 32, 32, 32,105,102, 32,109,101,115,103,116, 46, 98,111,100,121, 46,101, +112,105,108,111,103,117,101, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 99,111,114,111,117,116,105,110,101, 46,121,105,101,108,100, 40,109,101,115, +103,116, 46, 98,111,100,121, 46,101,112,105,108,111,103,117,101, 41, 10, 32, 32, + 32, 32, 32, 32, 32, 32, 99,111,114,111,117,116,105,110,101, 46,121,105,101,108, +100, 40, 34, 92,114, 92,110, 34, 41, 10, 32, 32, 32, 32,101,110,100, 10,101,110, +100, 10, 10, 45, 45, 32,121,105,101,108,100, 32,109,101,115,115, 97,103,101, 32, + 98,111,100,121, 32,102,114,111,109, 32, 97, 32,115,111,117,114, 99,101, 10,108, +111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,115,101,110,100, 95,115, +111,117,114, 99,101, 40,109,101,115,103,116, 41, 10, 32, 32, 32, 32, 45, 45, 32, +109, 97,107,101, 32,115,117,114,101, 32,119,101, 32,104, 97,118,101, 32, 97, 32, + 99,111,110,116,101,110,116, 45,116,121,112,101, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,104,101, 97,100,101,114,115, 32, 61, 32,108,111,119,101,114, 95,104, +101, 97,100,101,114,115, 40,109,101,115,103,116, 46,104,101, 97,100,101,114,115, + 32,111,114, 32,123,125, 41, 10, 32, 32, 32, 32,104,101, 97,100,101,114,115, 91, + 39, 99,111,110,116,101,110,116, 45,116,121,112,101, 39, 93, 32, 61, 32,104,101, + 97,100,101,114,115, 91, 39, 99,111,110,116,101,110,116, 45,116,121,112,101, 39, + 93, 32,111,114, 10, 32, 32, 32, 32, 32, 32, 32, 32, 39,116,101,120,116, 47,112, +108, 97,105,110, 59, 32, 99,104, 97,114,115,101,116, 61, 34,105,115,111, 45, 56, + 56, 53, 57, 45, 49, 34, 39, 10, 32, 32, 32, 32,115,101,110,100, 95,104,101, 97, +100,101,114,115, 40,104,101, 97,100,101,114,115, 41, 10, 32, 32, 32, 32, 45, 45, + 32,115,101,110,100, 32, 98,111,100,121, 32,102,114,111,109, 32,115,111,117,114, + 99,101, 10, 32, 32, 32, 32,119,104,105,108,101, 32,116,114,117,101, 32,100,111, + 10, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,104,117,110,107, + 44, 32,101,114,114, 32, 61, 32,109,101,115,103,116, 46, 98,111,100,121, 40, 41, + 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,101,114,114, 32,116,104,101,110, + 32, 99,111,114,111,117,116,105,110,101, 46,121,105,101,108,100, 40,110,105,108, + 44, 32,101,114,114, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101,105, +102, 32, 99,104,117,110,107, 32,116,104,101,110, 32, 99,111,114,111,117,116,105, +110,101, 46,121,105,101,108,100, 40, 99,104,117,110,107, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32,101,108,115,101, 32, 98,114,101, 97,107, 32,101,110,100, 10, 32, + 32, 32, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 32,121,105,101,108,100, + 32,109,101,115,115, 97,103,101, 32, 98,111,100,121, 32,102,114,111,109, 32, 97, + 32,115,116,114,105,110,103, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105, +111,110, 32,115,101,110,100, 95,115,116,114,105,110,103, 40,109,101,115,103,116, + 41, 10, 32, 32, 32, 32, 45, 45, 32,109, 97,107,101, 32,115,117,114,101, 32,119, +101, 32,104, 97,118,101, 32, 97, 32, 99,111,110,116,101,110,116, 45,116,121,112, +101, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,104,101, 97,100,101,114,115, 32, + 61, 32,108,111,119,101,114, 95,104,101, 97,100,101,114,115, 40,109,101,115,103, +116, 46,104,101, 97,100,101,114,115, 32,111,114, 32,123,125, 41, 10, 32, 32, 32, + 32,104,101, 97,100,101,114,115, 91, 39, 99,111,110,116,101,110,116, 45,116,121, +112,101, 39, 93, 32, 61, 32,104,101, 97,100,101,114,115, 91, 39, 99,111,110,116, +101,110,116, 45,116,121,112,101, 39, 93, 32,111,114, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 39,116,101,120,116, 47,112,108, 97,105,110, 59, 32, 99,104, 97,114,115, +101,116, 61, 34,105,115,111, 45, 56, 56, 53, 57, 45, 49, 34, 39, 10, 32, 32, 32, + 32,115,101,110,100, 95,104,101, 97,100,101,114,115, 40,104,101, 97,100,101,114, +115, 41, 10, 32, 32, 32, 32, 45, 45, 32,115,101,110,100, 32, 98,111,100,121, 32, +102,114,111,109, 32,115,116,114,105,110,103, 10, 32, 32, 32, 32, 99,111,114,111, +117,116,105,110,101, 46,121,105,101,108,100, 40,109,101,115,103,116, 46, 98,111, +100,121, 41, 10,101,110,100, 10, 10, 45, 45, 32,109,101,115,115, 97,103,101, 32, +115,111,117,114, 99,101, 10,102,117,110, 99,116,105,111,110, 32,115,101,110,100, + 95,109,101,115,115, 97,103,101, 40,109,101,115,103,116, 41, 10, 32, 32, 32, 32, +105,102, 32, 98, 97,115,101, 46,116,121,112,101, 40,109,101,115,103,116, 46, 98, +111,100,121, 41, 32, 61, 61, 32, 34,116, 97, 98,108,101, 34, 32,116,104,101,110, + 32,115,101,110,100, 95,109,117,108,116,105,112, 97,114,116, 40,109,101,115,103, +116, 41, 10, 32, 32, 32, 32,101,108,115,101,105,102, 32, 98, 97,115,101, 46,116, +121,112,101, 40,109,101,115,103,116, 46, 98,111,100,121, 41, 32, 61, 61, 32, 34, +102,117,110, 99,116,105,111,110, 34, 32,116,104,101,110, 32,115,101,110,100, 95, +115,111,117,114, 99,101, 40,109,101,115,103,116, 41, 10, 32, 32, 32, 32,101,108, +115,101, 32,115,101,110,100, 95,115,116,114,105,110,103, 40,109,101,115,103,116, + 41, 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 32,115,101,116, 32,100,101, +102, 97,117,108, 32,104,101, 97,100,101,114,115, 10,108,111, 99, 97,108, 32,102, +117,110, 99,116,105,111,110, 32, 97,100,106,117,115,116, 95,104,101, 97,100,101, +114,115, 40,109,101,115,103,116, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, +108,111,119,101,114, 32, 61, 32,108,111,119,101,114, 95,104,101, 97,100,101,114, +115, 40,109,101,115,103,116, 46,104,101, 97,100,101,114,115, 41, 10, 32, 32, 32, + 32,108,111,119,101,114, 91, 34,100, 97,116,101, 34, 93, 32, 61, 32,108,111,119, +101,114, 91, 34,100, 97,116,101, 34, 93, 32,111,114, 10, 32, 32, 32, 32, 32, 32, + 32, 32,111,115, 46,100, 97,116,101, 40, 34, 33, 37, 97, 44, 32, 37,100, 32, 37, + 98, 32, 37, 89, 32, 37, 72, 58, 37, 77, 58, 37, 83, 32, 34, 41, 32, 46, 46, 32, + 40,109,101,115,103,116, 46,122,111,110,101, 32,111,114, 32, 90, 79, 78, 69, 41, + 10, 32, 32, 32, 32,108,111,119,101,114, 91, 34,120, 45,109, 97,105,108,101,114, + 34, 93, 32, 61, 32,108,111,119,101,114, 91, 34,120, 45,109, 97,105,108,101,114, + 34, 93, 32,111,114, 32,115,111, 99,107,101,116, 46, 95, 86, 69, 82, 83, 73, 79, + 78, 10, 32, 32, 32, 32, 45, 45, 32,116,104,105,115, 32, 99, 97,110, 39,116, 32, + 98,101, 32,111,118,101,114,114,105,100,101,110, 10, 32, 32, 32, 32,108,111,119, +101,114, 91, 34,109,105,109,101, 45,118,101,114,115,105,111,110, 34, 93, 32, 61, + 32, 34, 49, 46, 48, 34, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,108,111, +119,101,114, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101, +115,115, 97,103,101, 40,109,101,115,103,116, 41, 10, 32, 32, 32, 32,109,101,115, +103,116, 46,104,101, 97,100,101,114,115, 32, 61, 32, 97,100,106,117,115,116, 95, +104,101, 97,100,101,114,115, 40,109,101,115,103,116, 41, 10, 32, 32, 32, 32, 45, + 45, 32, 99,114,101, 97,116,101, 32, 97,110,100, 32,114,101,116,117,114,110, 32, +109,101,115,115, 97,103,101, 32,115,111,117,114, 99,101, 10, 32, 32, 32, 32,108, +111, 99, 97,108, 32, 99,111, 32, 61, 32, 99,111,114,111,117,116,105,110,101, 46, + 99,114,101, 97,116,101, 40,102,117,110, 99,116,105,111,110, 40, 41, 32,115,101, +110,100, 95,109,101,115,115, 97,103,101, 40,109,101,115,103,116, 41, 32,101,110, +100, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116,105, +111,110, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32,114, +101,116, 44, 32, 97, 44, 32, 98, 32, 61, 32, 99,111,114,111,117,116,105,110,101, + 46,114,101,115,117,109,101, 40, 99,111, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, +105,102, 32,114,101,116, 32,116,104,101,110, 32,114,101,116,117,114,110, 32, 97, + 44, 32, 98, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 32,114,101,116, +117,114,110, 32,110,105,108, 44, 32, 97, 32,101,110,100, 10, 32, 32, 32, 32,101, +110,100, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 10, 45, 45, 32, 72,105,103,104, 32,108,101,118,101,108, 32, 83, 77, + 84, 80, 32, 65, 80, 73, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 10,115,101,110,100, 32, 61, 32,115,111, 99,107,101,116, 46,112, +114,111,116,101, 99,116, 40,102,117,110, 99,116,105,111,110, 40,109, 97,105,108, +116, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,115, 32, 61, 32,111,112,101, +110, 40,109, 97,105,108,116, 46,115,101,114,118,101,114, 44, 32,109, 97,105,108, +116, 46,112,111,114,116, 44, 32,109, 97,105,108,116, 46, 99,114,101, 97,116,101, + 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,101,120,116, 32, 61, 32,115, 58, +103,114,101,101,116, 40,109, 97,105,108,116, 46,100,111,109, 97,105,110, 41, 10, + 32, 32, 32, 32,115, 58, 97,117,116,104, 40,109, 97,105,108,116, 46,117,115,101, +114, 44, 32,109, 97,105,108,116, 46,112, 97,115,115,119,111,114,100, 44, 32,101, +120,116, 41, 10, 32, 32, 32, 32,115, 58,115,101,110,100, 40,109, 97,105,108,116, + 41, 10, 32, 32, 32, 32,115, 58,113,117,105,116, 40, 41, 10, 32, 32, 32, 32,114, +101,116,117,114,110, 32,115, 58, 99,108,111,115,101, 40, 41, 10,101,110,100, 41, + 10, +}; + + if (luaL_loadbuffer(L,(const char*)B1,sizeof(B1),"smtp.lua")==0) lua_call(L, 0, 0); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/socket.h b/jni/love/src/libraries/luasocket/libluasocket/socket.h new file mode 100644 index 00000000..656c7f5d --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/socket.h @@ -0,0 +1,76 @@ +#ifndef SOCKET_H +#define SOCKET_H +/*=========================================================================*\ +* Socket compatibilization module +* LuaSocket toolkit +* +* BSD Sockets and WinSock are similar, but there are a few irritating +* differences. Also, not all *nix platforms behave the same. This module +* (and the associated usocket.h and wsocket.h) factor these differences and +* creates a interface compatible with the io.h module. +* +* RCS ID: $Id: socket.h,v 1.20 2005/11/20 07:20:23 diego Exp $ +\*=========================================================================*/ +#include "io.h" + +/*=========================================================================*\ +* Platform specific compatibilization +\*=========================================================================*/ +#ifdef _WIN32 +#include "wsocket.h" +#else +#include "usocket.h" +#endif + +/*=========================================================================*\ +* The connect and accept functions accept a timeout and their +* implementations are somewhat complicated. We chose to move +* the timeout control into this module for these functions in +* order to simplify the modules that use them. +\*=========================================================================*/ +#include "timeout.h" + +/* we are lazy... */ +typedef struct sockaddr SA; + +/*=========================================================================*\ +* Functions bellow implement a comfortable platform independent +* interface to sockets +\*=========================================================================*/ +int socket_open(void); +int socket_close(void); +void socket_destroy(p_socket ps); +void socket_shutdown(p_socket ps, int how); +int socket_sendto(p_socket ps, const char *data, size_t count, + size_t *sent, SA *addr, socklen_t addr_len, p_timeout tm); +int socket_recvfrom(p_socket ps, char *data, size_t count, + size_t *got, SA *addr, socklen_t *addr_len, p_timeout tm); + +void socket_setnonblocking(p_socket ps); +void socket_setblocking(p_socket ps); + +int socket_waitfd(p_socket ps, int sw, p_timeout tm); +int socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_set *efds, + p_timeout tm); + +int socket_connect(p_socket ps, SA *addr, socklen_t addr_len, p_timeout tm); +int socket_create(p_socket ps, int domain, int type, int protocol); +int socket_bind(p_socket ps, SA *addr, socklen_t addr_len); +int socket_listen(p_socket ps, int backlog); +int socket_accept(p_socket ps, p_socket pa, SA *addr, + socklen_t *addr_len, p_timeout tm); + +const char *socket_hoststrerror(int err); +const char *socket_strerror(int err); + +/* these are perfect to use with the io abstraction module + and the buffered input module */ +int socket_send(p_socket ps, const char *data, size_t count, + size_t *sent, p_timeout tm); +int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm); +const char *socket_ioerror(p_socket ps, int err); + +int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp); +int socket_gethostbyname(const char *addr, struct hostent **hp); + +#endif /* SOCKET_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/socket.lua b/jni/love/src/libraries/luasocket/libluasocket/socket.lua new file mode 100644 index 00000000..211adcd1 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/socket.lua @@ -0,0 +1,133 @@ +----------------------------------------------------------------------------- +-- LuaSocket helper module +-- Author: Diego Nehab +-- RCS ID: $Id: socket.lua,v 1.22 2005/11/22 08:33:29 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local string = require("string") +local math = require("math") +local socket = require("socket.core") +module("socket") + +----------------------------------------------------------------------------- +-- Exported auxiliar functions +----------------------------------------------------------------------------- +function connect(address, port, laddress, lport) + local sock, err = socket.tcp() + if not sock then return nil, err end + if laddress then + local res, err = sock:bind(laddress, lport, -1) + if not res then return nil, err end + end + local res, err = sock:connect(address, port) + if not res then return nil, err end + return sock +end + +function bind(host, port, backlog) + local sock, err = socket.tcp() + if not sock then return nil, err end + sock:setoption("reuseaddr", true) + local res, err = sock:bind(host, port) + if not res then return nil, err end + res, err = sock:listen(backlog) + if not res then return nil, err end + return sock +end + +try = newtry() + +function choose(table) + return function(name, opt1, opt2) + if base.type(name) ~= "string" then + name, opt1, opt2 = "default", name, opt1 + end + local f = table[name or "nil"] + if not f then base.error("unknown key (".. base.tostring(name) ..")", 3) + else return f(opt1, opt2) end + end +end + +----------------------------------------------------------------------------- +-- Socket sources and sinks, conforming to LTN12 +----------------------------------------------------------------------------- +-- create namespaces inside LuaSocket namespace +sourcet = {} +sinkt = {} + +BLOCKSIZE = 2048 + +sinkt["close-when-done"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if not chunk then + sock:close() + return 1 + else return sock:send(chunk) end + end + }) +end + +sinkt["keep-open"] = function(sock) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function(self, chunk, err) + if chunk then return sock:send(chunk) + else return 1 end + end + }) +end + +sinkt["default"] = sinkt["keep-open"] + +sink = choose(sinkt) + +sourcet["by-length"] = function(sock, length) + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + if length <= 0 then return nil end + local size = math.min(socket.BLOCKSIZE, length) + local chunk, err = sock:receive(size) + if err then return nil, err end + length = length - string.len(chunk) + return chunk + end + }) +end + +sourcet["until-closed"] = function(sock) + local done + return base.setmetatable({ + getfd = function() return sock:getfd() end, + dirty = function() return sock:dirty() end + }, { + __call = function() + if done then return nil end + local chunk, err, partial = sock:receive(socket.BLOCKSIZE) + if not err then return chunk + elseif err == "closed" then + sock:close() + done = 1 + return partial + else return nil, err end + end + }) +end + + +sourcet["default"] = sourcet["until-closed"] + +source = choose(sourcet) + diff --git a/jni/love/src/libraries/luasocket/libluasocket/socket.lua.h b/jni/love/src/libraries/luasocket/libluasocket/socket.lua.h new file mode 100644 index 00000000..6dcaad05 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/socket.lua.h @@ -0,0 +1,215 @@ +/* code automatically generated by bin2c -- DO NOT EDIT */ +{ +/* #include'ing this file in a C program is equivalent to calling + if (luaL_loadfile(L,"socket.lua")==0) lua_call(L, 0, 0); +*/ +/* socket.lua */ +static const unsigned char B1[]={ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 76,117, 97, 83,111, 99,107,101,116, 32,104,101,108,112,101,114, 32,109,111, +100,117,108,101, 10, 45, 45, 32, 65,117,116,104,111,114, 58, 32, 68,105,101,103, +111, 32, 78,101,104, 97, 98, 10, 45, 45, 32, 82, 67, 83, 32, 73, 68, 58, 32, 36, + 73,100, 58, 32,115,111, 99,107,101,116, 46,108,117, 97, 44,118, 32, 49, 46, 50, + 50, 32, 50, 48, 48, 53, 47, 49, 49, 47, 50, 50, 32, 48, 56, 58, 51, 51, 58, 50, + 57, 32,100,105,101,103,111, 32, 69,120,112, 32, 36, 10, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 10, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 68,101, 99,108, 97,114, +101, 32,109,111,100,117,108,101, 32, 97,110,100, 32,105,109,112,111,114,116, 32, +100,101,112,101,110,100,101,110, 99,105,101,115, 10, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32, 98, 97,115, +101, 32, 61, 32, 95, 71, 10,108,111, 99, 97,108, 32,115,116,114,105,110,103, 32, + 61, 32,114,101,113,117,105,114,101, 40, 34,115,116,114,105,110,103, 34, 41, 10, +108,111, 99, 97,108, 32,109, 97,116,104, 32, 61, 32,114,101,113,117,105,114,101, + 40, 34,109, 97,116,104, 34, 41, 10,108,111, 99, 97,108, 32,115,111, 99,107,101, +116, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,115,111, 99,107,101,116, 46, + 99,111,114,101, 34, 41, 10,109,111,100,117,108,101, 40, 34,115,111, 99,107,101, +116, 34, 41, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 10, 45, 45, 32, 69,120,112,111,114,116,101,100, 32, 97,117,120,105,108, +105, 97,114, 32,102,117,110, 99,116,105,111,110,115, 10, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,102,117,110, 99,116,105,111,110, + 32, 99,111,110,110,101, 99,116, 40, 97,100,100,114,101,115,115, 44, 32,112,111, +114,116, 44, 32,108, 97,100,100,114,101,115,115, 44, 32,108,112,111,114,116, 41, + 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,115,111, 99,107, 44, 32,101,114,114, + 32, 61, 32,115,111, 99,107,101,116, 46,116, 99,112, 40, 41, 10, 32, 32, 32, 32, +105,102, 32,110,111,116, 32,115,111, 99,107, 32,116,104,101,110, 32,114,101,116, +117,114,110, 32,110,105,108, 44, 32,101,114,114, 32,101,110,100, 10, 32, 32, 32, + 32,105,102, 32,108, 97,100,100,114,101,115,115, 32,116,104,101,110, 10, 32, 32, + 32, 32, 32, 32, 32, 32,108,111, 99, 97,108, 32,114,101,115, 44, 32,101,114,114, + 32, 61, 32,115,111, 99,107, 58, 98,105,110,100, 40,108, 97,100,100,114,101,115, +115, 44, 32,108,112,111,114,116, 44, 32, 45, 49, 41, 10, 32, 32, 32, 32, 32, 32, + 32, 32,105,102, 32,110,111,116, 32,114,101,115, 32,116,104,101,110, 32,114,101, +116,117,114,110, 32,110,105,108, 44, 32,101,114,114, 32,101,110,100, 10, 32, 32, + 32, 32,101,110,100, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,114,101,115, 44, + 32,101,114,114, 32, 61, 32,115,111, 99,107, 58, 99,111,110,110,101, 99,116, 40, + 97,100,100,114,101,115,115, 44, 32,112,111,114,116, 41, 10, 32, 32, 32, 32,105, +102, 32,110,111,116, 32,114,101,115, 32,116,104,101,110, 32,114,101,116,117,114, +110, 32,110,105,108, 44, 32,101,114,114, 32,101,110,100, 10, 32, 32, 32, 32,114, +101,116,117,114,110, 32,115,111, 99,107, 10,101,110,100, 10, 10,102,117,110, 99, +116,105,111,110, 32, 98,105,110,100, 40,104,111,115,116, 44, 32,112,111,114,116, + 44, 32, 98, 97, 99,107,108,111,103, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, + 32,115,111, 99,107, 44, 32,101,114,114, 32, 61, 32,115,111, 99,107,101,116, 46, +116, 99,112, 40, 41, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32,115,111, 99, +107, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101, +114,114, 32,101,110,100, 10, 32, 32, 32, 32,115,111, 99,107, 58,115,101,116,111, +112,116,105,111,110, 40, 34,114,101,117,115,101, 97,100,100,114, 34, 44, 32,116, +114,117,101, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,114,101,115, 44, 32, +101,114,114, 32, 61, 32,115,111, 99,107, 58, 98,105,110,100, 40,104,111,115,116, + 44, 32,112,111,114,116, 41, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32,114, +101,115, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32, +101,114,114, 32,101,110,100, 10, 32, 32, 32, 32,114,101,115, 44, 32,101,114,114, + 32, 61, 32,115,111, 99,107, 58,108,105,115,116,101,110, 40, 98, 97, 99,107,108, +111,103, 41, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32,114,101,115, 32,116, +104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114,114, 32, +101,110,100, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,111, 99,107, 10, +101,110,100, 10, 10,116,114,121, 32, 61, 32,110,101,119,116,114,121, 40, 41, 10, + 10,102,117,110, 99,116,105,111,110, 32, 99,104,111,111,115,101, 40,116, 97, 98, +108,101, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,102,117,110, 99,116, +105,111,110, 40,110, 97,109,101, 44, 32,111,112,116, 49, 44, 32,111,112,116, 50, + 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, 98, 97,115,101, 46,116,121, +112,101, 40,110, 97,109,101, 41, 32,126, 61, 32, 34,115,116,114,105,110,103, 34, + 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,110, 97, +109,101, 44, 32,111,112,116, 49, 44, 32,111,112,116, 50, 32, 61, 32, 34,100,101, +102, 97,117,108,116, 34, 44, 32,110, 97,109,101, 44, 32,111,112,116, 49, 10, 32, + 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,108, +111, 99, 97,108, 32,102, 32, 61, 32,116, 97, 98,108,101, 91,110, 97,109,101, 32, +111,114, 32, 34,110,105,108, 34, 93, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, + 32,110,111,116, 32,102, 32,116,104,101,110, 32, 98, 97,115,101, 46,101,114,114, +111,114, 40, 34,117,110,107,110,111,119,110, 32,107,101,121, 32, 40, 34, 46, 46, + 32, 98, 97,115,101, 46,116,111,115,116,114,105,110,103, 40,110, 97,109,101, 41, + 32, 46, 46, 34, 41, 34, 44, 32, 51, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,101, +108,115,101, 32,114,101,116,117,114,110, 32,102, 40,111,112,116, 49, 44, 32,111, +112,116, 50, 41, 32,101,110,100, 10, 32, 32, 32, 32,101,110,100, 10,101,110,100, + 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, + 45, 45, 32, 83,111, 99,107,101,116, 32,115,111,117,114, 99,101,115, 32, 97,110, +100, 32,115,105,110,107,115, 44, 32, 99,111,110,102,111,114,109,105,110,103, 32, +116,111, 32, 76, 84, 78, 49, 50, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 99,114,101, 97,116,101, 32,110, 97,109, +101,115,112, 97, 99,101,115, 32,105,110,115,105,100,101, 32, 76,117, 97, 83,111, + 99,107,101,116, 32,110, 97,109,101,115,112, 97, 99,101, 10,115,111,117,114, 99, +101,116, 32, 61, 32,123,125, 10,115,105,110,107,116, 32, 61, 32,123,125, 10, 10, + 66, 76, 79, 67, 75, 83, 73, 90, 69, 32, 61, 32, 50, 48, 52, 56, 10, 10,115,105, +110,107,116, 91, 34, 99,108,111,115,101, 45,119,104,101,110, 45,100,111,110,101, + 34, 93, 32, 61, 32,102,117,110, 99,116,105,111,110, 40,115,111, 99,107, 41, 10, + 32, 32, 32, 32,114,101,116,117,114,110, 32, 98, 97,115,101, 46,115,101,116,109, +101,116, 97,116, 97, 98,108,101, 40,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,103, +101,116,102,100, 32, 61, 32,102,117,110, 99,116,105,111,110, 40, 41, 32,114,101, +116,117,114,110, 32,115,111, 99,107, 58,103,101,116,102,100, 40, 41, 32,101,110, +100, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32,100,105,114,116,121, 32, 61, 32,102, +117,110, 99,116,105,111,110, 40, 41, 32,114,101,116,117,114,110, 32,115,111, 99, +107, 58,100,105,114,116,121, 40, 41, 32,101,110,100, 10, 32, 32, 32, 32,125, 44, + 32,123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 95, 95, 99, 97,108,108, 32, 61, 32, +102,117,110, 99,116,105,111,110, 40,115,101,108,102, 44, 32, 99,104,117,110,107, + 44, 32,101,114,114, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105, +102, 32,110,111,116, 32, 99,104,117,110,107, 32,116,104,101,110, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115,111, 99,107, 58, 99,108, +111,115,101, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,114,101,116,117,114,110, 32, 49, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,101,108,115,101, 32,114,101,116,117,114,110, 32,115,111, 99,107, 58, +115,101,110,100, 40, 99,104,117,110,107, 41, 32,101,110,100, 10, 32, 32, 32, 32, + 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,125, 41, 10,101,110,100, 10, 10, +115,105,110,107,116, 91, 34,107,101,101,112, 45,111,112,101,110, 34, 93, 32, 61, + 32,102,117,110, 99,116,105,111,110, 40,115,111, 99,107, 41, 10, 32, 32, 32, 32, +114,101,116,117,114,110, 32, 98, 97,115,101, 46,115,101,116,109,101,116, 97,116, + 97, 98,108,101, 40,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,103,101,116,102,100, + 32, 61, 32,102,117,110, 99,116,105,111,110, 40, 41, 32,114,101,116,117,114,110, + 32,115,111, 99,107, 58,103,101,116,102,100, 40, 41, 32,101,110,100, 44, 10, 32, + 32, 32, 32, 32, 32, 32, 32,100,105,114,116,121, 32, 61, 32,102,117,110, 99,116, +105,111,110, 40, 41, 32,114,101,116,117,114,110, 32,115,111, 99,107, 58,100,105, +114,116,121, 40, 41, 32,101,110,100, 10, 32, 32, 32, 32,125, 44, 32,123, 10, 32, + 32, 32, 32, 32, 32, 32, 32, 95, 95, 99, 97,108,108, 32, 61, 32,102,117,110, 99, +116,105,111,110, 40,115,101,108,102, 44, 32, 99,104,117,110,107, 44, 32,101,114, +114, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, 99,104, +117,110,107, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,115,111, 99,107, + 58,115,101,110,100, 40, 99,104,117,110,107, 41, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,101,108,115,101, 32,114,101,116,117,114,110, 32, 49, 32,101, +110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,125, + 41, 10,101,110,100, 10, 10,115,105,110,107,116, 91, 34,100,101,102, 97,117,108, +116, 34, 93, 32, 61, 32,115,105,110,107,116, 91, 34,107,101,101,112, 45,111,112, +101,110, 34, 93, 10, 10,115,105,110,107, 32, 61, 32, 99,104,111,111,115,101, 40, +115,105,110,107,116, 41, 10, 10,115,111,117,114, 99,101,116, 91, 34, 98,121, 45, +108,101,110,103,116,104, 34, 93, 32, 61, 32,102,117,110, 99,116,105,111,110, 40, +115,111, 99,107, 44, 32,108,101,110,103,116,104, 41, 10, 32, 32, 32, 32,114,101, +116,117,114,110, 32, 98, 97,115,101, 46,115,101,116,109,101,116, 97,116, 97, 98, +108,101, 40,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,103,101,116,102,100, 32, 61, + 32,102,117,110, 99,116,105,111,110, 40, 41, 32,114,101,116,117,114,110, 32,115, +111, 99,107, 58,103,101,116,102,100, 40, 41, 32,101,110,100, 44, 10, 32, 32, 32, + 32, 32, 32, 32, 32,100,105,114,116,121, 32, 61, 32,102,117,110, 99,116,105,111, +110, 40, 41, 32,114,101,116,117,114,110, 32,115,111, 99,107, 58,100,105,114,116, +121, 40, 41, 32,101,110,100, 10, 32, 32, 32, 32,125, 44, 32,123, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 95, 95, 99, 97,108,108, 32, 61, 32,102,117,110, 99,116,105, +111,110, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, +108,101,110,103,116,104, 32, 60, 61, 32, 48, 32,116,104,101,110, 32,114,101,116, +117,114,110, 32,110,105,108, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32,108,111, 99, 97,108, 32,115,105,122,101, 32, 61, 32,109, 97,116, +104, 46,109,105,110, 40,115,111, 99,107,101,116, 46, 66, 76, 79, 67, 75, 83, 73, + 90, 69, 44, 32,108,101,110,103,116,104, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,104,117,110,107, 44, 32,101,114,114, + 32, 61, 32,115,111, 99,107, 58,114,101, 99,101,105,118,101, 40,115,105,122,101, + 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,101,114,114, + 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114, +114, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,108,101, +110,103,116,104, 32, 61, 32,108,101,110,103,116,104, 32, 45, 32,115,116,114,105, +110,103, 46,108,101,110, 40, 99,104,117,110,107, 41, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32, 99,104,117,110,107, 10, 32, + 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,125, 41, 10,101,110, +100, 10, 10,115,111,117,114, 99,101,116, 91, 34,117,110,116,105,108, 45, 99,108, +111,115,101,100, 34, 93, 32, 61, 32,102,117,110, 99,116,105,111,110, 40,115,111, + 99,107, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,100,111,110,101, 10, 32, + 32, 32, 32,114,101,116,117,114,110, 32, 98, 97,115,101, 46,115,101,116,109,101, +116, 97,116, 97, 98,108,101, 40,123, 10, 32, 32, 32, 32, 32, 32, 32, 32,103,101, +116,102,100, 32, 61, 32,102,117,110, 99,116,105,111,110, 40, 41, 32,114,101,116, +117,114,110, 32,115,111, 99,107, 58,103,101,116,102,100, 40, 41, 32,101,110,100, + 44, 10, 32, 32, 32, 32, 32, 32, 32, 32,100,105,114,116,121, 32, 61, 32,102,117, +110, 99,116,105,111,110, 40, 41, 32,114,101,116,117,114,110, 32,115,111, 99,107, + 58,100,105,114,116,121, 40, 41, 32,101,110,100, 10, 32, 32, 32, 32,125, 44, 32, +123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 95, 95, 99, 97,108,108, 32, 61, 32,102, +117,110, 99,116,105,111,110, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,105,102, 32,100,111,110,101, 32,116,104,101,110, 32,114,101,116,117,114, +110, 32,110,105,108, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,108,111, 99, 97,108, 32, 99,104,117,110,107, 44, 32,101,114,114, 44, 32, +112, 97,114,116,105, 97,108, 32, 61, 32,115,111, 99,107, 58,114,101, 99,101,105, +118,101, 40,115,111, 99,107,101,116, 46, 66, 76, 79, 67, 75, 83, 73, 90, 69, 41, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32, +101,114,114, 32,116,104,101,110, 32,114,101,116,117,114,110, 32, 99,104,117,110, +107, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101,105,102, + 32,101,114,114, 32, 61, 61, 32, 34, 99,108,111,115,101,100, 34, 32,116,104,101, +110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,115,111, + 99,107, 58, 99,108,111,115,101, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,100,111,110,101, 32, 61, 32, 49, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32,112, + 97,114,116,105, 97,108, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101, +108,115,101, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101,114,114, 32, +101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, +125, 41, 10,101,110,100, 10, 10, 10,115,111,117,114, 99,101,116, 91, 34,100,101, +102, 97,117,108,116, 34, 93, 32, 61, 32,115,111,117,114, 99,101,116, 91, 34,117, +110,116,105,108, 45, 99,108,111,115,101,100, 34, 93, 10, 10,115,111,117,114, 99, +101, 32, 61, 32, 99,104,111,111,115,101, 40,115,111,117,114, 99,101,116, 41, 10, + 10, +}; + + if (luaL_loadbuffer(L,(const char*)B1,sizeof(B1),"socket.lua")==0) lua_call(L, 0, 0); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/tcp.c b/jni/love/src/libraries/luasocket/libluasocket/tcp.c new file mode 100644 index 00000000..6b8a79b4 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/tcp.c @@ -0,0 +1,339 @@ +/*=========================================================================*\ +* TCP object +* LuaSocket toolkit +* +* RCS ID: $Id: tcp.c,v 1.41 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "auxiliar.h" +#include "socket.h" +#include "inet.h" +#include "options.h" +#include "tcp.h" + +/*=========================================================================*\ +* Internal function prototypes +\*=========================================================================*/ +static int global_create(lua_State *L); +static int meth_connect(lua_State *L); +static int meth_listen(lua_State *L); +static int meth_bind(lua_State *L); +static int meth_send(lua_State *L); +static int meth_getstats(lua_State *L); +static int meth_setstats(lua_State *L); +static int meth_getsockname(lua_State *L); +static int meth_getpeername(lua_State *L); +static int meth_shutdown(lua_State *L); +static int meth_receive(lua_State *L); +static int meth_accept(lua_State *L); +static int meth_close(lua_State *L); +static int meth_setoption(lua_State *L); +static int meth_settimeout(lua_State *L); +static int meth_getfd(lua_State *L); +static int meth_setfd(lua_State *L); +static int meth_dirty(lua_State *L); + +/* tcp object methods */ +static luaL_reg tcp[] = { + {"__gc", meth_close}, + {"__tostring", auxiliar_tostring}, + {"accept", meth_accept}, + {"bind", meth_bind}, + {"close", meth_close}, + {"connect", meth_connect}, + {"dirty", meth_dirty}, + {"getfd", meth_getfd}, + {"getpeername", meth_getpeername}, + {"getsockname", meth_getsockname}, + {"getstats", meth_getstats}, + {"setstats", meth_setstats}, + {"listen", meth_listen}, + {"receive", meth_receive}, + {"send", meth_send}, + {"setfd", meth_setfd}, + {"setoption", meth_setoption}, + {"setpeername", meth_connect}, + {"setsockname", meth_bind}, + {"settimeout", meth_settimeout}, + {"shutdown", meth_shutdown}, + {NULL, NULL} +}; + +/* socket option handlers */ +static t_opt opt[] = { + {"keepalive", opt_keepalive}, + {"reuseaddr", opt_reuseaddr}, + {"tcp-nodelay", opt_tcp_nodelay}, + {"linger", opt_linger}, + {NULL, NULL} +}; + +/* functions in library namespace */ +static luaL_reg func[] = { + {"tcp", global_create}, + {NULL, NULL} +}; + +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int tcp_open(lua_State *L) +{ + /* create classes */ + auxiliar_newclass(L, "tcp{master}", tcp); + auxiliar_newclass(L, "tcp{client}", tcp); + auxiliar_newclass(L, "tcp{server}", tcp); + /* create class groups */ + auxiliar_add2group(L, "tcp{master}", "tcp{any}"); + auxiliar_add2group(L, "tcp{client}", "tcp{any}"); + auxiliar_add2group(L, "tcp{server}", "tcp{any}"); + /* define library functions */ + luaL_openlib(L, NULL, func, 0); + return 0; +} + +/*=========================================================================*\ +* Lua methods +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Just call buffered IO methods +\*-------------------------------------------------------------------------*/ +static int meth_send(lua_State *L) { + p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{client}", 1); + return buffer_meth_send(L, &tcp->buf); +} + +static int meth_receive(lua_State *L) { + p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{client}", 1); + return buffer_meth_receive(L, &tcp->buf); +} + +static int meth_getstats(lua_State *L) { + p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{client}", 1); + return buffer_meth_getstats(L, &tcp->buf); +} + +static int meth_setstats(lua_State *L) { + p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{client}", 1); + return buffer_meth_setstats(L, &tcp->buf); +} + +/*-------------------------------------------------------------------------*\ +* Just call option handler +\*-------------------------------------------------------------------------*/ +static int meth_setoption(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + return opt_meth_setoption(L, opt, &tcp->sock); +} + +/*-------------------------------------------------------------------------*\ +* Select support methods +\*-------------------------------------------------------------------------*/ +static int meth_getfd(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + lua_pushnumber(L, (int) tcp->sock); + return 1; +} + +/* this is very dangerous, but can be handy for those that are brave enough */ +static int meth_setfd(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + tcp->sock = (t_socket) luaL_checknumber(L, 2); + return 0; +} + +static int meth_dirty(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + lua_pushboolean(L, !buffer_isempty(&tcp->buf)); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Waits for and returns a client object attempting connection to the +* server object +\*-------------------------------------------------------------------------*/ +static int meth_accept(lua_State *L) +{ + p_tcp server = (p_tcp) auxiliar_checkclass(L, "tcp{server}", 1); + p_timeout tm = timeout_markstart(&server->tm); + t_socket sock; + int err = socket_accept(&server->sock, &sock, NULL, NULL, tm); + /* if successful, push client socket */ + if (err == IO_DONE) { + p_tcp clnt = (p_tcp) lua_newuserdata(L, sizeof(t_tcp)); + auxiliar_setclass(L, "tcp{client}", -1); + /* initialize structure fields */ + socket_setnonblocking(&sock); + clnt->sock = sock; + io_init(&clnt->io, (p_send) socket_send, (p_recv) socket_recv, + (p_error) socket_ioerror, &clnt->sock); + timeout_init(&clnt->tm, -1, -1); + buffer_init(&clnt->buf, &clnt->io, &clnt->tm); + return 1; + } else { + lua_pushnil(L); + lua_pushstring(L, socket_strerror(err)); + return 2; + } +} + +/*-------------------------------------------------------------------------*\ +* Binds an object to an address +\*-------------------------------------------------------------------------*/ +static int meth_bind(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{master}", 1); + const char *address = luaL_checkstring(L, 2); + unsigned short port = (unsigned short) luaL_checknumber(L, 3); + const char *err = inet_trybind(&tcp->sock, address, port); + if (err) { + lua_pushnil(L); + lua_pushstring(L, err); + return 2; + } + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Turns a master tcp object into a client object. +\*-------------------------------------------------------------------------*/ +static int meth_connect(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + const char *address = luaL_checkstring(L, 2); + unsigned short port = (unsigned short) luaL_checknumber(L, 3); + p_timeout tm = timeout_markstart(&tcp->tm); + const char *err = inet_tryconnect(&tcp->sock, address, port, tm); + /* have to set the class even if it failed due to non-blocking connects */ + auxiliar_setclass(L, "tcp{client}", 1); + if (err) { + lua_pushnil(L); + lua_pushstring(L, err); + return 2; + } + /* turn master object into a client object */ + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Closes socket used by object +\*-------------------------------------------------------------------------*/ +static int meth_close(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + socket_destroy(&tcp->sock); + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Puts the sockt in listen mode +\*-------------------------------------------------------------------------*/ +static int meth_listen(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{master}", 1); + int backlog = (int) luaL_optnumber(L, 2, 32); + int err = socket_listen(&tcp->sock, backlog); + if (err != IO_DONE) { + lua_pushnil(L); + lua_pushstring(L, socket_strerror(err)); + return 2; + } + /* turn master object into a server object */ + auxiliar_setclass(L, "tcp{server}", 1); + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Shuts the connection down partially +\*-------------------------------------------------------------------------*/ +static int meth_shutdown(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkclass(L, "tcp{client}", 1); + const char *how = luaL_optstring(L, 2, "both"); + switch (how[0]) { + case 'b': + if (strcmp(how, "both")) goto error; + socket_shutdown(&tcp->sock, 2); + break; + case 's': + if (strcmp(how, "send")) goto error; + socket_shutdown(&tcp->sock, 1); + break; + case 'r': + if (strcmp(how, "receive")) goto error; + socket_shutdown(&tcp->sock, 0); + break; + } + lua_pushnumber(L, 1); + return 1; +error: + luaL_argerror(L, 2, "invalid shutdown method"); + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Just call inet methods +\*-------------------------------------------------------------------------*/ +static int meth_getpeername(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + return inet_meth_getpeername(L, &tcp->sock); +} + +static int meth_getsockname(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + return inet_meth_getsockname(L, &tcp->sock); +} + +/*-------------------------------------------------------------------------*\ +* Just call tm methods +\*-------------------------------------------------------------------------*/ +static int meth_settimeout(lua_State *L) +{ + p_tcp tcp = (p_tcp) auxiliar_checkgroup(L, "tcp{any}", 1); + return timeout_meth_settimeout(L, &tcp->tm); +} + +/*=========================================================================*\ +* Library functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Creates a master tcp object +\*-------------------------------------------------------------------------*/ +static int global_create(lua_State *L) +{ + t_socket sock; + const char *err = inet_trycreate(&sock, SOCK_STREAM); + /* try to allocate a system socket */ + if (!err) { + /* allocate tcp object */ + p_tcp tcp = (p_tcp) lua_newuserdata(L, sizeof(t_tcp)); + /* set its type as master object */ + auxiliar_setclass(L, "tcp{master}", -1); + /* initialize remaining structure fields */ + socket_setnonblocking(&sock); + tcp->sock = sock; + io_init(&tcp->io, (p_send) socket_send, (p_recv) socket_recv, + (p_error) socket_ioerror, &tcp->sock); + timeout_init(&tcp->tm, -1, -1); + buffer_init(&tcp->buf, &tcp->io, &tcp->tm); + return 1; + } else { + lua_pushnil(L); + lua_pushstring(L, err); + return 2; + } +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/tcp.h b/jni/love/src/libraries/luasocket/libluasocket/tcp.h new file mode 100644 index 00000000..511357f3 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/tcp.h @@ -0,0 +1,36 @@ +#ifndef TCP_H +#define TCP_H +/*=========================================================================*\ +* TCP object +* LuaSocket toolkit +* +* The tcp.h module is basicly a glue that puts together modules buffer.h, +* timeout.h socket.h and inet.h to provide the LuaSocket TCP (AF_INET, +* SOCK_STREAM) support. +* +* Three classes are defined: master, client and server. The master class is +* a newly created tcp object, that has not been bound or connected. Server +* objects are tcp objects bound to some local address. Client objects are +* tcp objects either connected to some address or returned by the accept +* method of a server object. +* +* RCS ID: $Id: tcp.h,v 1.7 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include "lua.h" + +#include "buffer.h" +#include "timeout.h" +#include "socket.h" + +typedef struct t_tcp_ { + t_socket sock; + t_io io; + t_buffer buf; + t_timeout tm; +} t_tcp; + +typedef t_tcp *p_tcp; + +int tcp_open(lua_State *L); + +#endif /* TCP_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/timeout.c b/jni/love/src/libraries/luasocket/libluasocket/timeout.c new file mode 100644 index 00000000..c1df1021 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/timeout.c @@ -0,0 +1,207 @@ +/*=========================================================================*\ +* Timeout management functions +* LuaSocket toolkit +* +* RCS ID: $Id: timeout.c,v 1.30 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "auxiliar.h" +#include "timeout.h" + +#ifdef _WIN32 +#include +#else +#include +#include +#endif + +/* min and max macros */ +#ifndef MIN +#define MIN(x, y) ((x) < (y) ? x : y) +#endif +#ifndef MAX +#define MAX(x, y) ((x) > (y) ? x : y) +#endif + +/*=========================================================================*\ +* Internal function prototypes +\*=========================================================================*/ +static int timeout_lua_gettime(lua_State *L); +static int timeout_lua_sleep(lua_State *L); + +static luaL_reg func[] = { + { "gettime", timeout_lua_gettime }, + { "sleep", timeout_lua_sleep }, + { NULL, NULL } +}; + +/*=========================================================================*\ +* Exported functions. +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Initialize structure +\*-------------------------------------------------------------------------*/ +void timeout_init(p_timeout tm, double block, double total) { + tm->block = block; + tm->total = total; +} + +/*-------------------------------------------------------------------------*\ +* Determines how much time we have left for the next system call, +* if the previous call was successful +* Input +* tm: timeout control structure +* Returns +* the number of ms left or -1 if there is no time limit +\*-------------------------------------------------------------------------*/ +double timeout_get(p_timeout tm) { + if (tm->block < 0.0 && tm->total < 0.0) { + return -1; + } else if (tm->block < 0.0) { + double t = tm->total - timeout_gettime() + tm->start; + return MAX(t, 0.0); + } else if (tm->total < 0.0) { + return tm->block; + } else { + double t = tm->total - timeout_gettime() + tm->start; + return MIN(tm->block, MAX(t, 0.0)); + } +} + +/*-------------------------------------------------------------------------*\ +* Returns time since start of operation +* Input +* tm: timeout control structure +* Returns +* start field of structure +\*-------------------------------------------------------------------------*/ +double timeout_getstart(p_timeout tm) { + return tm->start; +} + +/*-------------------------------------------------------------------------*\ +* Determines how much time we have left for the next system call, +* if the previous call was a failure +* Input +* tm: timeout control structure +* Returns +* the number of ms left or -1 if there is no time limit +\*-------------------------------------------------------------------------*/ +double timeout_getretry(p_timeout tm) { + if (tm->block < 0.0 && tm->total < 0.0) { + return -1; + } else if (tm->block < 0.0) { + double t = tm->total - timeout_gettime() + tm->start; + return MAX(t, 0.0); + } else if (tm->total < 0.0) { + double t = tm->block - timeout_gettime() + tm->start; + return MAX(t, 0.0); + } else { + double t = tm->total - timeout_gettime() + tm->start; + return MIN(tm->block, MAX(t, 0.0)); + } +} + +/*-------------------------------------------------------------------------*\ +* Marks the operation start time in structure +* Input +* tm: timeout control structure +\*-------------------------------------------------------------------------*/ +p_timeout timeout_markstart(p_timeout tm) { + tm->start = timeout_gettime(); + return tm; +} + +/*-------------------------------------------------------------------------*\ +* Gets time in s, relative to January 1, 1970 (UTC) +* Returns +* time in s. +\*-------------------------------------------------------------------------*/ +#ifdef _WIN32 +double timeout_gettime(void) { + FILETIME ft; + double t; + GetSystemTimeAsFileTime(&ft); + /* Windows file time (time since January 1, 1601 (UTC)) */ + t = ft.dwLowDateTime/1.0e7 + ft.dwHighDateTime*(4294967296.0/1.0e7); + /* convert to Unix Epoch time (time since January 1, 1970 (UTC)) */ + return (t - 11644473600.0); +} +#else +double timeout_gettime(void) { + struct timeval v; + gettimeofday(&v, (struct timezone *) NULL); + /* Unix Epoch time (time since January 1, 1970 (UTC)) */ + return v.tv_sec + v.tv_usec/1.0e6; +} +#endif + +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int timeout_open(lua_State *L) { + luaL_openlib(L, NULL, func, 0); + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Sets timeout values for IO operations +* Lua Input: base, time [, mode] +* time: time out value in seconds +* mode: "b" for block timeout, "t" for total timeout. (default: b) +\*-------------------------------------------------------------------------*/ +int timeout_meth_settimeout(lua_State *L, p_timeout tm) { + double t = luaL_optnumber(L, 2, -1); + const char *mode = luaL_optstring(L, 3, "b"); + switch (*mode) { + case 'b': + tm->block = t; + break; + case 'r': case 't': + tm->total = t; + break; + default: + luaL_argcheck(L, 0, 3, "invalid timeout mode"); + break; + } + lua_pushnumber(L, 1); + return 1; +} + +/*=========================================================================*\ +* Test support functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Returns the time the system has been up, in secconds. +\*-------------------------------------------------------------------------*/ +static int timeout_lua_gettime(lua_State *L) +{ + lua_pushnumber(L, timeout_gettime()); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Sleep for n seconds. +\*-------------------------------------------------------------------------*/ +int timeout_lua_sleep(lua_State *L) +{ + double n = luaL_checknumber(L, 1); +#ifdef _WIN32 + Sleep((int)(n*1000)); +#else + struct timespec t, r; + t.tv_sec = (int) n; + n -= t.tv_sec; + t.tv_nsec = (int) (n * 1000000000); + if (t.tv_nsec >= 1000000000) t.tv_nsec = 999999999; + while (nanosleep(&t, &r) != 0) { + t.tv_sec = r.tv_sec; + t.tv_nsec = r.tv_nsec; + } +#endif + return 0; +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/timeout.h b/jni/love/src/libraries/luasocket/libluasocket/timeout.h new file mode 100644 index 00000000..d2d89641 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/timeout.h @@ -0,0 +1,30 @@ +#ifndef TIMEOUT_H +#define TIMEOUT_H +/*=========================================================================*\ +* Timeout management functions +* LuaSocket toolkit +* +* RCS ID: $Id: timeout.h,v 1.14 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include "lua.h" + +/* timeout control structure */ +typedef struct t_timeout_ { + double block; /* maximum time for blocking calls */ + double total; /* total number of miliseconds for operation */ + double start; /* time of start of operation */ +} t_timeout; +typedef t_timeout *p_timeout; + +int timeout_open(lua_State *L); +void timeout_init(p_timeout tm, double block, double total); +double timeout_get(p_timeout tm); +double timeout_getretry(p_timeout tm); +p_timeout timeout_markstart(p_timeout tm); +double timeout_getstart(p_timeout tm); +double timeout_gettime(void); +int timeout_meth_settimeout(lua_State *L, p_timeout tm); + +#define timeout_iszero(tm) ((tm)->block == 0.0) + +#endif /* TIMEOUT_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/tp.lua b/jni/love/src/libraries/luasocket/libluasocket/tp.lua new file mode 100644 index 00000000..06838694 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/tp.lua @@ -0,0 +1,123 @@ +----------------------------------------------------------------------------- +-- Unified SMTP/FTP subsystem +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: tp.lua,v 1.22 2006/03/14 09:04:15 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module and import dependencies +----------------------------------------------------------------------------- +local base = _G +local string = require("string") +local socket = require("socket") +local ltn12 = require("ltn12") +module("socket.tp") + +----------------------------------------------------------------------------- +-- Program constants +----------------------------------------------------------------------------- +TIMEOUT = 60 + +----------------------------------------------------------------------------- +-- Implementation +----------------------------------------------------------------------------- +-- gets server reply (works for SMTP and FTP) +local function get_reply(c) + local code, current, sep + local line, err = c:receive() + local reply = line + if err then return nil, err end + code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)")) + if not code then return nil, "invalid server reply" end + if sep == "-" then -- reply is multiline + repeat + line, err = c:receive() + if err then return nil, err end + current, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)")) + reply = reply .. "\n" .. line + -- reply ends with same code + until code == current and sep == " " + end + return code, reply +end + +-- metatable for sock object +local metat = { __index = {} } + +function metat.__index:check(ok) + local code, reply = get_reply(self.c) + if not code then return nil, reply end + if base.type(ok) ~= "function" then + if base.type(ok) == "table" then + for i, v in base.ipairs(ok) do + if string.find(code, v) then + return base.tonumber(code), reply + end + end + return nil, reply + else + if string.find(code, ok) then return base.tonumber(code), reply + else return nil, reply end + end + else return ok(base.tonumber(code), reply) end +end + +function metat.__index:command(cmd, arg) + if arg then + return self.c:send(cmd .. " " .. arg.. "\r\n") + else + return self.c:send(cmd .. "\r\n") + end +end + +function metat.__index:sink(snk, pat) + local chunk, err = c:receive(pat) + return snk(chunk, err) +end + +function metat.__index:send(data) + return self.c:send(data) +end + +function metat.__index:receive(pat) + return self.c:receive(pat) +end + +function metat.__index:getfd() + return self.c:getfd() +end + +function metat.__index:dirty() + return self.c:dirty() +end + +function metat.__index:getcontrol() + return self.c +end + +function metat.__index:source(source, step) + local sink = socket.sink("keep-open", self.c) + local ret, err = ltn12.pump.all(source, sink, step or ltn12.pump.step) + return ret, err +end + +-- closes the underlying c +function metat.__index:close() + self.c:close() + return 1 +end + +-- connect with server and return c object +function connect(host, port, timeout, create) + local c, e = (create or socket.tcp)() + if not c then return nil, e end + c:settimeout(timeout or TIMEOUT) + local r, e = c:connect(host, port) + if not r then + c:close() + return nil, e + end + return base.setmetatable({c = c}, metat) +end + diff --git a/jni/love/src/libraries/luasocket/libluasocket/tp.lua.h b/jni/love/src/libraries/luasocket/libluasocket/tp.lua.h new file mode 100644 index 00000000..efec651a --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/tp.lua.h @@ -0,0 +1,192 @@ +/* code automatically generated by bin2c -- DO NOT EDIT */ +{ +/* #include'ing this file in a C program is equivalent to calling + if (luaL_loadfile(L,"tp.lua")==0) lua_call(L, 0, 0); +*/ +/* tp.lua */ +static const unsigned char B1[]={ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 85,110,105,102,105,101,100, 32, 83, 77, 84, 80, 47, 70, 84, 80, 32,115,117, + 98,115,121,115,116,101,109, 10, 45, 45, 32, 76,117, 97, 83,111, 99,107,101,116, + 32,116,111,111,108,107,105,116, 46, 10, 45, 45, 32, 65,117,116,104,111,114, 58, + 32, 68,105,101,103,111, 32, 78,101,104, 97, 98, 10, 45, 45, 32, 82, 67, 83, 32, + 73, 68, 58, 32, 36, 73,100, 58, 32,116,112, 46,108,117, 97, 44,118, 32, 49, 46, + 50, 50, 32, 50, 48, 48, 54, 47, 48, 51, 47, 49, 52, 32, 48, 57, 58, 48, 52, 58, + 49, 53, 32,100,105,101,103,111, 32, 69,120,112, 32, 36, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 10, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 68,101, 99,108, 97, +114,101, 32,109,111,100,117,108,101, 32, 97,110,100, 32,105,109,112,111,114,116, + 32,100,101,112,101,110,100,101,110, 99,105,101,115, 10, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, 32, 98, 97, +115,101, 32, 61, 32, 95, 71, 10,108,111, 99, 97,108, 32,115,116,114,105,110,103, + 32, 61, 32,114,101,113,117,105,114,101, 40, 34,115,116,114,105,110,103, 34, 41, + 10,108,111, 99, 97,108, 32,115,111, 99,107,101,116, 32, 61, 32,114,101,113,117, +105,114,101, 40, 34,115,111, 99,107,101,116, 34, 41, 10,108,111, 99, 97,108, 32, +108,116,110, 49, 50, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,108,116,110, + 49, 50, 34, 41, 10,109,111,100,117,108,101, 40, 34,115,111, 99,107,101,116, 46, +116,112, 34, 41, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 10, 45, 45, 32, 80,114,111,103,114, 97,109, 32, 99,111,110,115,116, + 97,110,116,115, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 10, 84, 73, 77, 69, 79, 85, 84, 32, 61, 32, 54, 48, 10, 10, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 73,109, +112,108,101,109,101,110,116, 97,116,105,111,110, 10, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32,103,101,116,115, 32,115, +101,114,118,101,114, 32,114,101,112,108,121, 32, 40,119,111,114,107,115, 32,102, +111,114, 32, 83, 77, 84, 80, 32, 97,110,100, 32, 70, 84, 80, 41, 10,108,111, 99, + 97,108, 32,102,117,110, 99,116,105,111,110, 32,103,101,116, 95,114,101,112,108, +121, 40, 99, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,111,100,101, 44, + 32, 99,117,114,114,101,110,116, 44, 32,115,101,112, 10, 32, 32, 32, 32,108,111, + 99, 97,108, 32,108,105,110,101, 44, 32,101,114,114, 32, 61, 32, 99, 58,114,101, + 99,101,105,118,101, 40, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,114,101, +112,108,121, 32, 61, 32,108,105,110,101, 10, 32, 32, 32, 32,105,102, 32,101,114, +114, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,101, +114,114, 32,101,110,100, 10, 32, 32, 32, 32, 99,111,100,101, 44, 32,115,101,112, + 32, 61, 32,115,111, 99,107,101,116, 46,115,107,105,112, 40, 50, 44, 32,115,116, +114,105,110,103, 46,102,105,110,100, 40,108,105,110,101, 44, 32, 34, 94, 40, 37, +100, 37,100, 37,100, 41, 40, 46, 63, 41, 34, 41, 41, 10, 32, 32, 32, 32,105,102, + 32,110,111,116, 32, 99,111,100,101, 32,116,104,101,110, 32,114,101,116,117,114, +110, 32,110,105,108, 44, 32, 34,105,110,118, 97,108,105,100, 32,115,101,114,118, +101,114, 32,114,101,112,108,121, 34, 32,101,110,100, 10, 32, 32, 32, 32,105,102, + 32,115,101,112, 32, 61, 61, 32, 34, 45, 34, 32,116,104,101,110, 32, 45, 45, 32, +114,101,112,108,121, 32,105,115, 32,109,117,108,116,105,108,105,110,101, 10, 32, + 32, 32, 32, 32, 32, 32, 32,114,101,112,101, 97,116, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32,108,105,110,101, 44, 32,101,114,114, 32, 61, 32, 99, 58, +114,101, 99,101,105,118,101, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,105,102, 32,101,114,114, 32,116,104,101,110, 32,114,101,116,117,114,110, + 32,110,105,108, 44, 32,101,114,114, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 99,117,114,114,101,110,116, 44, 32,115,101,112, 32, 61, + 32,115,111, 99,107,101,116, 46,115,107,105,112, 40, 50, 44, 32,115,116,114,105, +110,103, 46,102,105,110,100, 40,108,105,110,101, 44, 32, 34, 94, 40, 37,100, 37, +100, 37,100, 41, 40, 46, 63, 41, 34, 41, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32,114,101,112,108,121, 32, 61, 32,114,101,112,108,121, 32, 46, 46, + 32, 34, 92,110, 34, 32, 46, 46, 32,108,105,110,101, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 45, 45, 32,114,101,112,108,121, 32,101,110,100,115, 32,119,105,116,104, + 32,115, 97,109,101, 32, 99,111,100,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,117, +110,116,105,108, 32, 99,111,100,101, 32, 61, 61, 32, 99,117,114,114,101,110,116, + 32, 97,110,100, 32,115,101,112, 32, 61, 61, 32, 34, 32, 34, 10, 32, 32, 32, 32, +101,110,100, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32, 99,111,100,101, 44, + 32,114,101,112,108,121, 10,101,110,100, 10, 10, 45, 45, 32,109,101,116, 97,116, + 97, 98,108,101, 32,102,111,114, 32,115,111, 99,107, 32,111, 98,106,101, 99,116, + 10,108,111, 99, 97,108, 32,109,101,116, 97,116, 32, 61, 32,123, 32, 95, 95,105, +110,100,101,120, 32, 61, 32,123,125, 32,125, 10, 10,102,117,110, 99,116,105,111, +110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58, 99,104,101, 99, +107, 40,111,107, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, 99,111,100,101, + 44, 32,114,101,112,108,121, 32, 61, 32,103,101,116, 95,114,101,112,108,121, 40, +115,101,108,102, 46, 99, 41, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32, 99, +111,100,101, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,110,105,108, 44, + 32,114,101,112,108,121, 32,101,110,100, 10, 32, 32, 32, 32,105,102, 32, 98, 97, +115,101, 46,116,121,112,101, 40,111,107, 41, 32,126, 61, 32, 34,102,117,110, 99, +116,105,111,110, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,105, +102, 32, 98, 97,115,101, 46,116,121,112,101, 40,111,107, 41, 32, 61, 61, 32, 34, +116, 97, 98,108,101, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32,102,111,114, 32,105, 44, 32,118, 32,105,110, 32, 98, 97,115,101, + 46,105,112, 97,105,114,115, 40,111,107, 41, 32,100,111, 10, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,115,116,114,105,110,103, + 46,102,105,110,100, 40, 99,111,100,101, 44, 32,118, 41, 32,116,104,101,110, 10, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +114,101,116,117,114,110, 32, 98, 97,115,101, 46,116,111,110,117,109, 98,101,114, + 40, 99,111,100,101, 41, 44, 32,114,101,112,108,121, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,114,101,112,108,121, 10, + 32, 32, 32, 32, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,105,102, 32,115,116,114,105,110,103, 46,102,105,110,100, 40, + 99,111,100,101, 44, 32,111,107, 41, 32,116,104,101,110, 32,114,101,116,117,114, +110, 32, 98, 97,115,101, 46,116,111,110,117,109, 98,101,114, 40, 99,111,100,101, + 41, 44, 32,114,101,112,108,121, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32,101,108,115,101, 32,114,101,116,117,114,110, 32,110,105,108, 44, 32,114,101, +112,108,121, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, + 32, 32, 32, 32,101,108,115,101, 32,114,101,116,117,114,110, 32,111,107, 40, 98, + 97,115,101, 46,116,111,110,117,109, 98,101,114, 40, 99,111,100,101, 41, 44, 32, +114,101,112,108,121, 41, 32,101,110,100, 10,101,110,100, 10, 10,102,117,110, 99, +116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58, 99, +111,109,109, 97,110,100, 40, 99,109,100, 44, 32, 97,114,103, 41, 10, 32, 32, 32, + 32,105,102, 32, 97,114,103, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, + 32,114,101,116,117,114,110, 32,115,101,108,102, 46, 99, 58,115,101,110,100, 40, + 99,109,100, 32, 46, 46, 32, 34, 32, 34, 32, 46, 46, 32, 97,114,103, 46, 46, 32, + 34, 92,114, 92,110, 34, 41, 10, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, + 32, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46, 99, 58,115, +101,110,100, 40, 99,109,100, 32, 46, 46, 32, 34, 92,114, 92,110, 34, 41, 10, 32, + 32, 32, 32,101,110,100, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, + 32,109,101,116, 97,116, 46, 95, 95,105,110,100,101,120, 58,115,105,110,107, 40, +115,110,107, 44, 32,112, 97,116, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32, + 99,104,117,110,107, 44, 32,101,114,114, 32, 61, 32, 99, 58,114,101, 99,101,105, +118,101, 40,112, 97,116, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115, +110,107, 40, 99,104,117,110,107, 44, 32,101,114,114, 41, 10,101,110,100, 10, 10, +102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100, +101,120, 58,115,101,110,100, 40,100, 97,116, 97, 41, 10, 32, 32, 32, 32,114,101, +116,117,114,110, 32,115,101,108,102, 46, 99, 58,115,101,110,100, 40,100, 97,116, + 97, 41, 10,101,110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, + 97,116, 46, 95, 95,105,110,100,101,120, 58,114,101, 99,101,105,118,101, 40,112, + 97,116, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46, + 99, 58,114,101, 99,101,105,118,101, 40,112, 97,116, 41, 10,101,110,100, 10, 10, +102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105,110,100, +101,120, 58,103,101,116,102,100, 40, 41, 10, 32, 32, 32, 32,114,101,116,117,114, +110, 32,115,101,108,102, 46, 99, 58,103,101,116,102,100, 40, 41, 10,101,110,100, + 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95,105, +110,100,101,120, 58,100,105,114,116,121, 40, 41, 10, 32, 32, 32, 32,114,101,116, +117,114,110, 32,115,101,108,102, 46, 99, 58,100,105,114,116,121, 40, 41, 10,101, +110,100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, + 95,105,110,100,101,120, 58,103,101,116, 99,111,110,116,114,111,108, 40, 41, 10, + 32, 32, 32, 32,114,101,116,117,114,110, 32,115,101,108,102, 46, 99, 10,101,110, +100, 10, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, 95, +105,110,100,101,120, 58,115,111,117,114, 99,101, 40,115,111,117,114, 99,101, 44, + 32,115,116,101,112, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,115,105,110, +107, 32, 61, 32,115,111, 99,107,101,116, 46,115,105,110,107, 40, 34,107,101,101, +112, 45,111,112,101,110, 34, 44, 32,115,101,108,102, 46, 99, 41, 10, 32, 32, 32, + 32,108,111, 99, 97,108, 32,114,101,116, 44, 32,101,114,114, 32, 61, 32,108,116, +110, 49, 50, 46,112,117,109,112, 46, 97,108,108, 40,115,111,117,114, 99,101, 44, + 32,115,105,110,107, 44, 32,115,116,101,112, 32,111,114, 32,108,116,110, 49, 50, + 46,112,117,109,112, 46,115,116,101,112, 41, 10, 32, 32, 32, 32,114,101,116,117, +114,110, 32,114,101,116, 44, 32,101,114,114, 10,101,110,100, 10, 10, 45, 45, 32, + 99,108,111,115,101,115, 32,116,104,101, 32,117,110,100,101,114,108,121,105,110, +103, 32, 99, 10,102,117,110, 99,116,105,111,110, 32,109,101,116, 97,116, 46, 95, + 95,105,110,100,101,120, 58, 99,108,111,115,101, 40, 41, 10, 32, 32, 32, 32,115, +101,108,102, 46, 99, 58, 99,108,111,115,101, 40, 41, 10, 9,114,101,116,117,114, +110, 32, 49, 10,101,110,100, 10, 10, 45, 45, 32, 99,111,110,110,101, 99,116, 32, +119,105,116,104, 32,115,101,114,118,101,114, 32, 97,110,100, 32,114,101,116,117, +114,110, 32, 99, 32,111, 98,106,101, 99,116, 10,102,117,110, 99,116,105,111,110, + 32, 99,111,110,110,101, 99,116, 40,104,111,115,116, 44, 32,112,111,114,116, 44, + 32,116,105,109,101,111,117,116, 44, 32, 99,114,101, 97,116,101, 41, 10, 32, 32, + 32, 32,108,111, 99, 97,108, 32, 99, 44, 32,101, 32, 61, 32, 40, 99,114,101, 97, +116,101, 32,111,114, 32,115,111, 99,107,101,116, 46,116, 99,112, 41, 40, 41, 10, + 32, 32, 32, 32,105,102, 32,110,111,116, 32, 99, 32,116,104,101,110, 32,114,101, +116,117,114,110, 32,110,105,108, 44, 32,101, 32,101,110,100, 10, 32, 32, 32, 32, + 99, 58,115,101,116,116,105,109,101,111,117,116, 40,116,105,109,101,111,117,116, + 32,111,114, 32, 84, 73, 77, 69, 79, 85, 84, 41, 10, 32, 32, 32, 32,108,111, 99, + 97,108, 32,114, 44, 32,101, 32, 61, 32, 99, 58, 99,111,110,110,101, 99,116, 40, +104,111,115,116, 44, 32,112,111,114,116, 41, 10, 32, 32, 32, 32,105,102, 32,110, +111,116, 32,114, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 99, 58, + 99,108,111,115,101, 40, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117, +114,110, 32,110,105,108, 44, 32,101, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, + 32, 32,114,101,116,117,114,110, 32, 98, 97,115,101, 46,115,101,116,109,101,116, + 97,116, 97, 98,108,101, 40,123, 99, 32, 61, 32, 99,125, 44, 32,109,101,116, 97, +116, 41, 10,101,110,100, 10, 10, +}; + + if (luaL_loadbuffer(L,(const char*)B1,sizeof(B1),"tp.lua")==0) lua_call(L, 0, 0); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/udp.c b/jni/love/src/libraries/luasocket/libluasocket/udp.c new file mode 100644 index 00000000..fc25aa02 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/udp.c @@ -0,0 +1,336 @@ +/*=========================================================================*\ +* UDP object +* LuaSocket toolkit +* +* RCS ID: $Id: udp.c,v 1.29 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "auxiliar.h" +#include "socket.h" +#include "inet.h" +#include "options.h" +#include "udp.h" + +/* min and max macros */ +#ifndef MIN +#define MIN(x, y) ((x) < (y) ? x : y) +#endif +#ifndef MAX +#define MAX(x, y) ((x) > (y) ? x : y) +#endif + +/*=========================================================================*\ +* Internal function prototypes +\*=========================================================================*/ +static int global_create(lua_State *L); +static int meth_send(lua_State *L); +static int meth_sendto(lua_State *L); +static int meth_receive(lua_State *L); +static int meth_receivefrom(lua_State *L); +static int meth_getsockname(lua_State *L); +static int meth_getpeername(lua_State *L); +static int meth_setsockname(lua_State *L); +static int meth_setpeername(lua_State *L); +static int meth_close(lua_State *L); +static int meth_setoption(lua_State *L); +static int meth_settimeout(lua_State *L); +static int meth_getfd(lua_State *L); +static int meth_setfd(lua_State *L); +static int meth_dirty(lua_State *L); + +/* udp object methods */ +static luaL_reg udp[] = { + {"__gc", meth_close}, + {"__tostring", auxiliar_tostring}, + {"close", meth_close}, + {"dirty", meth_dirty}, + {"getfd", meth_getfd}, + {"getpeername", meth_getpeername}, + {"getsockname", meth_getsockname}, + {"receive", meth_receive}, + {"receivefrom", meth_receivefrom}, + {"send", meth_send}, + {"sendto", meth_sendto}, + {"setfd", meth_setfd}, + {"setoption", meth_setoption}, + {"setpeername", meth_setpeername}, + {"setsockname", meth_setsockname}, + {"settimeout", meth_settimeout}, + {NULL, NULL} +}; + +/* socket options */ +static t_opt opt[] = { + {"dontroute", opt_dontroute}, + {"broadcast", opt_broadcast}, + {"reuseaddr", opt_reuseaddr}, + {"ip-multicast-ttl", opt_ip_multicast_ttl}, + {"ip-multicast-loop", opt_ip_multicast_loop}, + {"ip-add-membership", opt_ip_add_membership}, + {"ip-drop-membership", opt_ip_drop_membersip}, + {NULL, NULL} +}; + +/* functions in library namespace */ +static luaL_reg func[] = { + {"udp", global_create}, + {NULL, NULL} +}; + +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int udp_open(lua_State *L) +{ + /* create classes */ + auxiliar_newclass(L, "udp{connected}", udp); + auxiliar_newclass(L, "udp{unconnected}", udp); + /* create class groups */ + auxiliar_add2group(L, "udp{connected}", "udp{any}"); + auxiliar_add2group(L, "udp{unconnected}", "udp{any}"); + auxiliar_add2group(L, "udp{connected}", "select{able}"); + auxiliar_add2group(L, "udp{unconnected}", "select{able}"); + /* define library functions */ + luaL_openlib(L, NULL, func, 0); + return 0; +} + +/*=========================================================================*\ +* Lua methods +\*=========================================================================*/ +const char *udp_strerror(int err) { + /* a 'closed' error on an unconnected means the target address was not + * accepted by the transport layer */ + if (err == IO_CLOSED) return "refused"; + else return socket_strerror(err); +} + +/*-------------------------------------------------------------------------*\ +* Send data through connected udp socket +\*-------------------------------------------------------------------------*/ +static int meth_send(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkclass(L, "udp{connected}", 1); + p_timeout tm = &udp->tm; + size_t count, sent = 0; + int err; + const char *data = luaL_checklstring(L, 2, &count); + timeout_markstart(tm); + err = socket_send(&udp->sock, data, count, &sent, tm); + if (err != IO_DONE) { + lua_pushnil(L); + lua_pushstring(L, udp_strerror(err)); + return 2; + } + lua_pushnumber(L, sent); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Send data through unconnected udp socket +\*-------------------------------------------------------------------------*/ +static int meth_sendto(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkclass(L, "udp{unconnected}", 1); + size_t count, sent = 0; + const char *data = luaL_checklstring(L, 2, &count); + const char *ip = luaL_checkstring(L, 3); + unsigned short port = (unsigned short) luaL_checknumber(L, 4); + p_timeout tm = &udp->tm; + struct sockaddr_in addr; + int err; + memset(&addr, 0, sizeof(addr)); + if (!inet_aton(ip, &addr.sin_addr)) + luaL_argerror(L, 3, "invalid ip address"); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + timeout_markstart(tm); + err = socket_sendto(&udp->sock, data, count, &sent, + (SA *) &addr, sizeof(addr), tm); + if (err != IO_DONE) { + lua_pushnil(L); + lua_pushstring(L, udp_strerror(err)); + return 2; + } + lua_pushnumber(L, sent); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Receives data from a UDP socket +\*-------------------------------------------------------------------------*/ +static int meth_receive(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + char buffer[UDP_DATAGRAMSIZE]; + size_t got, count = (size_t) luaL_optnumber(L, 2, sizeof(buffer)); + int err; + p_timeout tm = &udp->tm; + count = MIN(count, sizeof(buffer)); + timeout_markstart(tm); + err = socket_recv(&udp->sock, buffer, count, &got, tm); + if (err != IO_DONE) { + lua_pushnil(L); + lua_pushstring(L, udp_strerror(err)); + return 2; + } + lua_pushlstring(L, buffer, got); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Receives data and sender from a UDP socket +\*-------------------------------------------------------------------------*/ +static int meth_receivefrom(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkclass(L, "udp{unconnected}", 1); + struct sockaddr_in addr; + socklen_t addr_len = sizeof(addr); + char buffer[UDP_DATAGRAMSIZE]; + size_t got, count = (size_t) luaL_optnumber(L, 2, sizeof(buffer)); + int err; + p_timeout tm = &udp->tm; + timeout_markstart(tm); + count = MIN(count, sizeof(buffer)); + err = socket_recvfrom(&udp->sock, buffer, count, &got, + (SA *) &addr, &addr_len, tm); + if (err == IO_DONE) { + lua_pushlstring(L, buffer, got); + lua_pushstring(L, inet_ntoa(addr.sin_addr)); + lua_pushnumber(L, ntohs(addr.sin_port)); + return 3; + } else { + lua_pushnil(L); + lua_pushstring(L, udp_strerror(err)); + return 2; + } +} + +/*-------------------------------------------------------------------------*\ +* Select support methods +\*-------------------------------------------------------------------------*/ +static int meth_getfd(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + lua_pushnumber(L, (int) udp->sock); + return 1; +} + +/* this is very dangerous, but can be handy for those that are brave enough */ +static int meth_setfd(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + udp->sock = (t_socket) luaL_checknumber(L, 2); + return 0; +} + +static int meth_dirty(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + (void) udp; + lua_pushboolean(L, 0); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Just call inet methods +\*-------------------------------------------------------------------------*/ +static int meth_getpeername(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkclass(L, "udp{connected}", 1); + return inet_meth_getpeername(L, &udp->sock); +} + +static int meth_getsockname(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + return inet_meth_getsockname(L, &udp->sock); +} + +/*-------------------------------------------------------------------------*\ +* Just call option handler +\*-------------------------------------------------------------------------*/ +static int meth_setoption(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + return opt_meth_setoption(L, opt, &udp->sock); +} + +/*-------------------------------------------------------------------------*\ +* Just call tm methods +\*-------------------------------------------------------------------------*/ +static int meth_settimeout(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + return timeout_meth_settimeout(L, &udp->tm); +} + +/*-------------------------------------------------------------------------*\ +* Turns a master udp object into a client object. +\*-------------------------------------------------------------------------*/ +static int meth_setpeername(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + p_timeout tm = &udp->tm; + const char *address = luaL_checkstring(L, 2); + int connecting = strcmp(address, "*"); + unsigned short port = connecting ? + (unsigned short) luaL_checknumber(L, 3) : + (unsigned short) luaL_optnumber(L, 3, 0); + const char *err = inet_tryconnect(&udp->sock, address, port, tm); + if (err) { + lua_pushnil(L); + lua_pushstring(L, err); + return 2; + } + /* change class to connected or unconnected depending on address */ + if (connecting) auxiliar_setclass(L, "udp{connected}", 1); + else auxiliar_setclass(L, "udp{unconnected}", 1); + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Closes socket used by object +\*-------------------------------------------------------------------------*/ +static int meth_close(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkgroup(L, "udp{any}", 1); + socket_destroy(&udp->sock); + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Turns a master object into a server object +\*-------------------------------------------------------------------------*/ +static int meth_setsockname(lua_State *L) { + p_udp udp = (p_udp) auxiliar_checkclass(L, "udp{unconnected}", 1); + const char *address = luaL_checkstring(L, 2); + unsigned short port = (unsigned short) luaL_checknumber(L, 3); + const char *err = inet_trybind(&udp->sock, address, port); + if (err) { + lua_pushnil(L); + lua_pushstring(L, err); + return 2; + } + lua_pushnumber(L, 1); + return 1; +} + +/*=========================================================================*\ +* Library functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Creates a master udp object +\*-------------------------------------------------------------------------*/ +static int global_create(lua_State *L) { + t_socket sock; + const char *err = inet_trycreate(&sock, SOCK_DGRAM); + /* try to allocate a system socket */ + if (!err) { + /* allocate tcp object */ + p_udp udp = (p_udp) lua_newuserdata(L, sizeof(t_udp)); + auxiliar_setclass(L, "udp{unconnected}", -1); + /* initialize remaining structure fields */ + socket_setnonblocking(&sock); + udp->sock = sock; + timeout_init(&udp->tm, -1, -1); + return 1; + } else { + lua_pushnil(L); + lua_pushstring(L, err); + return 2; + } +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/udp.h b/jni/love/src/libraries/luasocket/libluasocket/udp.h new file mode 100644 index 00000000..28017121 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/udp.h @@ -0,0 +1,33 @@ +#ifndef UDP_H +#define UDP_H +/*=========================================================================*\ +* UDP object +* LuaSocket toolkit +* +* The udp.h module provides LuaSocket with support for UDP protocol +* (AF_INET, SOCK_DGRAM). +* +* Two classes are defined: connected and unconnected. UDP objects are +* originally unconnected. They can be "connected" to a given address +* with a call to the setpeername function. The same function can be used to +* break the connection. +* +* RCS ID: $Id: udp.h,v 1.10 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ +#include "lua.h" + +#include "timeout.h" +#include "socket.h" + +/* can't be larger than wsocket.c MAXCHUNK!!! */ +#define UDP_DATAGRAMSIZE 8192 + +typedef struct t_udp_ { + t_socket sock; + t_timeout tm; +} t_udp; +typedef t_udp *p_udp; + +int udp_open(lua_State *L); + +#endif /* UDP_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/unix.c b/jni/love/src/libraries/luasocket/libluasocket/unix.c new file mode 100644 index 00000000..158d319a --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/unix.c @@ -0,0 +1,356 @@ +/*=========================================================================*\ +* Unix domain socket +* LuaSocket toolkit +* +* RCS ID: $Id: unix.c,v 1.13 2006/03/13 07:16:39 diego Exp $ +\*=========================================================================*/ +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "auxiliar.h" +#include "socket.h" +#include "options.h" +#include "unix.h" +#include + +/*=========================================================================*\ +* Internal function prototypes +\*=========================================================================*/ +static int global_create(lua_State *L); +static int meth_connect(lua_State *L); +static int meth_listen(lua_State *L); +static int meth_bind(lua_State *L); +static int meth_send(lua_State *L); +static int meth_shutdown(lua_State *L); +static int meth_receive(lua_State *L); +static int meth_accept(lua_State *L); +static int meth_close(lua_State *L); +static int meth_setoption(lua_State *L); +static int meth_settimeout(lua_State *L); +static int meth_getfd(lua_State *L); +static int meth_setfd(lua_State *L); +static int meth_dirty(lua_State *L); +static int meth_getstats(lua_State *L); +static int meth_setstats(lua_State *L); + +static const char *unix_tryconnect(p_unix un, const char *path); +static const char *unix_trybind(p_unix un, const char *path); + +/* unix object methods */ +static luaL_reg un[] = { + {"__gc", meth_close}, + {"__tostring", auxiliar_tostring}, + {"accept", meth_accept}, + {"bind", meth_bind}, + {"close", meth_close}, + {"connect", meth_connect}, + {"dirty", meth_dirty}, + {"getfd", meth_getfd}, + {"getstats", meth_getstats}, + {"setstats", meth_setstats}, + {"listen", meth_listen}, + {"receive", meth_receive}, + {"send", meth_send}, + {"setfd", meth_setfd}, + {"setoption", meth_setoption}, + {"setpeername", meth_connect}, + {"setsockname", meth_bind}, + {"settimeout", meth_settimeout}, + {"shutdown", meth_shutdown}, + {NULL, NULL} +}; + +/* socket option handlers */ +static t_opt opt[] = { + {"keepalive", opt_keepalive}, + {"reuseaddr", opt_reuseaddr}, + {"linger", opt_linger}, + {NULL, NULL} +}; + +/* our socket creation function */ +static luaL_reg func[] = { + {"unix", global_create}, + {NULL, NULL} +}; + + +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int luaopen_socket_unix(lua_State *L) { + /* create classes */ + auxiliar_newclass(L, "unix{master}", un); + auxiliar_newclass(L, "unix{client}", un); + auxiliar_newclass(L, "unix{server}", un); + /* create class groups */ + auxiliar_add2group(L, "unix{master}", "unix{any}"); + auxiliar_add2group(L, "unix{client}", "unix{any}"); + auxiliar_add2group(L, "unix{server}", "unix{any}"); + /* make sure the function ends up in the package table */ + luaL_openlib(L, "socket", func, 0); + /* return the function instead of the 'socket' table */ + lua_pushstring(L, "unix"); + lua_gettable(L, -2); + return 1; +} + +/*=========================================================================*\ +* Lua methods +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Just call buffered IO methods +\*-------------------------------------------------------------------------*/ +static int meth_send(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkclass(L, "unix{client}", 1); + return buffer_meth_send(L, &un->buf); +} + +static int meth_receive(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkclass(L, "unix{client}", 1); + return buffer_meth_receive(L, &un->buf); +} + +static int meth_getstats(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkclass(L, "unix{client}", 1); + return buffer_meth_getstats(L, &un->buf); +} + +static int meth_setstats(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkclass(L, "unix{client}", 1); + return buffer_meth_setstats(L, &un->buf); +} + +/*-------------------------------------------------------------------------*\ +* Just call option handler +\*-------------------------------------------------------------------------*/ +static int meth_setoption(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); + return opt_meth_setoption(L, opt, &un->sock); +} + +/*-------------------------------------------------------------------------*\ +* Select support methods +\*-------------------------------------------------------------------------*/ +static int meth_getfd(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); + lua_pushnumber(L, (int) un->sock); + return 1; +} + +/* this is very dangerous, but can be handy for those that are brave enough */ +static int meth_setfd(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); + un->sock = (t_socket) luaL_checknumber(L, 2); + return 0; +} + +static int meth_dirty(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); + lua_pushboolean(L, !buffer_isempty(&un->buf)); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Waits for and returns a client object attempting connection to the +* server object +\*-------------------------------------------------------------------------*/ +static int meth_accept(lua_State *L) { + p_unix server = (p_unix) auxiliar_checkclass(L, "unix{server}", 1); + p_timeout tm = timeout_markstart(&server->tm); + t_socket sock; + int err = socket_accept(&server->sock, &sock, NULL, NULL, tm); + /* if successful, push client socket */ + if (err == IO_DONE) { + p_unix clnt = (p_unix) lua_newuserdata(L, sizeof(t_unix)); + auxiliar_setclass(L, "unix{client}", -1); + /* initialize structure fields */ + socket_setnonblocking(&sock); + clnt->sock = sock; + io_init(&clnt->io, (p_send)socket_send, (p_recv)socket_recv, + (p_error) socket_ioerror, &clnt->sock); + timeout_init(&clnt->tm, -1, -1); + buffer_init(&clnt->buf, &clnt->io, &clnt->tm); + return 1; + } else { + lua_pushnil(L); + lua_pushstring(L, socket_strerror(err)); + return 2; + } +} + +/*-------------------------------------------------------------------------*\ +* Binds an object to an address +\*-------------------------------------------------------------------------*/ +static const char *unix_trybind(p_unix un, const char *path) { + struct sockaddr_un local; + size_t len = strlen(path); + int err; + if (len >= sizeof(local.sun_path)) return "path too long"; + memset(&local, 0, sizeof(local)); + strcpy(local.sun_path, path); + local.sun_family = AF_UNIX; +#ifdef UNIX_HAS_SUN_LEN + local.sun_len = sizeof(local.sun_family) + sizeof(local.sun_len) + + len + 1; + err = socket_bind(&un->sock, (SA *) &local, local.sun_len); + +#else + err = socket_bind(&un->sock, (SA *) &local, + sizeof(local.sun_family) + len); +#endif + if (err != IO_DONE) socket_destroy(&un->sock); + return socket_strerror(err); +} + +static int meth_bind(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkclass(L, "unix{master}", 1); + const char *path = luaL_checkstring(L, 2); + const char *err = unix_trybind(un, path); + if (err) { + lua_pushnil(L); + lua_pushstring(L, err); + return 2; + } + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Turns a master unix object into a client object. +\*-------------------------------------------------------------------------*/ +static const char *unix_tryconnect(p_unix un, const char *path) +{ + struct sockaddr_un remote; + int err; + size_t len = strlen(path); + if (len >= sizeof(remote.sun_path)) return "path too long"; + memset(&remote, 0, sizeof(remote)); + strcpy(remote.sun_path, path); + remote.sun_family = AF_UNIX; + timeout_markstart(&un->tm); +#ifdef UNIX_HAS_SUN_LEN + remote.sun_len = sizeof(remote.sun_family) + sizeof(remote.sun_len) + + len + 1; + err = socket_connect(&un->sock, (SA *) &remote, remote.sun_len, &un->tm); +#else + err = socket_connect(&un->sock, (SA *) &remote, + sizeof(remote.sun_family) + len, &un->tm); +#endif + if (err != IO_DONE) socket_destroy(&un->sock); + return socket_strerror(err); +} + +static int meth_connect(lua_State *L) +{ + p_unix un = (p_unix) auxiliar_checkclass(L, "unix{master}", 1); + const char *path = luaL_checkstring(L, 2); + const char *err = unix_tryconnect(un, path); + if (err) { + lua_pushnil(L); + lua_pushstring(L, err); + return 2; + } + /* turn master object into a client object */ + auxiliar_setclass(L, "unix{client}", 1); + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Closes socket used by object +\*-------------------------------------------------------------------------*/ +static int meth_close(lua_State *L) +{ + p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); + socket_destroy(&un->sock); + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Puts the sockt in listen mode +\*-------------------------------------------------------------------------*/ +static int meth_listen(lua_State *L) +{ + p_unix un = (p_unix) auxiliar_checkclass(L, "unix{master}", 1); + int backlog = (int) luaL_optnumber(L, 2, 32); + int err = socket_listen(&un->sock, backlog); + if (err != IO_DONE) { + lua_pushnil(L); + lua_pushstring(L, socket_strerror(err)); + return 2; + } + /* turn master object into a server object */ + auxiliar_setclass(L, "unix{server}", 1); + lua_pushnumber(L, 1); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Shuts the connection down partially +\*-------------------------------------------------------------------------*/ +static int meth_shutdown(lua_State *L) +{ + p_unix un = (p_unix) auxiliar_checkclass(L, "unix{client}", 1); + const char *how = luaL_optstring(L, 2, "both"); + switch (how[0]) { + case 'b': + if (strcmp(how, "both")) goto error; + socket_shutdown(&un->sock, 2); + break; + case 's': + if (strcmp(how, "send")) goto error; + socket_shutdown(&un->sock, 1); + break; + case 'r': + if (strcmp(how, "receive")) goto error; + socket_shutdown(&un->sock, 0); + break; + } + lua_pushnumber(L, 1); + return 1; +error: + luaL_argerror(L, 2, "invalid shutdown method"); + return 0; +} + +/*-------------------------------------------------------------------------*\ +* Just call tm methods +\*-------------------------------------------------------------------------*/ +static int meth_settimeout(lua_State *L) { + p_unix un = (p_unix) auxiliar_checkgroup(L, "unix{any}", 1); + return timeout_meth_settimeout(L, &un->tm); +} + +/*=========================================================================*\ +* Library functions +\*=========================================================================*/ +/*-------------------------------------------------------------------------*\ +* Creates a master unix object +\*-------------------------------------------------------------------------*/ +static int global_create(lua_State *L) { + t_socket sock; + int err = socket_create(&sock, AF_UNIX, SOCK_STREAM, 0); + /* try to allocate a system socket */ + if (err == IO_DONE) { + /* allocate unix object */ + p_unix un = (p_unix) lua_newuserdata(L, sizeof(t_unix)); + /* set its type as master object */ + auxiliar_setclass(L, "unix{master}", -1); + /* initialize remaining structure fields */ + socket_setnonblocking(&sock); + un->sock = sock; + io_init(&un->io, (p_send) socket_send, (p_recv) socket_recv, + (p_error) socket_ioerror, &un->sock); + timeout_init(&un->tm, -1, -1); + buffer_init(&un->buf, &un->io, &un->tm); + return 1; + } else { + lua_pushnil(L); + lua_pushstring(L, socket_strerror(err)); + return 2; + } +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/unix.h b/jni/love/src/libraries/luasocket/libluasocket/unix.h new file mode 100644 index 00000000..32b7380f --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/unix.h @@ -0,0 +1,28 @@ +#ifndef UNIX_H +#define UNIX_H +/*=========================================================================*\ +* Unix domain object +* LuaSocket toolkit +* +* This module is just an example of how to extend LuaSocket with a new +* domain. +* +* RCS ID: $Id: unix.h,v 1.9 2006/03/13 07:16:39 diego Exp $ +\*=========================================================================*/ +#include "lua.h" + +#include "buffer.h" +#include "timeout.h" +#include "socket.h" + +typedef struct t_unix_ { + t_socket sock; + t_io io; + t_buffer buf; + t_timeout tm; +} t_unix; +typedef t_unix *p_unix; + +int luaopen_socket_unix(lua_State *L); + +#endif /* UNIX_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/url.lua b/jni/love/src/libraries/luasocket/libluasocket/url.lua new file mode 100644 index 00000000..0e31d8af --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/url.lua @@ -0,0 +1,297 @@ +----------------------------------------------------------------------------- +-- URI parsing, composition and relative URL resolution +-- LuaSocket toolkit. +-- Author: Diego Nehab +-- RCS ID: $Id: url.lua,v 1.38 2006/04/03 04:45:42 diego Exp $ +----------------------------------------------------------------------------- + +----------------------------------------------------------------------------- +-- Declare module +----------------------------------------------------------------------------- +local string = require("string") +local base = _G +local table = require("table") +module("socket.url") + +----------------------------------------------------------------------------- +-- Module version +----------------------------------------------------------------------------- +_VERSION = "URL 1.0.1" + +----------------------------------------------------------------------------- +-- Encodes a string into its escaped hexadecimal representation +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +function escape(s) + return string.gsub(s, "([^A-Za-z0-9_])", function(c) + return string.format("%%%02x", string.byte(c)) + end) +end + +----------------------------------------------------------------------------- +-- Protects a path segment, to prevent it from interfering with the +-- url parsing. +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +local function make_set(t) + local s = {} + for i,v in base.ipairs(t) do + s[t[i]] = 1 + end + return s +end + +-- these are allowed withing a path segment, along with alphanum +-- other characters must be escaped +local segment_set = make_set { + "-", "_", ".", "!", "~", "*", "'", "(", + ")", ":", "@", "&", "=", "+", "$", ",", +} + +local function protect_segment(s) + return string.gsub(s, "([^A-Za-z0-9_])", function (c) + if segment_set[c] then return c + else return string.format("%%%02x", string.byte(c)) end + end) +end + +----------------------------------------------------------------------------- +-- Encodes a string into its escaped hexadecimal representation +-- Input +-- s: binary string to be encoded +-- Returns +-- escaped representation of string binary +----------------------------------------------------------------------------- +function unescape(s) + return string.gsub(s, "%%(%x%x)", function(hex) + return string.char(base.tonumber(hex, 16)) + end) +end + +----------------------------------------------------------------------------- +-- Builds a path from a base path and a relative path +-- Input +-- base_path +-- relative_path +-- Returns +-- corresponding absolute path +----------------------------------------------------------------------------- +local function absolute_path(base_path, relative_path) + if string.sub(relative_path, 1, 1) == "/" then return relative_path end + local path = string.gsub(base_path, "[^/]*$", "") + path = path .. relative_path + path = string.gsub(path, "([^/]*%./)", function (s) + if s ~= "./" then return s else return "" end + end) + path = string.gsub(path, "/%.$", "/") + local reduced + while reduced ~= path do + reduced = path + path = string.gsub(reduced, "([^/]*/%.%./)", function (s) + if s ~= "../../" then return "" else return s end + end) + end + path = string.gsub(reduced, "([^/]*/%.%.)$", function (s) + if s ~= "../.." then return "" else return s end + end) + return path +end + +----------------------------------------------------------------------------- +-- Parses a url and returns a table with all its parts according to RFC 2396 +-- The following grammar describes the names given to the URL parts +-- ::= :///;?# +-- ::= @: +-- ::= [:] +-- :: = {/} +-- Input +-- url: uniform resource locator of request +-- default: table with default values for each field +-- Returns +-- table with the following fields, where RFC naming conventions have +-- been preserved: +-- scheme, authority, userinfo, user, password, host, port, +-- path, params, query, fragment +-- Obs: +-- the leading '/' in {/} is considered part of +----------------------------------------------------------------------------- +function parse(url, default) + -- initialize default parameters + local parsed = {} + for i,v in base.pairs(default or parsed) do parsed[i] = v end + -- empty url is parsed to nil + if not url or url == "" then return nil, "invalid url" end + -- remove whitespace + -- url = string.gsub(url, "%s", "") + -- get fragment + url = string.gsub(url, "#(.*)$", function(f) + parsed.fragment = f + return "" + end) + -- get scheme + url = string.gsub(url, "^([%w][%w%+%-%.]*)%:", + function(s) parsed.scheme = s; return "" end) + -- get authority + url = string.gsub(url, "^//([^/]*)", function(n) + parsed.authority = n + return "" + end) + -- get query stringing + url = string.gsub(url, "%?(.*)", function(q) + parsed.query = q + return "" + end) + -- get params + url = string.gsub(url, "%;(.*)", function(p) + parsed.params = p + return "" + end) + -- path is whatever was left + if url ~= "" then parsed.path = url end + local authority = parsed.authority + if not authority then return parsed end + authority = string.gsub(authority,"^([^@]*)@", + function(u) parsed.userinfo = u; return "" end) + authority = string.gsub(authority, ":([^:]*)$", + function(p) parsed.port = p; return "" end) + if authority ~= "" then parsed.host = authority end + local userinfo = parsed.userinfo + if not userinfo then return parsed end + userinfo = string.gsub(userinfo, ":([^:]*)$", + function(p) parsed.password = p; return "" end) + parsed.user = userinfo + return parsed +end + +----------------------------------------------------------------------------- +-- Rebuilds a parsed URL from its components. +-- Components are protected if any reserved or unallowed characters are found +-- Input +-- parsed: parsed URL, as returned by parse +-- Returns +-- a stringing with the corresponding URL +----------------------------------------------------------------------------- +function build(parsed) + local ppath = parse_path(parsed.path or "") + local url = build_path(ppath) + if parsed.params then url = url .. ";" .. parsed.params end + if parsed.query then url = url .. "?" .. parsed.query end + local authority = parsed.authority + if parsed.host then + authority = parsed.host + if parsed.port then authority = authority .. ":" .. parsed.port end + local userinfo = parsed.userinfo + if parsed.user then + userinfo = parsed.user + if parsed.password then + userinfo = userinfo .. ":" .. parsed.password + end + end + if userinfo then authority = userinfo .. "@" .. authority end + end + if authority then url = "//" .. authority .. url end + if parsed.scheme then url = parsed.scheme .. ":" .. url end + if parsed.fragment then url = url .. "#" .. parsed.fragment end + -- url = string.gsub(url, "%s", "") + return url +end + +----------------------------------------------------------------------------- +-- Builds a absolute URL from a base and a relative URL according to RFC 2396 +-- Input +-- base_url +-- relative_url +-- Returns +-- corresponding absolute url +----------------------------------------------------------------------------- +function absolute(base_url, relative_url) + if base.type(base_url) == "table" then + base_parsed = base_url + base_url = build(base_parsed) + else + base_parsed = parse(base_url) + end + local relative_parsed = parse(relative_url) + if not base_parsed then return relative_url + elseif not relative_parsed then return base_url + elseif relative_parsed.scheme then return relative_url + else + relative_parsed.scheme = base_parsed.scheme + if not relative_parsed.authority then + relative_parsed.authority = base_parsed.authority + if not relative_parsed.path then + relative_parsed.path = base_parsed.path + if not relative_parsed.params then + relative_parsed.params = base_parsed.params + if not relative_parsed.query then + relative_parsed.query = base_parsed.query + end + end + else + relative_parsed.path = absolute_path(base_parsed.path or "", + relative_parsed.path) + end + end + return build(relative_parsed) + end +end + +----------------------------------------------------------------------------- +-- Breaks a path into its segments, unescaping the segments +-- Input +-- path +-- Returns +-- segment: a table with one entry per segment +----------------------------------------------------------------------------- +function parse_path(path) + local parsed = {} + path = path or "" + --path = string.gsub(path, "%s", "") + string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end) + for i = 1, table.getn(parsed) do + parsed[i] = unescape(parsed[i]) + end + if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end + if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end + return parsed +end + +----------------------------------------------------------------------------- +-- Builds a path component from its segments, escaping protected characters. +-- Input +-- parsed: path segments +-- unsafe: if true, segments are not protected before path is built +-- Returns +-- path: corresponding path stringing +----------------------------------------------------------------------------- +function build_path(parsed, unsafe) + local path = "" + local n = table.getn(parsed) + if unsafe then + for i = 1, n-1 do + path = path .. parsed[i] + path = path .. "/" + end + if n > 0 then + path = path .. parsed[n] + if parsed.is_directory then path = path .. "/" end + end + else + for i = 1, n-1 do + path = path .. protect_segment(parsed[i]) + path = path .. "/" + end + if n > 0 then + path = path .. protect_segment(parsed[n]) + if parsed.is_directory then path = path .. "/" end + end + end + if parsed.is_absolute then path = "/" .. path end + return path +end diff --git a/jni/love/src/libraries/luasocket/libluasocket/url.lua.h b/jni/love/src/libraries/luasocket/libluasocket/url.lua.h new file mode 100644 index 00000000..59916b37 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/url.lua.h @@ -0,0 +1,538 @@ +/* code automatically generated by bin2c -- DO NOT EDIT */ +{ +/* #include'ing this file in a C program is equivalent to calling + if (luaL_loadfile(L,"url.lua")==0) lua_call(L, 0, 0); +*/ +/* url.lua */ +static const unsigned char B1[]={ + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, + 32, 85, 82, 73, 32,112, 97,114,115,105,110,103, 44, 32, 99,111,109,112,111,115, +105,116,105,111,110, 32, 97,110,100, 32,114,101,108, 97,116,105,118,101, 32, 85, + 82, 76, 32,114,101,115,111,108,117,116,105,111,110, 10, 45, 45, 32, 76,117, 97, + 83,111, 99,107,101,116, 32,116,111,111,108,107,105,116, 46, 10, 45, 45, 32, 65, +117,116,104,111,114, 58, 32, 68,105,101,103,111, 32, 78,101,104, 97, 98, 10, 45, + 45, 32, 82, 67, 83, 32, 73, 68, 58, 32, 36, 73,100, 58, 32,117,114,108, 46,108, +117, 97, 44,118, 32, 49, 46, 51, 56, 32, 50, 48, 48, 54, 47, 48, 52, 47, 48, 51, + 32, 48, 52, 58, 52, 53, 58, 52, 50, 32,100,105,101,103,111, 32, 69,120,112, 32, + 36, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, + 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, + 45, 32, 68,101, 99,108, 97,114,101, 32,109,111,100,117,108,101, 10, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, + 32,115,116,114,105,110,103, 32, 61, 32,114,101,113,117,105,114,101, 40, 34,115, +116,114,105,110,103, 34, 41, 10,108,111, 99, 97,108, 32, 98, 97,115,101, 32, 61, + 32, 95, 71, 10,108,111, 99, 97,108, 32,116, 97, 98,108,101, 32, 61, 32,114,101, +113,117,105,114,101, 40, 34,116, 97, 98,108,101, 34, 41, 10,109,111,100,117,108, +101, 40, 34,115,111, 99,107,101,116, 46,117,114,108, 34, 41, 10, 10, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 77,111, +100,117,108,101, 32,118,101,114,115,105,111,110, 10, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 95, 86, 69, 82, 83, 73, 79, 78, 32, + 61, 32, 34, 85, 82, 76, 32, 49, 46, 48, 46, 49, 34, 10, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 69,110, 99,111, +100,101,115, 32, 97, 32,115,116,114,105,110,103, 32,105,110,116,111, 32,105,116, +115, 32,101,115, 99, 97,112,101,100, 32,104,101,120, 97,100,101, 99,105,109, 97, +108, 32,114,101,112,114,101,115,101,110,116, 97,116,105,111,110, 10, 45, 45, 32, + 73,110,112,117,116, 10, 45, 45, 32, 32, 32,115, 58, 32, 98,105,110, 97,114,121, + 32,115,116,114,105,110,103, 32,116,111, 32, 98,101, 32,101,110, 99,111,100,101, +100, 10, 45, 45, 32, 82,101,116,117,114,110,115, 10, 45, 45, 32, 32, 32,101,115, + 99, 97,112,101,100, 32,114,101,112,114,101,115,101,110,116, 97,116,105,111,110, + 32,111,102, 32,115,116,114,105,110,103, 32, 98,105,110, 97,114,121, 10, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,102,117,110, 99, +116,105,111,110, 32,101,115, 99, 97,112,101, 40,115, 41, 10, 32, 32, 32, 32,114, +101,116,117,114,110, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,115, 44, + 32, 34, 40, 91, 94, 65, 45, 90, 97, 45,122, 48, 45, 57, 95, 93, 41, 34, 44, 32, +102,117,110, 99,116,105,111,110, 40, 99, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, +114,101,116,117,114,110, 32,115,116,114,105,110,103, 46,102,111,114,109, 97,116, + 40, 34, 37, 37, 37, 48, 50,120, 34, 44, 32,115,116,114,105,110,103, 46, 98,121, +116,101, 40, 99, 41, 41, 10, 32, 32, 32, 32,101,110,100, 41, 10,101,110,100, 10, + 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, + 45, 32, 80,114,111,116,101, 99,116,115, 32, 97, 32,112, 97,116,104, 32,115,101, +103,109,101,110,116, 44, 32,116,111, 32,112,114,101,118,101,110,116, 32,105,116, + 32,102,114,111,109, 32,105,110,116,101,114,102,101,114,105,110,103, 32,119,105, +116,104, 32,116,104,101, 10, 45, 45, 32,117,114,108, 32,112, 97,114,115,105,110, +103, 46, 10, 45, 45, 32, 73,110,112,117,116, 10, 45, 45, 32, 32, 32,115, 58, 32, + 98,105,110, 97,114,121, 32,115,116,114,105,110,103, 32,116,111, 32, 98,101, 32, +101,110, 99,111,100,101,100, 10, 45, 45, 32, 82,101,116,117,114,110,115, 10, 45, + 45, 32, 32, 32,101,115, 99, 97,112,101,100, 32,114,101,112,114,101,115,101,110, +116, 97,116,105,111,110, 32,111,102, 32,115,116,114,105,110,103, 32, 98,105,110, + 97,114,121, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111,110, 32,109, 97,107, +101, 95,115,101,116, 40,116, 41, 10, 9,108,111, 99, 97,108, 32,115, 32, 61, 32, +123,125, 10, 9,102,111,114, 32,105, 44,118, 32,105,110, 32, 98, 97,115,101, 46, +105,112, 97,105,114,115, 40,116, 41, 32,100,111, 10, 9, 9,115, 91,116, 91,105, + 93, 93, 32, 61, 32, 49, 10, 9,101,110,100, 10, 9,114,101,116,117,114,110, 32, +115, 10,101,110,100, 10, 10, 45, 45, 32,116,104,101,115,101, 32, 97,114,101, 32, + 97,108,108,111,119,101,100, 32,119,105,116,104,105,110,103, 32, 97, 32,112, 97, +116,104, 32,115,101,103,109,101,110,116, 44, 32, 97,108,111,110,103, 32,119,105, +116,104, 32, 97,108,112,104, 97,110,117,109, 10, 45, 45, 32,111,116,104,101,114, + 32, 99,104, 97,114, 97, 99,116,101,114,115, 32,109,117,115,116, 32, 98,101, 32, +101,115, 99, 97,112,101,100, 10,108,111, 99, 97,108, 32,115,101,103,109,101,110, +116, 95,115,101,116, 32, 61, 32,109, 97,107,101, 95,115,101,116, 32,123, 10, 32, + 32, 32, 32, 34, 45, 34, 44, 32, 34, 95, 34, 44, 32, 34, 46, 34, 44, 32, 34, 33, + 34, 44, 32, 34,126, 34, 44, 32, 34, 42, 34, 44, 32, 34, 39, 34, 44, 32, 34, 40, + 34, 44, 10, 9, 34, 41, 34, 44, 32, 34, 58, 34, 44, 32, 34, 64, 34, 44, 32, 34, + 38, 34, 44, 32, 34, 61, 34, 44, 32, 34, 43, 34, 44, 32, 34, 36, 34, 44, 32, 34, + 44, 34, 44, 10,125, 10, 10,108,111, 99, 97,108, 32,102,117,110, 99,116,105,111, +110, 32,112,114,111,116,101, 99,116, 95,115,101,103,109,101,110,116, 40,115, 41, + 10, 9,114,101,116,117,114,110, 32,115,116,114,105,110,103, 46,103,115,117, 98, + 40,115, 44, 32, 34, 40, 91, 94, 65, 45, 90, 97, 45,122, 48, 45, 57, 95, 93, 41, + 34, 44, 32,102,117,110, 99,116,105,111,110, 32, 40, 99, 41, 10, 9, 9,105,102, + 32,115,101,103,109,101,110,116, 95,115,101,116, 91, 99, 93, 32,116,104,101,110, + 32,114,101,116,117,114,110, 32, 99, 10, 9, 9,101,108,115,101, 32,114,101,116, +117,114,110, 32,115,116,114,105,110,103, 46,102,111,114,109, 97,116, 40, 34, 37, + 37, 37, 48, 50,120, 34, 44, 32,115,116,114,105,110,103, 46, 98,121,116,101, 40, + 99, 41, 41, 32,101,110,100, 10, 9,101,110,100, 41, 10,101,110,100, 10, 10, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, + 69,110, 99,111,100,101,115, 32, 97, 32,115,116,114,105,110,103, 32,105,110,116, +111, 32,105,116,115, 32,101,115, 99, 97,112,101,100, 32,104,101,120, 97,100,101, + 99,105,109, 97,108, 32,114,101,112,114,101,115,101,110,116, 97,116,105,111,110, + 10, 45, 45, 32, 73,110,112,117,116, 10, 45, 45, 32, 32, 32,115, 58, 32, 98,105, +110, 97,114,121, 32,115,116,114,105,110,103, 32,116,111, 32, 98,101, 32,101,110, + 99,111,100,101,100, 10, 45, 45, 32, 82,101,116,117,114,110,115, 10, 45, 45, 32, + 32, 32,101,115, 99, 97,112,101,100, 32,114,101,112,114,101,115,101,110,116, 97, +116,105,111,110, 32,111,102, 32,115,116,114,105,110,103, 32, 98,105,110, 97,114, +121, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, +102,117,110, 99,116,105,111,110, 32,117,110,101,115, 99, 97,112,101, 40,115, 41, + 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,115,116,114,105,110,103, 46,103, +115,117, 98, 40,115, 44, 32, 34, 37, 37, 40, 37,120, 37,120, 41, 34, 44, 32,102, +117,110, 99,116,105,111,110, 40,104,101,120, 41, 10, 32, 32, 32, 32, 32, 32, 32, + 32,114,101,116,117,114,110, 32,115,116,114,105,110,103, 46, 99,104, 97,114, 40, + 98, 97,115,101, 46,116,111,110,117,109, 98,101,114, 40,104,101,120, 44, 32, 49, + 54, 41, 41, 10, 32, 32, 32, 32,101,110,100, 41, 10,101,110,100, 10, 10, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 66, +117,105,108,100,115, 32, 97, 32,112, 97,116,104, 32,102,114,111,109, 32, 97, 32, + 98, 97,115,101, 32,112, 97,116,104, 32, 97,110,100, 32, 97, 32,114,101,108, 97, +116,105,118,101, 32,112, 97,116,104, 10, 45, 45, 32, 73,110,112,117,116, 10, 45, + 45, 32, 32, 32, 98, 97,115,101, 95,112, 97,116,104, 10, 45, 45, 32, 32, 32,114, +101,108, 97,116,105,118,101, 95,112, 97,116,104, 10, 45, 45, 32, 82,101,116,117, +114,110,115, 10, 45, 45, 32, 32, 32, 99,111,114,114,101,115,112,111,110,100,105, +110,103, 32, 97, 98,115,111,108,117,116,101, 32,112, 97,116,104, 10, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,108,111, 99, 97,108, + 32,102,117,110, 99,116,105,111,110, 32, 97, 98,115,111,108,117,116,101, 95,112, + 97,116,104, 40, 98, 97,115,101, 95,112, 97,116,104, 44, 32,114,101,108, 97,116, +105,118,101, 95,112, 97,116,104, 41, 10, 32, 32, 32, 32,105,102, 32,115,116,114, +105,110,103, 46,115,117, 98, 40,114,101,108, 97,116,105,118,101, 95,112, 97,116, +104, 44, 32, 49, 44, 32, 49, 41, 32, 61, 61, 32, 34, 47, 34, 32,116,104,101,110, + 32,114,101,116,117,114,110, 32,114,101,108, 97,116,105,118,101, 95,112, 97,116, +104, 32,101,110,100, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,112, 97,116,104, + 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40, 98, 97,115,101, 95, +112, 97,116,104, 44, 32, 34, 91, 94, 47, 93, 42, 36, 34, 44, 32, 34, 34, 41, 10, + 32, 32, 32, 32,112, 97,116,104, 32, 61, 32,112, 97,116,104, 32, 46, 46, 32,114, +101,108, 97,116,105,118,101, 95,112, 97,116,104, 10, 32, 32, 32, 32,112, 97,116, +104, 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,112, 97,116,104, + 44, 32, 34, 40, 91, 94, 47, 93, 42, 37, 46, 47, 41, 34, 44, 32,102,117,110, 99, +116,105,111,110, 32, 40,115, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32, +115, 32,126, 61, 32, 34, 46, 47, 34, 32,116,104,101,110, 32,114,101,116,117,114, +110, 32,115, 32,101,108,115,101, 32,114,101,116,117,114,110, 32, 34, 34, 32,101, +110,100, 10, 32, 32, 32, 32,101,110,100, 41, 10, 32, 32, 32, 32,112, 97,116,104, + 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,112, 97,116,104, 44, + 32, 34, 47, 37, 46, 36, 34, 44, 32, 34, 47, 34, 41, 10, 32, 32, 32, 32,108,111, + 99, 97,108, 32,114,101,100,117, 99,101,100, 10, 32, 32, 32, 32,119,104,105,108, +101, 32,114,101,100,117, 99,101,100, 32,126, 61, 32,112, 97,116,104, 32,100,111, + 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,100,117, 99,101,100, 32, 61, 32,112, + 97,116,104, 10, 32, 32, 32, 32, 32, 32, 32, 32,112, 97,116,104, 32, 61, 32,115, +116,114,105,110,103, 46,103,115,117, 98, 40,114,101,100,117, 99,101,100, 44, 32, + 34, 40, 91, 94, 47, 93, 42, 47, 37, 46, 37, 46, 47, 41, 34, 44, 32,102,117,110, + 99,116,105,111,110, 32, 40,115, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32,105,102, 32,115, 32,126, 61, 32, 34, 46, 46, 47, 46, 46, 47, 34, 32,116, +104,101,110, 32,114,101,116,117,114,110, 32, 34, 34, 32,101,108,115,101, 32,114, +101,116,117,114,110, 32,115, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, +101,110,100, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,112, 97,116, +104, 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,114,101,100,117, + 99,101,100, 44, 32, 34, 40, 91, 94, 47, 93, 42, 47, 37, 46, 37, 46, 41, 36, 34, + 44, 32,102,117,110, 99,116,105,111,110, 32, 40,115, 41, 10, 32, 32, 32, 32, 32, + 32, 32, 32,105,102, 32,115, 32,126, 61, 32, 34, 46, 46, 47, 46, 46, 34, 32,116, +104,101,110, 32,114,101,116,117,114,110, 32, 34, 34, 32,101,108,115,101, 32,114, +101,116,117,114,110, 32,115, 32,101,110,100, 10, 32, 32, 32, 32,101,110,100, 41, + 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,112, 97,116,104, 10,101,110,100, + 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10, + 45, 45, 32, 80, 97,114,115,101,115, 32, 97, 32,117,114,108, 32, 97,110,100, 32, +114,101,116,117,114,110,115, 32, 97, 32,116, 97, 98,108,101, 32,119,105,116,104, + 32, 97,108,108, 32,105,116,115, 32,112, 97,114,116,115, 32, 97, 99, 99,111,114, +100,105,110,103, 32,116,111, 32, 82, 70, 67, 32, 50, 51, 57, 54, 10, 45, 45, 32, + 84,104,101, 32,102,111,108,108,111,119,105,110,103, 32,103,114, 97,109,109, 97, +114, 32,100,101,115, 99,114,105, 98,101,115, 32,116,104,101, 32,110, 97,109,101, +115, 32,103,105,118,101,110, 32,116,111, 32,116,104,101, 32, 85, 82, 76, 32,112, + 97,114,116,115, 10, 45, 45, 32, 60,117,114,108, 62, 32, 58, 58, 61, 32, 60,115, + 99,104,101,109,101, 62, 58, 47, 47, 60, 97,117,116,104,111,114,105,116,121, 62, + 47, 60,112, 97,116,104, 62, 59, 60,112, 97,114, 97,109,115, 62, 63, 60,113,117, +101,114,121, 62, 35, 60,102,114, 97,103,109,101,110,116, 62, 10, 45, 45, 32, 60, + 97,117,116,104,111,114,105,116,121, 62, 32, 58, 58, 61, 32, 60,117,115,101,114, +105,110,102,111, 62, 64, 60,104,111,115,116, 62, 58, 60,112,111,114,116, 62, 10, + 45, 45, 32, 60,117,115,101,114,105,110,102,111, 62, 32, 58, 58, 61, 32, 60,117, +115,101,114, 62, 91, 58, 60,112, 97,115,115,119,111,114,100, 62, 93, 10, 45, 45, + 32, 60,112, 97,116,104, 62, 32, 58, 58, 32, 61, 32,123, 60,115,101,103,109,101, +110,116, 62, 47,125, 60,115,101,103,109,101,110,116, 62, 10, 45, 45, 32, 73,110, +112,117,116, 10, 45, 45, 32, 32, 32,117,114,108, 58, 32,117,110,105,102,111,114, +109, 32,114,101,115,111,117,114, 99,101, 32,108,111, 99, 97,116,111,114, 32,111, +102, 32,114,101,113,117,101,115,116, 10, 45, 45, 32, 32, 32,100,101,102, 97,117, +108,116, 58, 32,116, 97, 98,108,101, 32,119,105,116,104, 32,100,101,102, 97,117, +108,116, 32,118, 97,108,117,101,115, 32,102,111,114, 32,101, 97, 99,104, 32,102, +105,101,108,100, 10, 45, 45, 32, 82,101,116,117,114,110,115, 10, 45, 45, 32, 32, + 32,116, 97, 98,108,101, 32,119,105,116,104, 32,116,104,101, 32,102,111,108,108, +111,119,105,110,103, 32,102,105,101,108,100,115, 44, 32,119,104,101,114,101, 32, + 82, 70, 67, 32,110, 97,109,105,110,103, 32, 99,111,110,118,101,110,116,105,111, +110,115, 32,104, 97,118,101, 10, 45, 45, 32, 32, 32, 98,101,101,110, 32,112,114, +101,115,101,114,118,101,100, 58, 10, 45, 45, 32, 32, 32, 32, 32,115, 99,104,101, +109,101, 44, 32, 97,117,116,104,111,114,105,116,121, 44, 32,117,115,101,114,105, +110,102,111, 44, 32,117,115,101,114, 44, 32,112, 97,115,115,119,111,114,100, 44, + 32,104,111,115,116, 44, 32,112,111,114,116, 44, 10, 45, 45, 32, 32, 32, 32, 32, +112, 97,116,104, 44, 32,112, 97,114, 97,109,115, 44, 32,113,117,101,114,121, 44, + 32,102,114, 97,103,109,101,110,116, 10, 45, 45, 32, 79, 98,115, 58, 10, 45, 45, + 32, 32, 32,116,104,101, 32,108,101, 97,100,105,110,103, 32, 39, 47, 39, 32,105, +110, 32,123, 47, 60,112, 97,116,104, 62,125, 32,105,115, 32, 99,111,110,115,105, +100,101,114,101,100, 32,112, 97,114,116, 32,111,102, 32, 60,112, 97,116,104, 62, + 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,102, +117,110, 99,116,105,111,110, 32,112, 97,114,115,101, 40,117,114,108, 44, 32,100, +101,102, 97,117,108,116, 41, 10, 32, 32, 32, 32, 45, 45, 32,105,110,105,116,105, + 97,108,105,122,101, 32,100,101,102, 97,117,108,116, 32,112, 97,114, 97,109,101, +116,101,114,115, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,112, 97,114,115,101, +100, 32, 61, 32,123,125, 10, 32, 32, 32, 32,102,111,114, 32,105, 44,118, 32,105, +110, 32, 98, 97,115,101, 46,112, 97,105,114,115, 40,100,101,102, 97,117,108,116, + 32,111,114, 32,112, 97,114,115,101,100, 41, 32,100,111, 32,112, 97,114,115,101, +100, 91,105, 93, 32, 61, 32,118, 32,101,110,100, 10, 32, 32, 32, 32, 45, 45, 32, +101,109,112,116,121, 32,117,114,108, 32,105,115, 32,112, 97,114,115,101,100, 32, +116,111, 32,110,105,108, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32,117,114, +108, 32,111,114, 32,117,114,108, 32, 61, 61, 32, 34, 34, 32,116,104,101,110, 32, +114,101,116,117,114,110, 32,110,105,108, 44, 32, 34,105,110,118, 97,108,105,100, + 32,117,114,108, 34, 32,101,110,100, 10, 32, 32, 32, 32, 45, 45, 32,114,101,109, +111,118,101, 32,119,104,105,116,101,115,112, 97, 99,101, 10, 32, 32, 32, 32, 45, + 45, 32,117,114,108, 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40, +117,114,108, 44, 32, 34, 37,115, 34, 44, 32, 34, 34, 41, 10, 32, 32, 32, 32, 45, + 45, 32,103,101,116, 32,102,114, 97,103,109,101,110,116, 10, 32, 32, 32, 32,117, +114,108, 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,117,114,108, + 44, 32, 34, 35, 40, 46, 42, 41, 36, 34, 44, 32,102,117,110, 99,116,105,111,110, + 40,102, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,112, 97,114,115,101,100, 46,102, +114, 97,103,109,101,110,116, 32, 61, 32,102, 10, 32, 32, 32, 32, 32, 32, 32, 32, +114,101,116,117,114,110, 32, 34, 34, 10, 32, 32, 32, 32,101,110,100, 41, 10, 32, + 32, 32, 32, 45, 45, 32,103,101,116, 32,115, 99,104,101,109,101, 10, 32, 32, 32, + 32,117,114,108, 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,117, +114,108, 44, 32, 34, 94, 40, 91, 37,119, 93, 91, 37,119, 37, 43, 37, 45, 37, 46, + 93, 42, 41, 37, 58, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32,102,117,110, 99, +116,105,111,110, 40,115, 41, 32,112, 97,114,115,101,100, 46,115, 99,104,101,109, +101, 32, 61, 32,115, 59, 32,114,101,116,117,114,110, 32, 34, 34, 32,101,110,100, + 41, 10, 32, 32, 32, 32, 45, 45, 32,103,101,116, 32, 97,117,116,104,111,114,105, +116,121, 10, 32, 32, 32, 32,117,114,108, 32, 61, 32,115,116,114,105,110,103, 46, +103,115,117, 98, 40,117,114,108, 44, 32, 34, 94, 47, 47, 40, 91, 94, 47, 93, 42, + 41, 34, 44, 32,102,117,110, 99,116,105,111,110, 40,110, 41, 10, 32, 32, 32, 32, + 32, 32, 32, 32,112, 97,114,115,101,100, 46, 97,117,116,104,111,114,105,116,121, + 32, 61, 32,110, 10, 32, 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32, + 34, 34, 10, 32, 32, 32, 32,101,110,100, 41, 10, 32, 32, 32, 32, 45, 45, 32,103, +101,116, 32,113,117,101,114,121, 32,115,116,114,105,110,103,105,110,103, 10, 32, + 32, 32, 32,117,114,108, 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, + 40,117,114,108, 44, 32, 34, 37, 63, 40, 46, 42, 41, 34, 44, 32,102,117,110, 99, +116,105,111,110, 40,113, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,112, 97,114,115, +101,100, 46,113,117,101,114,121, 32, 61, 32,113, 10, 32, 32, 32, 32, 32, 32, 32, + 32,114,101,116,117,114,110, 32, 34, 34, 10, 32, 32, 32, 32,101,110,100, 41, 10, + 32, 32, 32, 32, 45, 45, 32,103,101,116, 32,112, 97,114, 97,109,115, 10, 32, 32, + 32, 32,117,114,108, 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40, +117,114,108, 44, 32, 34, 37, 59, 40, 46, 42, 41, 34, 44, 32,102,117,110, 99,116, +105,111,110, 40,112, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32,112, 97,114,115,101, +100, 46,112, 97,114, 97,109,115, 32, 61, 32,112, 10, 32, 32, 32, 32, 32, 32, 32, + 32,114,101,116,117,114,110, 32, 34, 34, 10, 32, 32, 32, 32,101,110,100, 41, 10, + 32, 32, 32, 32, 45, 45, 32,112, 97,116,104, 32,105,115, 32,119,104, 97,116,101, +118,101,114, 32,119, 97,115, 32,108,101,102,116, 10, 32, 32, 32, 32,105,102, 32, +117,114,108, 32,126, 61, 32, 34, 34, 32,116,104,101,110, 32,112, 97,114,115,101, +100, 46,112, 97,116,104, 32, 61, 32,117,114,108, 32,101,110,100, 10, 32, 32, 32, + 32,108,111, 99, 97,108, 32, 97,117,116,104,111,114,105,116,121, 32, 61, 32,112, + 97,114,115,101,100, 46, 97,117,116,104,111,114,105,116,121, 10, 32, 32, 32, 32, +105,102, 32,110,111,116, 32, 97,117,116,104,111,114,105,116,121, 32,116,104,101, +110, 32,114,101,116,117,114,110, 32,112, 97,114,115,101,100, 32,101,110,100, 10, + 32, 32, 32, 32, 97,117,116,104,111,114,105,116,121, 32, 61, 32,115,116,114,105, +110,103, 46,103,115,117, 98, 40, 97,117,116,104,111,114,105,116,121, 44, 34, 94, + 40, 91, 94, 64, 93, 42, 41, 64, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32,102, +117,110, 99,116,105,111,110, 40,117, 41, 32,112, 97,114,115,101,100, 46,117,115, +101,114,105,110,102,111, 32, 61, 32,117, 59, 32,114,101,116,117,114,110, 32, 34, + 34, 32,101,110,100, 41, 10, 32, 32, 32, 32, 97,117,116,104,111,114,105,116,121, + 32, 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40, 97,117,116,104,111, +114,105,116,121, 44, 32, 34, 58, 40, 91, 94, 58, 93, 42, 41, 36, 34, 44, 10, 32, + 32, 32, 32, 32, 32, 32, 32,102,117,110, 99,116,105,111,110, 40,112, 41, 32,112, + 97,114,115,101,100, 46,112,111,114,116, 32, 61, 32,112, 59, 32,114,101,116,117, +114,110, 32, 34, 34, 32,101,110,100, 41, 10, 32, 32, 32, 32,105,102, 32, 97,117, +116,104,111,114,105,116,121, 32,126, 61, 32, 34, 34, 32,116,104,101,110, 32,112, + 97,114,115,101,100, 46,104,111,115,116, 32, 61, 32, 97,117,116,104,111,114,105, +116,121, 32,101,110,100, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,117,115,101, +114,105,110,102,111, 32, 61, 32,112, 97,114,115,101,100, 46,117,115,101,114,105, +110,102,111, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32,117,115,101,114,105, +110,102,111, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,112, 97,114,115, +101,100, 32,101,110,100, 10, 32, 32, 32, 32,117,115,101,114,105,110,102,111, 32, + 61, 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,117,115,101,114,105,110, +102,111, 44, 32, 34, 58, 40, 91, 94, 58, 93, 42, 41, 36, 34, 44, 10, 32, 32, 32, + 32, 32, 32, 32, 32,102,117,110, 99,116,105,111,110, 40,112, 41, 32,112, 97,114, +115,101,100, 46,112, 97,115,115,119,111,114,100, 32, 61, 32,112, 59, 32,114,101, +116,117,114,110, 32, 34, 34, 32,101,110,100, 41, 10, 32, 32, 32, 32,112, 97,114, +115,101,100, 46,117,115,101,114, 32, 61, 32,117,115,101,114,105,110,102,111, 10, + 32, 32, 32, 32,114,101,116,117,114,110, 32,112, 97,114,115,101,100, 10,101,110, +100, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 10, 45, 45, 32, 82,101, 98,117,105,108,100,115, 32, 97, 32,112, 97,114,115,101, +100, 32, 85, 82, 76, 32,102,114,111,109, 32,105,116,115, 32, 99,111,109,112,111, +110,101,110,116,115, 46, 10, 45, 45, 32, 67,111,109,112,111,110,101,110,116,115, + 32, 97,114,101, 32,112,114,111,116,101, 99,116,101,100, 32,105,102, 32, 97,110, +121, 32,114,101,115,101,114,118,101,100, 32,111,114, 32,117,110, 97,108,108,111, +119,101,100, 32, 99,104, 97,114, 97, 99,116,101,114,115, 32, 97,114,101, 32,102, +111,117,110,100, 10, 45, 45, 32, 73,110,112,117,116, 10, 45, 45, 32, 32, 32,112, + 97,114,115,101,100, 58, 32,112, 97,114,115,101,100, 32, 85, 82, 76, 44, 32, 97, +115, 32,114,101,116,117,114,110,101,100, 32, 98,121, 32,112, 97,114,115,101, 10, + 45, 45, 32, 82,101,116,117,114,110,115, 10, 45, 45, 32, 32, 32, 97, 32,115,116, +114,105,110,103,105,110,103, 32,119,105,116,104, 32,116,104,101, 32, 99,111,114, +114,101,115,112,111,110,100,105,110,103, 32, 85, 82, 76, 10, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,102,117,110, 99,116,105,111, +110, 32, 98,117,105,108,100, 40,112, 97,114,115,101,100, 41, 10, 32, 32, 32, 32, +108,111, 99, 97,108, 32,112,112, 97,116,104, 32, 61, 32,112, 97,114,115,101, 95, +112, 97,116,104, 40,112, 97,114,115,101,100, 46,112, 97,116,104, 32,111,114, 32, + 34, 34, 41, 10, 32, 32, 32, 32,108,111, 99, 97,108, 32,117,114,108, 32, 61, 32, + 98,117,105,108,100, 95,112, 97,116,104, 40,112,112, 97,116,104, 41, 10, 32, 32, + 32, 32,105,102, 32,112, 97,114,115,101,100, 46,112, 97,114, 97,109,115, 32,116, +104,101,110, 32,117,114,108, 32, 61, 32,117,114,108, 32, 46, 46, 32, 34, 59, 34, + 32, 46, 46, 32,112, 97,114,115,101,100, 46,112, 97,114, 97,109,115, 32,101,110, +100, 10, 32, 32, 32, 32,105,102, 32,112, 97,114,115,101,100, 46,113,117,101,114, +121, 32,116,104,101,110, 32,117,114,108, 32, 61, 32,117,114,108, 32, 46, 46, 32, + 34, 63, 34, 32, 46, 46, 32,112, 97,114,115,101,100, 46,113,117,101,114,121, 32, +101,110,100, 10, 9,108,111, 99, 97,108, 32, 97,117,116,104,111,114,105,116,121, + 32, 61, 32,112, 97,114,115,101,100, 46, 97,117,116,104,111,114,105,116,121, 10, + 9,105,102, 32,112, 97,114,115,101,100, 46,104,111,115,116, 32,116,104,101,110, + 10, 9, 9, 97,117,116,104,111,114,105,116,121, 32, 61, 32,112, 97,114,115,101, +100, 46,104,111,115,116, 10, 9, 9,105,102, 32,112, 97,114,115,101,100, 46,112, +111,114,116, 32,116,104,101,110, 32, 97,117,116,104,111,114,105,116,121, 32, 61, + 32, 97,117,116,104,111,114,105,116,121, 32, 46, 46, 32, 34, 58, 34, 32, 46, 46, + 32,112, 97,114,115,101,100, 46,112,111,114,116, 32,101,110,100, 10, 9, 9,108, +111, 99, 97,108, 32,117,115,101,114,105,110,102,111, 32, 61, 32,112, 97,114,115, +101,100, 46,117,115,101,114,105,110,102,111, 10, 9, 9,105,102, 32,112, 97,114, +115,101,100, 46,117,115,101,114, 32,116,104,101,110, 10, 9, 9, 9,117,115,101, +114,105,110,102,111, 32, 61, 32,112, 97,114,115,101,100, 46,117,115,101,114, 10, + 9, 9, 9,105,102, 32,112, 97,114,115,101,100, 46,112, 97,115,115,119,111,114, +100, 32,116,104,101,110, 10, 9, 9, 9, 9,117,115,101,114,105,110,102,111, 32, + 61, 32,117,115,101,114,105,110,102,111, 32, 46, 46, 32, 34, 58, 34, 32, 46, 46, + 32,112, 97,114,115,101,100, 46,112, 97,115,115,119,111,114,100, 10, 9, 9, 9, +101,110,100, 10, 9, 9,101,110,100, 10, 9, 9,105,102, 32,117,115,101,114,105, +110,102,111, 32,116,104,101,110, 32, 97,117,116,104,111,114,105,116,121, 32, 61, + 32,117,115,101,114,105,110,102,111, 32, 46, 46, 32, 34, 64, 34, 32, 46, 46, 32, + 97,117,116,104,111,114,105,116,121, 32,101,110,100, 10, 9,101,110,100, 10, 32, + 32, 32, 32,105,102, 32, 97,117,116,104,111,114,105,116,121, 32,116,104,101,110, + 32,117,114,108, 32, 61, 32, 34, 47, 47, 34, 32, 46, 46, 32, 97,117,116,104,111, +114,105,116,121, 32, 46, 46, 32,117,114,108, 32,101,110,100, 10, 32, 32, 32, 32, +105,102, 32,112, 97,114,115,101,100, 46,115, 99,104,101,109,101, 32,116,104,101, +110, 32,117,114,108, 32, 61, 32,112, 97,114,115,101,100, 46,115, 99,104,101,109, +101, 32, 46, 46, 32, 34, 58, 34, 32, 46, 46, 32,117,114,108, 32,101,110,100, 10, + 32, 32, 32, 32,105,102, 32,112, 97,114,115,101,100, 46,102,114, 97,103,109,101, +110,116, 32,116,104,101,110, 32,117,114,108, 32, 61, 32,117,114,108, 32, 46, 46, + 32, 34, 35, 34, 32, 46, 46, 32,112, 97,114,115,101,100, 46,102,114, 97,103,109, +101,110,116, 32,101,110,100, 10, 32, 32, 32, 32, 45, 45, 32,117,114,108, 32, 61, + 32,115,116,114,105,110,103, 46,103,115,117, 98, 40,117,114,108, 44, 32, 34, 37, +115, 34, 44, 32, 34, 34, 41, 10, 32, 32, 32, 32,114,101,116,117,114,110, 32,117, +114,108, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 10, 45, 45, 32, 66,117,105,108,100,115, 32, 97, 32, 97, 98, +115,111,108,117,116,101, 32, 85, 82, 76, 32,102,114,111,109, 32, 97, 32, 98, 97, +115,101, 32, 97,110,100, 32, 97, 32,114,101,108, 97,116,105,118,101, 32, 85, 82, + 76, 32, 97, 99, 99,111,114,100,105,110,103, 32,116,111, 32, 82, 70, 67, 32, 50, + 51, 57, 54, 10, 45, 45, 32, 73,110,112,117,116, 10, 45, 45, 32, 32, 32, 98, 97, +115,101, 95,117,114,108, 10, 45, 45, 32, 32, 32,114,101,108, 97,116,105,118,101, + 95,117,114,108, 10, 45, 45, 32, 82,101,116,117,114,110,115, 10, 45, 45, 32, 32, + 32, 99,111,114,114,101,115,112,111,110,100,105,110,103, 32, 97, 98,115,111,108, +117,116,101, 32,117,114,108, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 10,102,117,110, 99,116,105,111,110, 32, 97, 98,115,111,108, +117,116,101, 40, 98, 97,115,101, 95,117,114,108, 44, 32,114,101,108, 97,116,105, +118,101, 95,117,114,108, 41, 10, 32, 32, 32, 32,105,102, 32, 98, 97,115,101, 46, +116,121,112,101, 40, 98, 97,115,101, 95,117,114,108, 41, 32, 61, 61, 32, 34,116, + 97, 98,108,101, 34, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 98, + 97,115,101, 95,112, 97,114,115,101,100, 32, 61, 32, 98, 97,115,101, 95,117,114, +108, 10, 32, 32, 32, 32, 32, 32, 32, 32, 98, 97,115,101, 95,117,114,108, 32, 61, + 32, 98,117,105,108,100, 40, 98, 97,115,101, 95,112, 97,114,115,101,100, 41, 10, + 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32, 98, 97,115, +101, 95,112, 97,114,115,101,100, 32, 61, 32,112, 97,114,115,101, 40, 98, 97,115, +101, 95,117,114,108, 41, 10, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32,108, +111, 99, 97,108, 32,114,101,108, 97,116,105,118,101, 95,112, 97,114,115,101,100, + 32, 61, 32,112, 97,114,115,101, 40,114,101,108, 97,116,105,118,101, 95,117,114, +108, 41, 10, 32, 32, 32, 32,105,102, 32,110,111,116, 32, 98, 97,115,101, 95,112, + 97,114,115,101,100, 32,116,104,101,110, 32,114,101,116,117,114,110, 32,114,101, +108, 97,116,105,118,101, 95,117,114,108, 10, 32, 32, 32, 32,101,108,115,101,105, +102, 32,110,111,116, 32,114,101,108, 97,116,105,118,101, 95,112, 97,114,115,101, +100, 32,116,104,101,110, 32,114,101,116,117,114,110, 32, 98, 97,115,101, 95,117, +114,108, 10, 32, 32, 32, 32,101,108,115,101,105,102, 32,114,101,108, 97,116,105, +118,101, 95,112, 97,114,115,101,100, 46,115, 99,104,101,109,101, 32,116,104,101, +110, 32,114,101,116,117,114,110, 32,114,101,108, 97,116,105,118,101, 95,117,114, +108, 10, 32, 32, 32, 32,101,108,115,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,114, +101,108, 97,116,105,118,101, 95,112, 97,114,115,101,100, 46,115, 99,104,101,109, +101, 32, 61, 32, 98, 97,115,101, 95,112, 97,114,115,101,100, 46,115, 99,104,101, +109,101, 10, 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32,114,101, +108, 97,116,105,118,101, 95,112, 97,114,115,101,100, 46, 97,117,116,104,111,114, +105,116,121, 32,116,104,101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32,114,101,108, 97,116,105,118,101, 95,112, 97,114,115,101,100, 46, 97,117,116, +104,111,114,105,116,121, 32, 61, 32, 98, 97,115,101, 95,112, 97,114,115,101,100, + 46, 97,117,116,104,111,114,105,116,121, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,105,102, 32,110,111,116, 32,114,101,108, 97,116,105,118,101, 95,112, + 97,114,115,101,100, 46,112, 97,116,104, 32,116,104,101,110, 10, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,114,101,108, 97,116,105,118,101, + 95,112, 97,114,115,101,100, 46,112, 97,116,104, 32, 61, 32, 98, 97,115,101, 95, +112, 97,114,115,101,100, 46,112, 97,116,104, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32,114,101,108, 97,116, +105,118,101, 95,112, 97,114,115,101,100, 46,112, 97,114, 97,109,115, 32,116,104, +101,110, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,114,101,108, 97,116,105,118,101, 95,112, 97,114,115,101,100, 46,112, + 97,114, 97,109,115, 32, 61, 32, 98, 97,115,101, 95,112, 97,114,115,101,100, 46, +112, 97,114, 97,109,115, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,105,102, 32,110,111,116, 32,114,101,108, 97,116,105, +118,101, 95,112, 97,114,115,101,100, 46,113,117,101,114,121, 32,116,104,101,110, + 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32,114,101,108, 97,116,105,118,101, 95,112, 97,114,115,101,100, + 46,113,117,101,114,121, 32, 61, 32, 98, 97,115,101, 95,112, 97,114,115,101,100, + 46,113,117,101,114,121, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,101,108,115,101, 32, 32, 32, 32, 10, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32,114,101,108, 97,116,105,118,101, 95,112, 97,114, +115,101,100, 46,112, 97,116,104, 32, 61, 32, 97, 98,115,111,108,117,116,101, 95, +112, 97,116,104, 40, 98, 97,115,101, 95,112, 97,114,115,101,100, 46,112, 97,116, +104, 32,111,114, 32, 34, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32,114,101,108, 97,116,105,118,101, 95,112, 97, +114,115,101,100, 46,112, 97,116,104, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32,101,110,100, 10, 32, 32, 32, 32, 32, 32, 32, 32,101,110,100, 10, 32, + 32, 32, 32, 32, 32, 32, 32,114,101,116,117,114,110, 32, 98,117,105,108,100, 40, +114,101,108, 97,116,105,118,101, 95,112, 97,114,115,101,100, 41, 10, 32, 32, 32, + 32,101,110,100, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 10, 45, 45, 32, 66,114,101, 97,107,115, 32, 97, 32, +112, 97,116,104, 32,105,110,116,111, 32,105,116,115, 32,115,101,103,109,101,110, +116,115, 44, 32,117,110,101,115, 99, 97,112,105,110,103, 32,116,104,101, 32,115, +101,103,109,101,110,116,115, 10, 45, 45, 32, 73,110,112,117,116, 10, 45, 45, 32, + 32, 32,112, 97,116,104, 10, 45, 45, 32, 82,101,116,117,114,110,115, 10, 45, 45, + 32, 32, 32,115,101,103,109,101,110,116, 58, 32, 97, 32,116, 97, 98,108,101, 32, +119,105,116,104, 32,111,110,101, 32,101,110,116,114,121, 32,112,101,114, 32,115, +101,103,109,101,110,116, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 10,102,117,110, 99,116,105,111,110, 32,112, 97,114,115,101, 95, +112, 97,116,104, 40,112, 97,116,104, 41, 10, 9,108,111, 99, 97,108, 32,112, 97, +114,115,101,100, 32, 61, 32,123,125, 10, 9,112, 97,116,104, 32, 61, 32,112, 97, +116,104, 32,111,114, 32, 34, 34, 10, 9, 45, 45,112, 97,116,104, 32, 61, 32,115, +116,114,105,110,103, 46,103,115,117, 98, 40,112, 97,116,104, 44, 32, 34, 37,115, + 34, 44, 32, 34, 34, 41, 10, 9,115,116,114,105,110,103, 46,103,115,117, 98, 40, +112, 97,116,104, 44, 32, 34, 40, 91, 94, 47, 93, 43, 41, 34, 44, 32,102,117,110, + 99,116,105,111,110, 32, 40,115, 41, 32,116, 97, 98,108,101, 46,105,110,115,101, +114,116, 40,112, 97,114,115,101,100, 44, 32,115, 41, 32,101,110,100, 41, 10, 9, +102,111,114, 32,105, 32, 61, 32, 49, 44, 32,116, 97, 98,108,101, 46,103,101,116, +110, 40,112, 97,114,115,101,100, 41, 32,100,111, 10, 9, 9,112, 97,114,115,101, +100, 91,105, 93, 32, 61, 32,117,110,101,115, 99, 97,112,101, 40,112, 97,114,115, +101,100, 91,105, 93, 41, 10, 9,101,110,100, 10, 9,105,102, 32,115,116,114,105, +110,103, 46,115,117, 98, 40,112, 97,116,104, 44, 32, 49, 44, 32, 49, 41, 32, 61, + 61, 32, 34, 47, 34, 32,116,104,101,110, 32,112, 97,114,115,101,100, 46,105,115, + 95, 97, 98,115,111,108,117,116,101, 32, 61, 32, 49, 32,101,110,100, 10, 9,105, +102, 32,115,116,114,105,110,103, 46,115,117, 98, 40,112, 97,116,104, 44, 32, 45, + 49, 44, 32, 45, 49, 41, 32, 61, 61, 32, 34, 47, 34, 32,116,104,101,110, 32,112, + 97,114,115,101,100, 46,105,115, 95,100,105,114,101, 99,116,111,114,121, 32, 61, + 32, 49, 32,101,110,100, 10, 9,114,101,116,117,114,110, 32,112, 97,114,115,101, +100, 10,101,110,100, 10, 10, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 10, 45, 45, 32, 66,117,105,108,100,115, 32, 97, 32,112, 97,116, +104, 32, 99,111,109,112,111,110,101,110,116, 32,102,114,111,109, 32,105,116,115, + 32,115,101,103,109,101,110,116,115, 44, 32,101,115, 99, 97,112,105,110,103, 32, +112,114,111,116,101, 99,116,101,100, 32, 99,104, 97,114, 97, 99,116,101,114,115, + 46, 10, 45, 45, 32, 73,110,112,117,116, 10, 45, 45, 32, 32, 32,112, 97,114,115, +101,100, 58, 32,112, 97,116,104, 32,115,101,103,109,101,110,116,115, 10, 45, 45, + 32, 32, 32,117,110,115, 97,102,101, 58, 32,105,102, 32,116,114,117,101, 44, 32, +115,101,103,109,101,110,116,115, 32, 97,114,101, 32,110,111,116, 32,112,114,111, +116,101, 99,116,101,100, 32, 98,101,102,111,114,101, 32,112, 97,116,104, 32,105, +115, 32, 98,117,105,108,116, 10, 45, 45, 32, 82,101,116,117,114,110,115, 10, 45, + 45, 32, 32, 32,112, 97,116,104, 58, 32, 99,111,114,114,101,115,112,111,110,100, +105,110,103, 32,112, 97,116,104, 32,115,116,114,105,110,103,105,110,103, 10, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 10,102,117,110, + 99,116,105,111,110, 32, 98,117,105,108,100, 95,112, 97,116,104, 40,112, 97,114, +115,101,100, 44, 32,117,110,115, 97,102,101, 41, 10, 9,108,111, 99, 97,108, 32, +112, 97,116,104, 32, 61, 32, 34, 34, 10, 9,108,111, 99, 97,108, 32,110, 32, 61, + 32,116, 97, 98,108,101, 46,103,101,116,110, 40,112, 97,114,115,101,100, 41, 10, + 9,105,102, 32,117,110,115, 97,102,101, 32,116,104,101,110, 10, 9, 9,102,111, +114, 32,105, 32, 61, 32, 49, 44, 32,110, 45, 49, 32,100,111, 10, 9, 9, 9,112, + 97,116,104, 32, 61, 32,112, 97,116,104, 32, 46, 46, 32,112, 97,114,115,101,100, + 91,105, 93, 10, 9, 9, 9,112, 97,116,104, 32, 61, 32,112, 97,116,104, 32, 46, + 46, 32, 34, 47, 34, 10, 9, 9,101,110,100, 10, 9, 9,105,102, 32,110, 32, 62, + 32, 48, 32,116,104,101,110, 10, 9, 9, 9,112, 97,116,104, 32, 61, 32,112, 97, +116,104, 32, 46, 46, 32,112, 97,114,115,101,100, 91,110, 93, 10, 9, 9, 9,105, +102, 32,112, 97,114,115,101,100, 46,105,115, 95,100,105,114,101, 99,116,111,114, +121, 32,116,104,101,110, 32,112, 97,116,104, 32, 61, 32,112, 97,116,104, 32, 46, + 46, 32, 34, 47, 34, 32,101,110,100, 10, 9, 9,101,110,100, 10, 9,101,108,115, +101, 10, 9, 9,102,111,114, 32,105, 32, 61, 32, 49, 44, 32,110, 45, 49, 32,100, +111, 10, 9, 9, 9,112, 97,116,104, 32, 61, 32,112, 97,116,104, 32, 46, 46, 32, +112,114,111,116,101, 99,116, 95,115,101,103,109,101,110,116, 40,112, 97,114,115, +101,100, 91,105, 93, 41, 10, 9, 9, 9,112, 97,116,104, 32, 61, 32,112, 97,116, +104, 32, 46, 46, 32, 34, 47, 34, 10, 9, 9,101,110,100, 10, 9, 9,105,102, 32, +110, 32, 62, 32, 48, 32,116,104,101,110, 10, 9, 9, 9,112, 97,116,104, 32, 61, + 32,112, 97,116,104, 32, 46, 46, 32,112,114,111,116,101, 99,116, 95,115,101,103, +109,101,110,116, 40,112, 97,114,115,101,100, 91,110, 93, 41, 10, 9, 9, 9,105, +102, 32,112, 97,114,115,101,100, 46,105,115, 95,100,105,114,101, 99,116,111,114, +121, 32,116,104,101,110, 32,112, 97,116,104, 32, 61, 32,112, 97,116,104, 32, 46, + 46, 32, 34, 47, 34, 32,101,110,100, 10, 9, 9,101,110,100, 10, 9,101,110,100, + 10, 9,105,102, 32,112, 97,114,115,101,100, 46,105,115, 95, 97, 98,115,111,108, +117,116,101, 32,116,104,101,110, 32,112, 97,116,104, 32, 61, 32, 34, 47, 34, 32, + 46, 46, 32,112, 97,116,104, 32,101,110,100, 10, 9,114,101,116,117,114,110, 32, +112, 97,116,104, 10,101,110,100, 10, +}; + + if (luaL_loadbuffer(L,(const char*)B1,sizeof(B1),"url.lua")==0) lua_call(L, 0, 0); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/usocket.c b/jni/love/src/libraries/luasocket/libluasocket/usocket.c new file mode 100644 index 00000000..70c6e1e3 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/usocket.c @@ -0,0 +1,370 @@ +/*=========================================================================*\ +* Socket compatibilization module for Unix +* LuaSocket toolkit +* +* The code is now interrupt-safe. +* The penalty of calling select to avoid busy-wait is only paid when +* the I/O call fail in the first place. +* +* RCS ID: $Id: usocket.c,v 1.38 2007/10/13 23:55:20 diego Exp $ +\*=========================================================================*/ +#include +#include + +#include "socket.h" + +/*-------------------------------------------------------------------------*\ +* Wait for readable/writable/connected socket with timeout +\*-------------------------------------------------------------------------*/ +#ifdef SOCKET_POLL +#include + +#define WAITFD_R POLLIN +#define WAITFD_W POLLOUT +#define WAITFD_C (POLLIN|POLLOUT) +int socket_waitfd(p_socket ps, int sw, p_timeout tm) { + int ret; + struct pollfd pfd; + pfd.fd = *ps; + pfd.events = sw; + pfd.revents = 0; + if (timeout_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ + do { + int t = (int)(timeout_getretry(tm)*1e3); + ret = poll(&pfd, 1, t >= 0? t: -1); + } while (ret == -1 && errno == EINTR); + if (ret == -1) return errno; + if (ret == 0) return IO_TIMEOUT; + if (sw == WAITFD_C && (pfd.revents & (POLLIN|POLLERR))) return IO_CLOSED; + return IO_DONE; +} +#else + +#define WAITFD_R 1 +#define WAITFD_W 2 +#define WAITFD_C (WAITFD_R|WAITFD_W) + +int socket_waitfd(p_socket ps, int sw, p_timeout tm) { + int ret; + fd_set rfds, wfds, *rp, *wp; + struct timeval tv, *tp; + double t; + if (timeout_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ + do { + /* must set bits within loop, because select may have modifed them */ + rp = wp = NULL; + if (sw & WAITFD_R) { FD_ZERO(&rfds); FD_SET(*ps, &rfds); rp = &rfds; } + if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(*ps, &wfds); wp = &wfds; } + t = timeout_getretry(tm); + tp = NULL; + if (t >= 0.0) { + tv.tv_sec = (int)t; + tv.tv_usec = (int)((t-tv.tv_sec)*1.0e6); + tp = &tv; + } + ret = select(*ps+1, rp, wp, NULL, tp); + } while (ret == -1 && errno == EINTR); + if (ret == -1) return errno; + if (ret == 0) return IO_TIMEOUT; + if (sw == WAITFD_C && FD_ISSET(*ps, &rfds)) return IO_CLOSED; + return IO_DONE; +} +#endif + + +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int socket_open(void) { + /* instals a handler to ignore sigpipe or it will crash us */ + signal(SIGPIPE, SIG_IGN); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Close module +\*-------------------------------------------------------------------------*/ +int socket_close(void) { + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Close and inutilize socket +\*-------------------------------------------------------------------------*/ +void socket_destroy(p_socket ps) { + if (*ps != SOCKET_INVALID) { + socket_setblocking(ps); + close(*ps); + *ps = SOCKET_INVALID; + } +} + +/*-------------------------------------------------------------------------*\ +* Select with timeout control +\*-------------------------------------------------------------------------*/ +int socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_set *efds, + p_timeout tm) { + int ret; + do { + struct timeval tv; + double t = timeout_getretry(tm); + tv.tv_sec = (int) t; + tv.tv_usec = (int) ((t - tv.tv_sec) * 1.0e6); + /* timeout = 0 means no wait */ + ret = select(n, rfds, wfds, efds, t >= 0.0 ? &tv: NULL); + } while (ret < 0 && errno == EINTR); + return ret; +} + +/*-------------------------------------------------------------------------*\ +* Creates and sets up a socket +\*-------------------------------------------------------------------------*/ +int socket_create(p_socket ps, int domain, int type, int protocol) { + *ps = socket(domain, type, protocol); + if (*ps != SOCKET_INVALID) return IO_DONE; + else return errno; +} + +/*-------------------------------------------------------------------------*\ +* Binds or returns error message +\*-------------------------------------------------------------------------*/ +int socket_bind(p_socket ps, SA *addr, socklen_t len) { + int err = IO_DONE; + socket_setblocking(ps); + if (bind(*ps, addr, len) < 0) err = errno; + socket_setnonblocking(ps); + return err; +} + +/*-------------------------------------------------------------------------*\ +* +\*-------------------------------------------------------------------------*/ +int socket_listen(p_socket ps, int backlog) { + int err = IO_DONE; + socket_setblocking(ps); + if (listen(*ps, backlog)) err = errno; + socket_setnonblocking(ps); + return err; +} + +/*-------------------------------------------------------------------------*\ +* +\*-------------------------------------------------------------------------*/ +void socket_shutdown(p_socket ps, int how) { + socket_setblocking(ps); + shutdown(*ps, how); + socket_setnonblocking(ps); +} + +/*-------------------------------------------------------------------------*\ +* Connects or returns error message +\*-------------------------------------------------------------------------*/ +int socket_connect(p_socket ps, SA *addr, socklen_t len, p_timeout tm) { + int err; + /* avoid calling on closed sockets */ + if (*ps == SOCKET_INVALID) return IO_CLOSED; + /* call connect until done or failed without being interrupted */ + do if (connect(*ps, addr, len) == 0) return IO_DONE; + while ((err = errno) == EINTR); + /* if connection failed immediately, return error code */ + if (err != EINPROGRESS && err != EAGAIN) return err; + /* zero timeout case optimization */ + if (timeout_iszero(tm)) return IO_TIMEOUT; + /* wait until we have the result of the connection attempt or timeout */ + err = socket_waitfd(ps, WAITFD_C, tm); + if (err == IO_CLOSED) { + if (recv(*ps, (char *) &err, 0, 0) == 0) return IO_DONE; + else return errno; + } else return err; +} + +/*-------------------------------------------------------------------------*\ +* Accept with timeout +\*-------------------------------------------------------------------------*/ +int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, p_timeout tm) { + SA daddr; + socklen_t dlen = sizeof(daddr); + if (*ps == SOCKET_INVALID) return IO_CLOSED; + if (!addr) addr = &daddr; + if (!len) len = &dlen; + for ( ;; ) { + int err; + if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID) return IO_DONE; + err = errno; + if (err == EINTR) continue; + if (err != EAGAIN && err != ECONNABORTED) return err; + if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; + } + /* can't reach here */ + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Send with timeout +\*-------------------------------------------------------------------------*/ +int socket_send(p_socket ps, const char *data, size_t count, + size_t *sent, p_timeout tm) +{ + int err; + *sent = 0; + /* avoid making system calls on closed sockets */ + if (*ps == SOCKET_INVALID) return IO_CLOSED; + /* loop until we send something or we give up on error */ + for ( ;; ) { + long put = (long) send(*ps, data, count, 0); + /* if we sent anything, we are done */ + if (put > 0) { + *sent = put; + return IO_DONE; + } + err = errno; + /* send can't really return 0, but EPIPE means the connection was + closed */ + if (put == 0 || err == EPIPE) return IO_CLOSED; + /* we call was interrupted, just try again */ + if (err == EINTR) continue; + /* if failed fatal reason, report error */ + if (err != EAGAIN) return err; + /* wait until we can send something or we timeout */ + if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err; + } + /* can't reach here */ + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Sendto with timeout +\*-------------------------------------------------------------------------*/ +int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent, + SA *addr, socklen_t len, p_timeout tm) +{ + int err; + *sent = 0; + if (*ps == SOCKET_INVALID) return IO_CLOSED; + for ( ;; ) { + long put = (long) sendto(*ps, data, count, 0, addr, len); + if (put > 0) { + *sent = put; + return IO_DONE; + } + err = errno; + if (put == 0 || err == EPIPE) return IO_CLOSED; + if (err == EINTR) continue; + if (err != EAGAIN) return err; + if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err; + } + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Receive with timeout +\*-------------------------------------------------------------------------*/ +int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm) { + int err; + *got = 0; + if (*ps == SOCKET_INVALID) return IO_CLOSED; + for ( ;; ) { + long taken = (long) recv(*ps, data, count, 0); + if (taken > 0) { + *got = taken; + return IO_DONE; + } + err = errno; + if (taken == 0) return IO_CLOSED; + if (err == EINTR) continue; + if (err != EAGAIN) return err; + if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; + } + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Recvfrom with timeout +\*-------------------------------------------------------------------------*/ +int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, + SA *addr, socklen_t *len, p_timeout tm) { + int err; + *got = 0; + if (*ps == SOCKET_INVALID) return IO_CLOSED; + for ( ;; ) { + long taken = (long) recvfrom(*ps, data, count, 0, addr, len); + if (taken > 0) { + *got = taken; + return IO_DONE; + } + err = errno; + if (taken == 0) return IO_CLOSED; + if (err == EINTR) continue; + if (err != EAGAIN) return err; + if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; + } + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Put socket into blocking mode +\*-------------------------------------------------------------------------*/ +void socket_setblocking(p_socket ps) { + int flags = fcntl(*ps, F_GETFL, 0); + flags &= (~(O_NONBLOCK)); + fcntl(*ps, F_SETFL, flags); +} + +/*-------------------------------------------------------------------------*\ +* Put socket into non-blocking mode +\*-------------------------------------------------------------------------*/ +void socket_setnonblocking(p_socket ps) { + int flags = fcntl(*ps, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(*ps, F_SETFL, flags); +} + +/*-------------------------------------------------------------------------*\ +* DNS helpers +\*-------------------------------------------------------------------------*/ +int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) { + *hp = gethostbyaddr(addr, len, AF_INET); + if (*hp) return IO_DONE; + else if (h_errno) return h_errno; + else if (errno) return errno; + else return IO_UNKNOWN; +} + +int socket_gethostbyname(const char *addr, struct hostent **hp) { + *hp = gethostbyname(addr); + if (*hp) return IO_DONE; + else if (h_errno) return h_errno; + else if (errno) return errno; + else return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Error translation functions +* Make sure important error messages are standard +\*-------------------------------------------------------------------------*/ +const char *socket_hoststrerror(int err) { + if (err <= 0) return io_strerror(err); + switch (err) { + case HOST_NOT_FOUND: return "host not found"; + default: return hstrerror(err); + } +} + +const char *socket_strerror(int err) { + if (err <= 0) return io_strerror(err); + switch (err) { + case EADDRINUSE: return "address already in use"; + case EISCONN: return "already connected"; + case EACCES: return "permission denied"; + case ECONNREFUSED: return "connection refused"; + case ECONNABORTED: return "closed"; + case ECONNRESET: return "closed"; + case ETIMEDOUT: return "timeout"; + default: return strerror(errno); + } +} + +const char *socket_ioerror(p_socket ps, int err) { + (void) ps; + return socket_strerror(err); +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/usocket.h b/jni/love/src/libraries/luasocket/libluasocket/usocket.h new file mode 100644 index 00000000..f2a89aa0 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/usocket.h @@ -0,0 +1,40 @@ +#ifndef USOCKET_H +#define USOCKET_H +/*=========================================================================*\ +* Socket compatibilization module for Unix +* LuaSocket toolkit +* +* RCS ID: $Id: usocket.h,v 1.7 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ + +/*=========================================================================*\ +* BSD include files +\*=========================================================================*/ +/* error codes */ +#include +/* close function */ +#include +/* fnctnl function and associated constants */ +#include +/* struct sockaddr */ +#include +/* socket function */ +#include +/* struct timeval */ +#include +/* gethostbyname and gethostbyaddr functions */ +#include +/* sigpipe handling */ +#include +/* IP stuff*/ +#include +#include +/* TCP options (nagle algorithm disable) */ +#include + +typedef int t_socket; +typedef t_socket *p_socket; + +#define SOCKET_INVALID (-1) + +#endif /* USOCKET_H */ diff --git a/jni/love/src/libraries/luasocket/libluasocket/wsocket.c b/jni/love/src/libraries/luasocket/libluasocket/wsocket.c new file mode 100644 index 00000000..60225651 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/wsocket.c @@ -0,0 +1,401 @@ +/*=========================================================================*\ +* Socket compatibilization module for Win32 +* LuaSocket toolkit +* +* The penalty of calling select to avoid busy-wait is only paid when +* the I/O call fail in the first place. +* +* RCS ID: $Id: wsocket.c,v 1.36 2007/06/11 23:44:54 diego Exp $ +\*=========================================================================*/ +#include + +#include "socket.h" + +/* WinSock doesn't have a strerror... */ +static const char *wstrerror(int err); + +/*-------------------------------------------------------------------------*\ +* Initializes module +\*-------------------------------------------------------------------------*/ +int socket_open(void) { + WSADATA wsaData; + WORD wVersionRequested = MAKEWORD(2, 0); + int err = WSAStartup(wVersionRequested, &wsaData ); + if (err != 0) return 0; + if ((LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0) && + (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)) { + WSACleanup(); + return 0; + } + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Close module +\*-------------------------------------------------------------------------*/ +int socket_close(void) { + WSACleanup(); + return 1; +} + +/*-------------------------------------------------------------------------*\ +* Wait for readable/writable/connected socket with timeout +\*-------------------------------------------------------------------------*/ +#define WAITFD_R 1 +#define WAITFD_W 2 +#define WAITFD_E 4 +#define WAITFD_C (WAITFD_E|WAITFD_W) + +int socket_waitfd(p_socket ps, int sw, p_timeout tm) { + int ret; + fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL; + struct timeval tv, *tp = NULL; + double t; + if (timeout_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ + if (sw & WAITFD_R) { + FD_ZERO(&rfds); + FD_SET(*ps, &rfds); + rp = &rfds; + } + if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(*ps, &wfds); wp = &wfds; } + if (sw & WAITFD_C) { FD_ZERO(&efds); FD_SET(*ps, &efds); ep = &efds; } + if ((t = timeout_get(tm)) >= 0.0) { + tv.tv_sec = (int) t; + tv.tv_usec = (int) ((t-tv.tv_sec)*1.0e6); + tp = &tv; + } + ret = select(0, rp, wp, ep, tp); + if (ret == -1) return WSAGetLastError(); + if (ret == 0) return IO_TIMEOUT; + if (sw == WAITFD_C && FD_ISSET(*ps, &efds)) return IO_CLOSED; + return IO_DONE; +} + +/*-------------------------------------------------------------------------*\ +* Select with int timeout in ms +\*-------------------------------------------------------------------------*/ +int socket_select(t_socket n, fd_set *rfds, fd_set *wfds, fd_set *efds, + p_timeout tm) { + struct timeval tv; + double t = timeout_get(tm); + tv.tv_sec = (int) t; + tv.tv_usec = (int) ((t - tv.tv_sec) * 1.0e6); + if (n <= 0) { + Sleep((DWORD) (1000*t)); + return 0; + } else return select(0, rfds, wfds, efds, t >= 0.0? &tv: NULL); +} + +/*-------------------------------------------------------------------------*\ +* Close and inutilize socket +\*-------------------------------------------------------------------------*/ +void socket_destroy(p_socket ps) { + if (*ps != SOCKET_INVALID) { + socket_setblocking(ps); /* close can take a long time on WIN32 */ + closesocket(*ps); + *ps = SOCKET_INVALID; + } +} + +/*-------------------------------------------------------------------------*\ +* +\*-------------------------------------------------------------------------*/ +void socket_shutdown(p_socket ps, int how) { + socket_setblocking(ps); + shutdown(*ps, how); + socket_setnonblocking(ps); +} + +/*-------------------------------------------------------------------------*\ +* Creates and sets up a socket +\*-------------------------------------------------------------------------*/ +int socket_create(p_socket ps, int domain, int type, int protocol) { + *ps = socket(domain, type, protocol); + if (*ps != SOCKET_INVALID) return IO_DONE; + else return WSAGetLastError(); +} + +/*-------------------------------------------------------------------------*\ +* Connects or returns error message +\*-------------------------------------------------------------------------*/ +int socket_connect(p_socket ps, SA *addr, socklen_t len, p_timeout tm) { + int err; + /* don't call on closed socket */ + if (*ps == SOCKET_INVALID) return IO_CLOSED; + /* ask system to connect */ + if (connect(*ps, addr, len) == 0) return IO_DONE; + /* make sure the system is trying to connect */ + err = WSAGetLastError(); + if (err != WSAEWOULDBLOCK && err != WSAEINPROGRESS) return err; + /* zero timeout case optimization */ + if (timeout_iszero(tm)) return IO_TIMEOUT; + /* we wait until something happens */ + err = socket_waitfd(ps, WAITFD_C, tm); + if (err == IO_CLOSED) { + int len = sizeof(err); + /* give windows time to set the error (yes, disgusting) */ + Sleep(10); + /* find out why we failed */ + getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len); + /* we KNOW there was an error. if 'why' is 0, we will return + * "unknown error", but it's not really our fault */ + return err > 0? err: IO_UNKNOWN; + } else return err; + +} + +/*-------------------------------------------------------------------------*\ +* Binds or returns error message +\*-------------------------------------------------------------------------*/ +int socket_bind(p_socket ps, SA *addr, socklen_t len) { + int err = IO_DONE; + socket_setblocking(ps); + if (bind(*ps, addr, len) < 0) err = WSAGetLastError(); + socket_setnonblocking(ps); + return err; +} + +/*-------------------------------------------------------------------------*\ +* +\*-------------------------------------------------------------------------*/ +int socket_listen(p_socket ps, int backlog) { + int err = IO_DONE; + socket_setblocking(ps); + if (listen(*ps, backlog) < 0) err = WSAGetLastError(); + socket_setnonblocking(ps); + return err; +} + +/*-------------------------------------------------------------------------*\ +* Accept with timeout +\*-------------------------------------------------------------------------*/ +int socket_accept(p_socket ps, p_socket pa, SA *addr, socklen_t *len, + p_timeout tm) { + SA daddr; + socklen_t dlen = sizeof(daddr); + if (*ps == SOCKET_INVALID) return IO_CLOSED; + if (!addr) addr = &daddr; + if (!len) len = &dlen; + for ( ;; ) { + int err; + /* try to get client socket */ + if ((*pa = accept(*ps, addr, len)) != SOCKET_INVALID) return IO_DONE; + /* find out why we failed */ + err = WSAGetLastError(); + /* if we failed because there was no connectoin, keep trying */ + if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) return err; + /* call select to avoid busy wait */ + if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; + } + /* can't reach here */ + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Send with timeout +* On windows, if you try to send 10MB, the OS will buffer EVERYTHING +* this can take an awful lot of time and we will end up blocked. +* Therefore, whoever calls this function should not pass a huge buffer. +\*-------------------------------------------------------------------------*/ +int socket_send(p_socket ps, const char *data, size_t count, + size_t *sent, p_timeout tm) +{ + int err; + *sent = 0; + /* avoid making system calls on closed sockets */ + if (*ps == SOCKET_INVALID) return IO_CLOSED; + /* loop until we send something or we give up on error */ + for ( ;; ) { + /* try to send something */ + int put = send(*ps, data, (int) count, 0); + /* if we sent something, we are done */ + if (put > 0) { + *sent = put; + return IO_DONE; + } + /* deal with failure */ + err = WSAGetLastError(); + /* we can only proceed if there was no serious error */ + if (err != WSAEWOULDBLOCK) return err; + /* avoid busy wait */ + if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err; + } + /* can't reach here */ + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Sendto with timeout +\*-------------------------------------------------------------------------*/ +int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent, + SA *addr, socklen_t len, p_timeout tm) +{ + int err; + *sent = 0; + if (*ps == SOCKET_INVALID) return IO_CLOSED; + for ( ;; ) { + int put = sendto(*ps, data, (int) count, 0, addr, len); + if (put > 0) { + *sent = put; + return IO_DONE; + } + err = WSAGetLastError(); + if (err != WSAEWOULDBLOCK) return err; + if ((err = socket_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err; + } + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Receive with timeout +\*-------------------------------------------------------------------------*/ +int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm) { + int err; + *got = 0; + if (*ps == SOCKET_INVALID) return IO_CLOSED; + for ( ;; ) { + int taken = recv(*ps, data, (int) count, 0); + if (taken > 0) { + *got = taken; + return IO_DONE; + } + if (taken == 0) return IO_CLOSED; + err = WSAGetLastError(); + if (err != WSAEWOULDBLOCK) return err; + if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; + } + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Recvfrom with timeout +\*-------------------------------------------------------------------------*/ +int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, + SA *addr, socklen_t *len, p_timeout tm) { + int err; + *got = 0; + if (*ps == SOCKET_INVALID) return IO_CLOSED; + for ( ;; ) { + int taken = recvfrom(*ps, data, (int) count, 0, addr, len); + if (taken > 0) { + *got = taken; + return IO_DONE; + } + if (taken == 0) return IO_CLOSED; + err = WSAGetLastError(); + if (err != WSAEWOULDBLOCK) return err; + if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; + } + return IO_UNKNOWN; +} + +/*-------------------------------------------------------------------------*\ +* Put socket into blocking mode +\*-------------------------------------------------------------------------*/ +void socket_setblocking(p_socket ps) { + u_long argp = 0; + ioctlsocket(*ps, FIONBIO, &argp); +} + +/*-------------------------------------------------------------------------*\ +* Put socket into non-blocking mode +\*-------------------------------------------------------------------------*/ +void socket_setnonblocking(p_socket ps) { + u_long argp = 1; + ioctlsocket(*ps, FIONBIO, &argp); +} + +/*-------------------------------------------------------------------------*\ +* DNS helpers +\*-------------------------------------------------------------------------*/ +int socket_gethostbyaddr(const char *addr, socklen_t len, struct hostent **hp) { + *hp = gethostbyaddr(addr, len, AF_INET); + if (*hp) return IO_DONE; + else return WSAGetLastError(); +} + +int socket_gethostbyname(const char *addr, struct hostent **hp) { + *hp = gethostbyname(addr); + if (*hp) return IO_DONE; + else return WSAGetLastError(); +} + +/*-------------------------------------------------------------------------*\ +* Error translation functions +\*-------------------------------------------------------------------------*/ +const char *socket_hoststrerror(int err) { + if (err <= 0) return io_strerror(err); + switch (err) { + case WSAHOST_NOT_FOUND: return "host not found"; + default: return wstrerror(err); + } +} + +const char *socket_strerror(int err) { + if (err <= 0) return io_strerror(err); + switch (err) { + case WSAEADDRINUSE: return "address already in use"; + case WSAECONNREFUSED: return "connection refused"; + case WSAEISCONN: return "already connected"; + case WSAEACCES: return "permission denied"; + case WSAECONNABORTED: return "closed"; + case WSAECONNRESET: return "closed"; + case WSAETIMEDOUT: return "timeout"; + default: return wstrerror(err); + } +} + +const char *socket_ioerror(p_socket ps, int err) { + (void) ps; + return socket_strerror(err); +} + +static const char *wstrerror(int err) { + switch (err) { + case WSAEINTR: return "Interrupted function call"; + case WSAEACCES: return "Permission denied"; + case WSAEFAULT: return "Bad address"; + case WSAEINVAL: return "Invalid argument"; + case WSAEMFILE: return "Too many open files"; + case WSAEWOULDBLOCK: return "Resource temporarily unavailable"; + case WSAEINPROGRESS: return "Operation now in progress"; + case WSAEALREADY: return "Operation already in progress"; + case WSAENOTSOCK: return "Socket operation on nonsocket"; + case WSAEDESTADDRREQ: return "Destination address required"; + case WSAEMSGSIZE: return "Message too long"; + case WSAEPROTOTYPE: return "Protocol wrong type for socket"; + case WSAENOPROTOOPT: return "Bad protocol option"; + case WSAEPROTONOSUPPORT: return "Protocol not supported"; + case WSAESOCKTNOSUPPORT: return "Socket type not supported"; + case WSAEOPNOTSUPP: return "Operation not supported"; + case WSAEPFNOSUPPORT: return "Protocol family not supported"; + case WSAEAFNOSUPPORT: + return "Address family not supported by protocol family"; + case WSAEADDRINUSE: return "Address already in use"; + case WSAEADDRNOTAVAIL: return "Cannot assign requested address"; + case WSAENETDOWN: return "Network is down"; + case WSAENETUNREACH: return "Network is unreachable"; + case WSAENETRESET: return "Network dropped connection on reset"; + case WSAECONNABORTED: return "Software caused connection abort"; + case WSAECONNRESET: return "Connection reset by peer"; + case WSAENOBUFS: return "No buffer space available"; + case WSAEISCONN: return "Socket is already connected"; + case WSAENOTCONN: return "Socket is not connected"; + case WSAESHUTDOWN: return "Cannot send after socket shutdown"; + case WSAETIMEDOUT: return "Connection timed out"; + case WSAECONNREFUSED: return "Connection refused"; + case WSAEHOSTDOWN: return "Host is down"; + case WSAEHOSTUNREACH: return "No route to host"; + case WSAEPROCLIM: return "Too many processes"; + case WSASYSNOTREADY: return "Network subsystem is unavailable"; + case WSAVERNOTSUPPORTED: return "Winsock.dll version out of range"; + case WSANOTINITIALISED: + return "Successful WSAStartup not yet performed"; + case WSAEDISCON: return "Graceful shutdown in progress"; + case WSAHOST_NOT_FOUND: return "Host not found"; + case WSATRY_AGAIN: return "Nonauthoritative host not found"; + case WSANO_RECOVERY: return "Nonrecoverable name lookup error"; + case WSANO_DATA: return "Valid name, no data record of requested type"; + default: return "Unknown error"; + } +} diff --git a/jni/love/src/libraries/luasocket/libluasocket/wsocket.h b/jni/love/src/libraries/luasocket/libluasocket/wsocket.h new file mode 100644 index 00000000..b5366836 --- /dev/null +++ b/jni/love/src/libraries/luasocket/libluasocket/wsocket.h @@ -0,0 +1,21 @@ +#ifndef WSOCKET_H +#define WSOCKET_H +/*=========================================================================*\ +* Socket compatibilization module for Win32 +* LuaSocket toolkit +* +* RCS ID: $Id: wsocket.h,v 1.4 2005/10/07 04:40:59 diego Exp $ +\*=========================================================================*/ + +/*=========================================================================*\ +* WinSock include files +\*=========================================================================*/ +#include + +typedef int socklen_t; +typedef SOCKET t_socket; +typedef t_socket *p_socket; + +#define SOCKET_INVALID (INVALID_SOCKET) + +#endif /* WSOCKET_H */ diff --git a/jni/love/src/libraries/luasocket/luasocket.cpp b/jni/love/src/libraries/luasocket/luasocket.cpp new file mode 100644 index 00000000..7e467ad6 --- /dev/null +++ b/jni/love/src/libraries/luasocket/luasocket.cpp @@ -0,0 +1,121 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "luasocket.h" + +// LuaSocket +extern "C" { +#include "libluasocket/luasocket.h" +#include "libluasocket/mime.h" +} + +// Quick macro for adding functions to +// the preloder. +#define PRELOAD(name, function) \ + lua_getglobal(L, "package"); \ + lua_getfield(L, -1, "preload"); \ + lua_pushcfunction(L, function); \ + lua_setfield(L, -2, name); \ + lua_pop(L, 2); + +namespace love +{ +namespace luasocket +{ + +int __open(lua_State * L) +{ + + // Preload code from LuaSocket. + PRELOAD("socket.core", luaopen_socket_core); + PRELOAD("mime.core", luaopen_mime_core); + + PRELOAD("socket", __open_luasocket_socket); + PRELOAD("socket.ftp", __open_luasocket_ftp) + PRELOAD("socket.http", __open_luasocket_http); + PRELOAD("ltn12", __open_luasocket_ltn12); + PRELOAD("mime", __open_luasocket_mime) + PRELOAD("socket.smtp", __open_luasocket_smtp); + PRELOAD("socket.tp", __open_luasocket_tp) + PRELOAD("socket.url", __open_luasocket_url) + + // No need to register garbage collector function. + + return 0; +} + +int __open_luasocket_socket(lua_State * L) +{ + #include "libluasocket/socket.lua.h" + lua_getglobal(L, "socket"); + return 1; +} + +int __open_luasocket_ftp(lua_State * L) +{ + #include "libluasocket/ftp.lua.h" + lua_getglobal(L, "socket.ftp"); + return 1; +} + +int __open_luasocket_http(lua_State * L) +{ + #include "libluasocket/http.lua.h" + lua_getglobal(L, "socket.http"); + return 1; +} + +int __open_luasocket_ltn12(lua_State * L) +{ + #include "libluasocket/ltn12.lua.h" + lua_getglobal(L, "ltn12"); + return 1; +} + +int __open_luasocket_mime(lua_State * L) +{ + #include "libluasocket/mime.lua.h" + lua_getglobal(L, "mime"); + return 1; +} + +int __open_luasocket_smtp(lua_State * L) +{ + #include "libluasocket/smtp.lua.h" + lua_getglobal(L, "socket.smtp"); + return 1; +} + +int __open_luasocket_tp(lua_State * L) +{ + #include "libluasocket/tp.lua.h" + lua_getglobal(L, "socket.tp"); + return 1; +} + +int __open_luasocket_url(lua_State * L) +{ + #include "libluasocket/url.lua.h" + lua_getglobal(L, "socket.url"); + return 1; +} + +} // luasocket +} // love diff --git a/jni/love/src/libraries/luasocket/luasocket.h b/jni/love/src/libraries/luasocket/luasocket.h new file mode 100644 index 00000000..8f13cee3 --- /dev/null +++ b/jni/love/src/libraries/luasocket/luasocket.h @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_LUASOCKET_LUASOCKET_H +#define LOVE_LUASOCKET_LUASOCKET_H + +// LOVE +#include + +namespace love +{ +namespace luasocket +{ + +int __open(lua_State * L); + +// Loaders for all lua files. We want to be able +// to load these dynamically. (Identical in the LuaSocket +// documentation. These functions wrap the parsing of code, etc). +int __open_luasocket_socket(lua_State * L); +int __open_luasocket_ftp(lua_State * L); +int __open_luasocket_http(lua_State * L); +int __open_luasocket_ltn12(lua_State * L); +int __open_luasocket_mime(lua_State * L); +int __open_luasocket_smtp(lua_State * L); +int __open_luasocket_tp(lua_State * L); +int __open_luasocket_url(lua_State * L); + +} // luasocket +} // love + +#endif // LOVE_LUASOCKET_LUASOCKET_H diff --git a/jni/love/src/libraries/noise1234/simplexnoise1234.cpp b/jni/love/src/libraries/noise1234/simplexnoise1234.cpp new file mode 100644 index 00000000..d5d24bfa --- /dev/null +++ b/jni/love/src/libraries/noise1234/simplexnoise1234.cpp @@ -0,0 +1,470 @@ +// SimplexNoise1234 +// Copyright © 2003-2011, Stefan Gustavson +// +// Contact: stegu@itn.liu.se +// +// This library is public domain software, released by the author +// into the public domain in February 2011. You may do anything +// you like with it. You may even remove all attributions, +// but of course I'd appreciate it if you kept my name somewhere. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +/** \file + \brief Implements the SimplexNoise1234 class for producing Perlin simplex noise. + \author Stefan Gustavson (stegu@itn.liu.se) +*/ + +/* + * This implementation is "Simplex Noise" as presented by + * Ken Perlin at a relatively obscure and not often cited course + * session "Real-Time Shading" at Siggraph 2001 (before real + * time shading actually took on), under the title "hardware noise". + * The 3D function is numerically equivalent to his Java reference + * code available in the PDF course notes, although I re-implemented + * it from scratch to get more readable code. The 1D, 2D and 4D cases + * were implemented from scratch by me from Ken Perlin's text. + * + * This is a highly reusable class. It has no dependencies + * on any other file, apart from its own header file. + */ + + +#include "simplexnoise1234.h" + +#define FASTFLOOR(x) ( ((x)>0) ? ((int)x) : (((int)x)-1) ) + +//--------------------------------------------------------------------- +// Static data + +/* + * Permutation table. This is just a random jumble of all numbers 0-255, + * repeated twice to avoid wrapping the index at 255 for each lookup. + * This needs to be exactly the same for all instances on all platforms, + * so it's easiest to just keep it as static explicit data. + * This also removes the need for any initialisation of this class. + * + * Note that making this an int[] instead of a char[] might make the + * code run faster on platforms with a high penalty for unaligned single + * byte addressing. Intel x86 is generally single-byte-friendly, but + * some other CPUs are faster with 4-aligned reads. + * However, a char[] is smaller, which avoids cache trashing, and that + * is probably the most important aspect on most architectures. + * This array is accessed a *lot* by the noise functions. + * A vector-valued noise over 3D accesses it 96 times, and a + * float-valued 4D noise 64 times. We want this to fit in the cache! + */ +unsigned char SimplexNoise1234::perm[512] = {151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180, + 151,160,137,91,90,15, + 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, + 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, + 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, + 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, + 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, + 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, + 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, + 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, + 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, + 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, + 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 +}; + +//--------------------------------------------------------------------- + +/* + * Helper functions to compute gradients-dot-residualvectors (1D to 4D) + * Note that these generate gradients of more than unit length. To make + * a close match with the value range of classic Perlin noise, the final + * noise values need to be rescaled to fit nicely within [-1,1]. + * (The simplex noise functions as such also have different scaling.) + * Note also that these noise functions are the most practical and useful + * signed version of Perlin noise. To return values according to the + * RenderMan specification from the SL noise() and pnoise() functions, + * the noise values need to be scaled and offset to [0,1], like this: + * float SLnoise = (SimplexNoise1234::noise(x,y,z) + 1.0) * 0.5; + */ + +float SimplexNoise1234::grad( int hash, float x ) { + int h = hash & 15; + float grad = 1.0f + (h & 7); // Gradient value 1.0, 2.0, ..., 8.0 + if (h&8) grad = -grad; // Set a random sign for the gradient + return ( grad * x ); // Multiply the gradient with the distance +} + +float SimplexNoise1234::grad( int hash, float x, float y ) { + int h = hash & 7; // Convert low 3 bits of hash code + float u = h<4 ? x : y; // into 8 simple gradient directions, + float v = h<4 ? y : x; // and compute the dot product with (x,y). + return ((h&1)? -u : u) + ((h&2)? -2.0f*v : 2.0f*v); +} + +float SimplexNoise1234::grad( int hash, float x, float y , float z ) { + int h = hash & 15; // Convert low 4 bits of hash code into 12 simple + float u = h<8 ? x : y; // gradient directions, and compute dot product. + float v = h<4 ? y : h==12||h==14 ? x : z; // Fix repeats at h = 12 to 15 + return ((h&1)? -u : u) + ((h&2)? -v : v); +} + +float SimplexNoise1234::grad( int hash, float x, float y, float z, float t ) { + int h = hash & 31; // Convert low 5 bits of hash code into 32 simple + float u = h<24 ? x : y; // gradient directions, and compute dot product. + float v = h<16 ? y : z; + float w = h<8 ? z : t; + return ((h&1)? -u : u) + ((h&2)? -v : v) + ((h&4)? -w : w); +} + + // A lookup table to traverse the simplex around a given point in 4D. + // Details can be found where this table is used, in the 4D noise method. + /* TODO: This should not be required, backport it from Bill's GLSL code! */ + static unsigned char simplex[64][4] = { + {0,1,2,3},{0,1,3,2},{0,0,0,0},{0,2,3,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,2,3,0}, + {0,2,1,3},{0,0,0,0},{0,3,1,2},{0,3,2,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,3,2,0}, + {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, + {1,2,0,3},{0,0,0,0},{1,3,0,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,3,0,1},{2,3,1,0}, + {1,0,2,3},{1,0,3,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,0,3,1},{0,0,0,0},{2,1,3,0}, + {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, + {2,0,1,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,0,1,2},{3,0,2,1},{0,0,0,0},{3,1,2,0}, + {2,1,0,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,1,0,2},{0,0,0,0},{3,2,0,1},{3,2,1,0}}; + +// 1D simplex noise +float SimplexNoise1234::noise(float x) { + + int i0 = FASTFLOOR(x); + int i1 = i0 + 1; + float x0 = x - i0; + float x1 = x0 - 1.0f; + + float n0, n1; + + float t0 = 1.0f - x0*x0; +// if(t0 < 0.0f) t0 = 0.0f; + t0 *= t0; + n0 = t0 * t0 * grad(perm[i0 & 0xff], x0); + + float t1 = 1.0f - x1*x1; +// if(t1 < 0.0f) t1 = 0.0f; + t1 *= t1; + n1 = t1 * t1 * grad(perm[i1 & 0xff], x1); + // The maximum value of this noise is 8*(3/4)^4 = 2.53125 + // A factor of 0.395 will scale to fit exactly within [-1,1] + return 0.395f * (n0 + n1); + +} + +// 2D simplex noise +float SimplexNoise1234::noise(float x, float y) { + +#define F2 0.366025403 // F2 = 0.5*(sqrt(3.0)-1.0) +#define G2 0.211324865 // G2 = (3.0-Math.sqrt(3.0))/6.0 + + float n0, n1, n2; // Noise contributions from the three corners + + // Skew the input space to determine which simplex cell we're in + float s = (x+y)*F2; // Hairy factor for 2D + float xs = x + s; + float ys = y + s; + int i = FASTFLOOR(xs); + int j = FASTFLOOR(ys); + + float t = (float)(i+j)*G2; + float X0 = i-t; // Unskew the cell origin back to (x,y) space + float Y0 = j-t; + float x0 = x-X0; // The x,y distances from the cell origin + float y0 = y-Y0; + + // For the 2D case, the simplex shape is an equilateral triangle. + // Determine which simplex we are in. + int i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords + if(x0>y0) {i1=1; j1=0;} // lower triangle, XY order: (0,0)->(1,0)->(1,1) + else {i1=0; j1=1;} // upper triangle, YX order: (0,0)->(0,1)->(1,1) + + // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and + // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where + // c = (3-sqrt(3))/6 + + float x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords + float y1 = y0 - j1 + G2; + float x2 = x0 - 1.0f + 2.0f * G2; // Offsets for last corner in (x,y) unskewed coords + float y2 = y0 - 1.0f + 2.0f * G2; + + // Wrap the integer indices at 256, to avoid indexing perm[] out of bounds + int ii = i & 0xff; + int jj = j & 0xff; + + // Calculate the contribution from the three corners + float t0 = 0.5f - x0*x0-y0*y0; + if(t0 < 0.0f) n0 = 0.0f; + else { + t0 *= t0; + n0 = t0 * t0 * grad(perm[ii+perm[jj]], x0, y0); + } + + float t1 = 0.5f - x1*x1-y1*y1; + if(t1 < 0.0f) n1 = 0.0f; + else { + t1 *= t1; + n1 = t1 * t1 * grad(perm[ii+i1+perm[jj+j1]], x1, y1); + } + + float t2 = 0.5f - x2*x2-y2*y2; + if(t2 < 0.0f) n2 = 0.0f; + else { + t2 *= t2; + n2 = t2 * t2 * grad(perm[ii+1+perm[jj+1]], x2, y2); + } + + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 45.23f * (n0 + n1 + n2); // TODO: The scale factor is preliminary! + } + +// 3D simplex noise +float SimplexNoise1234::noise(float x, float y, float z) { + +// Simple skewing factors for the 3D case +#define F3 0.333333333 +#define G3 0.166666667 + + float n0, n1, n2, n3; // Noise contributions from the four corners + + // Skew the input space to determine which simplex cell we're in + float s = (x+y+z)*F3; // Very nice and simple skew factor for 3D + float xs = x+s; + float ys = y+s; + float zs = z+s; + int i = FASTFLOOR(xs); + int j = FASTFLOOR(ys); + int k = FASTFLOOR(zs); + + float t = (float)(i+j+k)*G3; + float X0 = i-t; // Unskew the cell origin back to (x,y,z) space + float Y0 = j-t; + float Z0 = k-t; + float x0 = x-X0; // The x,y,z distances from the cell origin + float y0 = y-Y0; + float z0 = z-Z0; + + // For the 3D case, the simplex shape is a slightly irregular tetrahedron. + // Determine which simplex we are in. + int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords + int i2, j2, k2; // Offsets for third corner of simplex in (i,j,k) coords + +/* This code would benefit from a backport from the GLSL version! */ + if(x0>=y0) { + if(y0>=z0) + { i1=1; j1=0; k1=0; i2=1; j2=1; k2=0; } // X Y Z order + else if(x0>=z0) { i1=1; j1=0; k1=0; i2=1; j2=0; k2=1; } // X Z Y order + else { i1=0; j1=0; k1=1; i2=1; j2=0; k2=1; } // Z X Y order + } + else { // x0 y0) ? 32 : 0; + int c2 = (x0 > z0) ? 16 : 0; + int c3 = (y0 > z0) ? 8 : 0; + int c4 = (x0 > w0) ? 4 : 0; + int c5 = (y0 > w0) ? 2 : 0; + int c6 = (z0 > w0) ? 1 : 0; + int c = c1 + c2 + c3 + c4 + c5 + c6; + + int i1, j1, k1, l1; // The integer offsets for the second simplex corner + int i2, j2, k2, l2; // The integer offsets for the third simplex corner + int i3, j3, k3, l3; // The integer offsets for the fourth simplex corner + + // simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order. + // Many values of c will never occur, since e.g. x>y>z>w makes x=3 ? 1 : 0; + j1 = simplex[c][1]>=3 ? 1 : 0; + k1 = simplex[c][2]>=3 ? 1 : 0; + l1 = simplex[c][3]>=3 ? 1 : 0; + // The number 2 in the "simplex" array is at the second largest coordinate. + i2 = simplex[c][0]>=2 ? 1 : 0; + j2 = simplex[c][1]>=2 ? 1 : 0; + k2 = simplex[c][2]>=2 ? 1 : 0; + l2 = simplex[c][3]>=2 ? 1 : 0; + // The number 1 in the "simplex" array is at the second smallest coordinate. + i3 = simplex[c][0]>=1 ? 1 : 0; + j3 = simplex[c][1]>=1 ? 1 : 0; + k3 = simplex[c][2]>=1 ? 1 : 0; + l3 = simplex[c][3]>=1 ? 1 : 0; + // The fifth corner has all coordinate offsets = 1, so no need to look that up. + + float x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords + float y1 = y0 - j1 + G4; + float z1 = z0 - k1 + G4; + float w1 = w0 - l1 + G4; + float x2 = x0 - i2 + 2.0f*G4; // Offsets for third corner in (x,y,z,w) coords + float y2 = y0 - j2 + 2.0f*G4; + float z2 = z0 - k2 + 2.0f*G4; + float w2 = w0 - l2 + 2.0f*G4; + float x3 = x0 - i3 + 3.0f*G4; // Offsets for fourth corner in (x,y,z,w) coords + float y3 = y0 - j3 + 3.0f*G4; + float z3 = z0 - k3 + 3.0f*G4; + float w3 = w0 - l3 + 3.0f*G4; + float x4 = x0 - 1.0f + 4.0f*G4; // Offsets for last corner in (x,y,z,w) coords + float y4 = y0 - 1.0f + 4.0f*G4; + float z4 = z0 - 1.0f + 4.0f*G4; + float w4 = w0 - 1.0f + 4.0f*G4; + + // Wrap the integer indices at 256, to avoid indexing perm[] out of bounds + int ii = i & 0xff; + int jj = j & 0xff; + int kk = k & 0xff; + int ll = l & 0xff; + + // Calculate the contribution from the five corners + float t0 = 0.6f - x0*x0 - y0*y0 - z0*z0 - w0*w0; + if(t0 < 0.0f) n0 = 0.0f; + else { + t0 *= t0; + n0 = t0 * t0 * grad(perm[ii+perm[jj+perm[kk+perm[ll]]]], x0, y0, z0, w0); + } + + float t1 = 0.6f - x1*x1 - y1*y1 - z1*z1 - w1*w1; + if(t1 < 0.0f) n1 = 0.0f; + else { + t1 *= t1; + n1 = t1 * t1 * grad(perm[ii+i1+perm[jj+j1+perm[kk+k1+perm[ll+l1]]]], x1, y1, z1, w1); + } + + float t2 = 0.6f - x2*x2 - y2*y2 - z2*z2 - w2*w2; + if(t2 < 0.0f) n2 = 0.0f; + else { + t2 *= t2; + n2 = t2 * t2 * grad(perm[ii+i2+perm[jj+j2+perm[kk+k2+perm[ll+l2]]]], x2, y2, z2, w2); + } + + float t3 = 0.6f - x3*x3 - y3*y3 - z3*z3 - w3*w3; + if(t3 < 0.0f) n3 = 0.0f; + else { + t3 *= t3; + n3 = t3 * t3 * grad(perm[ii+i3+perm[jj+j3+perm[kk+k3+perm[ll+l3]]]], x3, y3, z3, w3); + } + + float t4 = 0.6f - x4*x4 - y4*y4 - z4*z4 - w4*w4; + if(t4 < 0.0f) n4 = 0.0f; + else { + t4 *= t4; + n4 = t4 * t4 * grad(perm[ii+1+perm[jj+1+perm[kk+1+perm[ll+1]]]], x4, y4, z4, w4); + } + + // Sum up and scale the result to cover the range [-1,1] + return 27.3f * (n0 + n1 + n2 + n3 + n4); // TODO: The scale factor is preliminary! + } +//--------------------------------------------------------------------- diff --git a/jni/love/src/libraries/noise1234/simplexnoise1234.h b/jni/love/src/libraries/noise1234/simplexnoise1234.h new file mode 100644 index 00000000..1f74226c --- /dev/null +++ b/jni/love/src/libraries/noise1234/simplexnoise1234.h @@ -0,0 +1,60 @@ +// SimplexNoise1234 +// Copyright � 2003-2011, Stefan Gustavson +// +// Contact: stegu@itn.liu.se +// +// This library is public domain software, released by the author +// into the public domain in February 2011. You may do anything +// you like with it. You may even remove all attributions, +// but of course I'd appreciate it if you kept my name somewhere. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. + +/** \file + \brief Declares the SimplexNoise1234 class for producing Perlin simplex noise. + \author Stefan Gustavson (stegu@itn.liu.se) +*/ + +/* + * This is a clean, fast, modern and free Perlin Simplex noise class in C++. + * Being a stand-alone class with no external dependencies, it is + * highly reusable without source code modifications. + * + * + * Note: + * Replacing the "float" type with "double" can actually make this run faster + * on some platforms. A templatized version of SimplexNoise1234 could be useful. + */ + +class SimplexNoise1234 { + + public: + SimplexNoise1234() {} + ~SimplexNoise1234() {} + +/** 1D, 2D, 3D and 4D float Perlin noise + */ + static float noise( float x ); + static float noise( float x, float y ); + static float noise( float x, float y, float z ); + static float noise( float x, float y, float z, float w ); + +/** 1D, 2D, 3D and 4D float Perlin noise, with a specified integer period + */ + static float pnoise( float x, int px ); + static float pnoise( float x, float y, int px, int py ); + static float pnoise( float x, float y, float z, int px, int py, int pz ); + static float pnoise( float x, float y, float z, float w, + int px, int py, int pz, int pw ); + + private: + static unsigned char perm[]; + static float grad( int hash, float x ); + static float grad( int hash, float x, float y ); + static float grad( int hash, float x, float y , float z ); + static float grad( int hash, float x, float y, float z, float t ); + +}; diff --git a/jni/love/src/libraries/utf8/utf8.h b/jni/love/src/libraries/utf8/utf8.h new file mode 100644 index 00000000..4e445140 --- /dev/null +++ b/jni/love/src/libraries/utf8/utf8.h @@ -0,0 +1,34 @@ +// Copyright 2006 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 +#define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 + +#include "utf8/checked.h" +#include "utf8/unchecked.h" + +#endif // header guard diff --git a/jni/love/src/libraries/utf8/utf8/checked.h b/jni/love/src/libraries/utf8/utf8/checked.h new file mode 100644 index 00000000..13311551 --- /dev/null +++ b/jni/love/src/libraries/utf8/utf8/checked.h @@ -0,0 +1,327 @@ +// Copyright 2006 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 +#define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 + +#include "core.h" +#include + +namespace utf8 +{ + // Base for the exceptions that may be thrown from the library + class exception : public ::std::exception { + }; + + // Exceptions that may be thrown from the library functions. + class invalid_code_point : public exception { + uint32_t cp; + public: + invalid_code_point(uint32_t cp) : cp(cp) {} + virtual const char* what() const throw() { return "Invalid code point"; } + uint32_t code_point() const {return cp;} + }; + + class invalid_utf8 : public exception { + uint8_t u8; + public: + invalid_utf8 (uint8_t u) : u8(u) {} + virtual const char* what() const throw() { return "Invalid UTF-8"; } + uint8_t utf8_octet() const {return u8;} + }; + + class invalid_utf16 : public exception { + uint16_t u16; + public: + invalid_utf16 (uint16_t u) : u16(u) {} + virtual const char* what() const throw() { return "Invalid UTF-16"; } + uint16_t utf16_word() const {return u16;} + }; + + class not_enough_room : public exception { + public: + virtual const char* what() const throw() { return "Not enough space"; } + }; + + /// The library API - functions intended to be called by the users + + template + octet_iterator append(uint32_t cp, octet_iterator result) + { + if (!utf8::internal::is_code_point_valid(cp)) + throw invalid_code_point(cp); + + if (cp < 0x80) // one octet + *(result++) = static_cast(cp); + else if (cp < 0x800) { // two octets + *(result++) = static_cast((cp >> 6) | 0xc0); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + else if (cp < 0x10000) { // three octets + *(result++) = static_cast((cp >> 12) | 0xe0); + *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + else { // four octets + *(result++) = static_cast((cp >> 18) | 0xf0); + *(result++) = static_cast(((cp >> 12) & 0x3f) | 0x80); + *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + return result; + } + + template + output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) + { + while (start != end) { + octet_iterator sequence_start = start; + internal::utf_error err_code = utf8::internal::validate_next(start, end); + switch (err_code) { + case internal::UTF8_OK : + for (octet_iterator it = sequence_start; it != start; ++it) + *out++ = *it; + break; + case internal::NOT_ENOUGH_ROOM: + throw not_enough_room(); + case internal::INVALID_LEAD: + out = utf8::append (replacement, out); + ++start; + break; + case internal::INCOMPLETE_SEQUENCE: + case internal::OVERLONG_SEQUENCE: + case internal::INVALID_CODE_POINT: + out = utf8::append (replacement, out); + ++start; + // just one replacement mark for the sequence + while (start != end && utf8::internal::is_trail(*start)) + ++start; + break; + } + } + return out; + } + + template + inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) + { + static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); + return utf8::replace_invalid(start, end, out, replacement_marker); + } + + template + uint32_t next(octet_iterator& it, octet_iterator end) + { + uint32_t cp = 0; + internal::utf_error err_code = utf8::internal::validate_next(it, end, cp); + switch (err_code) { + case internal::UTF8_OK : + break; + case internal::NOT_ENOUGH_ROOM : + throw not_enough_room(); + case internal::INVALID_LEAD : + case internal::INCOMPLETE_SEQUENCE : + case internal::OVERLONG_SEQUENCE : + throw invalid_utf8(*it); + case internal::INVALID_CODE_POINT : + throw invalid_code_point(cp); + } + return cp; + } + + template + uint32_t peek_next(octet_iterator it, octet_iterator end) + { + return utf8::next(it, end); + } + + template + uint32_t prior(octet_iterator& it, octet_iterator start) + { + // can't do much if it == start + if (it == start) + throw not_enough_room(); + + octet_iterator end = it; + // Go back until we hit either a lead octet or start + while (utf8::internal::is_trail(*(--it))) + if (it == start) + throw invalid_utf8(*it); // error - no lead byte in the sequence + return utf8::peek_next(it, end); + } + + /// Deprecated in versions that include "prior" + template + uint32_t previous(octet_iterator& it, octet_iterator pass_start) + { + octet_iterator end = it; + while (utf8::internal::is_trail(*(--it))) + if (it == pass_start) + throw invalid_utf8(*it); // error - no lead byte in the sequence + octet_iterator temp = it; + return utf8::next(temp, end); + } + + template + void advance (octet_iterator& it, distance_type n, octet_iterator end) + { + for (distance_type i = 0; i < n; ++i) + utf8::next(it, end); + } + + template + typename std::iterator_traits::difference_type + distance (octet_iterator first, octet_iterator last) + { + typename std::iterator_traits::difference_type dist; + for (dist = 0; first < last; ++dist) + utf8::next(first, last); + return dist; + } + + template + octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) + { + while (start != end) { + uint32_t cp = utf8::internal::mask16(*start++); + // Take care of surrogate pairs first + if (utf8::internal::is_lead_surrogate(cp)) { + if (start != end) { + uint32_t trail_surrogate = utf8::internal::mask16(*start++); + if (utf8::internal::is_trail_surrogate(trail_surrogate)) + cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; + else + throw invalid_utf16(static_cast(trail_surrogate)); + } + else + throw invalid_utf16(static_cast(cp)); + + } + // Lone trail surrogate + else if (utf8::internal::is_trail_surrogate(cp)) + throw invalid_utf16(static_cast(cp)); + + result = utf8::append(cp, result); + } + return result; + } + + template + u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) + { + while (start != end) { + uint32_t cp = utf8::next(start, end); + if (cp > 0xffff) { //make a surrogate pair + *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); + *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); + } + else + *result++ = static_cast(cp); + } + return result; + } + + template + octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) + { + while (start != end) + result = utf8::append(*(start++), result); + + return result; + } + + template + u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) + { + while (start != end) + (*result++) = utf8::next(start, end); + + return result; + } + + // The iterator class + template + class iterator : public std::iterator { + octet_iterator it; + octet_iterator range_start; + octet_iterator range_end; + public: + iterator () {} + explicit iterator (const octet_iterator& octet_it, + const octet_iterator& range_start, + const octet_iterator& range_end) : + it(octet_it), range_start(range_start), range_end(range_end) + { + if (it < range_start || it > range_end) + throw std::out_of_range("Invalid utf-8 iterator position"); + } + // the default "big three" are OK + octet_iterator base () const { return it; } + uint32_t operator * () const + { + octet_iterator temp = it; + return utf8::next(temp, range_end); + } + bool operator == (const iterator& rhs) const + { + if (range_start != rhs.range_start || range_end != rhs.range_end) + throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); + return (it == rhs.it); + } + bool operator != (const iterator& rhs) const + { + return !(operator == (rhs)); + } + iterator& operator ++ () + { + utf8::next(it, range_end); + return *this; + } + iterator operator ++ (int) + { + iterator temp = *this; + utf8::next(it, range_end); + return temp; + } + iterator& operator -- () + { + utf8::prior(it, range_start); + return *this; + } + iterator operator -- (int) + { + iterator temp = *this; + utf8::prior(it, range_start); + return temp; + } + }; // class iterator + +} // namespace utf8 + +#endif //header guard + + diff --git a/jni/love/src/libraries/utf8/utf8/core.h b/jni/love/src/libraries/utf8/utf8/core.h new file mode 100644 index 00000000..693d388c --- /dev/null +++ b/jni/love/src/libraries/utf8/utf8/core.h @@ -0,0 +1,329 @@ +// Copyright 2006 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 +#define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 + +#include + +namespace utf8 +{ + // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers + // You may need to change them to match your system. + // These typedefs have the same names as ones from cstdint, or boost/cstdint + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; + +// Helper code - not intended to be directly called by the library users. May be changed at any time +namespace internal +{ + // Unicode constants + // Leading (high) surrogates: 0xd800 - 0xdbff + // Trailing (low) surrogates: 0xdc00 - 0xdfff + const uint16_t LEAD_SURROGATE_MIN = 0xd800u; + const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; + const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; + const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; + const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); + const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; + + // Maximum valid value for a Unicode code point + const uint32_t CODE_POINT_MAX = 0x0010ffffu; + + template + inline uint8_t mask8(octet_type oc) + { + return static_cast(0xff & oc); + } + template + inline uint16_t mask16(u16_type oc) + { + return static_cast(0xffff & oc); + } + template + inline bool is_trail(octet_type oc) + { + return ((utf8::internal::mask8(oc) >> 6) == 0x2); + } + + template + inline bool is_lead_surrogate(u16 cp) + { + return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); + } + + template + inline bool is_trail_surrogate(u16 cp) + { + return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); + } + + template + inline bool is_surrogate(u16 cp) + { + return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); + } + + template + inline bool is_code_point_valid(u32 cp) + { + return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp)); + } + + template + inline typename std::iterator_traits::difference_type + sequence_length(octet_iterator lead_it) + { + uint8_t lead = utf8::internal::mask8(*lead_it); + if (lead < 0x80) + return 1; + else if ((lead >> 5) == 0x6) + return 2; + else if ((lead >> 4) == 0xe) + return 3; + else if ((lead >> 3) == 0x1e) + return 4; + else + return 0; + } + + template + inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) + { + if (cp < 0x80) { + if (length != 1) + return true; + } + else if (cp < 0x800) { + if (length != 2) + return true; + } + else if (cp < 0x10000) { + if (length != 3) + return true; + } + + return false; + } + + enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; + + /// Helper for get_sequence_x + template + utf_error increase_safely(octet_iterator& it, octet_iterator end) + { + if (++it == end) + return NOT_ENOUGH_ROOM; + + if (!utf8::internal::is_trail(*it)) + return INCOMPLETE_SEQUENCE; + + return UTF8_OK; + } + + #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;} + + /// get_sequence_x functions decode utf-8 sequences of the length x + template + utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + if (it == end) + return NOT_ENOUGH_ROOM; + + code_point = utf8::internal::mask8(*it); + + return UTF8_OK; + } + + template + utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + if (it == end) + return NOT_ENOUGH_ROOM; + + code_point = utf8::internal::mask8(*it); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f); + + return UTF8_OK; + } + + template + utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + if (it == end) + return NOT_ENOUGH_ROOM; + + code_point = utf8::internal::mask8(*it); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point += (*it) & 0x3f; + + return UTF8_OK; + } + + template + utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + if (it == end) + return NOT_ENOUGH_ROOM; + + code_point = utf8::internal::mask8(*it); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point += (utf8::internal::mask8(*it) << 6) & 0xfff; + + UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) + + code_point += (*it) & 0x3f; + + return UTF8_OK; + } + + #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR + + template + utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) + { + // Save the original value of it so we can go back in case of failure + // Of course, it does not make much sense with i.e. stream iterators + octet_iterator original_it = it; + + uint32_t cp = 0; + // Determine the sequence length based on the lead octet + typedef typename std::iterator_traits::difference_type octet_difference_type; + const octet_difference_type length = utf8::internal::sequence_length(it); + + // Get trail octets and calculate the code point + utf_error err = UTF8_OK; + switch (length) { + case 0: + return INVALID_LEAD; + case 1: + err = utf8::internal::get_sequence_1(it, end, cp); + break; + case 2: + err = utf8::internal::get_sequence_2(it, end, cp); + break; + case 3: + err = utf8::internal::get_sequence_3(it, end, cp); + break; + case 4: + err = utf8::internal::get_sequence_4(it, end, cp); + break; + } + + if (err == UTF8_OK) { + // Decoding succeeded. Now, security checks... + if (utf8::internal::is_code_point_valid(cp)) { + if (!utf8::internal::is_overlong_sequence(cp, length)){ + // Passed! Return here. + code_point = cp; + ++it; + return UTF8_OK; + } + else + err = OVERLONG_SEQUENCE; + } + else + err = INVALID_CODE_POINT; + } + + // Failure branch - restore the original value of the iterator + it = original_it; + return err; + } + + template + inline utf_error validate_next(octet_iterator& it, octet_iterator end) { + uint32_t ignored; + return utf8::internal::validate_next(it, end, ignored); + } + +} // namespace internal + + /// The library API - functions intended to be called by the users + + // Byte order mark + const uint8_t bom[] = {0xef, 0xbb, 0xbf}; + + template + octet_iterator find_invalid(octet_iterator start, octet_iterator end) + { + octet_iterator result = start; + while (result != end) { + utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end); + if (err_code != internal::UTF8_OK) + return result; + } + return result; + } + + template + inline bool is_valid(octet_iterator start, octet_iterator end) + { + return (utf8::find_invalid(start, end) == end); + } + + template + inline bool starts_with_bom (octet_iterator it, octet_iterator end) + { + return ( + ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) && + ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && + ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) + ); + } + + //Deprecated in release 2.3 + template + inline bool is_bom (octet_iterator it) + { + return ( + (utf8::internal::mask8(*it++)) == bom[0] && + (utf8::internal::mask8(*it++)) == bom[1] && + (utf8::internal::mask8(*it)) == bom[2] + ); + } +} // namespace utf8 + +#endif // header guard + + diff --git a/jni/love/src/libraries/utf8/utf8/unchecked.h b/jni/love/src/libraries/utf8/utf8/unchecked.h new file mode 100644 index 00000000..cb242716 --- /dev/null +++ b/jni/love/src/libraries/utf8/utf8/unchecked.h @@ -0,0 +1,228 @@ +// Copyright 2006 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 +#define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 + +#include "core.h" + +namespace utf8 +{ + namespace unchecked + { + template + octet_iterator append(uint32_t cp, octet_iterator result) + { + if (cp < 0x80) // one octet + *(result++) = static_cast(cp); + else if (cp < 0x800) { // two octets + *(result++) = static_cast((cp >> 6) | 0xc0); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + else if (cp < 0x10000) { // three octets + *(result++) = static_cast((cp >> 12) | 0xe0); + *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + else { // four octets + *(result++) = static_cast((cp >> 18) | 0xf0); + *(result++) = static_cast(((cp >> 12) & 0x3f)| 0x80); + *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); + *(result++) = static_cast((cp & 0x3f) | 0x80); + } + return result; + } + + template + uint32_t next(octet_iterator& it) + { + uint32_t cp = utf8::internal::mask8(*it); + typename std::iterator_traits::difference_type length = utf8::internal::sequence_length(it); + switch (length) { + case 1: + break; + case 2: + it++; + cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f); + break; + case 3: + ++it; + cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); + ++it; + cp += (*it) & 0x3f; + break; + case 4: + ++it; + cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); + ++it; + cp += (utf8::internal::mask8(*it) << 6) & 0xfff; + ++it; + cp += (*it) & 0x3f; + break; + } + ++it; + return cp; + } + + template + uint32_t peek_next(octet_iterator it) + { + return utf8::unchecked::next(it); + } + + template + uint32_t prior(octet_iterator& it) + { + while (utf8::internal::is_trail(*(--it))) ; + octet_iterator temp = it; + return utf8::unchecked::next(temp); + } + + // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous) + template + inline uint32_t previous(octet_iterator& it) + { + return utf8::unchecked::prior(it); + } + + template + void advance (octet_iterator& it, distance_type n) + { + for (distance_type i = 0; i < n; ++i) + utf8::unchecked::next(it); + } + + template + typename std::iterator_traits::difference_type + distance (octet_iterator first, octet_iterator last) + { + typename std::iterator_traits::difference_type dist; + for (dist = 0; first < last; ++dist) + utf8::unchecked::next(first); + return dist; + } + + template + octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) + { + while (start != end) { + uint32_t cp = utf8::internal::mask16(*start++); + // Take care of surrogate pairs first + if (utf8::internal::is_lead_surrogate(cp)) { + uint32_t trail_surrogate = utf8::internal::mask16(*start++); + cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; + } + result = utf8::unchecked::append(cp, result); + } + return result; + } + + template + u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) + { + while (start < end) { + uint32_t cp = utf8::unchecked::next(start); + if (cp > 0xffff) { //make a surrogate pair + *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); + *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); + } + else + *result++ = static_cast(cp); + } + return result; + } + + template + octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) + { + while (start != end) + result = utf8::unchecked::append(*(start++), result); + + return result; + } + + template + u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) + { + while (start < end) + (*result++) = utf8::unchecked::next(start); + + return result; + } + + // The iterator class + template + class iterator : public std::iterator { + octet_iterator it; + public: + iterator () {} + explicit iterator (const octet_iterator& octet_it): it(octet_it) {} + // the default "big three" are OK + octet_iterator base () const { return it; } + uint32_t operator * () const + { + octet_iterator temp = it; + return utf8::unchecked::next(temp); + } + bool operator == (const iterator& rhs) const + { + return (it == rhs.it); + } + bool operator != (const iterator& rhs) const + { + return !(operator == (rhs)); + } + iterator& operator ++ () + { + ::std::advance(it, utf8::internal::sequence_length(it)); + return *this; + } + iterator operator ++ (int) + { + iterator temp = *this; + ::std::advance(it, utf8::internal::sequence_length(it)); + return temp; + } + iterator& operator -- () + { + utf8::unchecked::prior(it); + return *this; + } + iterator operator -- (int) + { + iterator temp = *this; + utf8::unchecked::prior(it); + return temp; + } + }; // class iterator + + } // namespace utf8::unchecked +} // namespace utf8 + + +#endif // header guard + diff --git a/jni/love/src/love.cpp b/jni/love/src/love.cpp new file mode 100644 index 00000000..6f9a666b --- /dev/null +++ b/jni/love/src/love.cpp @@ -0,0 +1,230 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "modules/love/love.h" +#include + +#ifdef LOVE_BUILD_EXE + +// Lua +extern "C" { + #include + #include + #include +} + +#ifdef LOVE_WINDOWS +#include +#endif // LOVE_WINDOWS + +#ifdef LOVE_MACOSX +#include "OSX.h" +#endif // LOVE_MACOSX + +#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK + +void get_utf8_arguments(int &argc, char **&argv) +{ + LPWSTR cmd = GetCommandLineW(); + + if (!cmd) + return; + + LPWSTR *argv_w = CommandLineToArgvW(cmd, &argc); + + argv = new char *[argc]; + + for (int i = 0; i < argc; ++i) + { + // Size of wide char buffer (plus one for trailing '\0'). + size_t wide_len = wcslen(argv_w[i]) + 1; + + // Get size in UTF-8. + int utf8_size = WideCharToMultiByte(CP_UTF8, 0, argv_w[i], wide_len, argv[i], 0, 0, 0); + + argv[i] = new char[utf8_size]; + + // Convert to UTF-8. + int ok = WideCharToMultiByte(CP_UTF8, 0, argv_w[i], wide_len, argv[i], utf8_size, 0, 0); + + int len = strlen(argv[i]); + + if (!ok) + printf("Warning: could not convert to UTF8.\n"); + } + + LocalFree(argv_w); +} + +#endif // LOVE_LEGENDARY_UTF8_ARGV_HACK + +#ifdef LOVE_LEGENDARY_APP_ARGV_HACK + +#include + +static void get_app_arguments(int argc, char **argv, int &new_argc, char **&new_argv) +{ + std::vector temp_argv; + for (int i = 0; i < argc; i++) + { + // Don't copy -psn_xxx argument from argv. + if (i == 0 || strncmp(argv[i], "-psn_", 5) != 0) + temp_argv.push_back(std::string(argv[i])); + } + + // Check for a drop file string. + std::string dropfilestr = love::osx::checkDropEvents(); + if (!dropfilestr.empty()) + { + temp_argv.insert(temp_argv.begin() + 1, dropfilestr); + } + else + { + // If it exists, add the love file in love.app/Contents/Resources/ to argv. + std::string loveResourcesPath = love::osx::getLoveInResources(); + if (!loveResourcesPath.empty()) + { + // Run in pseudo-fused mode. + std::vector::iterator it = temp_argv.begin(); + it = temp_argv.insert(it + 1, loveResourcesPath); + temp_argv.insert(it + 1, std::string("--fused")); + } + } + + // Copy temp argv vector to new argv array. + new_argc = (int) temp_argv.size(); + new_argv = new char *[new_argc+1]; + + for (int i = 0; i < new_argc; i++) + { + new_argv[i] = new char[temp_argv[i].length() + 1]; + strcpy(new_argv[i], temp_argv[i].c_str()); + } + + new_argv[new_argc] = NULL; +} + +#endif // LOVE_LEGENDARY_APP_ARGV_HACK + +static int love_preload(lua_State *L, lua_CFunction f, const char *name) +{ + lua_getglobal(L, "package"); + lua_getfield(L, -1, "preload"); + lua_pushcfunction(L, f); + lua_setfield(L, -2, name); + lua_pop(L, 2); + return 0; +} + +int main(int argc, char **argv) +{ +#ifdef LOVE_LEGENDARY_UTF8_ARGV_HACK + int hack_argc = 0; char **hack_argv = 0; + get_utf8_arguments(hack_argc, hack_argv); + argc = hack_argc; + argv = hack_argv; +#endif // LOVE_LEGENDARY_UTF8_ARGV_HACK + +#ifdef LOVE_LEGENDARY_APP_ARGV_HACK + int hack_argc = 0; + char **hack_argv = 0; + get_app_arguments(argc, argv, hack_argc, hack_argv); + argc = hack_argc; + argv = hack_argv; +#endif // LOVE_LEGENDARY_APP_ARGV_HACK + + // Oh, you just want the version? Okay! + if (argc > 1 && strcmp(argv[1], "--version") == 0) + { + printf("LOVE %s (%s)\n", love_version(), love_codename()); + return 0; + } + + // Create the virtual machine. + lua_State *L = luaL_newstate(); + luaL_openlibs(L); + + // Add love to package.preload for easy requiring. + love_preload(L, luaopen_love, "love"); + + // Add command line arguments to global arg (like stand-alone Lua). + { + lua_newtable(L); + + if (argc > 0) + { + lua_pushstring(L, argv[0]); + lua_rawseti(L, -2, -2); + } + + lua_pushstring(L, "embedded boot.lua"); + lua_rawseti(L, -2, -1); + + for (int i = 1; i < argc; i++) + { + lua_pushstring(L, argv[i]); + lua_rawseti(L, -2, i); + } + + lua_setglobal(L, "arg"); + } + + // require "love" + lua_getglobal(L, "require"); + lua_pushstring(L, "love"); + lua_call(L, 1, 1); // leave the returned table on the stack. + + // Add love.__exe = true. + // This indicates that we're running the standalone version of love, and not + // the library version. + { + lua_pushboolean(L, 1); + lua_setfield(L, -2, "_exe"); + } + + // Pop the love table returned by require "love". + lua_pop(L, 1); + + // require "love.boot" (preloaded when love was required.) + lua_getglobal(L, "require"); + lua_pushstring(L, "love.boot"); + lua_call(L, 1, 1); + + // Call the returned boot function. + lua_call(L, 0, 1); + + int retval = 0; + if (lua_isnumber(L, -1)) + retval = (int) lua_tonumber(L, -1); + + lua_close(L); + +#if defined(LOVE_LEGENDARY_UTF8_ARGV_HACK) || defined(LOVE_LEGENDARY_APP_ARGV_HACK) + if (hack_argv) + { + for (int i = 0; i::Entry Audio::distanceModelEntries[] = +{ + {"none", Audio::DISTANCE_NONE}, + {"inverse", Audio::DISTANCE_INVERSE}, + {"inverse clamped", Audio::DISTANCE_INVERSE_CLAMPED}, + {"linear", Audio::DISTANCE_LINEAR}, + {"linear clamped", Audio::DISTANCE_LINEAR_CLAMPED}, + {"exponent", Audio::DISTANCE_EXPONENT}, + {"exponent clamped", Audio::DISTANCE_EXPONENT_CLAMPED} +}; + +StringMap Audio::distanceModels(Audio::distanceModelEntries, sizeof(Audio::distanceModelEntries)); + +bool Audio::getConstant(const char *in, DistanceModel &out) +{ + return distanceModels.find(in, out); +} + +bool Audio::getConstant(DistanceModel in, const char *&out) +{ + return distanceModels.find(in, out); +} + +} // audio +} // love diff --git a/jni/love/src/modules/audio/Audio.h b/jni/love/src/modules/audio/Audio.h new file mode 100644 index 00000000..74d71885 --- /dev/null +++ b/jni/love/src/modules/audio/Audio.h @@ -0,0 +1,239 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 = 0; 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 LOVE_AUDIO_AUDIO_H +#define LOVE_AUDIO_AUDIO_H + +#include "common/Module.h" +#include "common/StringMap.h" +#include "Source.h" + +namespace love +{ + +namespace sound +{ + +class Decoder; +class SoundData; + +} // sound + +namespace audio +{ + +/** + * The Audio module is responsible for playing back raw sound samples. + **/ +class Audio : public Module +{ +public: + + /** + * Attenuation by distance. + */ + enum DistanceModel + { + DISTANCE_NONE = 1, + DISTANCE_INVERSE, + DISTANCE_INVERSE_CLAMPED, + DISTANCE_LINEAR, + DISTANCE_LINEAR_CLAMPED, + DISTANCE_EXPONENT, + DISTANCE_EXPONENT_CLAMPED, + DISTANCE_MAX_ENUM + }; + + static bool getConstant(const char *in, DistanceModel &out); + static bool getConstant(DistanceModel in, const char *&out); + + /** + * Destructor. + **/ + virtual ~Audio() {}; + + virtual Source *newSource(love::sound::Decoder *decoder) = 0; + virtual Source *newSource(love::sound::SoundData *soundData) = 0; + + /** + * Gets the current number of simultaneous playing sources. + * @return The current number of simultaneous playing sources. + **/ + virtual int getSourceCount() const = 0; + + /** + * Gets the maximum supported number of simultaneous playing sources. + * @return The maximum supported number of simultaneous playing sources. + **/ + virtual int getMaxSources() const = 0; + + /** + * Play the specified Source. + * @param source The Source to play. + **/ + virtual void play(Source *source) = 0; + + /** + * Stops playback on the specified source. + * @param source The source on which to stop the playback. + **/ + virtual void stop(Source *source) = 0; + + /** + * Stops all playing audio. + **/ + virtual void stop() = 0; + + /** + * Pauses playback on the specified source. + * @param source The source on which to pause the playback. + **/ + virtual void pause(Source *source) = 0; + + /** + * Pauses all audio. + **/ + virtual void pause() = 0; + + /** + * Resumes playback on the specified source. + * @param source The source on which to resume the playback. + **/ + virtual void resume(Source *source) = 0; + + /** + * Resumes all audio. + **/ + virtual void resume() = 0; + + /** + * Rewinds the specified source. Whatever is playing on this + * source gets rewound to the start. + * @param source The source to rewind. + **/ + virtual void rewind(Source *source) = 0; + + /** + * Rewinds all playing audio. + **/ + virtual void rewind() = 0; + + /** + * Sets the master volume, where 0.0f is min (off) and 1.0f is max. + * @param volume The new master volume. + **/ + virtual void setVolume(float volume) = 0; + + /** + * Gets the master volume. + * @return The current master volume. + **/ + virtual float getVolume() const = 0; + + /** + * Gets the position of the listener. + * @param v A float array of size 3 containing (x,y,z) in that order. + **/ + virtual void getPosition(float *v) const = 0; + + /** + * Sets the position of the listener. + * @param v A float array of size 3 containing [x,y,z] in that order. + **/ + virtual void setPosition(float *v) = 0; + + /** + * Gets the orientation of the listener. + * @param v A float array of size 6 containing [x,y,z] for the forward + * vector, followed by [x,y,z] for the up vector. + **/ + virtual void getOrientation(float *v) const = 0; + + /** + * Sets the orientation of the listener. + * @param v A float array of size 6 containing [x,y,z] for the forward + * vector, followed by [x,y,z] for the up vector. + **/ + virtual void setOrientation(float *v) = 0; + + /** + * Gets the velocity of the listener. + * @param v A float array of size 3 containing [x,y,z] in that order. + **/ + virtual void getVelocity(float *v) const = 0; + + /** + * Sets the velocity of the listener. + * @param v A float array of size 3 containing [x,y,z] in that order. + **/ + virtual void setVelocity(float *v) = 0; + + /** + * Begins recording audio input from the microphone. + **/ + virtual void record() = 0; + + /** + * Gets a section of recorded audio. + * Per OpenAL, the measurement begins from the start of the + * audio data in memory, which is after the last time this function + * was called. If this function has not been called yet this recording + * session, it just grabs from the beginning. + * @return All the recorded SoundData thus far. + **/ + virtual love::sound::SoundData *getRecordedData() = 0; + + /** + * Stops recording and, if passed true, returns all the recorded audio + * not already gotten by getRecordedData. + * @param returnData Whether to return recorded audio. + * @return if returnData, all the recorded audio yet to be gotten, + * otherwise NULL. + **/ + virtual love::sound::SoundData *stopRecording(bool returnData) = 0; + + /** + * Checks whether LOVE is able to record audio input. + * @return hasMic Whether LOVE has a microphone enabled. + **/ + virtual bool canRecord() = 0; + + /** + * Gets the distance model used for attenuation. + * @return Distance model. + */ + virtual DistanceModel getDistanceModel() const = 0; + + /** + * Sets the distance model used for attenuation. + * @param distanceModel Distance model. + */ + virtual void setDistanceModel(DistanceModel distanceModel) = 0; + +private: + + static StringMap::Entry distanceModelEntries[]; + static StringMap distanceModels; +}; // Audio + +} // audio +} // love + +#endif // LOVE_AUDIO_AUDIO_H diff --git a/jni/love/src/modules/audio/Source.cpp b/jni/love/src/modules/audio/Source.cpp new file mode 100644 index 00000000..fe95700d --- /dev/null +++ b/jni/love/src/modules/audio/Source.cpp @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Source.h" + +namespace love +{ +namespace audio +{ + +Source::Source(Type type) + : type(type) +{ +} + +Source::~Source() +{ +} + +bool Source::getConstant(const char *in, Type &out) +{ + return types.find(in, out); +} + +bool Source::getConstant(Type in, const char *&out) +{ + return types.find(in, out); +} + +bool Source::getConstant(const char *in, Unit &out) +{ + return units.find(in, out); +} + +bool Source::getConstant(Unit in, const char *&out) +{ + return units.find(in, out); +} + +StringMap::Entry Source::typeEntries[] = +{ + {"static", Source::TYPE_STATIC}, + {"stream", Source::TYPE_STREAM}, +}; + +StringMap Source::types(Source::typeEntries, sizeof(Source::typeEntries)); + +StringMap::Entry Source::unitEntries[] = +{ + {"seconds", Source::UNIT_SECONDS}, + {"samples", Source::UNIT_SAMPLES}, +}; + +StringMap Source::units(Source::unitEntries, sizeof(Source::unitEntries)); + +} // audio +} // love diff --git a/jni/love/src/modules/audio/Source.h b/jni/love/src/modules/audio/Source.h new file mode 100644 index 00000000..4e0983e4 --- /dev/null +++ b/jni/love/src/modules/audio/Source.h @@ -0,0 +1,127 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_AUDIO_SOURCE_H +#define LOVE_AUDIO_SOURCE_H + +// LOVE +#include "common/Object.h" +#include "common/StringMap.h" + +namespace love +{ +namespace audio +{ + +class Source : public Object +{ +public: + + enum Type + { + TYPE_STATIC = 1, + TYPE_STREAM, + TYPE_MAX_ENUM + }; // Type + + enum Unit + { + UNIT_SECONDS = 1, + UNIT_SAMPLES, + UNIT_MAX_ENUM + }; + + Source(Type type); + virtual ~Source(); + + virtual Source *copy() = 0; + + virtual void play() = 0; + virtual void stop() = 0; + virtual void pause() = 0; + virtual void resume() = 0; + virtual void rewind() = 0; + virtual bool isStopped() const = 0; + virtual bool isPaused() const = 0; + virtual bool isFinished() const = 0; + virtual bool update() = 0; + + virtual void setPitch(float pitch) = 0; + virtual float getPitch() const = 0; + + virtual void setVolume(float volume) = 0; + virtual float getVolume() const = 0; + + virtual void seek(float offset, Unit unit) = 0; + virtual float tell(Unit unit) = 0; + + // all float * v must be of size 3 + virtual void setPosition(float *v) = 0; + virtual void getPosition(float *v) const = 0; + virtual void setVelocity(float *v) = 0; + virtual void getVelocity(float *v) const = 0; + virtual void setDirection(float *v) = 0; + virtual void getDirection(float *v) const = 0; + + virtual void setCone(float innerAngle, float outerAngle, float outerVolume) = 0; + virtual void getCone(float &innerAngle, float &outerAngle, float &outerVolume) const = 0; + + virtual void setRelative(bool enable) = 0; + virtual bool isRelative() const = 0; + + virtual void setLooping(bool looping) = 0; + virtual bool isLooping() const = 0; + virtual bool isStatic() const = 0; + + virtual void setMinVolume(float volume) = 0; + virtual float getMinVolume() const = 0; + virtual void setMaxVolume(float volume) = 0; + virtual float getMaxVolume() const = 0; + + virtual void setReferenceDistance(float distance) = 0; + virtual float getReferenceDistance() const = 0; + virtual void setRolloffFactor(float factor) = 0; + virtual float getRolloffFactor() const = 0; + virtual void setMaxDistance(float distance) = 0; + virtual float getMaxDistance() const = 0; + + virtual int getChannels() const = 0; + + static bool getConstant(const char *in, Type &out); + static bool getConstant(Type in, const char *&out); + static bool getConstant(const char *in, Unit &out); + static bool getConstant(Unit in, const char *&out); + +protected: + Type type; + +private: + + static StringMap::Entry typeEntries[]; + static StringMap types; + static StringMap::Entry unitEntries[]; + static StringMap units; + +}; // Source + +} // audio +} // love + +#endif // LOVE_AUDIO_SOURCE_H diff --git a/jni/love/src/modules/audio/null/Audio.cpp b/jni/love/src/modules/audio/null/Audio.cpp new file mode 100644 index 00000000..328a8c57 --- /dev/null +++ b/jni/love/src/modules/audio/null/Audio.cpp @@ -0,0 +1,169 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Audio.h" + +namespace love +{ +namespace audio +{ +namespace null +{ + +Audio::Audio() + : distanceModel(DISTANCE_NONE) +{ +} + +Audio::~Audio() +{ +} + +const char *Audio::getName() const +{ + return "love.audio.null"; +} + +love::audio::Source *Audio::newSource(love::sound::Decoder *) +{ + return new Source(); +} + +love::audio::Source *Audio::newSource(love::sound::SoundData *) +{ + return new Source(); +} + +int Audio::getSourceCount() const +{ + return 0; +} + +int Audio::getMaxSources() const +{ + return 0; +} + +void Audio::play(love::audio::Source *) +{ +} + +void Audio::play() +{ +} + +void Audio::stop(love::audio::Source *) +{ +} + +void Audio::stop() +{ +} + +void Audio::pause(love::audio::Source *) +{ +} + +void Audio::pause() +{ +} + +void Audio::resume(love::audio::Source *) +{ +} + +void Audio::resume() +{ +} + +void Audio::rewind(love::audio::Source *) +{ +} + +void Audio::rewind() +{ +} + +void Audio::setVolume(float volume) +{ + this->volume = volume; +} + +float Audio::getVolume() const +{ + return volume; +} + +void Audio::getPosition(float *) const +{ +} + +void Audio::setPosition(float *) +{ +} + +void Audio::getOrientation(float *) const +{ +} + +void Audio::setOrientation(float *) +{ +} + +void Audio::getVelocity(float *) const +{ +} + +void Audio::setVelocity(float *) +{ +} + +void Audio::record() +{ +} + +love::sound::SoundData *Audio::getRecordedData() +{ + return NULL; +} + +love::sound::SoundData *Audio::stopRecording(bool) +{ + return NULL; +} + +bool Audio::canRecord() +{ + return false; +} + +Audio::DistanceModel Audio::getDistanceModel() const +{ + return this->distanceModel; +} + +void Audio::setDistanceModel(DistanceModel distanceModel) +{ + this->distanceModel = distanceModel; +} + +} // null +} // audio +} // love diff --git a/jni/love/src/modules/audio/null/Audio.h b/jni/love/src/modules/audio/null/Audio.h new file mode 100644 index 00000000..dcd56709 --- /dev/null +++ b/jni/love/src/modules/audio/null/Audio.h @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_AUDIO_NULL_AUDIO_H +#define LOVE_AUDIO_NULL_AUDIO_H + +// LOVE +#include "audio/Audio.h" + +#include "Source.h" + +namespace love +{ +namespace audio +{ +namespace null +{ + +class Audio : public love::audio::Audio +{ +public: + + Audio(); + virtual ~Audio(); + + // Implements Module. + const char *getName() const; + + // Implements Audio. + love::audio::Source *newSource(love::sound::Decoder *decoder); + love::audio::Source *newSource(love::sound::SoundData *soundData); + int getSourceCount() const; + int getMaxSources() const; + void play(love::audio::Source *source); + void play(); + void stop(love::audio::Source *source); + void stop(); + void pause(love::audio::Source *source); + void pause(); + void resume(love::audio::Source *source); + void resume(); + void rewind(love::audio::Source *source); + void rewind(); + void setVolume(float volume); + float getVolume() const; + + void getPosition(float *v) const; + void setPosition(float *v); + void getOrientation(float *v) const; + void setOrientation(float *v); + void getVelocity(float *v) const; + void setVelocity(float *v); + + void record(); + love::sound::SoundData *getRecordedData(); + love::sound::SoundData *stopRecording(bool returnData); + bool canRecord(); + + DistanceModel getDistanceModel() const; + void setDistanceModel(DistanceModel distanceModel); + +private: + float volume; + DistanceModel distanceModel; + +}; // Audio + +} // null +} // audio +} // love + +#endif // LOVE_AUDIO_NULL_AUDIO_H diff --git a/jni/love/src/modules/audio/null/Source.cpp b/jni/love/src/modules/audio/null/Source.cpp new file mode 100644 index 00000000..1d543a94 --- /dev/null +++ b/jni/love/src/modules/audio/null/Source.cpp @@ -0,0 +1,234 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Source.h" + +namespace love +{ +namespace audio +{ +namespace null +{ + +Source::Source() + : love::audio::Source(Source::TYPE_STATIC) +{ +} + +Source::~Source() +{ +} + +love::audio::Source *Source::copy() +{ + this->retain(); + return this; +} + +void Source::play() +{ +} + +void Source::stop() +{ +} + +void Source::pause() +{ +} + +void Source::resume() +{ +} + +void Source::rewind() +{ +} + +bool Source::isStopped() const +{ + return true; +} + +bool Source::isPaused() const +{ + return false; +} + +bool Source::isFinished() const +{ + return true; +} + +bool Source::update() +{ + return false; +} + +void Source::setPitch(float pitch) +{ + this->pitch = pitch; +} + +float Source::getPitch() const +{ + return pitch; +} + +void Source::setVolume(float volume) +{ + this->volume = volume; +} + +float Source::getVolume() const +{ + return volume; +} + +void Source::seek(float, Source::Unit) +{ +} + +float Source::tell(Source::Unit) +{ + return 0.0f; +} + +void Source::setPosition(float *) +{ +} + +void Source::getPosition(float *) const +{ +} + +void Source::setVelocity(float *) +{ +} + +void Source::getVelocity(float *) const +{ +} + +void Source::setDirection(float *) +{ +} + +void Source::getDirection(float *) const +{ +} + +void Source::setCone(float innerAngle, float outerAngle, float outerVolume) +{ + coneInnerAngle = innerAngle; + coneOuterAngle = outerAngle; + coneOuterVolume = outerVolume; +} + +void Source::getCone(float &innerAngle, float &outerAngle, float &outerVolume) const +{ + innerAngle = coneInnerAngle; + outerAngle = coneOuterAngle; + outerVolume = coneOuterVolume; +} + +void Source::setRelative(bool enable) +{ + relative = enable; +} + +bool Source::isRelative() const +{ + return relative; +} + +void Source::setLooping(bool looping) +{ + this->looping = looping; +} + +bool Source::isLooping() const +{ + return looping; +} + +bool Source::isStatic() const +{ + return (type == TYPE_STATIC); +} + +void Source::setMinVolume(float volume) +{ + this->minVolume = volume; +} + +float Source::getMinVolume() const +{ + return this->minVolume; +} + +void Source::setMaxVolume(float volume) +{ + this->maxVolume = volume; +} + +float Source::getMaxVolume() const +{ + return this->maxVolume; +} + +void Source::setReferenceDistance(float distance) +{ + this->referenceDistance = distance; +} + +float Source::getReferenceDistance() const +{ + return this->referenceDistance; +} + +void Source::setRolloffFactor(float factor) +{ + this->rolloffFactor = factor; +} + +float Source::getRolloffFactor() const +{ + return this->rolloffFactor; +} + +void Source::setMaxDistance(float distance) +{ + this->maxDistance = distance; +} + +float Source::getMaxDistance() const +{ + return this->maxDistance; +} + +int Source::getChannels() const +{ + return 2; +} + +} // null +} // audio +} // love diff --git a/jni/love/src/modules/audio/null/Source.h b/jni/love/src/modules/audio/null/Source.h new file mode 100644 index 00000000..969c019a --- /dev/null +++ b/jni/love/src/modules/audio/null/Source.h @@ -0,0 +1,103 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_AUDIO_NULL_SOURCE_H +#define LOVE_AUDIO_NULL_SOURCE_H + +// LOVE +#include "common/Object.h" +#include "audio/Source.h" + +namespace love +{ +namespace audio +{ +namespace null +{ + +class Source : public love::audio::Source +{ +public: + Source(); + virtual ~Source(); + + virtual love::audio::Source *copy(); + virtual void play(); + virtual void stop(); + virtual void pause(); + virtual void resume(); + virtual void rewind(); + virtual bool isStopped() const; + virtual bool isPaused() const; + virtual bool isFinished() const; + virtual bool update(); + virtual void setPitch(float pitch); + virtual float getPitch() const; + virtual void setVolume(float volume); + virtual float getVolume() const; + virtual void seek(float offset, Unit unit); + virtual float tell(Unit unit); + virtual void setPosition(float *v); + virtual void getPosition(float *v) const; + virtual void setVelocity(float *v); + virtual void getVelocity(float *v) const; + virtual void setDirection(float *v); + virtual void getDirection(float *v) const; + virtual void setCone(float innerAngle, float outerAngle, float outerVolume); + virtual void getCone(float &innerAngle, float &outerAngle, float &outerVolume) const; + virtual void setRelative(bool enable); + virtual bool isRelative() const; + void setLooping(bool looping); + bool isLooping() const; + bool isStatic() const; + virtual void setMinVolume(float volume); + virtual float getMinVolume() const; + virtual void setMaxVolume(float volume); + virtual float getMaxVolume() const; + virtual void setReferenceDistance(float distance); + virtual float getReferenceDistance() const; + virtual void setRolloffFactor(float factor); + virtual float getRolloffFactor() const; + virtual void setMaxDistance(float distance); + virtual float getMaxDistance() const; + virtual int getChannels() const; + +private: + + float pitch; + float volume; + float coneInnerAngle; + float coneOuterAngle; + float coneOuterVolume; + bool relative; + bool looping; + float minVolume; + float maxVolume; + float referenceDistance; + float rolloffFactor; + float maxDistance; + +}; // Source + +} // null +} // audio +} // love + +#endif // LOVE_AUDIO_NULL_SOURCE_H diff --git a/jni/love/src/modules/audio/openal/Audio.cpp b/jni/love/src/modules/audio/openal/Audio.cpp new file mode 100644 index 00000000..0fac2f57 --- /dev/null +++ b/jni/love/src/modules/audio/openal/Audio.cpp @@ -0,0 +1,328 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Audio.h" +#include "common/delay.h" + +#include "sound/Decoder.h" + +#include + +namespace love +{ +namespace audio +{ +namespace openal +{ + +Audio::PoolThread::PoolThread(Pool *pool) + : pool(pool) + , finish(false) +{ + mutex = thread::newMutex(); +} + +Audio::PoolThread::~PoolThread() +{ + delete mutex; +} + + +void Audio::PoolThread::threadFunction() +{ + while (true) + { + { + thread::Lock lock(mutex); + if (finish) + { + return; + } + } + + pool->update(); + delay(5); + } +} + +void Audio::PoolThread::setFinish() +{ + thread::Lock lock(mutex); + finish = true; +} + +Audio::Audio() + : distanceModel(DISTANCE_INVERSE_CLAMPED) +{ + // Passing zero for default device. + device = alcOpenDevice(0); + + if (device == 0) + throw love::Exception("Could not open device."); + + context = alcCreateContext(device, 0); + + if (context == 0) + throw love::Exception("Could not create context."); + + alcMakeContextCurrent(context); + + if (alcGetError(device) != ALC_NO_ERROR) + throw love::Exception("Could not make context current."); + + /*std::string captureName(alcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER)); + const ALCchar * devices = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER); + while (*devices) + { + std::string device(devices); + devices += device.size() + 1; + if (device.find("Mic") != std::string::npos || device.find("mic") != std::string::npos) + { + captureName = device; + } + } + + capture = alcCaptureOpenDevice(captureName.c_str(), 8000, AL_FORMAT_MONO16, 262144); // about 32 seconds + + if (!capture) + { + // We're not going to prevent LOVE from running without a microphone, but we should warn, at least + std::cerr << "Warning, couldn't open capture device! No audio input!" << std::endl; + }*/ + + // pool must be allocated after AL context. + pool = new Pool(); + + poolThread = new PoolThread(pool); + poolThread->start(); +} + +Audio::~Audio() +{ + poolThread->setFinish(); + poolThread->wait(); + + delete poolThread; + delete pool; + + alcMakeContextCurrent(0); + alcDestroyContext(context); + //if (capture) alcCaptureCloseDevice(capture); + alcCloseDevice(device); +} + + +const char *Audio::getName() const +{ + return "love.audio.openal"; +} + +love::audio::Source *Audio::newSource(love::sound::Decoder *decoder) +{ + return new Source(pool, decoder); +} + +love::audio::Source *Audio::newSource(love::sound::SoundData *soundData) +{ + return new Source(pool, soundData); +} + +int Audio::getSourceCount() const +{ + return pool->getSourceCount(); +} + +int Audio::getMaxSources() const +{ + return pool->getMaxSources(); +} + +void Audio::play(love::audio::Source *source) +{ + source->play(); +} + +void Audio::stop(love::audio::Source *source) +{ + source->stop(); +} + +void Audio::stop() +{ + pool->stop(); +} + +void Audio::pause(love::audio::Source *source) +{ + source->pause(); +} + +void Audio::pause() +{ + pool->pause(); +} + +void Audio::resume(love::audio::Source *source) +{ + source->resume(); +} + +void Audio::resume() +{ + pool->resume(); +} + +void Audio::rewind(love::audio::Source *source) +{ + source->rewind(); +} + +void Audio::rewind() +{ + pool->rewind(); +} + +void Audio::setVolume(float volume) +{ + alListenerf(AL_GAIN, volume); +} + +float Audio::getVolume() const +{ + ALfloat volume; + alGetListenerf(AL_GAIN, &volume); + return volume; +} + +void Audio::getPosition(float *v) const +{ + alGetListenerfv(AL_POSITION, v); +} + +void Audio::setPosition(float *v) +{ + alListenerfv(AL_POSITION, v); +} + +void Audio::getOrientation(float *v) const +{ + alGetListenerfv(AL_ORIENTATION, v); +} + +void Audio::setOrientation(float *v) +{ + alListenerfv(AL_ORIENTATION, v); +} + +void Audio::getVelocity(float *v) const +{ + alGetListenerfv(AL_VELOCITY, v); +} + +void Audio::setVelocity(float *v) +{ + alListenerfv(AL_VELOCITY, v); +} + +void Audio::record() +{ + if (!canRecord()) return; + alcCaptureStart(capture); +} + +love::sound::SoundData *Audio::getRecordedData() +{ + if (!canRecord()) + return NULL; + int samplerate = 8000; + ALCint samples; + alcGetIntegerv(capture, ALC_CAPTURE_SAMPLES, 4, &samples); + void *data = malloc(samples * (2/sizeof(char))); + alcCaptureSamples(capture, data, samples); + love::sound::SoundData *sd = new love::sound::SoundData(data, samples, samplerate, 16, 1); + free(data); + return sd; +} + +love::sound::SoundData *Audio::stopRecording(bool returnData) +{ + if (!canRecord()) + return NULL; + love::sound::SoundData *sd = NULL; + if (returnData) + { + sd = getRecordedData(); + } + alcCaptureStop(capture); + return sd; +} + +bool Audio::canRecord() +{ + return (capture != NULL); +} + +Audio::DistanceModel Audio::getDistanceModel() const +{ + return this->distanceModel; +} + +void Audio::setDistanceModel(DistanceModel distanceModel) +{ + this->distanceModel = distanceModel; + + switch (distanceModel) + { + case DISTANCE_NONE: + alDistanceModel(AL_NONE); + break; + + case DISTANCE_INVERSE: + alDistanceModel(AL_INVERSE_DISTANCE); + break; + + case DISTANCE_INVERSE_CLAMPED: + alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED); + break; + + case DISTANCE_LINEAR: + alDistanceModel(AL_LINEAR_DISTANCE); + break; + + case DISTANCE_LINEAR_CLAMPED: + alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED); + break; + + case DISTANCE_EXPONENT: + alDistanceModel(AL_EXPONENT_DISTANCE); + break; + + case DISTANCE_EXPONENT_CLAMPED: + alDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED); + break; + + default: + break; + } +} + +} // openal +} // audio +} // love diff --git a/jni/love/src/modules/audio/openal/Audio.h b/jni/love/src/modules/audio/openal/Audio.h new file mode 100644 index 00000000..1bb0389f --- /dev/null +++ b/jni/love/src/modules/audio/openal/Audio.h @@ -0,0 +1,142 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_AUDIO_OPENAL_AUDIO_H +#define LOVE_AUDIO_OPENAL_AUDIO_H + +// STD +#include +#include +#include +#include + +// LOVE +#include "audio/Audio.h" +#include "common/config.h" +#include "sound/SoundData.h" + +#include "Source.h" +#include "Pool.h" +#include "thread/threads.h" + +// OpenAL +#ifdef LOVE_MACOSX +#include +#include +#else +#include +#include +#endif + +namespace love +{ +namespace audio +{ +namespace openal +{ + +class Audio : public love::audio::Audio +{ +public: + + Audio(); + ~Audio(); + + // Implements Module. + const char *getName() const; + + // Implements Audio. + love::audio::Source *newSource(love::sound::Decoder *decoder); + love::audio::Source *newSource(love::sound::SoundData *soundData); + int getSourceCount() const; + int getMaxSources() const; + void play(love::audio::Source *source); + void play(); + void stop(love::audio::Source *source); + void stop(); + void pause(love::audio::Source *source); + void pause(); + void resume(love::audio::Source *source); + void resume(); + void rewind(love::audio::Source *source); + void rewind(); + void setVolume(float volume); + float getVolume() const; + + void getPosition(float *v) const; + void setPosition(float *v); + void getOrientation(float *v) const; + void setOrientation(float *v); + void getVelocity(float *v) const; + void setVelocity(float *v); + + void record(); + love::sound::SoundData *getRecordedData(); + love::sound::SoundData *stopRecording(bool returnData); + bool canRecord(); + + DistanceModel getDistanceModel() const; + void setDistanceModel(DistanceModel distanceModel); + +private: + + // The OpenAL device. + ALCdevice *device; + + // The OpenAL capture device (microphone). + ALCdevice *capture; + + // The OpenAL context. + ALCcontext *context; + + // The Pool. + Pool *pool; + + class PoolThread: public thread::Threadable + { + protected: + Pool *pool; + + // Set this to true when the thread should finish. + // Main thread will write to this value, and PoolThread + // will read from it. + volatile bool finish; + + // finish lock + thread::Mutex *mutex; + + public: + PoolThread(Pool *pool); + ~PoolThread(); + void setFinish(); + void threadFunction(); + }; + + PoolThread *poolThread; + + DistanceModel distanceModel; + +}; // Audio + +} // openal +} // audio +} // love + +#endif // LOVE_AUDIO_OPENAL_AUDIO_H diff --git a/jni/love/src/modules/audio/openal/Pool.cpp b/jni/love/src/modules/audio/openal/Pool.cpp new file mode 100644 index 00000000..03434fac --- /dev/null +++ b/jni/love/src/modules/audio/openal/Pool.cpp @@ -0,0 +1,293 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Pool.h" + +#include "Source.h" + +namespace love +{ +namespace audio +{ +namespace openal +{ + +Pool::Pool() +{ + // Generate sources. + alGenSources(NUM_SOURCES, sources); + + // Create the mutex. + mutex = thread::newMutex(); + + if (alGetError() != AL_NO_ERROR) + throw love::Exception("Could not generate sources."); + + // Make all sources available initially. + for (int i = 0; i < NUM_SOURCES; i++) + { +#ifdef AL_DIRECT_CHANNELS_SOFT + // Bypassing virtualization of speakers for multi-channel sources in OpenAL Soft. + alSourcei(sources[i], AL_DIRECT_CHANNELS_SOFT, AL_TRUE); +#endif + available.push(sources[i]); + } +} + +Pool::~Pool() +{ + stop(); + + delete mutex; + + // Free all sources. + alDeleteSources(NUM_SOURCES, sources); +} + +bool Pool::isAvailable() const +{ + bool has = false; + { + thread::Lock lock(mutex); + has = !available.empty(); + } + return has; +} + +bool Pool::isPlaying(Source *s) +{ + bool p = false; + { + thread::Lock lock(mutex); + for (auto i = playing.begin(); i != playing.end(); i++) + { + if (i->first == s) + p = true; + } + } + return p; +} + +void Pool::update() +{ + thread::Lock lock(mutex); + + std::map::iterator i = playing.begin(); + + while (i != playing.end()) + { + if (!i->first->update()) + { + i->first->stopAtomic(); + i->first->rewindAtomic(); + i->first->release(); + available.push(i->second); + playing.erase(i++); + } + else + i++; + } +} + +int Pool::getSourceCount() const +{ + return playing.size(); +} + +int Pool::getMaxSources() const +{ + return NUM_SOURCES; +} + +bool Pool::play(Source *source, ALuint &out) +{ + thread::Lock lock(mutex); + + bool ok = true; + out = 0; + + bool alreadyPlaying = findSource(source, out); + + if (!alreadyPlaying) + { + // Try to play. + if (!available.empty()) + { + // Get the first available source. + out = available.front(); + + // Remove it. + available.pop(); + + // Insert into map of playing sources. + playing.insert(std::pair(source, out)); + + source->retain(); + + source->playAtomic(); + + ok = true; + } + else + { + ok = false; + } + } + else + { + ok = true; + } + + return ok; +} + +void Pool::stop() +{ + thread::Lock lock(mutex); + for (auto i = playing.begin(); i != playing.end(); i++) + { + i->first->stopAtomic(); + i->first->release(); + available.push(i->second); + } + + playing.clear(); +} + +void Pool::stop(Source *source) +{ + thread::Lock lock(mutex); + removeSource(source); +} + +void Pool::pause() +{ + thread::Lock lock(mutex); + for (auto i = playing.begin(); i != playing.end(); i++) + i->first->pauseAtomic(); +} + +void Pool::pause(Source *source) +{ + thread::Lock lock(mutex); + ALuint out; + if (findSource(source, out)) + source->pauseAtomic(); +} + +void Pool::resume() +{ + thread::Lock lock(mutex); + for (auto i = playing.begin(); i != playing.end(); i++) + i->first->resumeAtomic(); +} + +void Pool::resume(Source *source) +{ + thread::Lock lock(mutex); + ALuint out; + if (findSource(source, out)) + source->resumeAtomic(); +} + +void Pool::rewind() +{ + thread::Lock lock(mutex); + for (auto i = playing.begin(); i != playing.end(); i++) + i->first->rewindAtomic(); +} + +// For those times we don't need it backed. +void Pool::softRewind(Source *source) +{ + thread::Lock lock(mutex); + source->rewindAtomic(); +} + +void Pool::rewind(Source *source) +{ + thread::Lock lock(mutex); + source->rewindAtomic(); +} + +void Pool::release(Source *source) +{ + ALuint s = findi(source); + + if (s != 0) + { + available.push(s); + playing.erase(source); + } +} + +void Pool::seek(Source *source, float offset, void *unit) +{ + thread::Lock lock(mutex); + return source->seekAtomic(offset, unit); +} + +float Pool::tell(Source *source, void *unit) +{ + thread::Lock lock(mutex); + return source->tellAtomic(unit); +} + +ALuint Pool::findi(const Source *source) const +{ + std::map::const_iterator i = playing.find((Source *)source); + + if (i != playing.end()) + return i->second; + + return 0; +} + +bool Pool::findSource(Source *source, ALuint &out) +{ + std::map::const_iterator i = playing.find((Source *)source); + + bool found = i != playing.end(); + + if (found) + out = i->second; + + return found; +} + +bool Pool::removeSource(Source *source) +{ + std::map::iterator i = playing.find((Source *)source); + + if (i != playing.end()) + { + source->stopAtomic(); + available.push(i->second); + playing.erase(i++); + source->release(); + return true; + } + + return false; +} + +} // openal +} // audio +} // love diff --git a/jni/love/src/modules/audio/openal/Pool.h b/jni/love/src/modules/audio/openal/Pool.h new file mode 100644 index 00000000..74244e54 --- /dev/null +++ b/jni/love/src/modules/audio/openal/Pool.h @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_AUDIO_OPENAL_POOL_H +#define LOVE_AUDIO_OPENAL_POOL_H + +// STD +#include +#include +#include +#include + +// LOVE +#include "common/config.h" +#include "common/Exception.h" +#include "thread/threads.h" + +// OpenAL +#ifdef LOVE_MACOSX +#include +#include +#else +#include +#include +#include +#endif + +namespace love +{ +namespace audio +{ +namespace openal +{ + +class Source; + +class Pool +{ +public: + + Pool(); + ~Pool(); + + /** + * Checks whether an OpenAL source is available. + * @return True if at least one is available, false otherwise. + **/ + bool isAvailable() const; + + /** + * Checks whether a Source is currently in the playing list. + **/ + bool isPlaying(Source *s); + + void update(); + + int getSourceCount() const; + int getMaxSources() const; + + bool play(Source *source, ALuint &out); + void stop(); + void stop(Source *source); + void pause(); + void pause(Source *source); + void resume(); + void resume(Source *source); + void rewind(); + void rewind(Source *source); + void softRewind(Source *source); + void seek(Source *source, float offset, void *unit); + float tell(Source *source, void *unit); + +private: + + /** + * Makes the specified OpenAL source available for use. + * @param source The OpenAL source. + **/ + void release(Source *source); + + ALuint findi(const Source *source) const; + + bool findSource(Source *source, ALuint &out); + bool removeSource(Source *source); + // Number of OpenAL sources. + static const int NUM_SOURCES = 64; + + // OpenAL sources + ALuint sources[NUM_SOURCES]; + + // A queue of available sources. + std::queue available; + + // A map of playing sources. + std::map playing; + + // Only one thread can access this object at the same time. This mutex will + // make sure of that. + thread::Mutex *mutex; + +}; // Pool + +} // openal +} // audio +} // love + +#endif // LOVE_AUDIO_OPENAL_POOL_H diff --git a/jni/love/src/modules/audio/openal/Source.cpp b/jni/love/src/modules/audio/openal/Source.cpp new file mode 100644 index 00000000..465d2516 --- /dev/null +++ b/jni/love/src/modules/audio/openal/Source.cpp @@ -0,0 +1,766 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Source.h" +#include "Pool.h" +#include "common/math.h" + +// STD +#include +#include + +namespace love +{ +namespace audio +{ +namespace openal +{ + +Source::Source(Pool *pool, love::sound::SoundData *soundData) + : love::audio::Source(Source::TYPE_STATIC) + , pool(pool) + , valid(false) + , pitch(1.0f) + , volume(1.0f) + , relative(false) + , looping(false) + , paused(false) + , minVolume(0.0f) + , maxVolume(1.0f) + , referenceDistance(1.0f) + , rolloffFactor(1.0f) + , maxDistance(FLT_MAX) + , cone() + , offsetSamples(0) + , offsetSeconds(0) + , channels(soundData->getChannels()) + , decoder(0) + , toLoop(0) +{ + alGenBuffers(1, buffers); + ALenum fmt = getFormat(soundData->getChannels(), soundData->getBitDepth()); + alBufferData(buffers[0], fmt, soundData->getData(), soundData->getSize(), soundData->getSampleRate()); + + static float z[3] = {0, 0, 0}; + + setFloatv(position, z); + setFloatv(velocity, z); + setFloatv(direction, z); +} + +Source::Source(Pool *pool, love::sound::Decoder *decoder) + : love::audio::Source(Source::TYPE_STREAM) + , pool(pool) + , valid(false) + , pitch(1.0f) + , volume(1.0f) + , relative(false) + , looping(false) + , paused(false) + , minVolume(0.0f) + , maxVolume(1.0f) + , referenceDistance(1.0f) + , rolloffFactor(1.0f) + , maxDistance(FLT_MAX) + , cone() + , offsetSamples(0) + , offsetSeconds(0) + , channels(decoder->getChannels()) + , decoder(decoder) + , toLoop(0) +{ + decoder->retain(); + alGenBuffers(MAX_BUFFERS, buffers); + + static float z[3] = {0, 0, 0}; + + setFloatv(position, z); + setFloatv(velocity, z); + setFloatv(direction, z); +} + +Source::~Source() +{ + if (valid) + pool->stop(this); + alDeleteBuffers((type == TYPE_STATIC) ? 1 : MAX_BUFFERS, buffers); + if (decoder) + decoder->release(); +} + +love::audio::Source *Source::copy() +{ + return 0; +} + +void Source::play() +{ + if (valid && paused) + { + pool->resume(this); + return; + } + + valid = pool->play(this, source); +} + +void Source::stop() +{ + if (!isStopped()) + { + pool->stop(this); + pool->softRewind(this); + } +} + +void Source::pause() +{ + pool->pause(this); +} + +void Source::resume() +{ + pool->resume(this); +} + +void Source::rewind() +{ + pool->rewind(this); +} + +bool Source::isStopped() const +{ + if (valid) + { + ALenum state; + alGetSourcei(source, AL_SOURCE_STATE, &state); + return (state == AL_STOPPED); + } + + return true; +} + +bool Source::isPaused() const +{ + if (valid) + { + ALenum state; + alGetSourcei(source, AL_SOURCE_STATE, &state); + return (state == AL_PAUSED); + } + + return false; +} + +bool Source::isFinished() const +{ + return type == TYPE_STATIC ? isStopped() : isStopped() && !isLooping() && decoder->isFinished(); +} + +bool Source::update() +{ + if (!valid) + return false; + if (type == TYPE_STATIC) + { + // Looping mode could have changed. + alSourcei(source, AL_LOOPING, isLooping() ? AL_TRUE : AL_FALSE); + return !isStopped(); + } + else if (type == TYPE_STREAM && (isLooping() || !isFinished())) + { + // Number of processed buffers. + ALint processed = 0; + + alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed); + + while (processed--) + { + ALuint buffer; + + float curOffsetSamples, curOffsetSecs; + + alGetSourcef(source, AL_SAMPLE_OFFSET, &curOffsetSamples); + + ALint b; + alGetSourcei(source, AL_BUFFER, &b); + int freq; + alGetBufferi(b, AL_FREQUENCY, &freq); + curOffsetSecs = curOffsetSamples / freq; + + // Get a free buffer. + alSourceUnqueueBuffers(source, 1, &buffer); + + float newOffsetSamples, newOffsetSecs; + + alGetSourcef(source, AL_SAMPLE_OFFSET, &newOffsetSamples); + newOffsetSecs = newOffsetSamples / freq; + + offsetSamples += (curOffsetSamples - newOffsetSamples); + offsetSeconds += (curOffsetSecs - newOffsetSecs); + + streamAtomic(buffer, decoder); + alSourceQueueBuffers(source, 1, &buffer); + } + return true; + } + return false; +} + +void Source::setPitch(float pitch) +{ + if (valid) + alSourcef(source, AL_PITCH, pitch); + + this->pitch = pitch; +} + +float Source::getPitch() const +{ + if (valid) + { + ALfloat f; + alGetSourcef(source, AL_PITCH, &f); + return f; + } + + // In case the Source isn't playing. + return pitch; +} + +void Source::setVolume(float volume) +{ + if (valid) + { + alSourcef(source, AL_GAIN, volume); + } + + this->volume = volume; +} + +float Source::getVolume() const +{ + if (valid) + { + ALfloat f; + alGetSourcef(source, AL_GAIN, &f); + return f; + } + + // In case the Source isn't playing. + return volume; +} + +void Source::seekAtomic(float offset, void *unit) +{ + if (valid) + { + switch (*((Source::Unit *) unit)) + { + case Source::UNIT_SAMPLES: + if (type == TYPE_STREAM) + { + offsetSamples = offset; + ALint buffer; + alGetSourcei(source, AL_BUFFER, &buffer); + int freq; + alGetBufferi(buffer, AL_FREQUENCY, &freq); + offset /= freq; + offsetSeconds = offset; + decoder->seek(offset); + } + else + { + alSourcef(source, AL_SAMPLE_OFFSET, offset); + } + break; + case Source::UNIT_SECONDS: + default: + if (type == TYPE_STREAM) + { + offsetSeconds = offset; + decoder->seek(offset); + ALint buffer; + alGetSourcei(source, AL_BUFFER, &buffer); + int freq; + alGetBufferi(buffer, AL_FREQUENCY, &freq); + offsetSamples = offset*freq; + } + else + { + alSourcef(source, AL_SEC_OFFSET, offset); + } + break; + } + if (type == TYPE_STREAM) + { + bool waspaused = paused; + // Because we still have old data + // from before the seek in the buffers + // let's empty them. + stopAtomic(); + playAtomic(); + if (waspaused) + pauseAtomic(); + } + } +} + +void Source::seek(float offset, Source::Unit unit) +{ + return pool->seek(this, offset, &unit); +} + +float Source::tellAtomic(void *unit) const +{ + if (valid) + { + float offset; + switch (*((Source::Unit *) unit)) + { + case Source::UNIT_SAMPLES: + alGetSourcef(source, AL_SAMPLE_OFFSET, &offset); + if (type == TYPE_STREAM) offset += offsetSamples; + break; + case Source::UNIT_SECONDS: + default: + alGetSourcef(source, AL_SAMPLE_OFFSET, &offset); + ALint buffer; + alGetSourcei(source, AL_BUFFER, &buffer); + int freq; + alGetBufferi(buffer, AL_FREQUENCY, &freq); + offset /= freq; + if (type == TYPE_STREAM) offset += offsetSeconds; + break; + } + return offset; + } + return 0.0f; +} + +float Source::tell(Source::Unit unit) +{ + return pool->tell(this, &unit); +} + +void Source::setPosition(float *v) +{ + if (valid) + alSourcefv(source, AL_POSITION, v); + + setFloatv(position, v); +} + +void Source::getPosition(float *v) const +{ + if (valid) + alGetSourcefv(source, AL_POSITION, v); + else + setFloatv(v, position); +} + +void Source::setVelocity(float *v) +{ + if (valid) + alSourcefv(source, AL_VELOCITY, v); + + setFloatv(velocity, v); +} + +void Source::getVelocity(float *v) const +{ + if (valid) + alGetSourcefv(source, AL_VELOCITY, v); + else + setFloatv(v, velocity); +} + +void Source::setDirection(float *v) +{ + if (valid) + alSourcefv(source, AL_DIRECTION, v); + else + setFloatv(direction, v); +} + +void Source::getDirection(float *v) const +{ + if (valid) + alGetSourcefv(source, AL_DIRECTION, v); + else + setFloatv(v, direction); +} + +void Source::setCone(float innerAngle, float outerAngle, float outerVolume) +{ + cone.innerAngle = LOVE_TODEG(innerAngle); + cone.outerAngle = LOVE_TODEG(outerAngle); + cone.outerVolume = outerVolume; + + if (valid) + { + alSourcei(source, AL_CONE_INNER_ANGLE, cone.innerAngle); + alSourcei(source, AL_CONE_OUTER_ANGLE, cone.outerAngle); + alSourcef(source, AL_CONE_OUTER_GAIN, cone.outerVolume); + } +} + +void Source::getCone(float &innerAngle, float &outerAngle, float &outerVolume) const +{ + innerAngle = LOVE_TORAD(cone.innerAngle); + outerAngle = LOVE_TORAD(cone.outerAngle); + outerVolume = cone.outerVolume; +} + +void Source::setRelative(bool enable) +{ + if (valid) + alSourcei(source, AL_SOURCE_RELATIVE, relative ? AL_TRUE : AL_FALSE); + + relative = enable; +} + +bool Source::isRelative() const +{ + return relative; +} + +void Source::setLooping(bool looping) +{ + if (valid && type == TYPE_STATIC) + alSourcei(source, AL_LOOPING, looping ? AL_TRUE : AL_FALSE); + + this->looping = looping; +} + +bool Source::isLooping() const +{ + return looping; +} + +void Source::playAtomic() +{ + if (type == TYPE_STATIC) + { + alSourcei(source, AL_BUFFER, buffers[0]); + } + else if (type == TYPE_STREAM) + { + int usedBuffers = 0; + + for (unsigned int i = 0; i < MAX_BUFFERS; i++) + { + streamAtomic(buffers[i], decoder); + ++usedBuffers; + if (decoder->isFinished()) + break; + } + + if (usedBuffers > 0) + alSourceQueueBuffers(source, usedBuffers, buffers); + } + + // This Source may now be associated with an OpenAL source that still has + // the properties of another love Source. Let's reset it to the settings + // of the new one. + reset(); + + alSourcePlay(source); + + valid = true; //if it fails it will be set to false again + //but this prevents a horrible, horrible bug +} + +void Source::stopAtomic() +{ + if (valid) + { + if (type == TYPE_STATIC) + { + alSourceStop(source); + } + else if (type == TYPE_STREAM) + { + alSourceStop(source); + int queued = 0; + alGetSourcei(source, AL_BUFFERS_QUEUED, &queued); + + while (queued--) + { + ALuint buffer; + alSourceUnqueueBuffers(source, 1, &buffer); + } + } + alSourcei(source, AL_BUFFER, AL_NONE); + } + toLoop = 0; + valid = false; +} + +void Source::pauseAtomic() +{ + if (valid) + { + alSourcePause(source); + paused = true; + } +} + +void Source::resumeAtomic() +{ + if (valid && paused) + { + alSourcePlay(source); + paused = false; + } +} + +void Source::rewindAtomic() +{ + if (valid && type == TYPE_STATIC) + { + alSourceRewind(source); + if (!paused) + alSourcePlay(source); + } + else if (valid && type == TYPE_STREAM) + { + bool waspaused = paused; + decoder->rewind(); + // Because we still have old data + // from before the seek in the buffers + // let's empty them. + stopAtomic(); + playAtomic(); + if (waspaused) + pauseAtomic(); + offsetSamples = 0; + offsetSeconds = 0; + } + else if (type == TYPE_STREAM) + { + decoder->rewind(); + offsetSamples = 0; + offsetSeconds = 0; + } +} + +void Source::reset() +{ + alSourcefv(source, AL_POSITION, position); + alSourcefv(source, AL_VELOCITY, velocity); + alSourcefv(source, AL_DIRECTION, direction); + alSourcef(source, AL_PITCH, pitch); + alSourcef(source, AL_GAIN, volume); + alSourcef(source, AL_MIN_GAIN, minVolume); + alSourcef(source, AL_MAX_GAIN, maxVolume); + alSourcef(source, AL_REFERENCE_DISTANCE, referenceDistance); + alSourcef(source, AL_ROLLOFF_FACTOR, rolloffFactor); + alSourcef(source, AL_MAX_DISTANCE, maxDistance); + alSourcei(source, AL_LOOPING, isStatic() && isLooping() ? AL_TRUE : AL_FALSE); + alSourcei(source, AL_SOURCE_RELATIVE, relative ? AL_TRUE : AL_FALSE); + alSourcei(source, AL_CONE_INNER_ANGLE, cone.innerAngle); + alSourcei(source, AL_CONE_OUTER_ANGLE, cone.outerAngle); + alSourcef(source, AL_CONE_OUTER_GAIN, cone.outerVolume); +} + +void Source::setFloatv(float *dst, const float *src) const +{ + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; +} + +ALenum Source::getFormat(int channels, int bitDepth) const +{ + if (channels == 1 && bitDepth == 8) + return AL_FORMAT_MONO8; + else if (channels == 1 && bitDepth == 16) + return AL_FORMAT_MONO16; + else if (channels == 2 && bitDepth == 8) + return AL_FORMAT_STEREO8; + else if (channels == 2 && bitDepth == 16) + return AL_FORMAT_STEREO16; + else + return 0; +} + +int Source::streamAtomic(ALuint buffer, love::sound::Decoder *d) +{ + // Get more sound data. + int decoded = d->decode(); + + int fmt = getFormat(d->getChannels(), d->getBitDepth()); + + if (fmt != 0) + alBufferData(buffer, fmt, d->getBuffer(), decoded, d->getSampleRate()); + + if (decoder->isFinished() && isLooping()) + { + int queued, processed; + alGetSourcei(source, AL_BUFFERS_QUEUED, &queued); + alGetSourcei(source, AL_BUFFERS_PROCESSED, &processed); + if (queued > processed) + toLoop = queued-processed; + else + toLoop = MAX_BUFFERS-processed; + d->rewind(); + } + + if (toLoop > 0) + { + if (--toLoop == 0) + { + offsetSamples = 0; + offsetSeconds = 0; + } + } + + return decoded; +} + +bool Source::isStatic() const +{ + return (type == TYPE_STATIC); +} + +void Source::setMinVolume(float volume) +{ + if (valid) + { + alSourcef(source, AL_MIN_GAIN, volume); + } + + this->minVolume = volume; +} + +float Source::getMinVolume() const +{ + if (valid) + { + ALfloat f; + alGetSourcef(source, AL_MIN_GAIN, &f); + return f; + } + + // In case the Source isn't playing. + return this->minVolume; +} + +void Source::setMaxVolume(float volume) +{ + if (valid) + { + alSourcef(source, AL_MAX_GAIN, volume); + } + + this->maxVolume = volume; +} + +float Source::getMaxVolume() const +{ + if (valid) + { + ALfloat f; + alGetSourcef(source, AL_MAX_GAIN, &f); + return f; + } + + // In case the Source isn't playing. + return this->maxVolume; +} + +void Source::setReferenceDistance(float distance) +{ + if (valid) + { + alSourcef(source, AL_REFERENCE_DISTANCE, distance); + } + + this->referenceDistance = distance; +} + +float Source::getReferenceDistance() const +{ + if (valid) + { + ALfloat f; + alGetSourcef(source, AL_REFERENCE_DISTANCE, &f); + return f; + } + + // In case the Source isn't playing. + return this->referenceDistance; +} + +void Source::setRolloffFactor(float factor) +{ + if (valid) + { + alSourcef(source, AL_ROLLOFF_FACTOR, factor); + } + + this->rolloffFactor = factor; +} + +float Source::getRolloffFactor() const +{ + if (valid) + { + ALfloat f; + alGetSourcef(source, AL_ROLLOFF_FACTOR, &f); + return f; + } + + // In case the Source isn't playing. + return this->rolloffFactor; +} + +void Source::setMaxDistance(float distance) +{ + if (valid) + { + alSourcef(source, AL_MAX_DISTANCE, distance); + } + + this->maxDistance = distance; +} + +float Source::getMaxDistance() const +{ + if (valid) + { + ALfloat f; + alGetSourcef(source, AL_MAX_DISTANCE, &f); + return f; + } + + // In case the Source isn't playing. + return this->maxDistance; +} + +int Source::getChannels() const +{ + return channels; +} + +} // openal +} // audio +} // love diff --git a/jni/love/src/modules/audio/openal/Source.h b/jni/love/src/modules/audio/openal/Source.h new file mode 100644 index 00000000..93824be4 --- /dev/null +++ b/jni/love/src/modules/audio/openal/Source.h @@ -0,0 +1,171 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_AUDIO_OPENAL_SOURCE_H +#define LOVE_AUDIO_OPENAL_SOURCE_H + +// LOVE +#include "common/config.h" +#include "common/Object.h" +#include "audio/Source.h" +#include "sound/SoundData.h" +#include "sound/Decoder.h" + +// OpenAL +#ifdef LOVE_MACOSX +#include +#include +#else +#include +#include +#endif + +namespace love +{ +namespace audio +{ +namespace openal +{ + +class Audio; +class Pool; + +class Source : public love::audio::Source +{ +public: + Source(Pool *pool, love::sound::SoundData *soundData); + Source(Pool *pool, love::sound::Decoder *decoder); + virtual ~Source(); + + virtual love::audio::Source *copy(); + virtual void play(); + virtual void stop(); + virtual void pause(); + virtual void resume(); + virtual void rewind(); + virtual bool isStopped() const; + virtual bool isPaused() const; + virtual bool isFinished() const; + virtual bool update(); + virtual void setPitch(float pitch); + virtual float getPitch() const; + virtual void setVolume(float volume); + virtual float getVolume() const; + virtual void seekAtomic(float offset, void *unit); + virtual void seek(float offset, Unit unit); + virtual float tellAtomic(void *unit) const; + virtual float tell(Unit unit); + virtual void setPosition(float *v); + virtual void getPosition(float *v) const; + virtual void setVelocity(float *v); + virtual void getVelocity(float *v) const; + virtual void setDirection(float *v); + virtual void getDirection(float *v) const; + virtual void setCone(float innerAngle, float outerAngle, float outerVolume); + virtual void getCone(float &innerAngle, float &outerAngle, float &outerVolume) const; + virtual void setRelative(bool enable); + virtual bool isRelative() const; + void setLooping(bool looping); + bool isLooping() const; + bool isStatic() const; + virtual void setMinVolume(float volume); + virtual float getMinVolume() const; + virtual void setMaxVolume(float volume); + virtual float getMaxVolume() const; + virtual void setReferenceDistance(float distance); + virtual float getReferenceDistance() const; + virtual void setRolloffFactor(float factor); + virtual float getRolloffFactor() const; + virtual void setMaxDistance(float distance); + virtual float getMaxDistance() const; + virtual int getChannels() const; + + void playAtomic(); + void stopAtomic(); + void pauseAtomic(); + void resumeAtomic(); + void rewindAtomic(); + +private: + + void reset(); + + void setFloatv(float *dst, const float *src) const; + + /** + * Gets the OpenAL format identifier based on number of + * channels and bits. + * @param channels Either 1 (mono) or 2 (stereo). + * @param bitDepth Either 8-bit samples, or 16-bit samples. + * @return One of AL_FORMAT_*, or 0 if unsupported format. + **/ + ALenum getFormat(int channels, int bitDepth) const; + + int streamAtomic(ALuint buffer, love::sound::Decoder *d); + + Pool *pool; + ALuint source; + bool valid; + static const unsigned int MAX_BUFFERS = 32; + ALuint buffers[MAX_BUFFERS]; + + float pitch; + float volume; + float position[3]; + float velocity[3]; + float direction[3]; + bool relative; + bool looping; + bool paused; + float minVolume; + float maxVolume; + float referenceDistance; + float rolloffFactor; + float maxDistance; + + struct Cone + { + int innerAngle; // degrees + int outerAngle; // degrees + float outerVolume; + + Cone() + : innerAngle(360) + , outerAngle(360) + , outerVolume(0.0f) + {} + } cone; + + float offsetSamples; + float offsetSeconds; + + int channels; + + love::sound::Decoder *decoder; + + unsigned int toLoop; + +}; // Source + +} // openal +} // audio +} // love + +#endif // LOVE_AUDIO_OPENAL_SOURCE_H diff --git a/jni/love/src/modules/audio/wrap_Audio.cpp b/jni/love/src/modules/audio/wrap_Audio.cpp new file mode 100644 index 00000000..513fcc0a --- /dev/null +++ b/jni/love/src/modules/audio/wrap_Audio.cpp @@ -0,0 +1,351 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Audio.h" + +#include "openal/Audio.h" +#include "null/Audio.h" + +#include "common/runtime.h" + +namespace love +{ +namespace audio +{ + +static Audio *instance = 0; + +int w_getSourceCount(lua_State *L) +{ + lua_pushinteger(L, instance->getSourceCount()); + return 1; +} + +int w_newSource(lua_State *L) +{ + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + if (luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + luax_convobj(L, 1, "sound", "newDecoder"); + + Source::Type stype = Source::TYPE_STREAM; + + const char *stypestr = lua_isnoneornil(L, 2) ? 0 : lua_tostring(L, 2); + if (stypestr && !Source::getConstant(stypestr, stype)) + return luaL_error(L, "Invalid source type: %s", stypestr); + + if (stype == Source::TYPE_STATIC && luax_istype(L, 1, SOUND_DECODER_T)) + luax_convobj(L, 1, "sound", "newSoundData"); + + Source *t = 0; + + if (luax_istype(L, 1, SOUND_SOUND_DATA_T)) + t = instance->newSource(luax_totype(L, 1, "SoundData", SOUND_SOUND_DATA_T)); + else if (luax_istype(L, 1, SOUND_DECODER_T)) + t = instance->newSource(luax_totype(L, 1, "Decoder", SOUND_DECODER_T)); + + if (t) + { + luax_pushtype(L, "Source", AUDIO_SOURCE_T, t); + return 1; + } + else + return luax_typerror(L, 1, "Decoder or SoundData"); +} + +int w_play(lua_State *L) +{ + Source *s = luax_checksource(L, 1); + instance->play(s); + return 0; +} + +int w_stop(lua_State *L) +{ + if (lua_gettop(L) == 0) + { + instance->stop(); + } + else + { + Source *s = luax_checksource(L, 1); + s->stop(); + } + return 0; +} + +int w_pause(lua_State *L) +{ + if (lua_gettop(L) == 0) + { + instance->pause(); + } + else + { + Source *s = luax_checksource(L, 1); + s->pause(); + } + + return 0; +} + +int w_resume(lua_State *L) +{ + if (lua_gettop(L) == 0) + { + instance->resume(); + } + else + { + Source *s = luax_checksource(L, 1); + s->resume(); + } + return 0; +} + +int w_rewind(lua_State *L) +{ + if (lua_gettop(L) == 0) + { + instance->rewind(); + } + else + { + Source *s = luax_checksource(L, 1); + s->rewind(); + } + return 0; +} + +int w_setVolume(lua_State *L) +{ + float v = (float)luaL_checknumber(L, 1); + instance->setVolume(v); + return 0; +} + +int w_getVolume(lua_State *L) +{ + lua_pushnumber(L, instance->getVolume()); + return 1; +} + +int w_setPosition(lua_State *L) +{ + float v[3]; + v[0] = (float)luaL_checknumber(L, 1); + v[1] = (float)luaL_checknumber(L, 2); + v[2] = (float)luaL_optnumber(L, 3, 0); + instance->setPosition(v); + return 0; +} + +int w_getPosition(lua_State *L) +{ + float v[3]; + instance->getPosition(v); + lua_pushnumber(L, v[0]); + lua_pushnumber(L, v[1]); + lua_pushnumber(L, v[2]); + return 3; +} + +int w_setOrientation(lua_State *L) +{ + float v[6]; + v[0] = (float)luaL_checknumber(L, 1); + v[1] = (float)luaL_checknumber(L, 2); + v[2] = (float)luaL_checknumber(L, 3); + v[3] = (float)luaL_checknumber(L, 4); + v[4] = (float)luaL_checknumber(L, 5); + v[5] = (float)luaL_checknumber(L, 6); + instance->setOrientation(v); + return 0; +} + +int w_getOrientation(lua_State *L) +{ + float v[6]; + instance->getOrientation(v); + lua_pushnumber(L, v[0]); + lua_pushnumber(L, v[1]); + lua_pushnumber(L, v[2]); + lua_pushnumber(L, v[3]); + lua_pushnumber(L, v[4]); + lua_pushnumber(L, v[5]); + return 6; +} + +int w_setVelocity(lua_State *L) +{ + float v[3]; + v[0] = (float)luaL_checknumber(L, 1); + v[1] = (float)luaL_checknumber(L, 2); + v[2] = (float)luaL_optnumber(L, 3, 0); + instance->setVelocity(v); + return 0; +} + +int w_getVelocity(lua_State *L) +{ + float v[3]; + instance->getVelocity(v); + lua_pushnumber(L, v[0]); + lua_pushnumber(L, v[1]); + lua_pushnumber(L, v[2]); + return 3; +} + +int w_record(lua_State *) +{ + instance->record(); + return 0; +} + +int w_getRecordedData(lua_State *L) +{ + love::sound::SoundData *sd = instance->getRecordedData(); + if (!sd) + lua_pushnil(L); + else + luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, sd); + return 1; +} + +int w_stopRecording(lua_State *L) +{ + if (luax_optboolean(L, 1, true)) + { + love::sound::SoundData *sd = instance->stopRecording(true); + if (!sd) lua_pushnil(L); + else luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, sd); + return 1; + } + instance->stopRecording(false); + return 0; +} + +int w_canRecord(lua_State *L) +{ + luax_pushboolean(L, instance->canRecord()); + return 1; +} + +int w_setDistanceModel(lua_State *L) +{ + const char *modelStr = luaL_checkstring(L, 1); + Audio::DistanceModel distanceModel; + if (!Audio::getConstant(modelStr, distanceModel)) + return luaL_error(L, "Invalid distance model: %s", modelStr); + instance->setDistanceModel(distanceModel); + return 0; +} + +int w_getDistanceModel(lua_State *L) +{ + Audio::DistanceModel distanceModel = instance->getDistanceModel(); + const char *modelStr; + if (!Audio::getConstant(distanceModel, modelStr)) + return 0; + lua_pushstring(L, modelStr); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "getSourceCount", w_getSourceCount }, + { "newSource", w_newSource }, + { "play", w_play }, + { "stop", w_stop }, + { "pause", w_pause }, + { "resume", w_resume }, + { "rewind", w_rewind }, + { "setVolume", w_setVolume }, + { "getVolume", w_getVolume }, + { "setPosition", w_setPosition }, + { "getPosition", w_getPosition }, + { "setOrientation", w_setOrientation }, + { "getOrientation", w_getOrientation }, + { "setVelocity", w_setVelocity }, + { "getVelocity", w_getVelocity }, + /*{ "record", w_record }, + { "getRecordedData", w_getRecordedData }, + { "stopRecording", w_stopRecording },*/ + { "setDistanceModel", w_setDistanceModel }, + { "getDistanceModel", w_getDistanceModel }, + { 0, 0 } +}; + +static const lua_CFunction types[] = +{ + luaopen_source, + 0 +}; + +extern "C" int luaopen_love_audio(lua_State *L) +{ + if (instance == 0) + { + // Try OpenAL first. + try + { + instance = new love::audio::openal::Audio(); + } + catch(love::Exception &e) + { + std::cout << e.what() << std::endl; + } + } + else + instance->retain(); + + if (instance == 0) + { + // Fall back to nullaudio. + try + { + instance = new love::audio::null::Audio(); + } + catch(love::Exception &e) + { + std::cout << e.what() << std::endl; + } + } + + if (instance == 0) + return luaL_error(L, "Could not open any audio module."); + + WrappedModule w; + w.module = instance; + w.name = "audio"; + w.flags = MODULE_T; + w.functions = functions; + w.types = types; + + int n = luax_register_module(L, w); + + return n; +} + +} // audio +} // love diff --git a/jni/love/src/modules/audio/wrap_Audio.h b/jni/love/src/modules/audio/wrap_Audio.h new file mode 100644 index 00000000..40fe3d89 --- /dev/null +++ b/jni/love/src/modules/audio/wrap_Audio.h @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_AUDIO_WRAP_AUDIO_H +#define LOVE_AUDIO_WRAP_AUDIO_H + +// LOVE +#include "common/config.h" +#include "common/runtime.h" +#include "Audio.h" +#include "wrap_Source.h" + +namespace love +{ +namespace audio +{ + +int w_getSourceCount(lua_State *L); +int w_newSource(lua_State *L); +int w_play(lua_State *L); +int w_stop(lua_State *L); +int w_pause(lua_State *L); +int w_resume(lua_State *L); +int w_rewind(lua_State *L); +int w_setVolume(lua_State *L); +int w_getVolume(lua_State *L); +int w_setPosition(lua_State *L); +int w_getPosition(lua_State *L); +int w_setOrientation(lua_State *L); +int w_getOrientation(lua_State *L); +int w_setVelocity(lua_State *L); +int w_getVelocity(lua_State *L); +int w_record(lua_State *L); +int w_getRecordedData(lua_State *L); +int w_stopRecording(lua_State *L); +int w_canRecord(lua_State *L); +int w_setDistanceModel(lua_State *L); +int w_getDistanceModel(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_audio(lua_State *L); + +} // audio +} // love + +#endif // LOVE_AUDIO_WRAP_AUDIO_H diff --git a/jni/love/src/modules/audio/wrap_Source.cpp b/jni/love/src/modules/audio/wrap_Source.cpp new file mode 100644 index 00000000..1ac39637 --- /dev/null +++ b/jni/love/src/modules/audio/wrap_Source.cpp @@ -0,0 +1,385 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Source.h" + +namespace love +{ +namespace audio +{ + +Source *luax_checksource(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Source", AUDIO_SOURCE_T); +} + +int w_Source_play(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + t->play(); + return 0; +} + +int w_Source_stop(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + t->stop(); + return 0; +} + +int w_Source_pause(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + t->pause(); + return 0; +} + +int w_Source_resume(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + t->resume(); + return 0; +} + +int w_Source_rewind(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + t->rewind(); + return 0; +} + +int w_Source_setPitch(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float p = (float)luaL_checknumber(L, 2); + t->setPitch(p); + return 0; +} + +int w_Source_getPitch(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + lua_pushnumber(L, t->getPitch()); + return 1; +} + +int w_Source_setVolume(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float p = (float)luaL_checknumber(L, 2); + t->setVolume(p); + return 0; +} + +int w_Source_getVolume(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + lua_pushnumber(L, t->getVolume()); + return 1; +} + +int w_Source_seek(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float offset = (float)luaL_checknumber(L, 2); + if (offset < 0) + return luaL_argerror(L, 2, "can't seek to a negative position"); + + Source::Unit u = Source::UNIT_SECONDS; + const char *unit = lua_isnoneornil(L, 3) ? 0 : lua_tostring(L, 3); + if (unit && !t->getConstant(unit, u)) + return luaL_error(L, "Invalid Source time unit: %s", unit); + + t->seek(offset, u); + return 0; +} + +int w_Source_tell(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + + Source::Unit u = Source::UNIT_SECONDS; + const char *unit = lua_isnoneornil(L, 2) ? 0 : lua_tostring(L, 2); + if (unit && !t->getConstant(unit, u)) + return luaL_error(L, "Invalid Source time unit: %s", unit); + + lua_pushnumber(L, t->tell(u)); + return 1; +} + +int w_Source_setPosition(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float v[3]; + v[0] = (float)luaL_checknumber(L, 2); + v[1] = (float)luaL_checknumber(L, 3); + v[2] = (float)luaL_optnumber(L, 4, 0); + t->setPosition(v); + return 0; +} + +int w_Source_getPosition(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float v[3]; + t->getPosition(v); + lua_pushnumber(L, v[0]); + lua_pushnumber(L, v[1]); + lua_pushnumber(L, v[2]); + return 3; +} + +int w_Source_setVelocity(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float v[3]; + v[0] = (float)luaL_checknumber(L, 2); + v[1] = (float)luaL_checknumber(L, 3); + v[2] = (float)luaL_optnumber(L, 4, 0); + t->setVelocity(v); + return 0; +} + +int w_Source_getVelocity(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float v[3]; + t->getVelocity(v); + lua_pushnumber(L, v[0]); + lua_pushnumber(L, v[1]); + lua_pushnumber(L, v[2]); + return 3; +} + +int w_Source_setDirection(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float v[3]; + v[0] = (float)luaL_checknumber(L, 2); + v[1] = (float)luaL_checknumber(L, 3); + v[2] = (float)luaL_optnumber(L, 4, 0); + t->setDirection(v); + return 0; +} + +int w_Source_getDirection(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float v[3]; + t->getDirection(v); + lua_pushnumber(L, v[0]); + lua_pushnumber(L, v[1]); + lua_pushnumber(L, v[2]); + return 3; +} + +int w_Source_setCone(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float innerAngle = (float) luaL_checknumber(L, 2); + float outerAngle = (float) luaL_checknumber(L, 3); + float outerVolume = (float) luaL_optnumber(L, 4, 0.0); + t->setCone(innerAngle, outerAngle, outerVolume); + return 0; +} + +int w_Source_getCone(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float innerAngle, outerAngle, outerVolume; + t->getCone(innerAngle, outerAngle, outerVolume); + lua_pushnumber(L, innerAngle); + lua_pushnumber(L, outerAngle); + lua_pushnumber(L, outerVolume); + return 3; +} + +int w_Source_setRelative(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + t->setRelative(luax_toboolean(L, 2)); + return 0; +} + +int w_Source_isRelative(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + luax_pushboolean(L, t->isRelative()); + return 1; +} + +int w_Source_setLooping(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + t->setLooping(luax_toboolean(L, 2)); + return 0; +} + +int w_Source_isLooping(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + luax_pushboolean(L, t->isLooping()); + return 1; +} + +int w_Source_isStopped(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + luax_pushboolean(L, t->isStopped()); + return 1; +} + +int w_Source_isPaused(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + luax_pushboolean(L, t->isPaused()); + return 1; +} + +int w_Source_isPlaying(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + luax_pushboolean(L, !t->isStopped() && !t->isPaused()); + return 1; +} + +int w_Source_isStatic(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + luax_pushboolean(L, t->isStatic()); + return 1; +} + +int w_Source_setVolumeLimits(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float vmin = (float)luaL_checknumber(L, 2); + float vmax = (float)luaL_checknumber(L, 3); + if (vmin < .0f || vmin > 1.f || vmax < .0f || vmax > 1.f) + return luaL_error(L, "Invalid volume limits: [%f:%f]. Must be in [0:1]", vmin, vmax); + t->setMinVolume(vmin); + t->setMaxVolume(vmax); + return 0; +} + +int w_Source_getVolumeLimits(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + lua_pushnumber(L, t->getMinVolume()); + lua_pushnumber(L, t->getMaxVolume()); + return 2; +} + +int w_Source_setAttenuationDistances(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float dref = (float)luaL_checknumber(L, 2); + float dmax = (float)luaL_checknumber(L, 3); + if (dref < .0f || dmax < .0f) + return luaL_error(L, "Invalid distances: %f, %f. Must be > 0", dref, dmax); + t->setReferenceDistance(dref); + t->setMaxDistance(dmax); + return 0; +} + +int w_Source_getAttenuationDistances(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + lua_pushnumber(L, t->getReferenceDistance()); + lua_pushnumber(L, t->getMaxDistance()); + return 2; +} + +int w_Source_setRolloff(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + float rolloff = (float)luaL_checknumber(L, 2); + if (rolloff < .0f) + return luaL_error(L, "Invalid rolloff: %f. Must be > 0.", rolloff); + t->setRolloffFactor(rolloff); + return 0; +} + +int w_Source_getRolloff(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + lua_pushnumber(L, t->getRolloffFactor()); + return 1; +} + +int w_Source_getChannels(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + lua_pushinteger(L, t->getChannels()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "play", w_Source_play }, + { "stop", w_Source_stop }, + { "pause", w_Source_pause }, + { "resume", w_Source_resume }, + { "rewind", w_Source_rewind }, + + { "setPitch", w_Source_setPitch }, + { "getPitch", w_Source_getPitch }, + { "setVolume", w_Source_setVolume }, + { "getVolume", w_Source_getVolume }, + { "seek", w_Source_seek }, + { "tell", w_Source_tell }, + { "setPosition", w_Source_setPosition }, + { "getPosition", w_Source_getPosition }, + { "setVelocity", w_Source_setVelocity }, + { "getVelocity", w_Source_getVelocity }, + { "setDirection", w_Source_setDirection }, + { "getDirection", w_Source_getDirection }, + { "setCone", w_Source_setCone }, + { "getCone", w_Source_getCone }, + + { "setRelative", w_Source_setRelative }, + { "isRelative", w_Source_isRelative }, + + { "setLooping", w_Source_setLooping }, + { "isLooping", w_Source_isLooping }, + { "isStopped", w_Source_isStopped }, + { "isPaused", w_Source_isPaused }, + { "isPlaying", w_Source_isPlaying }, + { "isStatic", w_Source_isStatic }, + + { "setVolumeLimits", w_Source_setVolumeLimits }, + { "getVolumeLimits", w_Source_getVolumeLimits }, + { "setAttenuationDistances", w_Source_setAttenuationDistances }, + { "getAttenuationDistances", w_Source_getAttenuationDistances }, + { "setRolloff", w_Source_setRolloff}, + { "getRolloff", w_Source_getRolloff}, + + { "getChannels", w_Source_getChannels }, + + { 0, 0 } +}; + +extern "C" int luaopen_source(lua_State *L) +{ + return luax_register_type(L, "Source", functions); +} + +} // audio +} // love diff --git a/jni/love/src/modules/audio/wrap_Source.h b/jni/love/src/modules/audio/wrap_Source.h new file mode 100644 index 00000000..bca5ecaa --- /dev/null +++ b/jni/love/src/modules/audio/wrap_Source.h @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_AUDIO_WRAP_SOURCE_H +#define LOVE_AUDIO_WRAP_SOURCE_H + +#include "common/runtime.h" +#include "Source.h" + +namespace love +{ +namespace audio +{ + +Source *luax_checksource(lua_State *L, int idx); +int w_Source_play(lua_State *L); +int w_Source_stop(lua_State *L); +int w_Source_pause(lua_State *L); +int w_Source_resume(lua_State *L); +int w_Source_rewind(lua_State *L); +int w_Source_setPitch(lua_State *L); +int w_Source_getPitch(lua_State *L); +int w_Source_setVolume(lua_State *L); +int w_Source_getVolume(lua_State *L); +int w_Source_seek(lua_State *L); +int w_Source_tell(lua_State *L); +int w_Source_setPosition(lua_State *L); +int w_Source_getPosition(lua_State *L); +int w_Source_setVelocity(lua_State *L); +int w_Source_getVelocity(lua_State *L); +int w_Source_setDirection(lua_State *L); +int w_Source_getDirection(lua_State *L); +int w_Source_setCone(lua_State *L); +int w_Source_getCone(lua_State *L); +int w_Source_setRelative(lua_State *L); +int w_Source_isRelative(lua_State *L); +int w_Source_setLooping(lua_State *L); +int w_Source_isLooping(lua_State *L); +int w_Source_isStopped(lua_State *L); +int w_Source_isPaused(lua_State *L); +int w_Source_isPlaying(lua_State *L); +int w_Source_isStatic(lua_State *L); +int w_Source_setVolumeLimits(lua_State *L); +int w_Source_getVolumeLimits(lua_State *L); +int w_Source_setAttenuationDistances(lua_State *L); +int w_Source_getAttenuationDistances(lua_State *L); +int w_Source_setRolloff(lua_State *L); +int w_Source_getRolloff(lua_State *L); +int w_Source_getChannels(lua_State *L); +extern "C" int luaopen_source(lua_State *L); + +} // audio +} // love + +#endif // LOVE_AUDIO_WRAP_SOURCE_H diff --git a/jni/love/src/modules/event/Event.cpp b/jni/love/src/modules/event/Event.cpp new file mode 100644 index 00000000..ae78b2c6 --- /dev/null +++ b/jni/love/src/modules/event/Event.cpp @@ -0,0 +1,122 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Event.h" + +using love::thread::Mutex; +using love::thread::Lock; + +namespace love +{ +namespace event +{ + +Message::Message(const std::string &name, Variant *a, Variant *b, Variant *c, Variant *d) + : name(name) + , nargs(0) +{ + args[0] = a; + args[1] = b; + args[2] = c; + args[3] = d; + for (int i = 0; i < 4; i++) + { + if (!args[i]) + break; + args[i]->retain(); + nargs++; + } +} + +Message::~Message() +{ + for (int i = 0; i < nargs; i++) + args[i]->release(); +} + +int Message::toLua(lua_State *L) +{ + luax_pushstring(L, name); + for (int i = 0; i < nargs; i++) + args[i]->toLua(L); + return nargs+1; +} + +Message *Message::fromLua(lua_State *L, int n) +{ + std::string name = luax_checkstring(L, n); + n++; + Message *m = new Message(name); + for (int i = 0; i < 4; i++) + { + if (lua_isnoneornil(L, n+i)) + break; + m->args[i] = Variant::fromLua(L, n+i); + if (!m->args[i]) + { + delete m; + luaL_error(L, "Argument %d can't be stored safely\nExpected boolean, number, string or userdata.", n+i); + return NULL; + } + m->nargs++; + } + return m; +} + +Event::Event() +{ + mutex = thread::newMutex(); +} + +Event::~Event() +{ + delete mutex; +} + +void Event::push(Message *msg) +{ + Lock lock(mutex); + msg->retain(); + queue.push(msg); +} + +bool Event::poll(Message *&msg) +{ + Lock lock(mutex); + if (queue.empty()) + return false; + msg = queue.front(); + queue.pop(); + return true; +} + +void Event::clear() +{ + Lock lock(mutex); + while (!queue.empty()) + { + // std::queue::pop will remove the first (front) element. + queue.front()->release(); + queue.pop(); + } +} + +} // event +} // love diff --git a/jni/love/src/modules/event/Event.h b/jni/love/src/modules/event/Event.h new file mode 100644 index 00000000..387bf00c --- /dev/null +++ b/jni/love/src/modules/event/Event.h @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_EVENT_EVENT_H +#define LOVE_EVENT_EVENT_H + +// LOVE +#include "common/Module.h" +#include "common/StringMap.h" +#include "common/Variant.h" +#include "keyboard/Keyboard.h" +#include "mouse/Mouse.h" +#include "joystick/Joystick.h" +#include "thread/threads.h" + +// STL +#include + +namespace love +{ +namespace event +{ +class Message : public Object +{ +private: + std::string name; + Variant *args[4]; + int nargs; + +public: + Message(const std::string &name, Variant *a = NULL, Variant *b = NULL, Variant *c = NULL, Variant *d = NULL); + ~Message(); + + int toLua(lua_State *L); + static Message *fromLua(lua_State *L, int n); +}; + +class Event : public Module +{ +public: + Event(); + virtual ~Event(); + + void push(Message *msg); + bool poll(Message *&msg); + virtual void clear(); + + virtual void pump() = 0; + +protected: + thread::Mutex *mutex; + std::queue queue; + +}; // Event + +} // event +} // love + +#endif // LOVE_EVENT_EVENT_H diff --git a/jni/love/src/modules/event/sdl/Event.cpp b/jni/love/src/modules/event/sdl/Event.cpp new file mode 100644 index 00000000..0c7385ee --- /dev/null +++ b/jni/love/src/modules/event/sdl/Event.cpp @@ -0,0 +1,639 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Event.h" + +#include "keyboard/Keyboard.h" +#include "mouse/Mouse.h" +#include "joystick/JoystickModule.h" +#include "joystick/sdl/Joystick.h" +#include "graphics/Graphics.h" +#include "window/Window.h" +#include "common/Exception.h" + +#include + +namespace love +{ +namespace event +{ +namespace sdl +{ + +const char *Event::getName() const +{ + return "love.event.sdl"; +} + +Event::Event() +{ + if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0) + throw love::Exception("%s", SDL_GetError()); +} + +Event::~Event() +{ + SDL_QuitSubSystem(SDL_INIT_EVENTS); +} + +void Event::pump() +{ + SDL_PumpEvents(); + + static SDL_Event e; + + Message *msg; + + while (SDL_PollEvent(&e)) + { + msg = convert(e); + if (msg) + { + push(msg); + msg->release(); + } + } +} + +Message *Event::wait() +{ + static SDL_Event e; + bool ok = (SDL_WaitEvent(&e) == 1); + if (!ok) + return NULL; + return convert(e); +} + +void Event::clear() +{ + static SDL_Event e; + + while (SDL_PollEvent(&e)) + { + // Do nothing with 'e' ... + } + + love::event::Event::clear(); +} + +Message *Event::convert(const SDL_Event &e) const +{ + Message *msg = NULL; + + love::keyboard::Keyboard *kb = 0; + + love::keyboard::Keyboard::Key key; + love::mouse::Mouse::Button button; + Variant *arg1, *arg2, *arg3; + const char *txt; + std::map::const_iterator keyit; + + switch (e.type) + { + case SDL_KEYDOWN: + if (e.key.repeat) + { + kb = (love::keyboard::Keyboard *) Module::findInstance("love.keyboard."); + if (kb && !kb->hasKeyRepeat()) + break; + } + + keyit = keys.find(e.key.keysym.sym); + if (keyit != keys.end()) + key = keyit->second; + else + key = love::keyboard::Keyboard::KEY_UNKNOWN; + + if (!love::keyboard::Keyboard::getConstant(key, txt)) + txt = "unknown"; + arg1 = new Variant(txt, strlen(txt)); + arg2 = new Variant(e.key.repeat != 0); + msg = new Message("keypressed", arg1, arg2); + arg1->release(); + arg2->release(); + break; + case SDL_KEYUP: + keyit = keys.find(e.key.keysym.sym); + if (keyit != keys.end()) + key = keyit->second; + else + key = love::keyboard::Keyboard::KEY_UNKNOWN; + + if (!love::keyboard::Keyboard::getConstant(key, txt)) + txt = "unknown"; + arg1 = new Variant(txt, strlen(txt)); + msg = new Message("keyreleased", arg1); + arg1->release(); + break; + case SDL_TEXTINPUT: + txt = e.text.text; + arg1 = new Variant(txt, strlen(txt)); + msg = new Message("textinput", arg1); + arg1->release(); + break; + case SDL_TEXTEDITING: + txt = e.edit.text; + arg1 = new Variant(txt, strlen(txt)); + arg2 = new Variant((double) e.edit.start); + arg3 = new Variant((double) e.edit.length); + msg = new Message("textedit", arg1, arg2, arg3); + arg1->release(); + arg2->release(); + arg3->release(); + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + if (buttons.find(e.button.button, button) && mouse::Mouse::getConstant(button, txt)) + { + arg1 = new Variant((double) e.button.x); + arg2 = new Variant((double) e.button.y); + arg3 = new Variant(txt, strlen(txt)); + msg = new Message((e.type == SDL_MOUSEBUTTONDOWN) ? + "mousepressed" : "mousereleased", + arg1, arg2, arg3); + arg1->release(); + arg2->release(); + arg3->release(); + } + break; + case SDL_MOUSEWHEEL: + if (e.wheel.y != 0) + { + button = (e.wheel.y > 0) ? mouse::Mouse::BUTTON_WHEELUP : mouse::Mouse::BUTTON_WHEELDOWN; + if (!love::mouse::Mouse::getConstant(button, txt)) + break; + + int mx, my; + SDL_GetMouseState(&mx, &my); + + arg1 = new Variant((double) mx); + arg2 = new Variant((double) my); + arg3 = new Variant(txt, strlen(txt)); + msg = new Message("mousepressed", arg1, arg2, arg3); + arg1->release(); + arg2->release(); + arg3->release(); + } + break; + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + case SDL_JOYAXISMOTION: + case SDL_JOYBALLMOTION: + case SDL_JOYHATMOTION: + case SDL_JOYDEVICEADDED: + case SDL_JOYDEVICEREMOVED: + case SDL_CONTROLLERBUTTONDOWN: + case SDL_CONTROLLERBUTTONUP: + case SDL_CONTROLLERAXISMOTION: + msg = convertJoystickEvent(e); + break; + case SDL_WINDOWEVENT: + msg = convertWindowEvent(e); + break; + case SDL_DROPFILE: + SDL_free(e.drop.file); + break; + case SDL_QUIT: + msg = new Message("quit"); + break; + default: + break; + } + + return msg; +} + +Message *Event::convertJoystickEvent(const SDL_Event &e) const +{ + joystick::JoystickModule *joymodule = (joystick::JoystickModule *) Module::findInstance("love.joystick."); + if (!joymodule) + return 0; + + Message *msg = 0; + Proxy proxy; + love::joystick::Joystick::Hat hat; + love::joystick::Joystick::GamepadButton padbutton; + love::joystick::Joystick::GamepadAxis padaxis; + Variant *arg1, *arg2, *arg3; + const char *txt; + + switch (e.type) + { + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + proxy.flags = JOYSTICK_JOYSTICK_T; + proxy.data = joymodule->getJoystickFromID(e.jbutton.which); + if (!proxy.data) + break; + + arg1 = new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy); + arg2 = new Variant((double)(e.jbutton.button+1)); + msg = new Message((e.type == SDL_JOYBUTTONDOWN) ? + "joystickpressed" : "joystickreleased", + arg1, arg2); + arg1->release(); + arg2->release(); + break; + case SDL_JOYAXISMOTION: + { + proxy.flags = JOYSTICK_JOYSTICK_T; + proxy.data = joymodule->getJoystickFromID(e.jaxis.which); + if (!proxy.data) + break; + + arg1 = new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy); + arg2 = new Variant((double)(e.jaxis.axis+1)); + float value = e.jaxis.value / 32768.0f; + if (fabsf(value) < 0.001f) value = 0.0f; + if (value < -0.99f) value = -1.0f; + if (value > 0.99f) value = 1.0f; + arg3 = new Variant((double) value); + msg = new Message("joystickaxis", arg1, arg2, arg3); + arg1->release(); + arg2->release(); + arg3->release(); + } + break; + case SDL_JOYHATMOTION: + if (!joystick::sdl::Joystick::getConstant(e.jhat.value, hat) || !joystick::Joystick::getConstant(hat, txt)) + break; + + proxy.flags = JOYSTICK_JOYSTICK_T; + proxy.data = joymodule->getJoystickFromID(e.jhat.which); + if (!proxy.data) + break; + + arg1 = new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy); + arg2 = new Variant((double)(e.jhat.hat+1)); + arg3 = new Variant(txt, strlen(txt)); + msg = new Message("joystickhat", arg1, arg2, arg3); + arg1->release(); + arg2->release(); + arg3->release(); + break; + case SDL_CONTROLLERBUTTONDOWN: + case SDL_CONTROLLERBUTTONUP: + if (!joystick::sdl::Joystick::getConstant((SDL_GameControllerButton) e.cbutton.button, padbutton)) + break; + + if (!joystick::Joystick::getConstant(padbutton, txt)) + break; + + proxy.flags = JOYSTICK_JOYSTICK_T; + proxy.data = joymodule->getJoystickFromID(e.cbutton.which); + if (!proxy.data) + break; + + arg1 = new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy); + arg2 = new Variant(txt, strlen(txt)); + msg = new Message(e.type == SDL_CONTROLLERBUTTONDOWN ? + "gamepadpressed" : "gamepadreleased", arg1, arg2); + arg1->release(); + arg2->release(); + break; + case SDL_CONTROLLERAXISMOTION: + if (joystick::sdl::Joystick::getConstant((SDL_GameControllerAxis) e.caxis.axis, padaxis)) + { + if (!joystick::Joystick::getConstant(padaxis, txt)) + break; + + proxy.flags = JOYSTICK_JOYSTICK_T; + proxy.data = joymodule->getJoystickFromID(e.caxis.which); + if (!proxy.data) + break; + + arg1 = new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy); + + arg2 = new Variant(txt, strlen(txt)); + float value = e.jaxis.value / 32768.0f; + if (fabsf(value) < 0.001f) value = 0.0f; + if (value < -0.99f) value = -1.0f; + if (value > 0.99f) value = 1.0f; + arg3 = new Variant((double) value); + msg = new Message("gamepadaxis", arg1, arg2, arg3); + arg1->release(); + arg2->release(); + arg3->release(); + } + break; + case SDL_JOYDEVICEADDED: + // jdevice.which is the joystick device index. + proxy.data = joymodule->addJoystick(e.jdevice.which); + proxy.flags = JOYSTICK_JOYSTICK_T; + if (proxy.data) + { + arg1 = new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy); + msg = new Message("joystickadded", arg1); + arg1->release(); + } + break; + case SDL_JOYDEVICEREMOVED: + // jdevice.which is the joystick instance ID now. + proxy.data = joymodule->getJoystickFromID(e.jdevice.which); + proxy.flags = JOYSTICK_JOYSTICK_T; + if (proxy.data) + { + joymodule->removeJoystick((joystick::Joystick *) proxy.data); + arg1 = new Variant(JOYSTICK_JOYSTICK_ID, (void *) &proxy); + msg = new Message("joystickremoved", arg1); + arg1->release(); + } + break; + default: + break; + } + + return msg; +} + +Message *Event::convertWindowEvent(const SDL_Event &e) const +{ + Message *msg = 0; + Variant *arg1, *arg2; + window::Window *win = 0; + + if (e.type != SDL_WINDOWEVENT) + return 0; + + switch (e.window.event) + { + case SDL_WINDOWEVENT_FOCUS_GAINED: + case SDL_WINDOWEVENT_FOCUS_LOST: + // Users won't expect the screensaver to activate if a game is in + // focus. Also, joystick input may not delay the screensaver timer. + if (e.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) + SDL_DisableScreenSaver(); + else + SDL_EnableScreenSaver(); + arg1 = new Variant(e.window.event == SDL_WINDOWEVENT_FOCUS_GAINED); + msg = new Message("focus", arg1); + arg1->release(); + break; + case SDL_WINDOWEVENT_ENTER: + case SDL_WINDOWEVENT_LEAVE: + arg1 = new Variant(e.window.event == SDL_WINDOWEVENT_ENTER); + msg = new Message("mousefocus", arg1); + arg1->release(); + break; + case SDL_WINDOWEVENT_SHOWN: + case SDL_WINDOWEVENT_HIDDEN: + arg1 = new Variant(e.window.event == SDL_WINDOWEVENT_SHOWN); + msg = new Message("visible", arg1); + arg1->release(); + break; + case SDL_WINDOWEVENT_RESIZED: + win = (window::Window *) Module::findInstance("love.window."); + if (win) + { + win->onWindowResize(e.window.data1, e.window.data2); + + graphics::Graphics *gfx = (graphics::Graphics *) Module::findInstance("love.graphics."); + if (gfx) + gfx->setViewportSize(e.window.data1, e.window.data2); + } + arg1 = new Variant((double) e.window.data1); + arg2 = new Variant((double) e.window.data2); + msg = new Message("resize", arg1, arg2); + arg1->release(); + arg2->release(); + break; + } + + return msg; +} + +std::map Event::createKeyMap() +{ + using love::keyboard::Keyboard; + + std::map k; + + k[SDLK_UNKNOWN] = Keyboard::KEY_UNKNOWN; + + k[SDLK_RETURN] = Keyboard::KEY_RETURN; + k[SDLK_ESCAPE] = Keyboard::KEY_ESCAPE; + k[SDLK_BACKSPACE] = Keyboard::KEY_BACKSPACE; + k[SDLK_TAB] = Keyboard::KEY_TAB; + k[SDLK_SPACE] = Keyboard::KEY_SPACE; + k[SDLK_EXCLAIM] = Keyboard::KEY_EXCLAIM; + k[SDLK_QUOTEDBL] = Keyboard::KEY_QUOTEDBL; + k[SDLK_HASH] = Keyboard::KEY_HASH; + k[SDLK_DOLLAR] = Keyboard::KEY_DOLLAR; + k[SDLK_AMPERSAND] = Keyboard::KEY_AMPERSAND; + k[SDLK_QUOTE] = Keyboard::KEY_QUOTE; + k[SDLK_LEFTPAREN] = Keyboard::KEY_LEFTPAREN; + k[SDLK_RIGHTPAREN] = Keyboard::KEY_RIGHTPAREN; + k[SDLK_ASTERISK] = Keyboard::KEY_ASTERISK; + k[SDLK_PLUS] = Keyboard::KEY_PLUS; + k[SDLK_COMMA] = Keyboard::KEY_COMMA; + k[SDLK_MINUS] = Keyboard::KEY_MINUS; + k[SDLK_PERIOD] = Keyboard::KEY_PERIOD; + k[SDLK_SLASH] = Keyboard::KEY_SLASH; + k[SDLK_0] = Keyboard::KEY_0; + k[SDLK_1] = Keyboard::KEY_1; + k[SDLK_2] = Keyboard::KEY_2; + k[SDLK_3] = Keyboard::KEY_3; + k[SDLK_4] = Keyboard::KEY_4; + k[SDLK_5] = Keyboard::KEY_5; + k[SDLK_6] = Keyboard::KEY_6; + k[SDLK_7] = Keyboard::KEY_7; + k[SDLK_8] = Keyboard::KEY_8; + k[SDLK_9] = Keyboard::KEY_9; + k[SDLK_COLON] = Keyboard::KEY_COLON; + k[SDLK_SEMICOLON] = Keyboard::KEY_SEMICOLON; + k[SDLK_LESS] = Keyboard::KEY_LESS; + k[SDLK_EQUALS] = Keyboard::KEY_EQUALS; + k[SDLK_GREATER] = Keyboard::KEY_GREATER; + k[SDLK_QUESTION] = Keyboard::KEY_QUESTION; + k[SDLK_AT] = Keyboard::KEY_AT; + + k[SDLK_LEFTBRACKET] = Keyboard::KEY_LEFTBRACKET; + k[SDLK_BACKSLASH] = Keyboard::KEY_BACKSLASH; + k[SDLK_RIGHTBRACKET] = Keyboard::KEY_RIGHTBRACKET; + k[SDLK_CARET] = Keyboard::KEY_CARET; + k[SDLK_UNDERSCORE] = Keyboard::KEY_UNDERSCORE; + k[SDLK_BACKQUOTE] = Keyboard::KEY_BACKQUOTE; + k[SDLK_a] = Keyboard::KEY_A; + k[SDLK_b] = Keyboard::KEY_B; + k[SDLK_c] = Keyboard::KEY_C; + k[SDLK_d] = Keyboard::KEY_D; + k[SDLK_e] = Keyboard::KEY_E; + k[SDLK_f] = Keyboard::KEY_F; + k[SDLK_g] = Keyboard::KEY_G; + k[SDLK_h] = Keyboard::KEY_H; + k[SDLK_i] = Keyboard::KEY_I; + k[SDLK_j] = Keyboard::KEY_J; + k[SDLK_k] = Keyboard::KEY_K; + k[SDLK_l] = Keyboard::KEY_L; + k[SDLK_m] = Keyboard::KEY_M; + k[SDLK_n] = Keyboard::KEY_N; + k[SDLK_o] = Keyboard::KEY_O; + k[SDLK_p] = Keyboard::KEY_P; + k[SDLK_q] = Keyboard::KEY_Q; + k[SDLK_r] = Keyboard::KEY_R; + k[SDLK_s] = Keyboard::KEY_S; + k[SDLK_t] = Keyboard::KEY_T; + k[SDLK_u] = Keyboard::KEY_U; + k[SDLK_v] = Keyboard::KEY_V; + k[SDLK_w] = Keyboard::KEY_W; + k[SDLK_x] = Keyboard::KEY_X; + k[SDLK_y] = Keyboard::KEY_Y; + k[SDLK_z] = Keyboard::KEY_Z; + + k[SDLK_CAPSLOCK] = Keyboard::KEY_CAPSLOCK; + + k[SDLK_F1] = Keyboard::KEY_F1; + k[SDLK_F2] = Keyboard::KEY_F2; + k[SDLK_F3] = Keyboard::KEY_F3; + k[SDLK_F4] = Keyboard::KEY_F4; + k[SDLK_F5] = Keyboard::KEY_F5; + k[SDLK_F6] = Keyboard::KEY_F6; + k[SDLK_F7] = Keyboard::KEY_F7; + k[SDLK_F8] = Keyboard::KEY_F8; + k[SDLK_F9] = Keyboard::KEY_F9; + k[SDLK_F10] = Keyboard::KEY_F10; + k[SDLK_F11] = Keyboard::KEY_F11; + k[SDLK_F12] = Keyboard::KEY_F12; + + k[SDLK_PRINTSCREEN] = Keyboard::KEY_PRINTSCREEN; + k[SDLK_SCROLLLOCK] = Keyboard::KEY_SCROLLLOCK; + k[SDLK_PAUSE] = Keyboard::KEY_PAUSE; + k[SDLK_INSERT] = Keyboard::KEY_INSERT; + k[SDLK_HOME] = Keyboard::KEY_HOME; + k[SDLK_PAGEUP] = Keyboard::KEY_PAGEUP; + k[SDLK_DELETE] = Keyboard::KEY_DELETE; + k[SDLK_END] = Keyboard::KEY_END; + k[SDLK_PAGEDOWN] = Keyboard::KEY_PAGEDOWN; + k[SDLK_RIGHT] = Keyboard::KEY_RIGHT; + k[SDLK_LEFT] = Keyboard::KEY_LEFT; + k[SDLK_DOWN] = Keyboard::KEY_DOWN; + k[SDLK_UP] = Keyboard::KEY_UP; + + k[SDLK_NUMLOCKCLEAR] = Keyboard::KEY_NUMLOCKCLEAR; + k[SDLK_KP_DIVIDE] = Keyboard::KEY_KP_DIVIDE; + k[SDLK_KP_MULTIPLY] = Keyboard::KEY_KP_MULTIPLY; + k[SDLK_KP_MINUS] = Keyboard::KEY_KP_MINUS; + k[SDLK_KP_PLUS] = Keyboard::KEY_KP_PLUS; + k[SDLK_KP_ENTER] = Keyboard::KEY_KP_ENTER; + k[SDLK_KP_0] = Keyboard::KEY_KP_0; + k[SDLK_KP_1] = Keyboard::KEY_KP_1; + k[SDLK_KP_2] = Keyboard::KEY_KP_2; + k[SDLK_KP_3] = Keyboard::KEY_KP_3; + k[SDLK_KP_4] = Keyboard::KEY_KP_4; + k[SDLK_KP_5] = Keyboard::KEY_KP_5; + k[SDLK_KP_6] = Keyboard::KEY_KP_6; + k[SDLK_KP_7] = Keyboard::KEY_KP_7; + k[SDLK_KP_8] = Keyboard::KEY_KP_8; + k[SDLK_KP_9] = Keyboard::KEY_KP_9; + k[SDLK_KP_PERIOD] = Keyboard::KEY_KP_PERIOD; + k[SDLK_KP_COMMA] = Keyboard::KEY_KP_COMMA; + k[SDLK_KP_EQUALS] = Keyboard::KEY_KP_EQUALS; + + k[SDLK_APPLICATION] = Keyboard::KEY_APPLICATION; + k[SDLK_POWER] = Keyboard::KEY_POWER; + k[SDLK_F13] = Keyboard::KEY_F13; + k[SDLK_F14] = Keyboard::KEY_F14; + k[SDLK_F15] = Keyboard::KEY_F15; + k[SDLK_F16] = Keyboard::KEY_F16; + k[SDLK_F17] = Keyboard::KEY_F17; + k[SDLK_F18] = Keyboard::KEY_F18; + k[SDLK_F19] = Keyboard::KEY_F19; + k[SDLK_F20] = Keyboard::KEY_F20; + k[SDLK_F21] = Keyboard::KEY_F21; + k[SDLK_F22] = Keyboard::KEY_F22; + k[SDLK_F23] = Keyboard::KEY_F23; + k[SDLK_F24] = Keyboard::KEY_F24; + k[SDLK_EXECUTE] = Keyboard::KEY_EXECUTE; + k[SDLK_HELP] = Keyboard::KEY_HELP; + k[SDLK_MENU] = Keyboard::KEY_MENU; + k[SDLK_SELECT] = Keyboard::KEY_SELECT; + k[SDLK_STOP] = Keyboard::KEY_STOP; + k[SDLK_AGAIN] = Keyboard::KEY_AGAIN; + k[SDLK_UNDO] = Keyboard::KEY_UNDO; + k[SDLK_CUT] = Keyboard::KEY_CUT; + k[SDLK_COPY] = Keyboard::KEY_COPY; + k[SDLK_PASTE] = Keyboard::KEY_PASTE; + k[SDLK_FIND] = Keyboard::KEY_FIND; + k[SDLK_MUTE] = Keyboard::KEY_MUTE; + k[SDLK_VOLUMEUP] = Keyboard::KEY_VOLUMEUP; + k[SDLK_VOLUMEDOWN] = Keyboard::KEY_VOLUMEDOWN; + + k[SDLK_ALTERASE] = Keyboard::KEY_ALTERASE; + k[SDLK_SYSREQ] = Keyboard::KEY_SYSREQ; + k[SDLK_CANCEL] = Keyboard::KEY_CANCEL; + k[SDLK_CLEAR] = Keyboard::KEY_CLEAR; + k[SDLK_PRIOR] = Keyboard::KEY_PRIOR; + k[SDLK_RETURN2] = Keyboard::KEY_RETURN2; + k[SDLK_SEPARATOR] = Keyboard::KEY_SEPARATOR; + k[SDLK_OUT] = Keyboard::KEY_OUT; + k[SDLK_OPER] = Keyboard::KEY_OPER; + k[SDLK_CLEARAGAIN] = Keyboard::KEY_CLEARAGAIN; + + k[SDLK_THOUSANDSSEPARATOR] = Keyboard::KEY_THOUSANDSSEPARATOR; + k[SDLK_DECIMALSEPARATOR] = Keyboard::KEY_DECIMALSEPARATOR; + k[SDLK_CURRENCYUNIT] = Keyboard::KEY_CURRENCYUNIT; + k[SDLK_CURRENCYSUBUNIT] = Keyboard::KEY_CURRENCYSUBUNIT; + + k[SDLK_LCTRL] = Keyboard::KEY_LCTRL; + k[SDLK_LSHIFT] = Keyboard::KEY_LSHIFT; + k[SDLK_LALT] = Keyboard::KEY_LALT; + k[SDLK_LGUI] = Keyboard::KEY_LGUI; + k[SDLK_RCTRL] = Keyboard::KEY_RCTRL; + k[SDLK_RSHIFT] = Keyboard::KEY_RSHIFT; + k[SDLK_RALT] = Keyboard::KEY_RALT; + k[SDLK_RGUI] = Keyboard::KEY_RGUI; + + k[SDLK_MODE] = Keyboard::KEY_MODE; + + k[SDLK_AUDIONEXT] = Keyboard::KEY_AUDIONEXT; + k[SDLK_AUDIOPREV] = Keyboard::KEY_AUDIOPREV; + k[SDLK_AUDIOSTOP] = Keyboard::KEY_AUDIOSTOP; + k[SDLK_AUDIOPLAY] = Keyboard::KEY_AUDIOPLAY; + k[SDLK_AUDIOMUTE] = Keyboard::KEY_AUDIOMUTE; + k[SDLK_MEDIASELECT] = Keyboard::KEY_MEDIASELECT; + + k[SDLK_BRIGHTNESSDOWN] = Keyboard::KEY_BRIGHTNESSDOWN; + k[SDLK_BRIGHTNESSUP] = Keyboard::KEY_BRIGHTNESSUP; + k[SDLK_DISPLAYSWITCH] = Keyboard::KEY_DISPLAYSWITCH; + k[SDLK_KBDILLUMTOGGLE] = Keyboard::KEY_KBDILLUMTOGGLE; + k[SDLK_KBDILLUMDOWN] = Keyboard::KEY_KBDILLUMDOWN; + k[SDLK_KBDILLUMUP] = Keyboard::KEY_KBDILLUMUP; + k[SDLK_EJECT] = Keyboard::KEY_EJECT; + k[SDLK_SLEEP] = Keyboard::KEY_SLEEP; + + return k; +} + +std::map Event::keys = Event::createKeyMap(); + +EnumMap::Entry Event::buttonEntries[] = +{ + { love::mouse::Mouse::BUTTON_LEFT, SDL_BUTTON_LEFT}, + { love::mouse::Mouse::BUTTON_MIDDLE, SDL_BUTTON_MIDDLE}, + { love::mouse::Mouse::BUTTON_RIGHT, SDL_BUTTON_RIGHT}, + { love::mouse::Mouse::BUTTON_X1, SDL_BUTTON_X1}, + { love::mouse::Mouse::BUTTON_X2, SDL_BUTTON_X2}, +}; + +EnumMap Event::buttons(Event::buttonEntries, sizeof(Event::buttonEntries)); + +} // sdl +} // event +} // love diff --git a/jni/love/src/modules/event/sdl/Event.h b/jni/love/src/modules/event/sdl/Event.h new file mode 100644 index 00000000..ab5a0a9a --- /dev/null +++ b/jni/love/src/modules/event/sdl/Event.h @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_EVENT_SDL_EVENT_H +#define LOVE_EVENT_SDL_EVENT_H + +// LOVE +#include "event/Event.h" +#include "common/runtime.h" +#include "common/EnumMap.h" + +// SDL +#include + +// STL +#include + +namespace love +{ +namespace event +{ +namespace sdl +{ + +class Event : public love::event::Event +{ +public: + + // Implements Module. + const char *getName() const; + + Event(); + virtual ~Event(); + + /** + * Pumps the event queue. This function gathers all the pending input information + * from devices and places it on the event queue. Normally not needed if you poll + * for events. + **/ + void pump(); + + /** + * Waits for the next event (indefinitely). Useful for creating games where + * the screen and game state only needs updating when the user interacts with + * the window. + **/ + Message *wait(); + + /** + * Clears the event queue. + */ + void clear(); + +private: + + Message *convert(const SDL_Event &e) const; + Message *convertJoystickEvent(const SDL_Event &e) const; + Message *convertWindowEvent(const SDL_Event &e) const; + + static std::map createKeyMap(); + static std::map keys; + + static EnumMap::Entry buttonEntries[]; + static EnumMap buttons; + +}; // System + +} // sdl +} // event +} // love + +#endif // LOVE_EVENT_SDL_EVENT_H diff --git a/jni/love/src/modules/event/sdl/wrap_Event.cpp b/jni/love/src/modules/event/sdl/wrap_Event.cpp new file mode 100644 index 00000000..c97b36e3 --- /dev/null +++ b/jni/love/src/modules/event/sdl/wrap_Event.cpp @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Event.h" + +// LOVE +#include "common/runtime.h" + +// sdlevent +#include "Event.h" + +namespace love +{ +namespace event +{ +namespace sdl +{ + +static Event *instance = 0; + +static int poll_i(lua_State *L) +{ + Message *m; + + while (instance->poll(m)) + { + int args = m->toLua(L); + m->release(); + return args; + } + + // No pending events. + return 0; +} + +int w_pump(lua_State *) +{ + instance->pump(); + return 0; +} + +int w_poll(lua_State *L) +{ + lua_pushcclosure(L, &poll_i, 0); + return 1; +} + +int w_wait(lua_State *L) +{ + Message *m; + + if ((m = instance->wait())) + { + int args = m->toLua(L); + m->release(); + return args; + } + + return 0; +} + +int w_push(lua_State *L) +{ + Message *m; + + bool success = (m = Message::fromLua(L, 1)) != NULL; + luax_pushboolean(L, success); + + if (!success) + return 1; + + instance->push(m); + m->release(); + + return 1; +} + +int w_clear(lua_State *) +{ + instance->clear(); + return 0; +} + +int w_quit(lua_State *L) +{ + Message *m = new Message("quit"); + instance->push(m); + m->release(); + luax_pushboolean(L, true); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "pump", w_pump }, + { "poll", w_poll }, + { "wait", w_wait }, + { "push", w_push }, + { "clear", w_clear }, + { "quit", w_quit }, + { 0, 0 } +}; + +extern "C" int luaopen_love_event(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new Event();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "event"; + w.flags = MODULE_T; + w.functions = functions; + w.types = 0; + + return luax_register_module(L, w); +} + +} // sdl +} // event +} // love diff --git a/jni/love/src/modules/event/sdl/wrap_Event.h b/jni/love/src/modules/event/sdl/wrap_Event.h new file mode 100644 index 00000000..66de0e2b --- /dev/null +++ b/jni/love/src/modules/event/sdl/wrap_Event.h @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_EVENT_SDL_WRAP_EVENT_H +#define LOVE_EVENT_SDL_WRAP_EVENT_H + +// LOVE +#include "common/config.h" +#include "Event.h" + +namespace love +{ +namespace event +{ +namespace sdl +{ + +int w_pump(lua_State *L); +int w_poll(lua_State *L); +int w_wait(lua_State *L); +int w_push(lua_State *L); +int w_clear(lua_State *L); +int w_quit(lua_State *L); + +extern "C" LOVE_EXPORT int luaopen_love_event(lua_State *L); + +} // sdl +} // event +} // love + +#endif // LOVE_EVENT_SDL_WRAP_EVENT_H diff --git a/jni/love/src/modules/filesystem/File.cpp b/jni/love/src/modules/filesystem/File.cpp new file mode 100644 index 00000000..49f0b341 --- /dev/null +++ b/jni/love/src/modules/filesystem/File.cpp @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "File.h" + +namespace love +{ +namespace filesystem +{ + +File::~File() +{ +} + +bool File::getConstant(const char *in, Mode &out) +{ + return modes.find(in, out); +} + +bool File::getConstant(Mode in, const char *&out) +{ + return modes.find(in, out); +} + +bool File::getConstant(const char *in, BufferMode &out) +{ + return bufferModes.find(in, out); +} + +bool File::getConstant(BufferMode in, const char *&out) +{ + return bufferModes.find(in, out); +} + +StringMap::Entry File::modeEntries[] = +{ + {"c", File::CLOSED}, + {"r", File::READ}, + {"w", File::WRITE}, + {"a", File::APPEND}, +}; + +StringMap File::modes(File::modeEntries, sizeof(File::modeEntries)); + +StringMap::Entry File::bufferModeEntries[] = +{ + {"none", File::BUFFER_NONE}, + {"line", File::BUFFER_LINE}, + {"full", File::BUFFER_FULL}, +}; + +StringMap File::bufferModes(File::bufferModeEntries, sizeof(File::bufferModeEntries)); + +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/File.h b/jni/love/src/modules/filesystem/File.h new file mode 100644 index 00000000..4c5bbdc7 --- /dev/null +++ b/jni/love/src/modules/filesystem/File.h @@ -0,0 +1,222 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FILESYSTEM_FILE_H +#define LOVE_FILESYSTEM_FILE_H + +// STD +#include + +// LOVE +#include "common/Data.h" +#include "common/Object.h" +#include "common/StringMap.h" +#include "common/int.h" +#include "FileData.h" + +namespace love +{ +namespace filesystem +{ + +/** + * A File interface, providing generic means of reading from and + * writing to files. + **/ +class File : public Object +{ +public: + + /** + * File open mode. + **/ + enum Mode + { + CLOSED, + READ, + WRITE, + APPEND, + MODE_MAX_ENUM + }; + + enum BufferMode + { + BUFFER_NONE, + BUFFER_LINE, + BUFFER_FULL, + BUFFER_MAX_ENUM + }; + + /** + * Used to indicate ALL data in a file. + **/ + static const int64 ALL = -1; + + /** + * Destructor. + **/ + virtual ~File(); + + /** + * Opens the file in a certain mode. + * + * @param mode READ, WRITE, APPEND. + * @return True if successful, false otherwise. + **/ + virtual bool open(Mode mode) = 0; + + /** + * Closes the file. + * + * @return True if successful, false otherwise. + **/ + virtual bool close() = 0; + + /** + * Gets whether the file is open. + **/ + virtual bool isOpen() const = 0; + + /** + * Gets the size of the file. + * + * @return The size of the file. + **/ + virtual int64 getSize() = 0; + + /** + * Reads data from the file and allocates a Data object. + * + * @param size The number of bytes to attempt reading, or -1 for EOF. + * @return A newly allocated Data object. + **/ + virtual FileData *read(int64 size = ALL) = 0; + + /** + * Reads data into the destination buffer. + * + * @param dst The destination buffer. + * @param size The number of bytes to attempt reading. + * @return The number of bytes actually read. + **/ + virtual int64 read(void *dst, int64 size) = 0; + + /** + * Writes data into the File. + * + * @param data The source buffer. + * @param size The size of the buffer. + * @return True of success, false otherwise. + **/ + virtual bool write(const void *data, int64 size) = 0; + + /** + * Writes a Data object into the File. + * + * @param data The data object to write into the file. + * @param size The number of bytes to attempt writing, or -1 for everything. + * @return True of success, false otherwise. + **/ + virtual bool write(const Data *data, int64 size = ALL) = 0; + + /** + * Flushes the currently buffered file data to disk. Only applicable in + * write mode. + **/ + virtual bool flush() = 0; + + /** + * Checks whether we are currently at end-of-file. + * + * @return True if EOF, false otherwise. + **/ + virtual bool eof() = 0; + + /** + * Gets the current position in the File. + * + * @return The current byte position in the File. + **/ + virtual int64 tell() = 0; + + /** + * Seeks to a certain position in the File. + * + * @param pos The byte position in the file. + * @return True on success, false otherwise. + **/ + virtual bool seek(uint64 pos) = 0; + + /** + * Sets the buffering mode for the file. When buffering is enabled, the file + * will not write to disk (or will pre-load data if in read mode) until the + * buffer's capacity is reached. + * In the BUFFER_LINE mode, the file will also write to disk if a newline is + * written. + * + * @param bufmode The buffer mode. + * @param size The size in bytes of the buffer. + **/ + virtual bool setBuffer(BufferMode bufmode, int64 size) = 0; + + /** + * @param[out] size The size in bytes of the buffer. + * @return The current buffer mode. + **/ + virtual BufferMode getBuffer(int64 &size) const = 0; + + /** + * Gets the current mode of the File. + * @return The current mode of the File; CLOSED, READ, WRITE or APPEND. + **/ + virtual Mode getMode() const = 0; + + /** + * Gets the filename for this File, or empty string if none. + * @return The filename for this File. + **/ + virtual std::string getFilename() const = 0; + + /** + * Gets the file extension for this File, or empty string if none. + * @return The file extension for this File (without the dot). + **/ + virtual std::string getExtension() const = 0; + + static bool getConstant(const char *in, Mode &out); + static bool getConstant(Mode in, const char *&out); + + static bool getConstant(const char *in, BufferMode &out); + static bool getConstant(BufferMode in, const char *&out); + +private: + + static StringMap::Entry modeEntries[]; + static StringMap modes; + + static StringMap::Entry bufferModeEntries[]; + static StringMap bufferModes; + +}; // File + +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_FILE_H diff --git a/jni/love/src/modules/filesystem/FileData.cpp b/jni/love/src/modules/filesystem/FileData.cpp new file mode 100644 index 00000000..dc3fab5f --- /dev/null +++ b/jni/love/src/modules/filesystem/FileData.cpp @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "FileData.h" + +// STD +#include +#include + +namespace love +{ +namespace filesystem +{ + +FileData::FileData(uint64 size, const std::string &filename) + : data(new char[(size_t) size]) + , size(size) + , filename(filename) +{ + if (filename.rfind('.') != std::string::npos) + extension = filename.substr(filename.rfind('.')+1); +} + +FileData::~FileData() +{ + delete [] data; +} + +void *FileData::getData() const +{ + return (void *)data; +} + +// TODO: Enable this +/*uint64 FileData::getSize() const +{ + return size; +}*/ + +int FileData::getSize() const +{ + return size > INT_MAX ? INT_MAX : (int) size; +} + +const std::string &FileData::getFilename() const +{ + return filename; +} + +const std::string &FileData::getExtension() const +{ + return extension; +} + +bool FileData::getConstant(const char *in, Decoder &out) +{ + return decoders.find(in, out); +} + +bool FileData::getConstant(Decoder in, const char *&out) +{ + return decoders.find(in, out); +} + +StringMap::Entry FileData::decoderEntries[] = +{ + {"file", FileData::FILE}, + {"base64", FileData::BASE64}, +}; + +StringMap FileData::decoders(FileData::decoderEntries, sizeof(FileData::decoderEntries)); + +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/FileData.h b/jni/love/src/modules/filesystem/FileData.h new file mode 100644 index 00000000..8712e597 --- /dev/null +++ b/jni/love/src/modules/filesystem/FileData.h @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FILESYSTEM_FILE_DATA_H +#define LOVE_FILESYSTEM_FILE_DATA_H + +// LOVE +#include +#include "common/Data.h" +#include "common/StringMap.h" +#include "common/int.h" + +namespace love +{ +namespace filesystem +{ + +class FileData : public Data +{ +public: + + enum Decoder + { + FILE, + BASE64, + DECODE_MAX_ENUM + }; // Decoder + + FileData(uint64 size, const std::string &filename); + + virtual ~FileData(); + + // Implements Data. + void *getData() const; + //TODO: Enable this + //uint64 getSize() const; + int getSize() const; + + const std::string &getFilename() const; + const std::string &getExtension() const; + + static bool getConstant(const char *in, Decoder &out); + static bool getConstant(Decoder in, const char *&out); + +private: + + // The actual data. + char *data; + + // Size of the data. + uint64 size; + + // The filename used for error purposes. + std::string filename; + + // The extension (without dot). Used to identify file type. + std::string extension; + + static StringMap::Entry decoderEntries[]; + static StringMap decoders; + +}; // FileData + +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_FILE_DATA_H diff --git a/jni/love/src/modules/filesystem/physfs/File.cpp b/jni/love/src/modules/filesystem/physfs/File.cpp new file mode 100644 index 00000000..ad691ced --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/File.cpp @@ -0,0 +1,342 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "File.h" + +// STD +#include + +// LOVE +#include "Filesystem.h" +#include "filesystem/FileData.h" + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +extern bool hack_setupWriteDirectory(); + +File::File(const std::string &filename) + : filename(filename) + , file(0) + , mode(CLOSED) + , bufferMode(BUFFER_NONE) + , bufferSize(0) +{ +} + +File::~File() +{ + if (mode != CLOSED) + close(); +} + +bool File::open(Mode mode) +{ + if (mode == CLOSED) + return true; + + // File must exist if read mode. + if ((mode == READ) && !PHYSFS_exists(filename.c_str())) + throw love::Exception("Could not open file %s. Does not exist.", filename.c_str()); + + // Check whether the write directory is set. + if ((mode == APPEND || mode == WRITE) && (PHYSFS_getWriteDir() == 0) && !hack_setupWriteDirectory()) + throw love::Exception("Could not set write directory."); + + // File already open? + if (file != 0) + return false; + + this->mode = mode; + + switch (mode) + { + case READ: + file = PHYSFS_openRead(filename.c_str()); + break; + case APPEND: + file = PHYSFS_openAppend(filename.c_str()); + break; + case WRITE: + file = PHYSFS_openWrite(filename.c_str()); + break; + default: + break; + } + + if (file != 0 && !setBuffer(bufferMode, bufferSize)) + { + // Revert to buffer defaults if we don't successfully set the buffer. + bufferMode = BUFFER_NONE; + bufferSize = 0; + } + + return (file != 0); +} + +bool File::close() +{ + if (!PHYSFS_close(file)) + return false; + mode = CLOSED; + file = 0; + return true; +} + +bool File::isOpen() const +{ + return mode != CLOSED && file != 0; +} + +int64 File::getSize() +{ + // If the file is closed, open it to + // check the size. + if (file == 0) + { + open(READ); + int64 size = (int64)PHYSFS_fileLength(file); + close(); + return size; + } + + return (int64)PHYSFS_fileLength(file); +} + + +FileData *File::read(int64 size) +{ + bool isOpen = (file != 0); + + if (!isOpen && !open(READ)) + throw love::Exception("Could not read file %s.", filename.c_str()); + + int64 max = getSize(); + int64 cur = tell(); + size = (size == ALL) ? max : size; + + if (size < 0) + throw love::Exception("Invalid read size."); + + // Clamping because the file offset may be in a weird position. + if (cur < 0) + cur = 0; + else if (cur > max) + cur = max; + + if (cur + size > max) + size = max - cur; + + FileData *fileData = new FileData(size, getFilename()); + int64 bytesRead = read(fileData->getData(), size); + + if (bytesRead < 0 || (bytesRead == 0 && bytesRead != size)) + { + delete fileData; + throw love::Exception("Could not read from file."); + } + if (bytesRead < size) + { + FileData *tmpFileData = new FileData(bytesRead, getFilename()); + memcpy(tmpFileData->getData(), fileData->getData(), (size_t) bytesRead); + delete fileData; + fileData = tmpFileData; + } + + if (!isOpen) + close(); + + return fileData; +} + +int64 File::read(void *dst, int64 size) +{ + if (!file || mode != READ) + throw love::Exception("File is not opened for reading."); + + int64 max = (int64)PHYSFS_fileLength(file); + size = (size == ALL) ? max : size; + size = (size > max) ? max : size; + // Sadly, we'll have to clamp to 32 bits here + size = (size > LOVE_UINT32_MAX) ? LOVE_UINT32_MAX : size; + + if (size < 0) + throw love::Exception("Invalid read size."); + + int64 read = (int64)PHYSFS_read(file, dst, 1, (PHYSFS_uint32) size); + + return read; +} + +bool File::write(const void *data, int64 size) +{ + if (!file || (mode != WRITE && mode != APPEND)) + throw love::Exception("File is not opened for writing."); + + // Another clamp, for the time being. + size = (size > LOVE_UINT32_MAX) ? LOVE_UINT32_MAX : size; + + if (size < 0) + throw love::Exception("Invalid write size."); + + // Try to write. + int64 written = static_cast(PHYSFS_write(file, data, 1, (PHYSFS_uint32) size)); + + // Check that correct amount of data was written. + if (written != size) + return false; + + // Manually flush the buffer in BUFFER_LINE mode if we find a newline. + if (bufferMode == BUFFER_LINE && bufferSize > size) + { + if (memchr(data, '\n', (size_t) size) != NULL) + flush(); + } + + return true; +} + +bool File::write(const Data *data, int64 size) +{ + return write(data->getData(), (size == ALL) ? data->getSize() : size); +} + +bool File::flush() +{ + if (!file || (mode != WRITE && mode != APPEND)) + throw love::Exception("File is not opened for writing."); + + return PHYSFS_flush(file) != 0; +} + +#ifdef LOVE_WINDOWS +// MSVC doesn't like the 'this' keyword +// well, we'll use 'that'. +// It zigs, we zag. +inline bool test_eof(File *that, PHYSFS_File *) +{ + int64 pos = that->tell(); + int64 size = that->getSize(); + return pos == -1 || size == -1 || pos >= size; +} +#else +inline bool test_eof(File *, PHYSFS_File *file) +{ + return PHYSFS_eof(file); +} +#endif + +bool File::eof() +{ + if (file == 0 || test_eof(this, file)) + return true; + return false; +} + +int64 File::tell() +{ + if (file == 0) + return -1; + + return (int64) PHYSFS_tell(file); +} + +bool File::seek(uint64 pos) +{ + if (file == 0) + return false; + + if (!PHYSFS_seek(file, (PHYSFS_uint64) pos)) + return false; + return true; +} + +bool File::setBuffer(BufferMode bufmode, int64 size) +{ + // No negativity allowed! + if (size < 0) + return false; + + // If the file isn't open, we'll make sure the buffer values are set in + // File::open. + if (file == 0 || mode == CLOSED) + { + bufferMode = bufmode; + bufferSize = size; + return true; + } + + int ret = 1; + + switch (bufmode) + { + case BUFFER_NONE: + default: + ret = PHYSFS_setBuffer(file, 0); + size = 0; + break; + case BUFFER_LINE: + case BUFFER_FULL: + ret = PHYSFS_setBuffer(file, size); + break; + } + + if (ret == 0) + return false; + + bufferMode = bufmode; + bufferSize = size; + + return true; +} + +File::BufferMode File::getBuffer(int64 &size) const +{ + size = bufferSize; + return bufferMode; +} + +std::string File::getFilename() const +{ + return filename; +} + +std::string File::getExtension() const +{ + std::string::size_type idx = filename.rfind('.'); + + if (idx != std::string::npos) + return filename.substr(idx+1); + else + return std::string(); +} + +filesystem::File::Mode File::getMode() const +{ + return mode; +} + +} // physfs +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/physfs/File.h b/jni/love/src/modules/filesystem/physfs/File.h new file mode 100644 index 00000000..ff82a485 --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/File.h @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FILESYSTEM_PHYSFS_FILE_H +#define LOVE_FILESYSTEM_PHYSFS_FILE_H + +// LOVE +#include "filesystem/File.h" + +// PhysFS +#ifdef LOVE_MACOSX // wacky Mac behavior means different #include syntax! +#include +#else +#include +#endif + +// STD +#include + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +class File : public love::filesystem::File +{ +public: + + /** + * Constructs an File with the given ilename. + * @param filename The relative filepath of the file to load. + **/ + File(const std::string &filename); + + virtual ~File(); + + // Implements love::filesystem::File. + bool open(Mode mode); + bool close(); + bool isOpen() const; + int64 getSize(); + FileData *read(int64 size = ALL); + int64 read(void *dst, int64 size); + bool write(const void *data, int64 size); + bool write(const Data *data, int64 size = ALL); + bool flush(); + bool eof(); + int64 tell(); + bool seek(uint64 pos); + bool setBuffer(BufferMode bufmode, int64 size); + BufferMode getBuffer(int64 &size) const; + Mode getMode() const; + std::string getFilename() const; + std::string getExtension() const; + +private: + + // filename + std::string filename; + + // PHYSFS File handle. + PHYSFS_File *file; + + // The current mode of the file. + Mode mode; + + BufferMode bufferMode; + int64 bufferSize; + +}; // File + +} // physfs +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_PHYSFS_FILE_H diff --git a/jni/love/src/modules/filesystem/physfs/Filesystem.cpp b/jni/love/src/modules/filesystem/physfs/Filesystem.cpp new file mode 100644 index 00000000..d121021b --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/Filesystem.cpp @@ -0,0 +1,609 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" + +#include + +#include "common/utf8.h" +#include "common/b64.h" + +#include "Filesystem.h" + +namespace +{ + size_t getDriveDelim(const std::string &input) + { + for (size_t i = 0; i < input.size(); ++i) + if (input[i] == '/' || input[i] == '\\') + return i; + // Something's horribly wrong + return 0; + } + + std::string getDriveRoot(const std::string &input) + { + return input.substr(0, getDriveDelim(input)+1); + } + + std::string skipDriveRoot(const std::string &input) + { + return input.substr(getDriveDelim(input)+1); + } +} + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +Filesystem::Filesystem() + : initialized(false) + , fused(false) + , fusedSet(false) +{ +} + +Filesystem::~Filesystem() +{ + if (initialized) + PHYSFS_deinit(); +} + +const char *Filesystem::getName() const +{ + return "love.filesystem.physfs"; +} + +void Filesystem::init(const char *arg0) +{ + if (!PHYSFS_init(arg0)) + throw Exception(PHYSFS_getLastError()); + initialized = true; +} + +void Filesystem::setFused(bool fused) +{ + if (fusedSet) + return; + this->fused = fused; + fusedSet = true; +} + +bool Filesystem::isFused() const +{ + if (!fusedSet) + return false; + return fused; +} + +bool Filesystem::setIdentity(const char *ident, bool appendToPath) +{ + if (!initialized) + return false; + + std::string old_save_path = save_path_full; + + // Store the save directory. + save_identity = std::string(ident); + + // Generate the relative path to the game save folder. + save_path_relative = std::string(LOVE_APPDATA_PREFIX LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR) + save_identity; + + // Generate the full path to the game save folder. + save_path_full = std::string(getAppdataDirectory()) + std::string(LOVE_PATH_SEPARATOR); + if (fused) + save_path_full += std::string(LOVE_APPDATA_PREFIX) + save_identity; + else + save_path_full += save_path_relative; + + // We now have something like: + // save_identity: game + // save_path_relative: ./LOVE/game + // save_path_full: C:\Documents and Settings\user\Application Data/LOVE/game + + // We don't want old read-only save paths to accumulate when we set a new + // identity. + if (!old_save_path.empty()) + PHYSFS_removeFromSearchPath(old_save_path.c_str()); + + // Try to add the save directory to the search path. + // (No error on fail, it means that the path doesn't exist). + PHYSFS_addToSearchPath(save_path_full.c_str(), appendToPath); + + return true; +} + +const char *Filesystem::getIdentity() const +{ + return save_identity.c_str(); +} + +bool Filesystem::setSource(const char *source) +{ + if (!initialized) + return false; + + // Check whether directory is already set. + if (!game_source.empty()) + return false; + + // Add the directory. + if (!PHYSFS_addToSearchPath(source, 1)) + return false; + + // Save the game source. + game_source = std::string(source); + + return true; +} + +const char *Filesystem::getSource() const +{ + return game_source.c_str(); +} + +bool Filesystem::setupWriteDirectory() +{ + if (!initialized) + return false; + + // These must all be set. + if (save_identity.empty() || save_path_full.empty() || save_path_relative.empty()) + return false; + + // Set the appdata folder as writable directory. + // (We must create the save folder before mounting it). + if (!PHYSFS_setWriteDir(getDriveRoot(save_path_full).c_str())) + return false; + + // Create the save folder. (We're now "at" %APPDATA%). + if (!createDirectory(skipDriveRoot(save_path_full).c_str())) + { + // Clear the write directory in case of error. + PHYSFS_setWriteDir(0); + return false; + } + + // Set the final write directory. + if (!PHYSFS_setWriteDir(save_path_full.c_str())) + return false; + + // Add the directory. (Will not be readded if already present). + if (!PHYSFS_addToSearchPath(save_path_full.c_str(), 0)) + { + PHYSFS_setWriteDir(0); // Clear the write directory in case of error. + return false; + } + + return true; +} + +bool Filesystem::mount(const char *archive, const char *mountpoint, bool appendToPath) +{ + if (!initialized || !archive) + return false; + + std::string realPath; + std::string sourceBase = getSourceBaseDirectory(); + + if (isFused() && sourceBase.compare(archive) == 0) + { + // Special case: if the game is fused and the archive is the source's + // base directory, mount it even though it's outside of the save dir. + realPath = sourceBase; + } + else + { + // Not allowed for safety reasons. + if (strlen(archive) == 0 || strstr(archive, "..") || strcmp(archive, "/") == 0) + return false; + + const char *realDir = PHYSFS_getRealDir(archive); + if (!realDir) + return false; + + realPath = realDir; + + // Always disallow mounting of files inside the game source, since it + // won't work anyway if the game source is a zipped .love file. + if (realPath.find(game_source) == 0) + return false; + + realPath += LOVE_PATH_SEPARATOR; + realPath += archive; + } + + if (realPath.length() == 0) + return false; + + return PHYSFS_mount(realPath.c_str(), mountpoint, appendToPath); +} + +bool Filesystem::unmount(const char *archive) +{ + if (!initialized || !archive) + return false; + + std::string realPath; + std::string sourceBase = getSourceBaseDirectory(); + + if (isFused() && sourceBase.compare(archive) == 0) + { + // Special case: if the game is fused and the archive is the source's + // base directory, unmount it even though it's outside of the save dir. + realPath = sourceBase; + } + else + { + // Not allowed for safety reasons. + if (strlen(archive) == 0 || strstr(archive, "..") || strcmp(archive, "/") == 0) + return false; + + const char *realDir = PHYSFS_getRealDir(archive); + if (!realDir) + return false; + + realPath = realDir; + realPath += LOVE_PATH_SEPARATOR; + realPath += archive; + } + + const char *mountPoint = PHYSFS_getMountPoint(realPath.c_str()); + if (!mountPoint) + return false; + + return PHYSFS_removeFromSearchPath(realPath.c_str()); +} + +File *Filesystem::newFile(const char *filename) const +{ + return new File(filename); +} + +FileData *Filesystem::newFileData(void *data, unsigned int size, const char *filename) const +{ + FileData *fd = new FileData(size, std::string(filename)); + + // Copy the data into FileData. + memcpy(fd->getData(), data, size); + + return fd; +} + +FileData *Filesystem::newFileData(const char *b64, const char *filename) const +{ + int size = strlen(b64); + int outsize = 0; + char *dst = b64_decode(b64, size, outsize); + FileData *fd = new FileData(outsize, std::string(filename)); + + // Copy the data into FileData. + memcpy(fd->getData(), dst, outsize); + delete [] dst; + + return fd; +} + +const char *Filesystem::getWorkingDirectory() +{ + if (cwd.empty()) + { +#ifdef LOVE_WINDOWS + + WCHAR w_cwd[LOVE_MAX_PATH]; + _wgetcwd(w_cwd, LOVE_MAX_PATH); + cwd = to_utf8(w_cwd); + replace_char(cwd, '\\', '/'); +#else + char *cwd_char = new char[LOVE_MAX_PATH]; + + if (getcwd(cwd_char, LOVE_MAX_PATH)) + cwd = cwd_char; // if getcwd fails, cwd_char (and thus cwd) will still be empty + + delete [] cwd_char; +#endif + } + + return cwd.c_str(); +} + +const char *Filesystem::getUserDirectory() +{ + return PHYSFS_getUserDir(); +} + +const char *Filesystem::getAppdataDirectory() +{ +#ifdef LOVE_WINDOWS + if (appdata.empty()) + { + wchar_t *w_appdata = _wgetenv(L"APPDATA"); + appdata = to_utf8(w_appdata); + replace_char(appdata, '\\', '/'); + } + return appdata.c_str(); +#elif defined(LOVE_MACOSX) + if (appdata.empty()) + { + std::string udir = getUserDirectory(); + udir.append("/Library/Application Support"); + appdata = udir; + } + return appdata.c_str(); +#elif defined(LOVE_LINUX) + if (appdata.empty()) + { + char *xdgdatahome = getenv("XDG_DATA_HOME"); + if (!xdgdatahome) + appdata = std::string(getUserDirectory()) + "/.local/share/"; + else + appdata = xdgdatahome; + } + return appdata.c_str(); +#else + return getUserDirectory(); +#endif +} + + +const char *Filesystem::getSaveDirectory() +{ + return save_path_full.c_str(); +} + +std::string Filesystem::getSourceBaseDirectory() const +{ + size_t source_len = game_source.length(); + + if (source_len == 0) + return ""; + + // FIXME: This doesn't take into account parent and current directory + // symbols (i.e. '..' and '.') +#ifdef LOVE_WINDOWS + // In windows, delimiters can be either '/' or '\'. + size_t base_end_pos = game_source.find_last_of("/\\", source_len - 2); +#else + size_t base_end_pos = game_source.find_last_of('/', source_len - 2); +#endif + + if (base_end_pos == std::string::npos) + return ""; + + // If the source is in the unix root (aka '/'), we want to keep the '/'. + if (base_end_pos == 0) + base_end_pos = 1; + + return game_source.substr(0, base_end_pos); +} + +bool Filesystem::exists(const char *file) const +{ + return PHYSFS_exists(file); +} + +bool Filesystem::isDirectory(const char *file) const +{ + return PHYSFS_isDirectory(file); +} + +bool Filesystem::isFile(const char *file) const +{ + return exists(file) && !isDirectory(file); +} + +bool Filesystem::createDirectory(const char *dir) +{ + if (PHYSFS_getWriteDir() == 0 && !setupWriteDirectory()) + return false; + + if (!PHYSFS_mkdir(dir)) + return false; + return true; +} + +bool Filesystem::remove(const char *file) +{ + if (PHYSFS_getWriteDir() == 0 && !setupWriteDirectory()) + return false; + + if (!PHYSFS_delete(file)) + return false; + return true; +} + +Data *Filesystem::read(const char *filename, int64 size) const +{ + File file(filename); + + file.open(File::READ); + + // close() is called in the File destructor. + return file.read(size); +} + +void Filesystem::write(const char *filename, const void *data, int64 size) const +{ + File file(filename); + + file.open(File::WRITE); + + // close() is called in the File destructor. + if (!file.write(data, size)) + throw love::Exception("Data could not be written."); +} + +void Filesystem::append(const char *filename, const void *data, int64 size) const +{ + File file(filename); + + file.open(File::APPEND); + + // close() is called in the File destructor. + if (!file.write(data, size)) + throw love::Exception("Data could not be written."); +} + +int Filesystem::getDirectoryItems(lua_State *L) +{ + const char *dir = luaL_checkstring(L, 1); + + char **rc = PHYSFS_enumerateFiles(dir); + int index = 1; + + lua_newtable(L); + + for (char **i = rc; *i != 0; i++) + { + lua_pushstring(L, *i); + lua_rawseti(L, -2, index); + index++; + } + + PHYSFS_freeList(rc); + + return 1; +} + +int Filesystem::lines_i(lua_State *L) +{ + const int bufsize = 1024; + char buf[bufsize]; + int linesize = 0; + bool newline = false; + + File *file = luax_checktype(L, lua_upvalueindex(1), "File", FILESYSTEM_FILE_T); + + // Only accept read mode at this point. + if (file->getMode() != File::READ) + return luaL_error(L, "File needs to stay in read mode."); + + int64 pos = file->tell(); + int64 userpos = -1; + + if (lua_isnoneornil(L, lua_upvalueindex(2)) == 0) + { + // User may have changed the file position. + userpos = pos; + pos = (int64) lua_tonumber(L, lua_upvalueindex(2)); + if (userpos != pos) + file->seek(pos); + } + + while (!newline && !file->eof()) + { + // This 64-bit to 32-bit integer cast should be safe as it never exceeds bufsize. + int read = (int) file->read(buf, bufsize); + if (read < 0) + return luaL_error(L, "Could not read from file."); + + linesize += read; + + for (int i = 0; i < read; i++) + { + if (buf[i] == '\n') + { + linesize -= read - i; + newline = true; + break; + } + } + } + + if (newline || (file->eof() && linesize > 0)) + { + if (linesize < bufsize) + { + // We have the line in the buffer on the stack. No 'new' and 'read' needed. + lua_pushlstring(L, buf, linesize > 0 && buf[linesize - 1] == '\r' ? linesize - 1 : linesize); + if (userpos < 0) + file->seek(pos + linesize + 1); + } + else + { + char *str = 0; + try + { + str = new char[linesize + 1]; + } + catch(std::bad_alloc &) + { + // Can't lua_error (longjmp) in exception handlers. + } + + if (!str) + return luaL_error(L, "Out of memory."); + + file->seek(pos); + + // Read the \n anyway and save us a call to seek. + if (file->read(str, linesize + 1) == -1) + { + delete [] str; + return luaL_error(L, "Could not read from file."); + } + + lua_pushlstring(L, str, str[linesize - 1] == '\r' ? linesize - 1 : linesize); + delete [] str; + } + + if (userpos >= 0) + { + // Save new position in upvalue. + lua_pushnumber(L, (lua_Number)(pos + linesize + 1)); + lua_replace(L, lua_upvalueindex(2)); + file->seek(userpos); + } + + return 1; + } + + // EOF reached. + if (userpos >= 0 && luax_toboolean(L, lua_upvalueindex(3))) + file->seek(userpos); + else + file->close(); + + return 0; +} + +int64 Filesystem::getLastModified(const char *filename) const +{ + PHYSFS_sint64 time = PHYSFS_getLastModTime(filename); + + if (time == -1) + throw love::Exception("Could not determine file modification date."); + + return time; +} + +int64 Filesystem::getSize(const char *filename) const +{ + File file(filename); + int64 size = file.getSize(); + return size; +} + +} // physfs +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/physfs/Filesystem.h b/jni/love/src/modules/filesystem/physfs/Filesystem.h new file mode 100644 index 00000000..33e20d89 --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/Filesystem.h @@ -0,0 +1,315 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H +#define LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H + +// STD +#include +#include +#include +#include + +// LOVE +#include "common/Module.h" +#include "common/config.h" +#include "common/int.h" +#include "filesystem/FileData.h" +#include "File.h" + +// For great CWD. (Current Working Directory) +// Using this instead of boost::filesystem which totally +// cramped our style. +#ifdef LOVE_WINDOWS +# include +# include +#else +# include +# include +#endif + +// In Windows, we would like to use "LOVE" as the +// application folder, but in Linux, we like .love. +#define LOVE_APPDATA_PREFIX "" +#ifdef LOVE_WINDOWS +# define LOVE_APPDATA_FOLDER "LOVE" +# define LOVE_PATH_SEPARATOR "/" +# define LOVE_MAX_PATH _MAX_PATH +#else +# ifdef LOVE_MACOSX +# define LOVE_APPDATA_FOLDER "LOVE" +# elif defined(LOVE_LINUX) +# define LOVE_APPDATA_FOLDER "love" +# else +# define LOVE_APPDATA_PREFIX "." +# define LOVE_APPDATA_FOLDER "love" +# endif +# define LOVE_PATH_SEPARATOR "/" +# define LOVE_MAX_PATH MAXPATHLEN +#endif + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +class Filesystem : public Module +{ +public: + + Filesystem(); + virtual ~Filesystem(); + + const char *getName() const; + + void init(const char *arg0); + + void setFused(bool fused); + bool isFused() const; + + /** + * This sets up the save directory. If the + * it is already set up, nothing happens. + * @return True on success, false otherwise. + **/ + bool setupWriteDirectory(); + + /** + * Sets the name of the save folder. + * @param ident The name of the game. Will be used to + * to create the folder in the LOVE data folder. + **/ + bool setIdentity(const char *ident, bool appendToPath = false); + const char *getIdentity() const; + + /** + * Sets the path to the game source. + * This can only be set once. + * @param source Path to a directory or a .love-file. + **/ + bool setSource(const char *source); + + /** + * Gets the path to the game source. + * Returns a 0-length string if the source has not been set. + **/ + const char *getSource() const; + + bool mount(const char *archive, const char *mountpoint, bool appendToPath = false); + bool unmount(const char *archive); + + /** + * Creates a new file. + **/ + File *newFile(const char *filename) const; + + /** + * Creates a new FileData object. Data will be copied. + * @param data Pointer to the data. + * @param size The size of the data. + * @param filename The full filename used to file type identification. + **/ + FileData *newFileData(void *data, unsigned int size, const char *filename) const; + + /** + * Creates a new FileData object from base64 data. + * @param b64 The base64 data. + **/ + FileData *newFileData(const char *b64, const char *filename) const; + + /** + * Gets the current working directory. + **/ + const char *getWorkingDirectory(); + + /** + * Gets the user home directory. + **/ + const char *getUserDirectory(); + + /** + * Gets the APPDATA directory. On Windows, this is the folder + * in the %APPDATA% enviroment variable. On Linux, this is the + * user home folder. + **/ + const char *getAppdataDirectory(); + + /** + * Gets the full path of the save folder. + **/ + const char *getSaveDirectory(); + + /** + * Gets the full path to the directory containing the game source. + * For example if the game source is C:\Games\mygame.love, this will return + * C:\Games. + **/ + std::string getSourceBaseDirectory() const; + + /** + * Checks whether a file exists in the current search path + * or not. + * @param file The filename to check. + **/ + bool exists(const char *file) const; + + /** + * Checks if an existing file really is a directory. + * @param file The filename to check. + **/ + bool isDirectory(const char *file) const; + + /** + * Checks if an existing file really is a file, + * and not a directory. + * @param file The filename to check. + **/ + bool isFile(const char *file) const; + + /** + * Creates a directory. Write dir must be set. + * @param dir The directory to create. + **/ + bool createDirectory(const char *dir); + + /** + * Removes a file (or directory). + * @param file The file or directory to remove. + **/ + bool remove(const char *file); + + /** + * Opens a file for reading or writing. (Depends + * on the mode chosen at the time of creation). + * @param file The file to open. + * @param mode The mode to open the file in. + **/ + bool open(File *file, File::Mode mode); + + /** + * Closes a file. + * @param file The file to close. + **/ + bool close(File *file); + + /** + * Reads data from a file. + * @param filename The name of the file to read from. + * @param size The size in bytes of the data to read. + **/ + Data *read(const char *filename, int64 size = File::ALL) const; + + /** + * Write data to a file. + * @param filename The name of the file to write to. + * @param data The data to write. + * @param size The size in bytes of the data to write. + **/ + void write(const char *filename, const void *data, int64 size) const; + + /** + * Append data to a file, creating it if it doesn't exist. + * @param filename The name of the file to write to. + * @param data The data to append. + * @param size The size in bytes of the data to append. + **/ + void append(const char *filename, const void *data, int64 size) const; + + /** + * Check if end-of-file is reached. + * @return True if EOF, false otherwise. + **/ + bool eof(File *file); + + /** + * Gets the current position in a file. + * @param file An open File. + **/ + int tell(File *file); + + /** + * Seek to a position within a file. + * @param pos The position to seek to. + **/ + bool seek(File *file, uint64 pos); + + /** + * This "native" method returns a table of all + * files in a given directory. + **/ + int getDirectoryItems(lua_State *L); + + /** + * Gets the last modification time of a file, in seconds + * since the Unix epoch. + * @param filename The name of the file. + **/ + int64 getLastModified(const char *filename) const; + + /** + * Gets the size of a file in bytes. + * @param filename The name of the file. + **/ + int64 getSize(const char *filename) const; + + /** + * Text file line-reading iterator function used and + * pushed on the Lua stack by love.filesystem.lines + * and File:lines. + **/ + static int lines_i(lua_State *L); + +private: + + // Contains the current working directory (UTF8). + std::string cwd; + + // %APPDATA% on Windows. + std::string appdata; + + // This name will be used to create the folder + // in the appdata/userdata folder. + std::string save_identity; + + // Full and relative paths of the game save folder. + // (Relative to the %APPDATA% folder, meaning that the + // relative string will look something like: ./LOVE/game) + std::string save_path_relative, save_path_full; + + // The full path to the source of the game. + std::string game_source; + + // Workaround for machines without PhysFS 2.0 + bool initialized; + + // Allow saving outside of the LOVE_APPDATA_FOLDER + // for release 'builds' + bool fused; + bool fusedSet; + +}; // Filesystem + +} // physfs +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_PHYSFS_FILESYSTEM_H diff --git a/jni/love/src/modules/filesystem/physfs/wrap_File.cpp b/jni/love/src/modules/filesystem/physfs/wrap_File.cpp new file mode 100644 index 00000000..afd8d2dc --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/wrap_File.cpp @@ -0,0 +1,328 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_File.h" + +#include "common/Data.h" +#include "common/Exception.h" +#include "common/int.h" + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +int luax_ioError(lua_State *L, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + + lua_pushnil(L); + lua_pushvfstring(L, fmt, args); + + va_end(args); + return 2; +} + +File *luax_checkfile(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "File", FILESYSTEM_FILE_T); +} + +int w_File_getSize(lua_State *L) +{ + File *t = luax_checkfile(L, 1); + + int64 size = -1; + try + { + size = t->getSize(); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + // Push nil on failure or if size does not fit into a double precision floating-point number. + if (size == -1) + return luax_ioError(L, "Could not determine file size."); + else if (size >= 0x20000000000000LL) + return luax_ioError(L, "Size is too large."); + + lua_pushnumber(L, (lua_Number) size); + return 1; +} + +int w_File_open(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + const char *str = luaL_checkstring(L, 2); + File::Mode mode; + + if (!File::getConstant(str, mode)) + return luaL_error(L, "Incorrect file open mode: %s", str); + + try + { + luax_pushboolean(L, file->open(mode)); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + return 1; +} + +int w_File_close(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + luax_pushboolean(L, file->close()); + return 1; +} + +int w_File_isOpen(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + luax_pushboolean(L, file->isOpen()); + return 1; +} + +int w_File_read(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + Data *d = 0; + + int64 size = (int64)luaL_optnumber(L, 2, File::ALL); + + try + { + d = file->read(size); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + lua_pushlstring(L, (const char *) d->getData(), d->getSize()); + lua_pushnumber(L, d->getSize()); + d->release(); + return 2; +} + +int w_File_write(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + bool result = false; + + if (lua_isstring(L, 2)) + { + try + { + size_t datasize = 0; + const char *data = lua_tolstring(L, 2, &datasize); + + if (!lua_isnoneornil(L, 3)) + datasize = luaL_checkinteger(L, 3); + + result = file->write(data, datasize); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + } + else if (luax_istype(L, 2, DATA_T)) + { + try + { + love::Data *data = luax_totype(L, 2, "Data", DATA_T); + result = file->write(data, luaL_optinteger(L, 3, data->getSize())); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + } + else + { + return luaL_argerror(L, 2, "string or data expected"); + } + + luax_pushboolean(L, result); + return 1; +} + +int w_File_flush(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + bool success = false; + try + { + success = file->flush(); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + luax_pushboolean(L, success); + return 1; +} + +int w_File_eof(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + luax_pushboolean(L, file->eof()); + return 1; +} + +int w_File_tell(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + int64 pos = file->tell(); + // Push nil on failure or if pos does not fit into a double precision floating-point number. + if (pos == -1) + return luax_ioError(L, "Invalid position."); + else if (pos >= 0x20000000000000LL) + return luax_ioError(L, "Number is too large."); + else + lua_pushnumber(L, (lua_Number)pos); + return 1; +} + +int w_File_seek(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + lua_Number pos = luaL_checknumber(L, 2); + + // Push false on negative and precision-problematic numbers. + // Better fail than seek to an unknown position. + if (pos < 0.0 || pos >= 9007199254740992.0) + luax_pushboolean(L, false); + else + luax_pushboolean(L, file->seek((uint64)pos)); + return 1; +} + +int w_File_lines(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + + lua_pushnumber(L, 0); // File position. + luax_pushboolean(L, file->getMode() != File::CLOSED); // Save current file mode. + + if (file->getMode() != File::READ) + { + if (file->getMode() != File::CLOSED) + file->close(); + + bool success = false; + EXCEPT_GUARD(success = file->open(File::READ);) + + if (!success) + return luaL_error(L, "Could not open file."); + } + + lua_pushcclosure(L, Filesystem::lines_i, 3); + return 1; +} + +int w_File_setBuffer(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + const char *str = luaL_checkstring(L, 2); + int64 size = (int64) luaL_optnumber(L, 3, 0.0); + + File::BufferMode bufmode; + if (!File::getConstant(str, bufmode)) + return luaL_error(L, "Incorrect file buffer mode: %s", str); + + bool success = false; + try + { + success = file->setBuffer(bufmode, size); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + luax_pushboolean(L, success); + return 1; +} + +int w_File_getBuffer(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + int64 size = 0; + File::BufferMode bufmode = file->getBuffer(size); + const char *str = 0; + + if (!File::getConstant(bufmode, str)) + return luax_ioError(L, "Unknown file buffer mode."); + + lua_pushstring(L, str); + lua_pushnumber(L, (lua_Number) size); + return 2; +} + +int w_File_getMode(lua_State *L) +{ + File *file = luax_checkfile(L, 1); + + File::Mode mode = file->getMode(); + const char *str = 0; + + if (!File::getConstant(mode, str)) + return luax_ioError(L, "Unknown file mode."); + + lua_pushstring(L, str); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getSize", w_File_getSize }, + { "open", w_File_open }, + { "close", w_File_close }, + { "isOpen", w_File_isOpen }, + { "read", w_File_read }, + { "write", w_File_write }, + { "flush", w_File_flush }, + { "eof", w_File_eof }, + { "tell", w_File_tell }, + { "seek", w_File_seek }, + { "lines", w_File_lines }, + { "setBuffer", w_File_setBuffer }, + { "getBuffer", w_File_getBuffer }, + { "getMode", w_File_getMode }, + { 0, 0 } +}; + +extern "C" int luaopen_file(lua_State *L) +{ + return luax_register_type(L, "File", functions); +} + +} // physfs +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/physfs/wrap_File.h b/jni/love/src/modules/filesystem/physfs/wrap_File.h new file mode 100644 index 00000000..4aa86b14 --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/wrap_File.h @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FILESYSTEM_PHYSFS_WRAP_FILE_H +#define LOVE_FILESYSTEM_PHYSFS_WRAP_FILE_H + +// LOVE +#include "common/runtime.h" +#include "Filesystem.h" +#include "File.h" + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +// Does not use lua_error, so it's safe to call in exception handling code. +int luax_ioError(lua_State *L, const char *fmt, ...); + +File *luax_checkfile(lua_State *L, int idx); +int w_File_getSize(lua_State *L); +int w_File_open(lua_State *L); +int w_File_close(lua_State *L); +int w_File_isOpen(lua_State *L); +int w_File_read(lua_State *L); +int w_File_write(lua_State *L); +int w_File_flush(lua_State *L); +int w_File_eof(lua_State *L); +int w_File_tell(lua_State *L); +int w_File_seek(lua_State *L); +int w_File_lines(lua_State *L); +int w_File_setBuffer(lua_State *L); +int w_File_getBuffer(lua_State *L); +int w_File_getMode(lua_State *L); +extern "C" int luaopen_file(lua_State *L); + +} // physfs +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_PHYSFS_WRAP_FILE_H diff --git a/jni/love/src/modules/filesystem/physfs/wrap_FileData.cpp b/jni/love/src/modules/filesystem/physfs/wrap_FileData.cpp new file mode 100644 index 00000000..9512e32b --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/wrap_FileData.cpp @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_FileData.h" + +#include "common/wrap_Data.h" + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +FileData *luax_checkfiledata(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "FileData", FILESYSTEM_FILE_DATA_T); +} + +int w_FileData_getFilename(lua_State *L) +{ + FileData *t = luax_checkfiledata(L, 1); + lua_pushstring(L, t->getFilename().c_str()); + return 1; +} + +int w_FileData_getExtension(lua_State *L) +{ + FileData *t = luax_checkfiledata(L, 1); + lua_pushstring(L, t->getExtension().c_str()); + return 1; +} + +static const luaL_Reg w_FileData_functions[] = +{ + // Data + { "getString", w_Data_getString }, + { "getPointer", w_Data_getPointer }, + { "getSize", w_Data_getSize }, + + { "getFilename", w_FileData_getFilename }, + { "getExtension", w_FileData_getExtension }, + + { 0, 0 } +}; + +extern "C" int luaopen_filedata(lua_State *L) +{ + return luax_register_type(L, "FileData", w_FileData_functions); +} + +} // physfs +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/physfs/wrap_FileData.h b/jni/love/src/modules/filesystem/physfs/wrap_FileData.h new file mode 100644 index 00000000..e862cf3a --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/wrap_FileData.h @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FILESYSTEM_PHYSFS_WRAP_FILE_DATA_H +#define LOVE_FILESYSTEM_PHYSFS_WRAP_FILE_DATA_H + +// LOVE +#include "common/runtime.h" + +#include "filesystem/FileData.h" + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +FileData *luax_checkfiledata(lua_State *L, int idx); +int w_FileData_getFilename(lua_State *L); +int w_FileData_getExtension(lua_State *L); +extern "C" int luaopen_filedata(lua_State *L); + +} // physfs +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_PHYSFS_WRAP_FILE_DATA_H diff --git a/jni/love/src/modules/filesystem/physfs/wrap_Filesystem.cpp b/jni/love/src/modules/filesystem/physfs/wrap_Filesystem.cpp new file mode 100644 index 00000000..dc1a17c6 --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/wrap_Filesystem.cpp @@ -0,0 +1,617 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Filesystem.h" + +// SDL +#include + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +static Filesystem *instance = 0; + +bool hack_setupWriteDirectory() +{ + if (instance != 0) + return instance->setupWriteDirectory(); + return false; +} + +int w_init(lua_State *L) +{ + const char *arg0 = luaL_checkstring(L, 1); + EXCEPT_GUARD(instance->init(arg0);) + return 0; +} + +int w_setFused(lua_State *L) +{ + // no error checking needed, everything, even nothing + // can be converted to a boolean + instance->setFused(luax_toboolean(L, 1)); + return 0; +} + +int w_isFused(lua_State *L) +{ + luax_pushboolean(L, instance->isFused()); + return 1; +} + +int w_setIdentity(lua_State *L) +{ + const char *arg = luaL_checkstring(L, 1); + bool append = luax_optboolean(L, 2, false); + + if (!instance->setIdentity(arg, append)) + return luaL_error(L, "Could not set write directory."); + + return 0; +} + +int w_getIdentity(lua_State *L) +{ + lua_pushstring(L, instance->getIdentity()); + return 1; +} + +int w_setSource(lua_State *L) +{ + const char *arg = luaL_checkstring(L, 1); + + if (!instance->setSource(arg)) + return luaL_error(L, "Could not set source."); + + return 0; +} + +int w_getSource(lua_State *L) +{ + lua_pushstring(L, instance->getSource()); + return 1; +} + +int w_mount(lua_State *L) +{ + const char *archive = luaL_checkstring(L, 1); + const char *mountpoint = luaL_checkstring(L, 2); + bool append = luax_optboolean(L, 3, false); + + luax_pushboolean(L, instance->mount(archive, mountpoint, append)); + return 1; +} + +int w_unmount(lua_State *L) +{ + const char *archive = luaL_checkstring(L, 1); + + luax_pushboolean(L, instance->unmount(archive)); + return 1; +} + +int w_newFile(lua_State *L) +{ + const char *filename = luaL_checkstring(L, 1); + + const char *str = 0; + File::Mode mode = File::CLOSED; + + if (lua_isstring(L, 2)) + { + str = luaL_checkstring(L, 2); + if (!File::getConstant(str, mode)) + return luaL_error(L, "Incorrect file open mode: %s", str); + } + + File *t = instance->newFile(filename); + + if (mode != File::CLOSED) + { + try + { + if (!t->open(mode)) + throw love::Exception("Could not open file."); + } + catch (love::Exception &e) + { + t->release(); + return luax_ioError(L, "%s", e.what()); + } + } + + luax_pushtype(L, "File", FILESYSTEM_FILE_T, t); + return 1; +} + +int w_newFileData(lua_State *L) +{ + // Single argument: treat as filepath or File. + if (lua_gettop(L) == 1) + { + if (lua_isstring(L, 1)) + luax_convobj(L, 1, "filesystem", "newFile"); + + // Get FileData from the File. + if (luax_istype(L, 1, FILESYSTEM_FILE_T)) + { + File *file = luax_checktype(L, 1, "File", FILESYSTEM_FILE_T); + + FileData *data = 0; + try + { + data = file->read(); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + luax_pushtype(L, "FileData", FILESYSTEM_FILE_DATA_T, data); + return 1; + } + else + return luaL_argerror(L, 1, "string or File expected"); + } + + size_t length = 0; + const char *str = luaL_checklstring(L, 1, &length); + const char *filename = luaL_checkstring(L, 2); + const char *decstr = lua_isstring(L, 3) ? lua_tostring(L, 3) : 0; + + FileData::Decoder decoder = FileData::FILE; + + if (decstr && !FileData::getConstant(decstr, decoder)) + return luaL_error(L, "Invalid FileData decoder: %s", decstr); + + FileData *t = 0; + + switch (decoder) + { + case FileData::FILE: + t = instance->newFileData((void *)str, (int)length, filename); + break; + case FileData::BASE64: + t = instance->newFileData(str, filename); + break; + default: + return luaL_error(L, "Invalid FileData decoder: %s", decstr); + } + + luax_pushtype(L, "FileData", FILESYSTEM_FILE_DATA_T, t); + return 1; +} + +int w_getWorkingDirectory(lua_State *L) +{ + lua_pushstring(L, instance->getWorkingDirectory()); + return 1; +} + +int w_getUserDirectory(lua_State *L) +{ + lua_pushstring(L, instance->getUserDirectory()); + return 1; +} + +int w_getAppdataDirectory(lua_State *L) +{ + lua_pushstring(L, instance->getAppdataDirectory()); + return 1; +} + +int w_getSaveDirectory(lua_State *L) +{ + lua_pushstring(L, instance->getSaveDirectory()); + return 1; +} + +int w_getSourceBaseDirectory(lua_State *L) +{ + luax_pushstring(L, instance->getSourceBaseDirectory()); + return 1; +} + +int w_exists(lua_State *L) +{ + const char *arg = luaL_checkstring(L, 1); + luax_pushboolean(L, instance->exists(arg)); + return 1; +} + +int w_isDirectory(lua_State *L) +{ + const char *arg = luaL_checkstring(L, 1); + luax_pushboolean(L, instance->isDirectory(arg)); + return 1; +} + +int w_isFile(lua_State *L) +{ + const char *arg = luaL_checkstring(L, 1); + luax_pushboolean(L, instance->isFile(arg)); + return 1; +} + +int w_createDirectory(lua_State *L) +{ + const char *arg = luaL_checkstring(L, 1); + luax_pushboolean(L, instance->createDirectory(arg)); + return 1; +} + +int w_remove(lua_State *L) +{ + const char *arg = luaL_checkstring(L, 1); + luax_pushboolean(L, instance->remove(arg)); + return 1; +} + +int w_read(lua_State *L) +{ + const char *filename = luaL_checkstring(L, 1); + int64 len = (int64) luaL_optinteger(L, 2, File::ALL); + + Data *data = 0; + try + { + data = instance->read(filename, len); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + if (data == 0) + return luax_ioError(L, "File could not be read."); + + // Push the string. + lua_pushlstring(L, (const char *) data->getData(), data->getSize()); + + // Push the size. + lua_pushinteger(L, data->getSize()); + + // Lua has a copy now, so we can free it. + data->release(); + + return 2; +} + +static int w_write_or_append(lua_State *L, File::Mode mode) +{ + const char *filename = luaL_checkstring(L, 1); + + const char *input = 0; + size_t len = 0; + + if (luax_istype(L, 2, DATA_T)) + { + love::Data *data = luax_totype(L, 2, "Data", DATA_T); + input = (const char *) data->getData(); + len = data->getSize(); + } + else if (lua_isstring(L, 2)) + input = lua_tolstring(L, 2, &len); + else + return luaL_argerror(L, 2, "string or Data expected"); + + // Get how much we should write. Length of string default. + len = luaL_optinteger(L, 3, len); + + try + { + if (mode == File::APPEND) + instance->append(filename, (const void *) input, len); + else + instance->write(filename, (const void *) input, len); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + luax_pushboolean(L, true); + return 1; +} + +int w_write(lua_State *L) +{ + return w_write_or_append(L, File::WRITE); +} + +int w_append(lua_State *L) +{ + return w_write_or_append(L, File::APPEND); +} + +int w_getDirectoryItems(lua_State *L) +{ + return instance->getDirectoryItems(L); +} + +int w_lines(lua_State *L) +{ + File *file; + + if (lua_isstring(L, 1)) + { + file = instance->newFile(lua_tostring(L, 1)); + bool success = false; + + EXCEPT_GUARD(success = file->open(File::READ);) + + if (!success) + return luaL_error(L, "Could not open file."); + + luax_pushtype(L, "File", FILESYSTEM_FILE_T, file); + } + else + return luaL_argerror(L, 1, "expected filename."); + + lua_pushcclosure(L, Filesystem::lines_i, 1); + return 1; +} + +int w_load(lua_State *L) +{ + std::string filename = std::string(luaL_checkstring(L, 1)); + + Data *data = 0; + try + { + data = instance->read(filename.c_str()); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + int status = luaL_loadbuffer(L, (const char *)data->getData(), data->getSize(), ("@" + filename).c_str()); + + data->release(); + + // Load the chunk, but don't run it. + switch (status) + { + case LUA_ERRMEM: + return luaL_error(L, "Memory allocation error: %s\n", lua_tostring(L, -1)); + case LUA_ERRSYNTAX: + return luaL_error(L, "Syntax error: %s\n", lua_tostring(L, -1)); + default: // success + return 1; + } +} + +int w_getLastModified(lua_State *L) +{ + const char *filename = luaL_checkstring(L, 1); + + int64 time = 0; + try + { + time = instance->getLastModified(filename); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + lua_pushnumber(L, static_cast(time)); + return 1; +} + +int w_getSize(lua_State *L) +{ + const char *filename = luaL_checkstring(L, 1); + + int64 size = -1; + try + { + size = instance->getSize(filename); + } + catch (love::Exception &e) + { + return luax_ioError(L, "%s", e.what()); + } + + // Error on failure or if size does not fit into a double precision floating-point number. + if (size == -1) + return luax_ioError(L, "Could not determine file size."); + else if (size >= 0x20000000000000LL) + return luax_ioError(L, "Size too large to fit into a Lua number!"); + + lua_pushnumber(L, (lua_Number) size); + return 1; +} + +int loader(lua_State *L) +{ + const char *filename = lua_tostring(L, -1); + + std::string tmp(filename); + tmp += ".lua"; + + int size = tmp.size(); + + for (int i=0; iexists(tmp.c_str())) + { + lua_pop(L, 1); + lua_pushstring(L, tmp.c_str()); + // Ok, load it. + return w_load(L); + } + + tmp = filename; + size = tmp.size(); + for (int i=0; iisDirectory(tmp.c_str())) + { + tmp += "/init.lua"; + if (instance->exists(tmp.c_str())) + { + lua_pop(L, 1); + lua_pushstring(L, tmp.c_str()); + // Ok, load it. + return w_load(L); + } + } + + lua_pushfstring(L, "\n\tno file \"%s\" in LOVE game directories.\n", (tmp + ".lua").c_str()); + return 1; +} + +inline const char *library_extension() +{ +#ifdef LOVE_WINDOWS + return ".dll"; +#else + return ".so"; +#endif +} + +int extloader(lua_State *L) +{ + const char *filename = lua_tostring(L, -1); + std::string tokenized_name(filename); + std::string tokenized_function(filename); + + for (unsigned int i = 0; i < tokenized_name.size(); i++) + { + if (tokenized_name[i] == '.') + { + tokenized_name[i] = '/'; + tokenized_function[i] = '_'; + } + } + + tokenized_name += library_extension(); + + void *handle = SDL_LoadObject((std::string(instance->getAppdataDirectory()) + LOVE_PATH_SEPARATOR LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR + tokenized_name).c_str()); + if (!handle && instance->isFused()) + handle = SDL_LoadObject((std::string(instance->getSaveDirectory()) + LOVE_PATH_SEPARATOR + tokenized_name).c_str()); + + if (!handle) + { + lua_pushfstring(L, "\n\tno extension \"%s\" in LOVE paths.\n", filename); + return 1; + } + + void *func = SDL_LoadFunction(handle, ("loveopen_" + tokenized_function).c_str()); + if (!func) + func = SDL_LoadFunction(handle, ("luaopen_" + tokenized_function).c_str()); + + if (!func) + { + SDL_UnloadObject(handle); + lua_pushfstring(L, "\n\textension \"%s\" is incompatible.\n", filename); + return 1; + } + + lua_pushcfunction(L, (lua_CFunction) func); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "init", w_init }, + { "setFused", w_setFused }, + { "isFused", w_isFused }, + { "setIdentity", w_setIdentity }, + { "getIdentity", w_getIdentity }, + { "setSource", w_setSource }, + { "getSource", w_getSource }, + { "mount", w_mount }, + { "unmount", w_unmount }, + { "newFile", w_newFile }, + { "getWorkingDirectory", w_getWorkingDirectory }, + { "getUserDirectory", w_getUserDirectory }, + { "getAppdataDirectory", w_getAppdataDirectory }, + { "getSaveDirectory", w_getSaveDirectory }, + { "getSourceBaseDirectory", w_getSourceBaseDirectory }, + { "exists", w_exists }, + { "isDirectory", w_isDirectory }, + { "isFile", w_isFile }, + { "createDirectory", w_createDirectory }, + { "remove", w_remove }, + { "read", w_read }, + { "write", w_write }, + { "append", w_append }, + { "getDirectoryItems", w_getDirectoryItems }, + { "lines", w_lines }, + { "load", w_load }, + { "getLastModified", w_getLastModified }, + { "getSize", w_getSize }, + { "newFileData", w_newFileData }, + { 0, 0 } +}; + +static const lua_CFunction types[] = +{ + luaopen_file, + luaopen_filedata, + 0 +}; + +extern "C" int luaopen_love_filesystem(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new Filesystem();) + } + else + instance->retain(); + + love::luax_register_searcher(L, loader, 1); + love::luax_register_searcher(L, extloader, 2); + + WrappedModule w; + w.module = instance; + w.name = "filesystem"; + w.flags = MODULE_FILESYSTEM_T; + w.functions = functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // physfs +} // filesystem +} // love diff --git a/jni/love/src/modules/filesystem/physfs/wrap_Filesystem.h b/jni/love/src/modules/filesystem/physfs/wrap_Filesystem.h new file mode 100644 index 00000000..57bb2f6a --- /dev/null +++ b/jni/love/src/modules/filesystem/physfs/wrap_Filesystem.h @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FILESYSTEM_PHYSFS_WRAP_FILESYSTEM_H +#define LOVE_FILESYSTEM_PHYSFS_WRAP_FILESYSTEM_H + +// LOVE +#include "Filesystem.h" +#include "wrap_File.h" +#include "wrap_FileData.h" + +namespace love +{ +namespace filesystem +{ +namespace physfs +{ + +bool hack_setupWriteDirectory(); +int w_init(lua_State *L); +int w_setFused(lua_State *L); +int w_isFused(lua_State *L); +int w_setIdentity(lua_State *L); +int w_getIdentity(lua_State *L); +int w_setSource(lua_State *L); +int w_getSource(lua_State *L); +int w_mount(lua_State *L); +int w_unmount(lua_State *L); +int w_newFile(lua_State *L); +int w_newFileData(lua_State *L); +int w_getWorkingDirectory(lua_State *L); +int w_getUserDirectory(lua_State *L); +int w_getAppdataDirectory(lua_State *L); +int w_getSaveDirectory(lua_State *L); +int w_getSourceBaseDirectory(lua_State *L); +int w_exists(lua_State *L); +int w_isDirectory(lua_State *L); +int w_isFile(lua_State *L); +int w_createDirectory(lua_State *L); +int w_remove(lua_State *L); +int w_open(lua_State *L); +int w_close(lua_State *L); +int w_read(lua_State *L); +int w_write(lua_State *L); +int w_append(lua_State *L); +int w_getDirectoryItems(lua_State *L); +int w_lines(lua_State *L); +int w_load(lua_State *L); +int w_getLastModified(lua_State *L); +int w_getSize(lua_State *L); +int loader(lua_State *L); +int extloader(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_filesystem(lua_State *L); + +} // physfs +} // filesystem +} // love + +#endif // LOVE_FILESYSTEM_PHYSFS_WRAP_FILESYSTEM_H diff --git a/jni/love/src/modules/font/Font.h b/jni/love/src/modules/font/Font.h new file mode 100644 index 00000000..f52d7647 --- /dev/null +++ b/jni/love/src/modules/font/Font.h @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_FONT_H +#define LOVE_FONT_FONT_H + +// LOVE +#include "Rasterizer.h" +#include "image/ImageData.h" +#include "common/Module.h" +#include "common/int.h" + +// STD +#include + +namespace love +{ +namespace font +{ + +class Font : public Module +{ + +public: + + virtual Rasterizer *newRasterizer(Data *data, int size) = 0; + virtual Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &glyphs) = 0; + virtual Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int length) = 0; + virtual GlyphData *newGlyphData(Rasterizer *r, const std::string &glyph) = 0; + virtual GlyphData *newGlyphData(Rasterizer *r, uint32 glyph) = 0; + + // Implement Module + virtual const char *getName() const = 0; + +}; // Font + +} // font +} // love + +#endif // LOVE_FONT_FONT_H \ No newline at end of file diff --git a/jni/love/src/modules/font/GlyphData.cpp b/jni/love/src/modules/font/GlyphData.cpp new file mode 100644 index 00000000..3cf25d41 --- /dev/null +++ b/jni/love/src/modules/font/GlyphData.cpp @@ -0,0 +1,178 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "GlyphData.h" + +// UTF-8 +#include "libraries/utf8/utf8.h" + +// stdlib +#include +#include + +namespace love +{ +namespace font +{ + +GlyphData::GlyphData(uint32 glyph, GlyphMetrics glyphMetrics, GlyphData::Format f) + : glyph(glyph) + , metrics(glyphMetrics) + , data(0) + , format(f) +{ + if (metrics.width > 0 && metrics.height > 0) + { + switch (f) + { + case GlyphData::FORMAT_LUMINANCE_ALPHA: + data = new unsigned char[metrics.width * metrics.height * 2]; + break; + case GlyphData::FORMAT_RGBA: + default: + data = new unsigned char[metrics.width * metrics.height * 4]; + break; + } + } +} + +GlyphData::~GlyphData() +{ + delete[] data; +} + +void *GlyphData::getData() const +{ + return (void *) data; +} + +int GlyphData::getSize() const +{ + switch (format) + { + case GlyphData::FORMAT_LUMINANCE_ALPHA: + return getWidth() * getHeight() * 2; + break; + case GlyphData::FORMAT_RGBA: + default: + return getWidth() * getHeight() * 4; + break; + } + +} + +int GlyphData::getHeight() const +{ + return metrics.height; +} + +int GlyphData::getWidth() const +{ + return metrics.width; +} + +uint32 GlyphData::getGlyph() const +{ + return glyph; +} + +std::string GlyphData::getGlyphString() const +{ + char u[5] = {0, 0, 0, 0, 0}; + ptrdiff_t length = 0; + + try + { + char *end = utf8::append(glyph, u); + length = end - u; + } + catch (utf8::exception &e) + { + throw love::Exception("Decoding error: %s", e.what()); + } + + // Just in case... + if (length < 0) + return ""; + + return std::string(u, length); +} + +int GlyphData::getAdvance() const +{ + return metrics.advance; +} + +int GlyphData::getBearingX() const +{ + return metrics.bearingX; +} + +int GlyphData::getBearingY() const +{ + return metrics.bearingY; +} + +int GlyphData::getMinX() const +{ + return this->getBearingX(); +} + +int GlyphData::getMinY() const +{ + return this->getHeight() - this->getBearingY(); +} + +int GlyphData::getMaxX() const +{ + return this->getBearingX() + this->getWidth(); +} + +int GlyphData::getMaxY() const +{ + return this->getBearingY(); +} + +GlyphData::Format GlyphData::getFormat() const +{ + return format; +} + +bool GlyphData::getConstant(const char *in, GlyphData::Format &out) +{ + return formats.find(in, out); +} + +bool GlyphData::getConstant(GlyphData::Format in, const char *&out) +{ + return formats.find(in, out); +} + +StringMap::Entry GlyphData::formatEntries[] = +{ + {"luminance alpha", GlyphData::FORMAT_LUMINANCE_ALPHA}, + {"rgba", GlyphData::FORMAT_RGBA}, +}; + +StringMap GlyphData::formats(GlyphData::formatEntries, sizeof(GlyphData::formatEntries)); + +} // font +} // love diff --git a/jni/love/src/modules/font/GlyphData.h b/jni/love/src/modules/font/GlyphData.h new file mode 100644 index 00000000..0bdb92c4 --- /dev/null +++ b/jni/love/src/modules/font/GlyphData.h @@ -0,0 +1,158 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_GLYPH_DATA_H +#define LOVE_FONT_GLYPH_DATA_H + +// LOVE +#include "common/config.h" +#include "common/Data.h" +#include "common/Exception.h" +#include "common/StringMap.h" +#include "common/int.h" + +// stdlib +#include + +namespace love +{ +namespace font +{ + +/** + * Holds the specific glyph data. + **/ +struct GlyphMetrics +{ + int height; + int width; + int advance; + int bearingX; + int bearingY; + int spacing; +}; + +/** + * Holds data for a specic glyph object. + **/ +class GlyphData : public Data +{ +public: + + enum Format + { + FORMAT_LUMINANCE_ALPHA, + FORMAT_RGBA, + FORMAT_MAX_ENUM + }; + + GlyphData(uint32 glyph, GlyphMetrics glyphMetrics, Format f); + virtual ~GlyphData(); + + // Implements Data. + void *getData() const; + int getSize() const; + + /** + * Gets the height of the glyph. + **/ + virtual int getHeight() const; + + /** + * Gets the width of the glyph. + **/ + virtual int getWidth() const; + + /** + * Gets the glyph codepoint itself. + **/ + uint32 getGlyph() const; + + /** + * Gets the glyph as a UTF-8 string (instead of a UTF-8 code point.) + **/ + std::string getGlyphString() const; + + /** + * Gets the advance (the space the glyph takes up) of the glyph. + **/ + int getAdvance() const; + + /** + * Gets bearing (the spacing from origin) along the x-axis of the glyph. + **/ + int getBearingX() const; + + /** + * Gets bearing (the spacing from origin) along the y-axis of the glyph. + **/ + int getBearingY() const; + + /** + * Gets the min x value of the glyph. + **/ + int getMinX() const; + + /** + * Gets the min y value of the glyph. + **/ + int getMinY() const; + + /** + * Gets the max x value of the glyph. + **/ + int getMaxX() const; + + /** + * Gets the max y value of the glyph. + **/ + int getMaxY() const; + + /** + * Gets the format of the glyph data. + **/ + Format getFormat() const; + + static bool getConstant(const char *in, Format &out); + static bool getConstant(Format in, const char *&out); + +private: + + // The glyph codepoint itself. + uint32 glyph; + + // Glyph metrics. + GlyphMetrics metrics; + + // Glyph texture data. + unsigned char *data; + + // The format the data's in. + Format format; + + static StringMap::Entry formatEntries[]; + static StringMap formats; + +}; // GlyphData + +} // font +} // love + +#endif // LOVE_FONT_GLYPH_DATA_H diff --git a/jni/love/src/modules/font/ImageRasterizer.cpp b/jni/love/src/modules/font/ImageRasterizer.cpp new file mode 100644 index 00000000..89ca622e --- /dev/null +++ b/jni/love/src/modules/font/ImageRasterizer.cpp @@ -0,0 +1,166 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "ImageRasterizer.h" + +#include "common/Exception.h" +#include + +namespace love +{ +namespace font +{ + +inline bool equal(const love::image::pixel &a, const love::image::pixel &b) +{ + return (a.r == b.r && a.g == b.g && a.b == b.b && a.a == b.a); +} + +ImageRasterizer::ImageRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs) + : imageData(data) + , glyphs(glyphs) + , numglyphs(numglyphs) +{ + imageData->retain(); + load(); +} + +ImageRasterizer::~ImageRasterizer() +{ + imageData->release(); +} + +int ImageRasterizer::getLineHeight() const +{ + return getHeight(); +} + +GlyphData *ImageRasterizer::getGlyphData(uint32 glyph) const +{ + GlyphMetrics gm; + memset(&gm, 0, sizeof(GlyphMetrics)); + + // Set relevant glyph metrics if the glyph is in this ImageFont + std::map::const_iterator it = imageGlyphs.find(glyph); + if (it != imageGlyphs.end()) + { + gm.width = it->second.width; + gm.advance = it->second.width + it->second.spacing; + } + + gm.height = metrics.height; + + GlyphData *g = new GlyphData(glyph, gm, GlyphData::FORMAT_RGBA); + + if (gm.width == 0) + return g; + + // We don't want another thread modifying our ImageData mid-copy. + love::thread::Lock lock(imageData->getMutex()); + + love::image::pixel *gdpixels = (love::image::pixel *) g->getData(); + love::image::pixel *imagepixels = (love::image::pixel *) imageData->getData(); + + // copy glyph pixels from imagedata to glyphdata + for (int i = 0; i < g->getWidth() * g->getHeight(); i++) + { + love::image::pixel p = imagepixels[it->second.x + (i % gm.width) + (imageData->getWidth() * (i / gm.width))]; + + // Use transparency instead of the spacer color + if (equal(p, spacer)) + gdpixels[i].r = gdpixels[i].g = gdpixels[i].b = gdpixels[i].a = 0; + else + gdpixels[i] = p; + } + + return g; +} + +void ImageRasterizer::load() +{ + love::image::pixel *pixels = (love::image::pixel *) imageData->getData(); + + int imgw = imageData->getWidth(); + int imgh = imageData->getHeight(); + + // We don't want another thread modifying our ImageData mid-parse. + love::thread::Lock lock(imageData->getMutex()); + + // Set the only metric that matters + metrics.height = imgh; + + // Reading texture data begins + spacer = pixels[0]; + + int start = 0; + int end = 0; + + for (int i = 0; i < numglyphs; ++i) + { + start = end; + + // Finds out where the first character starts + while (start < imgw && equal(pixels[start], spacer)) + ++start; + + // set previous glyph's spacing + if (i > 0 && imageGlyphs.size() > 0) + imageGlyphs[glyphs[i - 1]].spacing = (start > end) ? (start - end) : 0; + + end = start; + + // Find where glyph ends. + while (end < imgw && !equal(pixels[end], spacer)) + ++end; + + if (start >= end) + break; + + ImageGlyphData imageGlyph; + imageGlyph.x = start; + imageGlyph.width = end - start; + + imageGlyphs[glyphs[i]] = imageGlyph; + } + + // Find spacing of last glyph + if (numglyphs > 0) + { + start = end; + while (start < imgw && equal(pixels[start], spacer)) + ++start; + + imageGlyphs[glyphs[numglyphs - 1]].spacing = (start > end) ? (start - end) : 0; + } +} + +int ImageRasterizer::getGlyphCount() const +{ + return numglyphs; +} + +bool ImageRasterizer::hasGlyph(uint32 glyph) const +{ + return imageGlyphs.find(glyph) != imageGlyphs.end(); +} + +} // font +} // love diff --git a/jni/love/src/modules/font/ImageRasterizer.h b/jni/love/src/modules/font/ImageRasterizer.h new file mode 100644 index 00000000..43a34ebd --- /dev/null +++ b/jni/love/src/modules/font/ImageRasterizer.h @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_IMAGE_RASTERIZER_H +#define LOVE_FONT_IMAGE_RASTERIZER_H + +// LOVE +#include "filesystem/File.h" +#include "font/Rasterizer.h" +#include "image/ImageData.h" + +#include + +namespace love +{ +namespace font +{ + +/** + * Holds data for a font object. + **/ +class ImageRasterizer : public Rasterizer +{ +public: + ImageRasterizer(love::image::ImageData *imageData, uint32 *glyphs, int numglyphs); + virtual ~ImageRasterizer(); + + // Implement Rasterizer + virtual int getLineHeight() const; + virtual GlyphData *getGlyphData(uint32 glyph) const; + virtual int getGlyphCount() const; + virtual bool hasGlyph(uint32 glyph) const; + +private: + // Load all the glyph positions into memory + void load(); + + // The image data + love::image::ImageData *imageData; + + // The glyphs in the font + uint32 *glyphs; + + // Number of glyphs in the font + int numglyphs; + + // Information about a glyph in the ImageData + struct ImageGlyphData + { + int x; + int width; + int spacing; + }; + + std::map imageGlyphs; + + // Color used to identify glyph separation in the source ImageData + love::image::pixel spacer; + +}; // ImageRasterizer + +} // font +} // love + +#endif // LOVE_FONT_IMAGE_RASTERIZER_H \ No newline at end of file diff --git a/jni/love/src/modules/font/Rasterizer.cpp b/jni/love/src/modules/font/Rasterizer.cpp new file mode 100644 index 00000000..d0d42a5c --- /dev/null +++ b/jni/love/src/modules/font/Rasterizer.cpp @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Rasterizer.h" + +// UTF-8 +#include "libraries/utf8/utf8.h" + +namespace love +{ +namespace font +{ + +Rasterizer::~Rasterizer() +{ +} + +int Rasterizer::getHeight() const +{ + return metrics.height; +} + +int Rasterizer::getAdvance() const +{ + return metrics.advance; +} + +int Rasterizer::getAscent() const +{ + return metrics.ascent; +} + +int Rasterizer::getDescent() const +{ + return metrics.descent; +} + +GlyphData *Rasterizer::getGlyphData(const std::string &text) const +{ + uint32 codepoint = 0; + + try + { + codepoint = utf8::peek_next(text.begin(), text.end()); + } + catch (utf8::exception &e) + { + throw love::Exception("Decoding error: %s", e.what()); + } + + return getGlyphData(codepoint); +} + +bool Rasterizer::hasGlyphs(const std::string &text) const +{ + if (text.size() == 0) + return false; + + try + { + utf8::iterator i(text.begin(), text.begin(), text.end()); + utf8::iterator end(text.end(), text.begin(), text.end()); + + while (i != end) + { + uint32 codepoint = *i++; + + if (!hasGlyph(codepoint)) + return false; + } + } + catch (utf8::exception &e) + { + throw love::Exception("Decoding error: %s", e.what()); + } + + return true; +} + +} // font +} // love \ No newline at end of file diff --git a/jni/love/src/modules/font/Rasterizer.h b/jni/love/src/modules/font/Rasterizer.h new file mode 100644 index 00000000..f8766bbb --- /dev/null +++ b/jni/love/src/modules/font/Rasterizer.h @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_RASTERIZER_H +#define LOVE_FONT_RASTERIZER_H + +// LOVE +#include "common/Object.h" +#include "common/int.h" +#include "GlyphData.h" + +namespace love +{ +namespace font +{ + +/** + * Holds the specific font metrics. + **/ +struct FontMetrics +{ + int advance; + int ascent; + int descent; + int height; +}; + +/** + * Holds data for a font object. + **/ +class Rasterizer : public Object +{ +public: + + virtual ~Rasterizer(); + + /** + * Gets the max height of the glyphs. + **/ + virtual int getHeight() const; + + /** + * Gets the max advance of the glyphs. + **/ + virtual int getAdvance() const; + + /** + * Gets the max ascent (height above baseline) for the font. + **/ + virtual int getAscent() const; + + /** + * Gets the max descent (height below baseline) for the font. + **/ + virtual int getDescent() const; + + /** + * Gets the line height of the font. + **/ + virtual int getLineHeight() const = 0; + + /** + * Gets a specific glyph. + * @param glyph The (UNICODE) glyph codepoint to get data for. + **/ + virtual GlyphData *getGlyphData(uint32 glyph) const = 0; + + /** + * Gets a specific glyph. + * @param text The (UNICODE) glyph character to get the data for. + **/ + virtual GlyphData *getGlyphData(const std::string &text) const; + + /** + * Gets the number of glyphs the rasterizer has data for. + **/ + virtual int getGlyphCount() const = 0; + + /** + * Gets whether this Rasterizer has a specific glyph. + * @param glyph The (UNICODE) glyph codepoint. + **/ + virtual bool hasGlyph(uint32 glyph) const = 0; + + /** + * Gets whether this Rasterizer has all the glyphs in a string. + * @param text The (UTF-8) string. + **/ + virtual bool hasGlyphs(const std::string &text) const; + +protected: + + FontMetrics metrics; + +}; // Rasterizer + +} // font +} // love + +#endif // LOVE_FONT_RASTERIZER_H \ No newline at end of file diff --git a/jni/love/src/modules/font/freetype/Font.cpp b/jni/love/src/modules/font/freetype/Font.cpp new file mode 100644 index 00000000..a9c6f38c --- /dev/null +++ b/jni/love/src/modules/font/freetype/Font.cpp @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Font.h" + +#include "TrueTypeRasterizer.h" +#include "font/ImageRasterizer.h" + +#include "libraries/utf8/utf8.h" + +namespace love +{ +namespace font +{ +namespace freetype +{ + +Font::Font() +{ + if (FT_Init_FreeType(&library)) + throw love::Exception("TrueTypeFont Loading error: FT_Init_FreeType failed\n"); +} + +Font::~Font() +{ + FT_Done_FreeType(library); +} + +Rasterizer *Font::newRasterizer(Data *data, int size) +{ + return new TrueTypeRasterizer(library, data, size); +} + +Rasterizer *Font::newRasterizer(love::image::ImageData *data, const std::string &text) +{ + size_t strlen = text.size(); + size_t numglyphs = 0; + + uint32 *glyphs = new uint32[strlen]; + + try + { + utf8::iterator i(text.begin(), text.begin(), text.end()); + utf8::iterator end(text.end(), text.begin(), text.end()); + + while (i != end) + glyphs[numglyphs++] = *i++; + } + catch (utf8::exception &e) + { + delete [] glyphs; + throw love::Exception("Decoding error: %s", e.what()); + } + + Rasterizer *r = newRasterizer(data, glyphs, numglyphs); + delete [] glyphs; + + return r; +} + +Rasterizer *Font::newRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs) +{ + return new ImageRasterizer(data, glyphs, numglyphs); +} + +GlyphData *Font::newGlyphData(Rasterizer *r, const std::string &text) +{ + uint32 codepoint = 0; + + try + { + codepoint = utf8::peek_next(text.begin(), text.end()); + } + catch (utf8::exception &e) + { + throw love::Exception("Decoding error: %s", e.what()); + } + + return r->getGlyphData(codepoint); +} + +GlyphData *Font::newGlyphData(Rasterizer *r, uint32 glyph) +{ + return r->getGlyphData(glyph); +} + +const char *Font::getName() const +{ + return "love.font.freetype"; +} + +} // freetype +} // font +} // love diff --git a/jni/love/src/modules/font/freetype/Font.h b/jni/love/src/modules/font/freetype/Font.h new file mode 100644 index 00000000..abe9436c --- /dev/null +++ b/jni/love/src/modules/font/freetype/Font.h @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_FREETYPE_FONT_H +#define LOVE_FONT_FREETYPE_FONT_H + +// LOVE +#include "font/Font.h" + +// FreeType2 +#ifdef LOVE_MACOSX +#include +#else +#include +#endif +#include +#include +#include +#include + +namespace love +{ +namespace font +{ +namespace freetype +{ + +class Font : public love::font::Font +{ +public: + + Font(); + + /** + * Destructor. + **/ + virtual ~Font(); + + // Implements Font + Rasterizer *newRasterizer(Data *data, int size); + Rasterizer *newRasterizer(love::image::ImageData *data, const std::string &text); + Rasterizer *newRasterizer(love::image::ImageData *data, uint32 *glyphs, int numglyphs); + GlyphData *newGlyphData(Rasterizer *r, const std::string &glyph); + GlyphData *newGlyphData(Rasterizer *r, uint32 glyph); + + // Implement Module + const char *getName() const; + +private: + + // FreeType library + FT_Library library; +}; // Font + +} // freetype +} // font +} // love + +#endif // LOVE_FONT_FREETYPE_FONT_H \ No newline at end of file diff --git a/jni/love/src/modules/font/freetype/TrueTypeRasterizer.cpp b/jni/love/src/modules/font/freetype/TrueTypeRasterizer.cpp new file mode 100644 index 00000000..2c490b25 --- /dev/null +++ b/jni/love/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -0,0 +1,121 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "TrueTypeRasterizer.h" + +#include "common/Exception.h" + +namespace love +{ +namespace font +{ +namespace freetype +{ + +TrueTypeRasterizer::TrueTypeRasterizer(FT_Library library, Data *data, int size) + : data(data) +{ + if (FT_New_Memory_Face(library, + (const FT_Byte *)data->getData(), /* first byte in memory */ + data->getSize(), /* size in bytes */ + 0, /* face_index */ + &face)) + throw love::Exception("TrueTypeFont Loading error: FT_New_Face failed (there is probably a problem with your font file)\n"); + + FT_Set_Pixel_Sizes(face, size, size); + + // Set global metrics + FT_Size_Metrics s = face->size->metrics; + metrics.advance = s.max_advance >> 6; + metrics.ascent = s.ascender >> 6; + metrics.descent = s.descender >> 6; + metrics.height = s.height >> 6; + + data->retain(); +} + +TrueTypeRasterizer::~TrueTypeRasterizer() +{ + FT_Done_Face(face); + data->release(); +} + +int TrueTypeRasterizer::getLineHeight() const +{ + return (int)(getHeight() * 1.25); +} + +GlyphData *TrueTypeRasterizer::getGlyphData(uint32 glyph) const +{ + love::font::GlyphMetrics glyphMetrics = {}; + FT_Glyph ftglyph; + + // Initialize + if (FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_DEFAULT)) + throw love::Exception("TrueTypeFont Loading vm->error: FT_Load_Glyph failed\n"); + + if (FT_Get_Glyph(face->glyph, &ftglyph)) + throw love::Exception("TrueTypeFont Loading vm->error: FT_Get_Glyph failed\n"); + + FT_Glyph_To_Bitmap(&ftglyph, FT_RENDER_MODE_NORMAL, 0, 1); + FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph) ftglyph; + FT_Bitmap &bitmap = bitmap_glyph->bitmap; //just to make things easier + + // Get metrics + glyphMetrics.bearingX = face->glyph->metrics.horiBearingX >> 6; + glyphMetrics.bearingY = face->glyph->metrics.horiBearingY >> 6; + glyphMetrics.height = bitmap.rows; + glyphMetrics.width = bitmap.width; + glyphMetrics.advance = face->glyph->metrics.horiAdvance >> 6; + + GlyphData *glyphData = new GlyphData(glyph, glyphMetrics, GlyphData::FORMAT_LUMINANCE_ALPHA); + + int size = bitmap.rows * bitmap.width; + unsigned char *dst = (unsigned char *) glyphData->getData(); + + // Note that bitmap.buffer contains only luminosity. We copy that single + // value to our luminosity-alpha format. + for (int i = 0; i < size; i++) + { + dst[2*i] = 255; + dst[2*i+1] = bitmap.buffer[i]; + } + + // Having copied the data over, we can destroy the glyph + FT_Done_Glyph(ftglyph); + + // Return data + return glyphData; +} + +int TrueTypeRasterizer::getGlyphCount() const +{ + return face->num_glyphs; +} + +bool TrueTypeRasterizer::hasGlyph(uint32 glyph) const +{ + return FT_Get_Char_Index(face, glyph) != 0; +} + +} // freetype +} // font +} // love \ No newline at end of file diff --git a/jni/love/src/modules/font/freetype/TrueTypeRasterizer.h b/jni/love/src/modules/font/freetype/TrueTypeRasterizer.h new file mode 100644 index 00000000..71c2b009 --- /dev/null +++ b/jni/love/src/modules/font/freetype/TrueTypeRasterizer.h @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H +#define LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H + +// LOVE +#include "filesystem/File.h" +#include "font/Rasterizer.h" + +// TrueType2 +#include +#include +#include +#include +#include + +namespace love +{ +namespace font +{ +namespace freetype +{ + +/** + * Holds data for a font object. + **/ +class TrueTypeRasterizer : public Rasterizer +{ +public: + TrueTypeRasterizer(FT_Library library, Data *data, int size); + virtual ~TrueTypeRasterizer(); + + // Implement Rasterizer + virtual int getLineHeight() const; + virtual GlyphData *getGlyphData(uint32 glyph) const; + virtual int getGlyphCount() const; + virtual bool hasGlyph(uint32 glyph) const; + +private: + + // TrueType face + FT_Face face; + + // File data + Data *data; +}; // FreetypeRasterizer + +} // freetype +} // font +} // love + +#endif // LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H \ No newline at end of file diff --git a/jni/love/src/modules/font/freetype/wrap_Font.cpp b/jni/love/src/modules/font/freetype/wrap_Font.cpp new file mode 100644 index 00000000..a3f56ed7 --- /dev/null +++ b/jni/love/src/modules/font/freetype/wrap_Font.cpp @@ -0,0 +1,125 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Font.h" + +#include "Font.h" + +#include "font/wrap_GlyphData.h" +#include "font/wrap_Rasterizer.h" + +#include "TrueTypeRasterizer.h" + +namespace love +{ +namespace font +{ +namespace freetype +{ + +static Font *instance = 0; + +int w_newRasterizer(lua_State *L) +{ + // Convert to FileData, if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + Rasterizer *t = 0; + + EXCEPT_GUARD( + if (luax_istype(L, 1, IMAGE_IMAGE_DATA_T)) + { + love::image::ImageData *d = luax_checktype(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); + const char *g = luaL_checkstring(L, 2); + std::string glyphs(g); + t = instance->newRasterizer(d, glyphs); + } + else if (luax_istype(L, 1, DATA_T)) + { + Data *d = luax_checkdata(L, 1); + int size = luaL_checkint(L, 2); + t = instance->newRasterizer(d, size); + } + ) + + luax_pushtype(L, "Rasterizer", FONT_RASTERIZER_T, t); + return 1; +} + +int w_newGlyphData(lua_State *L) +{ + Rasterizer *r = luax_checkrasterizer(L, 1); + GlyphData *t = 0; + + // newGlyphData accepts a unicode character or a codepoint number. + if (lua_type(L, 2) == LUA_TSTRING) + { + std::string glyph = luax_checkstring(L, 2); + + EXCEPT_GUARD(t = instance->newGlyphData(r, glyph);) + } + else + { + uint32 g = (uint32) luaL_checknumber(L, 2); + t = instance->newGlyphData(r, g); + } + + luax_pushtype(L, "GlyphData", FONT_GLYPH_DATA_T, t); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "newRasterizer", w_newRasterizer }, + { "newGlyphData", w_newGlyphData }, + { 0, 0 } +}; + +static const lua_CFunction types[] = +{ + luaopen_glyphdata, + luaopen_rasterizer, + 0 +}; + +extern "C" int luaopen_love_font(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new Font();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "font"; + w.flags = MODULE_T; + w.functions = functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // freetype +} // font +} // love diff --git a/jni/love/src/modules/font/freetype/wrap_Font.h b/jni/love/src/modules/font/freetype/wrap_Font.h new file mode 100644 index 00000000..7a8a74b0 --- /dev/null +++ b/jni/love/src/modules/font/freetype/wrap_Font.h @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_FREETYPE_WRAP_FONT_H +#define LOVE_FONT_FREETYPE_WRAP_FONT_H + +// LOVE +#include "common/config.h" +#include "common/runtime.h" + +namespace love +{ +namespace font +{ +namespace freetype +{ + +int w_newRasterizer(lua_State *L); +int w_newGlyphData(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_font(lua_State *L); + +} // freetype +} // font +} // love + +#endif // LOVE_FONT_FREETYPE_WRAP_FONT_H diff --git a/jni/love/src/modules/font/wrap_GlyphData.cpp b/jni/love/src/modules/font/wrap_GlyphData.cpp new file mode 100644 index 00000000..5a822b27 --- /dev/null +++ b/jni/love/src/modules/font/wrap_GlyphData.cpp @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_GlyphData.h" + +namespace love +{ +namespace font +{ + +GlyphData *luax_checkglyphdata(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "GlyphData", FONT_GLYPH_DATA_T); +} + +int w_GlyphData_getWidth(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + lua_pushinteger(L, t->getWidth()); + return 1; +} + +int w_GlyphData_getHeight(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + lua_pushinteger(L, t->getHeight()); + return 1; +} + +int w_GlyphData_getDimensions(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + lua_pushinteger(L, t->getWidth()); + lua_pushinteger(L, t->getHeight()); + return 2; +} + +int w_GlyphData_getGlyph(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + uint32 glyph = t->getGlyph(); + lua_pushnumber(L, (lua_Number) glyph); + return 1; +} + +int w_GlyphData_getGlyphString(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + + EXCEPT_GUARD(luax_pushstring(L, t->getGlyphString());) + return 1; +} + +int w_GlyphData_getAdvance(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + lua_pushinteger(L, t->getAdvance()); + return 1; +} + +int w_GlyphData_getBearing(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + lua_pushinteger(L, t->getBearingX()); + lua_pushinteger(L, t->getBearingY()); + return 2; +} + +int w_GlyphData_getBoundingBox(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + + int minX = t->getMinX(); + int minY = t->getMinY(); + int maxX = t->getMaxX(); + int maxY = t->getMaxY(); + + int width = maxX - minX; + int height = maxY - minY; + + lua_pushinteger(L, minX); + lua_pushinteger(L, minY); + lua_pushinteger(L, width); + lua_pushinteger(L, height); + + return 4; +} + +int w_GlyphData_getFormat(lua_State *L) +{ + GlyphData *t = luax_checkglyphdata(L, 1); + + const char *str; + if (!GlyphData::getConstant(t->getFormat(), str)) + return luaL_error(L, "unknown GlyphData format."); + + lua_pushstring(L, str); + return 1; +} + +static const luaL_Reg functions[] = +{ + // Data + { "getString", w_Data_getString }, + { "getPointer", w_Data_getPointer }, + { "getSize", w_Data_getSize }, + + { "getWidth", w_GlyphData_getWidth }, + { "getHeight", w_GlyphData_getHeight }, + { "getDimensions", w_GlyphData_getDimensions }, + { "getGlyph", w_GlyphData_getGlyph }, + { "getGlyphString", w_GlyphData_getGlyphString }, + { "getAdvance", w_GlyphData_getAdvance }, + { "getBearing", w_GlyphData_getBearing }, + { "getBoundingBox", w_GlyphData_getBoundingBox }, + { "getFormat", w_GlyphData_getFormat }, + { 0, 0 } +}; + +extern "C" int luaopen_glyphdata(lua_State *L) +{ + return luax_register_type(L, "GlyphData", functions); +} + +} // font +} // love diff --git a/jni/love/src/modules/font/wrap_GlyphData.h b/jni/love/src/modules/font/wrap_GlyphData.h new file mode 100644 index 00000000..d76881d1 --- /dev/null +++ b/jni/love/src/modules/font/wrap_GlyphData.h @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_WRAP_GLYPH_DATA_H +#define LOVE_FONT_WRAP_GLYPH_DATA_H + +// LOVE +#include "common/runtime.h" +#include "common/wrap_Data.h" + +#include "GlyphData.h" + +namespace love +{ +namespace font +{ + +GlyphData *luax_checkglyphdata(lua_State *L, int idx); +int w_GlyphData_getWidth(lua_State *L); +int w_GlyphData_getHeight(lua_State *L); +int w_GlyphData_getDimensions(lua_State *L); +int w_GlyphData_getGlyph(lua_State *L); +int w_GlyphData_getGlyphString(lua_State *L); +int w_GlyphData_getAdvance(lua_State *L); +int w_GlyphData_getBearing(lua_State *L); +int w_GlyphData_getBoundingBox(lua_State *L); +int w_GlyphData_getFormat(lua_State *L); +extern "C" int luaopen_glyphdata(lua_State *L); + +} // font +} // love + +#endif // LOVE_FONT_WRAP_GLYPH_DATA_H diff --git a/jni/love/src/modules/font/wrap_Rasterizer.cpp b/jni/love/src/modules/font/wrap_Rasterizer.cpp new file mode 100644 index 00000000..4e32a7a7 --- /dev/null +++ b/jni/love/src/modules/font/wrap_Rasterizer.cpp @@ -0,0 +1,145 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Rasterizer.h" + +#include "common/wrap_Data.h" + +namespace love +{ +namespace font +{ + +Rasterizer *luax_checkrasterizer(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Rasterizer", FONT_RASTERIZER_T); +} + +int w_Rasterizer_getHeight(lua_State *L) +{ + Rasterizer *t = luax_checkrasterizer(L, 1); + lua_pushinteger(L, t->getHeight()); + return 1; +} + +int w_Rasterizer_getAdvance(lua_State *L) +{ + Rasterizer *t = luax_checkrasterizer(L, 1); + lua_pushinteger(L, t->getAdvance()); + return 1; +} + +int w_Rasterizer_getAscent(lua_State *L) +{ + Rasterizer *t = luax_checkrasterizer(L, 1); + lua_pushinteger(L, t->getAscent()); + return 1; +} + +int w_Rasterizer_getDescent(lua_State *L) +{ + Rasterizer *t = luax_checkrasterizer(L, 1); + lua_pushinteger(L, t->getDescent()); + return 1; +} + +int w_Rasterizer_getLineHeight(lua_State *L) +{ + Rasterizer *t = luax_checkrasterizer(L, 1); + lua_pushinteger(L, t->getLineHeight()); + return 1; +} + +int w_Rasterizer_getGlyphData(lua_State *L) +{ + Rasterizer *t = luax_checkrasterizer(L, 1); + GlyphData *g = 0; + + EXCEPT_GUARD( + // getGlyphData accepts a unicode character or a codepoint number. + if (lua_type(L, 2) == LUA_TSTRING) + { + std::string glyph = luax_checkstring(L, 2); + g = t->getGlyphData(glyph); + } + else + { + uint32 glyph = (uint32) luaL_checknumber(L, 2); + g = t->getGlyphData(glyph); + } + ) + + luax_pushtype(L, "GlyphData", FONT_GLYPH_DATA_T, g); + return 1; +} + +int w_Rasterizer_getGlyphCount(lua_State *L) +{ + Rasterizer *t = luax_checkrasterizer(L, 1); + lua_pushinteger(L, t->getGlyphCount()); + return 1; +} + +int w_Rasterizer_hasGlyphs(lua_State *L) +{ + Rasterizer *t = luax_checkrasterizer(L, 1); + + bool hasglyph = false; + + int count = lua_gettop(L) - 1; + count = count < 1 ? 1 : count; + + EXCEPT_GUARD( + for (int i = 2; i < count + 2; i++) + { + if (lua_type(L, i) == LUA_TSTRING) + hasglyph = t->hasGlyphs(luax_checkstring(L, i)); + else + hasglyph = t->hasGlyph((uint32) luaL_checknumber(L, i)); + + if (!hasglyph) + break; + } + ) + + luax_pushboolean(L, hasglyph); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getHeight", w_Rasterizer_getHeight }, + { "getAdvance", w_Rasterizer_getAdvance }, + { "getAscent", w_Rasterizer_getAscent }, + { "getDescent", w_Rasterizer_getDescent }, + { "getLineHeight", w_Rasterizer_getLineHeight }, + { "getGlyphData", w_Rasterizer_getGlyphData }, + { "getGlyphCount", w_Rasterizer_getGlyphCount }, + { "hasGlyphs", w_Rasterizer_hasGlyphs }, + { 0, 0 } +}; + +extern "C" int luaopen_rasterizer(lua_State *L) +{ + return luax_register_type(L, "Rasterizer", functions); +} + +} // font +} // love diff --git a/jni/love/src/modules/font/wrap_Rasterizer.h b/jni/love/src/modules/font/wrap_Rasterizer.h new file mode 100644 index 00000000..aea8ca63 --- /dev/null +++ b/jni/love/src/modules/font/wrap_Rasterizer.h @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_FONT_WRAP_RASTERIZER_H +#define LOVE_FONT_WRAP_RASTERIZER_H + +// LOVE +#include "common/runtime.h" +#include "Rasterizer.h" + +namespace love +{ +namespace font +{ + +Rasterizer *luax_checkrasterizer(lua_State *L, int idx); +int w_Rasterizer_getHeight(lua_State *L); +int w_Rasterizer_getAdvance(lua_State *L); +int w_Rasterizer_getAscent(lua_State *L); +int w_Rasterizer_getDescent(lua_State *L); +int w_Rasterizer_getLineHeight(lua_State *L); +int w_Rasterizer_getGlyphData(lua_State *L); +int w_Rasterizer_getGlyphCount(lua_State *L); +int w_Rasterizer_hasGlyphs(lua_State *L); +extern "C" int luaopen_rasterizer(lua_State *L); + +} // font +} // love + +#endif // LOVE_FONT_WRAP_RASTERIZER_H diff --git a/jni/love/src/modules/graphics/Color.h b/jni/love/src/modules/graphics/Color.h new file mode 100644 index 00000000..1019e0cd --- /dev/null +++ b/jni/love/src/modules/graphics/Color.h @@ -0,0 +1,109 @@ +/** + * Copyright (c) 2006-2011 LOVE Development Team + * + * 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 LOVE_GRAPHICS_COLOR_H +#define LOVE_GRAPHICS_COLOR_H + +namespace love +{ +namespace graphics +{ + +template +struct ColorT +{ + T r; + T g; + T b; + T a; + + ColorT() : r(0), g(0), b(0), a(0) {} + ColorT(T r_, T g_, T b_, T a_) : r(r_), g(g_), b(b_), a(a_) {} + void set(T r_, T g_, T b_, T a_) + { + r = r_; + g = g_; + b = b_; + a = a_; + } + + ColorT operator+=(const ColorT &other); + ColorT operator*=(T s); + ColorT operator/=(T s); +}; + +template +ColorT ColorT::operator+=(const ColorT &other) +{ + r += other.r; + g += other.g; + b += other.b; + a += other.a; + return *this; +} + +template +ColorT ColorT::operator*=(T s) +{ + r *= s; + g *= s; + b *= s; + a *= s; + return *this; +} + +template +ColorT ColorT::operator/=(T s) +{ + r /= s; + g /= s; + b /= s; + a /= s; + return *this; +} + +template +ColorT operator+(const ColorT &a, const ColorT &b) +{ + ColorT tmp(a); + return tmp += b; +} + +template +ColorT operator*(const ColorT &a, T s) +{ + ColorT tmp(a); + return tmp *= s; +} + +template +ColorT operator/(const ColorT &a, T s) +{ + ColorT tmp(a); + return tmp /= s; +} + +typedef ColorT Color; +typedef ColorT Colorf; + +} // graphics +} // love + +#endif // LOVE_GRAPHICS_COLOR_H diff --git a/jni/love/src/modules/graphics/DrawQable.h b/jni/love/src/modules/graphics/DrawQable.h new file mode 100644 index 00000000..1c0d5230 --- /dev/null +++ b/jni/love/src/modules/graphics/DrawQable.h @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_DRAWQABLE_H +#define LOVE_GRAPHICS_DRAWQABLE_H + +// LOVE +#include "Drawable.h" +#include "Quad.h" + +namespace love +{ +namespace graphics +{ + +/** + * A DrawQable is anything that be drawn in part with a Quad object. + **/ +class DrawQable : public Drawable +{ +public: + + /** + * Destructor. + **/ + virtual ~DrawQable() {} + + /** + * Draws the object with the specified transformation. + * + * @param quad The Quad object to use to draw the object. + * @param x The position of the object along the x-axis. + * @param y The position of the object along the y-axis. + * @param angle The angle of the object (in radians). + * @param sx The scale factor along the x-axis. + * @param sy The scale factor along the y-axis. + * @param ox The origin offset along the x-axis. + * @param oy The origin offset along the y-axis. + * @param kx Shear along the x-axis. + * @param ky Shear along the y-axis. + **/ + virtual void drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const = 0; +}; + +} // graphics +} // love + +#endif // LOVE_GRAPHICS_DRAWQABLE_H diff --git a/jni/love/src/modules/graphics/Drawable.cpp b/jni/love/src/modules/graphics/Drawable.cpp new file mode 100644 index 00000000..843e031d --- /dev/null +++ b/jni/love/src/modules/graphics/Drawable.cpp @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Drawable.h" + +namespace love +{ +namespace graphics +{ + +Drawable::~Drawable() +{ +} + +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/Drawable.h b/jni/love/src/modules/graphics/Drawable.h new file mode 100644 index 00000000..d399a085 --- /dev/null +++ b/jni/love/src/modules/graphics/Drawable.h @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_DRAWABLE_H +#define LOVE_GRAPHICS_DRAWABLE_H + +// LOVE +#include "common/Object.h" + +namespace love +{ +namespace graphics +{ + +/** + * A Drawable is anything that can be drawn on screen with a + * position, scale and orientation. + **/ +class Drawable : public Object +{ +public: + + /** + * Destructor. + **/ + virtual ~Drawable(); + + /** + * Draws the object with the specified transformation. + * + * @param x The position of the object along the x-axis. + * @param y The position of the object along the y-axis. + * @param angle The angle of the object (in radians). + * @param sx The scale factor along the x-axis. + * @param sy The scale factor along the y-axis. + * @param ox The origin offset along the x-axis. + * @param oy The origin offset along the y-axis. + * @param kx Shear along the x-axis. + * @param ky Shear along the y-axis. + **/ + virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const = 0; +}; + +} // graphics +} // love + +#endif // LOVE_GRAPHICS_DRAWABLE_H diff --git a/jni/love/src/modules/graphics/Graphics.cpp b/jni/love/src/modules/graphics/Graphics.cpp new file mode 100644 index 00000000..b9f41013 --- /dev/null +++ b/jni/love/src/modules/graphics/Graphics.cpp @@ -0,0 +1,173 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Graphics.h" + +namespace love +{ +namespace graphics +{ + +Graphics::~Graphics() +{ +} + +bool Graphics::getConstant(const char *in, DrawMode &out) +{ + return drawModes.find(in, out); +} + +bool Graphics::getConstant(DrawMode in, const char *&out) +{ + return drawModes.find(in, out); +} + +bool Graphics::getConstant(const char *in, AlignMode &out) +{ + return alignModes.find(in, out); +} + +bool Graphics::getConstant(AlignMode in, const char *&out) +{ + return alignModes.find(in, out); +} + +bool Graphics::getConstant(const char *in, BlendMode &out) +{ + return blendModes.find(in, out); +} + +bool Graphics::getConstant(BlendMode in, const char *&out) +{ + return blendModes.find(in, out); +} + +bool Graphics::getConstant(const char *in, LineStyle &out) +{ + return lineStyles.find(in, out); +} + +bool Graphics::getConstant(LineStyle in, const char *&out) +{ + return lineStyles.find(in, out); +} + +bool Graphics::getConstant(const char *in, LineJoin &out) +{ + return lineJoins.find(in, out); +} + +bool Graphics::getConstant(LineJoin in, const char *&out) +{ + return lineJoins.find(in, out); +} + +bool Graphics::getConstant(const char *in, PointStyle &out) +{ + return pointStyles.find(in, out); +} + +bool Graphics::getConstant(PointStyle in, const char *&out) +{ + return pointStyles.find(in, out); +} + +bool Graphics::getConstant(const char *in, Support &out) +{ + return support.find(in, out); +} + +bool Graphics::getConstant(Support in, const char *&out) +{ + return support.find(in, out); +} + +StringMap::Entry Graphics::drawModeEntries[] = +{ + { "line", Graphics::DRAW_LINE }, + { "fill", Graphics::DRAW_FILL }, +}; + +StringMap Graphics::drawModes(Graphics::drawModeEntries, sizeof(Graphics::drawModeEntries)); + +StringMap::Entry Graphics::alignModeEntries[] = +{ + { "left", Graphics::ALIGN_LEFT }, + { "right", Graphics::ALIGN_RIGHT }, + { "center", Graphics::ALIGN_CENTER }, + { "justify", Graphics::ALIGN_JUSTIFY }, +}; + +StringMap Graphics::alignModes(Graphics::alignModeEntries, sizeof(Graphics::alignModeEntries)); + +StringMap::Entry Graphics::blendModeEntries[] = +{ + { "alpha", Graphics::BLEND_ALPHA }, + { "additive", Graphics::BLEND_ADDITIVE }, + { "subtractive", Graphics::BLEND_SUBTRACTIVE }, + { "multiplicative", Graphics::BLEND_MULTIPLICATIVE }, + { "premultiplied", Graphics::BLEND_PREMULTIPLIED }, + { "replace", Graphics::BLEND_REPLACE }, +}; + +StringMap Graphics::blendModes(Graphics::blendModeEntries, sizeof(Graphics::blendModeEntries)); + +StringMap::Entry Graphics::lineStyleEntries[] = +{ + { "smooth", Graphics::LINE_SMOOTH }, + { "rough", Graphics::LINE_ROUGH } +}; + +StringMap Graphics::lineStyles(Graphics::lineStyleEntries, sizeof(Graphics::lineStyleEntries)); + +StringMap::Entry Graphics::lineJoinEntries[] = +{ + { "none", Graphics::LINE_JOIN_NONE }, + { "miter", Graphics::LINE_JOIN_MITER }, + { "bevel", Graphics::LINE_JOIN_BEVEL } +}; + +StringMap Graphics::lineJoins(Graphics::lineJoinEntries, sizeof(Graphics::lineJoinEntries)); + +StringMap::Entry Graphics::pointStyleEntries[] = +{ + { "smooth", Graphics::POINT_SMOOTH }, + { "rough", Graphics::POINT_ROUGH } +}; + +StringMap Graphics::pointStyles(Graphics::pointStyleEntries, sizeof(Graphics::pointStyleEntries)); + +StringMap::Entry Graphics::supportEntries[] = +{ + { "canvas", Graphics::SUPPORT_CANVAS }, + { "hdrcanvas", Graphics::SUPPORT_HDR_CANVAS }, + { "multicanvas", Graphics::SUPPORT_MULTI_CANVAS }, + { "shader", Graphics::SUPPORT_SHADER }, + { "npot", Graphics::SUPPORT_NPOT }, + { "subtractive", Graphics::SUPPORT_SUBTRACTIVE }, + { "mipmap", Graphics::SUPPORT_MIPMAP }, + { "dxt", Graphics::SUPPORT_DXT }, + { "bc5", Graphics::SUPPORT_BC5 }, +}; + +StringMap Graphics::support(Graphics::supportEntries, sizeof(Graphics::supportEntries)); + +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/Graphics.h b/jni/love/src/modules/graphics/Graphics.h new file mode 100644 index 00000000..44ed3550 --- /dev/null +++ b/jni/love/src/modules/graphics/Graphics.h @@ -0,0 +1,185 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_GRAPHICS_H +#define LOVE_GRAPHICS_GRAPHICS_H + +// LOVE +#include "common/Module.h" +#include "common/StringMap.h" + +namespace love +{ +namespace graphics +{ + +class Graphics : public Module +{ +public: + + enum DrawMode + { + DRAW_LINE = 1, + DRAW_FILL, + DRAW_MAX_ENUM + }; + + enum AlignMode + { + ALIGN_LEFT = 1, + ALIGN_CENTER, + ALIGN_RIGHT, + ALIGN_JUSTIFY, + ALIGN_MAX_ENUM + }; + + enum BlendMode + { + BLEND_ALPHA = 1, + BLEND_ADDITIVE, + BLEND_SUBTRACTIVE, + BLEND_MULTIPLICATIVE, + BLEND_PREMULTIPLIED, + BLEND_REPLACE, + BLEND_MAX_ENUM + }; + + enum LineStyle + { + LINE_ROUGH = 1, + LINE_SMOOTH, + LINE_MAX_ENUM + }; + + enum LineJoin + { + LINE_JOIN_NONE = 1, + LINE_JOIN_MITER, + LINE_JOIN_BEVEL, + LINE_JOIN_MAX_ENUM + }; + + enum PointStyle + { + POINT_ROUGH = 1, + POINT_SMOOTH, + POINT_MAX_ENUM + }; + + enum Support + { + SUPPORT_CANVAS = 1, + SUPPORT_HDR_CANVAS, + SUPPORT_MULTI_CANVAS, + SUPPORT_SHADER, + SUPPORT_NPOT, + SUPPORT_SUBTRACTIVE, + SUPPORT_MIPMAP, + SUPPORT_DXT, + SUPPORT_BC5, + SUPPORT_MAX_ENUM + }; + + enum Renderer + { + RENDERER_OPENGL = 0, + RENDERER_OPENGLES, + RENDERER_MAX_ENUM + }; + + enum RendererInfo + { + RENDERER_INFO_NAME = 1, + RENDERER_INFO_VERSION, + RENDERER_INFO_VENDOR, + RENDERER_INFO_DEVICE, + RENDERER_INFO_MAX_ENUM + }; + + virtual ~Graphics(); + + /** + * Sets the current graphics display viewport dimensions. + **/ + virtual void setViewportSize(int width, int height) = 0; + + /** + * Sets the current graphics display viewport and initializes the renderer. + * @param width The viewport width. + * @param height The viewport height. + **/ + virtual bool setMode(int width, int height) = 0; + + /** + * Un-sets the current graphics display mode (uninitializing objects if + * necessary.) + **/ + virtual void unSetMode() = 0; + + static bool getConstant(const char *in, DrawMode &out); + static bool getConstant(DrawMode in, const char *&out); + + static bool getConstant(const char *in, AlignMode &out); + static bool getConstant(AlignMode in, const char *&out); + + static bool getConstant(const char *in, BlendMode &out); + static bool getConstant(BlendMode in, const char *&out); + + static bool getConstant(const char *in, LineStyle &out); + static bool getConstant(LineStyle in, const char *&out); + + static bool getConstant(const char *in, LineJoin &out); + static bool getConstant(LineJoin in, const char *&out); + + static bool getConstant(const char *in, PointStyle &out); + static bool getConstant(PointStyle in, const char *&out); + + static bool getConstant(const char *in, Support &out); + static bool getConstant(Support in, const char *&out); + +private: + + static StringMap::Entry drawModeEntries[]; + static StringMap drawModes; + + static StringMap::Entry alignModeEntries[]; + static StringMap alignModes; + + static StringMap::Entry blendModeEntries[]; + static StringMap blendModes; + + static StringMap::Entry lineStyleEntries[]; + static StringMap lineStyles; + + static StringMap::Entry lineJoinEntries[]; + static StringMap lineJoins; + + static StringMap::Entry pointStyleEntries[]; + static StringMap pointStyles; + + static StringMap::Entry supportEntries[]; + static StringMap support; + +}; // Graphics + +} // graphics +} // love + +#endif // LOVE_GRAPHICS_GRAPHICS_H diff --git a/jni/love/src/modules/graphics/Image.cpp b/jni/love/src/modules/graphics/Image.cpp new file mode 100644 index 00000000..3bdc06e0 --- /dev/null +++ b/jni/love/src/modules/graphics/Image.cpp @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Image.h" + +namespace love +{ +namespace graphics +{ + +Image::Filter Image::defaultFilter; + +Image::Filter::Filter() + : min(FILTER_LINEAR) + , mag(FILTER_LINEAR) + , mipmap(FILTER_NONE) + , anisotropy(1.0f) +{ +} + +Image::Wrap::Wrap() + : s(WRAP_CLAMP) + , t(WRAP_CLAMP) +{ +} + +Image::~Image() +{ +} + +void Image::setDefaultFilter(const Filter &f) +{ + defaultFilter = f; +} + +const Image::Filter &Image::getDefaultFilter() +{ + return defaultFilter; +} + +bool Image::getConstant(const char *in, FilterMode &out) +{ + return filterModes.find(in, out); +} + +bool Image::getConstant(FilterMode in, const char *&out) +{ + return filterModes.find(in, out); +} + +bool Image::getConstant(const char *in, WrapMode &out) +{ + return wrapModes.find(in, out); +} + +bool Image::getConstant(WrapMode in, const char *&out) +{ + return wrapModes.find(in, out); +} + +StringMap::Entry Image::filterModeEntries[] = +{ + { "linear", Image::FILTER_LINEAR }, + { "nearest", Image::FILTER_NEAREST }, +}; + +StringMap Image::filterModes(Image::filterModeEntries, sizeof(Image::filterModeEntries)); + +StringMap::Entry Image::wrapModeEntries[] = +{ + { "clamp", Image::WRAP_CLAMP }, + { "repeat", Image::WRAP_REPEAT }, +}; + +StringMap Image::wrapModes(Image::wrapModeEntries, sizeof(Image::wrapModeEntries)); + + +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/Image.h b/jni/love/src/modules/graphics/Image.h new file mode 100644 index 00000000..e2c49116 --- /dev/null +++ b/jni/love/src/modules/graphics/Image.h @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_IMAGE_H +#define LOVE_GRAPHICS_IMAGE_H + +// LOVE +#include "graphics/Volatile.h" +#include "graphics/DrawQable.h" +#include "common/StringMap.h" + +namespace love +{ +namespace graphics +{ + +class Image : public DrawQable, public Volatile +{ +public: + + enum WrapMode + { + WRAP_CLAMP = 1, + WRAP_REPEAT, + WRAP_MAX_ENUM + }; + + enum FilterMode + { + FILTER_LINEAR = 1, + FILTER_NEAREST, + FILTER_NONE, + FILTER_MAX_ENUM + }; + + struct Filter + { + Filter(); + FilterMode min; + FilterMode mag; + FilterMode mipmap; + float anisotropy; + }; + + struct Wrap + { + Wrap(); + WrapMode s; + WrapMode t; + }; + + virtual ~Image(); + + // The default filter. + static void setDefaultFilter(const Filter &f); + static const Filter &getDefaultFilter(); + + static bool getConstant(const char *in, FilterMode &out); + static bool getConstant(FilterMode in, const char *&out); + static bool getConstant(const char *in, WrapMode &out); + static bool getConstant(WrapMode in, const char *&out); + +private: + + // The default texture filter. + static Filter defaultFilter; + + static StringMap::Entry filterModeEntries[]; + static StringMap filterModes; + static StringMap::Entry wrapModeEntries[]; + static StringMap wrapModes; + +}; // Image + +} // graphics +} // love + +#endif // LOVE_GRAPHICS_IMAGE_H diff --git a/jni/love/src/modules/graphics/Quad.cpp b/jni/love/src/modules/graphics/Quad.cpp new file mode 100644 index 00000000..2b1b04c7 --- /dev/null +++ b/jni/love/src/modules/graphics/Quad.cpp @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Quad.h" + +// C +#include // For memcpy + +namespace love +{ +namespace graphics +{ + +Quad::Quad(const Quad::Viewport &v, float sw, float sh) + : sw(sw) + , sh(sh) +{ + memset(vertices, 255, sizeof(Vertex) * NUM_VERTICES); + refresh(v, sw, sh); +} + +Quad::~Quad() +{ +} + +void Quad::refresh(const Quad::Viewport &v, float sw, float sh) +{ + viewport = v; + + vertices[0].x = 0; + vertices[0].y = 0; + vertices[1].x = 0; + vertices[1].y = v.h; + vertices[2].x = v.w; + vertices[2].y = v.h; + vertices[3].x = v.w; + vertices[3].y = 0; + + vertices[0].s = v.x/sw; + vertices[0].t = v.y/sh; + vertices[1].s = v.x/sw; + vertices[1].t = (v.y+v.h)/sh; + vertices[2].s = (v.x+v.w)/sw; + vertices[2].t = (v.y+v.h)/sh; + vertices[3].s = (v.x+v.w)/sw; + vertices[3].t = v.y/sh; +} + +void Quad::setViewport(const Quad::Viewport &v) +{ + refresh(v, sw, sh); +} + +Quad::Viewport Quad::getViewport() const +{ + return viewport; +} + +const Vertex *Quad::getVertices() const +{ + return vertices; +} + +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/Quad.h b/jni/love/src/modules/graphics/Quad.h new file mode 100644 index 00000000..7fd72c9b --- /dev/null +++ b/jni/love/src/modules/graphics/Quad.h @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_QUAD_H +#define LOVE_GRAPHICS_QUAD_H + +// LOVE +#include "common/Object.h" +#include "common/math.h" + +namespace love +{ +namespace graphics +{ + +class Quad : public Object +{ +public: + + struct Viewport + { + float x, y; + float w, h; + }; + + static const size_t NUM_VERTICES = 4; + + Quad(const Viewport &v, float sw, float sh); + virtual ~Quad(); + + void refresh(const Viewport &v, float sw, float sh); + void setViewport(const Viewport &v); + Viewport getViewport() const; + + const Vertex *getVertices() const; + +private: + + Vertex vertices[NUM_VERTICES]; + + Viewport viewport; + float sw; + float sh; + +}; // Quad + +} // graphics +} // love + +#endif // LOVE_GRAPHICS_QUAD_H diff --git a/jni/love/src/modules/graphics/Volatile.cpp b/jni/love/src/modules/graphics/Volatile.cpp new file mode 100644 index 00000000..fa505e7d --- /dev/null +++ b/jni/love/src/modules/graphics/Volatile.cpp @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Volatile.h" + +namespace love +{ +namespace graphics +{ + +// Static members. +std::list Volatile::all; + +Volatile::Volatile() +{ + // Insert this object into "all". + all.push_back(this); +} + +Volatile::~Volatile() +{ + // Remove the pointer to this object. + all.remove(this); +} + +bool Volatile::loadAll() +{ + bool success = true; + std::list::iterator i = all.begin(); + + while (i != all.end()) + { + success = success && (*i)->loadVolatile(); + i++; + } + + return success; +} + +void Volatile::unloadAll() +{ + std::list::iterator i = all.begin(); + + while (i != all.end()) + { + (*i)->unloadVolatile(); + i++; + } +} + +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/Volatile.h b/jni/love/src/modules/graphics/Volatile.h new file mode 100644 index 00000000..34b2f8be --- /dev/null +++ b/jni/love/src/modules/graphics/Volatile.h @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_VOLATILE_H +#define LOVE_GRAPHICS_VOLATILE_H + +// STL +#include + +namespace love +{ +namespace graphics +{ + +/** + * This class is the superclass of all objects which must completely or + * partially reload when the user changes the display resolution. All + * volatile objects will be notified when the display mode changes. + * + * @author Anders Ruud + **/ +class Volatile +{ +private: + + // A list of all Volatile object currently alive. + static std::list all; + +public: + + /** + * Constructor. Automatically adds \c this into the list + * of volatile objects. + **/ + Volatile(); + + /** + * Destructor. Removes \c this from the list of volatile + * objects. + **/ + virtual ~Volatile(); + + /** + * Loads the part(s) of the object which is destroyed when + * the display mode is changed. + * + * @return True if successful, false on errors. + **/ + virtual bool loadVolatile() = 0; + + /** + * Unloads the part(s) of the objects which would be destroyed + * anyway when the display mode is changed. + **/ + virtual void unloadVolatile() = 0; + + // Static: + + /** + * Calls \c loadVolatile() on each element in the list of volatiles. + * + * @return True if all elements succeeded, false if one or more failed. + **/ + static bool loadAll(); + + /** + * Calls \c unloadVolatile() on each element in the list of volatiles. + **/ + static void unloadAll(); + +}; // Volatile + +} // graphics +} // love + +#endif // LOVE_GRAPHICS_VOLATILE_H diff --git a/jni/love/src/modules/graphics/opengl/Canvas.cpp b/jni/love/src/modules/graphics/opengl/Canvas.cpp new file mode 100644 index 00000000..ed9515a2 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Canvas.cpp @@ -0,0 +1,813 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Canvas.h" +#include "Image.h" +#include "Graphics.h" +#include "common/Matrix.h" +#include "common/config.h" + +#include // For memcpy +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +// strategy for fbo creation, interchangable at runtime: +// none, opengl >= 3.0, extensions +struct FramebufferStrategy +{ + virtual ~FramebufferStrategy() {} + + /// create a new framebuffer and texture + /** + * @param[out] framebuffer Framebuffer name + * @param[out] img Texture name + * @param[in] width Width of framebuffer + * @param[in] height Height of framebuffer + * @param[in] texture_type Type of the canvas texture. + * @return Creation status + */ + virtual GLenum createFBO(GLuint &, GLuint &, int, int, Canvas::TextureType) + { + return GL_FRAMEBUFFER_UNSUPPORTED; + } + + /// Create a stencil buffer and attach it to the active framebuffer object + /** + * @param[in] width Width of the stencil buffer + * @param[in] height Height of the stencil buffer + * @param[out] stencil Name for stencil buffer + * @return Whether the stencil buffer was successfully created + **/ + virtual bool createStencil(int, int, GLuint &) + { + return false; + } + + /// remove objects + /** + * @param[in] framebuffer Framebuffer name + * @param[in] depth_stencil Name for packed depth and stencil buffer + * @param[in] img Texture name + */ + virtual void deleteFBO(GLuint, GLuint, GLuint) {} + virtual void bindFBO(GLuint) {} + + /// attach additional canvases to the active framebuffer for rendering + /** + * @param[in] canvases List of canvases to attach + **/ + virtual void setAttachments(const std::vector &) {} + + /// stop using all additional attached canvases + virtual void setAttachments() {} +}; + +struct FramebufferStrategyCore : public FramebufferStrategy +{ + virtual GLenum createFBO(GLuint &framebuffer, GLuint &img, int width, int height, Canvas::TextureType texture_type) + { + // get currently bound fbo to reset to it later + GLint current_fbo; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); + + // create framebuffer + glGenFramebuffers(1, &framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + + // generate texture save target + GLint internalFormat; + GLenum format; + switch (texture_type) + { + case Canvas::TYPE_HDR: + internalFormat = GL_RGBA16F; + format = GL_FLOAT; + break; + case Canvas::TYPE_NORMAL: + default: + internalFormat = GL_RGBA; + format = GL_UNSIGNED_BYTE; + } + + glGenTextures(1, &img); + gl.bindTexture(img); + + gl.setTextureFilter(Image::getDefaultFilter()); + + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, + 0, GL_RGBA, format, NULL); + gl.bindTexture(0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, img, 0); + + // check status + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + + // unbind framebuffer + glBindFramebuffer(GL_FRAMEBUFFER, (GLuint) current_fbo); + return status; + } + + virtual bool createStencil(int width, int height, GLuint &stencil) + { + // create stencil buffer + glDeleteRenderbuffers(1, &stencil); + glGenRenderbuffers(1, &stencil); + glBindRenderbuffer(GL_RENDERBUFFER, stencil); + glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height); + + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, stencil); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + // check status + return glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE; + } + + virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint img) + { + gl.deleteTexture(img); + if (depth_stencil != 0) + glDeleteRenderbuffers(1, &depth_stencil); + if (framebuffer != 0) + glDeleteFramebuffers(1, &framebuffer); + } + + virtual void bindFBO(GLuint framebuffer) + { + glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); + } + + virtual void setAttachments() + { + // set a single render target + glDrawBuffer(GL_COLOR_ATTACHMENT0); + } + + virtual void setAttachments(const std::vector &canvases) + { + if (canvases.size() == 0) + { + setAttachments(); + return; + } + + std::vector drawbuffers; + drawbuffers.push_back(GL_COLOR_ATTACHMENT0); + + // Attach the canvas textures to the currently bound framebuffer. + for (size_t i = 0; i < canvases.size(); i++) + { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1 + i, + GL_TEXTURE_2D, canvases[i]->getTextureName(), 0); + drawbuffers.push_back(GL_COLOR_ATTACHMENT1 + i); + } + + // set up multiple render targets + if (GLAD_VERSION_2_0 || GLAD_ES_VERSION_3_0) + glDrawBuffers(drawbuffers.size(), &drawbuffers[0]); + else if (GLAD_ARB_draw_buffers) + glDrawBuffersARB(drawbuffers.size(), &drawbuffers[0]); + } +}; + +struct FramebufferStrategyCorePacked : public FramebufferStrategyCore +{ + virtual bool createStencil(int width, int height, GLuint &stencil) + { + // create combined depth/stencil buffer + glDeleteRenderbuffers(1, &stencil); + glGenRenderbuffers(1, &stencil); + glBindRenderbuffer(GL_RENDERBUFFER, stencil); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, width, height); + + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, stencil); + + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + // check status + return glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE; + } +}; + +struct FramebufferStrategyPackedEXT : public FramebufferStrategy +{ + virtual GLenum createFBO(GLuint &framebuffer, GLuint &img, int width, int height, Canvas::TextureType texture_type) + { + GLint current_fbo; + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, ¤t_fbo); + + // create framebuffer + glGenFramebuffersEXT(1, &framebuffer); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); + + // generate texture save target + GLint internalFormat; + GLenum format; + switch (texture_type) + { + case Canvas::TYPE_HDR: + internalFormat = GL_RGBA16F; + format = GL_FLOAT; + break; + case Canvas::TYPE_NORMAL: + default: + internalFormat = GL_RGBA; + format = GL_UNSIGNED_BYTE; + } + + glGenTextures(1, &img); + gl.bindTexture(img); + + gl.setTextureFilter(Image::getDefaultFilter()); + + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, width, height, + 0, GL_RGBA, format, NULL); + gl.bindTexture(0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, + GL_TEXTURE_2D, img, 0); + + // check status + GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + + // unbind framebuffer + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, (GLuint) current_fbo); + return status; + } + + virtual bool createStencil(int width, int height, GLuint &stencil) + { + // create combined depth/stencil buffer + glDeleteRenderbuffers(1, &stencil); + glGenRenderbuffersEXT(1, &stencil); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencil); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_STENCIL_EXT, + width, height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, stencil); + + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + + // check status + return glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT; + } + + virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint img) + { + gl.deleteTexture(img); + if (depth_stencil != 0) + glDeleteRenderbuffersEXT(1, &depth_stencil); + if (framebuffer != 0) + glDeleteFramebuffersEXT(1, &framebuffer); + } + + virtual void bindFBO(GLuint framebuffer) + { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); + } + + virtual void setAttachments() + { + // set a single render target + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + } + + virtual void setAttachments(const std::vector &canvases) + { + if (canvases.size() == 0) + { + setAttachments(); + return; + } + + std::vector drawbuffers; + drawbuffers.push_back(GL_COLOR_ATTACHMENT0_EXT); + + // Attach the canvas textures to the currently bound framebuffer. + for (size_t i = 0; i < canvases.size(); i++) + { + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1_EXT + i, + GL_TEXTURE_2D, canvases[i]->getTextureName(), 0); + drawbuffers.push_back(GL_COLOR_ATTACHMENT1_EXT + i); + } + + // set up multiple render targets + if (GLAD_VERSION_2_0 || GLAD_ES_VERSION_3_0) + glDrawBuffers(drawbuffers.size(), &drawbuffers[0]); + else if (GLAD_ARB_draw_buffers) + glDrawBuffersARB(drawbuffers.size(), &drawbuffers[0]); + } +}; + +struct FramebufferStrategyEXT : public FramebufferStrategyPackedEXT +{ + virtual bool createStencil(int width, int height, GLuint &stencil) + { + // create stencil buffer + glDeleteRenderbuffers(1, &stencil); + glGenRenderbuffersEXT(1, &stencil); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, stencil); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_STENCIL_INDEX, + width, height); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, stencil); + + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + + // check status + return glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT; + } + + bool isSupported() + { + GLuint fb = 0, stencil = 0, img = 0; + GLenum status = createFBO(fb, img, 2, 2, Canvas::TYPE_NORMAL); + deleteFBO(fb, stencil, img); + return status == GL_FRAMEBUFFER_COMPLETE; + } +}; + +FramebufferStrategy *strategy = NULL; + +FramebufferStrategy strategyNone; + +FramebufferStrategyCore strategyCore; + +FramebufferStrategyCorePacked strategyCorePacked; + +FramebufferStrategyPackedEXT strategyPackedEXT; + +FramebufferStrategyEXT strategyEXT; + +Canvas *Canvas::current = NULL; + +static void getStrategy() +{ + if (!strategy) + { + if (GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object) + strategy = &strategyCorePacked; + else if (GLAD_ES_VERSION_2_0) + strategy = &strategyCore; + else if (GLAD_EXT_framebuffer_object && GLAD_EXT_packed_depth_stencil) + strategy = &strategyPackedEXT; + else if (GLAD_EXT_framebuffer_object && strategyEXT.isSupported()) + strategy = &strategyEXT; + else + strategy = &strategyNone; + } +} + +static int maxFBOColorAttachments = 0; +static int maxDrawBuffers = 0; + +Canvas::Canvas(int width, int height, TextureType texture_type) + : width(width) + , height(height) + , fbo(0) + , depth_stencil(0) + , img(0) + , texture_type(texture_type) +{ + float w = static_cast(width); + float h = static_cast(height); + + // world coordinates + vertices[0].x = 0; + vertices[0].y = h; + vertices[1].x = w; + vertices[1].y = h; + vertices[2].x = w; + vertices[2].y = 0; + vertices[3].x = 0; + vertices[3].y = 0; + + // texture coordinates + vertices[0].s = 0; + vertices[0].t = 0; + vertices[1].s = 1; + vertices[1].t = 0; + vertices[2].s = 1; + vertices[2].t = 1; + vertices[3].s = 0; + vertices[3].t = 1; + + settings.filter = Image::getDefaultFilter(); + + getStrategy(); + + loadVolatile(); +} + +Canvas::~Canvas() +{ + // reset framebuffer if still using this one + if (current == this) + stopGrab(); + + unloadVolatile(); +} + +bool Canvas::isSupported() +{ + getStrategy(); + return (strategy != &strategyNone); +} + +bool Canvas::isHDRSupported() +{ + return GLAD_VERSION_3_0 || (isSupported() && GLAD_ARB_texture_float); +} + +bool Canvas::isMultiCanvasSupported() +{ + if (!(isSupported() && (GLAD_VERSION_2_0 || GLAD_ES_VERSION_3_0 || GLAD_ARB_draw_buffers))) + return false; + + if (maxFBOColorAttachments == 0 || maxDrawBuffers == 0) + { + glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxFBOColorAttachments); + glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers); + } + + // system must support at least 4 simultanious active canvases + return maxFBOColorAttachments >= 4 && maxDrawBuffers >= 4; +} + +void Canvas::bindDefaultCanvas() +{ + if (current != NULL) + current->stopGrab(); +} + +void Canvas::setupGrab() +{ + // already grabbing + if (current == this) + return; + + // cleanup after previous fbo + if (current != NULL) + current->stopGrab(); + + // bind the framebuffer object. + glPushAttrib(GL_VIEWPORT_BIT | GL_TRANSFORM_BIT); + strategy->bindFBO(fbo); + gl.setViewport(OpenGL::Viewport(0, 0, width, height)); + + // Set up orthographic view (no depth) + gl.matrices.projection.push(Matrix::ortho(0.0, width, height, 0.0)); + + // indicate we are using this fbo + current = this; +} + +void Canvas::startGrab(const std::vector &canvases) +{ + // Whether the new canvas list is different from the old one. + // A more thorough check is done below. + bool canvaseschanged = canvases.size() != attachedCanvases.size(); + + if (canvases.size() > 0) + { + if (!isMultiCanvasSupported()) + throw love::Exception("Multi-canvas rendering is not supported on this system."); + + if (canvases.size()+1 > size_t(maxDrawBuffers) || canvases.size()+1 > size_t(maxFBOColorAttachments)) + throw love::Exception("This system can't simultaniously render to %d canvases.", canvases.size()+1); + } + + for (size_t i = 0; i < canvases.size(); i++) + { + if (canvases[i]->getWidth() != width || canvases[i]->getHeight() != height) + throw love::Exception("All canvas arguments must have the same dimensions."); + + if (canvases[i]->getTextureType() != texture_type) + throw love::Exception("All canvas arguments must have the same texture type."); + + if (!canvaseschanged && canvases[i] != attachedCanvases[i]) + canvaseschanged = true; + } + + setupGrab(); + + // Don't attach anything if there's nothing to change. + if (!canvaseschanged) + return; + + // Attach the canvas textures to the active FBO and set up MRTs. + strategy->setAttachments(canvases); + + for (size_t i = 0; i < canvases.size(); i++) + canvases[i]->retain(); + + for (size_t i = 0; i < attachedCanvases.size(); i++) + attachedCanvases[i]->release(); + + attachedCanvases = canvases; +} + +void Canvas::startGrab() +{ + setupGrab(); + + if (attachedCanvases.size() == 0) + return; + + // make sure the FBO is only using a single canvas + strategy->setAttachments(); + + // release any previously attached canvases + for (size_t i = 0; i < attachedCanvases.size(); i++) + attachedCanvases[i]->release(); + + attachedCanvases.clear(); +} + +void Canvas::stopGrab() +{ + // i am not grabbing. leave me alone + if (current != this) + return; + + // bind default + strategy->bindFBO(gl.getDefaultFBO()); + gl.matrices.projection.pop(); + glPopAttrib(); + current = NULL; +} + +void Canvas::clear(Color c) +{ + if (strategy == &strategyNone) + return; + + GLuint previous = gl.getDefaultFBO(); + + if (current != this) + { + if (current != NULL) + previous = current->fbo; + + strategy->bindFBO(fbo); + } + + GLfloat glcolor[] = {c.r/255.f, c.g/255.f, c.b/255.f, c.a/255.f}; + + // We don't need to worry about multiple FBO attachments or global clear + // color state when OpenGL 3.0+ is supported. + if (GLAD_VERSION_3_0 || GLAD_ES_VERSION_3_0) + { + glClearBufferfv(GL_COLOR, 0, glcolor); + + if (depth_stencil != 0) + { + GLint stencilvalue = 0; + glClearBufferiv(GL_STENCIL, 0, &stencilvalue); + } + } + else + { + // glClear will clear all active draw buffers, so we need to temporarily + // detach any other canvases (when MRT is being used.) + if (attachedCanvases.size() > 0) + strategy->setAttachments(); + + // Don't use the state-shadowed gl.setClearColor because we want to save + // the previous clear color. + glClearColor(glcolor[0], glcolor[1], glcolor[2], glcolor[3]); + glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + + if (attachedCanvases.size() > 0) + strategy->setAttachments(attachedCanvases); + + // Restore the global clear color. + gl.setClearColor(gl.getClearColor()); + } + + if (current != this) + strategy->bindFBO(previous); +} + +void Canvas::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const +{ + static Matrix t; + t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + + drawv(t, vertices); +} + +void Canvas::drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const +{ + static Matrix t; + t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + + const Vertex *v = quad->getVertices(); + + // flip texture coordinates vertically. + Vertex w[4]; + memcpy(w, v, sizeof(Vertex) * 4); + for (size_t i = 0; i < 4; i++) + w[i].t = 1.0f - w[i].t; + + drawv(t, w); +} + +bool Canvas::checkCreateStencil() +{ + // Do nothing if we've already created the stencil buffer. + if (depth_stencil != 0) + return true; + + if (current != this) + strategy->bindFBO(fbo); + + bool success = strategy->createStencil(width, height, depth_stencil); + + if (current && current != this) + strategy->bindFBO(current->fbo); + else if (!current) + strategy->bindFBO(gl.getDefaultFBO()); + + return success; +} + +love::image::ImageData *Canvas::getImageData(love::image::Image *image) +{ + int row = 4 * width; + int size = row * height; + GLubyte *pixels = new GLubyte[size]; + GLubyte *flipped = new GLubyte[size]; + + strategy->bindFBO(fbo); + glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + if (current) + strategy->bindFBO(current->fbo); + else + strategy->bindFBO(gl.getDefaultFBO()); + + GLubyte *src = pixels, *dst = flipped + size - row; + for (int i = 0; i < height; ++i, dst -= row, src += row) + memcpy(dst, src, row); + + love::image::ImageData *img = image->newImageData(width, height, (void *)flipped, true); + + // The new ImageData now owns the flipped data, so we don't delete it here. + delete[] pixels; + + return img; +} + +void Canvas::getPixel(unsigned char* pixel_rgba, int x, int y) +{ + if (current != this) + strategy->bindFBO(fbo); + + glReadPixels(x, height - y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel_rgba); + + if (current && current != this) + strategy->bindFBO(current->fbo); + else if (!current) + strategy->bindFBO(gl.getDefaultFBO()); +} + +const std::vector &Canvas::getAttachedCanvases() const +{ + return attachedCanvases; +} + +void Canvas::setFilter(const Image::Filter &f) +{ + settings.filter = f; + gl.bindTexture(img); + settings.filter.anisotropy = gl.setTextureFilter(f); +} + +Image::Filter Canvas::getFilter() const +{ + gl.bindTexture(img); + return gl.getTextureFilter(); +} + +void Canvas::setWrap(const Image::Wrap &w) +{ + settings.wrap = w; + gl.bindTexture(img); + gl.setTextureWrap(w); +} + +Image::Wrap Canvas::getWrap() const +{ + return settings.wrap; +} + +bool Canvas::loadVolatile() +{ + fbo = depth_stencil = img = 0; + + // glTexImage2D is guaranteed to error in this case. + if (width > gl.getMaxTextureSize() || height > gl.getMaxTextureSize()) + { + status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT; + return false; + } + + status = strategy->createFBO(fbo, img, width, height, texture_type); + if (status != GL_FRAMEBUFFER_COMPLETE) + return false; + + setFilter(settings.filter); + setWrap(settings.wrap); + clear(Color(0, 0, 0, 0)); + return true; +} + +void Canvas::unloadVolatile() +{ + strategy->deleteFBO(fbo, depth_stencil, img); + fbo = depth_stencil = img = 0; + + for (size_t i = 0; i < attachedCanvases.size(); i++) + attachedCanvases[i]->release(); + + attachedCanvases.clear(); +} + +int Canvas::getWidth() +{ + return width; +} + +int Canvas::getHeight() +{ + return height; +} + +void Canvas::drawv(const Matrix &t, const Vertex *v) const +{ + gl.matrices.transform.push(gl.matrices.transform.top()); + gl.matrices.transform.top() *= t; + + gl.prepareDraw(); + + gl.bindTexture(img); + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *) &v[0].x); + gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *) &v[0].s); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + gl.matrices.transform.pop(); +} + +bool Canvas::getConstant(const char *in, Canvas::TextureType &out) +{ + return textureTypes.find(in, out); +} + +bool Canvas::getConstant(Canvas::TextureType in, const char *&out) +{ + return textureTypes.find(in, out); +} + +StringMap::Entry Canvas::textureTypeEntries[] = +{ + {"normal", Canvas::TYPE_NORMAL}, + {"hdr", Canvas::TYPE_HDR}, +}; +StringMap Canvas::textureTypes(Canvas::textureTypeEntries, sizeof(Canvas::textureTypeEntries)); + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/Canvas.h b/jni/love/src/modules/graphics/opengl/Canvas.h new file mode 100644 index 00000000..ef5de47c --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Canvas.h @@ -0,0 +1,155 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_CANVAS_H +#define LOVE_GRAPHICS_OPENGL_CANVAS_H + +#include "graphics/DrawQable.h" +#include "graphics/Volatile.h" +#include "graphics/Image.h" +#include "graphics/Color.h" +#include "image/Image.h" +#include "image/ImageData.h" +#include "common/math.h" +#include "common/Matrix.h" +#include "OpenGL.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +class Canvas : public DrawQable, public Volatile +{ +public: + + enum TextureType + { + TYPE_NORMAL, + TYPE_HDR, + TYPE_MAX_ENUM + }; + + Canvas(int width, int height, TextureType texture_type = TYPE_NORMAL); + virtual ~Canvas(); + + /** + * @param canvases A list of other canvases to temporarily attach to this one, + * to allow drawing to multiple canvases at once. + **/ + void startGrab(const std::vector &canvases); + void startGrab(); + void stopGrab(); + + void clear(Color c); + + virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + + /** + * @copydoc DrawQable::drawq() + **/ + void drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + + /** + * Create and attach a stencil buffer to this Canvas' framebuffer, if necessary. + **/ + bool checkCreateStencil(); + + love::image::ImageData *getImageData(love::image::Image *image); + + void getPixel(unsigned char* pixel_rgba, int x, int y); + + const std::vector &getAttachedCanvases() const; + + void setFilter(const Image::Filter &f); + Image::Filter getFilter() const; + + void setWrap(const Image::Wrap &w); + Image::Wrap getWrap() const; + + int getWidth(); + int getHeight(); + + inline GLenum getStatus() const + { + return status; + } + + inline TextureType getTextureType() const + { + return texture_type; + } + + bool loadVolatile(); + void unloadVolatile(); + + static bool isSupported(); + static bool isHDRSupported(); + static bool isMultiCanvasSupported(); + + static bool getConstant(const char *in, TextureType &out); + static bool getConstant(TextureType in, const char *&out); + + static Canvas *current; + static void bindDefaultCanvas(); + + GLuint getTextureName() const + { + return img; + } + +private: + + friend class Shader; + + GLsizei width; + GLsizei height; + GLuint fbo; + GLuint depth_stencil; + GLuint img; + + TextureType texture_type; + + Vertex vertices[4]; + + GLenum status; + + struct + { + Image::Filter filter; + Image::Wrap wrap; + } settings; + + std::vector attachedCanvases; + + void setupGrab(); + void drawv(const Matrix &t, const Vertex *v) const; + + static StringMap::Entry textureTypeEntries[]; + static StringMap textureTypes; +}; + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_CANVAS_H diff --git a/jni/love/src/modules/graphics/opengl/Font.cpp b/jni/love/src/modules/graphics/opengl/Font.cpp new file mode 100644 index 00000000..fea4db90 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Font.cpp @@ -0,0 +1,593 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" +#include "Font.h" +#include "font/GlyphData.h" +#include "Image.h" + +#include "libraries/utf8/utf8.h" + +#include "common/math.h" +#include "common/Matrix.h" + +#include +#include +#include // for max + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +const int Font::TEXTURE_WIDTHS[] = {128, 256, 256, 512, 512, 1024, 1024}; +const int Font::TEXTURE_HEIGHTS[] = {128, 128, 256, 256, 512, 512, 1024}; + +Font::Font(love::font::Rasterizer *r, const Image::Filter &filter) + : rasterizer(r) + , height(r->getHeight()) + , lineHeight(1) + , mSpacing(1) + , filter(filter) +{ + this->filter.mipmap = Image::FILTER_NONE; + + // Try to find the best texture size match for the font size. default to the + // largest texture size if no rough match is found. + textureSizeIndex = NUM_TEXTURE_SIZES - 1; + for (int i = 0; i < NUM_TEXTURE_SIZES; i++) + { + // Make a rough estimate of the total used texture size, based on glyph + // height. The estimated size is likely larger than the actual total + // size, which is good because texture switching is expensive. + if ((height * 0.8) * height * 95 <= TEXTURE_WIDTHS[i] * TEXTURE_HEIGHTS[i]) + { + textureSizeIndex = i; + break; + } + } + + textureWidth = TEXTURE_WIDTHS[textureSizeIndex]; + textureHeight = TEXTURE_HEIGHTS[textureSizeIndex]; + + love::font::GlyphData *gd = 0; + + try + { + gd = r->getGlyphData(32); + type = (gd->getFormat() == love::font::GlyphData::FORMAT_LUMINANCE_ALPHA) ? FONT_TRUETYPE : FONT_IMAGE; + + loadVolatile(); + } + catch (love::Exception &) + { + delete gd; + throw; + } + + delete gd; + + rasterizer->retain(); +} + +Font::~Font() +{ + rasterizer->release(); + unloadVolatile(); +} + +bool Font::initializeTexture(GLint format) +{ + GLint internalformat = (format == GL_LUMINANCE_ALPHA) ? GL_LUMINANCE_ALPHA : GL_RGBA; + + // clear errors before initializing + while (glGetError() != GL_NO_ERROR); + + glTexImage2D(GL_TEXTURE_2D, + 0, + internalformat, + (GLsizei)textureWidth, + (GLsizei)textureHeight, + 0, + format, + GL_UNSIGNED_BYTE, + NULL); + + return glGetError() == GL_NO_ERROR; +} + +void Font::createTexture() +{ + textureX = textureY = rowHeight = TEXTURE_PADDING; + + GLuint t; + glGenTextures(1, &t); + textures.push_back(t); + + gl.bindTexture(t); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + GLint format = (type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA); + + // Initialize the texture, attempting smaller sizes if initialization fails. + bool initialized = false; + while (textureSizeIndex >= 0) + { + textureWidth = TEXTURE_WIDTHS[textureSizeIndex]; + textureHeight = TEXTURE_HEIGHTS[textureSizeIndex]; + + initialized = initializeTexture(format); + + if (initialized || textureSizeIndex <= 0) + break; + + --textureSizeIndex; + } + + if (!initialized) + { + // Clean up before throwing. + gl.deleteTexture(t); + gl.bindTexture(0); + textures.pop_back(); + + throw love::Exception("Could not create font texture!"); + } + + // Fill the texture with transparent black. + std::vector emptyData(textureWidth * textureHeight * (type == FONT_TRUETYPE ? 2 : 4), 0); + glTexSubImage2D(GL_TEXTURE_2D, + 0, + 0, 0, + (GLsizei)textureWidth, + (GLsizei)textureHeight, + format, + GL_UNSIGNED_BYTE, + &emptyData[0]); + + setFilter(filter); +} + +Font::Glyph *Font::addGlyph(uint32 glyph) +{ + love::font::GlyphData *gd = rasterizer->getGlyphData(glyph); + int w = gd->getWidth(); + int h = gd->getHeight(); + + if (textureX + w + TEXTURE_PADDING > textureWidth) + { + // out of space - new row! + textureX = TEXTURE_PADDING; + textureY += rowHeight; + rowHeight = TEXTURE_PADDING; + } + if (textureY + h + TEXTURE_PADDING > textureHeight) + { + // totally out of space - new texture! + createTexture(); + } + + Glyph *g = new Glyph; + + g->texture = 0; + g->spacing = gd->getAdvance(); + + memset(g->vertices, 0, sizeof(GlyphVertex) * 4); + + // don't waste space for empty glyphs. also fixes a division by zero bug with ati drivers + if (w > 0 && h > 0) + { + const GLuint t = textures.back(); + + gl.bindTexture(t); + glTexSubImage2D(GL_TEXTURE_2D, + 0, + textureX, + textureY, + w, h, + (type == FONT_TRUETYPE ? GL_LUMINANCE_ALPHA : GL_RGBA), + GL_UNSIGNED_BYTE, + gd->getData()); + + g->texture = t; + + const GlyphVertex verts[4] = { + { 0.0f, 0.0f, float(textureX)/float(textureWidth), float(textureY)/float(textureHeight)}, + { 0.0f, float(h), float(textureX)/float(textureWidth), float(textureY+h)/float(textureHeight)}, + {float(w), float(h), float(textureX+w)/float(textureWidth), float(textureY+h)/float(textureHeight)}, + {float(w), 0.0f, float(textureX+w)/float(textureWidth), float(textureY)/float(textureHeight)}, + }; + + // copy vertex data to the glyph and set proper bearing + for (int i = 0; i < 4; i++) + { + g->vertices[i] = verts[i]; + g->vertices[i].x += gd->getBearingX(); + g->vertices[i].y -= gd->getBearingY(); + } + } + + if (w > 0) + textureX += (w + TEXTURE_PADDING); + if (h > 0) + rowHeight = std::max(rowHeight, h + TEXTURE_PADDING); + + delete gd; + + glyphs[glyph] = g; + + return g; +} + +Font::Glyph *Font::findGlyph(uint32 glyph) +{ + auto it = glyphs.find(glyph); + + if (it != glyphs.end()) + return it->second; + else + return addGlyph(glyph); +} + +float Font::getHeight() const +{ + return static_cast(height); +} + +void Font::print(const std::string &text, float x, float y, float extra_spacing, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + // Spacing counter and newline handling. + float dx = 0.0f; + float dy = 0.0f; + + float lineheight = getBaseline(); + + // Keeps track of when we need to switch textures in our vertex array. + std::vector glyphinfolist; + + // Pre-allocate space for the maximum possible number of vertices. + std::vector glyphverts; + glyphverts.reserve(text.length() * 4); + + int vertexcount = 0; + + try + { + utf8::iterator i(text.begin(), text.begin(), text.end()); + utf8::iterator end(text.end(), text.begin(), text.end()); + + while (i != end) + { + uint32 g = *i++; + + if (g == '\n') + { + // Wrap newline, but do not print it. + dy += floorf(getHeight() * getLineHeight() + 0.5f); + dx = 0.0f; + continue; + } + + Glyph *glyph = findGlyph(g); + + if (glyph->texture != 0) + { + // Copy the vertices and set their proper relative positions. + for (int j = 0; j < 4; j++) + { + glyphverts.push_back(glyph->vertices[j]); + glyphverts.back().x += dx; + glyphverts.back().y += dy + lineheight; + } + + // Check if glyph texture has changed since the last iteration. + if (glyphinfolist.size() == 0 || glyphinfolist.back().texture != glyph->texture) + { + // keep track of each sub-section of the string whose glyphs use different textures than the previous section + GlyphArrayDrawInfo gdrawinfo; + gdrawinfo.startvertex = vertexcount; + gdrawinfo.vertexcount = 0; + gdrawinfo.texture = glyph->texture; + glyphinfolist.push_back(gdrawinfo); + } + + vertexcount += 4; + glyphinfolist.back().vertexcount += 4; + } + + // Advance the x position for the next glyph. + dx += glyph->spacing; + + // Account for extra spacing given to space characters. + if (g == ' ' && extra_spacing != 0.0f) + dx = floorf(dx + extra_spacing); + } + } + catch (utf8::exception &e) + { + throw love::Exception("Decoding error: %s", e.what()); + } + + if (vertexcount <= 0 || glyphinfolist.size() == 0) + return; + + // Sort glyph draw info list by texture first, and quad position in memory + // second (using the struct's < operator). + std::sort(glyphinfolist.begin(), glyphinfolist.end()); + + std::vector indices; + + int indicescount = 0; + for (auto it = glyphinfolist.begin(); it != glyphinfolist.end(); ++it) + { + if ((it->vertexcount / 4) * 6 > indicescount) + indicescount = (it->vertexcount / 4) * 6; + } + + indices.reserve(indicescount); + + for (int i = 0; i < indicescount / 6; i++) + { + // First triangle. + indices.push_back(i * 4 + 0); + indices.push_back(i * 4 + 1); + indices.push_back(i * 4 + 2); + + // Second triangle. + indices.push_back(i * 4 + 0); + indices.push_back(i * 4 + 2); + indices.push_back(i * 4 + 3); + } + + gl.matrices.transform.push(gl.matrices.transform.top()); + + Matrix t; + t.setTransformation(ceilf(x), ceilf(y), angle, sx, sy, ox, oy, kx, ky); + gl.matrices.transform.top() *= t; + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + gl.prepareDraw(); + + // We need to draw a new vertex array for every section of the string which + // uses a different texture than the previous section. + for (auto it = glyphinfolist.begin(); it != glyphinfolist.end(); ++it) + { + gl.bindTexture(it->texture); + + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(GlyphVertex), (GLvoid *)&glyphverts[it->startvertex].x); + gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(GlyphVertex), (GLvoid *)&glyphverts[it->startvertex].s); + + glDrawElements(GL_TRIANGLES, (it->vertexcount / 4) * 6, GL_UNSIGNED_SHORT, &indices[0]); + } + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + gl.matrices.transform.pop(); +} + +int Font::getWidth(const std::string &str) +{ + if (str.size() == 0) return 0; + + std::istringstream iss(str); + std::string line; + Glyph *g; + int max_width = 0; + + while (getline(iss, line, '\n')) + { + int width = 0; + try + { + utf8::iterator i(line.begin(), line.begin(), line.end()); + utf8::iterator end(line.end(), line.begin(), line.end()); + while (i != end) + { + uint32 c = *i++; + g = findGlyph(c); + width += static_cast(g->spacing * mSpacing); + } + } + catch(utf8::exception &e) + { + throw love::Exception("Decoding error: %s", e.what()); + } + + if (width > max_width) + max_width = width; + } + + return max_width; +} + +int Font::getWidth(char character) +{ + Glyph *g = findGlyph(character); + return g->spacing; +} + +std::vector Font::getWrap(const std::string &text, float wrap, int *max_width, std::vector *wrappedlines) +{ + using namespace std; + const float width_space = static_cast(getWidth(' ')); + vector lines_to_draw; + int maxw = 0; + + //split text at newlines + istringstream iss(text); + string line; + ostringstream string_builder; + while (getline(iss, line, '\n')) + { + // split line into words + vector words; + istringstream word_iss(line); + copy(istream_iterator(word_iss), istream_iterator(), + back_inserter< vector >(words)); + + // put words back together until a wrap occurs + float width = 0.0f; + float oldwidth = 0.0f; + string_builder.str(""); + vector::const_iterator word_iter, wend = words.end(); + for (word_iter = words.begin(); word_iter != wend; ++word_iter) + { + const string &word = *word_iter; + width += getWidth(word); + + // on wordwrap, push line to line buffer and clear string builder + if (width > wrap && oldwidth > 0) + { + int realw = (int) width; + + // remove trailing space + string tmp = string_builder.str(); + lines_to_draw.push_back(tmp.substr(0,tmp.size()-1)); + string_builder.str(""); + width = static_cast(getWidth(word)); + realw -= (int) width; + if (realw > maxw) + maxw = realw; + + // Indicate that this line was automatically wrapped. + if (wrappedlines) + wrappedlines->push_back(true); + } + string_builder << word << " "; + width += width_space; + oldwidth = width; + } + // push last line + if (width > maxw) + maxw = (int) width; + string tmp = string_builder.str(); + lines_to_draw.push_back(tmp.substr(0,tmp.size()-1)); + + // Indicate that this line was not automatically wrapped. + if (wrappedlines) + wrappedlines->push_back(false); + } + + if (max_width) + *max_width = maxw; + + return lines_to_draw; +} + +void Font::setLineHeight(float height) +{ + this->lineHeight = height; +} + +float Font::getLineHeight() const +{ + return lineHeight; +} + +void Font::setSpacing(float amount) +{ + mSpacing = amount; +} + +float Font::getSpacing() const +{ + return mSpacing; +} + +void Font::setFilter(const Image::Filter &f) +{ + filter = f; + + for (auto it = textures.begin(); it != textures.end(); ++it) + { + gl.bindTexture(*it); + filter.anisotropy = gl.setTextureFilter(f); + } +} + +const Image::Filter &Font::getFilter() +{ + return filter; +} + +bool Font::loadVolatile() +{ + createTexture(); + return true; +} + +void Font::unloadVolatile() +{ + // nuke everything from orbit + std::map::iterator it = glyphs.begin(); + Glyph *g; + while (it != glyphs.end()) + { + g = it->second; + delete g; + glyphs.erase(it++); + } + std::vector::iterator iter = textures.begin(); + while (iter != textures.end()) + { + gl.deleteTexture(*iter); + iter++; + } + textures.clear(); +} + +int Font::getAscent() const +{ + return rasterizer->getAscent(); +} + +int Font::getDescent() const +{ + return rasterizer->getDescent(); +} + +float Font::getBaseline() const +{ + // 1.25 is magic line height for true type fonts + return (type == FONT_TRUETYPE) ? floorf(getHeight() / 1.25f + 0.5f) : 0.0f; +} + +bool Font::hasGlyph(uint32 glyph) const +{ + return rasterizer->hasGlyph(glyph); +} + +bool Font::hasGlyphs(const std::string &text) const +{ + return rasterizer->hasGlyphs(text); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/Font.h b/jni/love/src/modules/graphics/opengl/Font.h new file mode 100644 index 00000000..109343af --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Font.h @@ -0,0 +1,219 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_FONT_H +#define LOVE_GRAPHICS_OPENGL_FONT_H + +// STD +#include +#include +#include + +// LOVE +#include "common/Object.h" +#include "font/Rasterizer.h" +#include "graphics/Image.h" + +#include "OpenGL.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +class Font : public Object, public Volatile +{ +public: + + Font(love::font::Rasterizer *r, const Image::Filter &filter = Image::getDefaultFilter()); + + virtual ~Font(); + + /** + * Prints the text at the designated position with rotation and scaling. + * + * @param text A string. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param extra_spacing Additional spacing added to spaces (" "). + * @param angle The amount of rotation. + * @param sx Scale along the x axis. + * @param sy Scale along the y axis. + * @param ox The origin offset along the x-axis. + * @param oy The origin offset along the y-axis. + * @param kx Shear along the x axis. + * @param ky Shear along the y axis. + **/ + void print(const std::string &text, float x, float y, float extra_spacing = 0.0f, float angle = 0.0f, float sx = 1.0f, float sy = 1.0f, float ox = 0.0f, float oy = 0.0f, float kx = 0.0f, float ky = 0.0f); + + /** + * Returns the height of the font. + **/ + float getHeight() const; + + /** + * Returns the width of the passed string. + * + * @param str A string of text. + **/ + int getWidth(const std::string &str); + + /** + * Returns the width of the passed character. + * + * @param character A character. + **/ + int getWidth(char character); + + /** + * Returns the maximal width of a wrapped string + * and optionally the number of lines + * + * @param text The input text + * @param wrap The number of pixels to wrap at + * @param max_width Optional output of the maximum width + * @param wrapped_lines Optional output indicating which lines were + * auto-wrapped. Indices correspond to indices of the returned value. + * Returns a vector with the lines. + **/ + std::vector getWrap(const std::string &text, float wrap, int *max_width = 0, std::vector *wrapped_lines = 0); + + /** + * Sets the line height (which should be a number to multiply the font size by, + * example: line height = 1.2 and size = 12 means that rendered line height = 12*1.2) + * @param height The new line height. + **/ + void setLineHeight(float height); + + /** + * Returns the line height. + **/ + float getLineHeight() const; + + /** + * Sets the spacing modifier (changes the spacing between the characters the + * same way that the line height does [multiplication]). + * Note: The spacing must be set BEFORE the font is loaded to have any effect. + * @param amount The amount of modification. + **/ + void setSpacing(float amount); + + /** + * Returns the spacing modifier. + **/ + float getSpacing() const; + + void setFilter(const Image::Filter &f); + const Image::Filter &getFilter(); + + // Implements Volatile. + bool loadVolatile(); + void unloadVolatile(); + + // Extra font metrics + int getAscent() const; + int getDescent() const; + float getBaseline() const; + + bool hasGlyph(uint32 glyph) const; + bool hasGlyphs(const std::string &text) const; + +private: + + enum FontType + { + FONT_TRUETYPE = 1, + FONT_IMAGE, + FONT_UNKNOWN + }; + + struct GlyphVertex + { + float x, y; + float s, t; + }; + + struct Glyph + { + GLuint texture; + int spacing; + GlyphVertex vertices[4]; + }; + + // used to determine when to change textures in the vertex array generated when printing text + struct GlyphArrayDrawInfo + { + GLuint texture; + int startvertex; + int vertexcount; + + // used when sorting with std::sort + // sorts by texture first (binding textures is expensive) and relative position in memory second + bool operator < (const GlyphArrayDrawInfo &other) const + { + if (texture != other.texture) + return texture < other.texture; + else + return startvertex < other.startvertex; + }; + }; + + bool initializeTexture(GLint format); + void createTexture(); + Glyph *addGlyph(uint32 glyph); + Glyph *findGlyph(uint32 glyph); + + love::font::Rasterizer *rasterizer; + + int height; + float lineHeight; + float mSpacing; // modifies the spacing by multiplying it with this value + + int textureSizeIndex; + int textureWidth; + int textureHeight; + + // vector of packed textures + std::vector textures; + + // maps glyphs to glyph texture information + std::map glyphs; + + FontType type; + Image::Filter filter; + + static const int NUM_TEXTURE_SIZES = 7; + static const int TEXTURE_WIDTHS[NUM_TEXTURE_SIZES]; + static const int TEXTURE_HEIGHTS[NUM_TEXTURE_SIZES]; + + static const int TEXTURE_PADDING = 1; + + int textureX, textureY; + int rowHeight; + +}; // Font + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_FONT_H diff --git a/jni/love/src/modules/graphics/opengl/Graphics.cpp b/jni/love/src/modules/graphics/opengl/Graphics.cpp new file mode 100644 index 00000000..0100274f --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Graphics.cpp @@ -0,0 +1,1097 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" +#include "common/math.h" +#include "common/Vector.h" + +#include "Graphics.h" +#include "window/sdl/Window.h" +#include "Polyline.h" + +#include +#include +#include +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Graphics::Graphics() + : currentFont(0) + , lineStyle(LINE_SMOOTH) + , lineWidth(1) + , matrixLimit(64) + , colorMask() + , width(0) + , height(0) + , created(false) + , savedState() +{ + currentWindow = love::window::sdl::Window::createSingleton(); + + if (currentWindow->isCreated()) + setMode(currentWindow->getWidth(), currentWindow->getHeight()); +} + +Graphics::~Graphics() +{ + if (currentFont != 0) + currentFont->release(); + + if (Shader::defaultShader) + Shader::defaultShader->release(); + + currentWindow->release(); +} + +const char *Graphics::getName() const +{ + return "love.graphics.opengl"; +} + +DisplayState Graphics::saveState() +{ + DisplayState s; + + s.color = getColor(); + s.backgroundColor = getBackgroundColor(); + + s.blendMode = getBlendMode(); + //get line style + s.lineStyle = lineStyle; + //get the point size + s.pointSize = gl.getPointSize(); + + //get point style + if (GLAD_ES_VERSION_2_0) + s.pointSize = POINT_ROUGH; + else + s.pointStyle = (glIsEnabled(GL_POINT_SMOOTH) == GL_TRUE) ? POINT_SMOOTH : POINT_ROUGH; + + //get scissor status + s.scissor = (glIsEnabled(GL_SCISSOR_TEST) == GL_TRUE); + //do we have scissor, if so, store the box + if (s.scissor) + s.scissorBox = gl.getScissor(); + + for (int i = 0; i < 4; i++) + s.colorMask[i] = colorMask[i]; + + return s; +} + +void Graphics::restoreState(const DisplayState &s) +{ + setColor(s.color); + setBackgroundColor(s.backgroundColor); + setBlendMode(s.blendMode); + setLineWidth(lineWidth); + setLineStyle(s.lineStyle); + setPointSize(s.pointSize); + setPointStyle(s.pointStyle); + if (s.scissor) + setScissor(s.scissorBox.x, s.scissorBox.y, s.scissorBox.w, s.scissorBox.h); + else + setScissor(); + setColorMask(s.colorMask[0], s.colorMask[1], s.colorMask[2], s.colorMask[3]); +} + +void Graphics::setViewportSize(int width, int height) +{ + this->width = width; + this->height = height; + + if (!isCreated()) + return; + + // Set the viewport to top-left corner + gl.setViewport(OpenGL::Viewport(0, 0, width, height)); + + // Set up orthographic view (no depth) + gl.matrices.projection.top() = Matrix::ortho(0.0, width, height, 0.0); +} + +bool Graphics::setMode(int width, int height) +{ + this->width = width; + this->height = height; + + // Okay, setup OpenGL. + if (!gl.initContext()) + { + created = false; + return false; + } + + // Minimum required OpenGL version. + if (!(GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_3)) + { + created = false; + return false; + } + + created = true; + + setViewportSize(width, height); + + // Make sure antialiasing works when set elsewhere + if (GLAD_VERSION_1_3) + glEnable(GL_MULTISAMPLE); + + // Enable blending + glEnable(GL_BLEND); + + // "Normal" blending + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // Enable all color component writes. + setColorMask(true, true, true, true); + + // Enable line/point smoothing. + setLineStyle(LINE_SMOOTH); + if (GLAD_VERSION_1_0) + { + glEnable(GL_POINT_SMOOTH); + glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); + } + + // Auto-generated mipmaps should be the best quality possible + if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4 || GLAD_SGIS_generate_mipmap) + glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); + + // Enable textures (necessary on desktop GL) + if (GLAD_VERSION_1_1) + glEnable(GL_TEXTURE_2D); + + gl.setTextureUnit(0); + + // Set pixel row alignment + glPixelStorei(GL_UNPACK_ALIGNMENT, 2); + + // Reload all volatile objects. + if (!Volatile::loadAll()) + std::cerr << "Could not reload all volatile objects." << std::endl; + + // Restore the display state. + restoreState(savedState); + pixel_size_stack.clear(); + pixel_size_stack.reserve(5); + pixel_size_stack.push_back(1); + + // We always need a default shader in OpenGL ES 2. + if (GLAD_ES_VERSION_2_0) + { + if (!Shader::defaultShader) + Shader::defaultShader = newShader(Shader::defaultCode[RENDERER_OPENGLES]); + + if (!Shader::current) + Shader::defaultShader->attach(); + } + + return true; +} + +void Graphics::unSetMode() +{ + // Window re-creation may destroy the GL context, so we must save the state. + if (isCreated()) + { + savedState = saveState(); + + // Unload all volatile objects. These must be reloaded after the display + // mode change. + Volatile::unloadAll(); + + gl.deInitContext(); + } +} + +void Graphics::reset() +{ + DisplayState s; + discardStencil(); + Canvas::bindDefaultCanvas(); + Shader::detach(); + restoreState(s); + pixel_size_stack.clear(); + pixel_size_stack.reserve(5); + pixel_size_stack.push_back(1); +} + +void Graphics::clear() +{ + glClear(GL_COLOR_BUFFER_BIT); +} + +void Graphics::present() +{ + currentWindow->swapBuffers(); +} + +int Graphics::getWidth() const +{ + return width; +} + +int Graphics::getHeight() const +{ + return height; +} + +bool Graphics::isCreated() const +{ + return created; +} + +void Graphics::setScissor(int x, int y, int width, int height) +{ + glEnable(GL_SCISSOR_TEST); + // OpenGL's reversed y-coordinate is compensated for in OpenGL::setScissor. + gl.setScissor(OpenGL::Viewport(x, y, width, height)); +} + +void Graphics::setScissor() +{ + glDisable(GL_SCISSOR_TEST); +} + +int Graphics::getScissor(lua_State *L) const +{ + if (glIsEnabled(GL_SCISSOR_TEST) == GL_FALSE) + return 0; + + OpenGL::Viewport scissor = gl.getScissor(); + + lua_pushinteger(L, scissor.x); + lua_pushinteger(L, scissor.y); + lua_pushinteger(L, scissor.w); + lua_pushinteger(L, scissor.h); + + return 4; +} + +void Graphics::defineStencil() +{ + // Make sure the active canvas has a stencil buffer. + if (Canvas::current) + Canvas::current->checkCreateStencil(); + + // Disable color writes but don't save the mask values. + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + + glClear(GL_STENCIL_BUFFER_BIT); + glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_ALWAYS, 1, 1); + glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); +} + +void Graphics::useStencil(bool invert) +{ + glStencilFunc(GL_EQUAL, (GLint)(!invert), 1); // invert ? 0 : 1 + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + setColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]); +} + +void Graphics::discardStencil() +{ + setColorMask(colorMask[0], colorMask[1], colorMask[2], colorMask[3]); + glDisable(GL_STENCIL_TEST); +} + +int Graphics::getMaxImageSize() const +{ + return gl.getMaxTextureSize(); +} + +Image *Graphics::newImage(love::image::ImageData *data) +{ + // Create the image. + Image *image = new Image(data); + bool success; + try + { + success = image->load(); + } + catch(love::Exception &) + { + image->release(); + throw; + } + if (!success) + { + image->release(); + return 0; + } + + return image; +} + +Image *Graphics::newImage(love::image::CompressedData *cdata) +{ + // Create the image. + Image *image = new Image(cdata); + bool success; + try + { + success = image->load(); + } + catch(love::Exception &) + { + image->release(); + throw; + } + if (!success) + { + image->release(); + return 0; + } + + return image; +} + +Quad *Graphics::newQuad(Quad::Viewport v, float sw, float sh) +{ + return new Quad(v, sw, sh); +} + +Font *Graphics::newFont(love::font::Rasterizer *r, const Image::Filter &filter) +{ + return new Font(r, filter); +} + +SpriteBatch *Graphics::newSpriteBatch(Image *image, int size, int usage) +{ + return new SpriteBatch(image, size, usage); +} + +ParticleSystem *Graphics::newParticleSystem(Image *image, int size) +{ + return new ParticleSystem(image, size); +} + +Canvas *Graphics::newCanvas(int width, int height, Canvas::TextureType texture_type) +{ + if (texture_type == Canvas::TYPE_HDR && !Canvas::isHDRSupported()) + throw Exception("HDR Canvases are not supported by your OpenGL implementation"); + + if (width > gl.getMaxTextureSize()) + throw Exception("Cannot create canvas: width of %d pixels is too large for this system.", width); + else if (height > gl.getMaxTextureSize()) + throw Exception("Cannot create canvas: height of %d pixels is too large for this system.", height); + + while (GL_NO_ERROR != glGetError()) + /* clear opengl error flag */; + + Canvas *canvas = new Canvas(width, height, texture_type); + GLenum err = canvas->getStatus(); + + // everything ok, return canvas (early out) + if (err == GL_FRAMEBUFFER_COMPLETE) + return canvas; + + // create error message + std::stringstream error_string; + error_string << "Cannot create canvas: "; + switch (err) + { + + case GL_FRAMEBUFFER_UNSUPPORTED: + error_string << "Not supported by your OpenGL implementation."; + break; + + // remaining error codes are highly unlikely: + case GL_FRAMEBUFFER_UNDEFINED: + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: + case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: + case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: + case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: + error_string << "Error in implementation. Possible fix: Make canvas width and height powers of two."; + break; + + default: + // my intel hda card wrongly returns 0 to glCheckFramebufferStatus() but sets + // no error flag. I think it meant to return GL_FRAMEBUFFER_UNSUPPORTED, but who + // knows. + if (glGetError() == GL_NO_ERROR) + error_string << "May not be supported by your OpenGL implementation."; + // the remaining error is an indication of a serious fuckup since it should + // only be returned if glCheckFramebufferStatus() was called with the wrong + // arguments. + else + error_string << "Cannot create canvas: Aliens did it (OpenGL error code: " << glGetError() << ")"; + } + + canvas->release(); + throw Exception(error_string.str().c_str()); + return NULL; // never reached +} + +Shader *Graphics::newShader(const Shader::ShaderSources &sources) +{ + return new Shader(sources); +} + +Mesh *Graphics::newMesh(const std::vector &vertices, Mesh::DrawMode mode) +{ + return new Mesh(vertices, mode); +} + +void Graphics::setColor(const Color &c) +{ + gl.setColor(c); +} + +Color Graphics::getColor() const +{ + return gl.getColor(); +} + +void Graphics::setBackgroundColor(const Color &c) +{ + gl.setClearColor(c); +} + +Color Graphics::getBackgroundColor() const +{ + return gl.getClearColor(); +} + +void Graphics::setFont(Font *font) +{ + Object::AutoRelease fontrelease(currentFont); + + currentFont = font; + + if (font != 0) + currentFont->retain(); +} + +Font *Graphics::getFont() const +{ + return currentFont; +} + +void Graphics::setColorMask(bool r, bool g, bool b, bool a) +{ + colorMask[0] = r; + colorMask[1] = g; + colorMask[2] = b; + colorMask[3] = a; + + glColorMask((GLboolean) r, (GLboolean) g, (GLboolean) b, (GLboolean) a); +} + +const bool *Graphics::getColorMask() const +{ + return colorMask; +} + +void Graphics::setBlendMode(Graphics::BlendMode mode) +{ + const int gl_1_4 = GLAD_VERSION_1_4; + + GLenum func = GL_FUNC_ADD; + GLenum src_rgb = GL_ONE; + GLenum src_a = GL_ONE; + GLenum dst_rgb = GL_ZERO; + GLenum dst_a = GL_ZERO; + + switch (mode) + { + case BLEND_ALPHA: + if (gl_1_4 || GLAD_ES_VERSION_2_0 || GLAD_EXT_blend_func_separate) + { + src_rgb = GL_SRC_ALPHA; + src_a = GL_ONE; + dst_rgb = dst_a = GL_ONE_MINUS_SRC_ALPHA; + } + else + { + // Fallback for OpenGL implementations without support for separate blend functions. + // This will most likely only be used for the Microsoft software renderer and + // since it's still stuck with OpenGL 1.1, the only expected difference is a + // different alpha value when reading back the default framebuffer (newScreenshot). + src_rgb = src_a = GL_SRC_ALPHA; + dst_rgb = dst_a = GL_ONE_MINUS_SRC_ALPHA; + } + break; + case BLEND_MULTIPLICATIVE: + src_rgb = src_a = GL_DST_COLOR; + dst_rgb = dst_a = GL_ZERO; + break; + case BLEND_PREMULTIPLIED: + src_rgb = src_a = GL_ONE; + dst_rgb = dst_a = GL_ONE_MINUS_SRC_ALPHA; + break; + case BLEND_SUBTRACTIVE: + func = GL_FUNC_REVERSE_SUBTRACT; + case BLEND_ADDITIVE: + src_rgb = src_a = GL_SRC_ALPHA; + dst_rgb = dst_a = GL_ONE; + break; + case BLEND_REPLACE: + default: + src_rgb = src_a = GL_ONE; + dst_rgb = dst_a = GL_ZERO; + break; + } + + if (gl_1_4 || GLAD_ES_VERSION_2_0) + glBlendEquation(func); + else if (GLAD_EXT_blend_minmax && GLAD_EXT_blend_subtract) + glBlendEquationEXT(func); + else + { + if (func == GL_FUNC_REVERSE_SUBTRACT) + throw Exception("This graphics card does not support the subtractive blend mode!"); + // GL_FUNC_ADD is the default even without access to glBlendEquation, so that'll still work. + } + + if (src_rgb == src_a && dst_rgb == dst_a) + glBlendFunc(src_rgb, dst_rgb); + else + { + if (gl_1_4 || GLAD_ES_VERSION_2_0) + glBlendFuncSeparate(src_rgb, dst_rgb, src_a, dst_a); + else if (GLAD_EXT_blend_func_separate) + glBlendFuncSeparateEXT(src_rgb, dst_rgb, src_a, dst_a); + else + throw Exception("This graphics card does not support separated rgb and alpha blend functions!"); + } +} + +Graphics::BlendMode Graphics::getBlendMode() const +{ + const int gl_1_4 = GLAD_VERSION_1_4; + + GLint src_rgb, src_a, dst_rgb, dst_a; + GLint equation = GL_FUNC_ADD; + + if (gl_1_4 || GLAD_ES_VERSION_2_0 || GLAD_EXT_blend_func_separate) + { + glGetIntegerv(GL_BLEND_SRC_RGB, &src_rgb); + glGetIntegerv(GL_BLEND_SRC_ALPHA, &src_a); + glGetIntegerv(GL_BLEND_DST_RGB, &dst_rgb); + glGetIntegerv(GL_BLEND_DST_ALPHA, &dst_a); + } + else + { + glGetIntegerv(GL_BLEND_SRC, &src_rgb); + glGetIntegerv(GL_BLEND_DST, &dst_rgb); + src_a = src_rgb; + dst_a = dst_rgb; + } + + if (GLAD_ES_VERSION_2_0) + glGetIntegerv(GL_BLEND_EQUATION_RGB, &equation); + else if (gl_1_4 || (GLAD_EXT_blend_minmax && GLAD_EXT_blend_subtract)) + glGetIntegerv(GL_BLEND_EQUATION, &equation); + + if (equation == GL_FUNC_REVERSE_SUBTRACT) // && src == GL_SRC_ALPHA && dst == GL_ONE + return BLEND_SUBTRACTIVE; + // Everything else has equation == GL_FUNC_ADD. + else if (src_rgb == src_a && dst_rgb == dst_a) + { + if (src_rgb == GL_SRC_ALPHA && dst_rgb == GL_ONE) + return BLEND_ADDITIVE; + else if (src_rgb == GL_SRC_ALPHA && dst_rgb == GL_ONE_MINUS_SRC_ALPHA) + return BLEND_ALPHA; // alpha blend mode fallback for very old OpenGL versions. + else if (src_rgb == GL_DST_COLOR && dst_rgb == GL_ZERO) + return BLEND_MULTIPLICATIVE; + else if (src_rgb == GL_ONE && dst_rgb == GL_ONE_MINUS_SRC_ALPHA) + return BLEND_PREMULTIPLIED; + else if (src_rgb == GL_ONE && dst_rgb == GL_ZERO) + return BLEND_REPLACE; + } + else if (src_rgb == GL_SRC_ALPHA && src_a == GL_ONE && + dst_rgb == GL_ONE_MINUS_SRC_ALPHA && dst_a == GL_ONE_MINUS_SRC_ALPHA) + return BLEND_ALPHA; + + throw Exception("Unknown blend mode"); +} + +void Graphics::setDefaultFilter(const Image::Filter &f) +{ + Image::setDefaultFilter(f); +} + +const Image::Filter &Graphics::getDefaultFilter() const +{ + return Image::getDefaultFilter(); +} + +void Graphics::setDefaultMipmapFilter(Image::FilterMode filter, float sharpness) +{ + Image::setDefaultMipmapFilter(filter); + Image::setDefaultMipmapSharpness(sharpness); +} + +void Graphics::getDefaultMipmapFilter(Image::FilterMode *filter, float *sharpness) const +{ + *filter = Image::getDefaultMipmapFilter(); + *sharpness = Image::getDefaultMipmapSharpness(); +} + +void Graphics::setLineWidth(float width) +{ + lineWidth = width; +} + +void Graphics::setLineStyle(Graphics::LineStyle style) +{ + lineStyle = style; +} + +void Graphics::setLineJoin(Graphics::LineJoin join) +{ + lineJoin = join; +} + +float Graphics::getLineWidth() const +{ + return lineWidth; +} + +Graphics::LineStyle Graphics::getLineStyle() const +{ + return lineStyle; +} + +Graphics::LineJoin Graphics::getLineJoin() const +{ + return lineJoin; +} + +void Graphics::setPointSize(float size) +{ + gl.setPointSize(size); +} + +void Graphics::setPointStyle(Graphics::PointStyle style) +{ + if (GLAD_ES_VERSION_2_0) + return; + + if (style == POINT_SMOOTH) + glEnable(GL_POINT_SMOOTH); + else // love::POINT_ROUGH + glDisable(GL_POINT_SMOOTH); +} + +float Graphics::getPointSize() const +{ + return gl.getPointSize(); +} + +Graphics::PointStyle Graphics::getPointStyle() const +{ + if (GLAD_ES_VERSION_2_0) + return POINT_ROUGH; + + if (glIsEnabled(GL_POINT_SMOOTH) == GL_TRUE) + return POINT_SMOOTH; + else + return POINT_ROUGH; +} + +int Graphics::getMaxPointSize() const +{ + GLint max; + glGetIntegerv(GL_POINT_SIZE_MAX, &max); + return (int)max; +} + +void Graphics::print(const std::string &str, float x, float y , float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + if (currentFont != 0) + currentFont->print(str, x, y, 0.0, angle, sx, sy, ox, oy, kx, ky); +} + +void Graphics::printf(const std::string &str, float x, float y, float wrap, AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky) +{ + if (currentFont == 0) + return; + + if (wrap < 0.0f) + throw love::Exception("Horizontal wrap limit cannot be negative."); + + using std::string; + using std::vector; + + // wrappedlines indicates which lines were automatically wrapped. It's + // guaranteed to have the same number of elements as lines_to_draw. + vector wrappedlines; + vector lines_to_draw = currentFont->getWrap(str, wrap, 0, &wrappedlines); + + gl.matrices.transform.push(gl.matrices.transform.top()); + + Matrix t; + t.setTransformation(ceilf(x), ceilf(y), angle, sx, sy, ox, oy, kx, ky); + gl.matrices.transform.top() *= t; + + x = y = 0.0f; + + try + { + // now for the actual printing + vector::const_iterator line_iter, line_end = lines_to_draw.end(); + float extra_spacing = 0.0f; + int num_spaces = 0; + int i = 0; + + for (line_iter = lines_to_draw.begin(); line_iter != line_end; ++line_iter) + { + float width = static_cast(currentFont->getWidth(*line_iter)); + switch (align) + { + case ALIGN_RIGHT: + currentFont->print(*line_iter, ceilf(x + (wrap - width)), ceilf(y), 0.0f); + break; + case ALIGN_CENTER: + currentFont->print(*line_iter, ceilf(x + (wrap - width) / 2), ceilf(y), 0.0f); + break; + case ALIGN_JUSTIFY: + num_spaces = std::count(line_iter->begin(), line_iter->end(), ' '); + if (wrappedlines[i] && num_spaces >= 1) + extra_spacing = (wrap - width) / float(num_spaces); + else + extra_spacing = 0.0f; + currentFont->print(*line_iter, ceilf(x), ceilf(y), extra_spacing); + break; + case ALIGN_LEFT: + default: + currentFont->print(*line_iter, ceilf(x), ceilf(y), 0.0f); + break; + } + y += currentFont->getHeight() * currentFont->getLineHeight(); + i++; + } + } + catch (love::Exception &) + { + gl.matrices.transform.pop(); + throw; + } + + gl.matrices.transform.pop(); +} + +/** + * Primitives + **/ + +void Graphics::point(float x, float y) +{ + gl.prepareDraw(); + + gl.bindTexture(0); + + GLfloat coord[] = {x, y}; + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, coord); + + glDrawArrays(GL_POINTS, 0, 1); + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); +} + +void Graphics::polyline(const float *coords, size_t count) +{ + if (lineJoin == LINE_JOIN_NONE) + { + NoneJoinPolyline line; + line.render(coords, count, lineWidth * .5f, float(pixel_size_stack.back()), lineStyle == LINE_SMOOTH); + line.draw(); + } + else if (lineJoin == LINE_JOIN_BEVEL) + { + BevelJoinPolyline line; + line.render(coords, count, lineWidth * .5f, float(pixel_size_stack.back()), lineStyle == LINE_SMOOTH); + line.draw(); + } + else // LINE_JOIN_MITER + { + MiterJoinPolyline line; + line.render(coords, count, lineWidth * .5f, float(pixel_size_stack.back()), lineStyle == LINE_SMOOTH); + line.draw(); + } +} + +void Graphics::rectangle(DrawMode mode, float x, float y, float w, float h) +{ + float coords[] = {x,y, x,y+h, x+w,y+h, x+w,y, x,y}; + polygon(mode, coords, 5 * 2); +} + +void Graphics::circle(DrawMode mode, float x, float y, float radius, int points) +{ + float two_pi = static_cast(LOVE_M_PI * 2); + if (points <= 0) points = 1; + float angle_shift = (two_pi / points); + float phi = .0f; + + float *coords = new float[2 * (points + 1)]; + for (int i = 0; i < points; ++i, phi += angle_shift) + { + coords[2*i] = x + radius * cosf(phi); + coords[2*i+1] = y + radius * sinf(phi); + } + + coords[2*points] = coords[0]; + coords[2*points+1] = coords[1]; + + polygon(mode, coords, (points + 1) * 2); + + delete[] coords; +} + +void Graphics::arc(DrawMode mode, float x, float y, float radius, float angle1, float angle2, int points) +{ + // Nothing to display with no points or equal angles. (Or is there with line mode?) + if (points <= 0 || angle1 == angle2) + return; + + // Oh, you want to draw a circle? + if (fabs(angle1 - angle2) >= 2.0f * (float) LOVE_M_PI) + { + circle(mode, x, y, radius, points); + return; + } + + float angle_shift = (angle2 - angle1) / points; + // Bail on precision issues. + if (angle_shift == 0.0) + return; + + float phi = angle1; + int num_coords = (points + 3) * 2; + float *coords = new float[num_coords]; + coords[0] = coords[num_coords - 2] = x; + coords[1] = coords[num_coords - 1] = y; + + for (int i = 0; i <= points; ++i, phi += angle_shift) + { + coords[2 * (i+1)] = x + radius * cosf(phi); + coords[2 * (i+1) + 1] = y + radius * sinf(phi); + } + + // GL_POLYGON can only fill-draw convex polygons, so we need to do stuff manually here + if (mode == DRAW_LINE) + { + polyline(coords, num_coords); // Artifacts at sharp angles if set to looping. + } + else + { + gl.prepareDraw(); + + gl.bindTexture(0); + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, (GLvoid *) coords); + + glDrawArrays(GL_TRIANGLE_FAN, 0, points + 2); + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + } + + delete[] coords; +} + +/// @param mode the draw mode +/// @param coords the coordinate array +/// @param count the number of coordinates/size of the array +void Graphics::polygon(DrawMode mode, const float *coords, size_t count) +{ + // coords is an array of a closed loop of vertices, i.e. + // coords[count-2] = coords[0], coords[count-1] = coords[1] + if (mode == DRAW_LINE) + { + polyline(coords, count); + } + else + { + gl.prepareDraw(); + + gl.bindTexture(0); + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, (GLvoid *) coords); + + glDrawArrays(GL_TRIANGLE_FAN, 0, count/2-1); // opengl will close the polygon for us + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + } +} + +love::image::ImageData *Graphics::newScreenshot(love::image::Image *image, bool copyAlpha) +{ + // Temporarily unbind the currently active canvas (glReadPixels reads the + // active framebuffer, not the main one.) + Canvas *curcanvas = Canvas::current; + if (curcanvas) + Canvas::bindDefaultCanvas(); + + int w = getWidth(); + int h = getHeight(); + + int row = 4*w; + + int size = row*h; + + GLubyte *pixels = 0; + GLubyte *screenshot = 0; + + try + { + pixels = new GLubyte[size]; + screenshot = new GLubyte[size]; + } + catch (std::exception &) + { + delete[] pixels; + delete[] screenshot; + if (curcanvas) + curcanvas->startGrab(curcanvas->getAttachedCanvases()); + throw love::Exception("Out of memory."); + } + + glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + if (!copyAlpha) + { + // Replace alpha values with full opacity. + for (int i = 3; i < size; i += 4) + pixels[i] = 255; + } + + // OpenGL sucks and reads pixels from the lower-left. Let's fix that. + + GLubyte *src = pixels - row, *dst = screenshot + size; + + for (int i = 0; i < h; ++i) + memcpy(dst-=row, src+=row, row); + + delete[] pixels; + + love::image::ImageData *img = 0; + try + { + // Tell the new ImageData that it owns the screenshot data, so we don't + // need to delete it here. + img = image->newImageData(w, h, (void *) screenshot, true); + } + catch (love::Exception &) + { + delete[] screenshot; + if (curcanvas) + curcanvas->startGrab(curcanvas->getAttachedCanvases()); + throw; + } + + // Re-bind the active canvas, if necessary. + if (curcanvas) + curcanvas->startGrab(curcanvas->getAttachedCanvases()); + + return img; +} + +std::string Graphics::getRendererInfo(Graphics::RendererInfo infotype) const +{ + const char *infostr = 0; + + switch (infotype) + { + case Graphics::RENDERER_INFO_NAME: + default: + if (GLAD_ES_VERSION_2_0) + infostr = "OpenGL ES"; + else + infostr = "OpenGL"; + break; + case Graphics::RENDERER_INFO_VERSION: + infostr = (const char *) glGetString(GL_VERSION); + break; + case Graphics::RENDERER_INFO_VENDOR: + infostr = (const char *) glGetString(GL_VENDOR); + break; + case Graphics::RENDERER_INFO_DEVICE: + infostr = (const char *) glGetString(GL_RENDERER); + break; + } + + if (!infostr) + throw love::Exception("Cannot retrieve renderer information."); + + return std::string(infostr); +} + +void Graphics::push() +{ + if (gl.matrices.transform.size() == matrixLimit) + throw Exception("Maximum stack depth reached. (More pushes than pops?)"); + gl.matrices.transform.push(Matrix()); + pixel_size_stack.push_back(pixel_size_stack.back()); +} + +void Graphics::pop() +{ + if (gl.matrices.transform.size() < 1) + throw Exception("Minimum stack depth reached. (More pops than pushes?)"); + gl.matrices.transform.pop(); + pixel_size_stack.pop_back(); +} + +void Graphics::rotate(float r) +{ + gl.matrices.transform.top().rotate(r); +} + +void Graphics::scale(float x, float y) +{ + gl.matrices.transform.top().scale(x, y); + pixel_size_stack.back() *= 2. / double(x + y); +} + +void Graphics::translate(float x, float y) +{ + gl.matrices.transform.top().translate(x, y); +} + +void Graphics::shear(float kx, float ky) +{ + gl.matrices.transform.top().shear(kx, ky); +} + +void Graphics::origin() +{ + gl.matrices.transform.top().setIdentity(); + pixel_size_stack.back() = 1; +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/Graphics.h b/jni/love/src/modules/graphics/opengl/Graphics.h new file mode 100644 index 00000000..af2ff1cb --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Graphics.h @@ -0,0 +1,479 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_GRAPHICS_H +#define LOVE_GRAPHICS_OPENGL_GRAPHICS_H + +// STD +#include +#include +#include + +// OpenGL +#include "OpenGL.h" + +// LOVE +#include "graphics/Graphics.h" +#include "graphics/Color.h" + +#include "image/Image.h" +#include "image/ImageData.h" + +#include "window/Window.h" + +#include "Font.h" +#include "Image.h" +#include "graphics/Quad.h" +#include "SpriteBatch.h" +#include "ParticleSystem.h" +#include "Canvas.h" +#include "Shader.h" +#include "Mesh.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +// During display mode changing, certain +// variables about the OpenGL context are +// lost. +struct DisplayState +{ + // Colors. + Color color; + Color backgroundColor; + + // Blend mode. + Graphics::BlendMode blendMode; + + // Line. + Graphics::LineStyle lineStyle; + Graphics::LineJoin lineJoin; + + // Point. + float pointSize; + Graphics::PointStyle pointStyle; + + // Scissor. + bool scissor; + OpenGL::Viewport scissorBox; + + // Color mask. + bool colorMask[4]; + + // Default values. + DisplayState() + { + color.set(255,255,255,255); + backgroundColor.set(0, 0, 0, 255); + blendMode = Graphics::BLEND_ALPHA; + lineStyle = Graphics::LINE_SMOOTH; + lineJoin = Graphics::LINE_JOIN_MITER; + pointSize = 1.0f; + pointStyle = Graphics::POINT_SMOOTH; + scissor = false; + colorMask[0] = colorMask[1] = colorMask[2] = colorMask[3] = true; + } + +}; + +class Graphics : public love::graphics::Graphics +{ +public: + + Graphics(); + virtual ~Graphics(); + + // Implements Module. + const char *getName() const; + + DisplayState saveState(); + + void restoreState(const DisplayState &s); + + virtual void setViewportSize(int width, int height); + virtual bool setMode(int width, int height); + virtual void unSetMode(); + + /** + * Resets the current color, background color, + * line style, and so forth. (This will be called + * when the game reloads. + **/ + void reset(); + + /** + * Clears the screen. + **/ + void clear(); + + /** + * Flips buffers. (Rendered geometry is presented on screen). + **/ + void present(); + + /** + * Gets the width of the current graphics viewport. + **/ + int getWidth() const; + + /** + * Gets the height of the current graphics viewport. + **/ + int getHeight() const; + + /** + * True if a graphics viewport is set. + **/ + bool isCreated() const; + + /** + * Scissor defines a box such that everything outside that box is discarded and not drawn. + * Scissoring is automatically enabled. + * @param x The x-coordinate of the top-left corner. + * @param y The y-coordinate of the top-left corner. + * @param width The width of the box. + * @param height The height of the box. + **/ + void setScissor(int x, int y, int width, int height); + + /** + * Clears any scissor that has been created. + **/ + void setScissor(); + + /** + * This native Lua function gets the current scissor box in the order of: + * x, y, width, height + **/ + int getScissor(lua_State *L) const; + + /** + * Enables the stencil buffer and set stencil function to fill it + */ + void defineStencil(); + + /** + * Set stencil function to mask the following drawing calls using + * the current stencil buffer + * @param invert Invert the mask, i.e. draw everywhere expect where + * the mask is defined. + */ + void useStencil(bool invert = false); + + /** + * Disables the stencil buffer + */ + void discardStencil(); + + /** + * Gets the maximum supported width or height of Images and Canvases on this + * system. + **/ + int getMaxImageSize() const; + + /** + * Creates an Image object with padding and/or optimization. + **/ + Image *newImage(love::image::ImageData *data); + Image *newImage(love::image::CompressedData *cdata); + + Quad *newQuad(Quad::Viewport v, float sw, float sh); + + /** + * Creates a Font object. + **/ + Font *newFont(love::font::Rasterizer *data, const Image::Filter &filter = Image::Filter()); + + SpriteBatch *newSpriteBatch(Image *image, int size, int usage); + + ParticleSystem *newParticleSystem(Image *image, int size); + + Canvas *newCanvas(int width, int height, Canvas::TextureType texture_type = Canvas::TYPE_NORMAL); + + Shader *newShader(const Shader::ShaderSources &sources); + + Mesh *newMesh(const std::vector &vertices, Mesh::DrawMode mode = Mesh::DRAW_MODE_FAN); + + /** + * Sets the foreground color. + * @param c The new foreground color. + **/ + void setColor(const Color &c); + + /** + * Gets current color. + **/ + Color getColor() const; + + /** + * Sets the background Color. + **/ + void setBackgroundColor(const Color &c); + + /** + * Gets the current background color. + **/ + Color getBackgroundColor() const; + + /** + * Sets the current font. + * @param font A Font object. + **/ + void setFont(Font *font); + /** + * Gets the current Font, or nil if none. + **/ + Font *getFont() const; + + /** + * Sets the enabled color components when rendering. + **/ + void setColorMask(bool r, bool g, bool b, bool a); + + /** + * Gets the current color mask. + * Returns an array of 4 booleans representing the mask. + **/ + const bool *getColorMask() const; + + /** + * Sets the current blend mode. + **/ + void setBlendMode(BlendMode mode); + + /** + * Gets the current blend mode. + **/ + BlendMode getBlendMode() const; + + /** + * Sets the default filter for images, canvases, and fonts. + **/ + void setDefaultFilter(const Image::Filter &f); + + /** + * Gets the default filter for images, canvases, and fonts. + **/ + const Image::Filter &getDefaultFilter() const; + + /** + * Default Image mipmap filter mode and sharpness values. + **/ + void setDefaultMipmapFilter(Image::FilterMode filter, float sharpness); + void getDefaultMipmapFilter(Image::FilterMode *filter, float *sharpness) const; + + /** + * Sets the line width. + * @param width The new width of the line. + **/ + void setLineWidth(float width); + + /** + * Sets the line style. + * @param style LINE_ROUGH or LINE_SMOOTH. + **/ + void setLineStyle(LineStyle style); + + /** + * Sets the line style. + * @param style LINE_ROUGH or LINE_SMOOTH. + **/ + void setLineJoin(LineJoin style); + + /** + * Gets the line width. + **/ + float getLineWidth() const; + + /** + * Gets the line style. + **/ + LineStyle getLineStyle() const; + + /** + * Gets the line style. + **/ + LineJoin getLineJoin() const; + + /** + * Sets the size of points. + **/ + void setPointSize(float size); + + /** + * Sets the style of points. + * @param style POINT_SMOOTH or POINT_ROUGH. + **/ + void setPointStyle(PointStyle style); + + /** + * Gets the point size. + **/ + float getPointSize() const; + + /** + * Gets the point style. + **/ + PointStyle getPointStyle() const; + + /** + * Gets the maximum point size supported. + * This may vary from computer to computer. + **/ + int getMaxPointSize() const; + + /** + * Draws text at the specified coordinates, with rotation and + * scaling along both axes. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param angle The amount of rotation. + * @param sx The scale factor along the x-axis. (1 = normal). + * @param sy The scale factor along the y-axis. (1 = normal). + * @param ox The origin offset along the x-axis. + * @param oy The origin offset along the y-axis. + * @param kx Shear along the x-axis. + * @param ky Shear along the y-axis. + **/ + void print(const std::string &str, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky); + + /** + * Draw formatted text on screen at the specified coordinates. + * + * @param str A string of text. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @param wrap The maximum width of the text area. + * @param align Where to align the text. + * @param angle The amount of rotation. + * @param sx The scale factor along the x-axis. (1 = normal). + * @param sy The scale factor along the y-axis. (1 = normal). + * @param ox The origin offset along the x-axis. + * @param oy The origin offset along the y-axis. + * @param kx Shear along the x-axis. + * @param ky Shear along the y-axis. + **/ + void printf(const std::string &str, float x, float y, float wrap, AlignMode align, float angle, float sx, float sy, float ox, float oy, float kx, float ky); + + /** + * Draws a point at (x,y). + * @param x Point along x-axis. + * @param y Point along y-axis. + **/ + void point(float x, float y); + + /** + * Draws a series of lines connecting the given vertices. + * @param coords Vertex components (x1, y1, ..., xn, yn). If x1,y1 == xn,yn the line will be drawn closed. + * @param count Number of items in the array, i.e. count = 2 * n + **/ + void polyline(const float *coords, size_t count); + + /** + * Draws a rectangle. + * @param x Position along x-axis for top-left corner. + * @param y Position along y-axis for top-left corner. + * @param w The width of the rectangle. + * @param h The height of the rectangle. + **/ + void rectangle(DrawMode mode, float x, float y, float w, float h); + + /** + * Draws a circle using the specified arguments. + * @param mode The mode of drawing (line/filled). + * @param x X-coordinate. + * @param y Y-coordinate. + * @param radius Radius of the circle. + * @param points Number of points to use to draw the circle. + **/ + void circle(DrawMode mode, float x, float y, float radius, int points = 10); + + /** + * Draws an arc using the specified arguments. + * @param mode The mode of drawing (line/filled). + * @param x X-coordinate. + * @param y Y-coordinate. + * @param radius Radius of the arc. + * @param angle1 The angle at which the arc begins. + * @param angle2 The angle at which the arc terminates. + * @param points Number of points to use to draw the arc. + **/ + void arc(DrawMode mode, float x, float y, float radius, float angle1, float angle2, int points = 10); + + /** + * Draws a polygon with an arbitrary number of vertices. + * @param mode The type of drawing (line/filled). + * @param coords Vertex components (x1, y1, x2, y2, etc.) + * @param count Coord array size + **/ + void polygon(DrawMode mode, const float *coords, size_t count); + + /** + * Creates a screenshot of the view and saves it to the default folder. + * @param image The love.image module. + * @param copyAlpha If the alpha channel should be copied or set to full opacity (255). + **/ + love::image::ImageData *newScreenshot(love::image::Image *image, bool copyAlpha = true); + + /** + * Returns a string containing system-dependent renderer information. + * Returned string can vary greatly between systems! Do not rely on it for + * anything! + * @param infotype The type of information to return. + **/ + std::string getRendererInfo(Graphics::RendererInfo infotype) const; + + void push(); + void pop(); + void rotate(float r); + void scale(float x, float y = 1.0f); + void translate(float x, float y); + void shear(float kx, float ky); + void origin(); + +private: + + Font *currentFont; + love::window::Window *currentWindow; + + std::vector pixel_size_stack; // stores current size of a pixel (needed for line drawing) + LineStyle lineStyle; + LineJoin lineJoin; + float lineWidth; + size_t matrixLimit; + bool colorMask[4]; + + int width; + int height; + bool created; + + DisplayState savedState; + +}; // Graphics + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_GRAPHICS_H diff --git a/jni/love/src/modules/graphics/opengl/Image.cpp b/jni/love/src/modules/graphics/opengl/Image.cpp new file mode 100644 index 00000000..f0f16bc9 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Image.cpp @@ -0,0 +1,648 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Image.h" + +// STD +#include // For memcpy +#include // for min/max + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +float Image::maxMipmapSharpness = 0.0f; + +Image::FilterMode Image::defaultMipmapFilter = Image::FILTER_NONE; +float Image::defaultMipmapSharpness = 0.0f; + +Image::Image(love::image::ImageData *data) + : data(data) + , cdata(0) + , width(data->getWidth()) + , height(data->getHeight()) + , paddedWidth(width) + , paddedHeight(height) + , texture(0) + , mipmapSharpness(defaultMipmapSharpness) + , mipmapsCreated(false) + , compressed(false) + , usingDefaultTexture(false) +{ + data->retain(); + preload(); +} + +Image::Image(love::image::CompressedData *cdata) + : data(0) + , cdata(cdata) + , width(cdata->getWidth(0)) + , height(cdata->getHeight(0)) + , paddedWidth(width) + , paddedHeight(height) + , texture(0) + , mipmapSharpness(defaultMipmapSharpness) + , mipmapsCreated(false) + , compressed(true) + , usingDefaultTexture(false) +{ + cdata->retain(); + preload(); +} + +Image::~Image() +{ + if (data != 0) + data->release(); + if (cdata != 0) + cdata->release(); + unload(); +} + +int Image::getWidth() const +{ + return width; +} + +int Image::getHeight() const +{ + return height; +} + +const Vertex *Image::getVertices() const +{ + return vertices; +} + +love::image::ImageData *Image::getImageData() const +{ + return data; +} + +love::image::CompressedData *Image::getCompressedData() const +{ + return cdata; +} + +void Image::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const +{ + Matrix t; + t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + + drawv(t, vertices); +} + +void Image::drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const +{ + Matrix t; + t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + + drawv(t, quad->getVertices()); +} + +void Image::predraw() const +{ + bind(); + + if (width != paddedWidth || height != paddedHeight) + { + // NPOT image padded to POT size, so the texcoords should be scaled. + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glScalef(float(width) / float(paddedWidth), float(height) / float(paddedHeight), 0.0f); + glMatrixMode(GL_MODELVIEW); + } +} + +void Image::postdraw() const +{ + if (width != paddedWidth || height != paddedHeight) + { + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + } +} + +void Image::uploadCompressedMipmaps() +{ + if (!isCompressed() || !cdata || !hasCompressedTextureSupport(cdata->getFormat())) + return; + + bind(); + + int count = cdata->getMipmapCount(); + + // We have to inform OpenGL if the image doesn't have all mipmap levels. + if (GLAD_VERSION_1_2 || GLAD_ES_VERSION_3_0 || GLAD_APPLE_texture_max_level) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, count - 1); + } + else if (cdata->getWidth(count-1) > 1 || cdata->getHeight(count-1) > 1) + { + // Telling OpenGL to ignore certain levels isn't always supported. + throw love::Exception("Cannot load mipmaps: " + "compressed image does not have all required levels."); + } + + for (int i = 1; i < count; i++) + { + glCompressedTexImage2D(GL_TEXTURE_2D, + i, + getCompressedFormat(cdata->getFormat()), + cdata->getWidth(i), + cdata->getHeight(i), + 0, + GLsizei(cdata->getSize(i)), + cdata->getData(i)); + } +} + +void Image::createMipmaps() +{ + // Only valid for Images created with ImageData. + if (!data || isCompressed()) + return; + + if (!hasMipmapSupport()) + throw love::Exception("Mipmap filtering is not supported on this system."); + + // Some old drivers claim support for NPOT textures, but fail when creating + // mipmaps. We can't detect which systems will do this, so we fail gracefully + // for all NPOT images. + int w = int(width), h = int(height); + if (w != next_p2(w) || h != next_p2(h)) + { + throw love::Exception("Cannot create mipmaps: " + "image does not have power of two dimensions."); + } + + bind(); + + // Prevent other threads from changing the ImageData while we upload it. + love::thread::Lock lock(data->getMutex()); + + if (hasNpot() && (GLAD_ES_VERSION_2_0 || GLAD_VERSION_3_0 || GLAD_ARB_framebuffer_object)) + { + if (gl.getVendor() == OpenGL::VENDOR_ATI_AMD) + { + // AMD/ATI drivers have several bugs when generating mipmaps, + // re-uploading the entire base image seems to be required. + uploadTexture(); + + // More bugs: http://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation + glEnable(GL_TEXTURE_2D); + } + + glGenerateMipmap(GL_TEXTURE_2D); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); + glTexSubImage2D(GL_TEXTURE_2D, + 0, + 0, + 0, + (GLsizei)width, + (GLsizei)height, + GL_RGBA, + GL_UNSIGNED_BYTE, + data->getData()); + } +} + +void Image::checkMipmapsCreated() +{ + if (mipmapsCreated || filter.mipmap == FILTER_NONE || usingDefaultTexture) + return; + + if (isCompressed() && cdata && hasCompressedTextureSupport(cdata->getFormat())) + uploadCompressedMipmaps(); + else if (data) + createMipmaps(); + else + return; + + mipmapsCreated = true; +} + +void Image::setFilter(const Image::Filter &f) +{ + filter = f; + + // We don't want filtering or (attempted) mipmaps on the default texture. + if (usingDefaultTexture) + { + filter.mipmap = FILTER_NONE; + filter.min = filter.mag = FILTER_NEAREST; + } + + bind(); + filter.anisotropy = gl.setTextureFilter(filter); + checkMipmapsCreated(); +} + +const Image::Filter &Image::getFilter() const +{ + return filter; +} + +void Image::setWrap(const Image::Wrap &w) +{ + wrap = w; + + bind(); + gl.setTextureWrap(w); +} + +const Image::Wrap &Image::getWrap() const +{ + return wrap; +} + +void Image::setMipmapSharpness(float sharpness) +{ + if (hasMipmapSharpnessSupport()) + { + // LOD bias has the range (-maxbias, maxbias) + mipmapSharpness = std::min(std::max(sharpness, -maxMipmapSharpness + 0.01f), maxMipmapSharpness - 0.01f); + + bind(); + + // negative bias is sharper + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -mipmapSharpness); + } + else + mipmapSharpness = 0.0f; +} + +float Image::getMipmapSharpness() const +{ + return mipmapSharpness; +} + +void Image::bind() const +{ + if (texture == 0) + return; + + gl.bindTexture(texture); +} + +void Image::preload() +{ + memset(vertices, 255, sizeof(Vertex)*4); + + vertices[0].x = 0; + vertices[0].y = 0; + vertices[1].x = 0; + vertices[1].y = (float) height; + vertices[2].x = (float) width; + vertices[2].y = (float) height; + vertices[3].x = (float) width; + vertices[3].y = 0; + + vertices[0].s = 0; + vertices[0].t = 0; + vertices[1].s = 0; + vertices[1].t = 1; + vertices[2].s = 1; + vertices[2].t = 1; + vertices[3].s = 1; + vertices[3].t = 0; + + filter = getDefaultFilter(); + filter.mipmap = defaultMipmapFilter; +} + +bool Image::load() +{ + return loadVolatile(); +} + +void Image::unload() +{ + return unloadVolatile(); +} + +bool Image::loadVolatile() +{ + if (isCompressed() && cdata && !hasCompressedTextureSupport(cdata->getFormat())) + { + const char *str; + if (image::CompressedData::getConstant(cdata->getFormat(), str)) + { + throw love::Exception("Cannot create image: " + "%s compressed images are not supported on this system.", str); + } + else + throw love::Exception("cannot create image: format is not supported on this system."); + } + + if (hasMipmapSharpnessSupport() && maxMipmapSharpness == 0.0f) + glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS, &maxMipmapSharpness); + + glGenTextures(1, &texture); + gl.bindTexture(texture); + + filter.anisotropy = gl.setTextureFilter(filter); + gl.setTextureWrap(wrap); + setMipmapSharpness(mipmapSharpness); + + paddedWidth = width; + paddedHeight = height; + + if (!hasNpot()) + { + // NPOT textures will be padded to POT dimensions if necessary. + paddedWidth = next_p2(width); + paddedHeight = next_p2(height); + } + + // Use a default texture if the size is too big for the system. + if (paddedWidth > gl.getMaxTextureSize() || paddedHeight > gl.getMaxTextureSize()) + { + uploadDefaultTexture(); + return true; + } + + // Mutex lock will potentially cover texture loading and mipmap creation. + love::thread::EmptyLock lock; + if (data) + lock.setLock(data->getMutex()); + + while (glGetError() != GL_NO_ERROR); // Clear errors. + + if (hasNpot() || (width == paddedWidth && height == paddedHeight)) + uploadTexture(); + else + uploadTexturePadded(); + + GLenum glerr = glGetError(); + if (glerr != GL_NO_ERROR) + throw love::Exception("Cannot create image (error code 0x%x)", glerr); + + usingDefaultTexture = false; + mipmapsCreated = false; + checkMipmapsCreated(); + + return true; +} + +void Image::uploadTexturePadded() +{ + if (isCompressed() && cdata) + { + // Padded textures don't really work if they're compressed... + throw love::Exception("Cannot create image: " + "compressed NPOT images are not supported on this system."); + } + else if (data) + { + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + (GLsizei)paddedWidth, + (GLsizei)paddedHeight, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0); + + glTexSubImage2D(GL_TEXTURE_2D, + 0, + 0, 0, + (GLsizei)width, + (GLsizei)height, + GL_RGBA, + GL_UNSIGNED_BYTE, + data->getData()); + } +} + +void Image::uploadTexture() +{ + if (isCompressed() && cdata) + { + GLenum format = getCompressedFormat(cdata->getFormat()); + glCompressedTexImage2D(GL_TEXTURE_2D, + 0, + format, + cdata->getWidth(0), + cdata->getHeight(0), + 0, + GLsizei(cdata->getSize(0)), + cdata->getData(0)); + } + else if (data) + { + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + (GLsizei)width, + (GLsizei)height, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + data->getData()); + } +} + +void Image::unloadVolatile() +{ + // Delete the hardware texture. + if (texture != 0) + { + gl.deleteTexture(texture); + texture = 0; + } +} + +bool Image::refresh() +{ + // No effect if the texture hasn't been created yet. + if (texture == 0) + return false; + + if (usingDefaultTexture) + { + uploadDefaultTexture(); + return true; + } + + // We want this lock to potentially cover mipmap creation as well. + love::thread::EmptyLock lock; + + bind(); + + if (data && !isCompressed()) + lock.setLock(data->getMutex()); + + while (glGetError() != GL_NO_ERROR); // Clear errors. + + if (hasNpot() || (width == paddedWidth && height == paddedHeight)) + uploadTexture(); + else + uploadTexturePadded(); + + if (glGetError() != GL_NO_ERROR) + uploadDefaultTexture(); + else + usingDefaultTexture = false; + + mipmapsCreated = false; + checkMipmapsCreated(); + + return true; +} + +void Image::uploadDefaultTexture() +{ + usingDefaultTexture = true; + + bind(); + setFilter(filter); + + // A nice friendly checkerboard to signify invalid textures... + GLubyte px[] = {0xFF,0xFF,0xFF,0xFF, 0xC0,0xC0,0xC0,0xFF, + 0xC0,0xC0,0xC0,0xFF, 0xFF,0xFF,0xFF,0xFF}; + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, px); +} + +void Image::drawv(const Matrix &t, const Vertex *v) const +{ + predraw(); + + gl.matrices.transform.push(gl.matrices.transform.top()); + gl.matrices.transform.top() *= t; + + gl.prepareDraw(); + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *)&v[0].x); + gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), (GLvoid *)&v[0].s); + + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + gl.matrices.transform.pop(); + + postdraw(); +} + +void Image::setDefaultMipmapSharpness(float sharpness) +{ + defaultMipmapSharpness = sharpness; +} + +float Image::getDefaultMipmapSharpness() +{ + return defaultMipmapSharpness; +} + +void Image::setDefaultMipmapFilter(Image::FilterMode f) +{ + defaultMipmapFilter = f; +} + +Image::FilterMode Image::getDefaultMipmapFilter() +{ + return defaultMipmapFilter; +} + +bool Image::isCompressed() const +{ + return compressed; +} + +GLenum Image::getCompressedFormat(image::CompressedData::Format format) const +{ + switch (format) + { + case image::CompressedData::FORMAT_DXT1: + return GL_COMPRESSED_RGB_S3TC_DXT1_EXT; + case image::CompressedData::FORMAT_DXT3: + return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; + case image::CompressedData::FORMAT_DXT5: + return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + case image::CompressedData::FORMAT_BC4: + return GL_COMPRESSED_RED_RGTC1; + case image::CompressedData::FORMAT_BC4s: + return GL_COMPRESSED_SIGNED_RED_RGTC1; + case image::CompressedData::FORMAT_BC5: + return GL_COMPRESSED_RG_RGTC2; + case image::CompressedData::FORMAT_BC5s: + return GL_COMPRESSED_SIGNED_RG_RGTC2; + default: + return GL_RGBA; + } +} + +bool Image::hasNpot() +{ + return GLAD_ES_VERSION_2_0 || GLAD_VERSION_2_0 || GLAD_ARB_texture_non_power_of_two; +} + +bool Image::hasAnisotropicFilteringSupport() +{ + return GLAD_EXT_texture_filter_anisotropic; +} + +bool Image::hasMipmapSupport() +{ + return GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4 || GLAD_SGIS_generate_mipmap; +} + +bool Image::hasMipmapSharpnessSupport() +{ + return GLAD_VERSION_1_4; +} + +bool Image::hasCompressedTextureSupport(image::CompressedData::Format format) +{ + switch (format) + { + case image::CompressedData::FORMAT_DXT1: + case image::CompressedData::FORMAT_DXT3: + case image::CompressedData::FORMAT_DXT5: + return GLAD_EXT_texture_compression_s3tc; + case image::CompressedData::FORMAT_BC4: + case image::CompressedData::FORMAT_BC4s: + case image::CompressedData::FORMAT_BC5: + case image::CompressedData::FORMAT_BC5s: + return (GLAD_VERSION_3_0 || GLAD_ARB_texture_compression_rgtc || GLAD_EXT_texture_compression_rgtc); + default: + break; + } + + return false; +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/Image.h b/jni/love/src/modules/graphics/opengl/Image.h new file mode 100644 index 00000000..96340052 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Image.h @@ -0,0 +1,220 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_IMAGE_H +#define LOVE_GRAPHICS_OPENGL_IMAGE_H + +// LOVE +#include "common/config.h" +#include "common/Matrix.h" +#include "common/Vector.h" +#include "common/math.h" +#include "image/ImageData.h" +#include "image/CompressedData.h" +#include "graphics/Image.h" + +// OpenGL +#include "OpenGL.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +/** + * A drawable image based on OpenGL-textures. This class takes ImageData + * objects and create textures on the GPU for fast drawing. + * + * @author Anders Ruud + **/ +class Image : public love::graphics::Image +{ +public: + + /** + * Creates a new Image. Not that anything is ready to use + * before load is called. + * + * @param data The data from which to load the image. + **/ + Image(love::image::ImageData *data); + + /** + * Creates a new Image with compressed image data. + * + * @param cdata The compressed data from which to load the image. + **/ + Image(love::image::CompressedData *cdata); + + /** + * Destructor. Deletes the hardware texture and other resources. + **/ + virtual ~Image(); + + int getWidth() const; + int getHeight() const; + + const Vertex *getVertices() const; + + love::image::ImageData *getImageData() const; + love::image::CompressedData *getCompressedData() const; + + /** + * @copydoc Drawable::draw() + **/ + void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + + /** + * @copydoc DrawQable::drawq() + **/ + void drawq(Quad *quad, float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + + /** + * Call before using this Image's texture to draw. Binds the texture, + * globally scales texture coordinates if the Image has NPOT dimensions and + * NPOT isn't supported, etc. + **/ + void predraw() const; + void postdraw() const; + + /** + * Sets the filter mode. + * @param f The filter mode. + **/ + void setFilter(const Image::Filter &f); + + const Image::Filter &getFilter() const; + + void setWrap(const Image::Wrap &w); + + const Image::Wrap &getWrap() const; + + void setMipmapSharpness(float sharpness); + float getMipmapSharpness() const; + + /** + * Whether this Image is using a compressed texture (via CompressedData). + **/ + bool isCompressed() const; + + void bind() const; + + bool load(); + void unload(); + + // Implements Volatile. + bool loadVolatile(); + void unloadVolatile(); + + /** + * Re-uploads the ImageData or CompressedData associated with this Image to + * the GPU, allowing situations where lovers modify an ImageData after image + * creation from the ImageData, and apply the changes with Image:refresh(). + **/ + bool refresh(); + + static void setDefaultMipmapSharpness(float sharpness); + static float getDefaultMipmapSharpness(); + static void setDefaultMipmapFilter(FilterMode f); + static FilterMode getDefaultMipmapFilter(); + + static bool hasNpot(); + static bool hasAnisotropicFilteringSupport(); + static bool hasMipmapSupport(); + static bool hasMipmapSharpnessSupport(); + + static bool hasCompressedTextureSupport(image::CompressedData::Format format); + +private: + + void uploadDefaultTexture(); + + void drawv(const Matrix &t, const Vertex *v) const; + + friend class Shader; + GLuint getTextureName() const + { + return texture; + } + + // The ImageData from which the texture is created. May be null if + // Compressed image data was used to create the texture. + love::image::ImageData *data; + + // Or the Compressed Image Data from which the texture is created. May be + // null if raw ImageData was used to create the texture. + love::image::CompressedData *cdata; + + // Width and height of the hardware texture. + int width, height; + + // Real dimensions of the texture, if it was auto-padded to POT size. + int paddedWidth, paddedHeight; + + // OpenGL texture identifier. + GLuint texture; + + // The source vertices of the image. + Vertex vertices[4]; + + // Mipmap texture LOD bias (sharpness) value. + float mipmapSharpness; + + // True if mipmaps have been created for this Image. + bool mipmapsCreated; + + // Whether this Image is using a compressed texture. + bool compressed; + + // True if the image wasn't able to be properly created and it had to fall + // back to a default texture. + bool usingDefaultTexture; + + // The image's filter mode + Image::Filter filter; + + // The image's wrap mode + Image::Wrap wrap; + + void preload(); + + void uploadTexturePadded(); + void uploadTexture(); + + void uploadCompressedMipmaps(); + void createMipmaps(); + void checkMipmapsCreated(); + + static float maxMipmapSharpness; + + static FilterMode defaultMipmapFilter; + static float defaultMipmapSharpness; + + GLenum getCompressedFormat(image::CompressedData::Format format) const; + +}; // Image + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_IMAGE_H diff --git a/jni/love/src/modules/graphics/opengl/Mesh.cpp b/jni/love/src/modules/graphics/opengl/Mesh.cpp new file mode 100644 index 00000000..620081b2 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Mesh.cpp @@ -0,0 +1,330 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Mesh.h" +#include "common/Matrix.h" +#include "common/Exception.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Mesh::Mesh(const std::vector &verts, Mesh::DrawMode mode) + : vbo(nullptr) + , vertex_count(0) + , ibo(nullptr) + , element_count(0) + , draw_mode(mode) + , image(nullptr) + , colors_enabled(false) +{ + setVertices(verts); +} + +Mesh::~Mesh() +{ + delete vbo; + delete ibo; +} + +void Mesh::setVertices(const std::vector &verts) +{ + if (verts.size() < 3) + throw love::Exception("At least 3 vertices are required."); + + size_t size = sizeof(Vertex) * verts.size(); + + if (vbo && size > vbo->getSize()) + { + delete vbo; + vbo = nullptr; + } + + if (!vbo) + { + // Full memory backing because we might access the data at any time. + vbo = VertexBuffer::Create(size, GL_ARRAY_BUFFER, GL_DYNAMIC_DRAW, VertexBuffer::BACKING_FULL); + } + + vertex_count = verts.size(); + + VertexBuffer::Bind vbo_bind(*vbo); + VertexBuffer::Mapper vbo_mapper(*vbo); + + // Fill the buffer with the vertices. + memcpy(vbo_mapper.get(), &verts[0], size); +} + +const Vertex *Mesh::getVertices() const +{ + if (vbo) + { + VertexBuffer::Bind vbo_bind(*vbo); + return (Vertex *) vbo->map(); + } + + return nullptr; +} + +void Mesh::setVertex(size_t index, const Vertex &v) +{ + if (index >= vertex_count) + throw love::Exception("Invalid vertex index: %ld", index + 1); + + VertexBuffer::Bind vbo_bind(*vbo); + + // We unmap the vertex buffer in Mesh::draw. This lets us coalesce the + // buffer transfer calls into just one. + Vertex *vertices = (Vertex *) vbo->map(); + vertices[index] = v; +} + +Vertex Mesh::getVertex(size_t index) const +{ + if (index >= vertex_count) + throw love::Exception("Invalid vertex index: %ld", index + 1); + + VertexBuffer::Bind vbo_bind(*vbo); + + // We unmap the vertex buffer in Mesh::draw. + Vertex *vertices = (Vertex *) vbo->map(); + return vertices[index]; +} + +size_t Mesh::getVertexCount() const +{ + return vertex_count; +} + +void Mesh::setVertexMap(const std::vector &map) +{ + for (size_t i = 0; i < map.size(); i++) + { + if (map[i] >= vertex_count) + throw love::Exception("Invalid vertex map value: %d", map[i] + 1); + } + + size_t size = sizeof(uint32) * map.size(); + + if (ibo && size > ibo->getSize()) + { + delete ibo; + ibo = nullptr; + } + + if (!ibo && size > 0) + { + // Full memory backing because we might access the data at any time. + ibo = VertexBuffer::Create(size, GL_ELEMENT_ARRAY_BUFFER, GL_DYNAMIC_DRAW, VertexBuffer::BACKING_FULL); + } + + element_count = map.size(); + + if (ibo && element_count > 0) + { + VertexBuffer::Bind ibo_bind(*ibo); + VertexBuffer::Mapper ibo_map(*ibo); + + // Fill the buffer. + memcpy(ibo_map.get(), &map[0], size); + } +} + +const uint32 *Mesh::getVertexMap() const +{ + if (ibo && element_count > 0) + { + VertexBuffer::Bind ibo_bind(*ibo); + + // We unmap the buffer in Mesh::draw and Mesh::setVertexMap. + return (uint32 *) ibo->map(); + } + + return 0; +} + +size_t Mesh::getVertexMapCount() const +{ + return element_count; +} + +void Mesh::setImage(Image *img) +{ + img->retain(); + + if (image) + image->release(); + + image = img; +} + +void Mesh::setImage() +{ + if (image) + image->release(); + + image = nullptr; +} + +Image *Mesh::getImage() const +{ + return image; +} + +void Mesh::setDrawMode(Mesh::DrawMode mode) +{ + draw_mode = mode; +} + +Mesh::DrawMode Mesh::getDrawMode() const +{ + return draw_mode; +} + +void Mesh::setVertexColors(bool enable) +{ + colors_enabled = enable; +} + +bool Mesh::hasVertexColors() const +{ + return colors_enabled; +} + +void Mesh::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const +{ + const size_t pos_offset = offsetof(Vertex, x); + const size_t tex_offset = offsetof(Vertex, s); + const size_t color_offset = offsetof(Vertex, r); + + if (vertex_count == 0) + return; + + if (image) + image->predraw(); + else + gl.bindTexture(0); + + Matrix m; + m.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + + gl.matrices.transform.push(gl.matrices.transform.top()); + gl.matrices.transform.top() *= m; + + VertexBuffer::Bind vbo_bind(*vbo); + + // Make sure the VBO isn't mapped when we draw (sends data to GPU if needed.) + vbo->unmap(); + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), vbo->getPointer(pos_offset)); + gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), vbo->getPointer(tex_offset)); + + if (hasVertexColors()) + { + // Per-vertex colors. + gl.enableVertexAttribArray(OpenGL::ATTRIB_COLOR); + gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, sizeof(Vertex), vbo->getPointer(color_offset)); + } + + gl.prepareDraw(); + + GLenum mode = getGLDrawMode(draw_mode); + + if (ibo && element_count > 0) + { + VertexBuffer::Bind ibo_bind(*ibo); + + // Make sure the index buffer isn't mapped (sends data to GPU if needed.) + ibo->unmap(); + + // Use the custom vertex map to draw the vertices. + glDrawElements(mode, element_count, GL_UNSIGNED_INT, ibo->getPointer(0)); + } + else + { + // Normal non-indexed drawing (no custom vertex map.) + glDrawArrays(mode, 0, vertex_count); + } + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + if (hasVertexColors()) + { + gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR); + // Using the color array leaves the GL constant color undefined. + gl.setColor(gl.getColor()); + } + + gl.matrices.transform.pop(); + + if (image) + image->postdraw(); +} + +GLenum Mesh::getGLDrawMode(Mesh::DrawMode mode) const +{ + switch (mode) + { + case DRAW_MODE_FAN: + return GL_TRIANGLE_FAN; + case DRAW_MODE_STRIP: + return GL_TRIANGLE_STRIP; + case DRAW_MODE_TRIANGLES: + return GL_TRIANGLES; + case DRAW_MODE_POINTS: + return GL_POINTS; + default: + break; + } + + return GL_TRIANGLES; +} + +bool Mesh::getConstant(const char *in, Mesh::DrawMode &out) +{ + return drawModes.find(in, out); +} + +bool Mesh::getConstant(Mesh::DrawMode in, const char *&out) +{ + return drawModes.find(in, out); +} + +StringMap::Entry Mesh::drawModeEntries[] = +{ + {"fan", Mesh::DRAW_MODE_FAN}, + {"strip", Mesh::DRAW_MODE_STRIP}, + {"triangles", Mesh::DRAW_MODE_TRIANGLES}, + {"points", Mesh::DRAW_MODE_POINTS}, +}; + +StringMap Mesh::drawModes(Mesh::drawModeEntries, sizeof(Mesh::drawModeEntries)); + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/Mesh.h b/jni/love/src/modules/graphics/opengl/Mesh.h new file mode 100644 index 00000000..45d21ce5 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Mesh.h @@ -0,0 +1,175 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_MESH_H +#define LOVE_GRAPHICS_OPENGL_MESH_H + +// LOVE +#include "common/int.h" +#include "common/math.h" +#include "common/StringMap.h" +#include "graphics/Drawable.h" +#include "Image.h" +#include "VertexBuffer.h" + +// C++ +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +/** + * Holds and draws arbitrary vertex geometry. + * Each vertex in the Mesh has a position, texture coordinate, and color. + **/ +class Mesh : public Drawable +{ +public: + + // How the Mesh's vertices are used when drawing. + // http://escience.anu.edu.au/lecture/cg/surfaceModeling/image/surfaceModeling015.png + enum DrawMode + { + DRAW_MODE_FAN, + DRAW_MODE_STRIP, + DRAW_MODE_TRIANGLES, + DRAW_MODE_POINTS, + DRAW_MODE_MAX_ENUM + }; + + /** + * Constructor. + * @param verts The vertices to use in the Mesh. + * @param mode The draw mode to use when drawing the Mesh. + **/ + Mesh(const std::vector &verts, DrawMode mode = DRAW_MODE_FAN); + virtual ~Mesh(); + + /** + * Replaces all the vertices in the Mesh with a new set of vertices. + **/ + void setVertices(const std::vector &verts); + + /** + * Gets all of the vertices in the Mesh as an array. + **/ + const Vertex *getVertices() const; + + /** + * Sets an individual vertex in the Mesh. + * @param index The index into the list of vertices to use. + * @param v The new vertex. + **/ + void setVertex(size_t index, const Vertex &v); + Vertex getVertex(size_t index) const; + + /** + * Gets the total number of vertices in the Mesh. + **/ + size_t getVertexCount() const; + + /** + * Sets the vertex map to use when drawing the Mesh. The vertex map + * determines the order in which vertices are used by the draw mode. + * A 0-element vector is equivalent to the default vertex map: + * {0, 1, 2, 3, 4, ...} + **/ + void setVertexMap(const std::vector &map); + + /** + * Gets a pointer to the vertex map array. The pointer is only valid until + * the next function call in the graphics module. + * May return null if the vertex map is empty. + **/ + const uint32 *getVertexMap() const; + + /** + * Gets the total number of elements in the vertex map array. + **/ + size_t getVertexMapCount() const; + + /** + * Sets the Image used when drawing the Mesh. + **/ + void setImage(Image *img); + + /** + * Disables any Image from being used when drawing the Mesh. + **/ + void setImage(); + + /** + * Gets the Image used when drawing the Mesh. May return null if no Image is + * set. + **/ + Image *getImage() const; + + /** + * Sets the draw mode used when drawing the Mesh. + **/ + void setDrawMode(DrawMode mode); + DrawMode getDrawMode() const; + + /** + * Sets whether per-vertex colors are enabled. If this is disabled, the + * global color (love.graphics.setColor) will be used for the entire Mesh. + **/ + void setVertexColors(bool enable); + bool hasVertexColors() const; + + // Implements Drawable. + void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + + static bool getConstant(const char *in, DrawMode &out); + static bool getConstant(DrawMode in, const char *&out); + +private: + + GLenum getGLDrawMode(DrawMode mode) const; + + // Vertex buffer. + VertexBuffer *vbo; + size_t vertex_count; + + // Element (vertex index) buffer, for the vertex map. + VertexBuffer *ibo; + size_t element_count; + + DrawMode draw_mode; + + Image *image; + + // Whether the per-vertex colors are used when drawing. + bool colors_enabled; + + static StringMap::Entry drawModeEntries[]; + static StringMap drawModes; + +}; // Mesh + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_MESH_H diff --git a/jni/love/src/modules/graphics/opengl/OpenGL.cpp b/jni/love/src/modules/graphics/opengl/OpenGL.cpp new file mode 100644 index 00000000..f71cc7ce --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/OpenGL.cpp @@ -0,0 +1,645 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "common/config.h" +#include "OpenGL.h" + +#include "Shader.h" +#include "common/Exception.h" + +// C++ +#include + +// C +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +OpenGL::OpenGL() + : contextInitialized(false) + , maxAnisotropy(1.0f) + , maxTextureSize(0) + , vendor(VENDOR_UNKNOWN) + , state() +{ +} + +bool OpenGL::initContext() +{ + if (contextInitialized) + return true; + + if (!gladLoadGL()) + return false; + + initOpenGLFunctions(); + initVendor(); + initMatrices(); + + // Store the current color so we don't have to get it through GL later. + GLfloat glcolor[4]; + if (GLAD_ES_VERSION_2_0) + glGetVertexAttribfv(GLuint(ATTRIB_COLOR), GL_CURRENT_VERTEX_ATTRIB, glcolor); + else + glGetFloatv(GL_CURRENT_COLOR, glcolor); + state.color.r = glcolor[0] * 255; + state.color.g = glcolor[1] * 255; + state.color.b = glcolor[2] * 255; + state.color.a = glcolor[3] * 255; + + // Same with the current clear color. + glGetFloatv(GL_COLOR_CLEAR_VALUE, glcolor); + state.clearColor.r = glcolor[0] * 255; + state.clearColor.g = glcolor[1] * 255; + state.clearColor.b = glcolor[2] * 255; + state.clearColor.a = glcolor[3] * 255; + + // Get the current viewport. + glGetIntegerv(GL_VIEWPORT, (GLint *) &state.viewport.x); + + // And the current scissor - but we need to compensate for GL scissors + // starting at the bottom left instead of top left. + glGetIntegerv(GL_SCISSOR_BOX, (GLint *) &state.scissor.x); + state.scissor.y = state.viewport.h - (state.scissor.y + state.scissor.h); + + if (GLAD_VERSION_1_0) + glGetFloatv(GL_POINT_SIZE, &state.pointSize); + else + state.pointSize = 1.0f; + + // Initialize multiple texture unit support for shaders, if available. + state.textureUnits.clear(); + if (Shader::isSupported()) + { + GLint maxtextureunits; + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxtextureunits); + + state.textureUnits.resize(maxtextureunits, 0); + + GLenum curgltextureunit; + glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint *) &curgltextureunit); + + state.curTextureUnit = curgltextureunit - GL_TEXTURE0; + + // Retrieve currently bound textures for each texture unit. + for (size_t i = 0; i < state.textureUnits.size(); i++) + { + glActiveTexture(GL_TEXTURE0 + i); + glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *) &state.textureUnits[i]); + } + + glActiveTexture(curgltextureunit); + } + else + { + // Multitexturing not supported, so we only have 1 texture unit. + state.textureUnits.resize(1, 0); + state.curTextureUnit = 0; + glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint *) &state.textureUnits[0]); + } + + // This will be non-zero on some platforms. + if (Canvas::isSupported()) + glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, (GLint *) &state.defaultFBO); + + initMaxValues(); + createDefaultTexture(); + + contextInitialized = true; + return true; +} + +void OpenGL::deInitContext() +{ + if (!contextInitialized) + return; + + contextInitialized = false; +} + +void OpenGL::initVendor() +{ + const char *vstr = (const char *) glGetString(GL_VENDOR); + if (!vstr) + { + vendor = VENDOR_UNKNOWN; + return; + } + + // http://feedback.wildfiregames.com/report/opengl/feature/GL_VENDOR + if (strstr(vstr, "ATI Technologies")) + vendor = VENDOR_ATI_AMD; + else if (strstr(vstr, "NVIDIA")) + vendor = VENDOR_NVIDIA; + else if (strstr(vstr, "Intel")) + vendor = VENDOR_INTEL; + else if (strstr(vstr, "Mesa")) + vendor = VENDOR_MESA_SOFT; + else if (strstr(vstr, "Apple Computer")) + vendor = VENDOR_APPLE; + else if (strstr(vstr, "Microsoft")) + vendor = VENDOR_MICROSOFT; + else + vendor = VENDOR_UNKNOWN; +} + +void OpenGL::initOpenGLFunctions() +{ + // The functionality of the core and ARB VBOs are identical, so we can + // assign the pointers of the ARB functions to the names of the core + // functions, if the latter isn't supported but the former is. + if (GLAD_ARB_vertex_buffer_object && !GLAD_VERSION_1_5) + { + fp_glBindBuffer = (pfn_glBindBuffer) fp_glBindBufferARB; + fp_glBufferData = (pfn_glBufferData) fp_glBufferDataARB; + fp_glBufferSubData = (pfn_glBufferSubData) fp_glBufferSubDataARB; + fp_glDeleteBuffers = (pfn_glDeleteBuffers) fp_glDeleteBuffersARB; + fp_glGenBuffers = (pfn_glGenBuffers) fp_glGenBuffersARB; + fp_glGetBufferParameteriv = (pfn_glGetBufferParameteriv) fp_glGetBufferParameterivARB; + fp_glGetBufferPointerv = (pfn_glGetBufferPointerv) fp_glGetBufferPointervARB; + fp_glGetBufferSubData = (pfn_glGetBufferSubData) fp_glGetBufferSubDataARB; + fp_glIsBuffer = (pfn_glIsBuffer) fp_glIsBufferARB; + fp_glMapBuffer = (pfn_glMapBuffer) fp_glMapBufferARB; + fp_glUnmapBuffer = (pfn_glUnmapBuffer) fp_glUnmapBufferARB; + } +} + +void OpenGL::initMaxValues() +{ + // We'll need this value to clamp anisotropy. + if (GLAD_EXT_texture_filter_anisotropic) + glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy); + else + maxAnisotropy = 1.0f; + + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); +} + +void OpenGL::initMatrices() +{ + while (matrices.transform.size() > 0) + matrices.transform.pop(); + + while (matrices.projection.size() > 0) + matrices.projection.pop(); + + matrices.transform.push(Matrix()); + matrices.projection.push(Matrix()); +} + +void OpenGL::createDefaultTexture() +{ + // Set the 'default' texture (id 0) as a repeating white pixel. Otherwise, + // texture2D calls inside a shader would return black when drawing graphics + // primitives, which would create the need to use different "passthrough" + // shaders for untextured primitives vs images. + + GLuint curtexture = state.textureUnits[state.curTextureUnit]; + bindTexture(0); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + GLubyte pix = 255; + glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &pix); + + bindTexture(curtexture); +} + +void OpenGL::prepareDraw() +{ + const Matrix &transform = matrices.transform.top(); + const Matrix &proj = matrices.projection.top(); + + Shader *shader = Shader::current; + if (GLAD_ES_VERSION_2_0 && shader) + { + // Send built-in uniforms to the current shader. + shader->sendBuiltinMatrix(Shader::BUILTIN_TRANSFORM_MATRIX, 4, transform.getElements(), 1); + shader->sendBuiltinMatrix(Shader::BUILTIN_TRANSFORM_MATRIX, 4, proj.getElements(), 1); + + Matrix tp_matrix(proj * transform); + shader->sendBuiltinMatrix(Shader::BUILTIN_TRANSFORM_PROJECTION_MATRIX, 4, tp_matrix.getElements(), 1); + + shader->sendBuiltinFloat(Shader::BUILTIN_POINT_SIZE, 1, &state.pointSize, 1); + } + else if (GLAD_VERSION_1_0) + { + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(proj.getElements()); + glMatrixMode(GL_MODELVIEW); + glLoadMatrixf(transform.getElements()); + } +} + +void OpenGL::setColor(const Color &c) +{ + if (GLAD_ES_VERSION_2_0) + glVertexAttrib4f(GLuint(ATTRIB_COLOR), c.r/255.f, c.g/255.f, c.b/255.f, c.a/255.f); + else + glColor4ubv(&c.r); + + state.color = c; +} + +Color OpenGL::getColor() const +{ + return state.color; +} + +void OpenGL::setClearColor(const Color &c) +{ + glClearColor(c.r / 255.0f, c.g / 255.0f, c.b / 255.0f, c.a / 255.0f); + state.clearColor = c; +} + +Color OpenGL::getClearColor() const +{ + return state.clearColor; +} + +GLint OpenGL::getGLAttrib(OpenGL::VertexAttrib attrib) +{ + if (GLAD_ES_VERSION_2_0) + { + // The enum value maps to a generic vertex attribute index. + return GLint(attrib); + } + else + { + switch (attrib) + { + case ATTRIB_POS: + return GL_VERTEX_ARRAY; + case ATTRIB_TEXCOORD: + return GL_TEXTURE_COORD_ARRAY; + case ATTRIB_COLOR: + return GL_COLOR_ARRAY; + default: + return GLint(attrib); + } + } + + return -1; +} + +void OpenGL::enableVertexAttribArray(OpenGL::VertexAttrib attrib) +{ + GLint glattrib = getGLAttrib(attrib); + + if (GLAD_ES_VERSION_2_0) + glEnableVertexAttribArray((GLuint) glattrib); + else + glEnableClientState((GLenum) glattrib); +} + +void OpenGL::disableVertexAttribArray(OpenGL::VertexAttrib attrib) +{ + GLint glattrib = getGLAttrib(attrib); + + if (GLAD_ES_VERSION_2_0) + glDisableVertexAttribArray((GLuint) glattrib); + else + glDisableClientState((GLenum) glattrib); +} + +void OpenGL::setVertexAttribArray(OpenGL::VertexAttrib attrib, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) +{ + if (GLAD_ES_VERSION_2_0) + { + GLboolean normalized = (type == GL_UNSIGNED_BYTE) ? GL_TRUE : GL_FALSE; + glVertexAttribPointer(GLuint(attrib), size, type, normalized, stride, pointer); + } + else + { + switch (attrib) + { + case ATTRIB_POS: + glVertexPointer(size, type, stride, pointer); + break; + case ATTRIB_TEXCOORD: + glTexCoordPointer(size, type, stride, pointer); + break; + case ATTRIB_COLOR: + glColorPointer(size, type, stride, pointer); + break; + default: + break; + } + } +} + +void OpenGL::setViewport(const OpenGL::Viewport &v) +{ + glViewport(v.x, v.y, v.w, v.h); + state.viewport = v; + + // glScissor starts from the lower left, so we compensate when setting the + // scissor. When the viewport is changed, we need to manually update the + // scissor again. + if (v.h != state.viewport.h) + setScissor(state.scissor); +} + +OpenGL::Viewport OpenGL::getViewport() const +{ + return state.viewport; +} + +void OpenGL::setScissor(const OpenGL::Viewport &v) +{ + // We need to compensate for glScissor starting from the lower left of the + // viewport instead of the top left. + glScissor(v.x, state.viewport.h - (v.y + v.h), v.w, v.h); + state.scissor = v; +} + +OpenGL::Viewport OpenGL::getScissor() const +{ + return state.scissor; +} + +void OpenGL::setPointSize(float size) +{ + if (GLAD_VERSION_1_0) + glPointSize(size); + + state.pointSize = size; +} + +float OpenGL::getPointSize() const +{ + return state.pointSize; +} + +GLuint OpenGL::getDefaultFBO() const +{ + return state.defaultFBO; +} + +void OpenGL::setTextureUnit(int textureunit) +{ + if (textureunit < 0 || (size_t) textureunit >= state.textureUnits.size()) + throw love::Exception("Invalid texture unit index (%d).", textureunit); + + if (textureunit != state.curTextureUnit) + { + if (state.textureUnits.size() > 1) + glActiveTexture(GL_TEXTURE0 + textureunit); + else + throw love::Exception("Multitexturing not supported."); + } + + state.curTextureUnit = textureunit; +} + +void OpenGL::bindTexture(GLuint texture) +{ + if (texture != state.textureUnits[state.curTextureUnit]) + { + state.textureUnits[state.curTextureUnit] = texture; + glBindTexture(GL_TEXTURE_2D, texture); + } +} + +void OpenGL::bindTextureToUnit(GLuint texture, int textureunit, bool restoreprev) +{ + if (textureunit < 0 || (size_t) textureunit >= state.textureUnits.size()) + throw love::Exception("Invalid texture unit index."); + + if (texture != state.textureUnits[textureunit]) + { + int oldtextureunit = state.curTextureUnit; + setTextureUnit(textureunit); + + state.textureUnits[textureunit] = texture; + glBindTexture(GL_TEXTURE_2D, texture); + + if (restoreprev) + setTextureUnit(oldtextureunit); + } +} + +void OpenGL::deleteTexture(GLuint texture) +{ + // glDeleteTextures binds texture 0 to all texture units the deleted texture + // was bound to before deletion. + std::vector::iterator it; + for (it = state.textureUnits.begin(); it != state.textureUnits.end(); ++it) + { + if (*it == texture) + *it = 0; + } + + glDeleteTextures(1, &texture); +} + +float OpenGL::setTextureFilter(const graphics::Image::Filter &f) +{ + GLint gmin, gmag; + + if (f.mipmap == Image::FILTER_NONE) + { + if (f.min == Image::FILTER_NEAREST) + gmin = GL_NEAREST; + else // f.min == Image::FILTER_LINEAR + gmin = GL_LINEAR; + } + else + { + if (f.min == Image::FILTER_NEAREST && f.mipmap == Image::FILTER_NEAREST) + gmin = GL_NEAREST_MIPMAP_NEAREST; + else if (f.min == Image::FILTER_NEAREST && f.mipmap == Image::FILTER_LINEAR) + gmin = GL_NEAREST_MIPMAP_LINEAR; + else if (f.min == Image::FILTER_LINEAR && f.mipmap == Image::FILTER_NEAREST) + gmin = GL_LINEAR_MIPMAP_NEAREST; + else if (f.min == Image::FILTER_LINEAR && f.mipmap == Image::FILTER_LINEAR) + gmin = GL_LINEAR_MIPMAP_LINEAR; + else + gmin = GL_LINEAR; + } + + + switch (f.mag) + { + case Image::FILTER_NEAREST: + gmag = GL_NEAREST; + break; + case Image::FILTER_LINEAR: + default: + gmag = GL_LINEAR; + break; + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gmin); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gmag); + + float anisotropy = 1.0f; + + if (GLAD_EXT_texture_filter_anisotropic) + { + anisotropy = std::min(std::max(f.anisotropy, 1.0f), maxAnisotropy); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropy); + } + + return anisotropy; +} + +graphics::Image::Filter OpenGL::getTextureFilter() +{ + GLint gmin, gmag; + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &gmin); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &gmag); + + Image::Filter f; + + switch (gmin) + { + case GL_NEAREST: + f.min = Image::FILTER_NEAREST; + f.mipmap = Image::FILTER_NONE; + break; + case GL_NEAREST_MIPMAP_NEAREST: + f.min = f.mipmap = Image::FILTER_NEAREST; + break; + case GL_NEAREST_MIPMAP_LINEAR: + f.min = Image::FILTER_NEAREST; + f.mipmap = Image::FILTER_LINEAR; + break; + case GL_LINEAR_MIPMAP_NEAREST: + f.min = Image::FILTER_LINEAR; + f.mipmap = Image::FILTER_NEAREST; + break; + case GL_LINEAR_MIPMAP_LINEAR: + f.min = f.mipmap = Image::FILTER_LINEAR; + break; + case GL_LINEAR: + default: + f.min = Image::FILTER_LINEAR; + f.mipmap = Image::FILTER_NONE; + break; + } + + switch (gmag) + { + case GL_NEAREST: + f.mag = Image::FILTER_NEAREST; + break; + case GL_LINEAR: + default: + f.mag = Image::FILTER_LINEAR; + break; + } + + if (GLAD_EXT_texture_filter_anisotropic) + glGetTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, &f.anisotropy); + + return f; +} + +void OpenGL::setTextureWrap(const graphics::Image::Wrap &w) +{ + GLint gs, gt; + + switch (w.s) + { + case Image::WRAP_CLAMP: + gs = GL_CLAMP_TO_EDGE; + break; + case Image::WRAP_REPEAT: + default: + gs = GL_REPEAT; + break; + } + + switch (w.t) + { + case Image::WRAP_CLAMP: + gt = GL_CLAMP_TO_EDGE; + break; + case Image::WRAP_REPEAT: + default: + gt = GL_REPEAT; + break; + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, gs); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, gt); +} + +graphics::Image::Wrap OpenGL::getTextureWrap() +{ + GLint gs, gt; + + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, &gs); + glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, >); + + Image::Wrap w; + + switch (gs) + { + case GL_CLAMP_TO_EDGE: + w.s = Image::WRAP_CLAMP; + break; + case GL_REPEAT: + default: + w.s = Image::WRAP_REPEAT; + break; + } + + switch (gt) + { + case GL_CLAMP_TO_EDGE: + w.t = Image::WRAP_CLAMP; + break; + case GL_REPEAT: + default: + w.t = Image::WRAP_REPEAT; + break; + } + + return w; +} + +int OpenGL::getMaxTextureSize() const +{ + return maxTextureSize; +} + +OpenGL::Vendor OpenGL::getVendor() const +{ + return vendor; +} + +// OpenGL class instance singleton. +OpenGL gl; + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/OpenGL.h b/jni/love/src/modules/graphics/opengl/OpenGL.h new file mode 100644 index 00000000..819a1c7b --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/OpenGL.h @@ -0,0 +1,311 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_OPENGL_H +#define LOVE_GRAPHICS_OPENGL_OPENGL_H + +// LOVE +#include "graphics/Color.h" +#include "graphics/Image.h" +#include "common/Matrix.h" + +// GLAD +#include "libraries/glad/gladfuncs.hpp" + +// C++ +#include +#include + +// The last argument to AttribPointer takes a buffer offset casted to a pointer. +#define BUFFER_OFFSET(i) ((char *) NULL + (i)) + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +// Awful, but the library uses the namespace in order to use the functions sanely +// with proper autocomplete in IDEs while having name mangling safety - +// no clashes with other GL libraries when linking, etc. +using namespace glad; + +/** + * Thin layer between OpenGL and the rest of the program. + * Internally shadows some OpenGL context state for improved efficiency and + * accuracy (compared to glGet etc.) + * A class is more convenient and readable than plain namespaced functions, but + * typically only one OpenGL object should be used (singleton.) + **/ +class OpenGL +{ +public: + + // OpenGL GPU vendors. + enum Vendor + { + VENDOR_ATI_AMD, + VENDOR_NVIDIA, + VENDOR_INTEL, + VENDOR_MESA_SOFT, // Software renderer. + VENDOR_APPLE, // Software renderer. + VENDOR_MICROSOFT, // Software renderer. + VENDOR_UNKNOWN + }; + + // Vertex attributes. The values map to OpenGL generic vertex attribute + // indices, when applicable (GLES2.) + enum VertexAttrib + { + ATTRIB_POS = 0, + ATTRIB_TEXCOORD = 1, + ATTRIB_COLOR = 2, + ATTRIB_MAX_ENUM + }; + + // A rectangle representing an OpenGL viewport or a scissor box. + struct Viewport + { + int x, y; + int w, h; + + Viewport() + : x(0), y(0), w(0), h(0) + {} + + Viewport(int _x, int _y, int _w, int _h) + : x(_x), y(_y), w(_w), h(_h) + {} + }; + + // Transformation matrix stacks. + struct + { + std::stack transform; + std::stack projection; + } matrices; + + OpenGL(); + virtual ~OpenGL() {} + + /** + * Initializes some required context state based on current and default + * OpenGL state. Call this directly after creating an OpenGL context! + **/ + bool initContext(); + + /** + * Marks current context state as invalid and deletes OpenGL objects owned + * by this class instance. Call this directly before potentially deleting + * an OpenGL context! + **/ + void deInitContext(); + + /** + * Set up necessary state (matrices etc.) for drawing. This *must* be called + * directly before GL draws. + **/ + void prepareDraw(); + + /** + * Sets the current constant color. + **/ + void setColor(const Color &c); + + /** + * Gets the current constant color. + **/ + Color getColor() const; + + /** + * Sets the current clear color for all framebuffer objects. + **/ + void setClearColor(const Color &c); + + /** + * Gets the current clear color. + **/ + Color getClearColor() const; + + /** + * Enables usage of an array for a vertex attribute when drawing. + * See http://www.opengl.org/sdk/docs/man/xhtml/glEnableVertexAttribArray.xml + **/ + void enableVertexAttribArray(VertexAttrib attrib); + + /** + * Disables usage of an array for a vertex attribute when drawing. + * See http://www.opengl.org/sdk/docs/man/xhtml/glDisableVertexAttribArray.xml + **/ + void disableVertexAttribArray(VertexAttrib attrib); + + /** + * Sets the parameters for an array of data for a vertex attribute. + * See http://www.opengl.org/sdk/docs/man/xhtml/glVertexAttribPointer.xml + **/ + void setVertexAttribArray(VertexAttrib attrib, GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); + + /** + * Sets the OpenGL rendering viewport to the specified rectangle. + * The y-coordinate starts at the top. + **/ + void setViewport(const Viewport &v); + + /** + * Gets the current OpenGL rendering viewport rectangle. + **/ + Viewport getViewport() const; + + /** + * Sets the scissor box to the specified rectangle. + * The y-coordinate starts at the top and is flipped internally. + **/ + void setScissor(const Viewport &v); + + /** + * Gets the current scissor box (regardless of whether scissoring is enabled.) + **/ + Viewport getScissor() const; + + /** + * Sets the global point size. + **/ + void setPointSize(float size); + + /** + * Gets the global point size. + **/ + float getPointSize() const; + + /** + * This will usually be 0 (system drawable), but some platforms require a + * non-zero FBO for rendering. + **/ + GLuint getDefaultFBO() const; + + /** + * Helper for setting the active texture unit. + * + * @param textureunit Index in the range of [0, maxtextureunits-1] + **/ + void setTextureUnit(int textureunit); + + /** + * Helper for binding an OpenGL texture. + * Makes sure we aren't redundantly binding textures. + **/ + void bindTexture(GLuint texture); + + /** + * Helper for binding a texture to a specific texture unit. + * + * @param textureunit Index in the range of [0, maxtextureunits-1] + * @param restoreprev Restore previously bound texture unit when done. + **/ + void bindTextureToUnit(GLuint texture, int textureunit, bool restoreprev); + + /** + * Helper for deleting an OpenGL texture. + * Cleans up if the texture is currently bound. + **/ + void deleteTexture(GLuint texture); + + /** + * Sets the image filter mode for the currently bound texture. + * Returns the actual amount of anisotropic filtering set. + **/ + float setTextureFilter(const graphics::Image::Filter &f); + + /** + * Returns the image filter mode for the currently bound texture. + **/ + graphics::Image::Filter getTextureFilter(); + + /** + * Sets the image wrap mode for the currently bound texture. + **/ + void setTextureWrap(const graphics::Image::Wrap &w); + + /** + * Returns the image wrap mode for the currently bound texture. + **/ + graphics::Image::Wrap getTextureWrap(); + + /** + * Returns the maximum supported width or height of a texture. + **/ + int getMaxTextureSize() const; + + /** + * Get the GPU vendor of this OpenGL context. + **/ + Vendor getVendor() const; + +private: + + void initVendor(); + void initOpenGLFunctions(); + void initMaxValues(); + void initMatrices(); + void createDefaultTexture(); + + GLint getGLAttrib(VertexAttrib attrib); + + bool contextInitialized; + + float maxAnisotropy; + int maxTextureSize; + + Vendor vendor; + + // Tracked OpenGL state. + struct + { + // Current constant color. + Color color; + + Color clearColor; + + // Texture unit state (currently bound texture for each texture unit.) + std::vector textureUnits; + + // Currently active texture unit. + int curTextureUnit; + + Viewport viewport; + Viewport scissor; + + float pointSize; + + GLuint defaultFBO; + + } state; + +}; // OpenGL + +// OpenGL class instance singleton. +extern OpenGL gl; + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_OPENGL_H diff --git a/jni/love/src/modules/graphics/opengl/ParticleSystem.cpp b/jni/love/src/modules/graphics/opengl/ParticleSystem.cpp new file mode 100644 index 00000000..879af5ca --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/ParticleSystem.cpp @@ -0,0 +1,942 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +//LOVE +#include "common/config.h" +#include "ParticleSystem.h" + +#include "common/math.h" +#include "modules/math/RandomGenerator.h" +#include "OpenGL.h" + +// STD +#include +#include +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +namespace +{ + +love::math::RandomGenerator rng; + +Colorf colorToFloat(const Color &c) +{ + return Colorf((float)c.r/255.0f, (float)c.g/255.0f, (float)c.b/255.0f, (float)c.a/255.0f); +} + +float calculate_variation(float inner, float outer, float var) +{ + float low = inner - (outer/2.0f)*var; + float high = inner + (outer/2.0f)*var; + float r = (float) rng.random(); + return low*(1-r)+high*r; +} + +} // anonymous namespace + +StringMap::Entry ParticleSystem::distributionsEntries[] = { + { "none", ParticleSystem::DISTRIBUTION_NONE }, + { "uniform", ParticleSystem::DISTRIBUTION_UNIFORM }, + { "normal", ParticleSystem::DISTRIBUTION_NORMAL }, +}; +StringMap ParticleSystem::distributions(ParticleSystem::distributionsEntries, sizeof(ParticleSystem::distributionsEntries)); + +StringMap::Entry ParticleSystem::insertModesEntries[] = +{ + { "top", ParticleSystem::INSERT_MODE_TOP }, + { "bottom", ParticleSystem::INSERT_MODE_BOTTOM }, + { "random", ParticleSystem::INSERT_MODE_RANDOM }, +}; +StringMap ParticleSystem::insertModes(ParticleSystem::insertModesEntries, sizeof(ParticleSystem::insertModesEntries)); + + +ParticleSystem::ParticleSystem(Image *image, uint32 size) + : pMem(NULL) + , pFree(NULL) + , pHead(NULL) + , pTail(NULL) + , particleVerts(NULL) + , ibo(NULL) + , image(image) + , active(true) + , insertMode(INSERT_MODE_TOP) + , maxParticles(0) + , activeParticles(0) + , emissionRate(0) + , emitCounter(0) + , areaSpreadDistribution(DISTRIBUTION_NONE) + , lifetime(-1) + , life(0) + , particleLifeMin(0) + , particleLifeMax(0) + , direction(0) + , spread(0) + , speedMin(0) + , speedMax(0) + , linearAccelerationMin(0, 0) + , linearAccelerationMax(0, 0) + , radialAccelerationMin(0) + , radialAccelerationMax(0) + , tangentialAccelerationMin(0) + , tangentialAccelerationMax(0) + , sizeVariation(0) + , rotationMin(0) + , rotationMax(0) + , spinStart(0) + , spinEnd(0) + , spinVariation(0) + , offsetX(float(image->getWidth())*0.5f) + , offsetY(float(image->getHeight())*0.5f) +{ + if (size == 0 || size > MAX_PARTICLES) + throw love::Exception("Invalid ParticleSystem size."); + + sizes.push_back(1.0f); + colors.push_back(Colorf(1.0f, 1.0f, 1.0f, 1.0f)); + setBufferSize(size); + image->retain(); +} + +ParticleSystem::~ParticleSystem() +{ + if (this->image != 0) + this->image->release(); + + deleteBuffers(); +} + +void ParticleSystem::createBuffers(size_t size) +{ + try + { + pFree = pMem = new particle[size]; + particleVerts = new love::Vertex[size * 4]; + ibo = new VertexIndex(size); + maxParticles = (uint32) size; + } + catch (love::Exception &) + { + deleteBuffers(); + throw; + } + catch (std::bad_alloc &) + { + deleteBuffers(); + throw love::Exception("Out of memory"); + } +} + +void ParticleSystem::deleteBuffers() +{ + // Clean up for great gracefulness! + delete[] pMem; + delete[] particleVerts; + delete ibo; + + pMem = NULL; + particleVerts = NULL; + ibo = NULL; + maxParticles = 0; + activeParticles = 0; +} + +void ParticleSystem::setBufferSize(uint32 size) +{ + if (size == 0 || size > MAX_PARTICLES) + throw love::Exception("Invalid buffer size"); + deleteBuffers(); + createBuffers(size); + reset(); +} + +uint32 ParticleSystem::getBufferSize() const +{ + return maxParticles; +} + +void ParticleSystem::addParticle() +{ + if (isFull()) + return; + + // Gets a free particle and updates the allocation pointer. + particle *p = pFree++; + initParticle(p); + + switch (insertMode) + { + default: + case INSERT_MODE_TOP: + insertTop(p); + break; + case INSERT_MODE_BOTTOM: + insertBottom(p); + break; + case INSERT_MODE_RANDOM: + insertRandom(p); + break; + } + + activeParticles++; +} + +void ParticleSystem::initParticle(particle *p) +{ + float min,max; + + min = particleLifeMin; + max = particleLifeMax; + if (min == max) + p->life = min; + else + p->life = (float) rng.random(min, max); + p->lifetime = p->life; + + p->position[0] = position.getX(); + p->position[1] = position.getY(); + + switch (areaSpreadDistribution) + { + case DISTRIBUTION_UNIFORM: + p->position[0] += (float) rng.random(-areaSpread.getX(), areaSpread.getX()); + p->position[1] += (float) rng.random(-areaSpread.getY(), areaSpread.getY()); + break; + case DISTRIBUTION_NORMAL: + p->position[0] += (float) rng.randomNormal(areaSpread.getX()); + p->position[1] += (float) rng.randomNormal(areaSpread.getY()); + break; + case DISTRIBUTION_NONE: + default: + break; + } + + min = direction - spread/2.0f; + max = direction + spread/2.0f; + p->direction = (float) rng.random(min, max); + + p->origin = position; + + min = speedMin; + max = speedMax; + float speed = (float) rng.random(min, max); + p->speed = love::Vector(cosf(p->direction), sinf(p->direction)); + p->speed *= speed; + + p->linearAcceleration.x = (float) rng.random(linearAccelerationMin.x, linearAccelerationMax.x); + p->linearAcceleration.y = (float) rng.random(linearAccelerationMin.y, linearAccelerationMax.y); + + min = radialAccelerationMin; + max = radialAccelerationMax; + p->radialAcceleration = (float) rng.random(min, max); + + min = tangentialAccelerationMin; + max = tangentialAccelerationMax; + p->tangentialAcceleration = (float) rng.random(min, max); + + p->sizeOffset = (float) rng.random(sizeVariation); // time offset for size change + p->sizeIntervalSize = (1.0f - (float) rng.random(sizeVariation)) - p->sizeOffset; + p->size = sizes[(size_t)(p->sizeOffset - .5f) * (sizes.size() - 1)]; + + min = rotationMin; + max = rotationMax; + p->spinStart = calculate_variation(spinStart, spinEnd, spinVariation); + p->spinEnd = calculate_variation(spinEnd, spinStart, spinVariation); + p->rotation = (float) rng.random(min, max); + + p->color = colors[0]; +} + +void ParticleSystem::insertTop(particle *p) +{ + if (pHead == NULL) + { + pHead = p; + p->prev = NULL; + } + else + { + pTail->next = p; + p->prev = pTail; + } + p->next = NULL; + pTail = p; +} + +void ParticleSystem::insertBottom(particle *p) +{ + if (pTail == NULL) + { + pTail = p; + p->next = NULL; + } + else + { + pHead->prev = p; + p->next = pHead; + } + p->prev = NULL; + pHead = p; +} + +void ParticleSystem::insertRandom(particle *p) +{ + // Nonuniform, but 64-bit is so large nobody will notice. Hopefully. + uint64 pos = rng.rand() % ((int64) activeParticles + 1); + + // Special case where the particle gets inserted before the head. + if (pos == activeParticles) + { + particle *pA = pHead; + if (pA) + pA->prev = p; + p->prev = NULL; + p->next = pA; + pHead = p; + return; + } + + // Inserts the particle after the randomly selected particle. + particle *pA = pMem + pos; + particle *pB = pA->next; + pA->next = p; + if (pB) + pB->prev = p; + else + pTail = p; + p->prev = pA; + p->next = pB; +} + +ParticleSystem::particle *ParticleSystem::removeParticle(particle *p) +{ + // The linked list is updated in this function and old pointers may be + // invalidated. The returned pointer will inform the caller of the new + // pointer to the next particle. + particle *pNext = NULL; + + // Removes the particle from the linked list. + if (p->prev) + p->prev->next = p->next; + else + pHead = p->next; + + if (p->next) + { + p->next->prev = p->prev; + pNext = p->next; + } + else + pTail = p->prev; + + // The (in memory) last particle can now be moved into the free slot. + // It will skip the moving if it happens to be the removed particle. + pFree--; + if (p != pFree) + { + *p = *pFree; + if (pNext == pFree) + pNext = p; + + if (p->prev) + p->prev->next = p; + else + pHead = p; + + if (p->next) + p->next->prev = p; + else + pTail = p; + } + + activeParticles--; + return pNext; +} + +void ParticleSystem::setImage(Image *image) +{ + Object::AutoRelease imagerelease(this->image); + + this->image = image; + this->image->retain(); +} + +Image *ParticleSystem::getImage() const +{ + return image; +} + +void ParticleSystem::setInsertMode(InsertMode mode) +{ + insertMode = mode; +} + +ParticleSystem::InsertMode ParticleSystem::getInsertMode() const +{ + return insertMode; +} + +void ParticleSystem::setEmissionRate(int rate) +{ + if (rate < 0) + throw love::Exception("Invalid emission rate"); + emissionRate = rate; +} + +int ParticleSystem::getEmissionRate() const +{ + return emissionRate; +} + +void ParticleSystem::setEmitterLifetime(float life) +{ + this->life = lifetime = life; +} + +float ParticleSystem::getEmitterLifetime() const +{ + return lifetime; +} + +void ParticleSystem::setParticleLifetime(float min, float max) +{ + particleLifeMin = min; + if (max == 0) + particleLifeMax = min; + else + particleLifeMax = max; +} + +void ParticleSystem::getParticleLifetime(float *min, float *max) const +{ + if (min) + *min = particleLifeMin; + if (max) + *max = particleLifeMax; +} + +void ParticleSystem::setPosition(float x, float y) +{ + position = love::Vector(x, y); +} + +const love::Vector &ParticleSystem::getPosition() const +{ + return position; +} + +void ParticleSystem::setAreaSpread(AreaSpreadDistribution distribution, float x, float y) +{ + areaSpread = love::Vector(x, y); + areaSpreadDistribution = distribution; +} + +ParticleSystem::AreaSpreadDistribution ParticleSystem::getAreaSpreadDistribution() const +{ + return areaSpreadDistribution; +} + +const love::Vector &ParticleSystem::getAreaSpreadParameters() const +{ + return areaSpread; +} + +void ParticleSystem::setDirection(float direction) +{ + this->direction = direction; +} + +float ParticleSystem::getDirection() const +{ + return direction; +} + +void ParticleSystem::setSpread(float spread) +{ + this->spread = spread; +} + +float ParticleSystem::getSpread() const +{ + return spread; +} + +void ParticleSystem::setSpeed(float speed) +{ + speedMin = speedMax = speed; +} + +void ParticleSystem::setSpeed(float min, float max) +{ + speedMin = min; + speedMax = max; +} + +void ParticleSystem::getSpeed(float *min, float *max) const +{ + if (min) + *min = speedMin; + if (max) + *max = speedMax; +} + +void ParticleSystem::setLinearAcceleration(float x, float y) +{ + linearAccelerationMin.x = linearAccelerationMax.x = x; + linearAccelerationMin.y = linearAccelerationMax.y = y; +} + +void ParticleSystem::setLinearAcceleration(float xmin, float ymin, float xmax, float ymax) +{ + linearAccelerationMin = love::Vector(xmin, ymin); + linearAccelerationMax = love::Vector(xmax, ymax); +} + +void ParticleSystem::getLinearAcceleration(love::Vector *min, love::Vector *max) const +{ + if (min) + *min = linearAccelerationMin; + if (max) + *max = linearAccelerationMax; +} + +void ParticleSystem::setRadialAcceleration(float acceleration) +{ + radialAccelerationMin = radialAccelerationMax = acceleration; +} + +void ParticleSystem::setRadialAcceleration(float min, float max) +{ + radialAccelerationMin = min; + radialAccelerationMax = max; +} + +void ParticleSystem::getRadialAcceleration(float *min, float *max) const +{ + if (min) + *min = radialAccelerationMin; + if (max) + *max = radialAccelerationMax; +} + +void ParticleSystem::setTangentialAcceleration(float acceleration) +{ + tangentialAccelerationMin = tangentialAccelerationMax = acceleration; +} + +void ParticleSystem::setTangentialAcceleration(float min, float max) +{ + tangentialAccelerationMin = min; + tangentialAccelerationMax = max; +} + +void ParticleSystem::getTangentialAcceleration(float *min, float *max) const +{ + if (min) + *min = tangentialAccelerationMin; + if (max) + *max = tangentialAccelerationMax; +} + +void ParticleSystem::setSize(float size) +{ + sizes.resize(1); + sizes[0] = size; +} + +void ParticleSystem::setSizes(const std::vector &newSizes) +{ + sizes = newSizes; +} + +const std::vector &ParticleSystem::getSizes() const +{ + return sizes; +} + +void ParticleSystem::setSizeVariation(float variation) +{ + sizeVariation = variation; +} + +float ParticleSystem::getSizeVariation() const +{ + return sizeVariation; +} + +void ParticleSystem::setRotation(float rotation) +{ + rotationMin = rotationMax = rotation; +} + +void ParticleSystem::setRotation(float min, float max) +{ + rotationMin = min; + rotationMax = max; +} + +void ParticleSystem::getRotation(float *min, float *max) const +{ + if (min) + *min = rotationMin; + if (max) + *max = rotationMax; +} + +void ParticleSystem::setSpin(float spin) +{ + spinStart = spin; + spinEnd = spin; +} + +void ParticleSystem::setSpin(float start, float end) +{ + spinStart = start; + spinEnd = end; +} + +void ParticleSystem::getSpin(float *start, float *end) const +{ + if (start) + *start = spinStart; + if (end) + *end = spinEnd; +} + +void ParticleSystem::setSpinVariation(float variation) +{ + spinVariation = variation; +} + +float ParticleSystem::getSpinVariation() const +{ + return spinVariation; +} + +void ParticleSystem::setOffset(float x, float y) +{ + offsetX = x; + offsetY = y; +} + +love::Vector ParticleSystem::getOffset() const +{ + return love::Vector(offsetX, offsetY); +} + +void ParticleSystem::setColor(const Color &color) +{ + colors.resize(1); + colors[0] = colorToFloat(color); +} + +void ParticleSystem::setColor(const std::vector &newColors) +{ + colors.resize(newColors.size()); + for (size_t i = 0; i < newColors.size(); ++i) + colors[i] = colorToFloat(newColors[i]); +} + +std::vector ParticleSystem::getColor() const +{ + // The particle system stores colors as floats... + std::vector ncolors(colors.size()); + + for (size_t i = 0; i < colors.size(); ++i) + { + ncolors[i].r = (unsigned char) (colors[i].r * 255); + ncolors[i].g = (unsigned char) (colors[i].g * 255); + ncolors[i].b = (unsigned char) (colors[i].b * 255); + ncolors[i].a = (unsigned char) (colors[i].a * 255); + } + + return ncolors; +} + +uint32 ParticleSystem::getCount() const +{ + return activeParticles; +} + +void ParticleSystem::start() +{ + active = true; +} + +void ParticleSystem::stop() +{ + active = false; + life = lifetime; + emitCounter = 0; +} + +void ParticleSystem::pause() +{ + active = false; +} + +void ParticleSystem::reset() +{ + if (pMem == NULL) + return; + + pFree = pMem; + pHead = NULL; + pTail = NULL; + activeParticles = 0; + life = lifetime; + emitCounter = 0; +} + +void ParticleSystem::emit(uint32 num) +{ + if (!active) + return; + + num = std::min(num, maxParticles - activeParticles); + + while(num--) + addParticle(); +} + +bool ParticleSystem::isActive() const +{ + return active; +} + +bool ParticleSystem::isPaused() const +{ + return !active && life < lifetime; +} + +bool ParticleSystem::isStopped() const +{ + return !active && life >= lifetime; +} + +bool ParticleSystem::isEmpty() const +{ + return activeParticles == 0; +} + +bool ParticleSystem::isFull() const +{ + return activeParticles == maxParticles; +} + +void ParticleSystem::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const +{ + uint32 pCount = getCount(); + if (pCount == 0 || image == NULL || pMem == NULL || particleVerts == NULL) + return; + + Color curcolor = gl.getColor(); + + Matrix t; + t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + + gl.matrices.transform.push(gl.matrices.transform.top()); + gl.matrices.transform.top() *= t; + + const Vertex *imageVerts = image->getVertices(); + Vertex *pVerts = particleVerts; + particle *p = pHead; + + // set the vertex data for each particle (transformation, texcoords, color) + while (p) + { + // particle vertices are image vertices transformed by particle information + t.setTransformation(p->position[0], p->position[1], p->rotation, p->size, p->size, offsetX, offsetY, 0.0f, 0.0f); + t.transform(pVerts, imageVerts, 4); + + // set the texture coordinate and color data for particle vertices + for (int v = 0; v < 4; v++) + { + pVerts[v].s = imageVerts[v].s; + pVerts[v].t = imageVerts[v].t; + + // particle colors are stored as floats (0-1) but vertex colors are stored as unsigned bytes (0-255) + pVerts[v].r = (unsigned char) (p->color.r*255); + pVerts[v].g = (unsigned char) (p->color.g*255); + pVerts[v].b = (unsigned char) (p->color.b*255); + pVerts[v].a = (unsigned char) (p->color.a*255); + } + + pVerts += 4; + p = p->next; + } + + image->predraw(); + + gl.prepareDraw(); + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + gl.enableVertexAttribArray(OpenGL::ATTRIB_COLOR); + + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), &particleVerts[0].x); + gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), &particleVerts[0].s); + gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, sizeof(Vertex), &particleVerts[0].r); + + { + VertexBuffer::Bind ibo_bind(*ibo->getVertexBuffer()); + glDrawElements(GL_TRIANGLES, ibo->getIndexCount(pCount), ibo->getType(), ibo->getPointer(0)); + } + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR); + + image->postdraw(); + + gl.matrices.transform.pop(); + + gl.setColor(curcolor); +} + +void ParticleSystem::update(float dt) +{ + if (pMem == NULL || dt == 0.0f) + return; + + // Make some more particles. + if (active) + { + float rate = 1.0f / emissionRate; // the amount of time between each particle emit + emitCounter += dt; + while (emitCounter > rate) + { + addParticle(); + emitCounter -= rate; + } + /*int particles = (int)(emissionRate * dt); + for (int i = 0; i != particles; i++) + add();*/ + + life -= dt; + if (lifetime != -1 && life < 0) + stop(); + } + + // Traverse all particles and update. + particle *p = pHead; + + while (p) + { + // Decrease lifespan. + p->life -= dt; + + if (p->life <= 0) + p = removeParticle(p); + else + { + // Temp variables. + love::Vector radial, tangential; + love::Vector ppos(p->position[0], p->position[1]); + + // Get vector from particle center to particle. + radial = ppos - p->origin; + radial.normalize(); + tangential = radial; + + // Resize radial acceleration. + radial *= p->radialAcceleration; + + // Calculate tangential acceleration. + { + float a = tangential.getX(); + tangential.setX(-tangential.getY()); + tangential.setY(a); + } + + // Resize tangential. + tangential *= p->tangentialAcceleration; + + // Update position. + p->speed += (radial+tangential+p->linearAcceleration)*dt; + + // Modify position. + ppos += p->speed * dt; + + p->position[0] = ppos.getX(); + p->position[1] = ppos.getY(); + + const float t = 1.0f - p->life / p->lifetime; + + // Rotate. + p->rotation += (p->spinStart * (1.0f - t) + p->spinEnd * t)*dt; + + // Change size according to given intervals: + // i = 0 1 2 3 n-1 + // |-------|-------|------|--- ... ---| + // t = 0 1/(n-1) 3/(n-1) 1 + // + // `s' is the interpolation variable scaled to the current + // interval width, e.g. if n = 5 and t = 0.3, then the current + // indices are 1,2 and s = 0.3 - 0.25 = 0.05 + float s = p->sizeOffset + t * p->sizeIntervalSize; // size variation + s *= (float)(sizes.size() - 1); // 0 <= s < sizes.size() + size_t i = (size_t)s; + size_t k = (i == sizes.size() - 1) ? i : i + 1; // boundary check (prevents failing on t = 1.0f) + s -= (float)i; // transpose s to be in interval [0:1]: i <= s < i + 1 ~> 0 <= s < 1 + p->size = sizes[i] * (1.0f - s) + sizes[k] * s; + + // Update color according to given intervals (as above) + s = t * (float)(colors.size() - 1); + i = (size_t)s; + k = (i == colors.size() - 1) ? i : i + 1; + s -= (float)i; // 0 <= s <= 1 + p->color = colors[i] * (1.0f - s) + colors[k] * s; + + // Next particle. + p = p->next; + } + } +} + +bool ParticleSystem::getConstant(const char *in, AreaSpreadDistribution &out) +{ + return distributions.find(in, out); +} + +bool ParticleSystem::getConstant(AreaSpreadDistribution in, const char *&out) +{ + return distributions.find(in, out); +} + +bool ParticleSystem::getConstant(const char *in, InsertMode &out) +{ + return insertModes.find(in, out); +} + +bool ParticleSystem::getConstant(InsertMode in, const char *&out) +{ + return insertModes.find(in, out); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/ParticleSystem.h b/jni/love/src/modules/graphics/opengl/ParticleSystem.h new file mode 100644 index 00000000..405f5d93 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/ParticleSystem.h @@ -0,0 +1,632 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_PARTICLE_SYSTEM_H +#define LOVE_GRAPHICS_OPENGL_PARTICLE_SYSTEM_H + +// LOVE +#include "common/int.h" +#include "common/math.h" +#include "common/Vector.h" +#include "graphics/Drawable.h" +#include "graphics/Color.h" +#include "Image.h" +#include "VertexBuffer.h" + +// STL +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +/** + * A class for creating, moving and drawing particles. + * A big thanks to bobthebloke.org + **/ +class ParticleSystem : public Drawable +{ +public: + /** + * Type of distribution new particles are drawn from: None, uniform, normal. + */ + enum AreaSpreadDistribution + { + DISTRIBUTION_NONE, + DISTRIBUTION_UNIFORM, + DISTRIBUTION_NORMAL, + DISTRIBUTION_MAX_ENUM + }; + + /** + * Insertion modes of new particles in the list: top, bottom, random. + */ + enum InsertMode + { + INSERT_MODE_TOP, + INSERT_MODE_BOTTOM, + INSERT_MODE_RANDOM, + INSERT_MODE_MAX_ENUM, + }; + + /** + * Maximum numbers of particles in a ParticleSystem. + * This limit comes from the fact that a quad requires four vertices and the + * OpenGL API where GLsizei is a signed int. + **/ + static const uint32 MAX_PARTICLES = LOVE_INT32_MAX / 4; + + /** + * Creates a particle system with the specified buffersize and image. + **/ + ParticleSystem(Image *image, uint32 buffer); + + /** + * Deletes any allocated memory. + **/ + virtual ~ParticleSystem(); + + /** + * Sets the image used in the particle system. + * @param image The new image. + **/ + void setImage(Image *image); + + /** + * Returns the image used when drawing the particle system. + **/ + Image *getImage() const; + + /** + * Clears the current buffer and allocates the appropriate amount of space for the buffer. + * @param size The new buffer size. + **/ + void setBufferSize(uint32 size); + + /** + * Returns the total amount of particles this ParticleSystem can have active + * at any given point in time. + **/ + uint32 getBufferSize() const; + + /** + * Sets the insert mode for new particles. + * @param mode The new insert mode. + */ + void setInsertMode(InsertMode mode); + + /** + * Returns the current insert mode. + */ + InsertMode getInsertMode() const; + + /** + * Sets the emission rate. + * @param rate The amount of particles per second. + **/ + void setEmissionRate(int rate); + + /** + * Returns the number of particles created per second. + **/ + int getEmissionRate() const; + + /** + * Sets the lifetime of the particle emitter (-1 means eternal) + * @param life The lifetime (in seconds). + **/ + void setEmitterLifetime(float life); + + /** + * Returns the lifetime of the particle emitter. + **/ + float getEmitterLifetime() const; + + /** + * Sets the life range of the particles. + * @param min The minimum life. + * @param max The maximum life (if 0, then becomes the same as minimum life). + **/ + void setParticleLifetime(float min, float max = 0); + + /** + * Gets the lifetime of a particle. + * @param[out] min The minimum life. + * @param[out] max The maximum life. + **/ + void getParticleLifetime(float *min, float *max) const; + + /** + * Sets the position of the center of the emitter. + * Used to move the emitter without changing the position of already existing particles. + * @param x The x-coordinate. + * @param y The y-coordinate. + **/ + void setPosition(float x, float y); + + /** + * Returns the position of the emitter. + **/ + const love::Vector &getPosition() const; + + /** + * Sets the emission area spread parameters and distribution type. The interpretation of + * the parameters depends on the distribution type: + * + * * None: Parameters are ignored. No area spread. + * * Uniform: Parameters denote maximal (symmetric) displacement from emitter position. + * * Normal: Parameters denote the standard deviation in x and y direction. x and y are assumed to be uncorrelated. + * @param x First parameter. Interpretation depends on distribution type. + * @param y Second parameter. Interpretation depends on distribution type. + * @param distribution Distribution type + **/ + void setAreaSpread(AreaSpreadDistribution distribution, float x, float y); + + /** + * Returns area spread distribution type. + **/ + AreaSpreadDistribution getAreaSpreadDistribution() const; + + /** + * Returns area spread parameters. + **/ + const love::Vector &getAreaSpreadParameters() const; + + /** + * Sets the direction of the particle emitter. + * @param direction The direction (in degrees). + **/ + void setDirection(float direction); + + /** + * Returns the direction of the particle emitter (in radians). + **/ + float getDirection() const; + + /** + * Sets the spread of the particle emitter. + * @param spread The spread (in radians). + **/ + void setSpread(float spread); + + /** + * Returns the directional spread of the emitter (in radians). + **/ + float getSpread() const; + + /** + * Sets the speed of the particles. + * @param speed The speed. + **/ + void setSpeed(float speed); + + /** + * Sets the speed of the particles. + * @param min The minimum speed. + * @param max The maximum speed. + **/ + void setSpeed(float min, float max); + + /** + * Gets the speed of the particles. + * @param[out] min The minimum speed. + * @param[out] max The maximum speed. + **/ + void getSpeed(float *min, float *max) const; + + /** + * Sets the linear acceleration (the acceleration along the x and y axes). + * @param x The acceleration along the x-axis. + * @param y The acceleration along the y-axis. + **/ + void setLinearAcceleration(float x, float y); + + /** + * Sets the linear acceleration (the acceleration along the x and y axes). + * @param xmin The minimum amount of acceleration along the x-axis. + * @param ymin The minimum amount of acceleration along the y-axis. + * @param xmax The maximum amount of acceleration along the x-axis. + * @param ymax The maximum amount of acceleration along the y-axis. + **/ + void setLinearAcceleration(float xmin, float ymin, float xmax, float ymax); + + /** + * Gets the linear acceleration of the particles. + * @param[out] min The minimum acceleration. + * @param[out] max The maximum acceleration. + **/ + void getLinearAcceleration(love::Vector *min, love::Vector *max) const; + + /** + * Sets the radial acceleration (the acceleration towards the particle emitter). + * @param acceleration The amount of acceleration. + **/ + void setRadialAcceleration(float acceleration); + + /** + * Sets the radial acceleration (the acceleration towards the particle emitter). + * @param min The minimum acceleration. + * @param max The maximum acceleration. + **/ + void setRadialAcceleration(float min, float max); + + /** + * Gets the radial acceleration. + * @param[out] min The minimum amount of radial acceleration. + * @param[out] max The maximum amount of radial acceleration. + **/ + void getRadialAcceleration(float *min, float *max) const; + + /** + * Sets the tangential acceleration (the acceleration perpendicular to the particle's direction). + * @param acceleration The amount of acceleration. + **/ + void setTangentialAcceleration(float acceleration); + + /** + * Sets the tangential acceleration (the acceleration perpendicular to the particle's direction). + * @param min The minimum acceleration. + * @param max The maximum acceleration. + **/ + void setTangentialAcceleration(float min, float max); + + /** + * Gets the tangential acceleration. + * @param[out] min The minimum tangential acceleration. + * @param[out] max The maximum tangential acceleration. + **/ + void getTangentialAcceleration(float *min, float *max) const; + + /** + * Sets the size of the sprite (1.0 being the default size). + * @param size The size of the sprite. + **/ + void setSize(float size); + + /** + * Sets the sizes of the sprite upon creation and upon death (1.0 being the default size). + * @param newSizes Array of sizes + **/ + void setSizes(const std::vector &newSizes); + + /** + * Returns the sizes of the particle sprites. + **/ + const std::vector &getSizes() const; + + /** + * Sets the amount of variation to the sprite's beginning size (0 being no variation and 1.0 a random size between start and end). + * @param variation The amount of variation. + **/ + void setSizeVariation(float variation); + + /** + * Returns the amount of initial size variation between particles. + **/ + float getSizeVariation() const; + + /** + * Sets the amount of rotation a sprite starts out with. + * @param rotation The amount of rotation. + **/ + void setRotation(float rotation); + + /** + * Sets the amount of rotation a sprite starts out with (a random value between min and max). + * @param min The minimum amount of rotation. + * @param max The maximum amount of rotation. + **/ + void setRotation(float min, float max); + + /** + * Gets the initial amount of rotation of a particle, in radians. + * @param[out] min The minimum initial rotation. + * @param[out] max The maximum initial rotation. + **/ + void getRotation(float *min, float *max) const; + + /** + * Sets the spin of the sprite. + * @param spin The spin of the sprite (in degrees). + **/ + void setSpin(float spin); + + /** + * Sets the spin of the sprite upon particle creation and death. + * @param start The spin of the sprite upon creation (in radians / second). + * @param end The spin of the sprite upon death (in radians / second). + **/ + void setSpin(float start, float end); + + /** + * Gets the amount of spin of a particle during its lifetime. + * @param[out] start The initial spin, in radians / s. + * @param[out] end The final spin, in radians / s. + **/ + void getSpin(float *start, float *end) const; + + /** + * Sets the variation of the start spin (0 being no variation and 1 being a random spin between start and end). + * @param variation The variation. + **/ + void setSpinVariation(float variation); + + /** + * Returns the amount of variation of the start spin of a particle. + **/ + float getSpinVariation() const; + + /** + * Sets the particles' offsets for rotation. + * @param x The x offset. + * @param y The y offset. + **/ + void setOffset(float x, float y); + + /** + * Returns of the particle offset. + **/ + love::Vector getOffset() const; + + /** + * Sets the color of the particles. + * @param color The color. + **/ + void setColor(const Color &color); + + /** + * Sets the color of the particles. + * @param newColors Array of colors + **/ + void setColor(const std::vector &newColors); + + /** + * Returns the color of the particles. + **/ + std::vector getColor() const; + + /** + * Returns the amount of particles that are currently active in the system. + **/ + uint32 getCount() const; + + /** + * Starts/resumes the particle emitter. + **/ + void start(); + + /** + * Stops the particle emitter and resets. + **/ + void stop(); + + /** + * Pauses the particle emitter. + **/ + void pause(); + + /** + * Resets the particle emitter. + **/ + void reset(); + + /** + * Instantly emits a number of particles. + * @param num The number of particles to emit. + **/ + void emit(uint32 num); + + /** + * Returns whether the particle emitter is active. + **/ + bool isActive() const; + + /** + * Returns whether the particle emitter is paused. + **/ + bool isPaused() const; + + bool isStopped() const; + + /** + * Returns whether the particle system is empty of particles or not. + **/ + bool isEmpty() const; + + /** + * Returns whether the amount of particles has reached the buffer limit or not. + **/ + bool isFull() const; + + /** + * Draws the particle emitter at the specified position. + * @param x The x-coordinate. + * @param y The y-coordinate. + **/ + virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + + /** + * Updates the particle system. + * @param dt Time since last update. + **/ + void update(float dt); + + static bool getConstant(const char *in, AreaSpreadDistribution &out); + static bool getConstant(AreaSpreadDistribution in, const char *&out); + + static bool getConstant(const char *in, InsertMode &out); + static bool getConstant(InsertMode in, const char *&out); + +protected: + // Represents a single particle. + struct particle + { + particle *prev; + particle *next; + + float lifetime; + float life; + + float position[2]; + float direction; + + // Particles gravitate towards this point. + love::Vector origin; + + love::Vector speed; + love::Vector linearAcceleration; + float radialAcceleration; + float tangentialAcceleration; + + float size; + float sizeOffset; + float sizeIntervalSize; + + float rotation; + float spinStart; + float spinEnd; + + Colorf color; + }; + + // The max amount of particles. + int bufferSize; + + // Pointer to the beginning of the allocated memory. + particle *pMem; + + // Pointer to a free particle. + particle *pFree; + + // Pointer to the start of the linked list. + particle *pHead; + + // Pointer to the end of the linked list. + particle *pTail; + + // array of transformed vertex data for all particles, for drawing + Vertex *particleVerts; + + // Vertex index buffer. + VertexIndex *ibo; + + // The image to be drawn. + Image *image; + + // Whether the particle emitter is active. + bool active; + + // Insert mode of new particles. + InsertMode insertMode; + + // The maximum number of particles. + uint32 maxParticles; + + // The number of active particles. + uint32 activeParticles; + + // The emission rate (particles/sec). + int emissionRate; + + // Used to determine when a particle should be emitted. + float emitCounter; + + // The relative position of the particle emitter. + love::Vector position; + + // Emission area spread. + AreaSpreadDistribution areaSpreadDistribution; + love::Vector areaSpread; + + // The lifetime of the particle emitter (-1 means infinite) and the life it has left. + float lifetime; + float life; + + // The particle life. + float particleLifeMin; + float particleLifeMax; + + // The direction (and spread) the particles will be emitted in. Measured in radians. + float direction; + float spread; + + // The speed. + float speedMin; + float speedMax; + + // Acceleration along the x and y axes. + love::Vector linearAccelerationMin; + love::Vector linearAccelerationMax; + + // Acceleration towards the emitter's center + float radialAccelerationMin; + float radialAccelerationMax; + + // Acceleration perpendicular to the particle's direction. + float tangentialAccelerationMin; + float tangentialAccelerationMax; + + // Size. + std::vector sizes; + float sizeVariation; + + // Rotation + float rotationMin; + float rotationMax; + + // Spin. + float spinStart; + float spinEnd; + float spinVariation; + + // Offsets + float offsetX; + float offsetY; + + // Color. + std::vector colors; + + void createBuffers(size_t size); + void deleteBuffers(); + + void addParticle(); + particle *removeParticle(particle *p); + + // Called by addParticle. + void initParticle(particle *p); + void insertTop(particle *p); + void insertBottom(particle *p); + void insertRandom(particle *p); + + static StringMap::Entry distributionsEntries[]; + static StringMap distributions; + + static StringMap::Entry insertModesEntries[]; + static StringMap insertModes; +}; + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_PARTICLE_SYSTEM_H diff --git a/jni/love/src/modules/graphics/opengl/Polyline.cpp b/jni/love/src/modules/graphics/opengl/Polyline.cpp new file mode 100644 index 00000000..9859b714 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Polyline.cpp @@ -0,0 +1,383 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 + +// LOVE +#include "Polyline.h" + +// OpenGL +#include "OpenGL.h" + +// treat adjacent segments with angles between their directions <5 degree as straight +static const float LINES_PARALLEL_EPS = 0.05f; + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +void Polyline::render(const float *coords, size_t count, size_t size_hint, float halfwidth, float pixel_size, bool draw_overdraw) +{ + static std::vector anchors; + anchors.clear(); + anchors.reserve(size_hint); + + static std::vector normals; + normals.clear(); + normals.reserve(size_hint); + + // prepare vertex arrays + if (draw_overdraw) + halfwidth -= pixel_size * .3; + + // compute sleeve + bool is_looping = (coords[0] == coords[count - 2]) && (coords[1] == coords[count - 1]); + Vector s; + if (!is_looping) // virtual starting point at second point mirrored on first point + s = Vector(coords[2] - coords[0], coords[3] - coords[1]); + else // virtual starting point at last vertex + s = Vector(coords[0] - coords[count - 4], coords[1] - coords[count - 3]); + + float len_s = s.getLength(); + Vector ns = s.getNormal(halfwidth / len_s); + + Vector q, r(coords[0], coords[1]); + for (size_t i = 0; i + 3 < count; i += 2) + { + q = r; + r = Vector(coords[i + 2], coords[i + 3]); + renderEdge(anchors, normals, s, len_s, ns, q, r, halfwidth); + } + + q = r; + r = is_looping ? Vector(coords[2], coords[3]) : r + s; + renderEdge(anchors, normals, s, len_s, ns, q, r, halfwidth); + + vertex_count = normals.size(); + vertices = new Vector[vertex_count]; + for (size_t i = 0; i < vertex_count; ++i) + vertices[i] = anchors[i] + normals[i]; + + if (draw_overdraw) + render_overdraw(normals, pixel_size, is_looping); +} + +void NoneJoinPolyline::renderEdge(std::vector &anchors, std::vector &normals, + Vector &s, float &len_s, Vector &ns, + const Vector &q, const Vector &r, float hw) +{ + anchors.push_back(q); + anchors.push_back(q); + normals.push_back(ns); + normals.push_back(-ns); + + s = (r - q); + len_s = s.getLength(); + ns = s.getNormal(hw / len_s); + + anchors.push_back(q); + anchors.push_back(q); + normals.push_back(-ns); + normals.push_back(ns); +} + + +/** Calculate line boundary points. + * + * Sketch: + * + * u1 + * -------------+---...___ + * | ```'''-- --- + * p- - - - - - q- - . _ _ | w/2 + * | ` ' ' r + + * -------------+---...___ | w/2 + * u2 ```'''-- --- + * + * u1 and u2 depend on four things: + * - the half line width w/2 + * - the previous line vertex p + * - the current line vertex q + * - the next line vertex r + * + * u1/u2 are the intersection points of the parallel lines to p-q and q-r, + * i.e. the point where + * + * (q + w/2 * ns) + lambda * (q - p) = (q + w/2 * nt) + mu * (r - q) (u1) + * (q - w/2 * ns) + lambda * (q - p) = (q - w/2 * nt) + mu * (r - q) (u2) + * + * with nt,nt being the normals on the segments s = p-q and t = q-r, + * + * ns = perp(s) / |s| + * nt = perp(t) / |t|. + * + * Using the linear equation system (similar for u2) + * + * q + w/2 * ns + lambda * s - (q + w/2 * nt + mu * t) = 0 (u1) + * <=> q-q + lambda * s - mu * t = (nt - ns) * w/2 + * <=> lambda * s - mu * t = (nt - ns) * w/2 + * + * the intersection points can be efficiently calculated using Cramer's rule. + */ +void MiterJoinPolyline::renderEdge(std::vector &anchors, std::vector &normals, + Vector &s, float &len_s, Vector &ns, + const Vector &q, const Vector &r, float hw) +{ + Vector t = (r - q); + float len_t = t.getLength(); + Vector nt = t.getNormal(hw / len_t); + + anchors.push_back(q); + anchors.push_back(q); + + float det = s ^ t; + if (fabs(det) / (len_s * len_t) < LINES_PARALLEL_EPS && s * t > 0) + { + // lines parallel, compute as u1 = q + ns * w/2, u2 = q - ns * w/2 + normals.push_back(ns); + normals.push_back(-ns); + } + else + { + // cramers rule + float lambda = ((nt - ns) ^ t) / det; + Vector d = ns + s * lambda; + normals.push_back(d); + normals.push_back(-d); + } + + s = t; + ns = nt; + len_s = len_t; +} + +/** Calculate line boundary points. + * + * Sketch: + * + * uh1___uh2 + * .' '. + * .' q '. + * .' ' ' '. + *.' ' .'. ' '. + * ' .' ul'. ' + * p .' '. r + * + * + * ul can be found as above, uh1 and uh2 are much simpler: + * + * uh1 = q + ns * w/2, uh2 = q + nt * w/2 + */ +void BevelJoinPolyline::renderEdge(std::vector &anchors, std::vector &normals, + Vector &s, float &len_s, Vector &ns, + const Vector &q, const Vector &r, float hw) +{ + Vector t = (r - q); + float len_t = t.getLength(); + + float det = s ^ t; + if (fabs(det) / (len_s * len_t) < LINES_PARALLEL_EPS && s * t > 0) + { + // lines parallel, compute as u1 = q + ns * w/2, u2 = q - ns * w/2 + Vector n = t.getNormal(hw / len_t); + anchors.push_back(q); + anchors.push_back(q); + normals.push_back(n); + normals.push_back(-n); + s = t; + len_s = len_t; + return; // early out + } + + // cramers rule + Vector nt= t.getNormal(hw / len_t); + float lambda = ((nt - ns) ^ t) / det; + Vector d = ns + s * lambda; + + anchors.push_back(q); + anchors.push_back(q); + anchors.push_back(q); + anchors.push_back(q); + if (det > 0) // 'left' turn -> intersection on the top + { + normals.push_back(d); + normals.push_back(-ns); + normals.push_back(d); + normals.push_back(-nt); + } + else + { + normals.push_back(ns); + normals.push_back(-d); + normals.push_back(nt); + normals.push_back(-d); + } + s = t; + len_s = len_t; + ns = nt; +} + +void Polyline::render_overdraw(const std::vector &normals, float pixel_size, bool is_looping) +{ + overdraw_vertex_count = 2 * vertex_count + (is_looping ? 0 : 2); + overdraw = new Vector[overdraw_vertex_count]; + // upper segment + for (size_t i = 0; i + 1 < vertex_count; i += 2) + { + overdraw[i] = vertices[i]; + overdraw[i+1] = vertices[i] + normals[i] * (pixel_size / normals[i].getLength()); + } + // lower segment + for (size_t i = 0; i + 1 < vertex_count; i += 2) + { + size_t k = vertex_count - i - 1; + overdraw[vertex_count + i] = vertices[k]; + overdraw[vertex_count + i+1] = vertices[k] + normals[k] * (pixel_size / normals[i].getLength()); + } + + // if not looping, the outer overdraw vertices need to be displaced + // to cover the line endings, i.e.: + // +- - - - //- - + +- - - - - //- - - + + // +-------//-----+ : +-------//-----+ : + // | core // line | --> : | core // line | : + // +-----//-------+ : +-----//-------+ : + // +- - //- - - - + +- - - //- - - - - + + if (!is_looping) + { + // left edge + Vector spacer = (overdraw[1] - overdraw[3]); + spacer.normalize(pixel_size); + overdraw[1] += spacer; + overdraw[overdraw_vertex_count - 3] += spacer; + + // right edge + spacer = (overdraw[vertex_count-1] - overdraw[vertex_count-3]); + spacer.normalize(pixel_size); + overdraw[vertex_count-1] += spacer; + overdraw[vertex_count+1] += spacer; + + // we need to draw two more triangles to close the + // overdraw at the line start. + overdraw[overdraw_vertex_count-2] = overdraw[0]; + overdraw[overdraw_vertex_count-1] = overdraw[1]; + } +} + +void NoneJoinPolyline::render_overdraw(const std::vector &/*normals*/, float pixel_size, bool /*is_looping*/) +{ + overdraw_vertex_count = 4 * (vertex_count-2); // less than ideal + overdraw = new Vector[overdraw_vertex_count]; + for (size_t i = 2; i + 3 < vertex_count; i += 4) + { + Vector s = vertices[i] - vertices[i+3]; + Vector t = vertices[i] - vertices[i+1]; + s.normalize(pixel_size); + t.normalize(pixel_size); + + const size_t k = 4 * (i - 2); + overdraw[k ] = vertices[i]; + overdraw[k+1] = vertices[i] + s + t; + overdraw[k+2] = vertices[i+1] + s - t; + overdraw[k+3] = vertices[i+1]; + + overdraw[k+4] = vertices[i+1]; + overdraw[k+5] = vertices[i+1] + s - t; + overdraw[k+6] = vertices[i+2] - s - t; + overdraw[k+7] = vertices[i+2]; + + overdraw[k+8] = vertices[i+2]; + overdraw[k+9] = vertices[i+2] - s - t; + overdraw[k+10] = vertices[i+3] - s + t; + overdraw[k+11] = vertices[i+3]; + + overdraw[k+12] = vertices[i+3]; + overdraw[k+13] = vertices[i+3] - s + t; + overdraw[k+14] = vertices[i] + s + t; + overdraw[k+15] = vertices[i]; + } +} + +Polyline::~Polyline() +{ + if (vertices) + delete[] vertices; + if (overdraw) + delete[] overdraw; +} + +void Polyline::draw() +{ + gl.prepareDraw(); + + // draw the core line + gl.bindTexture(0); + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, (GLvoid *) vertices); + glDrawArrays(draw_mode, 0, vertex_count); + + if (overdraw) + { + // prepare colors: + Color c = gl.getColor(); + Color *colors = new Color[overdraw_vertex_count]; + fill_color_array(colors, c); + + gl.enableVertexAttribArray(OpenGL::ATTRIB_COLOR); + + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, 0, (GLvoid *) overdraw); + gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, 0, (GLvoid *) colors); + + glDrawArrays(draw_mode, 0, overdraw_vertex_count); + + gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR); + gl.setColor(c); + + delete[] colors; + } + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); +} + +void Polyline::fill_color_array(Color *colors, const Color &c) +{ + for (size_t i = 0; i < overdraw_vertex_count; ++i) + { + colors[i] = c; + // avoids branching. equiv to if (i%2 == 1) colors[i].a = 0; + colors[i].a *= GLubyte((i+1) % 2); + } +} + +void NoneJoinPolyline::fill_color_array(Color *colors, const Color &c) +{ + for (size_t i = 0; i < overdraw_vertex_count; ++i) + { + colors[i] = c; + // if (i % 4 == 1 || i % 4 == 2) colors[i].a = 0 + colors[i].a *= GLubyte((i+1) % 4 < 2); + } +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/Polyline.h b/jni/love/src/modules/graphics/opengl/Polyline.h new file mode 100644 index 00000000..32071bb7 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Polyline.h @@ -0,0 +1,168 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_POLYLINE_H +#define LOVE_GRAPHICS_OPENGL_POLYLINE_H + +#include + +// LOVE +#include "common/Vector.h" + +// OpenGL +#include "OpenGL.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +/** + * Abstract base class for a chain of segments. + * @author Matthias Richter + **/ +class Polyline +{ +public: + Polyline(GLenum mode = GL_TRIANGLE_STRIP) + : vertices(NULL) + , overdraw(NULL) + , vertex_count(0) + , overdraw_vertex_count(0) + , draw_mode(mode) + {} + virtual ~Polyline(); + + /** + * @param vertices Vertices defining the core line segments + * @param count Number of coordinates (= size of the array vertices) + * @param size_hint Expected number of vertices of the rendering sleeve around the core line. + * @param halfwidth linewidth / 2. + * @param pixel_size Dimension of one pixel on the screen in world coordinates. + * @param draw_overdraw Fake antialias the line. + */ + void render(const float *vertices, size_t count, size_t size_hint, float halfwidth, float pixel_size, bool draw_overdraw); + + /** Draws the line on the screen + */ + void draw(); + +protected: + virtual void render_overdraw(const std::vector &normals, float pixel_size, bool is_looping); + virtual void fill_color_array(Color *colors, const Color &c); + + /** Calculate line boundary points. + * + * @param[out] anchors Anchor points defining the core line. + * @param[out] normals Normals defining the edge of the sleeve. + * @param[in,out] s Direction of segment pq (updated to the segment qr). + * @param[in,out] len_s Length of segment pq (updated to the segment qr). + * @param[in,out] ns Normal on the segment pq (updated to the segment qr). + * @param[in] q Current point on the line. + * @param[in] r Next point on the line. + * @param[in] hw Half line width (see Polyline.render()). + */ + virtual void renderEdge(std::vector &anchors, std::vector &normals, + Vector &s, float &len_s, Vector &ns, + const Vector &q, const Vector &r, float hw) = 0; + + Vector *vertices; + Vector *overdraw; + size_t vertex_count; + size_t overdraw_vertex_count; + GLenum draw_mode; + +}; // Polyline + + +/** + * A Polyline whose segments are not connected. + * @author Matthias Richter + */ +class NoneJoinPolyline : public Polyline +{ +public: + NoneJoinPolyline() + // TODO: replace GL_QUADS (indexed triangles?) + : Polyline(GL_QUADS) + {} + + void render(const float *vertices, size_t count, float halfwidth, float pixel_size, bool draw_overdraw) + { + Polyline::render(vertices, count, 2 * count - 4, halfwidth, pixel_size, draw_overdraw); + // discard the first and last two vertices. (these are redundant) + for (size_t i = 0; i < vertex_count - 2; ++i) + this->vertices[i] = this->vertices[i+2]; + vertex_count -= 2; + } + +protected: + virtual void render_overdraw(const std::vector &normals, float pixel_size, bool is_looping); + virtual void fill_color_array(Color *colors, const Color &c); + virtual void renderEdge(std::vector &anchors, std::vector &normals, + Vector &s, float &len_s, Vector &ns, + const Vector &q, const Vector &r, float hw); +}; + + +/** + * A Polyline whose segments are connected by a sharp edge. + * @author Matthias Richter + */ +class MiterJoinPolyline : public Polyline +{ +public: + void render(const float *vertices, size_t count, float halfwidth, float pixel_size, bool draw_overdraw) + { + Polyline::render(vertices, count, count, halfwidth, pixel_size, draw_overdraw); + } + +protected: + virtual void renderEdge(std::vector &anchors, std::vector &normals, + Vector &s, float &len_s, Vector &ns, + const Vector &q, const Vector &r, float hw); +}; + + +/** + * A Polyline whose segments are connected by a flat edge. + * @author Matthias Richter + */ +class BevelJoinPolyline : public Polyline +{ +public: + void render(const float *vertices, size_t count, float halfwidth, float pixel_size, bool draw_overdraw) + { + Polyline::render(vertices, count, 2 * count - 4, halfwidth, pixel_size, draw_overdraw); + } + +protected: + virtual void renderEdge(std::vector &anchors, std::vector &normals, + Vector &s, float &len_s, Vector &ns, + const Vector &q, const Vector &r, float hw); +}; + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_POLYLINE_H diff --git a/jni/love/src/modules/graphics/opengl/Shader.cpp b/jni/love/src/modules/graphics/opengl/Shader.cpp new file mode 100644 index 00000000..42aea223 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Shader.cpp @@ -0,0 +1,803 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" + +#include "Shader.h" +#include "Graphics.h" + +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +namespace +{ + // temporarily attaches a shader program (for setting uniforms, etc) + // reattaches the originally active program when destroyed + struct TemporaryAttacher + { + TemporaryAttacher(Shader *shader) + : curShader(shader) + , prevShader(Shader::current) + { + curShader->attach(true); + } + + ~TemporaryAttacher() + { + if (prevShader != nullptr) + prevShader->attach(); + else + curShader->detach(); + } + + Shader *curShader; + Shader *prevShader; + }; +} // anonymous namespace + + +Shader *Shader::current = nullptr; +Shader *Shader::defaultShader = nullptr; + +Shader::ShaderSources Shader::defaultCode[Graphics::RENDERER_MAX_ENUM]; + +GLint Shader::maxTextureUnits = 0; +std::vector Shader::textureCounters; + +Shader::Shader(const ShaderSources &sources) + : shaderSources(sources) + , program(0) + , builtinUniforms() +{ + if (shaderSources.empty()) + throw love::Exception("Cannot create shader: no source code!"); + + if (maxTextureUnits <= 0) + { + GLint maxtexunits; + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxtexunits); + maxTextureUnits = std::max(maxtexunits - 1, 0); + } + + // initialize global texture id counters if needed + if (textureCounters.size() < (size_t) maxTextureUnits) + textureCounters.resize(maxTextureUnits, 0); + + // load shader source and create program object + loadVolatile(); +} + +Shader::~Shader() +{ + if (current == this) + detach(); + + for (auto it = boundRetainables.begin(); it != boundRetainables.end(); ++it) + { + it->second->release(); + boundRetainables.erase(it); + } + + unloadVolatile(); +} + +GLuint Shader::compileCode(ShaderType type, const std::string &code) +{ + GLenum glshadertype; + const char *typestr; + + if (!typeNames.find(type, typestr)) + typestr = ""; + + switch (type) + { + case TYPE_VERTEX: + glshadertype = GL_VERTEX_SHADER; + break; + case TYPE_PIXEL: + glshadertype = GL_FRAGMENT_SHADER; + break; + default: + throw love::Exception("Cannot create shader object: unknown shader type."); + break; + } + + // clear existing errors + while (glGetError() != GL_NO_ERROR); + + GLuint shaderid = glCreateShader(glshadertype); + + if (shaderid == 0) // oh no! + { + GLenum err = glGetError(); + + if (err == GL_INVALID_ENUM) + throw love::Exception("Cannot create %s shader object: %s shaders not supported.", typestr, typestr); + else + throw love::Exception("Cannot create %s shader object.", typestr); + } + + const char *src = code.c_str(); + size_t srclen = code.length(); + glShaderSource(shaderid, 1, (const GLchar **)&src, (GLint *)&srclen); + + glCompileShader(shaderid); + + // Get any warnings the shader compiler may have produced. + GLint infologlen; + glGetShaderiv(shaderid, GL_INFO_LOG_LENGTH, &infologlen); + + GLchar *infolog = new GLchar[infologlen + 1]; + glGetShaderInfoLog(shaderid, infologlen, nullptr, infolog); + + // Save any warnings for later querying. + if (infologlen > 0) + shaderWarnings[type] = infolog; + + delete[] infolog; + + GLint status; + glGetShaderiv(shaderid, GL_COMPILE_STATUS, &status); + + if (status == GL_FALSE) + { + throw love::Exception("Cannot compile %s shader code:\n%s", + typestr, shaderWarnings[type].c_str()); + } + + return shaderid; +} + +void Shader::createProgram(const std::vector &shaderids) +{ + program = glCreateProgram(); + if (program == 0) + throw love::Exception("Cannot create shader program object."); + + std::vector::const_iterator it; + for (it = shaderids.begin(); it != shaderids.end(); ++it) + glAttachShader(program, *it); + + // We use generic vertex attributes in OpenGL ES 2, so we have to bind the + // attribute indices to names in the shader. + if (GLAD_ES_VERSION_2_0) + { + const char *name = nullptr; + for (int i = 0; i < int(OpenGL::ATTRIB_MAX_ENUM); i++) + { + if (attribNames.find(OpenGL::VertexAttrib(i), name)) + glBindAttribLocation(program, i, (const GLchar *) name); + } + + } + + glLinkProgram(program); + + // flag shaders for auto-deletion when the program object is deleted. + for (it = shaderids.begin(); it != shaderids.end(); ++it) + glDeleteShader(*it); + + GLint status; + glGetProgramiv(program, GL_LINK_STATUS, &status); + + if (status == GL_FALSE) + { + std::string warnings = getProgramWarnings(); + glDeleteProgram(program); + program = 0; + + throw love::Exception("Cannot link shader program object:\n%s", warnings.c_str()); + } +} + +void Shader::mapActiveUniforms() +{ + uniforms.clear(); + + GLint numuniforms; + glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &numuniforms); + + GLsizei bufsize; + glGetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, (GLint *) &bufsize); + + if (bufsize <= 0) + return; + + for (int i = 0; i < numuniforms; i++) + { + GLchar *cname = new GLchar[bufsize]; + GLsizei namelength; + + Uniform u; + + glGetActiveUniform(program, (GLuint) i, bufsize, &namelength, &u.count, &u.type, cname); + + u.name = std::string(cname, (size_t) namelength); + u.location = glGetUniformLocation(program, u.name.c_str()); + u.baseType = getUniformBaseType(u.type); + + delete[] cname; + + // glGetActiveUniform appends "[0]" to the end of array uniform names... + if (u.name.length() > 3) + { + size_t findpos = u.name.find("[0]"); + if (findpos != std::string::npos && findpos == u.name.length() - 3) + u.name.erase(u.name.length() - 3); + } + + // Store the uniform locations for any built-in extern variables, in ES. + if (GLAD_ES_VERSION_2_0) + { + BuiltinExtern builtin; + if (builtinNames.find(u.name.c_str(), builtin)) + builtinUniforms[int(builtin)] = u.location; + } + + if (u.location != -1) + uniforms[u.name] = u; + } +} + +bool Shader::loadVolatile() +{ + // zero out active texture list + activeTextureUnits.clear(); + activeTextureUnits.insert(activeTextureUnits.begin(), maxTextureUnits, 0); + + // Built-in uniform locations default to -1 (nonexistant.) + for (int i = 0; i < int(BUILTIN_MAX_ENUM); i++) + builtinUniforms[i] = -1; + + std::vector shaderids; + + ShaderSources::const_iterator source; + for (source = shaderSources.begin(); source != shaderSources.end(); ++source) + { + GLuint shaderid = compileCode(source->first, source->second); + shaderids.push_back(shaderid); + } + + // All shader programs in ES2 must have a vertex and pixel shader. + if (GLAD_ES_VERSION_2_0) + { + ShaderSources &defaults = defaultCode[Graphics::RENDERER_OPENGLES]; + + source = shaderSources.find(TYPE_VERTEX); + if (source == shaderSources.end()) + shaderids.push_back(compileCode(TYPE_VERTEX, defaults[TYPE_VERTEX])); + + source = shaderSources.find(TYPE_PIXEL); + if (source == shaderSources.end()) + shaderids.push_back(compileCode(TYPE_PIXEL, defaults[TYPE_PIXEL])); + } + + if (shaderids.empty()) + throw love::Exception("Cannot create shader: no valid source code!"); + + createProgram(shaderids); + + // Retrieve all active uniform variables in this shader from OpenGL. + mapActiveUniforms(); + + if (current == this) + { + // make sure glUseProgram gets called. + current = nullptr; + attach(); + } + + return true; +} + +void Shader::unloadVolatile() +{ + if (current == this) + glUseProgram(0); + + if (program != 0) + { + glDeleteProgram(program); + program = 0; + } + + // decrement global texture id counters for texture units which had textures bound from this shader + for (size_t i = 0; i < activeTextureUnits.size(); ++i) + { + if (activeTextureUnits[i] > 0) + textureCounters[i] = std::max(textureCounters[i] - 1, 0); + } + + // active texture list is probably invalid, clear it + activeTextureUnits.clear(); + activeTextureUnits.insert(activeTextureUnits.begin(), maxTextureUnits, 0); + + // same with uniform location list + uniforms.clear(); + + // And the locations of any built-in uniform variables. + for (int i = 0; i < int(BUILTIN_MAX_ENUM); i++) + builtinUniforms[i] = -1; + + shaderWarnings.clear(); +} + +std::string Shader::getProgramWarnings() const +{ + GLint strlen, nullpos; + glGetProgramiv(program, GL_INFO_LOG_LENGTH, &strlen); + + char *tempstr = new char[strlen+1]; + // be extra sure that the error string will be 0-terminated + memset(tempstr, '\0', strlen+1); + glGetProgramInfoLog(program, strlen, &nullpos, tempstr); + tempstr[nullpos] = '\0'; + + std::string warnings(tempstr); + delete[] tempstr; + + return warnings; +} + +std::string Shader::getWarnings() const +{ + std::string warnings; + const char *typestr; + + // Get the individual shader stage warnings + std::map::const_iterator it; + for (it = shaderWarnings.begin(); it != shaderWarnings.end(); ++it) + { + if (typeNames.find(it->first, typestr)) + warnings += std::string(typestr) + std::string(" shader:\n") + it->second; + } + + warnings += getProgramWarnings(); + + return warnings; +} + +void Shader::attach(bool temporary) +{ + Shader *oldshader = current; + if (oldshader != this) + { + glUseProgram(program); + + current = this; + current->retain(); + + if (oldshader != nullptr) + oldshader->release(); + } + + if (!temporary) + { + // make sure all sent textures are properly bound to their respective texture units + // note: list potentially contains texture ids of deleted/invalid textures! + for (size_t i = 0; i < activeTextureUnits.size(); ++i) + { + if (activeTextureUnits[i] > 0) + gl.bindTextureToUnit(activeTextureUnits[i], i + 1, false); + } + + // We always want to use texture unit 0 for everyhing else. + gl.setTextureUnit(0); + } +} + +void Shader::detach() +{ + // We always need a shader set in ES2. + if (GLAD_ES_VERSION_2_0) + { + if (defaultShader && current != defaultShader) + defaultShader->attach(); + } + else + { + if (current != nullptr) + { + glUseProgram(0); + current = nullptr; + current->release(); + } + } +} + +const Shader::Uniform &Shader::getUniform(const std::string &name) const +{ + std::map::const_iterator it = uniforms.find(name); + + if (it == uniforms.end()) + throw love::Exception("Variable '%s' does not exist.\n" + "A common error is to define but not use the variable.", name.c_str()); + + return it->second; +} + +int Shader::getUniformTypeSize(GLenum type) const +{ + switch (type) + { + case GL_INT: + case GL_FLOAT: + case GL_BOOL: + case GL_SAMPLER_1D: + case GL_SAMPLER_2D: + case GL_SAMPLER_3D: + return 1; + case GL_INT_VEC2: + case GL_FLOAT_VEC2: + case GL_FLOAT_MAT2: + case GL_BOOL_VEC2: + return 2; + case GL_INT_VEC3: + case GL_FLOAT_VEC3: + case GL_FLOAT_MAT3: + case GL_BOOL_VEC3: + return 3; + case GL_INT_VEC4: + case GL_FLOAT_VEC4: + case GL_FLOAT_MAT4: + case GL_BOOL_VEC4: + return 4; + default: + break; + } + + return 1; +} + +Shader::UniformType Shader::getUniformBaseType(GLenum type) const +{ + switch (type) + { + case GL_INT: + case GL_INT_VEC2: + case GL_INT_VEC3: + case GL_INT_VEC4: + return UNIFORM_INT; + case GL_FLOAT: + case GL_FLOAT_VEC2: + case GL_FLOAT_VEC3: + case GL_FLOAT_VEC4: + case GL_FLOAT_MAT2: + case GL_FLOAT_MAT3: + case GL_FLOAT_MAT4: + return UNIFORM_FLOAT; + case GL_BOOL: + case GL_BOOL_VEC2: + case GL_BOOL_VEC3: + case GL_BOOL_VEC4: + return UNIFORM_BOOL; + case GL_SAMPLER_1D: + case GL_SAMPLER_2D: + case GL_SAMPLER_3D: + return UNIFORM_SAMPLER; + default: + break; + } + + return UNIFORM_UNKNOWN; +} + +void Shader::checkSetUniformError(const Uniform &u, int size, int count, UniformType sendtype) const +{ + if (!program) + throw love::Exception("No active shader program."); + + int realsize = getUniformTypeSize(u.type); + + if (size != realsize) + throw love::Exception("Value size of %d does not match variable size of %d.", size, realsize); + + if ((u.count == 1 && count > 1) || count < 0) + throw love::Exception("Invalid number of values (expected %d, got %d).", u.count, count); + + if (u.baseType == UNIFORM_SAMPLER && sendtype != u.baseType) + throw love::Exception("Cannot send a value of this type to an Image variable."); + + if ((sendtype == UNIFORM_FLOAT && u.baseType == UNIFORM_INT) || (sendtype == UNIFORM_INT && u.baseType == UNIFORM_FLOAT)) + throw love::Exception("Cannot convert between float and int."); +} + +void Shader::sendInt(const std::string &name, int size, const GLint *vec, int count) +{ + TemporaryAttacher attacher(this); + + const Uniform &u = getUniform(name); + checkSetUniformError(u, size, count, UNIFORM_INT); + + switch (size) + { + case 4: + glUniform4iv(u.location, count, vec); + break; + case 3: + glUniform3iv(u.location, count, vec); + break; + case 2: + glUniform2iv(u.location, count, vec); + break; + case 1: + default: + glUniform1iv(u.location, count, vec); + break; + } +} + +void Shader::sendFloat(const std::string &name, int size, const GLfloat *vec, int count) +{ + TemporaryAttacher attacher(this); + + const Uniform &u = getUniform(name); + checkSetUniformError(u, size, count, UNIFORM_FLOAT); + + switch (size) + { + case 4: + glUniform4fv(u.location, count, vec); + break; + case 3: + glUniform3fv(u.location, count, vec); + break; + case 2: + glUniform2fv(u.location, count, vec); + break; + case 1: + default: + glUniform1fv(u.location, count, vec); + break; + } +} + +void Shader::sendMatrix(const std::string &name, int size, const GLfloat *m, int count) +{ + TemporaryAttacher attacher(this); + + if (size < 2 || size > 4) + { + throw love::Exception("Invalid matrix size: %dx%d " + "(can only set 2x2, 3x3 or 4x4 matrices.)", size,size); + } + + const Uniform &u = getUniform(name); + checkSetUniformError(u, size, count, UNIFORM_FLOAT); + + switch (size) + { + case 4: + glUniformMatrix4fv(u.location, count, GL_FALSE, m); + break; + case 3: + glUniformMatrix3fv(u.location, count, GL_FALSE, m); + break; + case 2: + default: + glUniformMatrix2fv(u.location, count, GL_FALSE, m); + break; + } +} + +void Shader::sendTexture(const std::string &name, GLuint texture) +{ + TemporaryAttacher attacher(this); + + int textureunit = getTextureUnit(name); + + const Uniform &u = getUniform(name); + checkSetUniformError(u, 1, 1, UNIFORM_SAMPLER); + + // bind texture to assigned texture unit and send uniform to shader program + gl.bindTextureToUnit(texture, textureunit, false); + + glUniform1i(u.location, textureunit); + + // reset texture unit + gl.setTextureUnit(0); + + // increment global shader texture id counter for this texture unit, if we haven't already + if (activeTextureUnits[textureunit-1] == 0) + ++textureCounters[textureunit-1]; + + // store texture id so it can be re-bound to the proper texture unit later + activeTextureUnits[textureunit-1] = texture; +} + +void Shader::retainTexture(const std::string &name, Object *texture) +{ + auto it = boundRetainables.find(name); + if (it != boundRetainables.end()) + it->second->release(); + + texture->retain(); + boundRetainables[name] = texture; +} + +void Shader::sendImage(const std::string &name, Image &image) +{ + sendTexture(name, image.getTextureName()); + retainTexture(name, &image); +} + +void Shader::sendCanvas(const std::string &name, Canvas &canvas) +{ + sendTexture(name, canvas.getTextureName()); + retainTexture(name, &canvas); +} + +int Shader::getTextureUnit(const std::string &name) +{ + auto it = textureUnitPool.find(name); + + if (it != textureUnitPool.end()) + return it->second; + + int textureunit = 1; + + // prefer texture units which are unused by all other shaders + auto freeunit_it = std::find(textureCounters.begin(), textureCounters.end(), 0); + + if (freeunit_it != textureCounters.end()) + { + // we don't want to use unit 0 + textureunit = std::distance(textureCounters.begin(), freeunit_it) + 1; + } + else + { + // no completely unused texture units exist, try to use next free slot in our own list + auto nextunit_it = std::find(activeTextureUnits.begin(), activeTextureUnits.end(), 0); + + if (nextunit_it == activeTextureUnits.end()) + throw love::Exception("No more texture units available for shader."); + + // we don't want to use unit 0 + textureunit = std::distance(activeTextureUnits.begin(), nextunit_it) + 1; + } + + textureUnitPool[name] = textureunit; + return textureunit; +} + +bool Shader::hasBuiltinUniform(love::graphics::opengl::Shader::BuiltinExtern builtin) const +{ + return builtinUniforms[int(builtin)] != -1; +} + +bool Shader::sendBuiltinMatrix(BuiltinExtern builtin, int size, const GLfloat *m, int count) +{ + if (!hasBuiltinUniform(builtin)) + return false; + + GLint location = builtinUniforms[GLint(builtin)]; + + TemporaryAttacher attacher(this); + + switch (size) + { + case 2: + glUniformMatrix2fv(location, count, GL_FALSE, m); + break; + case 3: + glUniformMatrix3fv(location, count, GL_FALSE, m); + break; + case 4: + glUniformMatrix4fv(location, count, GL_FALSE, m); + break; + default: + return false; + } + + return true; +} + +bool Shader::sendBuiltinFloat(BuiltinExtern builtin, int size, const GLfloat *vec, int count) +{ + if (!hasBuiltinUniform(builtin)) + return false; + + GLint location = builtinUniforms[GLint(builtin)]; + + TemporaryAttacher attacher(this); + + switch (size) + { + case 1: + glUniform1fv(location, count, vec); + break; + case 2: + glUniform2fv(location, count, vec); + break; + case 3: + glUniform3fv(location, count, vec); + break; + case 4: + glUniform4fv(location, count, vec); + break; + default: + return false; + } + + return true; +} + +std::string Shader::getGLSLVersion() +{ + const char *tmp = nullptr; + + // GL_SHADING_LANGUAGE_VERSION isn't available in OpenGL < 2.0. + if (GLAD_ES_VERSION_2_0 || GLAD_VERSION_2_0 || GLAD_ARB_shading_language_100) + tmp = (const char *) glGetString(GL_SHADING_LANGUAGE_VERSION); + + if (tmp == nullptr) + return "0.0"; + + // the version string always begins with a version number of the format + // major_number.minor_number + // or + // major_number.minor_number.release_number + // we can keep release_number, since it does not affect the check below. + std::string versionstring(tmp); + size_t minorendpos = versionstring.find(' '); + return versionstring.substr(0, minorendpos); +} + +bool Shader::isSupported() +{ + return GLAD_ES_VERSION_2_0 || (GLAD_VERSION_2_0 && getGLSLVersion() >= "1.2"); +} + +StringMap::Entry Shader::typeNameEntries[] = +{ + {"vertex", Shader::TYPE_VERTEX}, + {"pixel", Shader::TYPE_PIXEL}, +}; + +StringMap Shader::typeNames(Shader::typeNameEntries, sizeof(Shader::typeNameEntries)); + +StringMap::Entry Shader::attribNameEntries[] = +{ + {"VertexPosition", OpenGL::ATTRIB_POS}, + {"VertexTexCoord", OpenGL::ATTRIB_TEXCOORD}, + {"VertexColor", OpenGL::ATTRIB_COLOR}, +}; + +StringMap Shader::attribNames(Shader::attribNameEntries, sizeof(Shader::attribNameEntries)); + +StringMap::Entry Shader::builtinNameEntries[] = +{ + {"TransformMatrix", Shader::BUILTIN_TRANSFORM_MATRIX}, + {"ProjectionMatrix", Shader::BUILTIN_PROJECTION_MATRIX}, + {"TransformProjectionMatrix", Shader::BUILTIN_TRANSFORM_PROJECTION_MATRIX}, + {"love_PointSize", Shader::BUILTIN_POINT_SIZE}, +}; + +StringMap Shader::builtinNames(Shader::builtinNameEntries, sizeof(Shader::builtinNameEntries)); + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/Shader.h b/jni/love/src/modules/graphics/opengl/Shader.h new file mode 100644 index 00000000..23a33273 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/Shader.h @@ -0,0 +1,252 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_SHADER_H +#define LOVE_GRAPHICS_SHADER_H + +// LOVE +#include "common/Object.h" +#include "common/StringMap.h" +#include "graphics/Graphics.h" +#include "OpenGL.h" +#include "Image.h" +#include "Canvas.h" + +// STL +#include +#include +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ +// A GLSL shader +class Shader : public Object, public Volatile +{ +public: + + // Pointer to currently active Shader. + static Shader *current; + + // Pointer to the current default Shader. + static Shader *defaultShader; + + enum ShaderType + { + TYPE_VERTEX, + TYPE_PIXEL, + TYPE_MAX_ENUM + }; + + // Built-in extern (uniform) variables. + enum BuiltinExtern + { + BUILTIN_TRANSFORM_MATRIX = 0, + BUILTIN_PROJECTION_MATRIX, + BUILTIN_TRANSFORM_PROJECTION_MATRIX, + BUILTIN_POINT_SIZE, + BUILTIN_MAX_ENUM + }; + + // Type for a list of shader source codes in the form of sources[shadertype] = code + typedef std::map ShaderSources; + + /** + * Creates a new Shader using a list of source codes. + * Sources must contain either vertex or pixel shader code, or both. + **/ + Shader(const ShaderSources &sources); + + virtual ~Shader(); + + // Implements Volatile + virtual bool loadVolatile(); + virtual void unloadVolatile(); + + /** + * Binds this Shader's program to be used when rendering. + * + * @param temporary True if we just want to send values to the shader with no intention of rendering. + **/ + void attach(bool temporary = false); + + /** + * Detach the currently bound Shader. + * Causes the GPU rendering pipeline to use fixed functionality in place of shader programs. + **/ + static void detach(); + + /** + * Returns any warnings this Shader may have generated. + **/ + std::string getWarnings() const; + + /** + * Send at least one integer or int-vector value to this Shader as a uniform. + * + * @param name The name of the uniform variable in the source code. + * @param size Number of elements in each vector to send. + * A value of 1 indicates a single-component vector (an int). + * @param vec Pointer to the integer or int-vector values. + * @param count Number of integer or int-vector values. + **/ + void sendInt(const std::string &name, int size, const GLint *vec, int count); + + /** + * Send at least one float or vector value to this Shader as a uniform. + * + * @param name The name of the uniform variable in the source code. + * @param size Number of elements in each vector to send. + * A value of 1 indicates a single-component vector (a float). + * @param vec Pointer to the float or float-vector values. + * @param count Number of float or float-vector values. + **/ + void sendFloat(const std::string &name, int size, const GLfloat *vec, int count); + + /** + * Send at least one matrix to this Shader as a uniform. + * + * @param name The name of the uniform variable in the source code. + * @param size Number of rows/columns in the matrix. + * @param m Pointer to the first element of the first matrix. + * @param count Number of matrices to send. + **/ + void sendMatrix(const std::string &name, int size, const GLfloat *m, int count); + + /** + * Send an image to this Shader as a uniform. + * + * @param name The name of the uniform variable in the source code. + **/ + void sendImage(const std::string &name, Image &image); + + /** + * Send a canvas to this Shader as a uniform. + * + * @param name The name of the uniform variable in the source code. + **/ + void sendCanvas(const std::string &name, Canvas &canvas); + + /** + * Internal use only. + **/ + bool hasBuiltinUniform(BuiltinExtern builtin) const; + bool sendBuiltinMatrix(BuiltinExtern builtin, int size, const GLfloat *m, int count); + bool sendBuiltinFloat(BuiltinExtern builtin, int size, const GLfloat *m, int count); + + static std::string getGLSLVersion(); + static bool isSupported(); + + // Default code used when renderers require code for a shader stage. + static ShaderSources defaultCode[Graphics::RENDERER_MAX_ENUM]; + +private: + + // Types of potential uniform variables used in love's shaders. + enum UniformType + { + UNIFORM_FLOAT, + UNIFORM_INT, + UNIFORM_BOOL, + UNIFORM_SAMPLER, + UNIFORM_UNKNOWN + }; + + // Represents a single uniform/extern shader variable. + struct Uniform + { + GLint location; + GLint count; + GLenum type; + UniformType baseType; + std::string name; + }; + + // Map active uniform names to their locations. + void mapActiveUniforms(); + + const Uniform &getUniform(const std::string &name) const; + + int getUniformTypeSize(GLenum type) const; + UniformType getUniformBaseType(GLenum type) const; + void checkSetUniformError(const Uniform &u, int size, int count, UniformType sendtype) const; + + GLuint compileCode(ShaderType type, const std::string &code); + void createProgram(const std::vector &shaderids); + + int getTextureUnit(const std::string &name); + + void sendTexture(const std::string &name, GLuint texture); + void retainTexture(const std::string &name, Object *texture); + + // Get any warnings or errors generated only by the shader program object. + std::string getProgramWarnings() const; + + + // List of all shader code attached to this Shader + ShaderSources shaderSources; + + // Shader compiler warning strings for individual shader stages. + std::map shaderWarnings; + + // volatile + GLuint program; + + // Locations for any built-in uniform variables. + GLint builtinUniforms[BUILTIN_MAX_ENUM]; + + // Uniform location buffer map + std::map uniforms; + + // Texture unit pool for setting images + std::map textureUnitPool; // textureUnitPool[name] = textureunit + std::vector activeTextureUnits; // activeTextureUnits[textureunit-1] = textureid + + // Uniform name to retainable objects + std::map boundRetainables; + + // Max GPU texture units available for sent images + static GLint maxTextureUnits; + + // Counts total number of textures bound to each texture unit in all shaders + static std::vector textureCounters; + + + static StringMap::Entry typeNameEntries[]; + static StringMap typeNames; + + // Names for the generic vertex attributes used in OpenGL ES 2. + static StringMap::Entry attribNameEntries[]; + static StringMap attribNames; + + // Names for the uniform matrices used in OpenGL ES 2. + static StringMap::Entry builtinNameEntries[]; + static StringMap builtinNames; + +}; // Shader + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_SHADER_H diff --git a/jni/love/src/modules/graphics/opengl/SpriteBatch.cpp b/jni/love/src/modules/graphics/opengl/SpriteBatch.cpp new file mode 100644 index 00000000..d02e5e06 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/SpriteBatch.cpp @@ -0,0 +1,358 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" +#include "SpriteBatch.h" + +// OpenGL +#include "OpenGL.h" + +// LOVE +#include "Image.h" +#include "VertexBuffer.h" + +// C++ +#include + +// C +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +SpriteBatch::SpriteBatch(Image *image, int size, int usage) + : image(image) + , size(size) + , next(0) + , color(0) + , array_buf(0) + , element_buf(0) +{ + if (size <= 0) + throw love::Exception("Invalid SpriteBatch size."); + + GLenum gl_usage; + switch (usage) + { + default: + case USAGE_DYNAMIC: + gl_usage = GL_DYNAMIC_DRAW; + break; + case USAGE_STATIC: + gl_usage = GL_STATIC_DRAW; + break; + case USAGE_STREAM: + gl_usage = GL_STREAM_DRAW; + break; + } + + const size_t vertex_size = sizeof(Vertex) * 4 * size; + + try + { + array_buf = VertexBuffer::Create(vertex_size, GL_ARRAY_BUFFER, gl_usage); + element_buf = new VertexIndex(size); + } + catch (love::Exception &) + { + delete array_buf; + delete element_buf; + throw; + } + catch (std::bad_alloc &) + { + delete array_buf; + delete element_buf; + throw love::Exception("Out of memory."); + } + + image->retain(); +} + +SpriteBatch::~SpriteBatch() +{ + image->release(); + + delete color; + delete array_buf; + delete element_buf; +} + +int SpriteBatch::add(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky, int index /*= -1*/) +{ + // Only do this if there's a free slot. + if ((index == -1 && next >= size) || index < -1 || index >= size) + return -1; + + // Needed for colors. + memcpy(sprite, image->getVertices(), sizeof(Vertex)*4); + + // Transform. + static Matrix t; + t.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky); + t.transform(sprite, sprite, 4); + + if (color) + setColorv(sprite, *color); + + addv(sprite, (index == -1) ? next : index); + + // Increment counter. + if (index == -1) + return next++; + + return index; +} + +int SpriteBatch::addq(Quad *quad, float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky, int index /*= -1*/) +{ + // Only do this if there's a free slot. + if ((index == -1 && next >= size) || index < -1 || index >= next) + return -1; + + // Needed for colors. + memcpy(sprite, quad->getVertices(), sizeof(Vertex) * 4); + + static Matrix t; + t.setTransformation(x, y, a, sx, sy, ox, oy, kx, ky); + t.transform(sprite, sprite, 4); + + if (color) + setColorv(sprite, *color); + + addv(sprite, (index == -1) ? next : index); + + // Increment counter. + if (index == -1) + return next++; + + return index; +} + +void SpriteBatch::clear() +{ + // Reset the position of the next index. + next = 0; +} + +void *SpriteBatch::lock() +{ + VertexBuffer::Bind bind(*array_buf); + + return array_buf->map(); +} + +void SpriteBatch::unlock() +{ + VertexBuffer::Bind bind(*array_buf); + + array_buf->unmap(); +} + +void SpriteBatch::setImage(Image *newimage) +{ + Object::AutoRelease imagerelease(image); + + newimage->retain(); + image = newimage; +} + +Image *SpriteBatch::getImage() +{ + return image; +} + +void SpriteBatch::setColor(const Color &color) +{ + if (!this->color) + this->color = new Color(color); + else + *(this->color) = color; +} + +void SpriteBatch::setColor() +{ + delete color; + color = 0; +} + +const Color *SpriteBatch::getColor() const +{ + return color; +} + +int SpriteBatch::getCount() const +{ + return next; +} + +void SpriteBatch::setBufferSize(int newsize) +{ + if (newsize <= 0) + throw love::Exception("Invalid SpriteBatch size."); + + if (newsize == size) + return; + + // Map (lock) the old VertexBuffer to get a pointer to its data. + void *old_data = lock(); + + size_t vertex_size = sizeof(Vertex) * 4 * newsize; + + VertexBuffer *new_array_buf = 0; + VertexIndex *new_element_buf = 0; + void *new_data = 0; + + try + { + new_array_buf = VertexBuffer::Create(vertex_size, array_buf->getTarget(), array_buf->getUsage()); + new_element_buf = new VertexIndex(newsize); + + // VBO::map can throw an exception. Also we want to scope the bind. + VertexBuffer::Bind bind(*new_array_buf); + new_data = new_array_buf->map(); + } + catch (love::Exception &) + { + delete new_array_buf; + delete new_element_buf; + unlock(); + throw; + } + + // Copy as much of the old data into the new VertexBuffer as can fit. + memcpy(new_data, old_data, sizeof(Vertex) * 4 * std::min(newsize, size)); + + // We don't need to unmap the old VertexBuffer since we're deleting it. + delete array_buf; + delete element_buf; + + array_buf = new_array_buf; + element_buf = new_element_buf; + size = newsize; + + next = std::min(next, newsize); + + // But we should unmap (unlock) the new one! + unlock(); +} + +int SpriteBatch::getBufferSize() const +{ + return size; +} + +void SpriteBatch::draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const +{ + const size_t vertex_offset = offsetof(Vertex, x); + const size_t texel_offset = offsetof(Vertex, s); + const size_t color_offset = offsetof(Vertex, r); + + if (next == 0) + return; + + Matrix t; + t.setTransformation(x, y, angle, sx, sy, ox, oy, kx, ky); + + gl.matrices.transform.push(gl.matrices.transform.top()); + gl.matrices.transform.top() *= t; + + image->predraw(); + + gl.prepareDraw(); + + VertexBuffer::Bind array_bind(*array_buf); + VertexBuffer::Bind element_bind(*element_buf->getVertexBuffer()); + + gl.enableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.enableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + gl.setVertexAttribArray(OpenGL::ATTRIB_POS, 2, GL_FLOAT, sizeof(Vertex), array_buf->getPointer(vertex_offset)); + gl.setVertexAttribArray(OpenGL::ATTRIB_TEXCOORD, 2, GL_FLOAT, sizeof(Vertex), array_buf->getPointer(texel_offset)); + + Color curcolor = gl.getColor(); + + // Apply per-sprite color, if a color is set. + if (color) + { + gl.enableVertexAttribArray(OpenGL::ATTRIB_COLOR); + gl.setVertexAttribArray(OpenGL::ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, sizeof(Vertex), array_buf->getPointer(color_offset)); + } + + glDrawElements(GL_TRIANGLES, element_buf->getIndexCount(next), element_buf->getType(), element_buf->getPointer(0)); + + gl.disableVertexAttribArray(OpenGL::ATTRIB_POS); + gl.disableVertexAttribArray(OpenGL::ATTRIB_TEXCOORD); + + if (color) + { + gl.disableVertexAttribArray(OpenGL::ATTRIB_COLOR); + gl.setColor(curcolor); + } + + image->postdraw(); + + gl.matrices.transform.pop(); +} + +void SpriteBatch::addv(const Vertex *v, int index) +{ + static const int sprite_size = 4 * sizeof(Vertex); // bytecount + VertexBuffer::Bind bind(*array_buf); + array_buf->fill(index * sprite_size, sprite_size, v); +} + +void SpriteBatch::setColorv(Vertex *v, const Color &color) +{ + for (size_t i = 0; i < 4; ++i) + { + v[i].r = color.r; + v[i].g = color.g; + v[i].b = color.b; + v[i].a = color.a; + } +} + +bool SpriteBatch::getConstant(const char *in, UsageHint &out) +{ + return usageHints.find(in, out); +} + +bool SpriteBatch::getConstant(UsageHint in, const char *&out) +{ + return usageHints.find(in, out); +} + +StringMap::Entry SpriteBatch::usageHintEntries[] = +{ + {"dynamic", SpriteBatch::USAGE_DYNAMIC}, + {"static", SpriteBatch::USAGE_STATIC}, + {"stream", SpriteBatch::USAGE_STREAM}, +}; + +StringMap SpriteBatch::usageHints(usageHintEntries, sizeof(usageHintEntries)); + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/SpriteBatch.h b/jni/love/src/modules/graphics/opengl/SpriteBatch.h new file mode 100644 index 00000000..f3ac4fe5 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/SpriteBatch.h @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H +#define LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H + +// C +#include + +// LOVE +#include "common/math.h" +#include "common/Object.h" +#include "common/Matrix.h" +#include "common/StringMap.h" +#include "graphics/Drawable.h" +#include "graphics/Volatile.h" +#include "graphics/Color.h" +#include "graphics/Quad.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +// Forward declarations. +class Image; +class VertexBuffer; +class VertexIndex; + +class SpriteBatch : public Drawable +{ +public: + + enum UsageHint + { + USAGE_DYNAMIC = 1, + USAGE_STATIC, + USAGE_STREAM, + USAGE_MAX_ENUM + }; + + SpriteBatch(Image *image, int size, int usage); + virtual ~SpriteBatch(); + + int add(float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky, int index = -1); + int addq(Quad *quad, float x, float y, float a, float sx, float sy, float ox, float oy, float kx, float ky, int index = -1); + void clear(); + + void *lock(); + void unlock(); + + void setImage(Image *newimage); + Image *getImage(); + + /** + * Set the current color for this SpriteBatch. The sprites added + * after this call will use this color. Note that global color + * will not longer apply to the SpriteBatch if this is used. + * + * @param color The color to use for the following sprites. + */ + void setColor(const Color &color); + + /** + * Disable per-sprite colors for this SpriteBatch. The next call to + * draw will use the global color for all sprites. + */ + void setColor(); + + /** + * Get the current color for this SpriteBatch. Returns NULL if no color is + * set. + **/ + const Color *getColor() const; + + /** + * Get the number of sprites currently in this SpriteBatch. + **/ + int getCount() const; + + /** + * Sets the total number of sprites this SpriteBatch can hold. + * Leaves existing sprite data intact when possible. + **/ + void setBufferSize(int newsize); + + /** + * Get the total number of sprites this SpriteBatch can hold. + **/ + int getBufferSize() const; + + // Implements Drawable. + void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const; + + static bool getConstant(const char *in, UsageHint &out); + static bool getConstant(UsageHint in, const char *&out); + +private: + + void addv(const Vertex *v, int index); + + /** + * Set the color for vertices. + * + * @param v The vertices to set the color for. Must be an array of + * of size 4. + * @param color The color to assign to each vertex. + */ + void setColorv(Vertex *v, const Color &color); + + Image *image; + + // Max number of sprites in the batch. + int size; + + // The next free element. + int next; + + Vertex sprite[4]; + + // Current color. This color, if present, will be applied to the next + // added sprite. + Color *color; + + VertexBuffer *array_buf; + VertexIndex *element_buf; + + static StringMap::Entry usageHintEntries[]; + static StringMap usageHints; + +}; // SpriteBatch + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H diff --git a/jni/love/src/modules/graphics/opengl/VertexBuffer.cpp b/jni/love/src/modules/graphics/opengl/VertexBuffer.cpp new file mode 100644 index 00000000..c3fdb588 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/VertexBuffer.cpp @@ -0,0 +1,468 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "VertexBuffer.h" + +#include "common/Exception.h" +#include "common/config.h" + +#include +#include +#include +#include + +// Conflicts with std::numeric_limits::max() (Windows). +#ifdef max +# undef max +#endif + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +// VertexBuffer + +VertexBuffer *VertexBuffer::Create(size_t size, GLenum target, GLenum usage, MemoryBacking backing) +{ + try + { + // Try to create a VBO. + return new VBO(size, target, usage, backing); + } + catch(const love::Exception &) + { + // VBO not supported ... create regular array. + return new VertexArray(size, target, usage, backing); + } +} + +VertexBuffer::VertexBuffer(size_t size, GLenum target, GLenum usage, MemoryBacking backing) + : is_bound(false) + , is_mapped(false) + , size(size) + , target(target) + , usage(usage) + , backing(backing) +{ +} + +VertexBuffer::~VertexBuffer() +{ +} + +// VertexArray + +VertexArray::VertexArray(size_t size, GLenum target, GLenum usage, MemoryBacking backing) + : VertexBuffer(size, target, usage, backing) + , buf(new char[size]) +{ +} + +VertexArray::~VertexArray() +{ + delete [] buf; +} + +void *VertexArray::map() +{ + is_mapped = true; + return buf; +} + +void VertexArray::unmap() +{ + is_mapped = false; +} + +void VertexArray::bind() +{ + is_bound = true; +} + +void VertexArray::unbind() +{ + is_bound = false; +} + +void VertexArray::fill(size_t offset, size_t size, const void *data) +{ + memcpy(buf + offset, data, size); +} + +const void *VertexArray::getPointer(size_t offset) const +{ + return buf + offset; +} + +// VBO + +VBO::VBO(size_t size, GLenum target, GLenum usage, MemoryBacking backing) + : VertexBuffer(size, target, usage, backing) + , vbo(0) + , memory_map(0) + , is_dirty(false) +{ + if (!(GLAD_ARB_vertex_buffer_object || GLAD_VERSION_1_5 || GLAD_ES_VERSION_2_0)) + throw love::Exception("Not supported"); + + // FIXME: + // ES2 can't do glGetBufferSubData. + if (GLAD_ES_VERSION_2_0) + backing = BACKING_FULL; + + if (getMemoryBacking() == BACKING_FULL) + memory_map = malloc(getSize()); + + bool ok = load(false); + + if (!ok) + { + free(memory_map); + throw love::Exception("Could not load VBO."); + } +} + +VBO::~VBO() +{ + if (vbo != 0) + unload(false); + + if (memory_map) + free(memory_map); +} + +void *VBO::map() +{ + if (is_mapped) + return memory_map; + + if (!memory_map) + { + memory_map = malloc(getSize()); + if (!memory_map) + throw love::Exception("Out of memory (oh the humanity!)"); + } + + if (is_dirty) + { + glGetBufferSubData(getTarget(), 0, getSize(), memory_map); + is_dirty = false; + } + + is_mapped = true; + + return memory_map; +} + +void VBO::unmap() +{ + if (!is_mapped) + return; + + // VBO::bind is a no-op when the VBO is mapped, so we have to make sure it's + // bound here. + if (!is_bound) + { + glBindBuffer(getTarget(), vbo); + is_bound = true; + } + + // "orphan" current buffer to avoid implicit synchronisation on the GPU: + // http://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-AsynchronousBufferTransfers.pdf + glBufferData(getTarget(), getSize(), NULL, getUsage()); + glBufferData(getTarget(), getSize(), memory_map, getUsage()); + + is_mapped = false; +} + +void VBO::bind() +{ + if (!is_mapped) + { + glBindBuffer(getTarget(), vbo); + is_bound = true; + } +} + +void VBO::unbind() +{ + if (is_bound) + glBindBuffer(getTarget(), 0); + + is_bound = false; +} + +void VBO::fill(size_t offset, size_t size, const void *data) +{ + if (is_mapped || getMemoryBacking() == BACKING_FULL) + memcpy(static_cast(memory_map) + offset, data, size); + + if (!is_mapped) + { + // Not all systems have access to some faster paths... + if (GLAD_APPLE_flush_buffer_range) + { + void *mapdata = glMapBuffer(getTarget(), GL_WRITE_ONLY); + + if (mapdata) + { + // We specified in VBO::load that we'll do manual flushing. + // Now we tell the driver it only needs to deal with the data + // we changed. + memcpy(static_cast(mapdata) + offset, data, size); + glFlushMappedBufferRangeAPPLE(getTarget(), offset, size); + } + + glUnmapBuffer(getTarget()); + } + else + { + // Fall back to a possibly slower SubData (more chance of syncing.) + glBufferSubData(getTarget(), offset, size, data); + } + + if (getMemoryBacking() != BACKING_FULL) + is_dirty = true; + } +} + +const void *VBO::getPointer(size_t offset) const +{ + return BUFFER_OFFSET(offset); +} + +bool VBO::loadVolatile() +{ + return load(true); +} + +void VBO::unloadVolatile() +{ + unload(true); +} + +bool VBO::load(bool restore) +{ + glGenBuffers(1, &vbo); + + VertexBuffer::Bind bind(*this); + + // Copy the old buffer only if 'restore' was requested. + const GLvoid *src = restore ? memory_map : 0; + + while (GL_NO_ERROR != glGetError()) + /* clear error messages */; + + // We don't want to flush the entire buffer when we just modify a small + // portion of it (VBO::fill without VBO::map), so we'll handle the flushing + // ourselves when we can. + if (GLAD_APPLE_flush_buffer_range) + glBufferParameteriAPPLE(getTarget(), GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE); + + // Note that if 'src' is '0', no data will be copied. + glBufferData(getTarget(), getSize(), src, getUsage()); + GLenum err = glGetError(); + + return (GL_NO_ERROR == err); +} + +void VBO::unload(bool save) +{ + // Save data before unloading, if we need to. + if (save && getMemoryBacking() == BACKING_PARTIAL) + { + VertexBuffer::Bind bind(*this); + + bool mapped = is_mapped; + + map(); // saves buffer content to memory_map. + is_mapped = mapped; + } + + glDeleteBuffers(1, &vbo); + vbo = 0; +} + + +// VertexIndex + +size_t VertexIndex::maxSize = 0; +size_t VertexIndex::elementSize = 0; +std::list VertexIndex::sizeRefs; +VertexBuffer *VertexIndex::element_array = NULL; + +VertexIndex::VertexIndex(size_t size) + : size(size) +{ + // The upper limit is the maximum of GLuint divided by six (the number + // of indices per size) and divided by the size of GLuint. This guarantees + // no overflows when calculating the array size in bytes. + // Memory issues will be handled by other exceptions. + if (size == 0 || size > ((GLuint) -1) / 6 / sizeof(GLuint)) + throw love::Exception("Invalid size."); + + addSize(size); +} + +VertexIndex::~VertexIndex() +{ + removeSize(size); +} + +size_t VertexIndex::getSize() const +{ + return size; +} + +size_t VertexIndex::getIndexCount(size_t elements) const +{ + return elements * 6; +} + +GLenum VertexIndex::getType(size_t s) const +{ + // Calculates if unsigned short is big enough to hold all the vertex indices. + static const GLenum type_table[] = {GL_UNSIGNED_SHORT, GL_UNSIGNED_INT}; + return type_table[s * 4 > std::numeric_limits::max()]; + // if buffer-size > max(GLushort) then GL_UNSIGNED_INT else GL_UNSIGNED_SHORT +} + +size_t VertexIndex::getElementSize() +{ + return elementSize; +} + +VertexBuffer *VertexIndex::getVertexBuffer() const +{ + return element_array; +} + +const void *VertexIndex::getPointer(size_t offset) const +{ + return element_array->getPointer(offset); +} + +void VertexIndex::addSize(size_t newSize) +{ + if (newSize <= maxSize) + { + // Current size is bigger. Append the size to list and sort. + sizeRefs.push_back(newSize); + sizeRefs.sort(); + return; + } + + // Try to resize before adding it to the list because resize may throw. + resize(newSize); + sizeRefs.push_back(newSize); +} + +void VertexIndex::removeSize(size_t oldSize) +{ + // TODO: For debugging purposes, this should check if the size was actually found. + sizeRefs.erase(std::find(sizeRefs.begin(), sizeRefs.end(), oldSize)); + if (sizeRefs.size() == 0) + { + resize(0); + return; + } + + if (oldSize == maxSize) + { + // Shrink if there's a smaller size. + size_t newSize = sizeRefs.back(); + if (newSize < maxSize) + resize(newSize); + } +} + +void VertexIndex::resize(size_t size) +{ + if (size == 0) + { + delete element_array; + element_array = NULL; + maxSize = 0; + return; + } + + VertexBuffer *new_element_array; + + // Depending on the size, a switch to int and more memory is needed. + GLenum target_type = getType(size); + size_t elem_size = (target_type == GL_UNSIGNED_SHORT) ? sizeof(GLushort) : sizeof(GLuint); + + size_t array_size = elem_size * 6 * size; + + // Create may throw out-of-memory exceptions. + // VertexIndex will propagate the exception and keep the old VertexBuffer. + try + { + new_element_array = VertexBuffer::Create(array_size, GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW); + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + // Allocation of the new VertexBuffer succeeded. + // The old VertexBuffer can now be deleted. + delete element_array; + element_array = new_element_array; + maxSize = size; + elementSize = elem_size; + + switch (target_type) + { + case GL_UNSIGNED_SHORT: + fill(); + break; + case GL_UNSIGNED_INT: + fill(); + break; + } +} + +template +void VertexIndex::fill() +{ + VertexBuffer::Bind bind(*element_array); + VertexBuffer::Mapper mapper(*element_array); + + T *indices = (T *) mapper.get(); + + for (size_t i = 0; i < maxSize; ++i) + { + indices[i*6+0] = i * 4 + 0; + indices[i*6+1] = i * 4 + 1; + indices[i*6+2] = i * 4 + 2; + + indices[i*6+3] = i * 4 + 0; + indices[i*6+4] = i * 4 + 2; + indices[i*6+5] = i * 4 + 3; + } +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/VertexBuffer.h b/jni/love/src/modules/graphics/opengl/VertexBuffer.h new file mode 100644 index 00000000..61b09817 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/VertexBuffer.h @@ -0,0 +1,519 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_VERTEX_BUFFER_H +#define LOVE_GRAPHICS_OPENGL_VERTEX_BUFFER_H + +// LOVE +#include "graphics/Volatile.h" + +// OpenGL +#include "OpenGL.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +/** + * VertexBuffer is an abstraction over VBOs (Vertex Buffer Objects), which + * falls back to regular vertex arrays if VBOs are not supported. + * + * This allows code to take advantage of VBOs where available, but still + * work on older systems where it's *not* available. Everyone's happy. + * + * The class is (for now) meant for internal use. + */ +class VertexBuffer +{ +public: + + // Different guarantees for VertexBuffer data storage. + enum MemoryBacking + { + // The VertexBuffer is will have a valid copy of its data in main memory + // at all times. + BACKING_FULL, + + // The VertexBuffer will have a valid copy of its data in main memory + // when it needs to be reloaded and when it's mapped. + BACKING_PARTIAL + }; + + /** + * Create a new VertexBuffer (either a plain vertex array, or a VBO), + * based on what's supported on the system. + * + * If VBOs are not supported, a plain vertex array will automatically + * be created and returned instead. + * + * @param size The size of the VertexBuffer (in bytes). + * @param target GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER. + * @param usage GL_DYNAMIC_DRAW, etc. + * @param backing Determines what guarantees are placed on the data. + * @return A new VertexBuffer. + */ + static VertexBuffer *Create(size_t size, GLenum target, GLenum usage, MemoryBacking backing = BACKING_PARTIAL); + + /** + * Constructor. + * + * @param size The size of the VertexBuffer in bytes. + * @param target The target VertexBuffer object, e.g. GL_ARRAY_BUFFER. + * @param usage Usage hint, e.g. GL_DYNAMIC_DRAW. + * @param backing Determines what guarantees are placed on the data. + */ + VertexBuffer(size_t size, GLenum target, GLenum usage, MemoryBacking backing = BACKING_PARTIAL); + + /** + * Destructor. Does nothing, but must be declared virtual. + */ + virtual ~VertexBuffer(); + + /** + * Get the size of the VertexBuffer, in bytes. + * + * @return The size of the VertexBuffer. + */ + size_t getSize() const + { + return size; + } + + /** + * Get the target buffer object. + * + * @return The target buffer object, e.g. GL_ARRAY_BUFFER. + */ + GLenum getTarget() const + { + return target; + } + + /** + * Get the usage hint for this VertexBuffer. + * + * @return The usage hint, e.g. GL_DYNAMIC_DRAW. + */ + GLenum getUsage() const + { + return usage; + } + + bool isBound() const + { + return is_bound; + } + + bool isMapped() const + { + return is_mapped; + } + + MemoryBacking getMemoryBacking() const + { + return backing; + } + + /** + * Map the VertexBuffer to client memory. + * + * This can be faster for large changes to the buffer. For smaller + * changes, see fill(). + * + * The VertexBuffer must be bound to use this function. + * + * @return A pointer to memory which represents the buffer. + */ + virtual void *map() = 0; + + /** + * Unmap a previously mapped VertexBuffer. The buffer must be unmapped + * when used to draw elements. + * + * The VertexBuffer must be bound to use this function. + */ + virtual void unmap() = 0; + + /** + * Bind the VertexBuffer to its specified target. + * (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, etc). + */ + virtual void bind() = 0; + + /** + * Unbind a prevously bound VertexBuffer. + */ + virtual void unbind() = 0; + + /** + * Fill a portion of the buffer with data. + * + * The VertexBuffer must be bound to use this function. + * + * @param offset The offset in the VertexBuffer to store the data. + * @param size The size of the incoming data. + * @param data Pointer to memory to copy data from. + */ + virtual void fill(size_t offset, size_t size, const void *data) = 0; + + /** + * Get a pointer which represents the specified byte offset. + * + * @param offset The byte offset. (0 is first byte). + * @return A pointer which represents the offset. + */ + virtual const void *getPointer(size_t offset) const = 0; + + /** + * This helper class can bind a VertexArray temporarily, and + * automatically un-bind when it's destroyed. + */ + class Bind + { + public: + + /** + * Bind a VertexBuffer. + */ + Bind(VertexBuffer &buf) + : buf(buf) + { + buf.bind(); + } + + /** + * Unbinds a VertexBuffer. + */ + ~Bind() + { + buf.unbind(); + } + + private: + + // VertexBuffer to work on. + VertexBuffer &buf; + }; + + class Mapper + { + public: + /** + * Memory-maps a VertexBuffer. + */ + Mapper(VertexBuffer &buffer) + : buf(buffer) + { + elems = buf.map(); + } + + /** + * unmaps the buffer + */ + ~Mapper() + { + buf.unmap(); + } + + /** + * Get pointer to memory mapped region + */ + void *get() + { + return elems; + } + + private: + VertexBuffer &buf; + void *elems; + }; + +protected: + + // Whether the buffer is currently bound. + bool is_bound; + + // Whether the buffer is currently mapped to main memory. + bool is_mapped; + +private: + + // The size of the buffer, in bytes. + size_t size; + + // The target buffer object. (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER). + GLenum target; + + // Usage hint. GL_[DYNAMIC, STATIC, STREAM]_DRAW. + GLenum usage; + + // + MemoryBacking backing; +}; + +/** + * Implementation of VertexBuffer which uses plain arrays to store the data. + * + * This implementation should be supported everywhere, and acts as a fallback + * on systems which do not support VBOs. + */ +class VertexArray : public VertexBuffer +{ +public: + + /** + * @copydoc VertexBuffer(int, GLenum, GLenum, Backing) + */ + VertexArray(size_t size, GLenum target, GLenum usage, MemoryBacking backing); + + /** + * Frees the data we've allocated. + */ + virtual ~VertexArray(); + + // Implements VertexBuffer. + virtual void *map(); + virtual void unmap(); + virtual void bind(); + virtual void unbind(); + virtual void fill(size_t offset, size_t size, const void *data); + virtual const void *getPointer(size_t offset) const ; + +private: + // Holds the data. + char *buf; +}; + +/** + * Vertex Buffer Object (VBO) implementation of VertexBuffer. + * + * This will be used on all systems that support it. It's in general + * faster than vertex arrays, but especially in use-cases where there + * is no need to update the data every frame. + **/ +class VBO : public VertexBuffer, public Volatile +{ +public: + + /** + * @copydoc VertexBuffer(size_t, GLenum, GLenum, Backing) + **/ + VBO(size_t size, GLenum target, GLenum usage, MemoryBacking backing); + + /** + * Deletes the VBOs from OpenGL. + **/ + virtual ~VBO(); + + // Implements VertexBuffer. + virtual void *map(); + virtual void unmap(); + virtual void bind(); + virtual void unbind(); + virtual void fill(size_t offset, size_t size, const void *data); + virtual const void *getPointer(size_t offset) const ; + + // Implements Volatile. + bool loadVolatile(); + void unloadVolatile(); + +private: + + /** + * Creates the VBO, and optionally restores data we saved earlier. + * + * @param restore True to restore data previously saved with 'unload'. + * @return True on success, false otherwise. + */ + bool load(bool restore); + + /** + * Optionally save the data in the VBO, then delete it. + * + * @param save True to save the data before deleting. + */ + void unload(bool save); + + // The VBO identifier. Assigned by OpenGL. + GLuint vbo; + + // A pointer to mapped memory. Will be inialized on the first + // call to map(). + void *memory_map; + + // Set if the buffer was modified while operating on gpu memory + // and needs to be synchronized. + bool is_dirty; +}; + +/** + * VertexIndex manages one shared VertexBuffer that stores the indices for an + * element array. Vertex arrays using the vertex structure (or anything else + * that can use the pattern below) can request a size and use it for the + * drawElements call. + * + * indices[i*6 + 0] = i*4 + 0; + * indices[i*6 + 1] = i*4 + 1; + * indices[i*6 + 2] = i*4 + 2; + * + * indices[i*6 + 3] = i*4 + 0; + * indices[i*6 + 4] = i*4 + 2; + * indices[i*6 + 5] = i*4 + 3; + * + * There will always be a large enough VertexBuffer around until all + * VertexIndex instances have been deleted. + * + * Q: Why have something like VertexIndex? + * A: The indices for the SpriteBatch do not change, only the array size + * varies. Using one VertexBuffer for all element arrays removes this + * duplicated data and saves some memory. + */ +class VertexIndex +{ +public: + /** + * Adds an entry to the list of sizes and resizes the VertexBuffer + * if needed. A size of 1 allocates a group of 6 indices for 4 vertices + * creating 1 face. + * + * @param size The requested size in groups of 6 indices. + */ + VertexIndex(size_t size); + + /** + * Removes an entry from the list of sizes and resizes the VertexBuffer + * if needed. + */ + ~VertexIndex(); + + /** + * Returns the number of index groups. + * This can be used for getIndexCount to get the full count of indices. + * + * @return The number of index groups. + */ + size_t getSize() const; + + /** + * Returns the number of indices that the passed element count will have. + * Use VertexIndex::getSize to get the full index count for that + * VertexIndex instance. + * + * @param elements The number of elements to calculate the index count for. + * @return The index count. + */ + size_t getIndexCount(size_t elements) const; + + /** + * Returns the integer type of the element array. + * If an optional nonzero size argument is passed, the function returns + * the integer type of the element array of that size. + * + * @param s The size of the array to calculated the integer type of. + * @return The element array integer type. + */ + GLenum getType(size_t s) const; + inline GLenum getType() const + { + return getType(maxSize); + } + + /** + * Returns the size in bytes of an element in the element array. + * Can be used with getPointer to calculate an offset into the array based + * on a number of elements. + * + * @return The size of an element in bytes. + **/ + size_t getElementSize(); + + /** + * Returns the pointer to the VertexBuffer. + * The pointer will change if a new size request or removal causes + * a VertexBuffer resize. It is recommended to retrieve the pointer + * value directly before the drawing call. + * + * @return The pointer to the VertexBuffer. + */ + VertexBuffer *getVertexBuffer() const; + + /** + * Returns a pointer which represents the specified byte offset. + * + * @param offset The offset in bytes. + * @return A pointer which represents the offset. + */ + const void *getPointer(size_t offset) const; + +private: + + /** + * Adds a new size to the size list, then sorts and resizes it if needed. + * + * @param newSize The new size to be added. + */ + void addSize(size_t newSize); + + /** + * Removes a size from the size list, then sorts and resizes it if needed. + * + * @param oldSize The old size to be removed. + */ + void removeSize(size_t oldSize); + + /** + * Resizes the VertexBuffer to the requested size. + * This function takes care of choosing the correct integer type and + * allocating and deleting the VertexBuffer instance. It also has some + * fallback logic in case the memory ran out. + * + * @param size The requested VertexBuffer size. Passing 0 deletes the VertexBuffer without allocating a new one. + */ + void resize(size_t size); + + /** + * Adds all indices to the array with the type T. + * There are no checks for the correct types or overflows. The calling + * function should check for that. + */ + template void fill(); + + // The size of the array requested by this instance. + size_t size; + + // The size in bytes of an element in the element array. + static size_t elementSize; + // The current VertexBuffer size. 0 means no VertexBuffer. + static size_t maxSize; + // The list of sizes. Needs to be kept sorted in ascending order. + static std::list sizeRefs; + // The VertexBuffer for the element array. Can be NULL. + static VertexBuffer *element_array; +}; + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_SPRITE_BATCH_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Canvas.cpp b/jni/love/src/modules/graphics/opengl/wrap_Canvas.cpp new file mode 100644 index 00000000..a53574ea --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Canvas.cpp @@ -0,0 +1,245 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Graphics.h" +#include "wrap_Canvas.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Canvas *luax_checkcanvas(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Canvas", GRAPHICS_CANVAS_T); +} + +int w_Canvas_renderTo(lua_State *L) +{ + // As startGrab() clears the framebuffer, better not allow + // grabbing inside another grabbing + if (Canvas::current != NULL) + { + Canvas::bindDefaultCanvas(); + return luaL_error(L, "Current render target not the default canvas!"); + } + + Canvas *canvas = luax_checkcanvas(L, 1); + luaL_checktype(L, 2, LUA_TFUNCTION); + + EXCEPT_GUARD(canvas->startGrab();) + + lua_settop(L, 2); // make sure the function is on top of the stack + lua_call(L, 0, 0); + canvas->stopGrab(); + + return 0; +} + +int w_Canvas_getImageData(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + love::image::Image *image = luax_getmodule(L, "image", MODULE_IMAGE_T); + love::image::ImageData *img = canvas->getImageData(image); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, img); + return 1; +} + +int w_Canvas_getPixel(lua_State * L) +{ + Canvas * canvas = luax_checkcanvas(L, 1); + int x = luaL_checkint(L, 2); + int y = luaL_checkint(L, 3); + unsigned char c[4]; + + EXCEPT_GUARD(canvas->getPixel(c, x, y);) + + lua_pushnumber(L, c[0]); + lua_pushnumber(L, c[1]); + lua_pushnumber(L, c[2]); + lua_pushnumber(L, c[3]); + return 4; +} + +int w_Canvas_setFilter(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + + Image::Filter f; + + const char *minstr = luaL_checkstring(L, 2); + const char *magstr = luaL_optstring(L, 3, minstr); + + if (!Image::getConstant(minstr, f.min)) + return luaL_error(L, "Invalid filter mode: %s", minstr); + if (!Image::getConstant(magstr, f.mag)) + return luaL_error(L, "Invalid filter mode: %s", magstr); + + f.anisotropy = (float) luaL_optnumber(L, 4, 1.0); + + canvas->setFilter(f); + + return 0; + +} + +int w_Canvas_getFilter(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + const Image::Filter f = canvas->getFilter(); + + const char *minstr; + const char *magstr; + Image::getConstant(f.min, minstr); + Image::getConstant(f.mag, magstr); + + lua_pushstring(L, minstr); + lua_pushstring(L, magstr); + lua_pushnumber(L, f.anisotropy); + + return 3; +} + +int w_Canvas_setWrap(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + + Image::Wrap w; + + const char *sstr = luaL_checkstring(L, 2); + const char *tstr = luaL_optstring(L, 3, sstr); + + if (!Image::getConstant(sstr, w.s)) + return luaL_error(L, "Invalid wrap mode: %s", sstr); + if (!Image::getConstant(tstr, w.t)) + return luaL_error(L, "Invalid wrap mode, %s", tstr); + + canvas->setWrap(w); + + return 0; +} + +int w_Canvas_getWrap(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + const Image::Wrap w = canvas->getWrap(); + + const char *wrap_s; + const char *wrap_t; + Image::getConstant(w.s, wrap_s); + Image::getConstant(w.t, wrap_t); + + lua_pushstring(L, wrap_s); + lua_pushstring(L, wrap_t); + + return 2; +} + +int w_Canvas_clear(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + Color c; + if (lua_isnoneornil(L, 2)) + { + c.set(0, 0, 0, 0); + } + else if (lua_istable(L, 2)) + { + for (int i = 1; i <= 4; i++) + lua_rawgeti(L, 2, i); + + c.r = (unsigned char)luaL_checkinteger(L, -4); + c.g = (unsigned char)luaL_checkinteger(L, -3); + c.b = (unsigned char)luaL_checkinteger(L, -2); + c.a = (unsigned char)luaL_optinteger(L, -1, 255); + + lua_pop(L, 4); + } + else + { + c.r = (unsigned char)luaL_checkinteger(L, 2); + c.g = (unsigned char)luaL_checkinteger(L, 3); + c.b = (unsigned char)luaL_checkinteger(L, 4); + c.a = (unsigned char)luaL_optinteger(L, 5, 255); + } + canvas->clear(c); + + return 0; +} + +int w_Canvas_getWidth(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + lua_pushnumber(L, canvas->getWidth()); + return 1; +} + +int w_Canvas_getHeight(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + lua_pushnumber(L, canvas->getHeight()); + return 1; +} + +int w_Canvas_getDimensions(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + lua_pushnumber(L, canvas->getWidth()); + lua_pushnumber(L, canvas->getHeight()); + return 2; +} + +int w_Canvas_getType(lua_State *L) +{ + Canvas *canvas = luax_checkcanvas(L, 1); + Canvas::TextureType type = canvas->getTextureType(); + const char *str; + Canvas::getConstant(type, str); + lua_pushstring(L, str); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "renderTo", w_Canvas_renderTo }, + { "getImageData", w_Canvas_getImageData }, + { "getPixel", w_Canvas_getPixel }, + { "setFilter", w_Canvas_setFilter }, + { "getFilter", w_Canvas_getFilter }, + { "setWrap", w_Canvas_setWrap }, + { "getWrap", w_Canvas_getWrap }, + { "clear", w_Canvas_clear }, + { "getWidth", w_Canvas_getWidth }, + { "getHeight", w_Canvas_getHeight }, + { "getDimensions", w_Canvas_getDimensions }, + { "getType", w_Canvas_getType }, + { 0, 0 } +}; + +extern "C" int luaopen_canvas(lua_State *L) +{ + return luax_register_type(L, "Canvas", functions); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_Canvas.h b/jni/love/src/modules/graphics/opengl/wrap_Canvas.h new file mode 100644 index 00000000..88ae75e1 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Canvas.h @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_CANVAS_H +#define LOVE_GRAPHICS_OPENGL_WRAP_CANVAS_H + +// LOVE +#include "common/runtime.h" +#include "Canvas.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +//see Canvas.h +Canvas *luax_checkcanvas(lua_State *L, int idx); +int w_Canvas_renderTo(lua_State *L); +int w_Canvas_getImageData(lua_State *L); +int w_Canvas_getPixel(lua_State * L); +int w_Canvas_setFilter(lua_State *L); +int w_Canvas_getFilter(lua_State *L); +int w_Canvas_setWrap(lua_State *L); +int w_Canvas_getWrap(lua_State *L); +int w_Canvas_clear(lua_State *L); +int w_Canvas_getWidth(lua_State *L); +int w_Canvas_getHeight(lua_State *L); +int w_Canvas_getDimensions(lua_State *L); +int w_Canvas_getType(lua_State *L); +extern "C" int luaopen_canvas(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_CANVAS_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Font.cpp b/jni/love/src/modules/graphics/opengl/wrap_Font.cpp new file mode 100644 index 00000000..cee0c033 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Font.cpp @@ -0,0 +1,186 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Font.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Font *luax_checkfont(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Font", GRAPHICS_FONT_T); +} + +int w_Font_getHeight(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + lua_pushnumber(L, t->getHeight()); + return 1; +} + +int w_Font_getWidth(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + const char *str = luaL_checkstring(L, 2); + + EXCEPT_GUARD(lua_pushinteger(L, t->getWidth(str));) + return 1; +} + +int w_Font_getWrap(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + const char *str = luaL_checkstring(L, 2); + float wrap = (float) luaL_checknumber(L, 3); + int max_width = 0, numlines = 0; + + EXCEPT_GUARD( + std::vector lines = t->getWrap(str, wrap, &max_width); + numlines = lines.size(); + ) + + lua_pushinteger(L, max_width); + lua_pushinteger(L, numlines); + return 2; +} + +int w_Font_setLineHeight(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + float h = (float)luaL_checknumber(L, 2); + t->setLineHeight(h); + return 0; +} + +int w_Font_getLineHeight(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + lua_pushnumber(L, t->getLineHeight()); + return 1; +} + +int w_Font_setFilter(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + Image::Filter f = t->getFilter(); + + const char *minstr = luaL_checkstring(L, 2); + const char *magstr = luaL_optstring(L, 3, minstr); + + if (!Image::getConstant(minstr, f.min)) + return luaL_error(L, "Invalid filter mode: %s", minstr); + if (!Image::getConstant(magstr, f.mag)) + return luaL_error(L, "Invalid filter mode: %s", magstr); + + f.anisotropy = (float) luaL_optnumber(L, 4, 1.0); + + EXCEPT_GUARD(t->setFilter(f);) + return 0; +} + +int w_Font_getFilter(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + const Image::Filter f = t->getFilter(); + const char *minstr; + const char *magstr; + Image::getConstant(f.min, minstr); + Image::getConstant(f.mag, magstr); + lua_pushstring(L, minstr); + lua_pushstring(L, magstr); + lua_pushnumber(L, f.anisotropy); + return 3; +} + +int w_Font_getAscent(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + lua_pushnumber(L, t->getAscent()); + return 1; +} + +int w_Font_getDescent(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + lua_pushnumber(L, t->getDescent()); + return 1; +} + +int w_Font_getBaseline(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + lua_pushnumber(L, t->getBaseline()); + return 1; +} + +int w_Font_hasGlyphs(lua_State *L) +{ + Font *t = luax_checkfont(L, 1); + bool hasglyph = false; + + int count = lua_gettop(L) - 1; + count = count < 1 ? 1 : count; + + EXCEPT_GUARD( + for (int i = 2; i < count + 2; i++) + { + if (lua_type(L, i) == LUA_TSTRING) + hasglyph = t->hasGlyphs(luax_checkstring(L, i)); + else + hasglyph = t->hasGlyph((uint32) luaL_checknumber(L, i)); + + if (!hasglyph) + break; + } + ) + + luax_pushboolean(L, hasglyph); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getHeight", w_Font_getHeight }, + { "getWidth", w_Font_getWidth }, + { "getWrap", w_Font_getWrap }, + { "setLineHeight", w_Font_setLineHeight }, + { "getLineHeight", w_Font_getLineHeight }, + { "setFilter", w_Font_setFilter }, + { "getFilter", w_Font_getFilter }, + { "getAscent", w_Font_getAscent }, + { "getDescent", w_Font_getDescent }, + { "getBaseline", w_Font_getBaseline }, + { "hasGlyphs", w_Font_hasGlyphs }, + { 0, 0 } +}; + +extern "C" int luaopen_font(lua_State *L) +{ + return luax_register_type(L, "Font", functions); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_Font.h b/jni/love/src/modules/graphics/opengl/wrap_Font.h new file mode 100644 index 00000000..406896da --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Font.h @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_FONT_H +#define LOVE_GRAPHICS_OPENGL_WRAP_FONT_H + +// LOVE +#include "common/runtime.h" +#include "Font.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Font *luax_checkfont(lua_State *L, int idx); +int w_Font_getHeight(lua_State *L); +int w_Font_getWidth(lua_State *L); +int w_Font_getWrap(lua_State *L); +int w_Font_setLineHeight(lua_State *L); +int w_Font_getLineHeight(lua_State *L); +int w_Font_setFilter(lua_State *L); +int w_Font_getFilter(lua_State *L); +int w_Font_getAscent(lua_State *L); +int w_Font_getDescent(lua_State *L); +int w_Font_getBaseline(lua_State *L); +int w_Font_hasGlyphs(lua_State *L); +extern "C" int luaopen_font(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_FONT_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Graphics.cpp b/jni/love/src/modules/graphics/opengl/wrap_Graphics.cpp new file mode 100644 index 00000000..596e32d3 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -0,0 +1,1459 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Graphics.h" +#include "OpenGL.h" +#include "graphics/DrawQable.h" +#include "image/ImageData.h" +#include "font/Rasterizer.h" + +#include "scripts/graphics.lua.h" +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +static Graphics *instance = 0; + +int w_reset(lua_State *) +{ + instance->reset(); + return 0; +} + +int w_clear(lua_State *) +{ + instance->clear(); + return 0; +} + +int w_present(lua_State *) +{ + instance->present(); + return 0; +} + +int w_isCreated(lua_State *L) +{ + luax_pushboolean(L, instance->isCreated()); + return 1; +} + +int w_getWidth(lua_State *L) +{ + lua_pushinteger(L, instance->getWidth()); + return 1; +} + +int w_getHeight(lua_State *L) +{ + lua_pushinteger(L, instance->getHeight()); + return 1; +} + +int w_getDimensions(lua_State *L) +{ + lua_pushinteger(L, instance->getWidth()); + lua_pushinteger(L, instance->getHeight()); + return 2; +} + +int w_setScissor(lua_State *L) +{ + int nargs = lua_gettop(L); + + if (nargs == 0 || (nargs == 4 && lua_isnil(L, 1) && lua_isnil(L, 2) + && lua_isnil(L, 3) && lua_isnil(L, 4))) + { + instance->setScissor(); + return 0; + } + + int x = luaL_checkint(L, 1); + int y = luaL_checkint(L, 2); + int w = luaL_checkint(L, 3); + int h = luaL_checkint(L, 4); + + if (w < 0 || h < 0) + return luaL_error(L, "Can't set scissor with negative width and/or height."); + + instance->setScissor(x, y, w, h); + return 0; +} + +int w_getScissor(lua_State *L) +{ + return instance->getScissor(L); +} + +static int setStencil(lua_State *L, bool invert) +{ + // no argument -> clear stencil + if (lua_isnoneornil(L, 1)) + { + instance->discardStencil(); + return 0; + } + + luaL_checktype(L, 1, LUA_TFUNCTION); + + instance->defineStencil(); + lua_call(L, lua_gettop(L) - 1, 0); // call stencil(...) + instance->useStencil(invert); + + return 0; +} + +int w_setStencil(lua_State *L) +{ + return setStencil(L, false); +} + +int w_setInvertedStencil(lua_State *L) +{ + return setStencil(L, true); +} + +int w_getMaxImageSize(lua_State *L) +{ + lua_pushinteger(L, instance->getMaxImageSize()); + return 1; +} + +int w_newImage(lua_State *L) +{ + love::image::ImageData *data = 0; + love::image::CompressedData *cdata = 0; + + // Convert to FileData, if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + // Convert to ImageData/CompressedData, if necessary. + if (luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + { + // Determine whether to convert to ImageData or CompressedData. + luax_getfunction(L, "image", "isCompressed"); + lua_pushvalue(L, 1); + lua_call(L, 1, 1); + + bool compressed = luax_toboolean(L, -1); + lua_pop(L, 1); + + if (compressed) + luax_convobj(L, 1, "image", "newCompressedData"); + else + luax_convobj(L, 1, "image", "newImageData"); + } + + if (luax_istype(L, 1, IMAGE_COMPRESSED_DATA_T)) + cdata = luax_checktype(L, 1, "CompressedData", IMAGE_COMPRESSED_DATA_T); + else + data = luax_checktype(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); + + if (!data && !cdata) + return luaL_error(L, "Error creating image."); + + // Create the image. + Image *image = 0; + EXCEPT_GUARD( + if (cdata) + image = instance->newImage(cdata); + else if (data) + image = instance->newImage(data); + ) + + if (image == 0) + return luaL_error(L, "Could not load image."); + + // Push the type. + luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, image); + return 1; +} + +int w_newQuad(lua_State *L) +{ + Quad::Viewport v; + v.x = (float) luaL_checknumber(L, 1); + v.y = (float) luaL_checknumber(L, 2); + v.w = (float) luaL_checknumber(L, 3); + v.h = (float) luaL_checknumber(L, 4); + + float sw = (float) luaL_checknumber(L, 5); + float sh = (float) luaL_checknumber(L, 6); + + Quad *quad = instance->newQuad(v, sw, sh); + luax_pushtype(L, "Quad", GRAPHICS_QUAD_T, quad); + return 1; +} + +int w_newFont(lua_State *L) +{ + // Convert to FileData, if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + // Convert to Rasterizer, if necessary. + if (luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + { + int idxs[] = {1, 2}; + luax_convobj(L, idxs, 2, "font", "newRasterizer"); + } + + love::font::Rasterizer *rasterizer = luax_checktype(L, 1, "Rasterizer", FONT_RASTERIZER_T); + + Font *font = 0; + EXCEPT_GUARD(font = instance->newFont(rasterizer, instance->getDefaultFilter());) + + if (font == 0) + return luaL_error(L, "Could not load font."); + + // Push the type. + luax_pushtype(L, "Font", GRAPHICS_FONT_T, font); + return 1; +} + +int w_newImageFont(lua_State *L) +{ + // filter for glyphs + Image::Filter filter = instance->getDefaultFilter(); + + // Convert to ImageData if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + luax_convobj(L, 1, "image", "newImageData"); + else if (luax_istype(L, 1, GRAPHICS_IMAGE_T)) + { + Image *i = luax_checktype(L, 1, "Image", GRAPHICS_IMAGE_T); + filter = i->getFilter(); + love::image::ImageData *id = i->getImageData(); + if (!id) + return luaL_argerror(L, 1, "Image cannot be compressed."); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, id, false); + lua_replace(L, 1); + } + + // Convert to Rasterizer if necessary. + if (luax_istype(L, 1, IMAGE_IMAGE_DATA_T)) + { + luaL_checkstring(L, 2); + int idxs[] = {1, 2}; + luax_convobj(L, idxs, 2, "font", "newRasterizer"); + } + + love::font::Rasterizer *rasterizer = luax_checktype(L, 1, "Rasterizer", FONT_RASTERIZER_T); + + // Create the font. + Font *font = instance->newFont(rasterizer, filter); + + if (font == 0) + return luaL_error(L, "Could not load font."); + + // Push the type. + luax_pushtype(L, "Font", GRAPHICS_FONT_T, font); + + return 1; +} + +int w_newSpriteBatch(lua_State *L) +{ + Image *image = luax_checkimage(L, 1); + int size = luaL_optint(L, 2, 1000); + SpriteBatch::UsageHint usage = SpriteBatch::USAGE_DYNAMIC; + if (lua_gettop(L) > 2) + { + const char *usagestr = luaL_checkstring(L, 3); + if (!SpriteBatch::getConstant(usagestr, usage)) + return luaL_error(L, "Invalid SpriteBatch usage hint: %s", usagestr); + } + + SpriteBatch *t = 0; + EXCEPT_GUARD(t = instance->newSpriteBatch(image, size, usage);) + + luax_pushtype(L, "SpriteBatch", GRAPHICS_SPRITE_BATCH_T, t); + return 1; +} + +int w_newParticleSystem(lua_State *L) +{ + Image *image = luax_checkimage(L, 1); + lua_Number size = luaL_optnumber(L, 2, 1000); + ParticleSystem *t = 0; + if (size < 1.0 || size > ParticleSystem::MAX_PARTICLES) + return luaL_error(L, "Invalid ParticleSystem size"); + + EXCEPT_GUARD(t = instance->newParticleSystem(image, int(size));) + + luax_pushtype(L, "ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_T, t); + return 1; +} + +int w_newCanvas(lua_State *L) +{ + // check if width and height are given. else default to screen dimensions. + int width = luaL_optint(L, 1, instance->getWidth()); + int height = luaL_optint(L, 2, instance->getHeight()); + const char *str = luaL_optstring(L, 3, "normal"); + + Canvas::TextureType texture_type; + if (!Canvas::getConstant(str, texture_type)) + return luaL_error(L, "Invalid canvas type: %s", str); + + Canvas *canvas = 0; + EXCEPT_GUARD(canvas = instance->newCanvas(width, height, texture_type);) + + if (canvas == 0) + return luaL_error(L, "Canvas not created, but no error thrown. I don't even..."); + + luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, canvas); + return 1; +} + +int w_newShader(lua_State *L) +{ + if (!Shader::isSupported()) + return luaL_error(L, "Sorry, your graphics card does not support shaders."); + + // clamp stack to 2 elements + lua_settop(L, 2); + + // read any filepath arguments + for (int i = 1; i <= 2; i++) + { + if (!lua_isstring(L, i)) + continue; + + // call love.filesystem.isFile(arg_i) + luax_getfunction(L, "filesystem", "isFile"); + lua_pushvalue(L, i); + lua_call(L, 1, 1); + + bool isFile = luax_toboolean(L, -1); + lua_pop(L, 1); + + if (isFile) + { + luax_getfunction(L, "filesystem", "read"); + lua_pushvalue(L, i); + lua_call(L, 1, 1); + lua_replace(L, i); + } + } + + bool has_arg1 = lua_isstring(L, 1); + bool has_arg2 = lua_isstring(L, 2); + + // require at least one string argument + if (!(has_arg1 || has_arg2)) + luaL_checkstring(L, 1); + + luax_getfunction(L, "graphics", "_shaderCodeToGLSL"); + + // push vertexcode and pixelcode strings to the top of the stack + lua_pushvalue(L, 1); + lua_pushvalue(L, 2); + + // call effectCodeToGLSL, returned values will be at the top of the stack + if (lua_pcall(L, 2, 2, 0) != 0) + return luaL_error(L, "%s", lua_tostring(L, -1)); + + Shader::ShaderSources sources; + + // vertex shader code + if (lua_isstring(L, -2)) + { + std::string vertexcode(luaL_checkstring(L, -2)); + sources[Shader::TYPE_VERTEX] = vertexcode; + } + else if (has_arg1 && has_arg2) + return luaL_error(L, "Could not parse vertex shader code (missing 'position' function?)"); + + // pixel shader code + if (lua_isstring(L, -1)) + { + std::string pixelcode(luaL_checkstring(L, -1)); + sources[Shader::TYPE_PIXEL] = pixelcode; + } + else if (has_arg1 && has_arg2) + return luaL_error(L, "Could not parse pixel shader code (missing 'effect' function?)"); + + if (sources.empty()) + { + // Original args had source code, but effectCodeToGLSL couldn't translate it + for (int i = 1; i <= 2; i++) + { + if (lua_isstring(L, i)) + return luaL_argerror(L, i, "missing 'position' or 'effect' function?"); + } + } + + bool should_error = false; + try + { + Shader *shader = instance->newShader(sources); + luax_pushtype(L, "Shader", GRAPHICS_SHADER_T, shader); + } + catch (love::Exception &e) + { + luax_getfunction(L, "graphics", "_transformGLSLErrorMessages"); + lua_pushstring(L, e.what()); + + // Function pushes the new error string onto the stack. + lua_pcall(L, 1, 1, 0); + should_error = true; + } + + if (should_error) + return lua_error(L); + + return 1; +} + +int w_newMesh(lua_State *L) +{ + // Check first argument: mandatory table of vertices. + luaL_checktype(L, 1, LUA_TTABLE); + + // Second argument: optional image. + Image *img = 0; + if (!lua_isnoneornil(L, 2)) + img = luax_checkimage(L, 2); + + // Third argument: optional draw mode. + const char *str = 0; + Mesh::DrawMode mode = Mesh::DRAW_MODE_FAN; + str = lua_isnoneornil(L, 3) ? 0 : luaL_checkstring(L, 3); + + if (str && !Mesh::getConstant(str, mode)) + return luaL_error(L, "Invalid mesh draw mode: %s", str); + + size_t vertex_count = lua_objlen(L, 1); + std::vector vertices; + vertices.reserve(vertex_count); + + bool use_colors = false; + + // Get the vertices from the table. + for (size_t i = 1; i <= vertex_count; i++) + { + lua_rawgeti(L, 1, i); + + if (lua_type(L, -1) != LUA_TTABLE) + return luax_typerror(L, 1, "table of tables"); + + for (int j = 1; j <= 8; j++) + lua_rawgeti(L, -j, j); + + Vertex v; + + v.x = (float) luaL_checknumber(L, -8); + v.y = (float) luaL_checknumber(L, -7); + + v.s = (float) luaL_checknumber(L, -6); + v.t = (float) luaL_checknumber(L, -5); + + v.r = (unsigned char) luaL_optinteger(L, -4, 255); + v.g = (unsigned char) luaL_optinteger(L, -3, 255); + v.b = (unsigned char) luaL_optinteger(L, -2, 255); + v.a = (unsigned char) luaL_optinteger(L, -1, 255); + + // Enable per-vertex coloring if any color is not the default. + if (!use_colors && (v.r != 255 || v.g != 255 || v.b != 255 || v.a != 255)) + use_colors = true; + + lua_pop(L, 9); + vertices.push_back(v); + } + + Mesh *t = 0; + EXCEPT_GUARD(t = instance->newMesh(vertices, mode);) + + if (img) + t->setImage(img); + + t->setVertexColors(use_colors); + + luax_pushtype(L, "Mesh", GRAPHICS_MESH_T, t); + return 1; +} + +int w_setColor(lua_State *L) +{ + Color c; + if (lua_istable(L, 1)) + { + for (int i = 1; i <= 4; i++) + lua_rawgeti(L, 1, i); + + c.r = (unsigned char)luaL_checkint(L, -4); + c.g = (unsigned char)luaL_checkint(L, -3); + c.b = (unsigned char)luaL_checkint(L, -2); + c.a = (unsigned char)luaL_optint(L, -1, 255); + + lua_pop(L, 4); + } + else + { + c.r = (unsigned char)luaL_checkint(L, 1); + c.g = (unsigned char)luaL_checkint(L, 2); + c.b = (unsigned char)luaL_checkint(L, 3); + c.a = (unsigned char)luaL_optint(L, 4, 255); + } + instance->setColor(c); + return 0; +} + +int w_getColor(lua_State *L) +{ + Color c = instance->getColor(); + lua_pushinteger(L, c.r); + lua_pushinteger(L, c.g); + lua_pushinteger(L, c.b); + lua_pushinteger(L, c.a); + return 4; +} + +int w_setBackgroundColor(lua_State *L) +{ + Color c; + if (lua_istable(L, 1)) + { + for (int i = 1; i <= 4; i++) + lua_rawgeti(L, 1, i); + + c.r = (unsigned char)luaL_checkint(L, -4); + c.g = (unsigned char)luaL_checkint(L, -3); + c.b = (unsigned char)luaL_checkint(L, -2); + c.a = (unsigned char)luaL_optint(L, -1, 255); + + lua_pop(L, 4); + } + else + { + c.r = (unsigned char)luaL_checkint(L, 1); + c.g = (unsigned char)luaL_checkint(L, 2); + c.b = (unsigned char)luaL_checkint(L, 3); + c.a = (unsigned char)luaL_optint(L, 4, 255); + } + instance->setBackgroundColor(c); + return 0; +} + +int w_getBackgroundColor(lua_State *L) +{ + Color c = instance->getBackgroundColor(); + lua_pushinteger(L, c.r); + lua_pushinteger(L, c.g); + lua_pushinteger(L, c.b); + lua_pushinteger(L, c.a); + return 4; +} + +int w_setFont(lua_State *L) +{ + Font *font = luax_checktype(L, 1, "Font", GRAPHICS_FONT_T); + instance->setFont(font); + return 0; +} + +int w_getFont(lua_State *L) +{ + Font *f = instance->getFont(); + + if (f == 0) + return 0; + + f->retain(); + luax_pushtype(L, "Font", GRAPHICS_FONT_T, f); + return 1; +} + +int w_setColorMask(lua_State *L) +{ + bool mask[4]; + + if (lua_gettop(L) <= 1 && lua_isnoneornil(L, 1)) + { + // Enable all color components if no argument is given. + mask[0] = mask[1] = mask[2] = mask[3] = true; + } + else + { + for (int i = 0; i < 4; i++) + mask[i] = luax_toboolean(L, i + 1); + } + + // r, g, b, a + instance->setColorMask(mask[0], mask[1], mask[2], mask[3]); + + return 0; +} + +int w_getColorMask(lua_State *L) +{ + const bool *mask = instance->getColorMask(); + + for (int i = 0; i < 4; i++) + luax_pushboolean(L, mask[i]); + + return 4; +} + +int w_setBlendMode(lua_State *L) +{ + Graphics::BlendMode mode; + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, mode)) + return luaL_error(L, "Invalid blend mode: %s", str); + + EXCEPT_GUARD(instance->setBlendMode(mode);) + return 0; +} + +int w_getBlendMode(lua_State *L) +{ + const char *str; + Graphics::BlendMode mode; + + EXCEPT_GUARD(mode = instance->getBlendMode();) + + if (!Graphics::getConstant(mode, str)) + return luaL_error(L, "Unknown blend mode"); + + lua_pushstring(L, str); + return 1; +} + +int w_setDefaultFilter(lua_State *L) +{ + Image::FilterMode min; + Image::FilterMode mag; + + const char *minstr = luaL_checkstring(L, 1); + const char *magstr = luaL_optstring(L, 2, minstr); + + if (!Image::getConstant(minstr, min)) + return luaL_error(L, "Invalid filter mode: %s", minstr); + if (!Image::getConstant(magstr, mag)) + return luaL_error(L, "Invalid filter mode: %s", magstr); + + float anisotropy = (float) luaL_optnumber(L, 3, 1.0); + + Image::Filter f; + f.min = min; + f.mag = mag; + f.anisotropy = anisotropy; + + instance->setDefaultFilter(f); + + return 0; +} + +int w_getDefaultFilter(lua_State *L) +{ + const Image::Filter &f = instance->getDefaultFilter(); + const char *minstr; + const char *magstr; + if (!Image::getConstant(f.min, minstr)) + return luaL_error(L, "Unknown minification filter mode"); + if (!Image::getConstant(f.mag, magstr)) + return luaL_error(L, "Unknown magnification filter mode"); + lua_pushstring(L, minstr); + lua_pushstring(L, magstr); + lua_pushnumber(L, f.anisotropy); + return 3; +} + +int w_setDefaultMipmapFilter(lua_State *L) +{ + Image::FilterMode filter = Image::FILTER_NONE; + if (!lua_isnoneornil(L, 1)) + { + const char *str = luaL_checkstring(L, 1); + if (!Image::getConstant(str, filter)) + return luaL_error(L, "Invalid filter mode: %s", str); + } + + float sharpness = (float) luaL_optnumber(L, 2, 0); + + instance->setDefaultMipmapFilter(filter, sharpness); + + return 0; +} + +int w_getDefaultMipmapFilter(lua_State *L) +{ + Image::FilterMode filter; + float sharpness; + + instance->getDefaultMipmapFilter(&filter, &sharpness); + + const char *str; + if (Image::getConstant(filter, str)) + lua_pushstring(L, str); + else + lua_pushnil(L); + + lua_pushnumber(L, sharpness); + + return 2; +} + +int w_setLineWidth(lua_State *L) +{ + float width = (float)luaL_checknumber(L, 1); + instance->setLineWidth(width); + return 0; +} + +int w_setLineStyle(lua_State *L) +{ + Graphics::LineStyle style; + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, style)) + return luaL_error(L, "Invalid line style: %s", str); + + instance->setLineStyle(style); + return 0; +} + +int w_setLineJoin(lua_State *L) +{ + Graphics::LineJoin join; + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, join)) + return luaL_error(L, "Invalid line join mode: %s", str); + + instance->setLineJoin(join); + return 0; +} + +int w_getLineWidth(lua_State *L) +{ + lua_pushnumber(L, instance->getLineWidth()); + return 1; +} + +int w_getLineStyle(lua_State *L) +{ + Graphics::LineStyle style = instance->getLineStyle(); + const char *str; + if (!Graphics::getConstant(style, str)) + return luaL_error(L, "Unknown line style"); + lua_pushstring(L, str); + return 1; +} + +int w_getLineJoin(lua_State *L) +{ + Graphics::LineJoin join = instance->getLineJoin(); + const char *str; + if (!Graphics::getConstant(join, str)) + return luaL_error(L, "Unknown line join"); + lua_pushstring(L, str); + return 1; +} + +int w_setPointSize(lua_State *L) +{ + float size = (float)luaL_checknumber(L, 1); + instance->setPointSize(size); + return 0; +} + +int w_setPointStyle(lua_State *L) +{ + Graphics::PointStyle style; + + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, style)) + return luaL_error(L, "Invalid point style: %s", str); + + instance->setPointStyle(style); + return 0; +} + +int w_getPointSize(lua_State *L) +{ + lua_pushnumber(L, instance->getPointSize()); + return 1; +} + +int w_getPointStyle(lua_State *L) +{ + Graphics::PointStyle style = instance->getPointStyle(); + const char *str; + if (!Graphics::getConstant(style, str)) + return luaL_error(L, "Unknown point style"); + lua_pushstring(L, str); + return 1; +} + +int w_getMaxPointSize(lua_State *L) +{ + lua_pushnumber(L, instance->getMaxPointSize()); + return 1; +} + +int w_newScreenshot(lua_State *L) +{ + love::image::Image *image = luax_getmodule(L, "image", MODULE_IMAGE_T); + bool copyAlpha = luax_optboolean(L, 1, false); + love::image::ImageData *i = 0; + + EXCEPT_GUARD(i = instance->newScreenshot(image, copyAlpha);) + + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, i); + return 1; +} + +int w_setCanvas(lua_State *L) +{ + // discard stencil testing + instance->discardStencil(); + + // called with none -> reset to default buffer + if (lua_isnoneornil(L,1)) + { + Canvas::bindDefaultCanvas(); + return 0; + } + + bool is_table = lua_istable(L, 1); + std::vector attachments; + + Canvas *canvas = 0; + + if (is_table) + { + // grab the first canvas in the array and attach the rest + lua_rawgeti(L, 1, 1); + canvas = luax_checkcanvas(L, -1); + lua_pop(L, 1); + + for (size_t i = 2; i <= lua_objlen(L, 1); i++) + { + lua_rawgeti(L, 1, i); + attachments.push_back(luax_checkcanvas(L, -1)); + lua_pop(L, 1); + } + } + else + { + canvas = luax_checkcanvas(L, 1); + for (int i = 2; i <= lua_gettop(L); i++) + attachments.push_back(luax_checkcanvas(L, i)); + } + + EXCEPT_GUARD( + if (attachments.size() > 0) + canvas->startGrab(attachments); + else + canvas->startGrab(); + ) + + return 0; +} + +int w_getCanvas(lua_State *L) +{ + Canvas *canvas = Canvas::current; + int n = 1; + + if (canvas) + { + canvas->retain(); + luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, canvas); + + const std::vector &attachments = canvas->getAttachedCanvases(); + for (size_t i = 0; i < attachments.size(); i++) + { + attachments[i]->retain(); + luax_pushtype(L, "Canvas", GRAPHICS_CANVAS_T, attachments[i]); + n++; + } + } + else + lua_pushnil(L); + + return n; +} + +int w_setShader(lua_State *L) +{ + if (lua_isnoneornil(L,1)) + { + Shader::detach(); + return 0; + } + + Shader *shader = luax_checkshader(L, 1); + shader->attach(); + return 0; +} + +int w_getShader(lua_State *L) +{ + Shader *shader = Shader::current; + if (shader) + { + shader->retain(); + luax_pushtype(L, "Shader", GRAPHICS_SHADER_T, shader); + } + else + lua_pushnil(L); + + return 1; +} + +int w_setDefaultShaderCode(lua_State *L) +{ + luaL_checktype(L, 1, LUA_TTABLE); + + lua_getfield(L, 1, "opengl"); + lua_rawgeti(L, -1, 1); + lua_rawgeti(L, -2, 2); + + Shader::ShaderSources openglcode; + openglcode[Shader::TYPE_VERTEX] = luax_checkstring(L, -2); + openglcode[Shader::TYPE_PIXEL] = luax_checkstring(L, -1); + + lua_pop(L, 3); + + lua_getfield(L, 1, "opengles"); + lua_rawgeti(L, -1, 1); + lua_rawgeti(L, -2, 2); + + Shader::ShaderSources openglescode; + openglescode[Shader::TYPE_VERTEX] = luax_checkstring(L, -2); + openglescode[Shader::TYPE_PIXEL] = luax_checkstring(L, -1); + + lua_pop(L, 3); + + Shader::defaultCode[Graphics::RENDERER_OPENGL] = openglcode; + Shader::defaultCode[Graphics::RENDERER_OPENGLES] = openglescode; + + return 0; +} + +int w_isSupported(lua_State *L) +{ + bool supported = true; + size_t len = lua_gettop(L); + Graphics::Support support; + for (unsigned int i = 1; i <= len; i++) + { + const char *str = luaL_checkstring(L, i); + if (!Graphics::getConstant(str, support)) + return luaL_error(L, "Invalid graphics feature: %s", str); + + switch (support) + { + case Graphics::SUPPORT_CANVAS: + if (!Canvas::isSupported()) + supported = false; + break; + case Graphics::SUPPORT_HDR_CANVAS: + if (!Canvas::isHDRSupported()) + supported = false; + break; + case Graphics::SUPPORT_MULTI_CANVAS: + if (!Canvas::isMultiCanvasSupported()) + supported = false; + break; + case Graphics::SUPPORT_SHADER: + if (!Shader::isSupported()) + supported = false; + break; + case Graphics::SUPPORT_NPOT: + if (!Image::hasNpot()) + supported = false; + break; + case Graphics::SUPPORT_SUBTRACTIVE: + if (!(GLAD_ES_VERSION_2_0 || GLAD_VERSION_1_4 || (GLAD_EXT_blend_minmax && GLAD_EXT_blend_subtract))) + supported = false; + break; + case Graphics::SUPPORT_MIPMAP: + if (!Image::hasMipmapSupport()) + supported = false; + break; + case Graphics::SUPPORT_DXT: + if (!Image::hasCompressedTextureSupport(image::CompressedData::FORMAT_DXT5)) + supported = false; + break; + case Graphics::SUPPORT_BC5: + if (!Image::hasCompressedTextureSupport(image::CompressedData::FORMAT_BC5)) + supported = false; + break; + default: + supported = false; + } + if (!supported) + break; + } + lua_pushboolean(L, supported); + return 1; +} + +int w_getRendererInfo(lua_State *L) +{ + std::string name, version, vendor, device; + + EXCEPT_GUARD(name = instance->getRendererInfo(Graphics::RENDERER_INFO_NAME);) + EXCEPT_GUARD(version = instance->getRendererInfo(Graphics::RENDERER_INFO_VERSION);) + EXCEPT_GUARD(vendor = instance->getRendererInfo(Graphics::RENDERER_INFO_VENDOR);) + EXCEPT_GUARD(device = instance->getRendererInfo(Graphics::RENDERER_INFO_DEVICE);) + + luax_pushstring(L, name); + luax_pushstring(L, version); + luax_pushstring(L, vendor); + luax_pushstring(L, device); + + return 4; +} + +int w_draw(lua_State *L) +{ + Drawable *drawable = 0; + DrawQable *drawqable = 0; + Quad *quad = 0; + int startidx = 2; + + if (luax_istype(L, 2, GRAPHICS_QUAD_T)) + { + drawqable = luax_checktype(L, 1, "DrawQable", GRAPHICS_DRAWQABLE_T); + quad = luax_totype(L, 2, "Quad", GRAPHICS_QUAD_T); + startidx = 3; + } + else if (lua_isnil(L, 2) && !lua_isnoneornil(L, 3)) + { + return luax_typerror(L, 2, "Quad"); + } + else + { + drawable = luax_checktype(L, 1, "Drawable", GRAPHICS_DRAWABLE_T); + startidx = 2; + } + + float x = (float) luaL_optnumber(L, startidx + 0, 0.0); + float y = (float) luaL_optnumber(L, startidx + 1, 0.0); + float a = (float) luaL_optnumber(L, startidx + 2, 0.0); + float sx = (float) luaL_optnumber(L, startidx + 3, 1.0); + float sy = (float) luaL_optnumber(L, startidx + 4, sx); + float ox = (float) luaL_optnumber(L, startidx + 5, 0.0); + float oy = (float) luaL_optnumber(L, startidx + 6, 0.0); + float kx = (float) luaL_optnumber(L, startidx + 7, 0.0); + float ky = (float) luaL_optnumber(L, startidx + 8, 0.0); + + if (drawqable && quad) + drawqable->drawq(quad, x, y, a, sx, sy, ox, oy, kx, ky); + else if (drawable) + drawable->draw(x, y, a, sx, sy, ox, oy, kx, ky); + + return 0; +} + +int w_print(lua_State *L) +{ + std::string str = luax_checkstring(L, 1); + float x = (float)luaL_optnumber(L, 2, 0.0); + float y = (float)luaL_optnumber(L, 3, 0.0); + float angle = (float)luaL_optnumber(L, 4, 0.0f); + float sx = (float)luaL_optnumber(L, 5, 1.0f); + float sy = (float)luaL_optnumber(L, 6, sx); + float ox = (float)luaL_optnumber(L, 7, 0.0f); + float oy = (float)luaL_optnumber(L, 8, 0.0f); + float kx = (float)luaL_optnumber(L, 9, 0.0f); + float ky = (float)luaL_optnumber(L, 10, 0.0f); + + EXCEPT_GUARD(instance->print(str, x, y, angle, sx, sy, ox, oy, kx,ky);) + return 0; +} + +int w_printf(lua_State *L) +{ + std::string str = luax_checkstring(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float wrap = (float)luaL_checknumber(L, 4); + + float angle = 0.0f; + float sx = 1.0f, sy = 1.0f; + float ox = 0.0f, oy = 0.0f; + float kx = 0.0f, ky = 0.0f; + + Graphics::AlignMode align = Graphics::ALIGN_LEFT; + + if (lua_gettop(L) >= 5) + { + if (!lua_isnil(L, 5)) + { + const char *str = luaL_checkstring(L, 5); + if (!Graphics::getConstant(str, align)) + return luaL_error(L, "Incorrect alignment: %s", str); + } + + angle = (float) luaL_optnumber(L, 6, 0.0f); + sx = (float) luaL_optnumber(L, 7, 1.0f); + sy = (float) luaL_optnumber(L, 8, sx); + ox = (float) luaL_optnumber(L, 9, 0.0f); + oy = (float) luaL_optnumber(L, 10, 0.0f); + kx = (float) luaL_optnumber(L, 11, 0.0f); + ky = (float) luaL_optnumber(L, 12, 0.0f); + } + + EXCEPT_GUARD(instance->printf(str, x, y, wrap, align, angle, sx, sy, ox, oy, kx, ky);) + return 0; +} + +int w_point(lua_State *L) +{ + float x = (float)luaL_checknumber(L, 1); + float y = (float)luaL_checknumber(L, 2); + instance->point(x, y); + return 0; +} + +int w_line(lua_State *L) +{ + int args = lua_gettop(L); + bool is_table = false; + if (args == 1 && lua_istable(L, 1)) + { + args = lua_objlen(L, 1); + is_table = true; + } + if (args % 2 != 0) + return luaL_error(L, "Number of vertices must be a multiple of two"); + else if (args < 4) + return luaL_error(L, "Need at least two vertices to draw a line"); + + float *coords = new float[args]; + if (is_table) + { + for (int i = 0; i < args; ++i) + { + lua_rawgeti(L, 1, i + 1); + coords[i] = luax_tofloat(L, -1); + lua_pop(L, 1); + } + } + else + { + for (int i = 0; i < args; ++i) + coords[i] = luax_tofloat(L, i + 1); + } + + instance->polyline(coords, args); + + delete[] coords; + return 0; +} + +int w_rectangle(lua_State *L) +{ + Graphics::DrawMode mode; + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, mode)) + return luaL_error(L, "Incorrect draw mode %s", str); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float w = (float)luaL_checknumber(L, 4); + float h = (float)luaL_checknumber(L, 5); + instance->rectangle(mode, x, y, w, h); + return 0; +} + +int w_circle(lua_State *L) +{ + Graphics::DrawMode mode; + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, mode)) + return luaL_error(L, "Incorrect draw mode %s", str); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float radius = (float)luaL_checknumber(L, 4); + int points; + if (lua_isnoneornil(L, 5)) + points = radius > 10 ? (int)(radius) : 10; + else + points = luaL_checkint(L, 5); + + instance->circle(mode, x, y, radius, points); + return 0; +} + +int w_arc(lua_State *L) +{ + Graphics::DrawMode mode; + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, mode)) + return luaL_error(L, "Incorrect draw mode %s", str); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float radius = (float)luaL_checknumber(L, 4); + float angle1 = (float)luaL_checknumber(L, 5); + float angle2 = (float)luaL_checknumber(L, 6); + int points; + if (lua_isnoneornil(L, 7)) + points = radius > 10 ? (int)(radius) : 10; + else + points = luaL_checkint(L, 7); + + instance->arc(mode, x, y, radius, angle1, angle2, points); + return 0; +} + +int w_polygon(lua_State *L) +{ + int args = lua_gettop(L) - 1; + + Graphics::DrawMode mode; + const char *str = luaL_checkstring(L, 1); + if (!Graphics::getConstant(str, mode)) + return luaL_error(L, "Invalid draw mode: %s", str); + + bool is_table = false; + float *coords; + if (args == 1 && lua_istable(L, 2)) + { + args = lua_objlen(L, 2); + is_table = true; + } + + if (args % 2 != 0) + return luaL_error(L, "Number of vertices must be a multiple of two"); + else if (args < 6) + return luaL_error(L, "Need at least three vertices to draw a polygon"); + + // fetch coords + coords = new float[args + 2]; + if (is_table) + { + for (int i = 0; i < args; ++i) + { + lua_rawgeti(L, 2, i + 1); + coords[i] = luax_tofloat(L, -1); + lua_pop(L, 1); + } + } + else + { + for (int i = 0; i < args; ++i) + coords[i] = luax_tofloat(L, i + 2); + } + + // make a closed loop + coords[args] = coords[0]; + coords[args+1] = coords[1]; + instance->polygon(mode, coords, args+2); + delete[] coords; + + return 0; +} + +int w_push(lua_State *L) +{ + EXCEPT_GUARD(instance->push();) + return 0; +} + +int w_pop(lua_State *L) +{ + EXCEPT_GUARD(instance->pop();) + return 0; +} + +int w_rotate(lua_State *L) +{ + float angle = (float)luaL_checknumber(L, 1); + instance->rotate(angle); + return 0; +} + +int w_scale(lua_State *L) +{ + float sx = (float)luaL_optnumber(L, 1, 1.0f); + float sy = (float)luaL_optnumber(L, 2, sx); + instance->scale(sx, sy); + return 0; +} + +int w_translate(lua_State *L) +{ + float x = (float)luaL_checknumber(L, 1); + float y = (float)luaL_checknumber(L, 2); + instance->translate(x, y); + return 0; +} + +int w_shear(lua_State *L) +{ + float kx = (float)luaL_checknumber(L, 1); + float ky = (float)luaL_checknumber(L, 2); + instance->shear(kx, ky); + return 0; +} + +int w_origin(lua_State * /*L*/) +{ + instance->origin(); + return 0; +} + + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "reset", w_reset }, + { "clear", w_clear }, + { "present", w_present }, + + { "newImage", w_newImage }, + { "newQuad", w_newQuad }, + { "newFont", w_newFont }, + { "newImageFont", w_newImageFont }, + { "newSpriteBatch", w_newSpriteBatch }, + { "newParticleSystem", w_newParticleSystem }, + { "newCanvas", w_newCanvas }, + { "newShader", w_newShader }, + { "newMesh", w_newMesh }, + + { "setColor", w_setColor }, + { "getColor", w_getColor }, + { "setBackgroundColor", w_setBackgroundColor }, + { "getBackgroundColor", w_getBackgroundColor }, + + { "setFont", w_setFont }, + { "getFont", w_getFont }, + + { "setColorMask", w_setColorMask }, + { "getColorMask", w_getColorMask }, + { "setBlendMode", w_setBlendMode }, + { "getBlendMode", w_getBlendMode }, + { "setDefaultFilter", w_setDefaultFilter }, + { "getDefaultFilter", w_getDefaultFilter }, + { "setDefaultMipmapFilter", w_setDefaultMipmapFilter }, + { "getDefaultMipmapFilter", w_getDefaultMipmapFilter }, + { "setLineWidth", w_setLineWidth }, + { "setLineStyle", w_setLineStyle }, + { "setLineJoin", w_setLineJoin }, + { "getLineWidth", w_getLineWidth }, + { "getLineStyle", w_getLineStyle }, + { "getLineJoin", w_getLineJoin }, + { "setPointSize", w_setPointSize }, + { "setPointStyle", w_setPointStyle }, + { "getPointSize", w_getPointSize }, + { "getPointStyle", w_getPointStyle }, + { "getMaxPointSize", w_getMaxPointSize }, + { "getMaxImageSize", w_getMaxImageSize }, + { "newScreenshot", w_newScreenshot }, + { "setCanvas", w_setCanvas }, + { "getCanvas", w_getCanvas }, + + { "setShader", w_setShader }, + { "getShader", w_getShader }, + { "_setDefaultShaderCode", w_setDefaultShaderCode }, + + { "isSupported", w_isSupported }, + { "getRendererInfo", w_getRendererInfo }, + + { "draw", w_draw }, + + { "print", w_print }, + { "printf", w_printf }, + + { "isCreated", w_isCreated }, + { "getWidth", w_getWidth }, + { "getHeight", w_getHeight }, + { "getDimensions", w_getDimensions }, + + { "setScissor", w_setScissor }, + { "getScissor", w_getScissor }, + + { "setStencil", w_setStencil }, + { "setInvertedStencil", w_setInvertedStencil }, + + { "point", w_point }, + { "line", w_line }, + { "rectangle", w_rectangle }, + { "circle", w_circle }, + { "arc", w_arc }, + + { "polygon", w_polygon }, + + { "push", w_push }, + { "pop", w_pop }, + { "rotate", w_rotate }, + { "scale", w_scale }, + { "translate", w_translate }, + { "shear", w_shear }, + { "origin", w_origin }, + + { 0, 0 } +}; + +// Types for this module. +static const lua_CFunction types[] = +{ + luaopen_font, + luaopen_image, + luaopen_quad, + luaopen_spritebatch, + luaopen_particlesystem, + luaopen_canvas, + luaopen_shader, + luaopen_mesh, + 0 +}; + +extern "C" int luaopen_love_graphics(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new Graphics();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "graphics"; + w.flags = MODULE_GRAPHICS_T; + w.functions = functions; + w.types = types; + + int n = luax_register_module(L, w); + + if (luaL_loadbuffer(L, (const char *)graphics_lua, sizeof(graphics_lua), "graphics.lua") == 0) + lua_call(L, 0, 0); + + return n; +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_Graphics.h b/jni/love/src/modules/graphics/opengl/wrap_Graphics.h new file mode 100644 index 00000000..3c989c9a --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Graphics.h @@ -0,0 +1,118 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_GRAPHICS_H +#define LOVE_GRAPHICS_OPENGL_WRAP_GRAPHICS_H + +// LOVE +#include "wrap_Font.h" +#include "wrap_Image.h" +#include "wrap_Quad.h" +#include "wrap_SpriteBatch.h" +#include "wrap_ParticleSystem.h" +#include "wrap_Canvas.h" +#include "wrap_Shader.h" +#include "wrap_Mesh.h" +#include "Graphics.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +int w_reset(lua_State *L); +int w_clear(lua_State *L); +int w_present(lua_State *L); +int w_isCreated(lua_State *L); +int w_getWidth(lua_State *L); +int w_getHeight(lua_State *L); +int w_getDimensions(lua_State *L); +int w_setScissor(lua_State *L); +int w_getScissor(lua_State *L); +int w_setStencil(lua_State *L); +int w_setInvertedStencil(lua_State *L); +int w_getMaxImageSize(lua_State *L); +int w_newImage(lua_State *L); +int w_newQuad(lua_State *L); +int w_newFont(lua_State *L); +int w_newImageFont(lua_State *L); +int w_newSpriteBatch(lua_State *L); +int w_newParticleSystem(lua_State *L); +int w_newCanvas(lua_State *L); // comments in function +int w_newShader(lua_State *L); +int w_newMesh(lua_State *L); +int w_setColor(lua_State *L); +int w_getColor(lua_State *L); +int w_setBackgroundColor(lua_State *L); +int w_getBackgroundColor(lua_State *L); +int w_setFont(lua_State *L); +int w_getFont(lua_State *L); +int w_setColorMask(lua_State *L); +int w_getColorMask(lua_State *L); +int w_setBlendMode(lua_State *L); +int w_getBlendMode(lua_State *L); +int w_setDefaultFilter(lua_State *L); +int w_getDefaultFilter(lua_State *L); +int w_setDefaultMipmapFilter(lua_State *L); +int w_getDefaultMipmapFilter(lua_State *L); +int w_setLineWidth(lua_State *L); +int w_setLineStyle(lua_State *L); +int w_setLineJoin(lua_State *L); +int w_getLineWidth(lua_State *L); +int w_getLineStyle(lua_State *L); +int w_getLineJoin(lua_State *L); +int w_setPointSize(lua_State *L); +int w_setPointStyle(lua_State *L); +int w_getPointSize(lua_State *L); +int w_getPointStyle(lua_State *L); +int w_getMaxPointSize(lua_State *L); +int w_newScreenshot(lua_State *L); +int w_setCanvas(lua_State *L); +int w_getCanvas(lua_State *L); +int w_setShader(lua_State *L); +int w_getShader(lua_State *L); +int w_setDefaultShaderCode(lua_State *L); +int w_isSupported(lua_State *L); +int w_getRendererInfo(lua_State *L); +int w_draw(lua_State *L); +int w_print(lua_State *L); +int w_printf(lua_State *L); +int w_point(lua_State *L); +int w_line(lua_State *L); +int w_rectangle(lua_State *L); +int w_circle(lua_State *L); +int w_arc(lua_State *L); +int w_polygon(lua_State *L); +int w_push(lua_State *L); +int w_pop(lua_State *L); +int w_rotate(lua_State *L); +int w_scale(lua_State *L); +int w_translate(lua_State *L); +int w_shear(lua_State *L); +int w_origin(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_graphics(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_GRAPHICS_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Image.cpp b/jni/love/src/modules/graphics/opengl/wrap_Image.cpp new file mode 100644 index 00000000..76f360e5 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Image.cpp @@ -0,0 +1,229 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Image.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Image *luax_checkimage(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Image", GRAPHICS_IMAGE_T); +} + +int w_Image_getWidth(lua_State *L) +{ + Image *t = luax_checkimage(L, 1); + lua_pushnumber(L, t->getWidth()); + return 1; +} + +int w_Image_getHeight(lua_State *L) +{ + Image *t = luax_checkimage(L, 1); + lua_pushnumber(L, t->getHeight()); + return 1; +} + +int w_Image_getDimensions(lua_State *L) +{ + Image *t = luax_checkimage(L, 1); + lua_pushnumber(L, t->getWidth()); + lua_pushnumber(L, t->getHeight()); + return 2; +} + +int w_Image_setFilter(lua_State *L) +{ + Image *t = luax_checkimage(L, 1); + Image::Filter f = t->getFilter(); + + const char *minstr = luaL_checkstring(L, 2); + const char *magstr = luaL_optstring(L, 3, minstr); + + if (!Image::getConstant(minstr, f.min)) + return luaL_error(L, "Invalid filter mode: %s", minstr); + if (!Image::getConstant(magstr, f.mag)) + return luaL_error(L, "Invalid filter mode: %s", magstr); + + f.anisotropy = (float) luaL_optnumber(L, 4, 1.0); + + EXCEPT_GUARD(t->setFilter(f);) + return 0; +} + +int w_Image_getFilter(lua_State *L) +{ + Image *t = luax_checkimage(L, 1); + const Image::Filter f = t->getFilter(); + const char *minstr; + const char *magstr; + Image::getConstant(f.min, minstr); + Image::getConstant(f.mag, magstr); + lua_pushstring(L, minstr); + lua_pushstring(L, magstr); + lua_pushnumber(L, f.anisotropy); + return 3; +} + +int w_Image_setMipmapFilter(lua_State *L) +{ + Image *t = luax_checkimage(L, 1); + Image::Filter f = t->getFilter(); + + if (lua_isnoneornil(L, 2)) + f.mipmap = Image::FILTER_NONE; // mipmapping is disabled if no argument is given + else + { + const char *mipmapstr = luaL_checkstring(L, 2); + if (!Image::getConstant(mipmapstr, f.mipmap)) + return luaL_error(L, "Invalid filter mode: %s", mipmapstr); + } + + EXCEPT_GUARD(t->setFilter(f);) + + float sharpness = (float) luaL_optnumber(L, 3, 0); + t->setMipmapSharpness(sharpness); + + return 0; +} + +int w_Image_getMipmapFilter(lua_State *L) +{ + Image *t = luax_checkimage(L, 1); + + const Image::Filter &f = t->getFilter(); + + const char *mipmapstr; + if (Image::getConstant(f.mipmap, mipmapstr)) + lua_pushstring(L, mipmapstr); + else + lua_pushnil(L); // only return a mipmap filter if mipmapping is enabled + + lua_pushnumber(L, t->getMipmapSharpness()); + return 2; +} + +int w_Image_setWrap(lua_State *L) +{ + Image *i = luax_checkimage(L, 1); + + Image::Wrap w; + + const char *sstr = luaL_checkstring(L, 2); + const char *tstr = luaL_optstring(L, 3, sstr); + + if (!Image::getConstant(sstr, w.s)) + return luaL_error(L, "Invalid wrap mode: %s", sstr); + if (!Image::getConstant(tstr, w.t)) + return luaL_error(L, "Invalid wrap mode, %s", tstr); + + i->setWrap(w); + + return 0; +} + +int w_Image_getWrap(lua_State *L) +{ + Image *i = luax_checkimage(L, 1); + const Image::Wrap w = i->getWrap(); + const char *sstr; + const char *tstr; + Image::getConstant(w.s, sstr); + Image::getConstant(w.t, tstr); + lua_pushstring(L, sstr); + lua_pushstring(L, tstr); + return 2; +} + +int w_Image_isCompressed(lua_State *L) +{ + Image *i = luax_checkimage(L, 1); + luax_pushboolean(L, i->isCompressed()); + return 1; +} + +int w_Image_refresh(lua_State *L) +{ + Image *i = luax_checkimage(L, 1); + EXCEPT_GUARD(i->refresh();) + return 0; +} + +int w_Image_getData(lua_State *L) +{ + Image *i = luax_checkimage(L, 1); + + if (i->isCompressed()) + { + love::image::CompressedData *t = i->getCompressedData(); + if (t) + { + t->retain(); + luax_pushtype(L, "CompressedData", IMAGE_COMPRESSED_DATA_T, t); + } + else + lua_pushnil(L); + } + else + { + love::image::ImageData *t = i->getImageData(); + if (t) + { + t->retain(); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); + } + else + lua_pushnil(L); + } + + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getWidth", w_Image_getWidth }, + { "getHeight", w_Image_getHeight }, + { "getDimensions", w_Image_getDimensions }, + { "setFilter", w_Image_setFilter }, + { "getFilter", w_Image_getFilter }, + { "setWrap", w_Image_setWrap }, + { "getWrap", w_Image_getWrap }, + { "setMipmapFilter", w_Image_setMipmapFilter }, + { "getMipmapFilter", w_Image_getMipmapFilter }, + { "isCompressed", w_Image_isCompressed }, + { "refresh", w_Image_refresh }, + { "getData", w_Image_getData }, + { 0, 0 } +}; + +extern "C" int luaopen_image(lua_State *L) +{ + return luax_register_type(L, "Image", functions); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_Image.h b/jni/love/src/modules/graphics/opengl/wrap_Image.h new file mode 100644 index 00000000..2b1a680e --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Image.h @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_IMAGE_H +#define LOVE_GRAPHICS_OPENGL_WRAP_IMAGE_H + +// LOVE +#include "common/runtime.h" +#include "Image.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Image *luax_checkimage(lua_State *L, int idx); +int w_Image_getWidth(lua_State *L); +int w_Image_getHeight(lua_State *L); +int w_Image_getDimensions(lua_State *L); +int w_Image_setFilter(lua_State *L); +int w_Image_getFilter(lua_State *L); +int w_Image_setMipmapFilter(lua_State *L); +int w_Image_getMipmapFilter(lua_State *L); +int w_Image_setWrap(lua_State *L); +int w_Image_getWrap(lua_State *L); +int w_Image_isCompressed(lua_State *L); +int w_Image_refresh(lua_State *L); +int w_Image_getData(lua_State *L); +extern "C" int luaopen_image(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_IMAGE_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Mesh.cpp b/jni/love/src/modules/graphics/opengl/wrap_Mesh.cpp new file mode 100644 index 00000000..624eecbf --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Mesh.cpp @@ -0,0 +1,327 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Mesh.h" +#include "wrap_Image.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Mesh *luax_checkmesh(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Mesh", GRAPHICS_MESH_T); +} + +int w_Mesh_setVertex(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + size_t i = size_t(luaL_checkinteger(L, 2) - 1); + + Vertex v; + + if (lua_istable(L, 3)) + { + for (int i = 1; i <= 8; i++) + lua_rawgeti(L, 3, i); + + v.x = luaL_checknumber(L, -8); + v.y = luaL_checknumber(L, -7); + v.s = luaL_checknumber(L, -6); + v.t = luaL_checknumber(L, -5); + v.r = luaL_optinteger(L, -4, 255); + v.g = luaL_optinteger(L, -3, 255); + v.b = luaL_optinteger(L, -2, 255); + v.a = luaL_optinteger(L, -1, 255); + + lua_pop(L, 8); + } + else + { + v.x = luaL_checknumber(L, 3); + v.y = luaL_checknumber(L, 4); + v.s = luaL_checknumber(L, 5); + v.t = luaL_checknumber(L, 6); + v.r = luaL_optinteger(L, 7, 255); + v.g = luaL_optinteger(L, 8, 255); + v.b = luaL_optinteger(L, 9, 255); + v.a = luaL_optinteger(L, 10, 255); + } + + EXCEPT_GUARD(t->setVertex(i, v);) + return 0; +} + +int w_Mesh_getVertex(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + size_t i = (size_t) (luaL_checkinteger(L, 2) - 1); + + Vertex v; + EXCEPT_GUARD(v = t->getVertex(i);) + + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + lua_pushnumber(L, v.s); + lua_pushnumber(L, v.t); + lua_pushnumber(L, v.r); + lua_pushnumber(L, v.g); + lua_pushnumber(L, v.b); + lua_pushnumber(L, v.a); + + return 8; +} + +int w_Mesh_setVertices(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + + size_t vertex_count = lua_objlen(L, 2); + std::vector vertices; + vertices.reserve(vertex_count); + + // Get the vertices from the table. + for (size_t i = 1; i <= vertex_count; i++) + { + lua_rawgeti(L, 2, i); + + if (lua_type(L, -1) != LUA_TTABLE) + return luax_typerror(L, 2, "table of tables"); + + for (int j = 1; j <= 8; j++) + lua_rawgeti(L, -j, j); + + Vertex v; + + v.x = (float) luaL_checknumber(L, -8); + v.y = (float) luaL_checknumber(L, -7); + + v.s = (float) luaL_checknumber(L, -6); + v.t = (float) luaL_checknumber(L, -5); + + v.r = (unsigned char) luaL_optinteger(L, -4, 255); + v.g = (unsigned char) luaL_optinteger(L, -3, 255); + v.b = (unsigned char) luaL_optinteger(L, -2, 255); + v.a = (unsigned char) luaL_optinteger(L, -1, 255); + + lua_pop(L, 9); + vertices.push_back(v); + } + + EXCEPT_GUARD(t->setVertices(vertices);) + return 0; +} + +int w_Mesh_getVertices(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + + const Vertex *vertices = t->getVertices(); + + size_t count = t->getVertexCount(); + lua_createtable(L, count, 0); + + for (size_t i = 0; i < count; i++) + { + // Create vertex table. + lua_createtable(L, 8, 0); + + lua_pushnumber(L, vertices[i].x); + lua_rawseti(L, -2, 1); + + lua_pushnumber(L, vertices[i].y); + lua_rawseti(L, -2, 2); + + lua_pushnumber(L, vertices[i].s); + lua_rawseti(L, -2, 3); + + lua_pushnumber(L, vertices[i].t); + lua_rawseti(L, -2, 4); + + lua_pushnumber(L, vertices[i].r); + lua_rawseti(L, -2, 5); + + lua_pushnumber(L, vertices[i].g); + lua_rawseti(L, -2, 6); + + lua_pushnumber(L, vertices[i].b); + lua_rawseti(L, -2, 7); + + lua_pushnumber(L, vertices[i].a); + lua_rawseti(L, -2, 8); + + // Insert vertex table into vertices table. + lua_rawseti(L, -2, i + 1); + } + + // Return vertices table. + return 1; +} + +int w_Mesh_getVertexCount(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + lua_pushinteger(L, t->getVertexCount()); + return 1; +} + +int w_Mesh_setVertexMap(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + + bool is_table = lua_istable(L, 2); + int nargs = is_table ? lua_objlen(L, 2) : lua_gettop(L) - 1; + + std::vector vertexmap; + vertexmap.reserve(nargs); + + for (int i = 0; i < nargs; i++) + { + if (is_table) + { + lua_rawgeti(L, 2, i + 1); + vertexmap.push_back(uint32(luaL_checkinteger(L, -1) - 1)); + lua_pop(L, 1); + } + else + vertexmap.push_back(uint32(luaL_checkinteger(L, i + 2) - 1)); + } + + EXCEPT_GUARD(t->setVertexMap(vertexmap);) + return 0; +} + +int w_Mesh_getVertexMap(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + const uint32 *vertex_map = 0; + + EXCEPT_GUARD(vertex_map = t->getVertexMap();) + size_t elements = t->getVertexMapCount(); + + lua_createtable(L, elements, 0); + + for (size_t i = 0; i < elements; i++) + { + lua_pushinteger(L, lua_Integer(vertex_map[i]) + 1); + lua_rawseti(L, -2, i + 1); + } + + return 1; +} + +int w_Mesh_setImage(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + + if (lua_isnoneornil(L, 2)) + t->setImage(); + else + { + Image *img = luax_checkimage(L, 2); + t->setImage(img); + } + + return 0; +} + +int w_Mesh_getImage(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + Image *img = t->getImage(); + + if (img == NULL) + return 0; + + img->retain(); + luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, img); + return 1; +} + +int w_Mesh_setDrawMode(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + const char *str = luaL_checkstring(L, 2); + Mesh::DrawMode mode; + + if (!Mesh::getConstant(str, mode)) + return luaL_error(L, "Invalid mesh draw mode: %s", str); + + t->setDrawMode(mode); + return 0; +} + +int w_Mesh_getDrawMode(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + Mesh::DrawMode mode = t->getDrawMode(); + const char *str; + + if (!Mesh::getConstant(mode, str)) + return luaL_error(L, "Unknown mesh draw mode."); + + lua_pushstring(L, str); + return 1; +} + +int w_Mesh_setVertexColors(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + t->setVertexColors(luax_toboolean(L, 2)); + return 0; +} + +int w_Mesh_hasVertexColors(lua_State *L) +{ + Mesh *t = luax_checkmesh(L, 1); + luax_pushboolean(L, t->hasVertexColors()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "setVertex", w_Mesh_setVertex }, + { "getVertex", w_Mesh_getVertex }, + { "setVertices", w_Mesh_setVertices }, + { "getVertices", w_Mesh_getVertices }, + { "getVertexCount", w_Mesh_getVertexCount }, + { "setVertexMap", w_Mesh_setVertexMap }, + { "getVertexMap", w_Mesh_getVertexMap }, + { "setImage", w_Mesh_setImage }, + { "getImage", w_Mesh_getImage }, + { "setDrawMode", w_Mesh_setDrawMode }, + { "getDrawMode", w_Mesh_getDrawMode }, + { "setVertexColors", w_Mesh_setVertexColors }, + { "hasVertexColors", w_Mesh_hasVertexColors }, + { 0, 0 } +}; + +extern "C" int luaopen_mesh(lua_State *L) +{ + return luax_register_type(L, "Mesh", functions); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_Mesh.h b/jni/love/src/modules/graphics/opengl/wrap_Mesh.h new file mode 100644 index 00000000..1204bbce --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Mesh.h @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_MESH_H +#define LOVE_GRAPHICS_OPENGL_WRAP_MESH_H + +// LOVE +#include "common/runtime.h" +#include "Mesh.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Mesh *luax_checkmesh(lua_State *L, int idx); + +int w_Mesh_setVertex(lua_State *L); +int w_Mesh_getVertex(lua_State *L); +int w_Mesh_setVertices(lua_State *L); +int w_Mesh_getVertices(lua_State *L); +int w_Mesh_getVertexCount(lua_State *L); +int w_Mesh_setVertexMap(lua_State *L); +int w_Mesh_getVertexMap(lua_State *L); +int w_Mesh_setImage(lua_State *L); +int w_Mesh_getImage(lua_State *L); +int w_Mesh_setDrawMode(lua_State *L); +int w_Mesh_getDrawMode(lua_State *L); +int w_Mesh_setVertexColors(lua_State *L); +int w_Mesh_hasVertexColors(lua_State *L); + +extern "C" int luaopen_mesh(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_MESH_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.cpp b/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.cpp new file mode 100644 index 00000000..a1b098e7 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.cpp @@ -0,0 +1,669 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_ParticleSystem.h" + +#include "common/Vector.h" + +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +ParticleSystem *luax_checkparticlesystem(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "ParticleSystem", GRAPHICS_PARTICLE_SYSTEM_T); +} + +int w_ParticleSystem_setImage(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + Image *i = luax_checkimage(L, 2); + t->setImage(i); + return 0; +} + +int w_ParticleSystem_getImage(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + Image *i = t->getImage(); + i->retain(); + luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, i); + return 1; +} + +int w_ParticleSystem_setBufferSize(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_Number arg1 = luaL_checknumber(L, 2); + if (arg1 < 1.0 || arg1 > ParticleSystem::MAX_PARTICLES) + return luaL_error(L, "Invalid buffer size"); + + EXCEPT_GUARD(t->setBufferSize((uint32) arg1);) + return 0; +} + +int w_ParticleSystem_getBufferSize(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_pushinteger(L, t->getBufferSize()); + return 1; +} + +int w_ParticleSystem_setInsertMode(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + ParticleSystem::InsertMode mode; + const char *str = luaL_checkstring(L, 2); + if (!ParticleSystem::getConstant(str, mode)) + return luaL_error(L, "Invalid insert mode: '%s'", str); + t->setInsertMode(mode); + return 0; +} + +int w_ParticleSystem_getInsertMode(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + ParticleSystem::InsertMode mode; + mode = t->getInsertMode(); + const char *str; + if (!ParticleSystem::getConstant(mode, str)) + return luaL_error(L, "Unknown insert mode"); + lua_pushstring(L, str); + return 1; +} + +int w_ParticleSystem_setEmissionRate(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + int arg1 = luaL_checkint(L, 2); + EXCEPT_GUARD(t->setEmissionRate(arg1);) + return 0; +} + +int w_ParticleSystem_getEmissionRate(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_pushinteger(L, t->getEmissionRate()); + return 1; +} + +int w_ParticleSystem_setEmitterLifetime(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setEmitterLifetime(arg1); + return 0; +} + +int w_ParticleSystem_getEmitterLifetime(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_pushnumber(L, t->getEmitterLifetime()); + return 1; +} + +int w_ParticleSystem_setParticleLifetime(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_optnumber(L, 3, arg1); + t->setParticleLifetime(arg1, arg2); + return 0; +} + +int w_ParticleSystem_getParticleLifetime(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float min, max; + t->getParticleLifetime(&min, &max); + lua_pushnumber(L, min); + lua_pushnumber(L, max); + return 2; +} + +int w_ParticleSystem_setPosition(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_checknumber(L, 3); + t->setPosition(arg1, arg2); + return 0; +} + +int w_ParticleSystem_getPosition(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + love::Vector pos = t->getPosition(); + lua_pushnumber(L, pos.getX()); + lua_pushnumber(L, pos.getY()); + return 2; +} + +int w_ParticleSystem_setAreaSpread(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + + ParticleSystem::AreaSpreadDistribution distribution = ParticleSystem::DISTRIBUTION_NONE; + float x = 0.f, y = 0.f; + + const char *str = lua_isnoneornil(L, 2) ? 0 : luaL_checkstring(L, 2); + if (str && !ParticleSystem::getConstant(str, distribution)) + return luaL_error(L, "Invalid particle distribution: %s", str); + + if (distribution != ParticleSystem::DISTRIBUTION_NONE) + { + x = (float) luaL_checknumber(L, 3); + y = (float) luaL_checknumber(L, 4); + if (x < 0.0f || y < 0.0f) + return luaL_error(L, "Invalid area spread parameters (must be >= 0)"); + } + + t->setAreaSpread(distribution, x, y); + return 0; +} + +int w_ParticleSystem_getAreaSpread(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + ParticleSystem::AreaSpreadDistribution distribution = t-> getAreaSpreadDistribution(); + const char *str; + ParticleSystem::getConstant(distribution, str); + const love::Vector &p = t->getAreaSpreadParameters(); + + lua_pushstring(L, str); + lua_pushnumber(L, p.x); + lua_pushnumber(L, p.y); + + return 3; +} + +int w_ParticleSystem_setDirection(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setDirection(arg1); + return 0; +} + +int w_ParticleSystem_getDirection(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_pushnumber(L, t->getDirection()); + return 1; +} + +int w_ParticleSystem_setSpread(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setSpread(arg1); + return 0; +} + +int w_ParticleSystem_getSpread(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_pushnumber(L, t->getSpread()); + return 1; +} + +int w_ParticleSystem_setSpeed(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_optnumber(L, 3, arg1); + t->setSpeed(arg1, arg2); + return 0; +} + +int w_ParticleSystem_getSpeed(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float min, max; + t->getSpeed(&min, &max); + lua_pushnumber(L, min); + lua_pushnumber(L, max); + return 2; +} + +int w_ParticleSystem_setLinearAcceleration(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float xmin = (float) luaL_checknumber(L, 2); + float ymin = (float) luaL_checknumber(L, 3); + float xmax = (float) luaL_optnumber(L, 4, xmin); + float ymax = (float) luaL_optnumber(L, 5, ymin); + t->setLinearAcceleration(xmin, ymin, xmax, ymax); + return 0; +} + +int w_ParticleSystem_getLinearAcceleration(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + love::Vector min, max; + t->getLinearAcceleration(&min, &max); + lua_pushnumber(L, min.x); + lua_pushnumber(L, min.y); + lua_pushnumber(L, max.x); + lua_pushnumber(L, max.y); + return 4; +} + +int w_ParticleSystem_setRadialAcceleration(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_optnumber(L, 3, arg1); + t->setRadialAcceleration(arg1, arg2); + return 0; +} + +int w_ParticleSystem_getRadialAcceleration(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float min, max; + t->getRadialAcceleration(&min, &max); + lua_pushnumber(L, min); + lua_pushnumber(L, max); + return 2; +} + +int w_ParticleSystem_setTangentialAcceleration(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_optnumber(L, 3, arg1); + t->setTangentialAcceleration(arg1, arg2); + return 0; +} + +int w_ParticleSystem_getTangentialAcceleration(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float min, max; + t->getTangentialAcceleration(&min, &max); + lua_pushnumber(L, min); + lua_pushnumber(L, max); + return 2; +} + +int w_ParticleSystem_setSizes(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + size_t nSizes = lua_gettop(L) - 1; + + if (nSizes > 8) + return luaL_error(L, "At most eight (8) sizes may be used."); + + if (nSizes <= 1) + { + float size = luax_checkfloat(L, 2); + t->setSize(size); + } + else + { + std::vector sizes(nSizes); + for (size_t i = 0; i < nSizes; ++i) + sizes[i] = luax_checkfloat(L, 1 + i + 1); + + t->setSizes(sizes); + } + return 0; +} + +int w_ParticleSystem_getSizes(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + const std::vector &sizes = t->getSizes(); + + for (size_t i = 0; i < sizes.size(); i++) + lua_pushnumber(L, sizes[i]); + + return sizes.size(); +} + +int w_ParticleSystem_setSizeVariation(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + if (arg1 < 0.0f || arg1 > 1.0f) + return luaL_error(L, "Size variation has to be between 0 and 1, inclusive."); + + t->setSizeVariation(arg1); + return 0; +} + +int w_ParticleSystem_getSizeVariation(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_pushnumber(L, t->getSizeVariation()); + return 1; +} + +int w_ParticleSystem_setRotation(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_optnumber(L, 3, arg1); + t->setRotation(arg1, arg2); + return 0; +} + +int w_ParticleSystem_getRotation(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float min, max; + t->getRotation(&min, &max); + lua_pushnumber(L, min); + lua_pushnumber(L, max); + return 2; +} + +int w_ParticleSystem_setSpin(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_optnumber(L, 3, arg1); + t->setSpin(arg1, arg2); + return 0; +} + +int w_ParticleSystem_getSpin(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float start, end; + t->getSpin(&start, &end); + lua_pushnumber(L, start); + lua_pushnumber(L, end); + return 2; +} + +int w_ParticleSystem_setSpinVariation(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setSpinVariation(arg1); + return 0; +} + +int w_ParticleSystem_getSpinVariation(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_pushnumber(L, t->getSpinVariation()); + return 1; +} + +int w_ParticleSystem_setOffset(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + t->setOffset(x, y); + return 0; +} + +int w_ParticleSystem_getOffset(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + love::Vector offset = t->getOffset(); + lua_pushnumber(L, offset.getX()); + lua_pushnumber(L, offset.getY()); + return 2; +} + +int w_ParticleSystem_setColors(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + + if (lua_istable(L, 2)) // setColors({r,g,b,a}, {r,g,b,a}, ...) + { + size_t nColors = lua_gettop(L) - 1; + + if (nColors > 8) + return luaL_error(L, "At most eight (8) colors may be used."); + + std::vector colors(nColors); + + for (size_t i = 0; i < nColors; i++) + { + luaL_checktype(L, i + 2, LUA_TTABLE); + + if (lua_objlen(L, i + 2) < 3) + return luaL_argerror(L, i + 2, "expected 4 color components"); + + for (int j = 0; j < 4; j++) + // push args[i+2][j+1] onto the stack + lua_rawgeti(L, i + 2, j + 1); + + unsigned char r = (unsigned char) luaL_checkinteger(L, -4); + unsigned char g = (unsigned char) luaL_checkinteger(L, -3); + unsigned char b = (unsigned char) luaL_checkinteger(L, -2); + unsigned char a = (unsigned char) luaL_optinteger(L, -1, 255); + + // pop the color components from the stack + lua_pop(L, 4); + + colors[i] = Color(r, g, b, a); + } + + t->setColor(colors); + } + else // setColors(r,g,b,a, r,g,b,a, ...) + { + int cargs = lua_gettop(L) - 1; + size_t nColors = (cargs + 3) / 4; // nColors = ceil(color_args / 4) + + if (cargs != 3 && (cargs % 4 != 0 || cargs == 0)) + return luaL_error(L, "Expected red, green, blue, and alpha. Only got %d of 4 components.", cargs % 4); + + if (nColors > 8) + return luaL_error(L, "At most eight (8) colors may be used."); + + if (nColors == 1) + { + unsigned char r = (unsigned char) luaL_checkinteger(L, 2); + unsigned char g = (unsigned char) luaL_checkinteger(L, 3); + unsigned char b = (unsigned char) luaL_checkinteger(L, 4); + unsigned char a = (unsigned char) luaL_optinteger(L, 5, 255); + t->setColor(Color(r,g,b,a)); + } + else + { + std::vector colors(nColors); + for (size_t i = 0; i < nColors; ++i) + { + unsigned char r = (unsigned char) luaL_checkinteger(L, 1 + i*4 + 1); + unsigned char g = (unsigned char) luaL_checkinteger(L, 1 + i*4 + 2); + unsigned char b = (unsigned char) luaL_checkinteger(L, 1 + i*4 + 3); + unsigned char a = (unsigned char) luaL_checkinteger(L, 1 + i*4 + 4); + colors[i] = Color(r,g,b,a); + } + t->setColor(colors); + } + } + + return 0; +} + +int w_ParticleSystem_getColors(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + + const std::vector &colors =t->getColor(); + + for (size_t i = 0; i < colors.size(); i++) + { + lua_createtable(L, 4, 0); + + lua_pushinteger(L, colors[i].r); + lua_rawseti(L, -2, 1); + lua_pushinteger(L, colors[i].g); + lua_rawseti(L, -2, 2); + lua_pushinteger(L, colors[i].b); + lua_rawseti(L, -2, 3); + lua_pushinteger(L, colors[i].a); + lua_rawseti(L, -2, 4); + } + + return colors.size(); +} + +int w_ParticleSystem_getCount(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + lua_pushnumber(L, t->getCount()); + return 1; +} + +int w_ParticleSystem_start(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + t->start(); + return 0; +} + +int w_ParticleSystem_stop(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + t->stop(); + return 0; +} + +int w_ParticleSystem_pause(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + t->pause(); + return 0; +} + +int w_ParticleSystem_reset(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + t->reset(); + return 0; +} + +int w_ParticleSystem_emit(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + int num = luaL_checkint(L, 2); + t->emit(num); + return 0; +} + +int w_ParticleSystem_isActive(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + luax_pushboolean(L, t->isActive()); + return 1; +} + +int w_ParticleSystem_isPaused(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + luax_pushboolean(L, t->isPaused()); + return 1; +} + +int w_ParticleSystem_isStopped(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + luax_pushboolean(L, t->isStopped()); + return 1; +} + +int w_ParticleSystem_update(lua_State *L) +{ + ParticleSystem *t = luax_checkparticlesystem(L, 1); + float dt = (float)luaL_checknumber(L, 2); + t->update(dt); + return 0; +} + +static const luaL_Reg functions[] = +{ + { "setImage", w_ParticleSystem_setImage }, + { "getImage", w_ParticleSystem_getImage }, + { "setBufferSize", w_ParticleSystem_setBufferSize }, + { "getBufferSize", w_ParticleSystem_getBufferSize }, + { "setInsertMode", w_ParticleSystem_setInsertMode }, + { "getInsertMode", w_ParticleSystem_getInsertMode }, + { "setEmissionRate", w_ParticleSystem_setEmissionRate }, + { "getEmissionRate", w_ParticleSystem_getEmissionRate }, + { "setEmitterLifetime", w_ParticleSystem_setEmitterLifetime }, + { "getEmitterLifetime", w_ParticleSystem_getEmitterLifetime }, + { "setParticleLifetime", w_ParticleSystem_setParticleLifetime }, + { "getParticleLifetime", w_ParticleSystem_getParticleLifetime }, + { "setPosition", w_ParticleSystem_setPosition }, + { "getPosition", w_ParticleSystem_getPosition }, + { "setAreaSpread", w_ParticleSystem_setAreaSpread }, + { "getAreaSpread", w_ParticleSystem_getAreaSpread }, + { "setDirection", w_ParticleSystem_setDirection }, + { "getDirection", w_ParticleSystem_getDirection }, + { "setSpread", w_ParticleSystem_setSpread }, + { "getSpread", w_ParticleSystem_getSpread }, + { "setSpeed", w_ParticleSystem_setSpeed }, + { "getSpeed", w_ParticleSystem_getSpeed }, + { "setLinearAcceleration", w_ParticleSystem_setLinearAcceleration }, + { "getLinearAcceleration", w_ParticleSystem_getLinearAcceleration }, + { "setRadialAcceleration", w_ParticleSystem_setRadialAcceleration }, + { "getRadialAcceleration", w_ParticleSystem_getRadialAcceleration }, + { "setTangentialAcceleration", w_ParticleSystem_setTangentialAcceleration }, + { "getTangentialAcceleration", w_ParticleSystem_getTangentialAcceleration }, + { "setSizes", w_ParticleSystem_setSizes }, + { "getSizes", w_ParticleSystem_getSizes }, + { "setSizeVariation", w_ParticleSystem_setSizeVariation }, + { "getSizeVariation", w_ParticleSystem_getSizeVariation }, + { "setRotation", w_ParticleSystem_setRotation }, + { "getRotation", w_ParticleSystem_getRotation }, + { "setSpin", w_ParticleSystem_setSpin }, + { "getSpin", w_ParticleSystem_getSpin }, + { "setSpinVariation", w_ParticleSystem_setSpinVariation }, + { "getSpinVariation", w_ParticleSystem_getSpinVariation }, + { "setColors", w_ParticleSystem_setColors }, + { "getColors", w_ParticleSystem_getColors }, + { "setOffset", w_ParticleSystem_setOffset }, + { "getOffset", w_ParticleSystem_getOffset }, + { "getCount", w_ParticleSystem_getCount }, + { "start", w_ParticleSystem_start }, + { "stop", w_ParticleSystem_stop }, + { "pause", w_ParticleSystem_pause }, + { "reset", w_ParticleSystem_reset }, + { "emit", w_ParticleSystem_emit }, + { "isActive", w_ParticleSystem_isActive }, + { "isPaused", w_ParticleSystem_isPaused }, + { "isStopped", w_ParticleSystem_isStopped }, + { "update", w_ParticleSystem_update }, + { 0, 0 } +}; + +extern "C" int luaopen_particlesystem(lua_State *L) +{ + return luax_register_type(L, "ParticleSystem", functions); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.h b/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.h new file mode 100644 index 00000000..0b0474a4 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_ParticleSystem.h @@ -0,0 +1,95 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_PARTICLE_SYSTEM_H +#define LOVE_GRAPHICS_OPENGL_WRAP_PARTICLE_SYSTEM_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Image.h" +#include "ParticleSystem.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +ParticleSystem *luax_checkparticlesystem(lua_State *L, int idx); +int w_ParticleSystem_setImage(lua_State *L); +int w_ParticleSystem_getImage(lua_State *L); +int w_ParticleSystem_setBufferSize(lua_State *L); +int w_ParticleSystem_getBufferSize(lua_State *L); +int w_ParticleSystem_setInsertMode(lua_State *L); +int w_ParticleSystem_getInsertMode(lua_State *L); +int w_ParticleSystem_setEmissionRate(lua_State *L); +int w_ParticleSystem_getEmissionRate(lua_State *L); +int w_ParticleSystem_setEmitterLifetime(lua_State *L); +int w_ParticleSystem_getEmitterLifetime(lua_State *L); +int w_ParticleSystem_setParticleLifetime(lua_State *L); +int w_ParticleSystem_getParticleLifetime(lua_State *L); +int w_ParticleSystem_setPosition(lua_State *L); +int w_ParticleSystem_getPosition(lua_State *L); +int w_ParticleSystem_setAreaSpread(lua_State *L); +int w_ParticleSystem_getAreaSpread(lua_State *L); +int w_ParticleSystem_setDirection(lua_State *L); +int w_ParticleSystem_getDirection(lua_State *L); +int w_ParticleSystem_setSpread(lua_State *L); +int w_ParticleSystem_getSpread(lua_State *L); +int w_ParticleSystem_setSpeed(lua_State *L); +int w_ParticleSystem_getSpeed(lua_State *L); +int w_ParticleSystem_setLinearAcceleration(lua_State *L); +int w_ParticleSystem_getLinearAcceleration(lua_State *L); +int w_ParticleSystem_setRadialAcceleration(lua_State *L); +int w_ParticleSystem_getRadialAcceleration(lua_State *L); +int w_ParticleSystem_setTangentialAcceleration(lua_State *L); +int w_ParticleSystem_getTangentialAcceleration(lua_State *L); +int w_ParticleSystem_setSizes(lua_State *L); +int w_ParticleSystem_getSizes(lua_State *L); +int w_ParticleSystem_setSizeVariation(lua_State *L); +int w_ParticleSystem_getSizeVariation(lua_State *L); +int w_ParticleSystem_setRotation(lua_State *L); +int w_ParticleSystem_getRotation(lua_State *L); +int w_ParticleSystem_setSpin(lua_State *L); +int w_ParticleSystem_getSpin(lua_State *L); +int w_ParticleSystem_setSpinVariation(lua_State *L); +int w_ParticleSystem_getSpinVariation(lua_State *L); +int w_ParticleSystem_setColors(lua_State *L); +int w_ParticleSystem_getColors(lua_State *L); +int w_ParticleSystem_setOffset(lua_State *L); +int w_ParticleSystem_getOffset(lua_State *L); +int w_ParticleSystem_getCount(lua_State *L); +int w_ParticleSystem_start(lua_State *L); +int w_ParticleSystem_stop(lua_State *L); +int w_ParticleSystem_pause(lua_State *L); +int w_ParticleSystem_reset(lua_State *L); +int w_ParticleSystem_emit(lua_State *L); +int w_ParticleSystem_isActive(lua_State *L); +int w_ParticleSystem_isPaused(lua_State *L); +int w_ParticleSystem_isStopped(lua_State *L); +int w_ParticleSystem_update(lua_State *L); +extern "C" int luaopen_particlesystem(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_PARTICLE_SYSTEM_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Quad.cpp b/jni/love/src/modules/graphics/opengl/wrap_Quad.cpp new file mode 100644 index 00000000..32f11e0a --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Quad.cpp @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Quad.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Quad *luax_checkquad(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Quad", GRAPHICS_QUAD_T); +} + +int w_Quad_setViewport(lua_State *L) +{ + Quad *quad = luax_checkquad(L, 1); + + Quad::Viewport v; + v.x = (float) luaL_checknumber(L, 2); + v.y = (float) luaL_checknumber(L, 3); + v.w = (float) luaL_checknumber(L, 4); + v.h = (float) luaL_checknumber(L, 5); + + if (lua_isnoneornil(L, 6)) + quad->setViewport(v); + else + { + float sw = (float) luaL_checknumber(L, 6); + float sh = (float) luaL_checknumber(L, 7); + quad->refresh(v, sw, sh); + } + + return 0; +} + +int w_Quad_getViewport(lua_State *L) +{ + Quad *quad = luax_checkquad(L, 1); + Quad::Viewport v = quad->getViewport(); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + lua_pushnumber(L, v.w); + lua_pushnumber(L, v.h); + return 4; +} + +static const luaL_Reg functions[] = +{ + { "setViewport", w_Quad_setViewport }, + { "getViewport", w_Quad_getViewport }, + { 0, 0 } +}; + +extern "C" int luaopen_quad(lua_State *L) +{ + return luax_register_type(L, "Quad", functions); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_Quad.h b/jni/love/src/modules/graphics/opengl/wrap_Quad.h new file mode 100644 index 00000000..f4d3f182 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Quad.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_QUAD_H +#define LOVE_GRAPHICS_OPENGL_WRAP_QUAD_H + +// LOVE +#include "common/runtime.h" +#include "graphics/Quad.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Quad *luax_checkquad(lua_State *L, int idx); +int w_Quad_setViewport(lua_State *L); +int w_Quad_getViewport(lua_State *L); +extern "C" int luaopen_quad(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_QUAD_H diff --git a/jni/love/src/modules/graphics/opengl/wrap_Shader.cpp b/jni/love/src/modules/graphics/opengl/wrap_Shader.cpp new file mode 100644 index 00000000..a2cb1eb4 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Shader.cpp @@ -0,0 +1,383 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Shader.h" +#include "wrap_Image.h" +#include "wrap_Canvas.h" +#include +#include + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Shader *luax_checkshader(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Shader", GRAPHICS_SHADER_T); +} + +int w_Shader_getWarnings(lua_State *L) +{ + Shader *shader = luax_checkshader(L, 1); + lua_pushstring(L, shader->getWarnings().c_str()); + return 1; +} + +template +static T *_getScalars(lua_State *L, int count, size_t &dimension) +{ + dimension = 1; + T *values = new T[count]; + + for (int i = 0; i < count; ++i) + { + if (lua_isnumber(L, 3 + i)) + values[i] = static_cast(lua_tonumber(L, 3 + i)); + else if (lua_isboolean(L, 3 + i)) + values[i] = static_cast(lua_toboolean(L, 3 + i)); + else + { + delete[] values; + luax_typerror(L, 3 + i, "number or boolean"); + return 0; + } + } + + return values; +} + +template +static T *_getVectors(lua_State *L, int count, size_t &dimension) +{ + dimension = lua_objlen(L, 3); + T *values = new T[count * dimension]; + + for (int i = 0; i < count; ++i) + { + if (!lua_istable(L, 3 + i)) + { + delete[] values; + luax_typerror(L, 3 + i, "table"); + return 0; + } + if (lua_objlen(L, 3 + i) != dimension) + { + delete[] values; + luaL_error(L, "Error in argument %d: Expected table size %d, got %d.", + 3+i, dimension, lua_objlen(L, 3+i)); + return 0; + } + + for (size_t k = 1; k <= dimension; ++k) + { + lua_rawgeti(L, 3 + i, k); + if (lua_isnumber(L, -1)) + values[i * dimension + k - 1] = static_cast(lua_tonumber(L, -1)); + else if (lua_isboolean(L, -1)) + values[i * dimension + k - 1] = static_cast(lua_toboolean(L, -1)); + else + { + delete[] values; + luax_typerror(L, -1, "number or boolean"); + return 0; + } + } + lua_pop(L, int(dimension)); + } + + return values; +} + +int w_Shader_sendInt(lua_State *L) +{ + Shader *shader = luax_checkshader(L, 1); + const char *name = luaL_checkstring(L, 2); + int count = lua_gettop(L) - 2; + + if (count < 1) + return luaL_error(L, "No variable to send."); + + int *values = 0; + size_t dimension = 1; + + if (lua_isnumber(L, 3) || lua_isboolean(L, 3)) + values = _getScalars(L, count, dimension); + else if (lua_istable(L, 3)) + values = _getVectors(L, count, dimension); + else + return luax_typerror(L, 3, "number, boolean, or table"); + + if (!values) + return luaL_error(L, "Error in arguments."); + + bool should_error = false; + try + { + shader->sendInt(name, dimension, values, count); + } + catch (love::Exception &e) + { + should_error = true; + lua_pushstring(L, e.what()); + } + + delete[] values; + + if (should_error) + return luaL_error(L, "%s", lua_tostring(L, -1)); + + return 0; +} + +int w_Shader_sendFloat(lua_State *L) +{ + Shader *shader = luax_checkshader(L, 1); + const char *name = luaL_checkstring(L, 2); + int count = lua_gettop(L) - 2; + + if (count < 1) + return luaL_error(L, "No variable to send."); + + float *values = 0; + size_t dimension = 1; + + if (lua_isnumber(L, 3) || lua_isboolean(L, 3)) + values = _getScalars(L, count, dimension); + else if (lua_istable(L, 3)) + values = _getVectors(L, count, dimension); + else + return luax_typerror(L, 3, "number, boolean, or table"); + + if (!values) + return luaL_error(L, "Error in arguments."); + + bool should_error = false; + try + { + shader->sendFloat(name, dimension, values, count); + } + catch (love::Exception &e) + { + should_error = true; + lua_pushstring(L, e.what()); + } + + delete[] values; + + if (should_error) + return luaL_error(L, "%s", lua_tostring(L, -1)); + + return 0; +} + +int w_Shader_sendMatrix(lua_State *L) +{ + int count = lua_gettop(L) - 2; + Shader *shader = luax_checkshader(L, 1); + const char *name = luaL_checkstring(L, 2); + + if (!lua_istable(L, 3)) + return luax_typerror(L, 3, "matrix table"); + + lua_getfield(L, 3, "dimension"); + int dimension = lua_tointeger(L, -1); + lua_pop(L, 1); + + if (dimension < 2 || dimension > 4) + return luaL_error(L, "Invalid matrix size: %dx%d (only 2x2, 3x3 and 4x4 matrices are supported).", + dimension, dimension); + + float *values = new float[dimension * dimension * count]; + for (int i = 0; i < count; ++i) + { + lua_getfield(L, 3+i, "dimension"); + if (lua_tointeger(L, -1) != dimension) + { + // You unlock this door with the key of imagination. Beyond it is + // another dimension: a dimension of sound, a dimension of sight, + // a dimension of mind. You're moving into a land of both shadow + // and substance, of things and ideas. You've just crossed over + // into... the Twilight Zone. + int other_dimension = lua_tointeger(L, -1); + delete[] values; + return luaL_error(L, "Invalid matrix size at argument %d: Expected size %dx%d, got %dx%d.", + 3+i, dimension, dimension, other_dimension, other_dimension); + } + + for (int k = 1; k <= dimension*dimension; ++k) + { + lua_rawgeti(L, 3+i, k); + values[i * dimension * dimension + k - 1] = (float)lua_tonumber(L, -1); + } + + lua_pop(L, 1 + dimension); + } + + bool should_error = false; + + try + { + shader->sendMatrix(name, dimension, values, count); + } + catch(love::Exception &e) + { + should_error = true; + lua_pushstring(L, e.what()); + } + + delete[] values; + + if (should_error) + return luaL_error(L, "%s", lua_tostring(L, -1)); + + return 0; +} + +int w_Shader_sendImage(lua_State *L) +{ + Shader *shader = luax_checkshader(L, 1); + const char *name = luaL_checkstring(L, 2); + Image *img = luax_checkimage(L, 3); + + EXCEPT_GUARD(shader->sendImage(name, *img);) + return 0; +} + +int w_Shader_sendCanvas(lua_State *L) +{ + Shader *shader = luax_checkshader(L, 1); + const char *name = luaL_checkstring(L, 2); + Canvas *canvas = luax_checkcanvas(L, 3); + + EXCEPT_GUARD(shader->sendCanvas(name, *canvas);) + return 0; +} + +// Convert matrices on the stack for use with sendMatrix. +static void w_convertMatrices(lua_State *L, int idx) +{ + int matrixcount = lua_gettop(L) - (idx - 1); + + for (int matrix = idx; matrix < idx + matrixcount; matrix++) + { + luaL_checktype(L, matrix, LUA_TTABLE); + int dimension = lua_objlen(L, matrix); + + int newi = 1; + lua_createtable(L, dimension * dimension, 0); + + // Collapse {{a,b,c}, {d,e,f}, ...} to {a,b,c, d,e,f, ...} + for (size_t i = 1; i <= lua_objlen(L, matrix); i++) + { + // Push args[matrix][i] onto the stack. + lua_rawgeti(L, matrix, i); + luaL_checktype(L, -1, LUA_TTABLE); + + for (size_t j = 1; j <= lua_objlen(L, -1); j++) + { + // Push args[matrix[i][j] onto the stack. + lua_rawgeti(L, -1, j); + luaL_checktype(L, -1, LUA_TNUMBER); + + // newtable[newi] = args[matrix][i][j] + lua_rawseti(L, -3, newi++); + } + + lua_pop(L, 1); + } + + // newtable.dimension = #args[matrix] + lua_pushinteger(L, dimension); + lua_setfield(L, -2, "dimension"); + + // Replace args[i] with the new table + lua_replace(L, matrix); + } +} + +int w_Shader_send(lua_State *L) +{ + int ttype = lua_type(L, 3); + Proxy *p = 0; + + switch (ttype) + { + case LUA_TNUMBER: + case LUA_TBOOLEAN: + // Scalar float/boolean. + return w_Shader_sendFloat(L); + break; + case LUA_TUSERDATA: + // Image or Canvas. + p = (Proxy *) lua_touserdata(L, 3); + + if (p->flags[GRAPHICS_IMAGE_ID]) + return w_Shader_sendImage(L); + else if (p->flags[GRAPHICS_CANVAS_ID]) + return w_Shader_sendCanvas(L); + + break; + case LUA_TTABLE: + // Vector or Matrix. + lua_rawgeti(L, 3, 1); + ttype = lua_type(L, -1); + lua_pop(L, 1); + + if (ttype == LUA_TNUMBER || ttype == LUA_TBOOLEAN) + return w_Shader_sendFloat(L); + else if (ttype == LUA_TTABLE) + { + w_convertMatrices(L, 3); + return w_Shader_sendMatrix(L); + } + + break; + default: + break; + } + + return luaL_argerror(L, 3, "number, boolean, table, image, or canvas expected"); +} + +static const luaL_Reg functions[] = +{ + { "getWarnings", w_Shader_getWarnings }, + { "sendInt", w_Shader_sendInt }, + { "sendBoolean", w_Shader_sendInt }, + { "sendFloat", w_Shader_sendFloat }, + { "sendMatrix", w_Shader_sendMatrix }, + { "sendImage", w_Shader_sendImage }, + { "sendCanvas", w_Shader_sendCanvas }, + { "send", w_Shader_send }, + { 0, 0 } +}; + +extern "C" int luaopen_shader(lua_State *L) +{ + return luax_register_type(L, "Shader", functions); +} + +} // opengl +} // graphics +} // love + diff --git a/jni/love/src/modules/graphics/opengl/wrap_Shader.h b/jni/love/src/modules/graphics/opengl/wrap_Shader.h new file mode 100644 index 00000000..af092c61 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_Shader.h @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_PROGRAM_H +#define LOVE_GRAPHICS_OPENGL_WRAP_PROGRAM_H + +#include "common/runtime.h" +#include "Shader.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +Shader *luax_checkshader(lua_State *L, int idx); +int w_Shader_getWarnings(lua_State *L); +int w_Shader_sendInt(lua_State *L); +int w_Shader_sendFloat(lua_State *L); +int w_Shader_sendMatrix(lua_State *L); +int w_Shader_sendImage(lua_State *L); +int w_Shader_sendCanvas(lua_State *L); +int w_Shader_send(lua_State *L); +extern "C" int luaopen_shader(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif diff --git a/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.cpp b/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.cpp new file mode 100644 index 00000000..65e2ff09 --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.cpp @@ -0,0 +1,244 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Image.h" +#include "wrap_SpriteBatch.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +SpriteBatch *luax_checkspritebatch(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "SpriteBatch", GRAPHICS_SPRITE_BATCH_T); +} + +int w_SpriteBatch_add(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + Quad *quad = 0; + int startidx = 2; + + if (luax_istype(L, 2, GRAPHICS_QUAD_T)) + { + quad = luax_totype(L, 2, "Quad", GRAPHICS_QUAD_T); + startidx = 3; + } + else if (lua_isnil(L, 2) && !lua_isnoneornil(L, 3)) + return luax_typerror(L, 2, "Quad"); + + float x = (float) luaL_optnumber(L, startidx + 0, 0.0); + float y = (float) luaL_optnumber(L, startidx + 1, 0.0); + float a = (float) luaL_optnumber(L, startidx + 2, 0.0); + float sx = (float) luaL_optnumber(L, startidx + 3, 1.0); + float sy = (float) luaL_optnumber(L, startidx + 4, sx); + float ox = (float) luaL_optnumber(L, startidx + 5, 0.0); + float oy = (float) luaL_optnumber(L, startidx + 6, 0.0); + float kx = (float) luaL_optnumber(L, startidx + 7, 0.0); + float ky = (float) luaL_optnumber(L, startidx + 8, 0.0); + + int id = 0; + EXCEPT_GUARD( + if (quad) + id = t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky); + else + id = t->add(x, y, a, sx, sy, ox, oy, kx, ky); + ) + + lua_pushinteger(L, id); + return 1; +} + +int w_SpriteBatch_set(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + int id = luaL_checkinteger(L, 2); + + Quad *quad = 0; + int startidx = 3; + + if (luax_istype(L, 3, GRAPHICS_QUAD_T)) + { + quad = luax_totype(L, 3, "Quad", GRAPHICS_QUAD_T); + startidx = 4; + } + else if (lua_isnil(L, 3) && !lua_isnoneornil(L, 4)) + return luax_typerror(L, 3, "Quad"); + + float x = (float) luaL_optnumber(L, startidx + 0, 0.0); + float y = (float) luaL_optnumber(L, startidx + 1, 0.0); + float a = (float) luaL_optnumber(L, startidx + 2, 0.0); + float sx = (float) luaL_optnumber(L, startidx + 3, 1.0); + float sy = (float) luaL_optnumber(L, startidx + 4, sx); + float ox = (float) luaL_optnumber(L, startidx + 5, 0.0); + float oy = (float) luaL_optnumber(L, startidx + 6, 0.0); + float kx = (float) luaL_optnumber(L, startidx + 7, 0.0); + float ky = (float) luaL_optnumber(L, startidx + 8, 0.0); + + EXCEPT_GUARD( + if (quad) + t->addq(quad, x, y, a, sx, sy, ox, oy, kx, ky, id); + else + t->add(x, y, a, sx, sy, ox, oy, kx, ky, id); + ) + + return 0; +} + +int w_SpriteBatch_clear(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + t->clear(); + return 0; +} + +int w_SpriteBatch_bind(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + EXCEPT_GUARD(t->lock();) + return 0; +} + +int w_SpriteBatch_unbind(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + t->unlock(); + return 0; +} + +int w_SpriteBatch_setImage(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + Image *image = luax_checktype(L, 2, "Image", GRAPHICS_IMAGE_T); + t->setImage(image); + return 0; +} + +int w_SpriteBatch_getImage(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + Image *image = t->getImage(); + image->retain(); + luax_pushtype(L, "Image", GRAPHICS_IMAGE_T, image); + return 1; +} + +int w_SpriteBatch_setColor(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + Color c; + + if (lua_gettop(L) <= 1) + { + t->setColor(); + return 0; + } + else if (lua_istable(L, 2)) + { + for (int i = 1; i <= 4; i++) + lua_rawgeti(L, 2, i); + + c.r = (unsigned char) luaL_checkinteger(L, -4); + c.g = (unsigned char) luaL_checkinteger(L, -3); + c.b = (unsigned char) luaL_checkinteger(L, -2); + c.a = (unsigned char) luaL_optinteger(L, -1, 255); + + lua_pop(L, 4); + } + else + { + c.r = (unsigned char)luaL_checkinteger(L, 2); + c.g = (unsigned char)luaL_checkinteger(L, 3); + c.b = (unsigned char)luaL_checkinteger(L, 4); + c.a = (unsigned char)luaL_optinteger(L, 5, 255); + } + + t->setColor(c); + + return 0; +} + +int w_SpriteBatch_getColor(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + const Color *color = t->getColor(); + + // getColor returns NULL if no color is set. + if (!color) + return 0; + + lua_pushinteger(L, (lua_Integer) color->r); + lua_pushinteger(L, (lua_Integer) color->g); + lua_pushinteger(L, (lua_Integer) color->b); + lua_pushinteger(L, (lua_Integer) color->a); + + return 4; +} + +int w_SpriteBatch_getCount(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + lua_pushinteger(L, t->getCount()); + return 1; +} + +int w_SpriteBatch_setBufferSize(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + int size = luaL_checkint(L, 2); + EXCEPT_GUARD(t->setBufferSize(size);) + return 0; +} + +int w_SpriteBatch_getBufferSize(lua_State *L) +{ + SpriteBatch *t = luax_checkspritebatch(L, 1); + lua_pushinteger(L, t->getBufferSize()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "add", w_SpriteBatch_add }, + { "set", w_SpriteBatch_set }, + { "clear", w_SpriteBatch_clear }, + { "bind", w_SpriteBatch_bind }, + { "unbind", w_SpriteBatch_unbind }, + { "setImage", w_SpriteBatch_setImage }, + { "getImage", w_SpriteBatch_getImage }, + { "setColor", w_SpriteBatch_setColor }, + { "getColor", w_SpriteBatch_getColor }, + { "getCount", w_SpriteBatch_getCount }, + { "setBufferSize", w_SpriteBatch_setBufferSize }, + { "getBufferSize", w_SpriteBatch_getBufferSize }, + { 0, 0 } +}; + +extern "C" int luaopen_spritebatch(lua_State *L) +{ + return luax_register_type(L, "SpriteBatch", functions); +} + +} // opengl +} // graphics +} // love diff --git a/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.h b/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.h new file mode 100644 index 00000000..10e4384f --- /dev/null +++ b/jni/love/src/modules/graphics/opengl/wrap_SpriteBatch.h @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_GRAPHICS_OPENGL_WRAP_SPRITE_BATCH_H +#define LOVE_GRAPHICS_OPENGL_WRAP_SPRITE_BATCH_H + +#include "common/runtime.h" +#include "SpriteBatch.h" + +namespace love +{ +namespace graphics +{ +namespace opengl +{ + +SpriteBatch *luax_checkspritebatch(lua_State *L, int idx); +int w_SpriteBatch_add(lua_State *L); +int w_SpriteBatch_addg(lua_State *L); +int w_SpriteBatch_set(lua_State *L); +int w_SpriteBatch_setg(lua_State *L); +int w_SpriteBatch_clear(lua_State *L); +int w_SpriteBatch_bind(lua_State *L); +int w_SpriteBatch_unbind(lua_State *L); +int w_SpriteBatch_setImage(lua_State *L); +int w_SpriteBatch_getImage(lua_State *L); +int w_SpriteBatch_setColor(lua_State *L); +int w_SpriteBatch_getColor(lua_State *L); +int w_SpriteBatch_getCount(lua_State *L); +int w_SpriteBatch_setBufferSize(lua_State *L); +int w_SpriteBatch_getBufferSize(lua_State *L); + +extern "C" int luaopen_spritebatch(lua_State *L); + +} // opengl +} // graphics +} // love + +#endif // LOVE_GRAPHICS_OPENGL_WRAP_SPRITE_BATCH_H diff --git a/jni/love/src/modules/image/CompressedData.cpp b/jni/love/src/modules/image/CompressedData.cpp new file mode 100644 index 00000000..7e0a698c --- /dev/null +++ b/jni/love/src/modules/image/CompressedData.cpp @@ -0,0 +1,118 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "CompressedData.h" + +namespace love +{ +namespace image +{ + +CompressedData::CompressedData() + : format(FORMAT_UNKNOWN) + , data(0) + , dataSize(0) +{ +} + +CompressedData::~CompressedData() +{ +} + +int CompressedData::getSize() const +{ + return int(dataSize); +} + +void *CompressedData::getData() const +{ + return data; +} + +int CompressedData::getMipmapCount() const +{ + return dataImages.size(); +} + +int CompressedData::getSize(int miplevel) const +{ + checkMipmapLevelExists(miplevel); + + return int(dataImages[miplevel].size); +} + +void *CompressedData::getData(int miplevel) const +{ + checkMipmapLevelExists(miplevel); + + return (void *) &dataImages[miplevel].data[0]; +} + +int CompressedData::getWidth(int miplevel) const +{ + checkMipmapLevelExists(miplevel); + + return dataImages[miplevel].width; +} + +int CompressedData::getHeight(int miplevel) const +{ + checkMipmapLevelExists(miplevel); + + return dataImages[miplevel].height; +} + +CompressedData::Format CompressedData::getFormat() const +{ + return format; +} + +void CompressedData::checkMipmapLevelExists(int miplevel) const +{ + if (miplevel < 0 || miplevel >= (int) dataImages.size()) + throw love::Exception("Mipmap level %d does not exist", miplevel); +} + +bool CompressedData::getConstant(const char *in, CompressedData::Format &out) +{ + return formats.find(in, out); +} + +bool CompressedData::getConstant(CompressedData::Format in, const char *&out) +{ + return formats.find(in, out); +} + +StringMap::Entry CompressedData::formatEntries[] = +{ + {"unknown", CompressedData::FORMAT_UNKNOWN}, + {"dxt1", CompressedData::FORMAT_DXT1}, + {"dxt3", CompressedData::FORMAT_DXT3}, + {"dxt5", CompressedData::FORMAT_DXT5}, + {"bc4", CompressedData::FORMAT_BC4}, + {"bc4s", CompressedData::FORMAT_BC4s}, + {"bc5", CompressedData::FORMAT_BC5}, + {"bc5s", CompressedData::FORMAT_BC5s}, +}; + +StringMap CompressedData::formats(CompressedData::formatEntries, sizeof(CompressedData::formatEntries)); + +} // image +} // love diff --git a/jni/love/src/modules/image/CompressedData.h b/jni/love/src/modules/image/CompressedData.h new file mode 100644 index 00000000..303bcf6a --- /dev/null +++ b/jni/love/src/modules/image/CompressedData.h @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_COMPRESSED_DATA_H +#define LOVE_IMAGE_COMPRESSED_DATA_H + +// LOVE +#include "common/Data.h" +#include "common/StringMap.h" +#include "common/int.h" + +// STL +#include + +namespace love +{ +namespace image +{ + +/** + * CompressedData represents image data which is designed to be uploaded to the + * GPU and rendered in its compressed form, without being un-compressed. + * http://renderingpipeline.com/2012/07/texture-compression/ + **/ +class CompressedData : public Data +{ +public: + + // Recognized compressed image data formats. + enum Format + { + FORMAT_UNKNOWN, + FORMAT_DXT1, + FORMAT_DXT3, + FORMAT_DXT5, + FORMAT_BC4, + FORMAT_BC4s, + FORMAT_BC5, + FORMAT_BC5s, + FORMAT_MAX_ENUM + }; + + // Compressed image data can have multiple mipmap levels, each represented + // by a sub-image. + struct SubImage + { + int width, height; + size_t size; + uint8 *data; // Should not have ownership of the data. + }; + + CompressedData(); + virtual ~CompressedData(); + + // Implements Data. + virtual void *getData() const; + virtual int getSize() const; + + /** + * Gets the number of mipmaps in this Compressed Image Data. + * Includes the base image level. + **/ + int getMipmapCount() const; + + /** + * Gets the size in bytes of a sub-image at the specified mipmap level. + **/ + int getSize(int miplevel) const; + + /** + * Gets the byte data of a sub-image at the specified mipmap level. + **/ + void *getData(int miplevel) const; + + /** + * Gets the width of a sub-image at the specified mipmap level. + **/ + int getWidth(int miplevel) const; + + /** + * Gets the height of a sub-image at the specified mipmap level. + **/ + int getHeight(int miplevel) const; + + /** + * Gets the format of the compressed data. + **/ + Format getFormat() const; + + static bool getConstant(const char *in, Format &out); + static bool getConstant(Format in, const char *&out); + +protected: + + Format format; + + // Single block of memory containing all of the sub-images. + uint8 *data; + size_t dataSize; + + // Texture info for each mipmap level. + std::vector dataImages; + + void checkMipmapLevelExists(int miplevel) const; + +private: + + static StringMap::Entry formatEntries[]; + static StringMap formats; + +}; // CompressedData + +} // image +} // love + +#endif // LOVE_IMAGE_COMPRESSED_DATA_H diff --git a/jni/love/src/modules/image/Image.h b/jni/love/src/modules/image/Image.h new file mode 100644 index 00000000..096cca01 --- /dev/null +++ b/jni/love/src/modules/image/Image.h @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_IMAGE_H +#define LOVE_IMAGE_IMAGE_H + +// LOVE +#include "common/config.h" +#include "common/Module.h" +#include "filesystem/File.h" +#include "ImageData.h" +#include "CompressedData.h" + +namespace love +{ +namespace image +{ + +/** + * This module is responsible for decoding files such as PNG, GIF, JPEG + * into raw pixel data, as well as parsing compressed formats which are designed + * to be uploaded to the GPU and rendered without being un-compressed. + * This module does not know how to draw images on screen; only love.graphics + * knows that. + **/ +class Image : public Module +{ +public: + + /** + * Destructor. + **/ + virtual ~Image() {}; + + /** + * Creates new ImageData from FileData. + * @param data The FileData containing the encoded image data. + * @return The new ImageData. + **/ + virtual ImageData *newImageData(love::filesystem::FileData *data) = 0; + + /** + * Creates empty ImageData with the given size. + * @param width The width of the ImageData. + * @param height The height of the ImageData. + * @return The new ImageData. + **/ + virtual ImageData *newImageData(int width, int height) = 0; + + /** + * Creates empty ImageData with the given size. + * @param width The width of the ImageData. + * @param height The height of the ImageData. + * @param data The data to load into the ImageData. + * @param own Whether the new ImageData should take ownership of the data or + * copy it. + * @return The new ImageData. + **/ + virtual ImageData *newImageData(int width, int height, void *data, bool own = false) = 0; + + /** + * Creates new CompressedData from FileData. + * @param data The FileData containing the compressed image data. + * @return The new CompressedData. + **/ + virtual CompressedData *newCompressedData(love::filesystem::FileData *data) = 0; + + /** + * Determines whether a FileData is Compressed image data or not. + * @param data The FileData to test. + **/ + virtual bool isCompressed(love::filesystem::FileData *data) = 0; + +}; // Image + +} // image +} // love + +#endif // LOVE_IMAGE_IMAGE_H \ No newline at end of file diff --git a/jni/love/src/modules/image/ImageData.cpp b/jni/love/src/modules/image/ImageData.cpp new file mode 100644 index 00000000..8fdc585b --- /dev/null +++ b/jni/love/src/modules/image/ImageData.cpp @@ -0,0 +1,190 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "ImageData.h" + +using love::thread::Lock; + +namespace love +{ +namespace image +{ + +ImageData::ImageData() + : data(0) +{ + mutex = thread::newMutex(); +} + +ImageData::~ImageData() +{ + delete mutex; +} + +int ImageData::getSize() const +{ + return getWidth()*getHeight()*sizeof(pixel); +} + +void *ImageData::getData() const +{ + return data; +} + +bool ImageData::inside(int x, int y) const +{ + return x >= 0 && x < getWidth() && y >= 0 && y < getHeight(); +} + +int ImageData::getWidth() const +{ + return width; +} + +int ImageData::getHeight() const +{ + return height; +} + +void ImageData::setPixel(int x, int y, pixel c) +{ + if (!inside(x, y)) + throw love::Exception("Attempt to set out-of-range pixel!"); + + Lock lock(mutex); + + pixel *pixels = (pixel *) getData(); + pixels[y*getWidth()+x] = c; +} + +void ImageData::setPixelUnsafe(int x, int y, love::image::pixel c) +{ + if (!inside(x, y)) + throw love::Exception("Attempt to set out-of-range pixel!"); + + pixel *pixels = (pixel *) getData(); + pixels[y*getWidth()+x] = c; +} + +pixel ImageData::getPixel(int x, int y) const +{ + if (!inside(x, y)) + throw love::Exception("Attempt to get out-of-range pixel!"); + + const pixel *pixels = (const pixel *) getData(); + return pixels[y*getWidth()+x]; +} + +void ImageData::paste(ImageData *src, int dx, int dy, int sx, int sy, int sw, int sh) +{ + Lock lock2(src->mutex); + Lock lock1(mutex); + + pixel *s = (pixel *)src->getData(); + pixel *d = (pixel *)getData(); + + // Check bounds; if the data ends up completely out of bounds, get out early. + if (sx >= src->getWidth() || sx + sw < 0 || sy >= src->getHeight() || sy + sh < 0 + || dx >= getWidth() || dx + sw < 0 || dy >= getHeight() || dy + sh < 0) + return; + + // Normalize values to the inside of both images. + if (dx < 0) + { + sw += dx; + sx -= dx; + dx = 0; + } + if (dy < 0) + { + sh += dy; + sy -= dy; + dy = 0; + } + if (sx < 0) + { + sw += sx; + dx -= sx; + sx = 0; + } + if (sy < 0) + { + sh += sy; + dy -= sy; + sy = 0; + } + if (dx + sw > getWidth()) + { + sw = getWidth() - dx; + } + if (dy + sh > getHeight()) + { + sh = getHeight() - dy; + } + if (sx + sw > src->getWidth()) + { + sw = src->getWidth() - sx; + } + if (sy + sh > src->getHeight()) + { + sh = src->getHeight() - sy; + } + + // If the dimensions match up, copy the entire memory stream in one go + if (sw == getWidth() && getWidth() == src->getWidth() + && sh == getHeight() && getHeight() == src->getHeight()) + { + memcpy(d, s, sizeof(pixel) * sw * sh); + } + else if (sw > 0) + { + // Otherwise, copy each row individually. + for (int i = 0; i < sh; i++) + memcpy(d + dx + (i + dy) * getWidth(), s + sx + (i + sy) * src->getWidth(), sizeof(pixel) * sw); + } +} + +love::thread::Mutex *ImageData::getMutex() const +{ + return mutex; +} + +bool ImageData::getConstant(const char *in, ImageData::Format &out) +{ + return formats.find(in, out); +} + +bool ImageData::getConstant(ImageData::Format in, const char *&out) +{ + return formats.find(in, out); +} + +StringMap::Entry ImageData::formatEntries[] = +{ + {"tga", ImageData::FORMAT_TGA}, + {"bmp", ImageData::FORMAT_BMP}, + {"jpg", ImageData::FORMAT_JPG}, + {"png", ImageData::FORMAT_PNG}, +}; + +StringMap ImageData::formats(ImageData::formatEntries, sizeof(ImageData::formatEntries)); + +} // image +} // love diff --git a/jni/love/src/modules/image/ImageData.h b/jni/love/src/modules/image/ImageData.h new file mode 100644 index 00000000..7d8f70b5 --- /dev/null +++ b/jni/love/src/modules/image/ImageData.h @@ -0,0 +1,161 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_IMAGE_DATA_H +#define LOVE_IMAGE_IMAGE_DATA_H + +// LOVE +#include "common/Data.h" +#include "filesystem/File.h" +#include "thread/threads.h" + +using love::thread::Mutex; + +namespace love +{ +namespace image +{ + +// Pixel format structure. +struct pixel +{ + // Red, green, blue, alpha. + unsigned char r, g, b, a; +}; + +/** + * Represents raw pixel data. + **/ +class ImageData : public Data +{ +public: + + enum Format + { + FORMAT_TGA = 1, + FORMAT_BMP, + FORMAT_JPG, + FORMAT_PNG, + FORMAT_MAX_ENUM + }; + + ImageData(); + + /** + * Destructor. + **/ + virtual ~ImageData(); + + static bool getConstant(const char *in, Format &out); + static bool getConstant(Format in, const char *&out); + + /** + * Paste part of one ImageData onto another. The subregion defined by the top-left + * corner (sx, sy) and the size (sw,sh) will be pasted to (dx,dy) in this ImageData. + * @param dx The destination x-coordinate. + * @param dy The destination y-coordinate. + * @param sx The source x-coordinate. + * @param sy The source y-coordinate. + * @param sw The source width. + * @param sh The source height. + **/ + void paste(ImageData *src, int dx, int dy, int sx, int sy, int sw, int sh); + + /** + * Checks whether a position is inside this ImageData. Useful for checking bounds. + * @param x The position along the x-axis. + * @param y The position along the y-axis. + **/ + bool inside(int x, int y) const; + + /** + * Gets the width of this ImageData. + * @return The width of this ImageData. + **/ + int getWidth() const; + + /** + * Gets the height of this ImageData. + * @return The height of this ImageData. + **/ + int getHeight() const; + + /** + * Sets the pixel at location (x,y). + * @param x The location along the x-axis. + * @param y The location along the y-axis. + * @param p The color to use for the given location. + **/ + void setPixel(int x, int y, pixel p); + + /** + * Sets the pixel at location (x,y). + * Not thread-safe! + **/ + void setPixelUnsafe(int x, int y, pixel p); + + /** + * Gets the pixel at location (x,y). + * @param x The location along the x-axis. + * @param y The location along the y-axis. + * @return The color for the given location. + **/ + pixel getPixel(int x, int y) const; + + /** + * Encodes raw pixel data into a given format. + * @param f The file to save the encoded image data to. + * @param format The format of the encoded data. + **/ + virtual void encode(love::filesystem::File *f, Format format) = 0; + + love::thread::Mutex *getMutex() const; + + // Implements Data. + virtual void *getData() const; + virtual int getSize() const; + +protected: + + // The width of the image data. + int width; + + // The height of the image data. + int height; + + // The actual data. + unsigned char *data; + + // We need to be thread-safe + // so we lock when we're accessing our + // data + Mutex *mutex; + +private: + + static StringMap::Entry formatEntries[]; + static StringMap formats; + +}; // ImageData + +} // image +} // love + +#endif // LOVE_IMAGE_IMAGE_DATA_H diff --git a/jni/love/src/modules/image/magpie/CompressedData.cpp b/jni/love/src/modules/image/magpie/CompressedData.cpp new file mode 100644 index 00000000..418f6d1c --- /dev/null +++ b/jni/love/src/modules/image/magpie/CompressedData.cpp @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "CompressedData.h" + +#include "ddsHandler.h" + +namespace love +{ +namespace image +{ +namespace magpie +{ + +CompressedData::CompressedData(love::filesystem::FileData *filedata) +{ + load(filedata); +} + +CompressedData::~CompressedData() +{ + delete[] data; +} + +void CompressedData::load(love::filesystem::FileData *filedata) +{ + // SubImage vector will be populated by a parser. + std::vector parsedimages; + Format texformat = FORMAT_UNKNOWN; + + uint8 *newdata = 0; + size_t newdata_size = 0; + + if (ddsHandler::canParse(filedata)) + newdata = ddsHandler::parse(filedata, parsedimages, newdata_size, texformat); + + if (newdata == 0) + throw love::Exception("Could not parse compressed data."); + + if (texformat == FORMAT_UNKNOWN) + { + delete[] newdata; + throw love::Exception("Could not parse compressed data: Unknown format."); + } + + if (parsedimages.size() == 0 || newdata_size == 0) + { + delete[] newdata; + throw love::Exception("Could not parse compressed data: No valid data?"); + } + + // Make sure to clean up any previously loaded data. + delete[] data; + + data = newdata; + dataSize = newdata_size; + + dataImages = parsedimages; + format = texformat; +} + +bool CompressedData::isCompressed(love::filesystem::FileData *filedata) +{ + if (ddsHandler::canParse(filedata)) + return true; + + return false; +} + +} // magpie +} // image +} // love diff --git a/jni/love/src/modules/image/magpie/CompressedData.h b/jni/love/src/modules/image/magpie/CompressedData.h new file mode 100644 index 00000000..147cdf33 --- /dev/null +++ b/jni/love/src/modules/image/magpie/CompressedData.h @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_MAGPIE_COMPRESSED_DATA_H +#define LOVE_IMAGE_MAGPIE_COMPRESSED_DATA_H + +// LOVE +#include "filesystem/FileData.h" +#include "image/CompressedData.h" + +namespace love +{ +namespace image +{ +namespace magpie +{ + +class CompressedData : public love::image::CompressedData +{ +public: + + CompressedData(love::filesystem::FileData *filedata); + virtual ~CompressedData(); + + static bool isCompressed(love::filesystem::FileData *filedata); + +private: + + void load(love::filesystem::FileData *filedata); + +}; // CompressedData + +} // magpie +} // image +} // love + +#endif // LOVE_IMAGE_MAGPIE_COMPRESSED_DATA_H diff --git a/jni/love/src/modules/image/magpie/DevilHandler.cpp b/jni/love/src/modules/image/magpie/DevilHandler.cpp new file mode 100644 index 00000000..a2e148ab --- /dev/null +++ b/jni/love/src/modules/image/magpie/DevilHandler.cpp @@ -0,0 +1,232 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "DevilHandler.h" + +// LOVE +#include "common/Exception.h" +#include "common/math.h" +#include "thread/threads.h" + +// DevIL +#include + +using love::thread::Lock; + +static Mutex *devilMutex = 0; + +namespace love +{ +namespace image +{ +namespace magpie +{ + +static inline void ilxClearErrors() +{ + while (ilGetError() != IL_NO_ERROR); +} + +void DevilHandler::init() +{ + ilInit(); + ilEnable(IL_ORIGIN_SET); + ilOriginFunc(IL_ORIGIN_UPPER_LEFT); +} + +void DevilHandler::quit() +{ + ilShutDown(); + if (devilMutex) + { + delete devilMutex; + devilMutex = 0; + } +} + +bool DevilHandler::canDecode(love::filesystem::FileData * /*data*/) +{ + // DevIL can decode a lot of formats... + return true; +} + +bool DevilHandler::canEncode(ImageData::Format format) +{ + switch (format) + { + case ImageData::FORMAT_BMP: + case ImageData::FORMAT_TGA: + case ImageData::FORMAT_JPG: + case ImageData::FORMAT_PNG: + return true; + default: + return false; + } + + return false; +} + +DevilHandler::DecodedImage DevilHandler::decode(love::filesystem::FileData *data) +{ + if (!devilMutex) + devilMutex = thread::newMutex(); + + Lock lock(devilMutex); + + ILuint image = ilGenImage(); + ilBindImage(image); + + DecodedImage img; + + try + { + bool success = ilLoadL(IL_TYPE_UNKNOWN, (void *)data->getData(), data->getSize()) == IL_TRUE; + + if (!success) + throw love::Exception("Could not decode image!"); + + img.width = ilGetInteger(IL_IMAGE_WIDTH); + img.height = ilGetInteger(IL_IMAGE_HEIGHT); + + // Make sure the image is in RGBA format. + ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); + + // This should always be four. + int bpp = ilGetInteger(IL_IMAGE_BPP); + if (bpp != sizeof(pixel)) + throw love::Exception("Could not convert image!"); + + img.size = ilGetInteger(IL_IMAGE_SIZE_OF_DATA); + + try + { + img.data = new ILubyte[img.size]; + } + catch (std::bad_alloc &) + { + throw love::Exception("Out of memory."); + } + + memcpy(img.data, ilGetData(), img.size); + } + catch (std::exception &e) + { + // catches love and std exceptions + ilDeleteImage(image); + throw love::Exception("%s", e.what()); + } + + ilDeleteImage(image); + + return img; +} + +DevilHandler::EncodedImage DevilHandler::encode(const DecodedImage &img, ImageData::Format format) +{ + if (!devilMutex) + devilMutex = thread::newMutex(); + + Lock lock(devilMutex); + + ILuint tempimage = ilGenImage(); + ilBindImage(tempimage); + ilxClearErrors(); + + EncodedImage encodedimage; + + try + { + bool success = ilTexImage(img.width, img.height, 1, sizeof(pixel), IL_RGBA, IL_UNSIGNED_BYTE, img.data) == IL_TRUE; + + ILenum err = ilGetError(); + ilxClearErrors(); + + if (!success) + { + if (err != IL_NO_ERROR) + { + switch (err) + { + case IL_ILLEGAL_OPERATION: + throw love::Exception("Illegal operation"); + case IL_INVALID_PARAM: + throw love::Exception("Invalid parameters"); + case IL_OUT_OF_MEMORY: + throw love::Exception("Out of memory"); + default: + throw love::Exception("Unknown error (%d)", (int) err); + } + } + + throw love::Exception("Could not create image for the encoding!"); + } + + ilRegisterOrigin(IL_ORIGIN_UPPER_LEFT); + + ILuint ilFormat; + switch (format) + { + case ImageData::FORMAT_BMP: + ilFormat = IL_BMP; + break; + case ImageData::FORMAT_TGA: + ilFormat = IL_TGA; + break; + case ImageData::FORMAT_JPG: + ilFormat = IL_JPG; + break; + case ImageData::FORMAT_PNG: + default: // PNG is the default format + ilFormat = IL_PNG; + break; + } + + encodedimage.size = ilSaveL(ilFormat, NULL, 0); + if (!encodedimage.size) + throw love::Exception("Could not encode image!"); + + try + { + encodedimage.data = new ILubyte[encodedimage.size]; + } + catch(std::bad_alloc &) + { + throw love::Exception("Out of memory"); + } + + ilSaveL(ilFormat, encodedimage.data, encodedimage.size); + } + catch (std::exception &e) + { + // Catches love and std exceptions. + ilDeleteImage(tempimage); + delete[] encodedimage.data; + encodedimage.data = 0; + throw love::Exception("%s", e.what()); + } + + ilDeleteImage(tempimage); + + return encodedimage; +} + +} // magpie +} // image +} // love diff --git a/jni/love/src/modules/image/magpie/DevilHandler.h b/jni/love/src/modules/image/magpie/DevilHandler.h new file mode 100644 index 00000000..5e73c87a --- /dev/null +++ b/jni/love/src/modules/image/magpie/DevilHandler.h @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_MAGPIE_DEVIL_HANDLER_H +#define LOVE_IMAGE_MAGPIE_DEVIL_HANDLER_H + +// LOVE +#include "filesystem/FileData.h" +#include "FormatHandler.h" + +namespace love +{ +namespace image +{ +namespace magpie +{ + +/** + * Interface between ImageData and DevIL. + **/ +class DevilHandler : public FormatHandler +{ +public: + + static void init(); + static void quit(); + + // Implements FormatHandler. + + static bool canDecode(love::filesystem::FileData *data); + static bool canEncode(ImageData::Format format); + + static DecodedImage decode(love::filesystem::FileData *data); + static EncodedImage encode(const DecodedImage &img, ImageData::Format format); + +}; // DevilHandler + +} // magpie +} // image +} // love + +#endif // LOVE_IMAGE_MAGPIE_DEVIL_HANDLER_H diff --git a/jni/love/src/modules/image/magpie/FormatHandler.h b/jni/love/src/modules/image/magpie/FormatHandler.h new file mode 100644 index 00000000..e01166a4 --- /dev/null +++ b/jni/love/src/modules/image/magpie/FormatHandler.h @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_MAGPIE_FORMAT_HANDLER_H +#define LOVE_IMAGE_MAGPIE_FORMAT_HANDLER_H + +// LOVE +#include "image/ImageData.h" +#include "filesystem/FileData.h" + +namespace love +{ +namespace image +{ +namespace magpie +{ + +/** + * Base class for all ImageData encoder/decoder library interfaces. + **/ +class FormatHandler +{ +public: + + // Raw RGBA pixel data. + struct DecodedImage + { + int width, height; + size_t size; + unsigned char *data; + DecodedImage() : width(0), height(0), size(0), data(0) {} + }; + + // Pixel data encoded in a particular format. + struct EncodedImage + { + size_t size; + unsigned char *data; + EncodedImage() : size(0), data(0) {} + }; + + // Lets pretend we have virtual static methods... + + /** + * Determines whether a particular FileData can be decoded by this handler. + * @param data The data to decode. + **/ + // virtual static bool canDecode(love::filesystem::FileData *data) = 0; + + /** + * Determines whether this handler can encode to a particular format. + * @param format The format to encode to. + **/ + // virtual static bool canEncode(ImageData::Format format) = 0; + + /** + * Decodes an image from its encoded form into raw pixel data. + * @param data The encoded data to decode. + * @return The decoded pixel data. + **/ + // virtual static DecodedImage decode(love::filesystem::FileData *data) = 0; + + /** + * Encodes an image from raw pixel data into a particular format. + * @param img The raw image data to encode. + * @param format The format to encode to. + * @return The encoded image data. + **/ + // virtual static EncodedImage encode(const DecodedImage &img, ImageData::Format format) = 0; + +}; // FormatHandler + +} // magpie +} // image +} // love + +#endif // LOVE_IMAGE_MAGPIE_FORMAT_HANDLER_H diff --git a/jni/love/src/modules/image/magpie/Image.cpp b/jni/love/src/modules/image/magpie/Image.cpp new file mode 100644 index 00000000..acf2a07c --- /dev/null +++ b/jni/love/src/modules/image/magpie/Image.cpp @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Image.h" + +#include "ImageData.h" +#include "CompressedData.h" + +#include "DevilHandler.h" + +namespace love +{ +namespace image +{ +namespace magpie +{ + +Image::Image() +{ + DevilHandler::init(); +} + +Image::~Image() +{ + DevilHandler::quit(); +} + +const char *Image::getName() const +{ + return "love.image.magpie"; +} + +love::image::ImageData *Image::newImageData(love::filesystem::FileData *data) +{ + return new ImageData(data); +} + +love::image::ImageData *Image::newImageData(int width, int height) +{ + return new ImageData(width, height); +} + +love::image::ImageData *Image::newImageData(int width, int height, void *data, bool own) +{ + return new ImageData(width, height, data, own); +} + +love::image::CompressedData *Image::newCompressedData(love::filesystem::FileData *data) +{ + return new CompressedData(data); +} + +bool Image::isCompressed(love::filesystem::FileData *data) +{ + return CompressedData::isCompressed(data); +} + +} // magpie +} // image +} // love diff --git a/jni/love/src/modules/image/magpie/Image.h b/jni/love/src/modules/image/magpie/Image.h new file mode 100644 index 00000000..77e04ccc --- /dev/null +++ b/jni/love/src/modules/image/magpie/Image.h @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_MAGPIE_IMAGE_H +#define LOVE_IMAGE_MAGPIE_IMAGE_H + +// LOVE +#include "image/Image.h" + +namespace love +{ +namespace image +{ +namespace magpie +{ + +/** + * Similar to love.sound's Lullaby module, love.image.magpie interfaces with + * multiple image libraries and determines the correct one to use on a + * per-image basis at runtime. + **/ +class Image : public love::image::Image +{ +public: + + Image(); + ~Image(); + + // Implements Module. + const char *getName() const; + + love::image::ImageData *newImageData(love::filesystem::FileData *data); + love::image::ImageData *newImageData(int width, int height); + love::image::ImageData *newImageData(int width, int height, void *data, bool own = false); + + love::image::CompressedData *newCompressedData(love::filesystem::FileData *data); + + bool isCompressed(love::filesystem::FileData *data); + +}; // Image + +} // magpie +} // image +} // love + +#endif // LOVE_IMAGE_MAGPIE_IMAGE_H diff --git a/jni/love/src/modules/image/magpie/ImageData.cpp b/jni/love/src/modules/image/magpie/ImageData.cpp new file mode 100644 index 00000000..cd17700b --- /dev/null +++ b/jni/love/src/modules/image/magpie/ImageData.cpp @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "ImageData.h" + +#include "FormatHandler.h" +#include "DevilHandler.h" + +namespace love +{ +namespace image +{ +namespace magpie +{ + +ImageData::ImageData(love::filesystem::FileData *data) +{ + decode(data); +} + +ImageData::ImageData(int width, int height) +{ + this->width = width; + this->height = height; + create(width, height); + + // Set to black/transparency. + memset(data, 0, width*height*sizeof(pixel)); +} + +ImageData::ImageData(int width, int height, void *data, bool own) +{ + this->width = width; + this->height = height; + + if (own) + this->data = (unsigned char *) data; + else + create(width, height, data); +} + +ImageData::~ImageData() +{ + delete[] data; +} + +void ImageData::create(int width, int height, void *data) +{ + try + { + this->data = new unsigned char[width*height*sizeof(pixel)]; + } + catch(std::bad_alloc &) + { + throw love::Exception("Out of memory"); + } + + if (data) + memcpy(this->data, data, width*height*sizeof(pixel)); +} + +void ImageData::decode(love::filesystem::FileData *data) +{ + FormatHandler::DecodedImage decodedimage; + + if (DevilHandler::canDecode(data)) + decodedimage = DevilHandler::decode(data); + else + throw love::Exception("Could not decode image: unrecognized format."); + + // The decoder *must* output a 32 bits-per-pixel image. + if (decodedimage.size != decodedimage.width*decodedimage.height*sizeof(pixel)) + { + delete[] decodedimage.data; + throw love::Exception("Coult not convert image!"); + } + + if (this->data) + delete[] this->data; + + this->width = decodedimage.width; + this->height = decodedimage.height; + this->data = decodedimage.data; +} + +void ImageData::encode(love::filesystem::File *f, ImageData::Format format) +{ + FormatHandler::EncodedImage encodedimage; + + { + // We only need to lock this mutex when actually encoding the ImageData. + thread::Lock lock(mutex); + + FormatHandler::DecodedImage rawimage; + rawimage.width = width; + rawimage.height = height; + rawimage.size = width*height*sizeof(pixel); + rawimage.data = data; + + if (DevilHandler::canEncode(format)) + encodedimage = DevilHandler::encode(rawimage, format); + else + throw love::Exception("Image format has no suitable encoder."); + } + + try + { + + f->open(love::filesystem::File::WRITE); + f->write(encodedimage.data, encodedimage.size); + f->close(); + } + catch (love::Exception &) + { + delete[] encodedimage.data; + throw; + } + + delete[] encodedimage.data; +} + +} // magpie +} // image +} // love diff --git a/jni/love/src/modules/image/magpie/ImageData.h b/jni/love/src/modules/image/magpie/ImageData.h new file mode 100644 index 00000000..f2e1413a --- /dev/null +++ b/jni/love/src/modules/image/magpie/ImageData.h @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_MAGPIE_IMAGE_DATA_H +#define LOVE_IMAGE_MAGPIE_IMAGE_DATA_H + +// LOVE +#include "filesystem/File.h" +#include "image/ImageData.h" + +namespace love +{ +namespace image +{ +namespace magpie +{ + +class ImageData : public love::image::ImageData +{ +public: + + ImageData(love::filesystem::FileData *data); + ImageData(int width, int height); + ImageData(int width, int height, void *data, bool own); + virtual ~ImageData(); + + // Implements image::ImageData. + virtual void encode(love::filesystem::File *f, ImageData::Format format); + +private: + + // Create imagedata. Initialize with data if not null. + void create(int width, int height, void *data = 0); + + // Decode and load an encoded format. + void decode(love::filesystem::FileData *data); + +}; // ImageData + +} // magpie +} // image +} // love + +#endif // LOVE_IMAGE_MAGPIE_IMAGE_DATA_H diff --git a/jni/love/src/modules/image/magpie/ddsHandler.cpp b/jni/love/src/modules/image/magpie/ddsHandler.cpp new file mode 100644 index 00000000..099e3d84 --- /dev/null +++ b/jni/love/src/modules/image/magpie/ddsHandler.cpp @@ -0,0 +1,137 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "ddsHandler.h" + +#include + +namespace love +{ +namespace image +{ +namespace magpie +{ + +bool ddsHandler::canParse(const filesystem::FileData *data) +{ + std::string ext = data->getExtension(); + std::transform(ext.begin(), ext.end(), ext.begin(), tolower); + + if (ext.compare("dds") != 0) + return false; + + return dds::isCompressedDDS(data->getData(), data->getSize()); +} + +uint8 *ddsHandler::parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format) +{ + if (!dds::isDDS(filedata->getData(), filedata->getSize())) + throw love::Exception("Could not decode compressed data (not a DDS file?)"); + + CompressedData::Format texformat = CompressedData::FORMAT_UNKNOWN; + + uint8 *data = 0; + dataSize = 0; + images.clear(); + + try + { + // Attempt to parse the dds file. + dds::Parser parser(filedata->getData(), filedata->getSize()); + + texformat = convertFormat(parser.getFormat()); + + if (texformat == CompressedData::FORMAT_UNKNOWN) + throw love::Exception("Could not parse compressed data: Unsupported format."); + + if (parser.getMipmapCount() == 0) + throw love::Exception("Could not parse compressed data: No readable texture data."); + + // Calculate the size of the block of memory we're returning. + for (size_t i = 0; i < parser.getMipmapCount(); i++) + { + const dds::Image *img = parser.getImageData(i); + dataSize += img->dataSize; + } + + data = new uint8[dataSize]; + + size_t dataOffset = 0; + + // Copy the parsed mipmap levels from the FileData to our CompressedData. + for (size_t i = 0; i < parser.getMipmapCount(); i++) + { + // Fetch the data for this mipmap level. + const dds::Image *img = parser.getImageData(i); + + CompressedData::SubImage mip; + + mip.width = img->width; + mip.height = img->height; + mip.size = img->dataSize; + + // Copy the mipmap image from the FileData to our block of memory. + memcpy(data + dataOffset, img->data, mip.size); + mip.data = data + dataOffset; + + dataOffset += mip.size; + + images.push_back(mip); + } + } + catch (std::exception &e) + { + delete[] data; + images.clear(); + throw love::Exception("%s", e.what()); + } + + format = texformat; + return data; +} + +CompressedData::Format ddsHandler::convertFormat(dds::Format ddsformat) +{ + switch (ddsformat) + { + case dds::FORMAT_DXT1: + return CompressedData::FORMAT_DXT1; + case dds::FORMAT_DXT3: + return CompressedData::FORMAT_DXT3; + case dds::FORMAT_DXT5: + return CompressedData::FORMAT_DXT5; + case dds::FORMAT_BC4: + return CompressedData::FORMAT_BC4; + case dds::FORMAT_BC4s: + return CompressedData::FORMAT_BC4s; + case dds::FORMAT_BC5: + return CompressedData::FORMAT_BC5; + case dds::FORMAT_BC5s: + return CompressedData::FORMAT_BC5s; + default: + return CompressedData::FORMAT_UNKNOWN; + } + + return CompressedData::FORMAT_UNKNOWN; +} + +} // magpie +} // image +} // love diff --git a/jni/love/src/modules/image/magpie/ddsHandler.h b/jni/love/src/modules/image/magpie/ddsHandler.h new file mode 100644 index 00000000..3bb152cc --- /dev/null +++ b/jni/love/src/modules/image/magpie/ddsHandler.h @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_MAGPIE_DDS_HANDLER_H +#define LOVE_IMAGE_MAGPIE_DDS_HANDLER_H + +// LOVE +#include "common/EnumMap.h" +#include "filesystem/FileData.h" +#include "image/CompressedData.h" + +// dds parser +#include "ddsparse/ddsparse.h" + +// STL +#include + +namespace love +{ +namespace image +{ +namespace magpie +{ + +/** + * Interface between CompressedData and the ddsparse library. + **/ +class ddsHandler +{ +public: + + /** + * Determines whether a particular FileData can be parsed as CompressedData + * by this handler. + * @param data The data to parse. + **/ + static bool canParse(const filesystem::FileData *data); + + /** + * Parses compressed image filedata into a list of sub-images and returns + * a single block of memory containing all the images. + * + * @param[in] filedata The data to parse. + * @param[out] image The list of sub-images generated. Byte data is a pointer + * to the returned data. + * @param[out] dataSize The total size in bytes of the returned data. + * @param[out] format The format of the Compressed Data. + * + * @return The single block of memory containing the parsed images. + **/ + static uint8 *parse(filesystem::FileData *filedata, std::vector &images, size_t &dataSize, CompressedData::Format &format); + +private: + + static CompressedData::Format convertFormat(dds::Format ddsformat); + +}; // ddsHandler + +} // magpie +} // image +} // love + +#endif // LOVE_IMAGE_MAGPIE_DDS_HANDLER_H diff --git a/jni/love/src/modules/image/wrap_CompressedData.cpp b/jni/love/src/modules/image/wrap_CompressedData.cpp new file mode 100644 index 00000000..968350c7 --- /dev/null +++ b/jni/love/src/modules/image/wrap_CompressedData.cpp @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_CompressedData.h" +#include "common/wrap_Data.h" + +namespace love +{ +namespace image +{ + +CompressedData *luax_checkcompresseddata(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "CompressedData", IMAGE_COMPRESSED_DATA_T); +} + +int w_CompressedData_getWidth(lua_State *L) +{ + CompressedData *t = luax_checkcompresseddata(L, 1); + int miplevel = luaL_optinteger(L, 2, 1); + int width = 0; + + EXCEPT_GUARD(width = t->getWidth(miplevel >= 1 ? miplevel - 1 : 0);) + + lua_pushinteger(L, width); + return 1; +} + +int w_CompressedData_getHeight(lua_State *L) +{ + CompressedData *t = luax_checkcompresseddata(L, 1); + int miplevel = luaL_optinteger(L, 2, 1); + int height = 0; + + EXCEPT_GUARD(height = t->getHeight(miplevel >= 1 ? miplevel - 1 : 0);) + + lua_pushinteger(L, height); + return 1; +} + +int w_CompressedData_getDimensions(lua_State *L) +{ + CompressedData *t = luax_checkcompresseddata(L, 1); + int miplevel = luaL_optinteger(L, 2, 1); + int width = 0, height = 0; + + EXCEPT_GUARD( + width = t->getWidth(miplevel >= 1 ? miplevel - 1 : 0); + height = t->getHeight(miplevel >= 1 ? miplevel - 1 : 0); + ) + + lua_pushinteger(L, width); + lua_pushinteger(L, height); + return 2; +} + +int w_CompressedData_getMipmapCount(lua_State *L) +{ + CompressedData *t = luax_checkcompresseddata(L, 1); + lua_pushinteger(L, t->getMipmapCount()); + return 1; +} + +int w_CompressedData_getFormat(lua_State *L) +{ + CompressedData *t = luax_checkcompresseddata(L, 1); + + image::CompressedData::Format format = t->getFormat(); + const char *str; + + if (image::CompressedData::getConstant(format, str)) + lua_pushstring(L, str); + else + lua_pushstring(L, "unknown"); + + return 1; +} + +static const luaL_Reg functions[] = +{ + // Data + { "getString", w_Data_getString }, + { "getPointer", w_Data_getPointer }, + { "getSize", w_Data_getSize }, + + { "getWidth", w_CompressedData_getWidth }, + { "getHeight", w_CompressedData_getHeight }, + { "getDimensions", w_CompressedData_getDimensions }, + { "getMipmapCount", w_CompressedData_getMipmapCount }, + { "getFormat", w_CompressedData_getFormat }, + { 0, 0 }, +}; + +extern "C" int luaopen_compresseddata(lua_State *L) +{ + return luax_register_type(L, "CompressedData", functions); +} + +} // image +} // love diff --git a/jni/love/src/modules/image/wrap_CompressedData.h b/jni/love/src/modules/image/wrap_CompressedData.h new file mode 100644 index 00000000..a28a28f9 --- /dev/null +++ b/jni/love/src/modules/image/wrap_CompressedData.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_WRAP_COMRESSED_DATA_H +#define LOVE_IMAGE_WRAP_COMRESSED_DATA_H + +// LOVE +#include "common/runtime.h" +#include "CompressedData.h" + +namespace love +{ +namespace image +{ + +CompressedData *luax_checkcompresseddata(lua_State *L, int idx); +int w_CompressedData_getWidth(lua_State *L); +int w_CompressedData_getHeight(lua_State *L); +int w_CompressedData_getDimensions(lua_State *L); +int w_CompressedData_getMipmapCount(lua_State *L); +int w_CompressedData_getFormat(lua_State *L); +extern "C" int luaopen_compresseddata(lua_State *L); + +} // image +} // love + +#endif // LOVE_IMAGE_WRAP_COMRESSED_DATA_H diff --git a/jni/love/src/modules/image/wrap_Image.cpp b/jni/love/src/modules/image/wrap_Image.cpp new file mode 100644 index 00000000..56c9e619 --- /dev/null +++ b/jni/love/src/modules/image/wrap_Image.cpp @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Image.h" + +#include "common/Data.h" +#include "common/StringMap.h" + +#include "magpie/Image.h" + +namespace love +{ +namespace image +{ + +static Image *instance = 0; + +int w_newImageData(lua_State *L) +{ + // Case 1: Integers. + if (lua_isnumber(L, 1)) + { + int w = luaL_checkint(L, 1); + int h = luaL_checkint(L, 2); + if (w <= 0 || h <= 0) + return luaL_error(L, "Invalid image size."); + + ImageData *t = 0; + EXCEPT_GUARD(t = instance->newImageData(w, h);) + + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); + return 1; + } + + // Case 2: File(Data). + + // Convert to FileData, if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + love::filesystem::FileData *data = luax_checktype(L, 1, "FileData", FILESYSTEM_FILE_DATA_T); + + ImageData *t = 0; + EXCEPT_GUARD(t = instance->newImageData(data);) + + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, t); + return 1; +} + +int w_newCompressedData(lua_State *L) +{ + // Convert to FileData, if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + love::filesystem::FileData *data = luax_checktype(L, 1, "FileData", FILESYSTEM_FILE_DATA_T); + + CompressedData *t = 0; + EXCEPT_GUARD(t = instance->newCompressedData(data);) + + luax_pushtype(L, "CompressedData", IMAGE_COMPRESSED_DATA_T, t); + return 1; +} + +int w_isCompressed(lua_State *L) +{ + // Convert to FileData, if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + love::filesystem::FileData *data = luax_checktype(L, 1, "FileData", FILESYSTEM_FILE_DATA_T); + + bool compressed = false; + EXCEPT_GUARD(compressed = instance->isCompressed(data);) + + luax_pushboolean(L, compressed); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "newImageData", w_newImageData }, + { "newCompressedData", w_newCompressedData }, + { "isCompressed", w_isCompressed }, + { 0, 0 } +}; + +static const lua_CFunction types[] = +{ + luaopen_imagedata, + luaopen_compresseddata, + 0 +}; + +extern "C" int luaopen_love_image(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new love::image::magpie::Image();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "image"; + w.flags = MODULE_IMAGE_T; + w.functions = functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // image +} // love diff --git a/jni/love/src/modules/image/wrap_Image.h b/jni/love/src/modules/image/wrap_Image.h new file mode 100644 index 00000000..57bdc995 --- /dev/null +++ b/jni/love/src/modules/image/wrap_Image.h @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_WRAP_IMAGE_H +#define LOVE_IMAGE_WRAP_IMAGE_H + +// LOVE +#include "Image.h" +#include "wrap_ImageData.h" +#include "wrap_CompressedData.h" + +namespace love +{ +namespace image +{ + +int w_newImageData(lua_State *L); +int w_newCompressedData(lua_State *L); +int w_isCompressed(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_image(lua_State *L); + +} // image +} // love + +#endif // LOVE_IMAGE_WRAP_IMAGE_H diff --git a/jni/love/src/modules/image/wrap_ImageData.cpp b/jni/love/src/modules/image/wrap_ImageData.cpp new file mode 100644 index 00000000..80b39628 --- /dev/null +++ b/jni/love/src/modules/image/wrap_ImageData.cpp @@ -0,0 +1,292 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_ImageData.h" + +#include "common/wrap_Data.h" +#include "filesystem/File.h" + +namespace love +{ +namespace image +{ + +ImageData *luax_checkimagedata(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "ImageData", IMAGE_IMAGE_DATA_T); +} + +int w_ImageData_getWidth(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + lua_pushinteger(L, t->getWidth()); + return 1; +} + +int w_ImageData_getHeight(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + lua_pushinteger(L, t->getHeight()); + return 1; +} + +int w_ImageData_getDimensions(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + lua_pushinteger(L, t->getWidth()); + lua_pushinteger(L, t->getHeight()); + return 2; +} + +int w_ImageData_getPixel(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + int x = luaL_checkint(L, 2); + int y = luaL_checkint(L, 3); + pixel c; + + EXCEPT_GUARD(c = t->getPixel(x, y);) + + lua_pushnumber(L, c.r); + lua_pushnumber(L, c.g); + lua_pushnumber(L, c.b); + lua_pushnumber(L, c.a); + return 4; +} + +int w_ImageData_setPixel(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + int x = luaL_checkint(L, 2); + int y = luaL_checkint(L, 3); + pixel c; + + if (lua_istable(L, 4)) + { + for (int i = 1; i <= 4; i++) + lua_rawgeti(L, 4, i); + + c.r = (unsigned char)luaL_checkinteger(L, -4); + c.g = (unsigned char)luaL_checkinteger(L, -3); + c.b = (unsigned char)luaL_checkinteger(L, -2); + c.a = (unsigned char)luaL_optinteger(L, -1, 255); + + lua_pop(L, 4); + } + else + { + c.r = (unsigned char)luaL_checkinteger(L, 4); + c.g = (unsigned char)luaL_checkinteger(L, 5); + c.b = (unsigned char)luaL_checkinteger(L, 6); + c.a = (unsigned char)luaL_optinteger(L, 7, 255); + } + + EXCEPT_GUARD(t->setPixel(x, y, c);) + return 0; +} + +// Gets the result of luaL_where as a string. +static std::string luax_getwhere(lua_State *L, int level) +{ + luaL_where(L, level); + + const char *str = lua_tostring(L, -1); + std::string where; + if (str) + where = str; + + lua_pop(L, 1); + return where; +} + +// Generates a Lua error with a nice error string when a return value of a +// called function is not a number. +static int luax_retnumbererror(lua_State *L, int level, int retnum, int ttype) +{ + if (ttype == LUA_TNUMBER) + return 0; + + const char *where = luax_getwhere(L, level).c_str(); + const char *ttypename = lua_typename(L, ttype); + + return luaL_error(L, "%sbad return value #%d (number expected, got %s)", + where, retnum, ttypename); +} + +// ImageData:mapPixel. Not thread-safe! See the wrapper function below. +static int w_ImageData_mapPixelUnsafe(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + luaL_checktype(L, 2, LUA_TFUNCTION); + + // No optints because we assume they're done in the wrapper function. + int sx = (int) lua_tonumber(L, 3); + int sy = (int) lua_tonumber(L, 4); + int w = (int) lua_tonumber(L, 5); + int h = (int) lua_tonumber(L, 6); + + if (!(t->inside(sx, sy) && t->inside(sx+w-1, sy+h-1))) + return luaL_error(L, "Invalid rectangle dimensions."); + + // Cache-friendlier loop. :) + for (int y = sy; y < sy+h; y++) + { + for (int x = sx; x < sx+w; x++) + { + lua_pushvalue(L, 2); + lua_pushnumber(L, x); + lua_pushnumber(L, y); + pixel c = t->getPixel(x, y); + lua_pushnumber(L, c.r); + lua_pushnumber(L, c.g); + lua_pushnumber(L, c.b); + lua_pushnumber(L, c.a); + lua_call(L, 6, 4); + + // If we used luaL_checkX / luaL_optX then we would get messy error + // messages (e.g. Error: bad argument #-1 to '?'), so while this is + // messier code, at least the errors are a bit more descriptive. + + // Treat the pixel as an array for less code duplication. :( + unsigned char *parray = (unsigned char *) &c; + for (int i = 0; i < 4; i++) + { + int ttype = lua_type(L, -4 + i); + + if (ttype == LUA_TNUMBER) + parray[i] = (unsigned char) lua_tonumber(L, -4 + i); + else if (i == 3 && (ttype == LUA_TNONE || ttype == LUA_TNIL)) + parray[i] = 255; // Alpha component defaults to 255. + else + // Error (level 2 because this is function will be wrapped.) + return luax_retnumbererror(L, 2, i + 1, ttype); + } + + // Pop return values. + lua_pop(L, 4); + + // We're locking the entire function, instead of each setPixel call. + t->setPixelUnsafe(x, y, c); + } + } + return 0; +} + +// Thread-safe wrapper for the above function. +int w_ImageData_mapPixel(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + luaL_checktype(L, 2, LUA_TFUNCTION); + int sx = luaL_optint(L, 3, 0); + int sy = luaL_optint(L, 4, 0); + int w = luaL_optint(L, 5, t->getWidth()); + int h = luaL_optint(L, 6, t->getHeight()); + + lua_pushcfunction(L, w_ImageData_mapPixelUnsafe); + lua_pushvalue(L, 1); + lua_pushvalue(L, 2); + lua_pushinteger(L, sx); + lua_pushinteger(L, sy); + lua_pushinteger(L, w); + lua_pushinteger(L, h); + + int ret = 0; + + // Lock this ImageData's mutex during the entire mapPixel. We pcall instead + // of call because lua_error longjmp's without calling object destructors. + { + love::thread::Lock lock(t->getMutex()); + ret = lua_pcall(L, 6, 0, 0); + } + + if (ret != 0) + return lua_error(L); + + return 0; +} + +int w_ImageData_paste(lua_State *L) +{ + ImageData *t = luax_checkimagedata(L, 1); + ImageData *src = luax_checkimagedata(L, 2); + int dx = luaL_checkint(L, 3); + int dy = luaL_checkint(L, 4); + int sx = luaL_optint(L, 5, 0); + int sy = luaL_optint(L, 6, 0); + int sw = luaL_optint(L, 7, src->getWidth()); + int sh = luaL_optint(L, 8, src->getHeight()); + t->paste((love::image::ImageData *)src, dx, dy, sx, sy, sw, sh); + return 0; +} + +int w_ImageData_encode(lua_State *L) +{ + std::string ext; + const char *fmt; + ImageData::Format format = ImageData::FORMAT_MAX_ENUM; + ImageData *t = luax_checkimagedata(L, 1); + + if (lua_isstring(L, 2)) + luax_convobj(L, 2, "filesystem", "newFile"); + love::filesystem::File *file = luax_checktype(L, 2, "File", FILESYSTEM_FILE_T); + + if (lua_isnoneornil(L, 3)) + { + ext = file->getExtension(); + fmt = ext.c_str(); + if (!ImageData::getConstant(fmt, format)) + return luaL_error(L, "Invalid image format '%s'.", fmt); + } + else + { + fmt = luaL_checkstring(L, 3); + if (!ImageData::getConstant(fmt, format)) + return luaL_error(L, "Invalid image format '%s'.", fmt); + } + + EXCEPT_GUARD(t->encode(file, format);) + return 0; +} + +static const luaL_Reg functions[] = +{ + // Data + { "getString", w_Data_getString }, + { "getPointer", w_Data_getPointer }, + { "getSize", w_Data_getSize }, + + { "getWidth", w_ImageData_getWidth }, + { "getHeight", w_ImageData_getHeight }, + { "getDimensions", w_ImageData_getDimensions }, + { "getPixel", w_ImageData_getPixel }, + { "setPixel", w_ImageData_setPixel }, + { "mapPixel", w_ImageData_mapPixel }, + { "paste", w_ImageData_paste }, + { "encode", w_ImageData_encode }, + { 0, 0 } +}; + +extern "C" int luaopen_imagedata(lua_State *L) +{ + return luax_register_type(L, "ImageData", functions); +} + +} // image +} // love diff --git a/jni/love/src/modules/image/wrap_ImageData.h b/jni/love/src/modules/image/wrap_ImageData.h new file mode 100644 index 00000000..e3063744 --- /dev/null +++ b/jni/love/src/modules/image/wrap_ImageData.h @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_IMAGE_WRAP_IMAGE_DATA_H +#define LOVE_IMAGE_WRAP_IMAGE_DATA_H + +// LOVE +#include "common/runtime.h" +#include "ImageData.h" + +namespace love +{ +namespace image +{ + +ImageData *luax_checkimagedata(lua_State *L, int idx); +int w_ImageData_getWidth(lua_State *L); +int w_ImageData_getHeight(lua_State *L); +int w_ImageData_getDimensions(lua_State *L); +int w_ImageData_getPixel(lua_State *L); +int w_ImageData_setPixel(lua_State *L); +int w_ImageData_mapPixel(lua_State *L); +int w_ImageData_paste(lua_State *L); +int w_ImageData_encode(lua_State *L); +extern "C" int luaopen_imagedata(lua_State *L); + +} // image +} // love + +#endif // LOVE_IMAGE_WRAP_IMAGE_DATA_H diff --git a/jni/love/src/modules/joystick/Joystick.cpp b/jni/love/src/modules/joystick/Joystick.cpp new file mode 100644 index 00000000..11870a41 --- /dev/null +++ b/jni/love/src/modules/joystick/Joystick.cpp @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Joystick.h" + +// STL +#include + +namespace love +{ +namespace joystick +{ + +float Joystick::clampval(float x) const +{ + if (fabsf(x) < 0.01) + return 0.0f; + + if (x < -0.99f) return -1.0f; + if (x > 0.99f) return 1.0f; + + return x; +} + +bool Joystick::getConstant(const char *in, Joystick::Hat &out) +{ + return hats.find(in, out); +} + +bool Joystick::getConstant(Joystick::Hat in, const char *&out) +{ + return hats.find(in, out); +} + +bool Joystick::getConstant(const char *in, Joystick::GamepadAxis &out) +{ + return gpAxes.find(in, out); +} + +bool Joystick::getConstant(Joystick::GamepadAxis in, const char *&out) +{ + return gpAxes.find(in, out); +} + +bool Joystick::getConstant(const char *in, Joystick::GamepadButton &out) +{ + return gpButtons.find(in, out); +} + +bool Joystick::getConstant(Joystick::GamepadButton in, const char *&out) +{ + return gpButtons.find(in, out); +} + +bool Joystick::getConstant(const char *in, Joystick::InputType &out) +{ + return inputTypes.find(in, out); +} + +bool Joystick::getConstant(Joystick::InputType in, const char *&out) +{ + return inputTypes.find(in, out); +} + +StringMap::Entry Joystick::hatEntries[] = +{ + {"c", Joystick::HAT_CENTERED}, + {"u", Joystick::HAT_UP}, + {"r", Joystick::HAT_RIGHT}, + {"d", Joystick::HAT_DOWN}, + {"l", Joystick::HAT_LEFT}, + {"ru", Joystick::HAT_RIGHTUP}, + {"rd", Joystick::HAT_RIGHTDOWN}, + {"lu", Joystick::HAT_LEFTUP}, + {"ld", Joystick::HAT_LEFTDOWN}, +}; + +StringMap Joystick::hats(Joystick::hatEntries, sizeof(Joystick::hatEntries)); + +StringMap::Entry Joystick::gpAxisEntries[] = +{ + {"leftx", GAMEPAD_AXIS_LEFTX}, + {"lefty", GAMEPAD_AXIS_LEFTY}, + {"rightx", GAMEPAD_AXIS_RIGHTX}, + {"righty", GAMEPAD_AXIS_RIGHTY}, + {"triggerleft", GAMEPAD_AXIS_TRIGGERLEFT}, + {"triggerright", GAMEPAD_AXIS_TRIGGERRIGHT}, +}; + +StringMap Joystick::gpAxes(Joystick::gpAxisEntries, sizeof(Joystick::gpAxisEntries)); + +StringMap::Entry Joystick::gpButtonEntries[] = +{ + {"a", GAMEPAD_BUTTON_A}, + {"b", GAMEPAD_BUTTON_B}, + {"x", GAMEPAD_BUTTON_X}, + {"y", GAMEPAD_BUTTON_Y}, + {"back", GAMEPAD_BUTTON_BACK}, + {"guide", GAMEPAD_BUTTON_GUIDE}, + {"start", GAMEPAD_BUTTON_START}, + {"leftstick", GAMEPAD_BUTTON_LEFTSTICK}, + {"rightstick", GAMEPAD_BUTTON_RIGHTSTICK}, + {"leftshoulder", GAMEPAD_BUTTON_LEFTSHOULDER}, + {"rightshoulder", GAMEPAD_BUTTON_RIGHTSHOULDER}, + {"dpup", GAMEPAD_BUTTON_DPAD_UP}, + {"dpdown", GAMEPAD_BUTTON_DPAD_DOWN}, + {"dpleft", GAMEPAD_BUTTON_DPAD_LEFT}, + {"dpright", GAMEPAD_BUTTON_DPAD_RIGHT}, +}; + +StringMap Joystick::gpButtons(Joystick::gpButtonEntries, sizeof(Joystick::gpButtonEntries)); + +StringMap::Entry Joystick::inputTypeEntries[] = +{ + {"axis", Joystick::INPUT_TYPE_AXIS}, + {"button", Joystick::INPUT_TYPE_BUTTON}, + {"hat", Joystick::INPUT_TYPE_HAT}, +}; + +StringMap Joystick::inputTypes(Joystick::inputTypeEntries, sizeof(Joystick::inputTypeEntries)); + +} // joystick +} // love diff --git a/jni/love/src/modules/joystick/Joystick.h b/jni/love/src/modules/joystick/Joystick.h new file mode 100644 index 00000000..86020927 --- /dev/null +++ b/jni/love/src/modules/joystick/Joystick.h @@ -0,0 +1,200 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_JOYSTICK_JOYSTICK_H +#define LOVE_JOYSTICK_JOYSTICK_H + +// LOVE +#include "common/Object.h" +#include "common/StringMap.h" + +// stdlib +#include +#include + +namespace love +{ +namespace joystick +{ + +class Joystick : public Object +{ +public: + + // Joystick hat values. + enum Hat + { + HAT_INVALID, + HAT_CENTERED, + HAT_UP, + HAT_RIGHT, + HAT_DOWN, + HAT_LEFT, + HAT_RIGHTUP, + HAT_RIGHTDOWN, + HAT_LEFTUP, + HAT_LEFTDOWN, + HAT_MAX_ENUM = 16 + }; + + // Valid Gamepad axes. + enum GamepadAxis + { + GAMEPAD_AXIS_INVALID, + GAMEPAD_AXIS_LEFTX, + GAMEPAD_AXIS_LEFTY, + GAMEPAD_AXIS_RIGHTX, + GAMEPAD_AXIS_RIGHTY, + GAMEPAD_AXIS_TRIGGERLEFT, + GAMEPAD_AXIS_TRIGGERRIGHT, + GAMEPAD_AXIS_MAX_ENUM + }; + + // Valid Gamepad buttons. + enum GamepadButton + { + GAMEPAD_BUTTON_INVALID, + GAMEPAD_BUTTON_A, + GAMEPAD_BUTTON_B, + GAMEPAD_BUTTON_X, + GAMEPAD_BUTTON_Y, + GAMEPAD_BUTTON_BACK, + GAMEPAD_BUTTON_GUIDE, + GAMEPAD_BUTTON_START, + GAMEPAD_BUTTON_LEFTSTICK, + GAMEPAD_BUTTON_RIGHTSTICK, + GAMEPAD_BUTTON_LEFTSHOULDER, + GAMEPAD_BUTTON_RIGHTSHOULDER, + GAMEPAD_BUTTON_DPAD_UP, + GAMEPAD_BUTTON_DPAD_DOWN, + GAMEPAD_BUTTON_DPAD_LEFT, + GAMEPAD_BUTTON_DPAD_RIGHT, + GAMEPAD_BUTTON_MAX_ENUM + }; + + // Different types of inputs for a joystick. + enum InputType + { + INPUT_TYPE_AXIS, + INPUT_TYPE_BUTTON, + INPUT_TYPE_HAT, + INPUT_TYPE_MAX_ENUM + }; + + // Represents a gamepad input value, e.g. the "x" button or the left trigger. + struct GamepadInput + { + InputType type; + union + { + GamepadAxis axis; + GamepadButton button; + }; + }; + + // Represents a joystick input value, e.g. button 6 or axis 1. + struct JoystickInput + { + InputType type; + union + { + int axis; + int button; + struct + { + int index; + Hat value; + } hat; + }; + }; + + virtual ~Joystick() {} + + virtual bool open(int deviceindex) = 0; + virtual void close() = 0; + + virtual bool isConnected() const = 0; + + virtual const char *getName() const = 0; + + virtual int getAxisCount() const = 0; + virtual int getButtonCount() const = 0; + virtual int getHatCount() const = 0; + + virtual float getAxis(int axisindex) const = 0; + virtual std::vector getAxes() const = 0; + virtual Hat getHat(int hatindex) const = 0; + + virtual bool isDown(const std::vector &buttonlist) const = 0; + + virtual bool openGamepad(int deviceindex) = 0; + virtual bool isGamepad() const = 0; + + virtual float getGamepadAxis(GamepadAxis axis) const = 0; + virtual bool isGamepadDown(const std::vector &blist) const = 0; + + virtual void *getHandle() const = 0; + + virtual std::string getGUID() const = 0; + virtual int getInstanceID() const = 0; + virtual int getID() const = 0; + + virtual bool isVibrationSupported() = 0; + virtual bool setVibration(float left, float right) = 0; + virtual bool setVibration() = 0; + virtual void getVibration(float &left, float &right) const = 0; + + static bool getConstant(const char *in, Hat &out); + static bool getConstant(Hat in, const char *&out); + + static bool getConstant(const char *in, GamepadAxis &out); + static bool getConstant(GamepadAxis in, const char *&out); + + static bool getConstant(const char *in, GamepadButton &out); + static bool getConstant(GamepadButton in, const char *&out); + + static bool getConstant(const char *in, InputType &out); + static bool getConstant(InputType in, const char *&out); + +protected: + + float clampval(float x) const; + +private: + + static StringMap::Entry hatEntries[]; + static StringMap hats; + + static StringMap::Entry gpAxisEntries[]; + static StringMap gpAxes; + + static StringMap::Entry gpButtonEntries[]; + static StringMap gpButtons; + + static StringMap::Entry inputTypeEntries[]; + static StringMap inputTypes; + +}; // Joystick + +} // joystick +} // love + + +#endif // LOVE_JOYSTICK_JOYSTICK_H diff --git a/jni/love/src/modules/joystick/JoystickModule.h b/jni/love/src/modules/joystick/JoystickModule.h new file mode 100644 index 00000000..5192f191 --- /dev/null +++ b/jni/love/src/modules/joystick/JoystickModule.h @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_JOYSTICK_JOYSTICK_MODULE_H +#define LOVE_JOYSTICK_JOYSTICK_MODULE_H + +// LOVE +#include "common/Module.h" +#include "Joystick.h" + +namespace love +{ +namespace joystick +{ + +class JoystickModule : public Module +{ +public: + + virtual ~JoystickModule() {} + + /** + * Adds a connected Joystick device and opens it for use. + * Returns NULL if the Joystick could not be added. + **/ + virtual Joystick *addJoystick(int deviceindex) = 0; + + /** + * Removes a disconnected Joystick device. + **/ + virtual void removeJoystick(Joystick *joystick) = 0; + + /** + * Gets a connected Joystick from its unique Instance ID. + * Returns NULL if the instance ID does not correspond to a connected stick. + **/ + virtual Joystick *getJoystickFromID(int instanceid) = 0; + + /** + * Gets a connected Joystick. + * Returns NULL if joyindex is not in the range of [0, getJoystickCount()). + **/ + virtual Joystick *getJoystick(int joyindex) = 0; + + /** + * Gets the index of a connected joystick. + * Returns -1 if the joystick is not connected. + **/ + virtual int getIndex(const Joystick *joystick) = 0; + + /** + * Gets the number of currently connected Joysticks. + **/ + virtual int getJoystickCount() const = 0; + + /** + * Sets the virtual Gamepad mapping for a joystick input value for all + * joystick devices with the specified joystick product GUID. + * If any joysticks with the specified GUID are connected, they will be + * added as Gamepads if they aren't already, otherwise their Gamepad mapping + * will be updated. + **/ + virtual bool setGamepadMapping(const std::string &pguid, Joystick::GamepadInput gpinput, Joystick::JoystickInput joyinput) = 0; + + /** + * Gets the joystick input value the gamepad input value is bound to for the + * specified joystick product GUID. + **/ + virtual Joystick::JoystickInput getGamepadMapping(const std::string &pguid, Joystick::GamepadInput gpinput) = 0; + +}; // JoystickModule + +} // joystick +} // love + +#endif // LOVE_JOYSTICK_JOYSTICK_MODULE_H diff --git a/jni/love/src/modules/joystick/sdl/Joystick.cpp b/jni/love/src/modules/joystick/sdl/Joystick.cpp new file mode 100644 index 00000000..cabf173e --- /dev/null +++ b/jni/love/src/modules/joystick/sdl/Joystick.cpp @@ -0,0 +1,522 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "common/config.h" +#include "Joystick.h" +#include "common/int.h" + +// C++ +#include + +namespace love +{ +namespace joystick +{ +namespace sdl +{ + +Joystick::Joystick(int id) + : joyhandle(0) + , controller(0) + , haptic(0) + , instanceid(-1) + , id(id) + , vibration() +{ +} + +Joystick::Joystick(int id, int joyindex) + : joyhandle(0) + , controller(0) + , haptic(0) + , instanceid(-1) + , id(id) + , vibration() +{ + open(joyindex); +} + +Joystick::~Joystick() +{ + close(); +} + +bool Joystick::open(int deviceindex) +{ + close(); + + joyhandle = SDL_JoystickOpen(deviceindex); + + if (joyhandle) + { + instanceid = SDL_JoystickInstanceID(joyhandle); + + // SDL_JoystickGetGUIDString uses 32 bytes plus the null terminator. + char cstr[33]; + + SDL_JoystickGUID sdlguid = SDL_JoystickGetGUID(joyhandle); + SDL_JoystickGetGUIDString(sdlguid, cstr, (int) sizeof(cstr)); + + pguid = std::string(cstr); + + // See if SDL thinks this is a Game Controller. + openGamepad(deviceindex); + + // Prefer the Joystick name for consistency. + const char *joyname = SDL_JoystickName(joyhandle); + if (!joyname && controller) + joyname = SDL_GameControllerName(controller); + + if (joyname) + name = joyname; + } + + return isConnected(); +} + +void Joystick::close() +{ + if (haptic) + { + SDL_HapticRumbleStop(haptic); + SDL_HapticClose(haptic); + } + + if (controller) + SDL_GameControllerClose(controller); + + if (joyhandle) + SDL_JoystickClose(joyhandle); + + joyhandle = 0; + controller = 0; + haptic = 0; + instanceid = -1; + vibration = Vibration(); +} + +bool Joystick::isConnected() const +{ + return joyhandle != 0 && SDL_JoystickGetAttached(joyhandle); +} + +const char *Joystick::getName() const +{ + // Use the saved name if this Joystick isn't connected anymore. + if (!isConnected()) + return name.c_str(); + + // Prefer the Joystick name for consistency. + const char *joyname = SDL_JoystickName(joyhandle); + + if (!joyname && isGamepad()) + joyname = SDL_GameControllerName(controller); + + return joyname; +} + +int Joystick::getAxisCount() const +{ + return isConnected() ? SDL_JoystickNumAxes(joyhandle) : 0; +} + +int Joystick::getButtonCount() const +{ + return isConnected() ? SDL_JoystickNumButtons(joyhandle) : 0; +} + +int Joystick::getHatCount() const +{ + return isConnected() ? SDL_JoystickNumHats(joyhandle) : 0; +} + +float Joystick::getAxis(int axisindex) const +{ + if (!isConnected() || axisindex < 0 || axisindex >= getAxisCount()) + return 0; + + return clampval(((float) SDL_JoystickGetAxis(joyhandle, axisindex))/32768.0f); +} + +std::vector Joystick::getAxes() const +{ + std::vector axes; + int count = getAxisCount(); + + if (!isConnected() || count <= 0) + return axes; + + axes.reserve(count); + + for (int i = 0; i < count; i++) + axes.push_back(clampval(((float) SDL_JoystickGetAxis(joyhandle, i))/32768.0f)); + + return axes; +} + +Joystick::Hat Joystick::getHat(int hatindex) const +{ + Hat h = HAT_INVALID; + + if (!isConnected() || hatindex < 0 || hatindex >= getHatCount()) + return h; + + getConstant(SDL_JoystickGetHat(joyhandle, hatindex), h); + + return h; +} + +bool Joystick::isDown(const std::vector &buttonlist) const +{ + if (!isConnected()) + return false; + + int num = getButtonCount(); + + for (size_t i = 0; i < buttonlist.size(); i++) + { + int button = buttonlist[i]; + if (button >= 0 && button < num && SDL_JoystickGetButton(joyhandle, button) == 1) + return true; + } + + return false; +} + +bool Joystick::openGamepad(int deviceindex) +{ + if (!SDL_IsGameController(deviceindex)) + return false; + + if (isGamepad()) + { + SDL_GameControllerClose(controller); + controller = 0; + } + + controller = SDL_GameControllerOpen(deviceindex); + return isGamepad(); +} + +bool Joystick::isGamepad() const +{ + return controller != 0; +} + +float Joystick::getGamepadAxis(love::joystick::Joystick::GamepadAxis axis) const +{ + if (!isConnected() || !isGamepad()) + return 0.f; + + SDL_GameControllerAxis sdlaxis; + if (!getConstant(axis, sdlaxis)) + return 0.f; + + Sint16 value = SDL_GameControllerGetAxis(controller, sdlaxis); + + return clampval((float) value / 32768.0f); +} + +bool Joystick::isGamepadDown(const std::vector &blist) const +{ + if (!isConnected() || !isGamepad()) + return false; + + SDL_GameControllerButton sdlbutton; + + for (size_t i = 0; i < blist.size(); i++) + { + if (!getConstant(blist[i], sdlbutton)) + continue; + + if (SDL_GameControllerGetButton(controller, sdlbutton) == 1) + return true; + } + + return false; +} + +void *Joystick::getHandle() const +{ + return joyhandle; +} + +std::string Joystick::getGUID() const +{ + // SDL2's GUIDs identify *classes* of devices, instead of unique devices. + return pguid; +} + +int Joystick::getInstanceID() const +{ + return instanceid; +} + +int Joystick::getID() const +{ + return id; +} + +bool Joystick::checkCreateHaptic() +{ + if (!isConnected()) + return false; + + if (!SDL_WasInit(SDL_INIT_HAPTIC) && SDL_InitSubSystem(SDL_INIT_HAPTIC) < 0) + return false; + + if (haptic && SDL_HapticIndex(haptic) != -1) + return true; + + if (haptic) + { + SDL_HapticClose(haptic); + haptic = 0; + } + + haptic = SDL_HapticOpenFromJoystick(joyhandle); + vibration = Vibration(); + + return haptic != 0; +} + +bool Joystick::isVibrationSupported() +{ + if (!checkCreateHaptic()) + return false; + + unsigned int features = SDL_HapticQuery(haptic); + + if ((features & SDL_HAPTIC_LEFTRIGHT) != 0) + return true; + + // Some gamepad drivers only support left/right motors via a custom effect. + if (isGamepad() && (features & SDL_HAPTIC_CUSTOM) != 0) + return true; + + // Check SDL's simple rumble as a last resort. + if (SDL_HapticRumbleSupported(haptic) == 1) + return true; + + return false; +} + +bool Joystick::runVibrationEffect() +{ + if (vibration.id != -1) + { + if (SDL_HapticUpdateEffect(haptic, vibration.id, &vibration.effect) == 0) + { + if (SDL_HapticRunEffect(haptic, vibration.id, 1) != -1) + return true; + } + + // If the effect fails to update, we should destroy and re-create it. + SDL_HapticDestroyEffect(haptic, vibration.id); + vibration.id = -1; + } + + vibration.id = SDL_HapticNewEffect(haptic, &vibration.effect); + + if (vibration.id != -1 && SDL_HapticRunEffect(haptic, vibration.id, 1) != -1) + return true; + + return false; +} + +bool Joystick::setVibration(float left, float right) +{ + // TODO: support non-infinite durations? The working Tattiebogle Xbox + // controller driver in OS X seems to ignore durations under 1 second. + + left = std::min(std::max(left, 0.0f), 1.0f); + right = std::min(std::max(right, 0.0f), 1.0f); + + if (left == 0.0f && right == 0.0f) + return setVibration(); + + if (!checkCreateHaptic()) + return false; + + bool success = false; + unsigned int features = SDL_HapticQuery(haptic); + + if ((features & SDL_HAPTIC_LEFTRIGHT) != 0) + { + memset(&vibration.effect, 0, sizeof(SDL_HapticEffect)); + vibration.effect.type = SDL_HAPTIC_LEFTRIGHT; + + // SDL's Xinput code has an int. overflow bug with SDL_HAPTIC_INFINITY. + const Uint32 long_time = 1000 * 60 * 60 * 2; + + vibration.effect.leftright.length = long_time; + vibration.effect.leftright.large_magnitude = Uint16(left * LOVE_UINT16_MAX); + vibration.effect.leftright.small_magnitude = Uint16(right * LOVE_UINT16_MAX); + + success = runVibrationEffect(); + } + + // Some gamepad drivers only give support for controlling the motors via + // a custom FF effect. + if (!success && isGamepad() && (features & SDL_HAPTIC_CUSTOM) != 0) + { + // NOTE: this may cause issues with drivers which support custom effects + // but aren't similar to https://github.com/d235j/360Controller . + + // Custom effect data is clamped to 0x7FFF in SDL. + vibration.data[0] = vibration.data[2] = Uint16(left * 0x7FFF); + vibration.data[1] = vibration.data[3] = Uint16(right * 0x7FFF); + + memset(&vibration.effect, 0, sizeof(SDL_HapticEffect)); + vibration.effect.type = SDL_HAPTIC_CUSTOM; + + vibration.effect.custom.length = SDL_HAPTIC_INFINITY; + vibration.effect.custom.channels = 2; + vibration.effect.custom.period = 10; + vibration.effect.custom.samples = 2; + vibration.effect.custom.data = vibration.data; + + success = runVibrationEffect(); + } + + // Fall back to a simple rumble if all else fails. SDL's simple rumble API + // only supports a single strength value. + if (!success && SDL_HapticRumbleInit(haptic) == 0) + { + float strength = std::max(left, right); + int played = SDL_HapticRumblePlay(haptic, strength, SDL_HAPTIC_INFINITY); + success = (played == 0); + } + + if (success) + { + vibration.left = left; + vibration.right = right; + } + + return success; +} + +bool Joystick::setVibration() +{ + bool success = true; + + if (SDL_WasInit(SDL_INIT_HAPTIC) && haptic && SDL_HapticIndex(haptic) != -1) + { + // Stop all playing effects on the haptic device. + // FIXME: We should only stop the vibration effect, in case we use the + // Haptic API for other things in the future. + success = (SDL_HapticStopAll(haptic) == 0); + } + + if (success) + vibration.left = vibration.right = 0.0f; + + return success; +} + +void Joystick::getVibration(float &left, float &right) const +{ + left = vibration.left; + right = vibration.right; +} + +bool Joystick::getConstant(Uint8 in, Joystick::Hat &out) +{ + return hats.find(in, out); +} + +bool Joystick::getConstant(Joystick::Hat in, Uint8 &out) +{ + return hats.find(in, out); +} + +bool Joystick::getConstant(SDL_GameControllerAxis in, Joystick::GamepadAxis &out) +{ + return gpAxes.find(in, out); +} + +bool Joystick::getConstant(Joystick::GamepadAxis in, SDL_GameControllerAxis &out) +{ + return gpAxes.find(in, out); +} + +bool Joystick::getConstant(SDL_GameControllerButton in, Joystick::GamepadButton &out) +{ + return gpButtons.find(in, out); +} + +bool Joystick::getConstant(Joystick::GamepadButton in, SDL_GameControllerButton &out) +{ + return gpButtons.find(in, out); +} + +EnumMap::Entry Joystick::hatEntries[] = +{ + {Joystick::HAT_CENTERED, SDL_HAT_CENTERED}, + {Joystick::HAT_UP, SDL_HAT_UP}, + {Joystick::HAT_RIGHT, SDL_HAT_RIGHT}, + {Joystick::HAT_DOWN, SDL_HAT_DOWN}, + {Joystick::HAT_LEFT, SDL_HAT_LEFT}, + {Joystick::HAT_RIGHTUP, SDL_HAT_RIGHTUP}, + {Joystick::HAT_RIGHTDOWN, SDL_HAT_RIGHTDOWN}, + {Joystick::HAT_LEFTUP, SDL_HAT_LEFTUP}, + {Joystick::HAT_LEFTDOWN, SDL_HAT_LEFTDOWN}, +}; + +EnumMap Joystick::hats(Joystick::hatEntries, sizeof(Joystick::hatEntries)); + +EnumMap::Entry Joystick::gpAxisEntries[] = +{ + {Joystick::GAMEPAD_AXIS_LEFTX, SDL_CONTROLLER_AXIS_LEFTX}, + {Joystick::GAMEPAD_AXIS_LEFTY, SDL_CONTROLLER_AXIS_LEFTY}, + {Joystick::GAMEPAD_AXIS_RIGHTX, SDL_CONTROLLER_AXIS_RIGHTX}, + {Joystick::GAMEPAD_AXIS_RIGHTY, SDL_CONTROLLER_AXIS_RIGHTY}, + {Joystick::GAMEPAD_AXIS_TRIGGERLEFT, SDL_CONTROLLER_AXIS_TRIGGERLEFT}, + {Joystick::GAMEPAD_AXIS_TRIGGERRIGHT, SDL_CONTROLLER_AXIS_TRIGGERRIGHT}, +}; + +EnumMap Joystick::gpAxes(Joystick::gpAxisEntries, sizeof(Joystick::gpAxisEntries)); + +EnumMap::Entry Joystick::gpButtonEntries[] = +{ + {Joystick::GAMEPAD_BUTTON_A, SDL_CONTROLLER_BUTTON_A}, + {Joystick::GAMEPAD_BUTTON_B, SDL_CONTROLLER_BUTTON_B}, + {Joystick::GAMEPAD_BUTTON_X, SDL_CONTROLLER_BUTTON_X}, + {Joystick::GAMEPAD_BUTTON_Y, SDL_CONTROLLER_BUTTON_Y}, + {Joystick::GAMEPAD_BUTTON_BACK, SDL_CONTROLLER_BUTTON_BACK}, + {Joystick::GAMEPAD_BUTTON_GUIDE, SDL_CONTROLLER_BUTTON_GUIDE}, + {Joystick::GAMEPAD_BUTTON_START, SDL_CONTROLLER_BUTTON_START}, + {Joystick::GAMEPAD_BUTTON_LEFTSTICK, SDL_CONTROLLER_BUTTON_LEFTSTICK}, + {Joystick::GAMEPAD_BUTTON_RIGHTSTICK, SDL_CONTROLLER_BUTTON_RIGHTSTICK}, + {Joystick::GAMEPAD_BUTTON_LEFTSHOULDER, SDL_CONTROLLER_BUTTON_LEFTSHOULDER}, + {Joystick::GAMEPAD_BUTTON_RIGHTSHOULDER, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER}, + {Joystick::GAMEPAD_BUTTON_DPAD_UP, SDL_CONTROLLER_BUTTON_DPAD_UP}, + {Joystick::GAMEPAD_BUTTON_DPAD_DOWN, SDL_CONTROLLER_BUTTON_DPAD_DOWN}, + {Joystick::GAMEPAD_BUTTON_DPAD_LEFT, SDL_CONTROLLER_BUTTON_DPAD_LEFT}, + {Joystick::GAMEPAD_BUTTON_DPAD_RIGHT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT}, +}; + +EnumMap Joystick::gpButtons(Joystick::gpButtonEntries, sizeof(Joystick::gpButtonEntries)); + +} // sdl +} // joystick +} // love diff --git a/jni/love/src/modules/joystick/sdl/Joystick.h b/jni/love/src/modules/joystick/sdl/Joystick.h new file mode 100644 index 00000000..f6a6264b --- /dev/null +++ b/jni/love/src/modules/joystick/sdl/Joystick.h @@ -0,0 +1,135 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_JOYSTICK_SDL_JOYSTICK_H +#define LOVE_JOYSTICK_SDL_JOYSTICK_H + +// LOVE +#include "joystick/Joystick.h" +#include "common/EnumMap.h" + +// SDL +#include + +namespace love +{ +namespace joystick +{ +namespace sdl +{ + +class Joystick : public love::joystick::Joystick +{ +public: + + Joystick(int id); + Joystick(int id, int joyindex); + + virtual ~Joystick(); + + bool open(int deviceindex); + void close(); + + bool isConnected() const; + + const char *getName() const; + + int getAxisCount() const; + int getButtonCount() const; + int getHatCount() const; + + float getAxis(int axisindex) const; + std::vector getAxes() const; + Hat getHat(int hatindex) const; + + bool isDown(const std::vector &buttonlist) const; + + bool openGamepad(int deviceindex); + bool isGamepad() const; + + float getGamepadAxis(GamepadAxis axis) const; + bool isGamepadDown(const std::vector &blist) const; + + void *getHandle() const; + + std::string getGUID() const; + int getInstanceID() const; + int getID() const; + + bool isVibrationSupported(); + bool setVibration(float left, float right); + bool setVibration(); + void getVibration(float &left, float &right) const; + + static bool getConstant(Hat in, Uint8 &out); + static bool getConstant(Uint8 in, Hat &out); + + static bool getConstant(SDL_GameControllerAxis in, GamepadAxis &out); + static bool getConstant(GamepadAxis in, SDL_GameControllerAxis &out); + + static bool getConstant(SDL_GameControllerButton in, GamepadButton &out); + static bool getConstant(GamepadButton in, SDL_GameControllerButton &out); + +private: + + Joystick() {} + + bool checkCreateHaptic(); + bool runVibrationEffect(); + + SDL_Joystick *joyhandle; + SDL_GameController *controller; + SDL_Haptic *haptic; + + SDL_JoystickID instanceid; + std::string pguid; + int id; + + std::string name; + + struct Vibration + { + float left, right; + SDL_HapticEffect effect; + Uint16 data[4]; + int id; + + Vibration() + : left(0.0f), right(0.0f), effect(), data(), id(-1) + {} + + } vibration; + + static EnumMap::Entry hatEntries[]; + static EnumMap hats; + + static EnumMap::Entry gpAxisEntries[]; + static EnumMap gpAxes; + + static EnumMap::Entry gpButtonEntries[]; + static EnumMap gpButtons; + +}; + +} // sdl +} // joystick +} // love + +#endif // LOVE_JOYSTICK_SDL_JOYSTICK_H diff --git a/jni/love/src/modules/joystick/sdl/JoystickModule.cpp b/jni/love/src/modules/joystick/sdl/JoystickModule.cpp new file mode 100644 index 00000000..178f8692 --- /dev/null +++ b/jni/love/src/modules/joystick/sdl/JoystickModule.cpp @@ -0,0 +1,467 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" +#include "JoystickModule.h" +#include "Joystick.h" + +// SDL +#include + +// C++ +#include +#include + +// C +#include + +namespace love +{ +namespace joystick +{ +namespace sdl +{ + +JoystickModule::JoystickModule() +{ + if (SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER) < 0) + throw love::Exception("%s", SDL_GetError()); + + // Initialize any joysticks which are already connected. + for (int i = 0; i < SDL_NumJoysticks(); i++) + addJoystick(i); + + // Start joystick event watching. Joysticks are automatically added and + // removed via love.event. + SDL_JoystickEventState(SDL_ENABLE); + SDL_GameControllerEventState(SDL_ENABLE); +} + +JoystickModule::~JoystickModule() +{ + // Close any open Joysticks. + for (auto it = joysticks.begin(); it != joysticks.end(); ++it) + { + (*it)->close(); + (*it)->release(); + } + + if (SDL_WasInit(SDL_INIT_HAPTIC) != 0) + SDL_QuitSubSystem(SDL_INIT_HAPTIC); + + SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); +} + +const char *JoystickModule::getName() const +{ + return "love.joystick.sdl"; +} + +love::joystick::Joystick *JoystickModule::getJoystick(int joyindex) +{ + if (joyindex < 0 || (size_t) joyindex >= activeSticks.size()) + return 0; + + return activeSticks[joyindex]; +} + +int JoystickModule::getIndex(const love::joystick::Joystick *joystick) +{ + for (size_t i = 0; i < activeSticks.size(); i++) + { + if (activeSticks[i] == joystick) + return i; + } + + // Joystick is not connected. + return -1; +} + +int JoystickModule::getJoystickCount() const +{ + return (int) activeSticks.size(); +} + +love::joystick::Joystick *JoystickModule::getJoystickFromID(int instanceid) +{ + for (size_t i = 0; i < activeSticks.size(); i++) + { + if (instanceid == activeSticks[i]->getInstanceID()) + return activeSticks[i]; + } + + return 0; +} + +love::joystick::Joystick *JoystickModule::addJoystick(int deviceindex) +{ + if (deviceindex < 0 || deviceindex >= SDL_NumJoysticks()) + return 0; + + std::string guidstr = getDeviceGUID(deviceindex); + joystick::Joystick *joystick = 0; + bool reused = false; + + for (auto it = joysticks.begin(); it != joysticks.end(); ++it) + { + // Try to re-use a disconnected Joystick with the same GUID. + if (!(*it)->isConnected() && (*it)->getGUID() == guidstr) + { + joystick = *it; + reused = true; + break; + } + } + + if (!joystick) + { + joystick = new Joystick(joysticks.size()); + joysticks.push_back(joystick); + } + + // Make sure the Joystick object isn't in the active list already. + removeJoystick(joystick); + + if (!joystick->open(deviceindex)) + return 0; + + // Make sure multiple instances of the same physical joystick aren't added + // to the active list. + for (auto it = activeSticks.begin(); it != activeSticks.end(); ++it) + { + if (joystick->getHandle() == (*it)->getHandle()) + { + joystick->close(); + + // If we just created the stick, remove it since it's a duplicate. + if (!reused) + { + joysticks.remove(joystick); + joystick->release(); + } + + return *it; + } + } + + activeSticks.push_back(joystick); + return joystick; +} + +void JoystickModule::removeJoystick(love::joystick::Joystick *joystick) +{ + if (!joystick) + return; + + // Close the Joystick and remove it from the active joystick list. + auto it = std::find(activeSticks.begin(), activeSticks.end(), joystick); + if (it != activeSticks.end()) + { + (*it)->close(); + activeSticks.erase(it); + } +} + +bool JoystickModule::setGamepadMapping(const std::string &guid, Joystick::GamepadInput gpinput, Joystick::JoystickInput joyinput) +{ + // All SDL joystick GUID strings are 32 characters. + if (guid.length() != 32) + throw love::Exception("Invalid joystick GUID: %s", guid.c_str()); + + SDL_JoystickGUID sdlguid = SDL_JoystickGetGUIDFromString(guid.c_str()); + std::string mapstr; + + char *sdlmapstr = SDL_GameControllerMappingForGUID(sdlguid); + if (sdlmapstr) + { + mapstr = sdlmapstr; + SDL_free(sdlmapstr); + } + else + { + // Use a generic name if we have to create a new mapping string. + mapstr = guid + ",Controller,"; + } + + std::stringstream joyinputstream; + Uint8 sdlhat; + + // We can't have negative int values in the bind string. + switch (joyinput.type) + { + case Joystick::INPUT_TYPE_AXIS: + if (joyinput.axis >= 0) + joyinputstream << "a" << joyinput.axis; + break; + case Joystick::INPUT_TYPE_BUTTON: + if (joyinput.button >= 0) + joyinputstream << "b" << joyinput.button; + break; + case Joystick::INPUT_TYPE_HAT: + if (joyinput.hat.value >= 0 && Joystick::getConstant(joyinput.hat.value, sdlhat)) + joyinputstream << "h" << joyinput.hat.value << "." << int(sdlhat); + break; + default: + break; + } + + std::string joyinputstr = joyinputstream.str(); + + if (joyinputstr.length() == 0) + throw love::Exception("Invalid joystick input value."); + + // SDL's name for the gamepad input value, e.g. "guide". + std::string gpinputname = stringFromGamepadInput(gpinput); + + // We should remove any existing joystick bind for this gamepad buttton/axis + // so SDL's parser doesn't get mixed up. + removeBindFromMapString(mapstr, joyinputstr); + + // The string we'll be adding to the mapping string, e.g. "guide:b10," + std::string insertstr = gpinputname + ":" + joyinputstr + ","; + + // We should replace any existing gamepad bind. + size_t findpos = mapstr.find(gpinputname + ":"); + if (findpos != std::string::npos) + { + // The bind string ends at the next comma, or the end of the string. + size_t endpos = mapstr.find_first_of(',', findpos); + if (endpos == std::string::npos) + endpos = mapstr.length() - 1; + + mapstr.replace(findpos, endpos - findpos + 1, insertstr); + } + else + { + // Just append to the end if we don't need to replace anything. + mapstr += insertstr; + } + + // 1 == added, 0 == updated, -1 == error. + int status = SDL_GameControllerAddMapping(mapstr.c_str()); + + // FIXME: massive hack until missing APIs are added to SDL 2: + // https://bugzilla.libsdl.org/show_bug.cgi?id=1975 + if (status == 1) + checkGamepads(guid); + + return status >= 0; +} + +Joystick::JoystickInput JoystickModule::getGamepadMapping(const std::string &guid, Joystick::GamepadInput gpinput) +{ + // All SDL joystick GUID strings are 32 characters. + if (guid.length() != 32) + throw love::Exception("Invalid joystick GUID: %s", guid.c_str()); + + Joystick::JoystickInput jinput; + jinput.type = Joystick::INPUT_TYPE_MAX_ENUM; + + SDL_JoystickGUID sdlguid = SDL_JoystickGetGUIDFromString(guid.c_str()); + + std::string mapstr; + + char *sdlmapstr = SDL_GameControllerMappingForGUID(sdlguid); + if (!sdlmapstr) + return jinput; + + mapstr = sdlmapstr; + SDL_free(sdlmapstr); + + std::string gpbindname = stringFromGamepadInput(gpinput); + + size_t findpos = mapstr.find(std::string(",") + gpbindname + ":"); + if (findpos == std::string::npos) + return jinput; + + size_t endpos = mapstr.find_first_of(',', findpos); + if (endpos == std::string::npos) + { + // Assume end-of-string if we can't find the next comma. + endpos = mapstr.length() - 1; + } + + if (endpos >= mapstr.length()) + return jinput; // Something went wrong. + + // Strip out the trailing comma from our search position, if it exists. + if (mapstr[endpos] == ',') + endpos--; + + // New start position: comma + gamepadinputlength + ":". + findpos += 1 + gpbindname.length() + 1; + std::string jbindstr = mapstr.substr(findpos, endpos - findpos + 1); + + jinput = JoystickInputFromString(jbindstr); + return jinput; +} + +std::string JoystickModule::stringFromGamepadInput(Joystick::GamepadInput gpinput) const +{ + SDL_GameControllerAxis sdlaxis; + SDL_GameControllerButton sdlbutton; + + const char *gpinputname = 0; + + switch (gpinput.type) + { + case Joystick::INPUT_TYPE_AXIS: + if (Joystick::getConstant(gpinput.axis, sdlaxis)) + gpinputname = SDL_GameControllerGetStringForAxis(sdlaxis); + break; + case Joystick::INPUT_TYPE_BUTTON: + if (Joystick::getConstant(gpinput.button, sdlbutton)) + gpinputname = SDL_GameControllerGetStringForButton(sdlbutton); + break; + default: + break; + } + + if (!gpinputname) + throw love::Exception("Invalid gamepad axis/button."); + + return std::string(gpinputname); +} + +Joystick::JoystickInput JoystickModule::JoystickInputFromString(const std::string &str) const +{ + Joystick::JoystickInput jinput; + jinput.type = Joystick::INPUT_TYPE_MAX_ENUM; + + // Return an invalid value rather than throwing an exception. + if (str.length() < 2) + return jinput; + + // The input type will always be the first character in the string. + char inputtype = str[0]; + std::string bindvalues = str.substr(1); + + Uint8 sdlhat; + switch (inputtype) + { + case 'a': + jinput.type = Joystick::INPUT_TYPE_AXIS; + jinput.axis = atoi(bindvalues.c_str()); + break; + case 'b': + jinput.type = Joystick::INPUT_TYPE_BUTTON; + jinput.button = atoi(bindvalues.c_str()); + break; + case 'h': + // Hat string syntax is "index.value". + if (bindvalues.length() < 3) + break; + jinput.type = Joystick::INPUT_TYPE_HAT; + jinput.hat.index = atoi(bindvalues.substr(0, 1).c_str()); + sdlhat = (Uint8) atoi(bindvalues.substr(2, 1).c_str()); + if (!Joystick::getConstant(sdlhat, jinput.hat.value)) + { + // Return an invalid value if we can't find the hat constant. + jinput.type = Joystick::INPUT_TYPE_MAX_ENUM; + return jinput; + } + break; + default: + break; + } + + return jinput; +} + +void JoystickModule::removeBindFromMapString(std::string &mapstr, const std::string &joybindstr) const +{ + // Find the joystick part of the bind in the string. + size_t joybindpos = mapstr.find(joybindstr + ","); + if (joybindpos == std::string::npos) + { + joybindpos = mapstr.rfind(joybindstr); + if (joybindpos != mapstr.length() - joybindstr.length()) + return; + } + + if (joybindpos == std::string::npos) + return; + + // Find the start of the entire bind. + size_t bindstart = mapstr.rfind(',', joybindpos); + if (bindstart != std::string::npos && bindstart < mapstr.length() - 1) + { + size_t bindend = mapstr.find(',', bindstart + 1); + if (bindend == std::string::npos) + bindend = mapstr.length() - 1; + + // Replace it with an empty string (remove it.) + mapstr.replace(bindstart, bindend - bindstart + 1, ""); + } +} + +void JoystickModule::checkGamepads(const std::string &guid) const +{ + // FIXME: massive hack until missing APIs are added to SDL 2: + // https://bugzilla.libsdl.org/show_bug.cgi?id=1975 + + // Make sure all connected joysticks of a certain guid that are + // gamepad-capable are opened as such. + for (int d_index = 0; d_index < SDL_NumJoysticks(); d_index++) + { + if (!SDL_IsGameController(d_index)) + continue; + + if (guid.compare(getDeviceGUID(d_index)) != 0) + continue; + + for (auto it = activeSticks.begin(); it != activeSticks.end(); ++it) + { + if ((*it)->isGamepad() || guid.compare((*it)->getGUID()) != 0) + continue; + + // Big hack time: open the index as a game controller and compare + // the underlying joystick handle to the active stick's. + SDL_GameController *ctrl = SDL_GameControllerOpen(d_index); + if (ctrl == NULL) + continue; + + SDL_Joystick *stick = SDL_GameControllerGetJoystick(ctrl); + if (stick == (SDL_Joystick *) (*it)->getHandle()) + (*it)->openGamepad(d_index); + + SDL_GameControllerClose(ctrl); + } + } +} + +std::string JoystickModule::getDeviceGUID(int deviceindex) const +{ + if (deviceindex < 0 || deviceindex >= SDL_NumJoysticks()) + return std::string(""); + + // SDL_JoystickGetGUIDString uses 32 bytes plus the null terminator. + char guidstr[33] = {'\0'}; + + // SDL2's GUIDs identify *classes* of devices, instead of unique devices. + SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(deviceindex); + SDL_JoystickGetGUIDString(guid, guidstr, sizeof(guidstr)); + + return std::string(guidstr); +} + +} // sdl +} // joystick +} // love diff --git a/jni/love/src/modules/joystick/sdl/JoystickModule.h b/jni/love/src/modules/joystick/sdl/JoystickModule.h new file mode 100644 index 00000000..0e91ac09 --- /dev/null +++ b/jni/love/src/modules/joystick/sdl/JoystickModule.h @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_JOYSTICK_SDL_JOYSTICK_MODULE_H +#define LOVE_JOYSTICK_SDL_JOYSTICK_MODULE_H + +// LOVE +#include "joystick/JoystickModule.h" + +// C++ +#include +#include +#include + +namespace love +{ +namespace joystick +{ +namespace sdl +{ + +class JoystickModule : public love::joystick::JoystickModule +{ +public: + + JoystickModule(); + virtual ~JoystickModule(); + + // Implements Module. + const char *getName() const; + + // Implements JoystickModule. + love::joystick::Joystick *addJoystick(int deviceindex); + void removeJoystick(love::joystick::Joystick *joystick); + love::joystick::Joystick *getJoystickFromID(int instanceid); + love::joystick::Joystick *getJoystick(int joyindex); + int getIndex(const love::joystick::Joystick *joystick); + int getJoystickCount() const; + + bool setGamepadMapping(const std::string &guid, Joystick::GamepadInput gpinput, Joystick::JoystickInput joyinput); + Joystick::JoystickInput getGamepadMapping(const std::string &guid, Joystick::GamepadInput gpinput); + +private: + + std::string stringFromGamepadInput(Joystick::GamepadInput gpinput) const; + Joystick::JoystickInput JoystickInputFromString(const std::string &str) const; + void removeBindFromMapString(std::string &mapstr, const std::string &joybindstr) const; + + void checkGamepads(const std::string &guid) const; + + // SDL2's GUIDs identify *classes* of devices, instead of unique devices. + std::string getDeviceGUID(int deviceindex) const; + + // Lists of currently connected Joysticks. + std::vector activeSticks; + + // Persistent list of all Joysticks which have been connected at some point. + std::list joysticks; + +}; // JoystickModule + +} // sdl +} // joystick +} // love + +#endif // LOVE_JOYSTICK_SDL_JOYSTICK_MODULE_H diff --git a/jni/love/src/modules/joystick/sdl/wrap_Joystick.cpp b/jni/love/src/modules/joystick/sdl/wrap_Joystick.cpp new file mode 100644 index 00000000..d7ecb038 --- /dev/null +++ b/jni/love/src/modules/joystick/sdl/wrap_Joystick.cpp @@ -0,0 +1,263 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Joystick.h" +#include "wrap_JoystickModule.h" + +#include + +namespace love +{ +namespace joystick +{ +namespace sdl +{ + +Joystick *luax_checkjoystick(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Joystick", JOYSTICK_JOYSTICK_T); +} + +int w_Joystick_isConnected(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + luax_pushboolean(L, j->isConnected()); + return 1; +} + +int w_Joystick_getName(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + lua_pushstring(L, j->getName()); + return 1; +} + +int w_Joystick_getID(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + + // IDs are 1-based in Lua. + lua_pushinteger(L, j->getID() + 1); + + int instanceid = j->getInstanceID(); + if (instanceid >= 0) + lua_pushinteger(L, instanceid + 1); + else + lua_pushnil(L); + + return 2; +} + +int w_Joystick_getGUID(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + luax_pushstring(L, j->getGUID()); + return 1; +} + +int w_Joystick_getAxisCount(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + lua_pushinteger(L, j->getAxisCount()); + return 1; +} + +int w_Joystick_getButtonCount(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + lua_pushinteger(L, j->getButtonCount()); + return 1; +} + +int w_Joystick_getHatCount(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + lua_pushinteger(L, j->getHatCount()); + return 1; +} + +int w_Joystick_getAxis(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + int axisindex = luaL_checkint(L, 2) - 1; + lua_pushnumber(L, j->getAxis(axisindex)); + return 1; +} + +int w_Joystick_getAxes(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + std::vector axes = j->getAxes(); + + for (size_t i = 0; i < axes.size(); i++) + lua_pushnumber(L, axes[i]); + + return (int) axes.size(); +} + +int w_Joystick_getHat(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + int hatindex = luaL_checkint(L, 2) - 1; + + Joystick::Hat h = j->getHat(hatindex); + + const char *direction = ""; + love::joystick::Joystick::getConstant(h, direction); + + lua_pushstring(L, direction); + return 1; +} + +int w_Joystick_isDown(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + + luaL_checkinteger(L, 2); + + std::vector buttons; + for (int i = 2; i <= lua_gettop(L); i++) + buttons.push_back(luaL_checkint(L, i)); + + luax_pushboolean(L, j->isDown(buttons)); + return 1; +} + +int w_Joystick_isGamepad(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + luax_pushboolean(L, j->isGamepad()); + return 1; +} + +int w_Joystick_getGamepadAxis(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + + const char *str = luaL_checkstring(L, 2); + Joystick::GamepadAxis axis; + + if (!joystick::Joystick::getConstant(str, axis)) + return luaL_error(L, "Invalid gamepad axis: %s", str); + + lua_pushnumber(L, j->getGamepadAxis(axis)); + return 1; +} + +int w_Joystick_isGamepadDown(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + + std::vector buttons; + buttons.reserve(lua_gettop(L) - 1); + + luaL_checkstring(L, 2); + + for (int i = 2; i <= lua_gettop(L); i++) + { + const char *str = luaL_checkstring(L, i); + Joystick::GamepadButton button; + + if (!joystick::Joystick::getConstant(str, button)) + return luaL_error(L, "Invalid gamepad button: %s", str); + + buttons.push_back(button); + } + + luax_pushboolean(L, j->isGamepadDown(buttons)); + return 1; +} + +int w_Joystick_isVibrationSupported(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + luax_pushboolean(L, j->isVibrationSupported()); + return 1; +} + +int w_Joystick_setVibration(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + bool success = false; + + if (lua_isnoneornil(L, 2)) + { + // Disable joystick vibration if no argument is given. + success = j->setVibration(); + } + else + { + float left = (float) luaL_checknumber(L, 2); + float right = (float) luaL_optnumber(L, 3, left); + success = j->setVibration(left, right); + } + + luax_pushboolean(L, success); + return 1; +} + +int w_Joystick_getVibration(lua_State *L) +{ + Joystick *j = luax_checkjoystick(L, 1); + float left, right; + j->getVibration(left, right); + lua_pushnumber(L, left); + lua_pushnumber(L, right); + return 2; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "isConnected", w_Joystick_isConnected }, + { "getName", w_Joystick_getName }, + { "getID", w_Joystick_getID }, + { "getGUID", w_Joystick_getGUID }, + { "getAxisCount", w_Joystick_getAxisCount }, + { "getButtonCount", w_Joystick_getButtonCount }, + { "getHatCount", w_Joystick_getHatCount }, + { "getAxis", w_Joystick_getAxis }, + { "getAxes", w_Joystick_getAxes }, + { "getHat", w_Joystick_getHat }, + { "isDown", w_Joystick_isDown }, + + { "isGamepad", w_Joystick_isGamepad }, + { "getGamepadAxis", w_Joystick_getGamepadAxis }, + { "isGamepadDown", w_Joystick_isGamepadDown }, + + { "isVibrationSupported", w_Joystick_isVibrationSupported }, + { "setVibration", w_Joystick_setVibration }, + { "getVibration", w_Joystick_getVibration }, + + // From wrap_JoystickModule. + { "getConnectedIndex", w_getIndex }, + { "getGamepadMapping", w_getGamepadMapping }, + { 0, 0 }, +}; + +extern "C" int luaopen_joystick(lua_State *L) +{ + return luax_register_type(L, "Joystick", functions); +} + +} // sdl +} // joystick +} // love diff --git a/jni/love/src/modules/joystick/sdl/wrap_Joystick.h b/jni/love/src/modules/joystick/sdl/wrap_Joystick.h new file mode 100644 index 00000000..6b6c34b5 --- /dev/null +++ b/jni/love/src/modules/joystick/sdl/wrap_Joystick.h @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_JOYSTICK_SDL_WRAP_JOYSTICK_H +#define LOVE_JOYSTICK_SDL_WRAP_JOYSTICK_H + +// LOVE +#include "common/config.h" +#include "Joystick.h" +#include "common/runtime.h" + +namespace love +{ +namespace joystick +{ +namespace sdl +{ + +Joystick *luax_checkjoystick(lua_State *L, int idx); +int w_Joystick_isConnected(lua_State *L); +int w_Joystick_getName(lua_State *L); +int w_Joystick_getID(lua_State *L); +int w_Joystick_getGUID(lua_State *L); +int w_Joystick_getAxisCount(lua_State *L); +int w_Joystick_getButtonCount(lua_State *L); +int w_Joystick_getHatCount(lua_State *L); +int w_Joystick_getAxis(lua_State *L); +int w_Joystick_getAxes(lua_State *L); +int w_Joystick_getHat(lua_State *L); +int w_Joystick_isDown(lua_State *L); +int w_Joystick_isGamepad(lua_State *L); +int w_Joystick_getGamepadAxis(lua_State *L); +int w_Joystick_isGamepadDown(lua_State *L); +int w_Joystick_isVibrationSupported(lua_State *L); +int w_Joystick_setVibration(lua_State *L); +int w_Joystick_getVibration(lua_State *L); +extern "C" int luaopen_joystick(lua_State *L); + +} // sdl +} // joystick +} // love + +#endif // LOVE_JOYSTICK_SDL_WRAP_JOYSTICK_H diff --git a/jni/love/src/modules/joystick/sdl/wrap_JoystickModule.cpp b/jni/love/src/modules/joystick/sdl/wrap_JoystickModule.cpp new file mode 100644 index 00000000..a9ffca10 --- /dev/null +++ b/jni/love/src/modules/joystick/sdl/wrap_JoystickModule.cpp @@ -0,0 +1,216 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_JoystickModule.h" +#include "wrap_Joystick.h" + +namespace love +{ +namespace joystick +{ +namespace sdl +{ + +static JoystickModule *instance = 0; + +int w_getJoysticks(lua_State *L) +{ + int stickcount = instance->getJoystickCount(); + lua_createtable(L, stickcount, 0); + + for (int i = 0; i < stickcount; i++) + { + love::joystick::Joystick *stick = instance->getJoystick(i); + stick->retain(); + luax_pushtype(L, "Joystick", JOYSTICK_JOYSTICK_T, stick); + lua_rawseti(L, -2, i + 1); + } + + return 1; +} + +int w_getIndex(lua_State *L) +{ + love::joystick::Joystick *j = luax_checkjoystick(L, 1); + int index = instance->getIndex(j); + if (index >= 0) + lua_pushinteger(L, index + 1); + else + lua_pushnil(L); + return 1; +} + +int w_getJoystickCount(lua_State *L) +{ + lua_pushinteger(L, instance->getJoystickCount()); + return 1; +} + +int w_setGamepadMapping(lua_State *L) +{ + // Only accept a GUID string. We don't accept a Joystick object because + // the gamepad mapping applies to all joysticks with the same GUID (e.g. all + // Xbox 360 controllers on the system), rather than individual objects. + const char *guid = luaL_checkstring(L, 1); + + const char *gpbindstr = luaL_checkstring(L, 2); + Joystick::GamepadInput gpinput; + + if (love::joystick::Joystick::getConstant(gpbindstr, gpinput.axis)) + gpinput.type = Joystick::INPUT_TYPE_AXIS; + else if (love::joystick::Joystick::getConstant(gpbindstr, gpinput.button)) + gpinput.type = Joystick::INPUT_TYPE_BUTTON; + else + return luaL_error(L, "Invalid gamepad axis/button: %s", gpbindstr); + + const char *jinputtypestr = luaL_checkstring(L, 3); + Joystick::JoystickInput jinput; + + if (!love::joystick::Joystick::getConstant(jinputtypestr, jinput.type)) + return luaL_error(L, "Invalid joystick input type: %s", jinputtypestr); + + const char *hatstr; + switch (jinput.type) + { + case Joystick::INPUT_TYPE_AXIS: + jinput.axis = luaL_checkint(L, 4) - 1; + break; + case Joystick::INPUT_TYPE_BUTTON: + jinput.button = luaL_checkint(L, 4) - 1; + break; + case Joystick::INPUT_TYPE_HAT: + // Hats need both a hat index and a hat value. + jinput.hat.index = luaL_checkint(L, 4) - 1; + hatstr = luaL_checkstring(L, 5); + if (!love::joystick::Joystick::getConstant(hatstr, jinput.hat.value)) + return luaL_error(L, "Invalid joystick hat: %s", hatstr); + break; + default: + return luaL_error(L, "Invalid joystick input type: %s", jinputtypestr); + } + + bool success = false; + EXCEPT_GUARD(success = instance->setGamepadMapping(guid, gpinput, jinput);) + + luax_pushboolean(L, success); + return 1; +} + +int w_getGamepadMapping(lua_State *L) +{ + std::string guid; + + // Accept either a GUID string or a Joystick object. This way we can re-use + // the function for Joystick:getGamepadMapping. + if (lua_type(L, 1) == LUA_TSTRING) + guid = luax_checkstring(L, 1); + else + { + love::joystick::Joystick *stick = luax_checkjoystick(L, 1); + guid = stick->getGUID(); + } + + const char *gpbindstr = luaL_checkstring(L, 2); + Joystick::GamepadInput gpinput; + + if (love::joystick::Joystick::getConstant(gpbindstr, gpinput.axis)) + gpinput.type = Joystick::INPUT_TYPE_AXIS; + else if (love::joystick::Joystick::getConstant(gpbindstr, gpinput.button)) + gpinput.type = Joystick::INPUT_TYPE_BUTTON; + else + return luaL_error(L, "Invalid gamepad axis/button: %s", gpbindstr); + + Joystick::JoystickInput jinput; + jinput.type = Joystick::INPUT_TYPE_MAX_ENUM; + + EXCEPT_GUARD(jinput = instance->getGamepadMapping(guid, gpinput);) + + if (jinput.type == Joystick::INPUT_TYPE_MAX_ENUM) + return 0; + + const char *inputtypestr; + if (!love::joystick::Joystick::getConstant(jinput.type, inputtypestr)) + return luaL_error(L, "Unknown joystick input type."); + + lua_pushstring(L, inputtypestr); + + const char *hatstr; + switch (jinput.type) + { + case Joystick::INPUT_TYPE_AXIS: + lua_pushinteger(L, jinput.axis + 1); + return 2; + case Joystick::INPUT_TYPE_BUTTON: + lua_pushinteger(L, jinput.button + 1); + return 2; + case Joystick::INPUT_TYPE_HAT: + lua_pushinteger(L, jinput.hat.index + 1); + if (love::joystick::Joystick::getConstant(jinput.hat.value, hatstr)) + { + lua_pushstring(L, hatstr); + return 3; + } + else + return luaL_error(L, "Unknown joystick hat."); + default: + break; // ? + } + + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "getJoysticks", w_getJoysticks }, + { "getJoystickCount", w_getJoystickCount }, + { "setGamepadMapping", w_setGamepadMapping }, + { "getGamepadMapping", w_getGamepadMapping }, + { 0, 0 } +}; + +static const lua_CFunction types[] = +{ + luaopen_joystick, + 0, +}; + +extern "C" int luaopen_love_joystick(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new JoystickModule();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "joystick"; + w.flags = MODULE_T; + w.functions = functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // sdl +} // joystick +} // love diff --git a/jni/love/src/modules/joystick/sdl/wrap_JoystickModule.h b/jni/love/src/modules/joystick/sdl/wrap_JoystickModule.h new file mode 100644 index 00000000..9373c529 --- /dev/null +++ b/jni/love/src/modules/joystick/sdl/wrap_JoystickModule.h @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_JOYSTICK_SDL_WRAP_JOYSTICK_MODULE_H +#define LOVE_JOYSTICK_SDL_WRAP_JOYSTICK_MODULE_H + +// LOVE +#include "common/config.h" +#include "JoystickModule.h" + +namespace love +{ +namespace joystick +{ +namespace sdl +{ + +int w_getJoysticks(lua_State *L); +int w_getIndex(lua_State *L); +int w_getJoystickCount(lua_State *L); +int w_setGamepadMapping(lua_State *L); +int w_getGamepadMapping(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_joystick(lua_State *L); + +} // sdl +} // joystick +} // love + +#endif // LOVE_JOYSTICK_SDL_WRAP_JOYSTICK_MODULE_H diff --git a/jni/love/src/modules/keyboard/Keyboard.cpp b/jni/love/src/modules/keyboard/Keyboard.cpp new file mode 100644 index 00000000..f16172c3 --- /dev/null +++ b/jni/love/src/modules/keyboard/Keyboard.cpp @@ -0,0 +1,238 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" + +#include "Keyboard.h" + +namespace love +{ +namespace keyboard +{ + +bool Keyboard::getConstant(const char *in, Keyboard::Key &out) +{ + return keys.find(in, out); +} + +bool Keyboard::getConstant(Keyboard::Key in, const char *&out) +{ + return keys.find(in, out); +} + +StringMap::Entry Keyboard::keyEntries[] = +{ + {"return", Keyboard::KEY_RETURN}, + {"escape", Keyboard::KEY_ESCAPE}, + {"backspace", Keyboard::KEY_BACKSPACE}, + {"tab", Keyboard::KEY_TAB}, + {" ", Keyboard::KEY_SPACE}, + {"!", Keyboard::KEY_EXCLAIM}, + {"\"", Keyboard::KEY_QUOTEDBL}, + {"#", Keyboard::KEY_HASH}, + {"$", Keyboard::KEY_DOLLAR}, + {"&", Keyboard::KEY_AMPERSAND}, + {"'", Keyboard::KEY_QUOTE}, + {"(", Keyboard::KEY_LEFTPAREN}, + {")", Keyboard::KEY_RIGHTPAREN}, + {"*", Keyboard::KEY_ASTERISK}, + {"+", Keyboard::KEY_PLUS}, + {",", Keyboard::KEY_COMMA}, + {"-", Keyboard::KEY_MINUS}, + {".", Keyboard::KEY_PERIOD}, + {"/", Keyboard::KEY_SLASH}, + {"0", Keyboard::KEY_0}, + {"1", Keyboard::KEY_1}, + {"2", Keyboard::KEY_2}, + {"3", Keyboard::KEY_3}, + {"4", Keyboard::KEY_4}, + {"5", Keyboard::KEY_5}, + {"6", Keyboard::KEY_6}, + {"7", Keyboard::KEY_7}, + {"8", Keyboard::KEY_8}, + {"9", Keyboard::KEY_9}, + {":", Keyboard::KEY_COLON}, + {";", Keyboard::KEY_SEMICOLON}, + {"<", Keyboard::KEY_LESS}, + {"=", Keyboard::KEY_EQUALS}, + {">", Keyboard::KEY_GREATER}, + {"?", Keyboard::KEY_QUESTION}, + {"@", Keyboard::KEY_AT}, + + {"[", Keyboard::KEY_LEFTBRACKET}, + {"\\", Keyboard::KEY_BACKSLASH}, + {"]", Keyboard::KEY_RIGHTBRACKET}, + {"^", Keyboard::KEY_CARET}, + {"_", Keyboard::KEY_UNDERSCORE}, + {"`", Keyboard::KEY_BACKQUOTE}, + {"a", Keyboard::KEY_A}, + {"b", Keyboard::KEY_B}, + {"c", Keyboard::KEY_C}, + {"d", Keyboard::KEY_D}, + {"e", Keyboard::KEY_E}, + {"f", Keyboard::KEY_F}, + {"g", Keyboard::KEY_G}, + {"h", Keyboard::KEY_H}, + {"i", Keyboard::KEY_I}, + {"j", Keyboard::KEY_J}, + {"k", Keyboard::KEY_K}, + {"l", Keyboard::KEY_L}, + {"m", Keyboard::KEY_M}, + {"n", Keyboard::KEY_N}, + {"o", Keyboard::KEY_O}, + {"p", Keyboard::KEY_P}, + {"q", Keyboard::KEY_Q}, + {"r", Keyboard::KEY_R}, + {"s", Keyboard::KEY_S}, + {"t", Keyboard::KEY_T}, + {"u", Keyboard::KEY_U}, + {"v", Keyboard::KEY_V}, + {"w", Keyboard::KEY_W}, + {"x", Keyboard::KEY_X}, + {"y", Keyboard::KEY_Y}, + {"z", Keyboard::KEY_Z}, + + {"capslock", Keyboard::KEY_CAPSLOCK}, + + {"f1", Keyboard::KEY_F1}, + {"f2", Keyboard::KEY_F2}, + {"f3", Keyboard::KEY_F3}, + {"f4", Keyboard::KEY_F4}, + {"f5", Keyboard::KEY_F5}, + {"f6", Keyboard::KEY_F6}, + {"f7", Keyboard::KEY_F7}, + {"f8", Keyboard::KEY_F8}, + {"f9", Keyboard::KEY_F9}, + {"f10", Keyboard::KEY_F10}, + {"f11", Keyboard::KEY_F11}, + {"f12", Keyboard::KEY_F12}, + + {"printscreen", Keyboard::KEY_PRINTSCREEN}, + {"scrolllock", Keyboard::KEY_SCROLLLOCK}, + {"pause", Keyboard::KEY_PAUSE}, + {"insert", Keyboard::KEY_INSERT}, + {"home", Keyboard::KEY_HOME}, + {"pageup", Keyboard::KEY_PAGEUP}, + {"delete", Keyboard::KEY_DELETE}, + {"end", Keyboard::KEY_END}, + {"pagedown", Keyboard::KEY_PAGEDOWN}, + {"right", Keyboard::KEY_RIGHT}, + {"left", Keyboard::KEY_LEFT}, + {"down", Keyboard::KEY_DOWN}, + {"up", Keyboard::KEY_UP}, + + {"numlock", Keyboard::KEY_NUMLOCKCLEAR}, + {"kp/", Keyboard::KEY_KP_DIVIDE}, + {"kp*", Keyboard::KEY_KP_MULTIPLY}, + {"kp-", Keyboard::KEY_KP_MINUS}, + {"kp+", Keyboard::KEY_KP_PLUS}, + {"kpenter", Keyboard::KEY_KP_ENTER}, + {"kp0", Keyboard::KEY_KP_0}, + {"kp1", Keyboard::KEY_KP_1}, + {"kp2", Keyboard::KEY_KP_2}, + {"kp3", Keyboard::KEY_KP_3}, + {"kp4", Keyboard::KEY_KP_4}, + {"kp5", Keyboard::KEY_KP_5}, + {"kp6", Keyboard::KEY_KP_6}, + {"kp7", Keyboard::KEY_KP_7}, + {"kp8", Keyboard::KEY_KP_8}, + {"kp9", Keyboard::KEY_KP_9}, + {"kp.", Keyboard::KEY_KP_PERIOD}, + {"kp,", Keyboard::KEY_KP_COMMA}, + {"kp=", Keyboard::KEY_KP_EQUALS}, + + {"application", Keyboard::KEY_APPLICATION}, + {"power", Keyboard::KEY_POWER}, + {"f13", Keyboard::KEY_F13}, + {"f14", Keyboard::KEY_F14}, + {"f15", Keyboard::KEY_F15}, + {"f16", Keyboard::KEY_F16}, + {"f17", Keyboard::KEY_F17}, + {"f18", Keyboard::KEY_F18}, + {"f19", Keyboard::KEY_F19}, + {"f20", Keyboard::KEY_F20}, + {"f21", Keyboard::KEY_F21}, + {"f22", Keyboard::KEY_F22}, + {"f23", Keyboard::KEY_F23}, + {"f24", Keyboard::KEY_F24}, + {"execute", Keyboard::KEY_EXECUTE}, + {"help", Keyboard::KEY_HELP}, + {"menu", Keyboard::KEY_MENU}, + {"select", Keyboard::KEY_SELECT}, + {"stop", Keyboard::KEY_STOP}, + {"again", Keyboard::KEY_AGAIN}, + {"undo", Keyboard::KEY_UNDO}, + {"cut", Keyboard::KEY_CUT}, + {"copy", Keyboard::KEY_COPY}, + {"paste", Keyboard::KEY_PASTE}, + {"find", Keyboard::KEY_FIND}, + {"mute", Keyboard::KEY_MUTE}, + {"volumeup", Keyboard::KEY_VOLUMEUP}, + {"volumedown", Keyboard::KEY_VOLUMEDOWN}, + + {"alterase", Keyboard::KEY_ALTERASE}, + {"sysreq", Keyboard::KEY_SYSREQ}, + {"cancel", Keyboard::KEY_CANCEL}, + {"clear", Keyboard::KEY_CLEAR}, + {"prior", Keyboard::KEY_PRIOR}, + {"return2", Keyboard::KEY_RETURN2}, + {"separator", Keyboard::KEY_SEPARATOR}, + {"out", Keyboard::KEY_OUT}, + {"oper", Keyboard::KEY_OPER}, + {"clearagain", Keyboard::KEY_CLEARAGAIN}, + + {"thsousandsseparator", Keyboard::KEY_THOUSANDSSEPARATOR}, + {"decimalseparator", Keyboard::KEY_DECIMALSEPARATOR}, + {"currencyunit", Keyboard::KEY_CURRENCYUNIT}, + {"currencysubunit", Keyboard::KEY_CURRENCYSUBUNIT}, + + {"lctrl", Keyboard::KEY_LCTRL}, + {"lshift", Keyboard::KEY_LSHIFT}, + {"lalt", Keyboard::KEY_LALT}, + {"lgui", Keyboard::KEY_LGUI}, + {"rctrl", Keyboard::KEY_RCTRL}, + {"rshift", Keyboard::KEY_RSHIFT}, + {"ralt", Keyboard::KEY_RALT}, + {"rgui", Keyboard::KEY_RGUI}, + + {"mode", Keyboard::KEY_MODE}, + + {"audionext", Keyboard::KEY_AUDIONEXT}, + {"audioprev", Keyboard::KEY_AUDIOPREV}, + {"audiostop", Keyboard::KEY_AUDIOSTOP}, + {"audioplay", Keyboard::KEY_AUDIOPLAY}, + {"audiomute", Keyboard::KEY_AUDIOMUTE}, + {"mediaselect", Keyboard::KEY_MEDIASELECT}, + + {"brightnessdown", Keyboard::KEY_BRIGHTNESSDOWN}, + {"brightnessup", Keyboard::KEY_BRIGHTNESSUP}, + {"displayswitch", Keyboard::KEY_DISPLAYSWITCH}, + {"kbdillumtoggle", Keyboard::KEY_KBDILLUMTOGGLE}, + {"kbdillumdown", Keyboard::KEY_KBDILLUMDOWN}, + {"kbdillumup", Keyboard::KEY_KBDILLUMUP}, + {"eject", Keyboard::KEY_EJECT}, + {"sleep", Keyboard::KEY_SLEEP}, +}; + +StringMap Keyboard::keys(Keyboard::keyEntries, sizeof(Keyboard::keyEntries)); + + +} // keyboard +} // love diff --git a/jni/love/src/modules/keyboard/Keyboard.h b/jni/love/src/modules/keyboard/Keyboard.h new file mode 100644 index 00000000..bf85c0c3 --- /dev/null +++ b/jni/love/src/modules/keyboard/Keyboard.h @@ -0,0 +1,281 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_KEYBOARD_KEYBOARD_H +#define LOVE_KEYBOARD_KEYBOARD_H + +// LOVE +#include "common/Module.h" +#include "common/StringMap.h" + +namespace love +{ +namespace keyboard +{ + +class Keyboard : public Module +{ +public: + + enum Key + { + KEY_UNKNOWN, + + KEY_RETURN, + KEY_ESCAPE, + KEY_BACKSPACE, + KEY_TAB, + KEY_SPACE, + KEY_EXCLAIM, + KEY_QUOTEDBL, + KEY_HASH, + KEY_PERCENT, + KEY_DOLLAR, + KEY_AMPERSAND, + KEY_QUOTE, + KEY_LEFTPAREN, + KEY_RIGHTPAREN, + KEY_ASTERISK, + KEY_PLUS, + KEY_COMMA, + KEY_MINUS, + KEY_PERIOD, + KEY_SLASH, + KEY_0, + KEY_1, + KEY_2, + KEY_3, + KEY_4, + KEY_5, + KEY_6, + KEY_7, + KEY_8, + KEY_9, + KEY_COLON, + KEY_SEMICOLON, + KEY_LESS, + KEY_EQUALS, + KEY_GREATER, + KEY_QUESTION, + KEY_AT, + + KEY_LEFTBRACKET, + KEY_BACKSLASH, + KEY_RIGHTBRACKET, + KEY_CARET, + KEY_UNDERSCORE, + KEY_BACKQUOTE, + KEY_A, + KEY_B, + KEY_C, + KEY_D, + KEY_E, + KEY_F, + KEY_G, + KEY_H, + KEY_I, + KEY_J, + KEY_K, + KEY_L, + KEY_M, + KEY_N, + KEY_O, + KEY_P, + KEY_Q, + KEY_R, + KEY_S, + KEY_T, + KEY_U, + KEY_V, + KEY_W, + KEY_X, + KEY_Y, + KEY_Z, + + KEY_CAPSLOCK, + + KEY_F1, + KEY_F2, + KEY_F3, + KEY_F4, + KEY_F5, + KEY_F6, + KEY_F7, + KEY_F8, + KEY_F9, + KEY_F10, + KEY_F11, + KEY_F12, + + KEY_PRINTSCREEN, + KEY_SCROLLLOCK, + KEY_PAUSE, + KEY_INSERT, + KEY_HOME, + KEY_PAGEUP, + KEY_DELETE, + KEY_END, + KEY_PAGEDOWN, + KEY_RIGHT, + KEY_LEFT, + KEY_DOWN, + KEY_UP, + + KEY_NUMLOCKCLEAR, + KEY_KP_DIVIDE, + KEY_KP_MULTIPLY, + KEY_KP_MINUS, + KEY_KP_PLUS, + KEY_KP_ENTER, + KEY_KP_1, + KEY_KP_2, + KEY_KP_3, + KEY_KP_4, + KEY_KP_5, + KEY_KP_6, + KEY_KP_7, + KEY_KP_8, + KEY_KP_9, + KEY_KP_0, + KEY_KP_PERIOD, + KEY_KP_COMMA, + KEY_KP_EQUALS, + + KEY_APPLICATION, + KEY_POWER, + KEY_F13, + KEY_F14, + KEY_F15, + KEY_F16, + KEY_F17, + KEY_F18, + KEY_F19, + KEY_F20, + KEY_F21, + KEY_F22, + KEY_F23, + KEY_F24, + KEY_EXECUTE, + KEY_HELP, + KEY_MENU, + KEY_SELECT, + KEY_STOP, + KEY_AGAIN, + KEY_UNDO, + KEY_CUT, + KEY_COPY, + KEY_PASTE, + KEY_FIND, + KEY_MUTE, + KEY_VOLUMEUP, + KEY_VOLUMEDOWN, + + KEY_ALTERASE, + KEY_SYSREQ, + KEY_CANCEL, + KEY_CLEAR, + KEY_PRIOR, + KEY_RETURN2, + KEY_SEPARATOR, + KEY_OUT, + KEY_OPER, + KEY_CLEARAGAIN, + + KEY_THOUSANDSSEPARATOR, + KEY_DECIMALSEPARATOR, + KEY_CURRENCYUNIT, + KEY_CURRENCYSUBUNIT, + + KEY_LCTRL, + KEY_LSHIFT, + KEY_LALT, + KEY_LGUI, + KEY_RCTRL, + KEY_RSHIFT, + KEY_RALT, + KEY_RGUI, + + KEY_MODE, + + KEY_AUDIONEXT, + KEY_AUDIOPREV, + KEY_AUDIOSTOP, + KEY_AUDIOPLAY, + KEY_AUDIOMUTE, + KEY_MEDIASELECT, + + KEY_BRIGHTNESSDOWN, + KEY_BRIGHTNESSUP, + KEY_DISPLAYSWITCH, + KEY_KBDILLUMTOGGLE, + KEY_KBDILLUMDOWN, + KEY_KBDILLUMUP, + KEY_EJECT, + KEY_SLEEP, + + KEY_MAX_ENUM = 512 + }; + + virtual ~Keyboard() {} + + /** + * Sets whether repeat keypress events should be sent if a key is held down. + * Does not affect text input events. + * @param enable Whether to send repeat key press events. + **/ + virtual void setKeyRepeat(bool enable) = 0; + + /** + * Gets whether repeat keypress events will be sent if a key is held down. + **/ + virtual bool hasKeyRepeat() const = 0; + + /** + * Checks whether certain keys are down or not. + * @param keylist An array of key identifiers, terminated by KEY_MAX_ENUM. + * @return boolean + **/ + virtual bool isDown(Key *keylist) const = 0; + + /** + * Sets whether text input events should be sent + * @param enable Whether to send text input events. + **/ + virtual void setTextInput(bool enable) = 0; + + /** + * Gets whether text input events are enabled. + **/ + virtual bool hasTextInput() const = 0; + + static bool getConstant(const char *in, Key &out); + static bool getConstant(Key in, const char *&out); + +private: + + static StringMap::Entry keyEntries[]; + static StringMap keys; + +}; // Keyboard + +} // keyboard +} // love + +#endif // LOVE_KEYBOARD_KEYBOARD_H diff --git a/jni/love/src/modules/keyboard/sdl/Keyboard.cpp b/jni/love/src/modules/keyboard/sdl/Keyboard.cpp new file mode 100644 index 00000000..a91cdc4d --- /dev/null +++ b/jni/love/src/modules/keyboard/sdl/Keyboard.cpp @@ -0,0 +1,284 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" + +#include "Keyboard.h" + +namespace love +{ +namespace keyboard +{ +namespace sdl +{ + +Keyboard::Keyboard() + : key_repeat(false) +{ +} + +const char *Keyboard::getName() const +{ + return "love.keyboard.sdl"; +} + +void Keyboard::setKeyRepeat(bool enable) +{ + key_repeat = enable; +} + +bool Keyboard::hasKeyRepeat() const +{ + return key_repeat; +} + +bool Keyboard::isDown(Key *keylist) const +{ + const Uint8 *keystate = SDL_GetKeyboardState(0); + std::map::const_iterator it; + + for (Key key = *keylist; key != KEY_MAX_ENUM; key = *(++keylist)) + { + it = keys.find(key); + if (it != keys.end() && keystate[SDL_GetScancodeFromKey(it->second)]) + return true; + } + + return false; +} + +void Keyboard::setTextInput(bool enable) +{ + if (enable) + SDL_StartTextInput(); + else + SDL_StopTextInput(); +} + +bool Keyboard::hasTextInput() const +{ + return SDL_IsTextInputActive(); +} + +std::map Keyboard::createKeyMap() +{ + std::map k; + + k[Keyboard::KEY_UNKNOWN] = SDLK_UNKNOWN; + + k[Keyboard::KEY_RETURN] = SDLK_RETURN; + k[Keyboard::KEY_ESCAPE] = SDLK_ESCAPE; + k[Keyboard::KEY_BACKSPACE] = SDLK_BACKSPACE; + k[Keyboard::KEY_TAB] = SDLK_TAB; + k[Keyboard::KEY_SPACE] = SDLK_SPACE; + k[Keyboard::KEY_EXCLAIM] = SDLK_EXCLAIM; + k[Keyboard::KEY_QUOTEDBL] = SDLK_QUOTEDBL; + k[Keyboard::KEY_HASH] = SDLK_HASH; + k[Keyboard::KEY_DOLLAR] = SDLK_DOLLAR; + k[Keyboard::KEY_AMPERSAND] = SDLK_AMPERSAND; + k[Keyboard::KEY_QUOTE] = SDLK_QUOTE; + k[Keyboard::KEY_LEFTPAREN] = SDLK_LEFTPAREN; + k[Keyboard::KEY_RIGHTPAREN] = SDLK_RIGHTPAREN; + k[Keyboard::KEY_ASTERISK] = SDLK_ASTERISK; + k[Keyboard::KEY_PLUS] = SDLK_PLUS; + k[Keyboard::KEY_COMMA] = SDLK_COMMA; + k[Keyboard::KEY_MINUS] = SDLK_MINUS; + k[Keyboard::KEY_PERIOD] = SDLK_PERIOD; + k[Keyboard::KEY_SLASH] = SDLK_SLASH; + k[Keyboard::KEY_0] = SDLK_0; + k[Keyboard::KEY_1] = SDLK_1; + k[Keyboard::KEY_2] = SDLK_2; + k[Keyboard::KEY_3] = SDLK_3; + k[Keyboard::KEY_4] = SDLK_4; + k[Keyboard::KEY_5] = SDLK_5; + k[Keyboard::KEY_6] = SDLK_6; + k[Keyboard::KEY_7] = SDLK_7; + k[Keyboard::KEY_8] = SDLK_8; + k[Keyboard::KEY_9] = SDLK_9; + k[Keyboard::KEY_COLON] = SDLK_COLON; + k[Keyboard::KEY_SEMICOLON] = SDLK_SEMICOLON; + k[Keyboard::KEY_LESS] = SDLK_LESS; + k[Keyboard::KEY_EQUALS] = SDLK_EQUALS; + k[Keyboard::KEY_GREATER] = SDLK_GREATER; + k[Keyboard::KEY_QUESTION] = SDLK_QUESTION; + k[Keyboard::KEY_AT] = SDLK_AT; + + k[Keyboard::KEY_LEFTBRACKET] = SDLK_LEFTBRACKET; + k[Keyboard::KEY_BACKSLASH] = SDLK_BACKSLASH; + k[Keyboard::KEY_RIGHTBRACKET] = SDLK_RIGHTBRACKET; + k[Keyboard::KEY_CARET] = SDLK_CARET; + k[Keyboard::KEY_UNDERSCORE] = SDLK_UNDERSCORE; + k[Keyboard::KEY_BACKQUOTE] = SDLK_BACKQUOTE; + k[Keyboard::KEY_A] = SDLK_a; + k[Keyboard::KEY_B] = SDLK_b; + k[Keyboard::KEY_C] = SDLK_c; + k[Keyboard::KEY_D] = SDLK_d; + k[Keyboard::KEY_E] = SDLK_e; + k[Keyboard::KEY_F] = SDLK_f; + k[Keyboard::KEY_G] = SDLK_g; + k[Keyboard::KEY_H] = SDLK_h; + k[Keyboard::KEY_I] = SDLK_i; + k[Keyboard::KEY_J] = SDLK_j; + k[Keyboard::KEY_K] = SDLK_k; + k[Keyboard::KEY_L] = SDLK_l; + k[Keyboard::KEY_M] = SDLK_m; + k[Keyboard::KEY_N] = SDLK_n; + k[Keyboard::KEY_O] = SDLK_o; + k[Keyboard::KEY_P] = SDLK_p; + k[Keyboard::KEY_Q] = SDLK_q; + k[Keyboard::KEY_R] = SDLK_r; + k[Keyboard::KEY_S] = SDLK_s; + k[Keyboard::KEY_T] = SDLK_t; + k[Keyboard::KEY_U] = SDLK_u; + k[Keyboard::KEY_V] = SDLK_v; + k[Keyboard::KEY_W] = SDLK_w; + k[Keyboard::KEY_X] = SDLK_x; + k[Keyboard::KEY_Y] = SDLK_y; + k[Keyboard::KEY_Z] = SDLK_z; + + k[Keyboard::KEY_CAPSLOCK] = SDLK_CAPSLOCK; + + k[Keyboard::KEY_F1] = SDLK_F1; + k[Keyboard::KEY_F2] = SDLK_F2; + k[Keyboard::KEY_F3] = SDLK_F3; + k[Keyboard::KEY_F4] = SDLK_F4; + k[Keyboard::KEY_F5] = SDLK_F5; + k[Keyboard::KEY_F6] = SDLK_F6; + k[Keyboard::KEY_F7] = SDLK_F7; + k[Keyboard::KEY_F8] = SDLK_F8; + k[Keyboard::KEY_F9] = SDLK_F9; + k[Keyboard::KEY_F10] = SDLK_F10; + k[Keyboard::KEY_F11] = SDLK_F11; + k[Keyboard::KEY_F12] = SDLK_F12; + + k[Keyboard::KEY_PRINTSCREEN] = SDLK_PRINTSCREEN; + k[Keyboard::KEY_SCROLLLOCK] = SDLK_SCROLLLOCK; + k[Keyboard::KEY_PAUSE] = SDLK_PAUSE; + k[Keyboard::KEY_INSERT] = SDLK_INSERT; + k[Keyboard::KEY_HOME] = SDLK_HOME; + k[Keyboard::KEY_PAGEUP] = SDLK_PAGEUP; + k[Keyboard::KEY_DELETE] = SDLK_DELETE; + k[Keyboard::KEY_END] = SDLK_END; + k[Keyboard::KEY_PAGEDOWN] = SDLK_PAGEDOWN; + k[Keyboard::KEY_RIGHT] = SDLK_RIGHT; + k[Keyboard::KEY_LEFT] = SDLK_LEFT; + k[Keyboard::KEY_DOWN] = SDLK_DOWN; + k[Keyboard::KEY_UP] = SDLK_UP; + + k[Keyboard::KEY_NUMLOCKCLEAR] = SDLK_NUMLOCKCLEAR; + k[Keyboard::KEY_KP_DIVIDE] = SDLK_KP_DIVIDE; + k[Keyboard::KEY_KP_MULTIPLY] = SDLK_KP_MULTIPLY; + k[Keyboard::KEY_KP_MINUS] = SDLK_KP_MINUS; + k[Keyboard::KEY_KP_PLUS] = SDLK_KP_PLUS; + k[Keyboard::KEY_KP_ENTER] = SDLK_KP_ENTER; + k[Keyboard::KEY_KP_0] = SDLK_KP_0; + k[Keyboard::KEY_KP_1] = SDLK_KP_1; + k[Keyboard::KEY_KP_2] = SDLK_KP_2; + k[Keyboard::KEY_KP_3] = SDLK_KP_3; + k[Keyboard::KEY_KP_4] = SDLK_KP_4; + k[Keyboard::KEY_KP_5] = SDLK_KP_5; + k[Keyboard::KEY_KP_6] = SDLK_KP_6; + k[Keyboard::KEY_KP_7] = SDLK_KP_7; + k[Keyboard::KEY_KP_8] = SDLK_KP_8; + k[Keyboard::KEY_KP_9] = SDLK_KP_9; + k[Keyboard::KEY_KP_PERIOD] = SDLK_KP_PERIOD; + k[Keyboard::KEY_KP_COMMA] = SDLK_KP_COMMA; + k[Keyboard::KEY_KP_EQUALS] = SDLK_KP_EQUALS; + + k[Keyboard::KEY_APPLICATION] = SDLK_APPLICATION; + k[Keyboard::KEY_POWER] = SDLK_POWER; + k[Keyboard::KEY_F13] = SDLK_F13; + k[Keyboard::KEY_F14] = SDLK_F14; + k[Keyboard::KEY_F15] = SDLK_F15; + k[Keyboard::KEY_F16] = SDLK_F16; + k[Keyboard::KEY_F17] = SDLK_F17; + k[Keyboard::KEY_F18] = SDLK_F18; + k[Keyboard::KEY_F19] = SDLK_F19; + k[Keyboard::KEY_F20] = SDLK_F20; + k[Keyboard::KEY_F21] = SDLK_F21; + k[Keyboard::KEY_F22] = SDLK_F22; + k[Keyboard::KEY_F23] = SDLK_F23; + k[Keyboard::KEY_F24] = SDLK_F24; + k[Keyboard::KEY_EXECUTE] = SDLK_EXECUTE; + k[Keyboard::KEY_HELP] = SDLK_HELP; + k[Keyboard::KEY_MENU] = SDLK_MENU; + k[Keyboard::KEY_SELECT] = SDLK_SELECT; + k[Keyboard::KEY_STOP] = SDLK_STOP; + k[Keyboard::KEY_AGAIN] = SDLK_AGAIN; + k[Keyboard::KEY_UNDO] = SDLK_UNDO; + k[Keyboard::KEY_CUT] = SDLK_CUT; + k[Keyboard::KEY_COPY] = SDLK_COPY; + k[Keyboard::KEY_PASTE] = SDLK_PASTE; + k[Keyboard::KEY_FIND] = SDLK_FIND; + k[Keyboard::KEY_MUTE] = SDLK_MUTE; + k[Keyboard::KEY_VOLUMEUP] = SDLK_VOLUMEUP; + k[Keyboard::KEY_VOLUMEDOWN] = SDLK_VOLUMEDOWN; + + k[Keyboard::KEY_ALTERASE] = SDLK_ALTERASE; + k[Keyboard::KEY_SYSREQ] = SDLK_SYSREQ; + k[Keyboard::KEY_CANCEL] = SDLK_CANCEL; + k[Keyboard::KEY_CLEAR] = SDLK_CLEAR; + k[Keyboard::KEY_PRIOR] = SDLK_PRIOR; + k[Keyboard::KEY_RETURN2] = SDLK_RETURN2; + k[Keyboard::KEY_SEPARATOR] = SDLK_SEPARATOR; + k[Keyboard::KEY_OUT] = SDLK_OUT; + k[Keyboard::KEY_OPER] = SDLK_OPER; + k[Keyboard::KEY_CLEARAGAIN] = SDLK_CLEARAGAIN; + + k[Keyboard::KEY_THOUSANDSSEPARATOR] = SDLK_THOUSANDSSEPARATOR; + k[Keyboard::KEY_DECIMALSEPARATOR] = SDLK_DECIMALSEPARATOR; + k[Keyboard::KEY_CURRENCYUNIT] = SDLK_CURRENCYUNIT; + k[Keyboard::KEY_CURRENCYSUBUNIT] = SDLK_CURRENCYSUBUNIT; + + k[Keyboard::KEY_LCTRL] = SDLK_LCTRL; + k[Keyboard::KEY_LSHIFT] = SDLK_LSHIFT; + k[Keyboard::KEY_LALT] = SDLK_LALT; + k[Keyboard::KEY_LGUI] = SDLK_LGUI; + k[Keyboard::KEY_RCTRL] = SDLK_RCTRL; + k[Keyboard::KEY_RSHIFT] = SDLK_RSHIFT; + k[Keyboard::KEY_RALT] = SDLK_RALT; + k[Keyboard::KEY_RGUI] = SDLK_RGUI; + + k[Keyboard::KEY_MODE] = SDLK_MODE; + + k[Keyboard::KEY_AUDIONEXT] = SDLK_AUDIONEXT; + k[Keyboard::KEY_AUDIOPREV] = SDLK_AUDIOPREV; + k[Keyboard::KEY_AUDIOSTOP] = SDLK_AUDIOSTOP; + k[Keyboard::KEY_AUDIOPLAY] = SDLK_AUDIOPLAY; + k[Keyboard::KEY_AUDIOMUTE] = SDLK_AUDIOMUTE; + k[Keyboard::KEY_MEDIASELECT] = SDLK_MEDIASELECT; + + k[Keyboard::KEY_BRIGHTNESSDOWN] = SDLK_BRIGHTNESSDOWN; + k[Keyboard::KEY_BRIGHTNESSUP] = SDLK_BRIGHTNESSUP; + k[Keyboard::KEY_DISPLAYSWITCH] = SDLK_DISPLAYSWITCH; + k[Keyboard::KEY_KBDILLUMTOGGLE] = SDLK_KBDILLUMTOGGLE; + k[Keyboard::KEY_KBDILLUMDOWN] = SDLK_KBDILLUMDOWN; + k[Keyboard::KEY_KBDILLUMUP] = SDLK_KBDILLUMUP; + k[Keyboard::KEY_EJECT] = SDLK_EJECT; + k[Keyboard::KEY_SLEEP] = SDLK_SLEEP; + + return k; +} + +std::map Keyboard::keys = Keyboard::createKeyMap(); + +} // sdl +} // keyboard +} // love diff --git a/jni/love/src/modules/keyboard/sdl/Keyboard.h b/jni/love/src/modules/keyboard/sdl/Keyboard.h new file mode 100644 index 00000000..eb49e01b --- /dev/null +++ b/jni/love/src/modules/keyboard/sdl/Keyboard.h @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_KEYBOARD_SDL_KEYBOARD_H +#define LOVE_KEYBOARD_SDL_KEYBOARD_H + +// LOVE +#include "keyboard/Keyboard.h" +#include "common/EnumMap.h" + +// SDL +#include + +// STL +#include + +namespace love +{ +namespace keyboard +{ +namespace sdl +{ + +class Keyboard : public love::keyboard::Keyboard +{ +public: + + Keyboard(); + + // Implements Module. + const char *getName() const; + + void setKeyRepeat(bool enable); + bool hasKeyRepeat() const; + bool isDown(Key *keylist) const; + + void setTextInput(bool enable); + bool hasTextInput() const; + +private: + + bool key_repeat; + + static std::map createKeyMap(); + static std::map keys; + +}; // Keyboard + +} // sdl +} // keyboard +} // love + +#endif // LOVE_KEYBOARD_SDL_KEYBOARD_H diff --git a/jni/love/src/modules/keyboard/wrap_Keyboard.cpp b/jni/love/src/modules/keyboard/wrap_Keyboard.cpp new file mode 100644 index 00000000..32dddbe9 --- /dev/null +++ b/jni/love/src/modules/keyboard/wrap_Keyboard.cpp @@ -0,0 +1,108 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" + +#include "wrap_Keyboard.h" + +#include "sdl/Keyboard.h" + +namespace love +{ +namespace keyboard +{ + +static Keyboard *instance = 0; + +int w_setKeyRepeat(lua_State *L) +{ + instance->setKeyRepeat(luax_toboolean(L, 1)); + return 0; +} + +int w_hasKeyRepeat(lua_State *L) +{ + luax_pushboolean(L, instance->hasKeyRepeat()); + return 1; +} + +int w_isDown(lua_State *L) +{ + Keyboard::Key k; + unsigned int num = lua_gettop(L); + Keyboard::Key *keylist = new Keyboard::Key[num+1]; + unsigned int counter = 0; + + for (unsigned int i = 0; i < num; i++) + { + if (Keyboard::getConstant(luaL_checkstring(L, i+1), k)) + keylist[counter++] = k; + } + keylist[counter] = Keyboard::KEY_MAX_ENUM; + + luax_pushboolean(L, instance->isDown(keylist)); + delete[] keylist; + return 1; +} + +int w_setTextInput(lua_State *L) +{ + instance->setTextInput(luax_toboolean(L, 1)); + return 0; +} + +int w_hasTextInput(lua_State *L) +{ + luax_pushboolean(L, instance->hasTextInput()); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "setKeyRepeat", w_setKeyRepeat }, + { "hasKeyRepeat", w_hasKeyRepeat }, + { "setTextInput", w_setTextInput }, + { "hasTextInput", w_hasTextInput }, + { "isDown", w_isDown }, + { 0, 0 } +}; + +extern "C" int luaopen_love_keyboard(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new love::keyboard::sdl::Keyboard();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "keyboard"; + w.flags = MODULE_T; + w.functions = functions; + w.types = 0; + + return luax_register_module(L, w); +} + +} // keyboard +} // love diff --git a/jni/love/src/modules/keyboard/wrap_Keyboard.h b/jni/love/src/modules/keyboard/wrap_Keyboard.h new file mode 100644 index 00000000..f872a2dc --- /dev/null +++ b/jni/love/src/modules/keyboard/wrap_Keyboard.h @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_KEYBOARD_WRAP_KEYBOARD_H +#define LOVE_KEYBOARD_WRAP_KEYBOARD_H + +// LOVE +#include "Keyboard.h" + +namespace love +{ +namespace keyboard +{ + +int w_setKeyRepeat(lua_State *L); +int w_hasKeyRepeat(lua_State *L); +int w_isDown(lua_State *L); +int w_setTextInput(lua_State *L); +int w_hasTextInput(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_keyboard(lua_State *L); + +} // keyboard +} // love + +#endif // LOVE_KEYBOARD_WRAP_KEYBOARD_H diff --git a/jni/love/src/modules/love/love.cpp b/jni/love/src/modules/love/love.cpp new file mode 100644 index 00000000..5f106de9 --- /dev/null +++ b/jni/love/src/modules/love/love.cpp @@ -0,0 +1,214 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "common/config.h" +#include "common/version.h" +#include "common/runtime.h" + +#include "love.h" + +#ifdef LOVE_WINDOWS +#include +#endif // LOVE_WINDOWS + +#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK +#include +#include +#include +#include +#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK + +// Libraries. +#include "libraries/luasocket/luasocket.h" +#include "libraries/enet/lua-enet.h" + +// Scripts +#include "scripts/boot.lua.h" + +// All modules define a c-accessible luaopen +// so let's make use of those, instead +// of addressing implementations directly. +extern "C" +{ + extern int luaopen_love_audio(lua_State*); + extern int luaopen_love_event(lua_State*); + extern int luaopen_love_filesystem(lua_State*); + extern int luaopen_love_font(lua_State*); + extern int luaopen_love_graphics(lua_State*); + extern int luaopen_love_image(lua_State*); + extern int luaopen_love_joystick(lua_State*); + extern int luaopen_love_keyboard(lua_State*); + extern int luaopen_love_math(lua_State*); + extern int luaopen_love_mouse(lua_State*); + extern int luaopen_love_physics(lua_State*); + extern int luaopen_love_sound(lua_State*); + extern int luaopen_love_system(lua_State*); + extern int luaopen_love_timer(lua_State*); + extern int luaopen_love_thread(lua_State*); + extern int luaopen_love_window(lua_State*); + extern int luaopen_love_boot(lua_State*); +} + +static const luaL_Reg modules[] = { + { "love.audio", luaopen_love_audio }, + { "love.event", luaopen_love_event }, + { "love.filesystem", luaopen_love_filesystem }, + { "love.font", luaopen_love_font }, + { "love.graphics", luaopen_love_graphics }, + { "love.image", luaopen_love_image }, + { "love.joystick", luaopen_love_joystick }, + { "love.keyboard", luaopen_love_keyboard }, + { "love.math", luaopen_love_math }, + { "love.mouse", luaopen_love_mouse }, + { "love.physics", luaopen_love_physics }, + { "love.sound", luaopen_love_sound }, + { "love.system", luaopen_love_system }, + { "love.timer", luaopen_love_timer }, + { "love.thread", luaopen_love_thread }, + { "love.window", luaopen_love_window }, + { "love.boot", luaopen_love_boot }, + { 0, 0 } +}; + +#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK +int w__openConsole(lua_State *L); +#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK + +const char *love_version() +{ + return love::VERSION; +} + +const char *love_codename() +{ + return love::VERSION_CODENAME; +} + +int luaopen_love(lua_State * L) +{ + love::luax_insistglobal(L, "love"); + + // Set version information. + lua_pushstring(L, love::VERSION); + lua_setfield(L, -2, "_version"); + + lua_pushnumber(L, love::VERSION_MAJOR); + lua_setfield(L, -2, "_version_major"); + lua_pushnumber(L, love::VERSION_MINOR); + lua_setfield(L, -2, "_version_minor"); + lua_pushnumber(L, love::VERSION_REV); + lua_setfield(L, -2, "_version_revision"); + + lua_pushstring(L, love::VERSION_CODENAME); + lua_setfield(L, -2, "_version_codename"); + +#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK + lua_pushcfunction(L, w__openConsole); + lua_setfield(L, -2, "_openConsole"); +#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK + + lua_newtable(L); + + for (int i = 0; love::VERSION_COMPATIBILITY[i] != 0; ++i) + { + lua_pushstring(L, love::VERSION_COMPATIBILITY[i]); + lua_rawseti(L, -2, i+1); + } + + lua_setfield(L, -2, "_version_compat"); + +#ifdef LOVE_WINDOWS + lua_pushstring(L, "Windows"); +#elif defined(LOVE_MACOSX) + lua_pushstring(L, "OS X"); +#elif defined(LOVE_LINUX) + lua_pushstring(L, "Linux"); +#else + lua_pushstring(L, "Unknown"); +#endif + lua_setfield(L, -2, "_os"); + + // Preload module loaders. + for (int i = 0; modules[i].name != 0; i++) + { + love::luax_preload(L, modules[i].func, modules[i].name); + } + + love::luasocket::__open(L); + love::luax_preload(L, luaopen_enet, "enet"); + + return 1; +} + +#ifdef LOVE_LEGENDARY_CONSOLE_IO_HACK + +int w__openConsole(lua_State *L) +{ + static bool is_open = false; + if (is_open) + return 0; + is_open = true; + + if (GetConsoleWindow() != NULL || AllocConsole() == 0) + return 0; + + const int MAX_CONSOLE_LINES = 5000; + CONSOLE_SCREEN_BUFFER_INFO console_info; + + // Set size. + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &console_info); + console_info.dwSize.Y = MAX_CONSOLE_LINES; + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), console_info.dwSize); + + SetConsoleTitle(TEXT("LOVE Console")); + + FILE * fp; + + // Redirect stdout. + fp = freopen("CONOUT$", "w", stdout); + if (L && fp == NULL) + luaL_error(L, "Console redirection of stdout failed."); + + // Redirect stdin. + fp = freopen("CONIN$", "r", stdin); + if (L && fp == NULL) + luaL_error(L, "Console redirection of stdin failed."); + + // Redirect stderr. + fp = freopen("CONOUT$", "w", stderr); + if (L && fp == NULL) + luaL_error(L, "Console redirection of stderr failed."); + + return 0; +} + +#endif // LOVE_LEGENDARY_CONSOLE_IO_HACK + +int luaopen_love_boot(lua_State *L) +{ + if (luaL_loadbuffer(L, (const char *)love::boot_lua, sizeof(love::boot_lua), "boot.lua") == 0) + lua_call(L, 0, 1); + + return 1; +} + + + diff --git a/jni/love/src/modules/love/love.h b/jni/love/src/modules/love/love.h new file mode 100644 index 00000000..02bb53f5 --- /dev/null +++ b/jni/love/src/modules/love/love.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_LOVE_H +#define LOVE_LOVE_H + +// LOVE +#include "common/config.h" + +// Forward declare lua_State. +struct lua_State; + +#ifdef __cplusplus +extern "C" +{ +#endif + +LOVE_EXPORT const char *love_version(); +LOVE_EXPORT const char *love_codename(); +LOVE_EXPORT int luaopen_love(lua_State *L); +LOVE_EXPORT int luaopen_love_boot(lua_State *L); + +#ifdef __cplusplus +} +#endif + +#endif // LOVE_LOVE_H diff --git a/jni/love/src/modules/math/BezierCurve.cpp b/jni/love/src/modules/math/BezierCurve.cpp new file mode 100644 index 00000000..e6ac258c --- /dev/null +++ b/jni/love/src/modules/math/BezierCurve.cpp @@ -0,0 +1,188 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "BezierCurve.h" +#include "common/Exception.h" + +#include + +using namespace std; + +namespace +{ + +/** + * Subdivide Bezier polygon. + **/ +void subdivide(vector &points, int k) +{ + if (k <= 0) + return; + + // subdivision using de casteljau - subdivided control polygons are + // on the 'edges' of the computation scheme, e.g: + // + // ------LEFT-------> + // b00 b10 b20 b30 + // b01 b11 b21 .--- + // b02 b12 .---' + // b03 .---'RIGHT + // <--' + // + // the subdivided control polygon is: + // b00, b10, b20, b30, b21, b12, b03 + vector left, right; + left.reserve(points.size()); + right.reserve(points.size()); + + for (size_t step = 1; step < points.size(); ++step) + { + left.push_back(points[0]); + right.push_back(points[points.size() - step]); + for (size_t i = 0; i < points.size() - step; ++i) + points[i] = (points[i] + points[i+1]) * .5; + } + left.push_back(points[0]); + right.push_back(points[0]); + + // recurse + subdivide(left, k-1); + subdivide(right, k-1); + + // merge (right is in reversed order) + points.resize(left.size() + right.size() - 1); + for (size_t i = 0; i < left.size(); ++i) + points[i] = left[i]; + for (size_t i = 1; i < right.size(); ++i) + points[i-1 + left.size()] = right[right.size() - i - 1]; +} + +} + +namespace love +{ +namespace math +{ + +BezierCurve::BezierCurve(const vector &pts) + : controlPoints(pts) +{ +} + + +BezierCurve BezierCurve::getDerivative() const +{ + if (getDegree() < 1) + throw Exception("Cannot derive a curve of degree < 1."); + // actually we can, it just doesn't make any sense. + + vector forward_differences(controlPoints.size()-1); + float degree = float(getDegree()); + for (size_t i = 0; i < forward_differences.size(); ++i) + forward_differences[i] = (controlPoints[i+1] - controlPoints[i]) * degree; + + return BezierCurve(forward_differences); +} + +const Vector &BezierCurve::getControlPoint(int i) const +{ + if (i < 0) + i += controlPoints.size(); + + if (i < 0 || (size_t) i >= controlPoints.size()) + throw Exception("Invalid control point index"); + + return controlPoints[i]; +} + +void BezierCurve::setControlPoint(int i, const Vector &point) +{ + if (i < 0) + i += controlPoints.size(); + + if (i < 0 || (size_t) i >= controlPoints.size()) + throw Exception("Invalid control point index"); + + controlPoints[i] = point; +} + +void BezierCurve::insertControlPoint(const Vector &point, int pos) +{ + if (pos < 0) + pos += controlPoints.size() + 1; + + if (pos < 0 ||(size_t) pos > controlPoints.size()) + throw Exception("Invalid control point index"); + + controlPoints.insert(controlPoints.begin() + pos, point); +} + +void BezierCurve::translate(const Vector &t) +{ + for (size_t i = 0; i < controlPoints.size(); ++i) + controlPoints[i] += t; +} + +void BezierCurve::rotate(double phi, const Vector ¢er) +{ + float c = cos(phi), s = sin(phi); + for (size_t i = 0; i < controlPoints.size(); ++i) + { + Vector v = controlPoints[i] - center; + controlPoints[i].x = c * v.x - s * v.y + center.x; + controlPoints[i].y = s * v.x + c * v.y + center.y; + } +} + +void BezierCurve::scale(double s, const Vector ¢er) +{ + for (size_t i = 0; i < controlPoints.size(); ++i) + controlPoints[i] = (controlPoints[i] - center) * s + center; +} + +Vector BezierCurve::evaluate(double t) const +{ + if (t < 0 || t > 1) + throw Exception("Invalid evaluation parameter: must be between 0 and 1"); + if (controlPoints.size() < 2) + throw Exception("Invalid Bezier curve: Not enough control points."); + + // de casteljau + vector points(controlPoints); + for (size_t step = 1; step < controlPoints.size(); ++step) + for (size_t i = 0; i < controlPoints.size() - step; ++i) + points[i] = points[i] * (1-t) + points[i+1] * t; + + return points[0]; +} + +vector BezierCurve::render(size_t accuracy) const +{ + if (controlPoints.size() < 2) + throw Exception("Invalid Bezier curve: Not enough control points."); + vector vertices(controlPoints); + subdivide(vertices, accuracy); + return vertices; +} + + +} // namespace math +} // namespace love diff --git a/jni/love/src/modules/math/BezierCurve.h b/jni/love/src/modules/math/BezierCurve.h new file mode 100644 index 00000000..dbd28f43 --- /dev/null +++ b/jni/love/src/modules/math/BezierCurve.h @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MATH_BEZIER_CURVE_H +#define LOVE_MATH_BEZIER_CURVE_H + +// LOVE +#include "common/Object.h" +#include "common/Vector.h" +#include + +namespace love +{ +namespace math +{ + +class BezierCurve : public Object +{ +public: + + /** + * @param controlPoints Control polygon of the curve. + **/ + BezierCurve(const std::vector &controlPoints); + + /** + * @returns Degree of the curve + **/ + size_t getDegree() const + { + return controlPoints.size() - 1; + } + + /** + * @returns First derivative of the curve. + */ + BezierCurve getDerivative() const; + + /** + * @returns i'th control point. + **/ + const Vector &getControlPoint(int i) const; + + /** + * Sets the i'th control point. + * @param i Control point to change. + * @param point New control point. + **/ + void setControlPoint(int i, const Vector &point); + + /** + * Insert a new control point before the i'th control point. + * If i < 0, Lua string indexing rules apply. + * @param point Control point to insert. + * @param pos Position to insert. + **/ + void insertControlPoint(const Vector &point, int pos = -1); + + /** + * @returns Number of control points. + **/ + size_t getControlPointCount() const + { + return controlPoints.size(); + } + + /** + * Move the curve. + * @param t Translation vector. + */ + void translate(const Vector &t); + + /** + * Rotate the curve. + * @param phi Rotation angle (radians). + * @param center Rotation center. + */ + void rotate(double phi, const Vector ¢er); + + /** + * Scale the curve. + * @param phi Scale factor. + * @param center Scale center. + */ + void scale(double phi, const Vector ¢er); + + /** + * Evaluates the curve at time t. + * @param t Curve parameter, must satisfy 0 <= t <= 1. + **/ + Vector evaluate(double t) const; + + /** + * Renders the curve by subdivision. + * @param accuracy The 'fineness' of the curve. + * @returns A polygon chain that approximates the bezier curve. + **/ + std::vector render(size_t accuracy = 4) const; + +private: + std::vector controlPoints; +}; + +} +} + +#endif diff --git a/jni/love/src/modules/math/MathModule.cpp b/jni/love/src/modules/math/MathModule.cpp new file mode 100644 index 00000000..bbac3ef3 --- /dev/null +++ b/jni/love/src/modules/math/MathModule.cpp @@ -0,0 +1,197 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "MathModule.h" +#include "common/Vector.h" +#include "BezierCurve.h" + +// STL +#include +#include +#include + +using std::list; +using std::vector; +using love::Vertex; + +namespace +{ + // check if an angle is oriented counter clockwise + inline bool is_oriented_ccw(const Vertex &a, const Vertex &b, const Vertex &c) + { + // return det(b-a, c-a) >= 0 + return ((b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x)) >= 0; + } + + // check if a and b are on the same side of the line c->d + bool on_same_side(const Vertex &a, const Vertex &b, const Vertex &c, const Vertex &d) + { + float px = d.x - c.x, py = d.y - c.y; + // return det(p, a-c) * det(p, b-c) >= 0 + float l = px * (a.y - c.y) - py * (a.x - c.x); + float m = px * (b.y - c.y) - py * (b.x - c.x); + return l * m >= 0; + } + + // checks is p is contained in the triangle abc + inline bool point_in_triangle(const Vertex &p, const Vertex &a, const Vertex &b, const Vertex &c) + { + return on_same_side(p,a, b,c) && on_same_side(p,b, a,c) && on_same_side(p,c, a,b); + } + + // checks if any vertex in `vertices' is in the triangle abc. + bool any_point_in_triangle(const list &vertices, const Vertex &a, const Vertex &b, const Vertex &c) + { + list::const_iterator it, end = vertices.end(); + for (it = vertices.begin(); it != end; ++it) + { + const Vertex *p = *it; + if ((p != &a) && (p != &b) && (p != &c) && point_in_triangle(*p, a,b,c)) // oh god... + return true; + } + + return false; + } + + inline bool is_ear(const Vertex &a, const Vertex &b, const Vertex &c, const list &vertices) + { + return is_oriented_ccw(a,b,c) && !any_point_in_triangle(vertices, a,b,c); + } +} + +namespace love +{ +namespace math +{ + +Math Math::instance; + +Math::Math() + : rng() +{ + // prevent the runtime from free()-ing this + retain(); +} + +RandomGenerator *Math::newRandomGenerator() +{ + return new RandomGenerator(); +} + +BezierCurve *Math::newBezierCurve(const vector &points) +{ + return new BezierCurve(points); +} + +vector Math::triangulate(const vector &polygon) +{ + if (polygon.size() < 3) + throw love::Exception("Not a polygon"); + else if (polygon.size() == 3) + return vector(1, Triangle(polygon[0], polygon[1], polygon[2])); + + // collect list of connections and record leftmost item to check if the polygon + // has the expected winding + vector next_idx(polygon.size()), prev_idx(polygon.size()); + size_t idx_lm = 0; + for (size_t i = 0; i < polygon.size(); ++i) + { + const Vertex &lm = polygon[idx_lm], &p = polygon[i]; + if (p.x < lm.x || (p.x == lm.x && p.y < lm.y)) + idx_lm = i; + next_idx[i] = i+1; + prev_idx[i] = i-1; + } + next_idx[next_idx.size()-1] = 0; + prev_idx[0] = prev_idx.size()-1; + + // check if the polygon has the expected winding and reverse polygon if needed + if (!is_oriented_ccw(polygon[prev_idx[idx_lm]], polygon[idx_lm], polygon[next_idx[idx_lm]])) + next_idx.swap(prev_idx); + + // collect list of concave polygons + list concave_vertices; + for (size_t i = 0; i < polygon.size(); ++i) + { + if (!is_oriented_ccw(polygon[prev_idx[i]], polygon[i], polygon[next_idx[i]])) + concave_vertices.push_back(&polygon[i]); + } + + // triangulation according to kong + vector triangles; + size_t n_vertices = polygon.size(); + size_t current = 1, skipped = 0, next, prev; + while (n_vertices > 3) + { + next = next_idx[current]; + prev = prev_idx[current]; + const Vertex &a = polygon[prev], &b = polygon[current], &c = polygon[next]; + if (is_ear(a,b,c, concave_vertices)) + { + triangles.push_back(Triangle(a,b,c)); + next_idx[prev] = next; + prev_idx[next] = prev; + concave_vertices.remove(&b); + --n_vertices; + skipped = 0; + } + else if (++skipped > n_vertices) + { + throw love::Exception("Cannot triangulate polygon."); + } + current = next; + } + next = next_idx[current]; + prev = prev_idx[current]; + triangles.push_back(Triangle(polygon[prev], polygon[current], polygon[next])); + + return triangles; +} + +bool Math::isConvex(const std::vector &polygon) +{ + if (polygon.size() < 3) + return false; + + // a polygon is convex if all corners turn in the same direction + // turning direction can be determined using the cross-product of + // the forward difference vectors + size_t i = polygon.size() - 2, j = polygon.size() - 1, k = 0; + Vector p(polygon[j].x - polygon[i].x, polygon[j].y - polygon[i].y); + Vector q(polygon[k].x - polygon[j].x, polygon[k].y - polygon[j].y); + float winding = p ^ q; + + while (k+1 < polygon.size()) + { + i = j; j = k; k++; + p.x = polygon[j].x - polygon[i].x; + p.y = polygon[j].y - polygon[i].y; + q.x = polygon[k].x - polygon[j].x; + q.y = polygon[k].y - polygon[j].y; + + if ((p^q) * winding < 0) + return false; + } + return true; +} + +} // math +} // love diff --git a/jni/love/src/modules/math/MathModule.h b/jni/love/src/modules/math/MathModule.h new file mode 100644 index 00000000..fe169a38 --- /dev/null +++ b/jni/love/src/modules/math/MathModule.h @@ -0,0 +1,180 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MATH_MODMATH_H +#define LOVE_MATH_MODMATH_H + +#include "RandomGenerator.h" + +// LOVE +#include "common/Module.h" +#include "common/math.h" +#include "common/Vector.h" +#include "common/int.h" + +// Noise +#include "libraries/noise1234/simplexnoise1234.h" + +// STL +#include + +namespace love +{ +namespace math +{ + +class BezierCurve; + +class Math : public Module +{ +private: + + RandomGenerator rng; + +public: + + virtual ~Math() + {} + + inline void setRandomSeed(RandomGenerator::Seed seed) + { + rng.setSeed(seed); + } + + inline void setRandomSeed(uint32 low, uint32 high) + { + rng.setSeed(low, high); + } + + inline RandomGenerator::Seed getRandomSeed() const + { + return rng.getSeed(); + } + + inline void getRandomSeed(uint32 &low, uint32 &high) const + { + rng.getSeed(low, high); + } + + /** + * @copydoc RandomGenerator::random() + **/ + inline double random() + { + return rng.random(); + } + + /** + * @copydoc RandomGenerator::random(double) + **/ + inline double random(double max) + { + return rng.random(max); + } + + /** + * @copydoc RandomGenerator::random(double,double) + **/ + inline double random(double min, double max) + { + return rng.random(min, max); + } + + /** + * @copydoc RandomGenerator::randomNormal() + **/ + inline double randomNormal(double stddev) + { + return rng.randomNormal(stddev); + } + + /** + * Create a new random number generator. + **/ + RandomGenerator *newRandomGenerator(); + + /** + * Creates a new bezier curve. + **/ + BezierCurve *newBezierCurve(const std::vector &points); + + virtual const char *getName() const + { + return "love.math"; + } + + /** + * Triangulate a simple polygon. + * + * @param polygon Polygon to triangulate. Must not intersect itself. + * @return List of triangles the polygon is composed of. + **/ + std::vector triangulate(const std::vector &polygon); + + /** + * Checks whether a polygon is convex. + * + * @param polygon Polygon to test. + * @return True if the polygon is convex, false otherwise. + **/ + bool isConvex(const std::vector &polygon); + + /** + * Calculate Simplex noise for the specified coordinate(s). + * + * @return Noise value in the range of [0, 1]. + **/ + float noise(float x) const; + float noise(float x, float y) const; + float noise(float x, float y, float z) const; + float noise(float x, float y, float z, float w) const; + + static Math instance; + +private: + + Math(); + +}; // Math + +inline float Math::noise(float x) const +{ + return SimplexNoise1234::noise(x) * 0.5f + 0.5f; +} + +inline float Math::noise(float x, float y) const +{ + return SimplexNoise1234::noise(x, y) * 0.5f + 0.5f; +} + +inline float Math::noise(float x, float y, float z) const +{ + return SimplexNoise1234::noise(x, y, z) * 0.5f + 0.5f; +} + +inline float Math::noise(float x, float y, float z, float w) const +{ + return SimplexNoise1234::noise(x, y, z, w) * 0.5f + 0.5f; +} + +} // math +} // love + +#endif diff --git a/jni/love/src/modules/math/RandomGenerator.cpp b/jni/love/src/modules/math/RandomGenerator.cpp new file mode 100644 index 00000000..500bb74c --- /dev/null +++ b/jni/love/src/modules/math/RandomGenerator.cpp @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "RandomGenerator.h" + +// STL +#include + +namespace love +{ +namespace math +{ + +// 64 bit Xorshift implementation taken from the end of Sec. 3 (page 4) in +// George Marsaglia, "Xorshift RNGs", Journal of Statistical Software, Vol.8 (Issue 14), 2003 + +RandomGenerator::RandomGenerator() + : last_randomnormal(std::numeric_limits::infinity()) +{ + // because it is too big for some compilers to handle ... if you know what + // i mean +#ifdef LOVE_BIG_ENDIAN + seed.b32.a = 0x0139408D; + seed.b32.b = 0xCBBF7A44; +#else + seed.b32.b = 0x0139408D; + seed.b32.a = 0xCBBF7A44; +#endif + + rng_state = seed; +} + +void RandomGenerator::setSeed(RandomGenerator::Seed newseed) +{ + // 0 xor 0 is still 0, so Xorshift can't generate new numbers. + if (newseed.b64 == 0) + throw love::Exception("Invalid random seed."); + + seed = newseed; + rng_state = seed; +} + +uint64 RandomGenerator::rand() +{ + rng_state.b64 ^= (rng_state.b64 << 13); + rng_state.b64 ^= (rng_state.b64 >> 7); + rng_state.b64 ^= (rng_state.b64 << 17); + return rng_state.b64; +} + +// Box–Muller transform +double RandomGenerator::randomNormal(double stddev) +{ + // use cached number if possible + if (last_randomnormal != std::numeric_limits::infinity()) + { + double r = last_randomnormal; + last_randomnormal = std::numeric_limits::infinity(); + return r * stddev; + } + + double r = sqrt(-2.0 * log(1. - random())); + double phi = 2.0 * LOVE_M_PI * (1. - random()); + + last_randomnormal = r * cos(phi); + return r * sin(phi) * stddev; +} + +} // math +} // love diff --git a/jni/love/src/modules/math/RandomGenerator.h b/jni/love/src/modules/math/RandomGenerator.h new file mode 100644 index 00000000..99283bc8 --- /dev/null +++ b/jni/love/src/modules/math/RandomGenerator.h @@ -0,0 +1,152 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MATH_RANDOM_GENERATOR_H +#define LOVE_MATH_RANDOM_GENERATOR_H + +// LOVE +#include "common/config.h" +#include "common/Exception.h" +#include "common/math.h" +#include "common/int.h" +#include "common/Object.h" + +// STL +#include + +namespace love +{ +namespace math +{ + +class RandomGenerator : public Object +{ +public: + + union Seed + { + uint64 b64; + struct + { + uint32 a; + uint32 b; + } b32; + }; + + RandomGenerator(); + virtual ~RandomGenerator() {} + + /** + * Set pseudo-random seed. + * It's up to the implementation how to use this. + **/ + void setSeed(Seed seed); + + /** + * Separately set the low and high bits of the pseudo-random seed. + **/ + inline void setSeed(uint32 low, uint32 high) + { + Seed newseed; + +#ifdef LOVE_BIG_ENDIAN + newseed.b32.a = high; + newseed.b32.b = low; +#else + newseed.b32.b = high; + newseed.b32.a = low; +#endif + + setSeed(newseed); + } + + inline Seed getSeed() const + { + return seed; + } + + inline void getSeed(uint32 &low, uint32 &high) const + { +#ifdef LOVE_BIG_ENDIAN + high = seed.b32.a; + low = seed.b32.b; +#else + high = seed.b32.b; + low = seed.b32.a; +#endif + } + + /** + * Return uniformly distributed pseudo random integer. + * + * @return Pseudo random integer in [0,2^64). + **/ + uint64 rand(); + + /** + * Get uniformly distributed pseudo random number in [0,1). + * + * @return Pseudo random number in [0,1). + **/ + inline double random() + { + return double(rand()) / (double(std::numeric_limits::max()) + 1.0); + } + + /** + * Get uniformly distributed pseudo random number in [0,max). + * + * @return Pseudo random number in [0,max). + **/ + inline double random(double max) + { + return random() * max; + } + + /** + * Get uniformly distributed pseudo random number in [min, max). + * + * @return Pseudo random number in [min, max). + **/ + inline double random(double min, double max) + { + return random() * (max - min) + min; + } + + /** + * Get normally distributed pseudo random number. + * + * @param stddev Standard deviation of the distribution. + * @return Normally distributed random number with mean 0 and variance (stddev)². + **/ + double randomNormal(double stddev); + +private: + + Seed seed; + Seed rng_state; + double last_randomnormal; + +}; // RandomGenerator + +} // math +} // love + +#endif // LOVE_MATH_RANDOM_GENERATOR_H diff --git a/jni/love/src/modules/math/wrap_BezierCurve.cpp b/jni/love/src/modules/math/wrap_BezierCurve.cpp new file mode 100644 index 00000000..374a4324 --- /dev/null +++ b/jni/love/src/modules/math/wrap_BezierCurve.cpp @@ -0,0 +1,189 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/Exception.h" +#include "wrap_BezierCurve.h" + +#include + +namespace love +{ +namespace math +{ + +BezierCurve *luax_checkbeziercurve(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "BezierCurve", MATH_BEZIER_CURVE_T); +} + +int w_BezierCurve_getDegree(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + lua_pushnumber(L, curve->getDegree()); + return 1; +} + +int w_BezierCurve_getDerivative(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + BezierCurve *deriv = new BezierCurve(curve->getDerivative()); + luax_pushtype(L, "BezierCurve", MATH_BEZIER_CURVE_T, deriv); + return 1; +} + +int w_BezierCurve_getControlPoint(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + int idx = luaL_checkinteger(L, 2); + + if (idx > 0) // 1-indexing + idx--; + + EXCEPT_GUARD( + Vector v = curve->getControlPoint(idx); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + ) + + return 2; +} + +int w_BezierCurve_setControlPoint(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + int idx = luaL_checkinteger(L, 2); + float vx = (float) luaL_checknumber(L, 3); + float vy = (float) luaL_checknumber(L, 4); + + if (idx > 0) // 1-indexing + idx--; + + EXCEPT_GUARD(curve->setControlPoint(idx, Vector(vx,vy));) + return 0; +} + +int w_BezierCurve_insertControlPoint(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + float vx = (float) luaL_checknumber(L, 2); + float vy = (float) luaL_checknumber(L, 3); + int idx = luaL_optinteger(L, 4, -1); + + if (idx > 0) // 1-indexing + idx--; + + EXCEPT_GUARD(curve->insertControlPoint(Vector(vx,vy), idx);) + return 0; +} + +int w_BezierCurve_getControlPointCount(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + lua_pushinteger(L, curve->getControlPointCount()); + return 1; +} + +int w_BezierCurve_translate(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + float dx = (float) luaL_checknumber(L, 2); + float dy = (float) luaL_checknumber(L, 3); + curve->translate(Vector(dx,dy)); + return 0; +} + +int w_BezierCurve_rotate(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + double phi = luaL_checknumber(L, 2); + float ox = (float) luaL_optnumber(L, 3, 0); + float oy = (float) luaL_optnumber(L, 4, 0); + curve->rotate(phi, Vector(ox,oy)); + return 0; +} + +int w_BezierCurve_scale(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + double s = luaL_checknumber(L, 2); + float ox = (float) luaL_optnumber(L, 3, 0); + float oy = (float) luaL_optnumber(L, 4, 0); + curve->scale(s, Vector(ox,oy)); + return 0; +} + +int w_BezierCurve_evaluate(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + double t = luaL_checknumber(L, 2); + + EXCEPT_GUARD( + Vector v = curve->evaluate(t); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + ) + + return 2; + +} + +int w_BezierCurve_render(lua_State *L) +{ + BezierCurve *curve = luax_checkbeziercurve(L, 1); + int accuracy = luaL_optinteger(L, 2, 5); + + std::vector points; + EXCEPT_GUARD(points = curve->render(accuracy);) + + lua_createtable(L, points.size()*2, 0); + for (size_t i = 0; i < points.size(); ++i) + { + lua_pushnumber(L, points[i].x); + lua_rawseti(L, -2, 2*i+1); + lua_pushnumber(L, points[i].y); + lua_rawseti(L, -2, 2*i+2); + } + + return 1; +} + +static const luaL_Reg functions[] = +{ + {"getDegree", w_BezierCurve_getDegree}, + {"getDerivative", w_BezierCurve_getDerivative}, + {"getControlPoint", w_BezierCurve_getControlPoint}, + {"setControlPoint", w_BezierCurve_setControlPoint}, + {"insertControlPoint", w_BezierCurve_insertControlPoint}, + {"getControlPointCount", w_BezierCurve_getControlPointCount}, + {"translate", w_BezierCurve_translate}, + {"rotate", w_BezierCurve_rotate}, + {"scale", w_BezierCurve_scale}, + {"evaluate", w_BezierCurve_evaluate}, + {"render", w_BezierCurve_render}, + { 0, 0 } +}; + +extern "C" int luaopen_beziercurve(lua_State *L) +{ + return luax_register_type(L, "BezierCurve", functions); +} + +} // math +} // love diff --git a/jni/love/src/modules/math/wrap_BezierCurve.h b/jni/love/src/modules/math/wrap_BezierCurve.h new file mode 100644 index 00000000..a8b9ceb5 --- /dev/null +++ b/jni/love/src/modules/math/wrap_BezierCurve.h @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MATH_WRAP_BEZIER_CURVE_H +#define LOVE_MATH_WRAP_BEZIER_CURVE_H + +// LOVE +#include "BezierCurve.h" +#include "common/runtime.h" + +namespace love +{ +namespace math +{ + +BezierCurve *luax_checkbeziercurve(lua_State *L, int idx); +int w_BezierCurve_getDegree(lua_State *L); +int w_BezierCurve_getDerivative(lua_State *L); +int w_BezierCurve_getControlPoint(lua_State *L); +int w_BezierCurve_setControlPoint(lua_State *L); +int w_BezierCurve_insertControlPoint(lua_State *L); +int w_BezierCurve_getControlPointCount(lua_State *L); +int w_BezierCurve_translate(lua_State *L); +int w_BezierCurve_rotate(lua_State *L); +int w_BezierCurve_scale(lua_State *L); +int w_BezierCurve_evaluate(lua_State *L); +int w_BezierCurve_render(lua_State *L); +extern "C" int luaopen_beziercurve(lua_State *L); + +} // math +} // love + +#endif // LOVE_MATH_WRAP_RANDOM_GENERATOR_H diff --git a/jni/love/src/modules/math/wrap_Math.cpp b/jni/love/src/modules/math/wrap_Math.cpp new file mode 100644 index 00000000..d96d69f9 --- /dev/null +++ b/jni/love/src/modules/math/wrap_Math.cpp @@ -0,0 +1,316 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Math.h" +#include "wrap_RandomGenerator.h" +#include "wrap_BezierCurve.h" +#include "MathModule.h" +#include "BezierCurve.h" + +#include +#include + +namespace love +{ +namespace math +{ + +int w_setRandomSeed(lua_State *L) +{ + EXCEPT_GUARD(Math::instance.setRandomSeed(luax_checkrandomseed(L, 1));) + return 0; +} + +int w_getRandomSeed(lua_State *L) +{ + uint32 low = 0, high = 0; + Math::instance.getRandomSeed(low, high); + lua_pushnumber(L, (lua_Number) low); + lua_pushnumber(L, (lua_Number) high); + return 2; +} + +int w_random(lua_State *L) +{ + return luax_getrandom(L, 1, Math::instance.random()); +} + +int w_randomNormal(lua_State *L) +{ + double stddev = luaL_optnumber(L, 1, 1.0); + double mean = luaL_optnumber(L, 2, 0.0); + double r = Math::instance.randomNormal(stddev); + + lua_pushnumber(L, r + mean); + return 1; +} + +int w_newRandomGenerator(lua_State *L) +{ + RandomGenerator::Seed s; + if (lua_gettop(L) > 0) + s = luax_checkrandomseed(L, 1); + + RandomGenerator *t = Math::instance.newRandomGenerator(); + + if (lua_gettop(L) > 0) + { + bool should_error = false; + + try + { + t->setSeed(s); + } + catch (love::Exception &e) + { + t->release(); + should_error = true; + lua_pushstring(L, e.what()); + } + + if (should_error) + return luaL_error(L, "%s", lua_tostring(L, -1)); + } + + luax_pushtype(L, "RandomGenerator", MATH_RANDOM_GENERATOR_T, t); + return 1; +} + +int w_newBezierCurve(lua_State *L) +{ + std::vector points; + if (lua_istable(L, 1)) + { + size_t top = lua_objlen(L, 1); + points.reserve(top / 2); + for (size_t i = 1; i <= top; i += 2) + { + lua_rawgeti(L, 1, i); + lua_rawgeti(L, 1, i+1); + + Vector v; + v.x = (float) luaL_checknumber(L, -2); + v.y = (float) luaL_checknumber(L, -1); + points.push_back(v); + + lua_pop(L, 2); + } + } + else + { + size_t top = lua_gettop(L); + points.reserve(top / 2); + for (size_t i = 1; i <= top; i += 2) + { + Vector v; + v.x = (float) luaL_checknumber(L, i); + v.y = (float) luaL_checknumber(L, i+1); + points.push_back(v); + } + } + + BezierCurve *curve = Math::instance.newBezierCurve(points); + luax_pushtype(L, "BezierCurve", MATH_BEZIER_CURVE_T, curve); + return 1; +} + +int w_triangulate(lua_State *L) +{ + std::vector vertices; + if (lua_istable(L, 1)) + { + size_t top = lua_objlen(L, 1); + vertices.reserve(top / 2); + for (size_t i = 1; i <= top; i += 2) + { + lua_rawgeti(L, 1, i); + lua_rawgeti(L, 1, i+1); + + Vertex v; + v.x = (float) luaL_checknumber(L, -2); + v.y = (float) luaL_checknumber(L, -1); + vertices.push_back(v); + + lua_pop(L, 2); + } + } + else + { + size_t top = lua_gettop(L); + vertices.reserve(top / 2); + for (size_t i = 1; i <= top; i += 2) + { + Vertex v; + v.x = (float) luaL_checknumber(L, i); + v.y = (float) luaL_checknumber(L, i+1); + vertices.push_back(v); + } + } + + if (vertices.size() < 3) + return luaL_error(L, "Need at least 3 vertices to triangulate"); + + std::vector triangles; + + EXCEPT_GUARD( + if (vertices.size() == 3) + triangles.push_back(Triangle(vertices[0], vertices[1], vertices[2])); + else + triangles = Math::instance.triangulate(vertices); + ) + + lua_createtable(L, triangles.size(), 0); + for (size_t i = 0; i < triangles.size(); ++i) + { + const Triangle &tri = triangles[i]; + + lua_createtable(L, 6, 0); + lua_pushnumber(L, tri.a.x); + lua_rawseti(L, -2, 1); + lua_pushnumber(L, tri.a.y); + lua_rawseti(L, -2, 2); + lua_pushnumber(L, tri.b.x); + lua_rawseti(L, -2, 3); + lua_pushnumber(L, tri.b.y); + lua_rawseti(L, -2, 4); + lua_pushnumber(L, tri.c.x); + lua_rawseti(L, -2, 5); + lua_pushnumber(L, tri.c.y); + lua_rawseti(L, -2, 6); + + lua_rawseti(L, -2, i+1); + } + + return 1; +} + +int w_isConvex(lua_State *L) +{ + std::vector vertices; + if (lua_istable(L, 1)) + { + size_t top = lua_objlen(L, 1); + vertices.reserve(top / 2); + for (size_t i = 1; i <= top; i += 2) + { + lua_rawgeti(L, 1, i); + lua_rawgeti(L, 1, i+1); + + Vertex v; + v.x = (float) luaL_checknumber(L, -2); + v.y = (float) luaL_checknumber(L, -1); + vertices.push_back(v); + + lua_pop(L, 2); + } + } + else + { + size_t top = lua_gettop(L); + vertices.reserve(top / 2); + for (size_t i = 1; i <= top; i += 2) + { + Vertex v; + v.x = (float) luaL_checknumber(L, i); + v.y = (float) luaL_checknumber(L, i+1); + vertices.push_back(v); + } + } + + lua_pushboolean(L, Math::instance.isConvex(vertices)); + return 1; +} + +int w_noise(lua_State *L) +{ + float w, x, y, z; + float val; + + switch (lua_gettop(L)) + { + case 1: + x = (float) luaL_checknumber(L, 1); + val = Math::instance.noise(x); + break; + case 2: + x = (float) luaL_checknumber(L, 1); + y = (float) luaL_checknumber(L, 2); + val = Math::instance.noise(x, y); + break; + case 3: + x = (float) luaL_checknumber(L, 1); + y = (float) luaL_checknumber(L, 2); + z = (float) luaL_checknumber(L, 3); + val = Math::instance.noise(x, y, z); + break; + case 4: + default: + x = (float) luaL_checknumber(L, 1); + y = (float) luaL_checknumber(L, 2); + z = (float) luaL_checknumber(L, 3); + w = (float) luaL_checknumber(L, 4); + val = Math::instance.noise(x, y, z, w); + break; + } + + lua_pushnumber(L, (lua_Number) val); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "setRandomSeed", w_setRandomSeed }, + { "getRandomSeed", w_getRandomSeed }, + { "random", w_random }, + { "randomNormal", w_randomNormal }, + { "newRandomGenerator", w_newRandomGenerator }, + { "newBezierCurve", w_newBezierCurve }, + { "triangulate", w_triangulate }, + { "isConvex", w_isConvex }, + { "noise", w_noise }, + { 0, 0 } +}; + +static const lua_CFunction types[] = +{ + luaopen_randomgenerator, + luaopen_beziercurve, + 0 +}; + +extern "C" int luaopen_love_math(lua_State *L) +{ + Math::instance.retain(); + + WrappedModule w; + w.module = &Math::instance; + w.name = "math"; + w.flags = MODULE_T; + w.functions = functions; + w.types = types; + + int n = luax_register_module(L, w); + + return n; +} + +} // math +} // love diff --git a/jni/love/src/modules/math/wrap_Math.h b/jni/love/src/modules/math/wrap_Math.h new file mode 100644 index 00000000..0c52d972 --- /dev/null +++ b/jni/love/src/modules/math/wrap_Math.h @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MATH_WRAP_MATH_H +#define LOVE_MATH_WRAP_MATH_H + +// LOVE +#include "common/config.h" +#include "common/runtime.h" + +namespace love +{ +namespace math +{ + +int w_setRandomSeed(lua_State *L); +int w_getRandomSeed(lua_State *L); +int w_random(lua_State *L); +int w_randomNormal(lua_State *L); +int w_newRandomGenerator(lua_State *L); +int w_newBezierCurve(lua_State *L); +int w_triangulate(lua_State *L); +int w_isConvex(lua_State *L); +int w_noise(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_math(lua_State *L); + +} // random +} // love + +#endif // LOVE_MATH_WRAP_MATH_H + diff --git a/jni/love/src/modules/math/wrap_RandomGenerator.cpp b/jni/love/src/modules/math/wrap_RandomGenerator.cpp new file mode 100644 index 00000000..0140c5b1 --- /dev/null +++ b/jni/love/src/modules/math/wrap_RandomGenerator.cpp @@ -0,0 +1,150 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_RandomGenerator.h" + +#include +#include + +namespace love +{ +namespace math +{ + +template +static T checkrandomseed_part(lua_State *L, int idx) +{ + double num = luaL_checknumber(L, idx); + double inf = std::numeric_limits::infinity(); + + // Disallow conversions from infinity and NaN. + if (num == inf || num == -inf || num != num) + luaL_argerror(L, idx, "invalid random seed"); + + return (T) num; +} + +RandomGenerator::Seed luax_checkrandomseed(lua_State *L, int idx) +{ + RandomGenerator::Seed s; + + if (!lua_isnoneornil(L, idx + 1)) + { + uint32 low = checkrandomseed_part(L, idx); + uint32 high = checkrandomseed_part(L, idx + 1); + +#ifdef LOVE_BIG_ENDIAN + s.b32.a = high; + s.b32.b = low; +#else + s.b32.b = high; + s.b32.a = low; +#endif + } + else + s.b64 = checkrandomseed_part(L, idx); + + return s; +} + +int luax_getrandom(lua_State *L, int startidx, double r) +{ + int l, u; + // from lua 5.1.4 source code: lmathlib.c:185 ff. + switch (lua_gettop(L) - (startidx - 1)) + { + case 0: + lua_pushnumber(L, r); + break; + case 1: + u = luaL_checkint(L, startidx); + luaL_argcheck(L, 1 <= u, startidx, "interval is empty"); + lua_pushnumber(L, floor(r * u) + 1); + break; + case 2: + l = luaL_checkint(L, startidx); + u = luaL_checkint(L, startidx + 1); + luaL_argcheck(L, l <= u, startidx + 1, "interval is empty"); + lua_pushnumber(L, floor(r * (u - l + 1)) + l); + break; + default: + return luaL_error(L, "wrong number of arguments"); + } + return 1; +} + +RandomGenerator *luax_checkrandomgenerator(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "RandomGenerator", MATH_RANDOM_GENERATOR_T); +} + +int w_RandomGenerator_setSeed(lua_State *L) +{ + RandomGenerator *rng = luax_checkrandomgenerator(L, 1); + EXCEPT_GUARD(rng->setSeed(luax_checkrandomseed(L, 2));) + return 0; +} + +int w_RandomGenerator_getSeed(lua_State *L) +{ + RandomGenerator *rng = luax_checkrandomgenerator(L, 1); + + uint32 low = 0, high = 0; + rng->getSeed(low, high); + + lua_pushnumber(L, (lua_Number) low); + lua_pushnumber(L, (lua_Number) high); + return 2; +} + +int w_RandomGenerator_random(lua_State *L) +{ + RandomGenerator *rng = luax_checkrandomgenerator(L, 1); + return luax_getrandom(L, 2, rng->random()); +} + +int w_RandomGenerator_randomNormal(lua_State *L) +{ + RandomGenerator *rng = luax_checkrandomgenerator(L, 1); + + double stddev = luaL_optnumber(L, 2, 1.0); + double mean = luaL_optnumber(L, 3, 0.0); + double r = rng->randomNormal(stddev); + + lua_pushnumber(L, r + mean); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "setSeed", w_RandomGenerator_setSeed }, + { "getSeed", w_RandomGenerator_getSeed }, + { "random", w_RandomGenerator_random }, + { "randomNormal", w_RandomGenerator_randomNormal }, + { 0, 0 } +}; + +extern "C" int luaopen_randomgenerator(lua_State *L) +{ + return luax_register_type(L, "RandomGenerator", functions); +} + +} // math +} // love diff --git a/jni/love/src/modules/math/wrap_RandomGenerator.h b/jni/love/src/modules/math/wrap_RandomGenerator.h new file mode 100644 index 00000000..e325a47e --- /dev/null +++ b/jni/love/src/modules/math/wrap_RandomGenerator.h @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MATH_WRAP_RANDOM_GENERATOR_H +#define LOVE_MATH_WRAP_RANDOM_GENERATOR_H + +// LOVE +#include "RandomGenerator.h" +#include "common/config.h" +#include "common/runtime.h" + +namespace love +{ +namespace math +{ + +// Helper functions. +RandomGenerator::Seed luax_checkrandomseed(lua_State *L, int idx); +int luax_getrandom(lua_State *L, int startidx, double r); + +RandomGenerator *luax_checkrandomgenerator(lua_State *L, int idx); +int w_RandomGenerator_setSeed(lua_State *L); +int w_RandomGenerator_getSeed(lua_State *L); +int w_RandomGenerator_random(lua_State *L); +int w_RandomGenerator_randomNormal(lua_State *L); +extern "C" int luaopen_randomgenerator(lua_State *L); + +} // math +} // love + +#endif // LOVE_MATH_WRAP_RANDOM_GENERATOR_H diff --git a/jni/love/src/modules/mouse/Cursor.cpp b/jni/love/src/modules/mouse/Cursor.cpp new file mode 100644 index 00000000..8b7632ed --- /dev/null +++ b/jni/love/src/modules/mouse/Cursor.cpp @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Cursor.h" + +namespace love +{ +namespace mouse +{ + +Cursor::~Cursor() +{ +} + +bool Cursor::getConstant(const char *in, SystemCursor &out) +{ + return systemCursors.find(in, out); +} + +bool Cursor::getConstant(SystemCursor in, const char *&out) +{ + return systemCursors.find(in, out); +} + +bool Cursor::getConstant(const char *in, CursorType &out) +{ + return types.find(in, out); +} + +bool Cursor::getConstant(CursorType in, const char *&out) +{ + return types.find(in, out); +} + +StringMap::Entry Cursor::systemCursorEntries[] = +{ + {"arrow", Cursor::CURSOR_ARROW}, + {"ibeam", Cursor::CURSOR_IBEAM}, + {"wait", Cursor::CURSOR_WAIT}, + {"crosshair", Cursor::CURSOR_CROSSHAIR}, + {"waitarrow", Cursor::CURSOR_WAITARROW}, + {"sizenwse", Cursor::CURSOR_SIZENWSE}, + {"sizenesw", Cursor::CURSOR_SIZENESW}, + {"sizewe", Cursor::CURSOR_SIZEWE}, + {"sizens", Cursor::CURSOR_SIZENS}, + {"sizeall", Cursor::CURSOR_SIZEALL}, + {"no", Cursor::CURSOR_NO}, + {"hand", Cursor::CURSOR_HAND}, +}; + +StringMap Cursor::systemCursors(Cursor::systemCursorEntries, sizeof(Cursor::systemCursorEntries)); + +StringMap::Entry Cursor::typeEntries[] = +{ + {"system", Cursor::CURSORTYPE_SYSTEM}, + {"image", Cursor::CURSORTYPE_IMAGE}, +}; + +StringMap Cursor::types(Cursor::typeEntries, sizeof(Cursor::typeEntries)); + +} // mouse +} // love diff --git a/jni/love/src/modules/mouse/Cursor.h b/jni/love/src/modules/mouse/Cursor.h new file mode 100644 index 00000000..9bbdcdfc --- /dev/null +++ b/jni/love/src/modules/mouse/Cursor.h @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MOUSE_CURSOR_H +#define LOVE_MOUSE_CURSOR_H + +// LOVE +#include "image/ImageData.h" +#include "common/Object.h" +#include "common/StringMap.h" + +namespace love +{ +namespace mouse +{ + +class Cursor : public Object +{ +public: + + // Types of system cursors. + enum SystemCursor + { + CURSOR_ARROW, + CURSOR_IBEAM, + CURSOR_WAIT, + CURSOR_CROSSHAIR, + CURSOR_WAITARROW, + CURSOR_SIZENWSE, + CURSOR_SIZENESW, + CURSOR_SIZEWE, + CURSOR_SIZENS, + CURSOR_SIZEALL, + CURSOR_NO, + CURSOR_HAND, + CURSOR_MAX_ENUM + }; + + enum CursorType + { + CURSORTYPE_SYSTEM, + CURSORTYPE_IMAGE, + CURSORTYPE_MAX_ENUM + }; + + virtual ~Cursor(); + + /** + * Returns a pointer to the implementation-dependent handle of this Cursor. + **/ + virtual void *getHandle() const = 0; + + /** + * Returns whether this Cursor is system-defined or a custom image. + **/ + virtual CursorType getType() const = 0; + + /** + * Returns the type type of system cursor used, if this Cursor is using a + * system-defined image. + **/ + virtual SystemCursor getSystemType() const = 0; + + static bool getConstant(const char *in, SystemCursor &out); + static bool getConstant(SystemCursor in, const char *&out); + + static bool getConstant(const char *in, CursorType &out); + static bool getConstant(CursorType in, const char *&out); + +private: + + static StringMap::Entry systemCursorEntries[]; + static StringMap systemCursors; + + static StringMap::Entry typeEntries[]; + static StringMap types; + +}; + +} // mouse +} // love + +#endif // LOVE_MOUSE_CURSOR_H diff --git a/jni/love/src/modules/mouse/Mouse.cpp b/jni/love/src/modules/mouse/Mouse.cpp new file mode 100644 index 00000000..1924276c --- /dev/null +++ b/jni/love/src/modules/mouse/Mouse.cpp @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Mouse.h" + +namespace love +{ +namespace mouse +{ + +bool Mouse::getConstant(const char *in, Button &out) +{ + return buttons.find(in, out); +} + +bool Mouse::getConstant(Button in, const char *&out) +{ + return buttons.find(in, out); +} + +StringMap::Entry Mouse::buttonEntries[] = +{ + {"l", Mouse::BUTTON_LEFT}, + {"m", Mouse::BUTTON_MIDDLE}, + {"r", Mouse::BUTTON_RIGHT}, + {"wu", Mouse::BUTTON_WHEELUP}, + {"wd", Mouse::BUTTON_WHEELDOWN}, + {"x1", Mouse::BUTTON_X1}, + {"x2", Mouse::BUTTON_X2}, +}; + +StringMap Mouse::buttons(Mouse::buttonEntries, sizeof(Mouse::buttonEntries)); + +} // mouse +} // love diff --git a/jni/love/src/modules/mouse/Mouse.h b/jni/love/src/modules/mouse/Mouse.h new file mode 100644 index 00000000..65794df4 --- /dev/null +++ b/jni/love/src/modules/mouse/Mouse.h @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MOUSE_MOUSE_H +#define LOVE_MOUSE_MOUSE_H + +// LOVE +#include "Cursor.h" +#include "common/Module.h" +#include "common/StringMap.h" +#include "image/ImageData.h" + +namespace love +{ +namespace mouse +{ + +class Mouse : public Module +{ +public: + + enum Button + { + BUTTON_INVALID, + BUTTON_LEFT, + BUTTON_MIDDLE, + BUTTON_RIGHT, + BUTTON_X1, + BUTTON_X2, + BUTTON_WHEELUP, + BUTTON_WHEELDOWN, + BUTTON_MAX_ENUM + }; + + virtual ~Mouse() {}; + + virtual Cursor *newCursor(love::image::ImageData *data, int hotx, int hoty) = 0; + virtual Cursor *getSystemCursor(Cursor::SystemCursor cursortype) = 0; + + virtual void setCursor(Cursor *cursor) = 0; + virtual void setCursor() = 0; + + virtual Cursor *getCursor() const = 0; + + virtual int getX() const = 0; + virtual int getY() const = 0; + virtual void getPosition(int &x, int &y) const = 0; + virtual void setX(int x) = 0; + virtual void setY(int y) = 0; + virtual void setPosition(int x, int y) = 0; + virtual void setVisible(bool visible) = 0; + virtual bool isDown(Button *buttonlist) const = 0; + virtual bool isVisible() const = 0; + virtual void setGrabbed(bool grab) = 0; + virtual bool isGrabbed() const = 0; + + static bool getConstant(const char *in, Button &out); + static bool getConstant(Button in, const char *&out); + +private: + + static StringMap::Entry buttonEntries[]; + static StringMap buttons; + +}; // Mouse + +} // mouse +} // love + +#endif // LOVE_MOUSE_MOUSE_H diff --git a/jni/love/src/modules/mouse/sdl/Cursor.cpp b/jni/love/src/modules/mouse/sdl/Cursor.cpp new file mode 100644 index 00000000..53f20afe --- /dev/null +++ b/jni/love/src/modules/mouse/sdl/Cursor.cpp @@ -0,0 +1,122 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Cursor.h" +#include "common/config.h" + +namespace love +{ +namespace mouse +{ +namespace sdl +{ + +Cursor::Cursor(image::ImageData *data, int hotx, int hoty) + : cursor(0) + , type(CURSORTYPE_IMAGE) + , systemType(CURSOR_MAX_ENUM) +{ + Uint32 rmask, gmask, bmask, amask; +#ifdef LOVE_BIG_ENDIAN + rmask = 0xFF000000; + gmask = 0x00FF0000; + bmask = 0x0000FF00; + amask = 0x000000FF; +#else + rmask = 0x000000FF; + gmask = 0x0000FF00; + bmask = 0x00FF0000; + amask = 0xFF000000; +#endif + + int w = data->getWidth(); + int h = data->getHeight(); + int pitch = w * 4; + + SDL_Surface *surface = SDL_CreateRGBSurfaceFrom(data->getData(), w, h, 32, pitch, rmask, gmask, bmask, amask); + if (!surface) + throw love::Exception("Cannot create cursor: out of memory!"); + + cursor = SDL_CreateColorCursor(surface, hotx, hoty); + SDL_FreeSurface(surface); + + if (!cursor) + throw love::Exception("Cannot create cursor: %s", SDL_GetError()); +} + +Cursor::Cursor(mouse::Cursor::SystemCursor cursortype) + : cursor(0) + , type(CURSORTYPE_SYSTEM) + , systemType(cursortype) +{ + SDL_SystemCursor sdlcursortype; + + if (systemCursors.find(cursortype, sdlcursortype)) + cursor = SDL_CreateSystemCursor(sdlcursortype); + else + throw love::Exception("Cannot create system cursor: invalid type."); + + if (!cursor) + throw love::Exception("Cannot create system cursor: %s", SDL_GetError()); +} + +Cursor::~Cursor() +{ + if (cursor) + SDL_FreeCursor(cursor); +} + +void *Cursor::getHandle() const +{ + return cursor; +} + +Cursor::CursorType Cursor::getType() const +{ + return type; +} + +Cursor::SystemCursor Cursor::getSystemType() const +{ + return systemType; +} + +EnumMap::Entry Cursor::systemCursorEntries[] = +{ + {Cursor::CURSOR_ARROW, SDL_SYSTEM_CURSOR_ARROW}, + {Cursor::CURSOR_IBEAM, SDL_SYSTEM_CURSOR_IBEAM}, + {Cursor::CURSOR_WAIT, SDL_SYSTEM_CURSOR_WAIT}, + {Cursor::CURSOR_CROSSHAIR, SDL_SYSTEM_CURSOR_CROSSHAIR}, + {Cursor::CURSOR_WAITARROW, SDL_SYSTEM_CURSOR_WAITARROW}, + {Cursor::CURSOR_SIZENWSE, SDL_SYSTEM_CURSOR_SIZENWSE}, + {Cursor::CURSOR_SIZENESW, SDL_SYSTEM_CURSOR_SIZENESW}, + {Cursor::CURSOR_SIZEWE, SDL_SYSTEM_CURSOR_SIZEWE}, + {Cursor::CURSOR_SIZENS, SDL_SYSTEM_CURSOR_SIZENS}, + {Cursor::CURSOR_SIZEALL, SDL_SYSTEM_CURSOR_SIZEALL}, + {Cursor::CURSOR_NO, SDL_SYSTEM_CURSOR_NO}, + {Cursor::CURSOR_HAND, SDL_SYSTEM_CURSOR_HAND}, +}; + +EnumMap Cursor::systemCursors(Cursor::systemCursorEntries, sizeof(Cursor::systemCursorEntries)); + +} // sdl +} // mouse +} // love diff --git a/jni/love/src/modules/mouse/sdl/Cursor.h b/jni/love/src/modules/mouse/sdl/Cursor.h new file mode 100644 index 00000000..f2ef1822 --- /dev/null +++ b/jni/love/src/modules/mouse/sdl/Cursor.h @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MOUSE_SDL_CURSOR_H +#define LOVE_MOUSE_SDL_CURSOR_H + +// LOVE +#include "mouse/Cursor.h" +#include "common/EnumMap.h" + +// SDL +#include + +namespace love +{ +namespace mouse +{ +namespace sdl +{ + +class Cursor : public love::mouse::Cursor +{ +public: + + Cursor(image::ImageData *imageData, int hotx, int hoty); + Cursor(SystemCursor cursortype); + ~Cursor(); + + void *getHandle() const; + CursorType getType() const; + SystemCursor getSystemType() const; + +private: + + SDL_Cursor *cursor; + CursorType type; + SystemCursor systemType; + + static EnumMap::Entry systemCursorEntries[]; + static EnumMap systemCursors; +}; + +} // sdl +} // mouse +} // love + +#endif // LOVE_MOUSE_SDL_CURSOR_H diff --git a/jni/love/src/modules/mouse/sdl/Mouse.cpp b/jni/love/src/modules/mouse/sdl/Mouse.cpp new file mode 100644 index 00000000..093297ee --- /dev/null +++ b/jni/love/src/modules/mouse/sdl/Mouse.cpp @@ -0,0 +1,181 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Mouse.h" +#include "window/sdl/Window.h" + +// SDL +#include + +namespace love +{ +namespace mouse +{ +namespace sdl +{ + +const char *Mouse::getName() const +{ + return "love.mouse.sdl"; +} + +Mouse::Mouse() + : curCursor(0) +{ +} + +Mouse::~Mouse() +{ + if (curCursor) + setCursor(); + + for (auto it = systemCursors.begin(); it != systemCursors.end(); ++it) + it->second->release(); +} + +love::mouse::Cursor *Mouse::newCursor(love::image::ImageData *data, int hotx, int hoty) +{ + return new Cursor(data, hotx, hoty); +} + +love::mouse::Cursor *Mouse::getSystemCursor(Cursor::SystemCursor cursortype) +{ + Cursor *cursor = NULL; + auto it = systemCursors.find(cursortype); + + if (it != systemCursors.end()) + cursor = it->second; + else + { + cursor = new Cursor(cursortype); + systemCursors[cursortype] = cursor; + } + + return cursor; +} + +void Mouse::setCursor(love::mouse::Cursor *cursor) +{ + Object::AutoRelease cursorrelease(curCursor); + + curCursor = cursor; + curCursor->retain(); + + SDL_SetCursor((SDL_Cursor *) cursor->getHandle()); +} + +void Mouse::setCursor() +{ + Object::AutoRelease cursorrelease(curCursor); + curCursor = NULL; + + SDL_SetCursor(SDL_GetDefaultCursor()); +} + +love::mouse::Cursor *Mouse::getCursor() const +{ + return curCursor; +} + +int Mouse::getX() const +{ + int x; + SDL_GetMouseState(&x, 0); + return x; +} + +int Mouse::getY() const +{ + int y; + SDL_GetMouseState(0, &y); + return y; +} + +void Mouse::getPosition(int &x, int &y) const +{ + SDL_GetMouseState(&x, &y); +} + +void Mouse::setPosition(int x, int y) +{ + love::window::Window *window = love::window::sdl::Window::getSingleton(); + + SDL_Window *handle = NULL; + if (window) + handle = (SDL_Window *) window->getHandle(); + + SDL_WarpMouseInWindow(handle, x, y); +} + +void Mouse::setX(int x) +{ + int y = getY(); + setPosition(x, y); +} + +void Mouse::setY(int y) +{ + int x = getX(); + setPosition(x, y); +} + +void Mouse::setVisible(bool visible) +{ + SDL_ShowCursor(visible ? SDL_ENABLE : SDL_DISABLE); +} + +bool Mouse::isDown(Button *buttonlist) const +{ + Uint32 buttonstate = SDL_GetMouseState(0, 0); + + for (Button button = *buttonlist; button != BUTTON_MAX_ENUM; button = *(++buttonlist)) + { + if (buttonstate & SDL_BUTTON(button)) + return true; + } + + return false; +} + +bool Mouse::isVisible() const +{ + return SDL_ShowCursor(SDL_QUERY) == SDL_ENABLE; +} + +void Mouse::setGrabbed(bool grab) +{ + love::window::Window *window = love::window::sdl::Window::getSingleton(); + if (window) + window->setMouseGrab(grab); +} + +bool Mouse::isGrabbed() const +{ + love::window::Window *window = love::window::sdl::Window::getSingleton(); + if (window) + return window->isMouseGrabbed(); + else + return false; +} + +} // sdl +} // mouse +} // love diff --git a/jni/love/src/modules/mouse/sdl/Mouse.h b/jni/love/src/modules/mouse/sdl/Mouse.h new file mode 100644 index 00000000..c88ec8cd --- /dev/null +++ b/jni/love/src/modules/mouse/sdl/Mouse.h @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MOUSE_SDL_MOUSE_H +#define LOVE_MOUSE_SDL_MOUSE_H + +// LOVE +#include "mouse/Mouse.h" +#include "Cursor.h" + +// C++ +#include + +namespace love +{ +namespace mouse +{ +namespace sdl +{ + +class Mouse : public love::mouse::Mouse +{ +public: + + // Implements Module. + const char *getName() const; + + Mouse(); + ~Mouse(); + + love::mouse::Cursor *newCursor(love::image::ImageData *data, int hotx, int hoty); + love::mouse::Cursor *getSystemCursor(Cursor::SystemCursor cursortype); + + void setCursor(love::mouse::Cursor *cursor); + void setCursor(); + + love::mouse::Cursor *getCursor() const; + + int getX() const; + int getY() const; + void getPosition(int &x, int &y) const; + void setX(int x); + void setY(int y); + void setPosition(int x, int y); + void setVisible(bool visible); + bool isDown(Button *buttonlist) const; + bool isVisible() const; + void setGrabbed(bool grab); + bool isGrabbed() const; + +private: + + love::mouse::Cursor *curCursor; + + std::map systemCursors; + +}; // Mouse + +} // sdl +} // mouse +} // love + +#endif // LOVE_MOUSE_SDL_MOUSE_H diff --git a/jni/love/src/modules/mouse/wrap_Cursor.cpp b/jni/love/src/modules/mouse/wrap_Cursor.cpp new file mode 100644 index 00000000..4db8fcfe --- /dev/null +++ b/jni/love/src/modules/mouse/wrap_Cursor.cpp @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Cursor.h" + +namespace love +{ +namespace mouse +{ + +Cursor *luax_checkcursor(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Cursor", MOUSE_CURSOR_T); +} + +int w_Cursor_getType(lua_State *L) +{ + Cursor *cursor = luax_checkcursor(L, 1); + + Cursor::CursorType ctype = cursor->getType(); + const char *typestr = 0; + + if (ctype == Cursor::CURSORTYPE_IMAGE) + mouse::Cursor::getConstant(ctype, typestr); + else if (ctype == Cursor::CURSORTYPE_SYSTEM) + { + Cursor::SystemCursor systype = cursor->getSystemType(); + mouse::Cursor::getConstant(systype, typestr); + } + + if (!typestr) + return luaL_error(L, "Unknown cursor type."); + + lua_pushstring(L, typestr); + return 1; +}; + +static const luaL_Reg functions[] = +{ + { "getType", w_Cursor_getType }, + { 0, 0 }, +}; + +extern "C" int luaopen_cursor(lua_State *L) +{ + return luax_register_type(L, "Cursor", functions); +} + +} // mouse +} // love \ No newline at end of file diff --git a/jni/love/src/modules/mouse/wrap_Cursor.h b/jni/love/src/modules/mouse/wrap_Cursor.h new file mode 100644 index 00000000..a0a3c55c --- /dev/null +++ b/jni/love/src/modules/mouse/wrap_Cursor.h @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MOUSE_WRAP_CURSOR_H +#define LOVE_MOUSE_WRAP_CURSOR_H + +// LOVE +#include "common/runtime.h" +#include "Cursor.h" + +namespace love +{ +namespace mouse +{ + +Cursor *luax_checkcursor(lua_State *L, int idx); +int w_Cursor_getType(lua_State *L); +extern "C" int luaopen_cursor(lua_State *L); + +} // mouse +} // love + + +#endif // LOVE_MOUSE_WRAP_CURSOR_H diff --git a/jni/love/src/modules/mouse/wrap_Mouse.cpp b/jni/love/src/modules/mouse/wrap_Mouse.cpp new file mode 100644 index 00000000..00ba421d --- /dev/null +++ b/jni/love/src/modules/mouse/wrap_Mouse.cpp @@ -0,0 +1,233 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Mouse.h" +#include "wrap_Cursor.h" +#include "common/config.h" + +#include "sdl/Mouse.h" + +namespace love +{ +namespace mouse +{ + +static Mouse *instance = 0; + +int w_newCursor(lua_State *L) +{ + Cursor *cursor = 0; + + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T) || luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + luax_convobj(L, 1, "image", "newImageData"); + + love::image::ImageData *data = luax_checktype(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); + int hotx = luaL_optint(L, 2, 0); + int hoty = luaL_optint(L, 3, 0); + + EXCEPT_GUARD(cursor = instance->newCursor(data, hotx, hoty);) + + luax_pushtype(L, "Cursor", MOUSE_CURSOR_T, cursor); + return 1; +} + +int w_getSystemCursor(lua_State *L) +{ + const char *str = luaL_checkstring(L, 1); + Cursor::SystemCursor systemCursor; + + if (!Cursor::getConstant(str, systemCursor)) + return luaL_error(L, "Invalid system cursor type: %s", str); + + Cursor *cursor = 0; + EXCEPT_GUARD(cursor = instance->getSystemCursor(systemCursor);) + + cursor->retain(); + luax_pushtype(L, "Cursor", MOUSE_CURSOR_T, cursor); + return 1; +} + +int w_setCursor(lua_State *L) +{ + // Revert to the default system cursor if no argument is given. + if (lua_isnoneornil(L, 1)) + { + instance->setCursor(); + return 0; + } + + Cursor *cursor = luax_checkcursor(L, 1); + instance->setCursor(cursor); + return 0; +} + +int w_getCursor(lua_State *L) +{ + Cursor *cursor = instance->getCursor(); + + if (cursor) + { + cursor->retain(); + luax_pushtype(L, "Cursor", MOUSE_CURSOR_T, cursor); + } + else + lua_pushnil(L); + + return 1; +} + +int w_getX(lua_State *L) +{ + lua_pushnumber(L, instance->getX()); + return 1; +} + +int w_getY(lua_State *L) +{ + lua_pushnumber(L, instance->getY()); + return 1; +} + +int w_getPosition(lua_State *L) +{ + int x, y; + instance->getPosition(x, y); + lua_pushinteger(L, x); + lua_pushinteger(L, y); + return 2; +} + +int w_setX(lua_State *L) +{ + int x = luaL_checkint(L, 1); + instance->setX(x); + return 0; +} + +int w_setY(lua_State *L) +{ + int y = luaL_checkint(L, 1); + instance->setY(y); + return 0; +} + +int w_setPosition(lua_State *L) +{ + int x = luaL_checkint(L, 1); + int y = luaL_checkint(L, 2); + instance->setPosition(x, y); + return 0; +} + +int w_isDown(lua_State *L) +{ + Mouse::Button b; + unsigned int num = lua_gettop(L); + Mouse::Button *buttonlist = new Mouse::Button[num+1]; + unsigned int counter = 0; + + for (unsigned int i = 0; i < num; i++) + { + if (Mouse::getConstant(luaL_checkstring(L, i+1), b)) + buttonlist[counter++] = b; + } + buttonlist[counter] = Mouse::BUTTON_MAX_ENUM; + + luax_pushboolean(L, instance->isDown(buttonlist)); + delete[] buttonlist; + return 1; +} + +int w_setVisible(lua_State *L) +{ + bool b = luax_toboolean(L, 1); + instance->setVisible(b); + return 0; +} + +int w_isVisible(lua_State *L) +{ + luax_pushboolean(L, instance->isVisible()); + return 1; +} + +int w_setGrabbed(lua_State *L) +{ + bool b = luax_toboolean(L, 1); + instance->setGrabbed(b); + return 0; +} + +int w_isGrabbed(lua_State *L) +{ + luax_pushboolean(L, instance->isGrabbed()); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "newCursor", w_newCursor }, + { "getSystemCursor", w_getSystemCursor }, + { "setCursor", w_setCursor }, + { "getCursor", w_getCursor }, + { "getX", w_getX }, + { "getY", w_getY }, + { "setX", w_setX }, + { "setY", w_setY }, + { "setPosition", w_setPosition }, + { "isDown", w_isDown }, + { "setVisible", w_setVisible }, + { "isVisible", w_isVisible }, + { "getPosition", w_getPosition }, + { "setGrabbed", w_setGrabbed }, + { "isGrabbed", w_isGrabbed }, + { 0, 0 } +}; + +// Types for this module. +static const lua_CFunction types[] = +{ + luaopen_cursor, + 0, +}; + +extern "C" int luaopen_love_mouse(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new love::mouse::sdl::Mouse();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "mouse"; + w.flags = MODULE_T; + w.functions = functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // mouse +} // love diff --git a/jni/love/src/modules/mouse/wrap_Mouse.h b/jni/love/src/modules/mouse/wrap_Mouse.h new file mode 100644 index 00000000..4b8223a9 --- /dev/null +++ b/jni/love/src/modules/mouse/wrap_Mouse.h @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_MOUSE_WRAP_MOUSE_H +#define LOVE_MOUSE_WRAP_MOUSE_H + +// LOVE +#include "common/runtime.h" +#include "common/config.h" + +namespace love +{ +namespace mouse +{ + +int w_newCursor(lua_State *L); +int w_getSystemCursor(lua_State *L); +int w_setCursor(lua_State *L); +int w_getCursor(lua_State *L); +int w_getX(lua_State *L); +int w_getY(lua_State *L); +int w_getPosition(lua_State *L); +int w_setX(lua_State *L); +int w_setY(lua_State *L); +int w_setPosition(lua_State *L); +int w_isDown(lua_State *L); +int w_setVisible(lua_State *L); +int w_isVisible(lua_State *L); +int w_setGrabbed(lua_State *L); +int w_isGrabbed(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_mouse(lua_State *L); + +} // mouse +} // love + +#endif // LOVE_MOUSE_WRAP_MOUSE_H + diff --git a/jni/love/src/modules/physics/Body.cpp b/jni/love/src/modules/physics/Body.cpp new file mode 100644 index 00000000..9b715f7b --- /dev/null +++ b/jni/love/src/modules/physics/Body.cpp @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Body.h" + +namespace love +{ +namespace physics +{ + +Body::~Body() +{ +} + +bool Body::getConstant(const char *in, Type &out) +{ + return types.find(in, out); +} + +bool Body::getConstant(Type in, const char *&out) +{ + return types.find(in, out); +} + +StringMap::Entry Body::typeEntries[] = +{ + {"static", Body::BODY_STATIC}, + {"dynamic", Body::BODY_DYNAMIC}, + {"kinematic", Body::BODY_KINEMATIC}, +}; + +StringMap Body::types(Body::typeEntries, sizeof(Body::typeEntries)); + +} // physics +} // love diff --git a/jni/love/src/modules/physics/Body.h b/jni/love/src/modules/physics/Body.h new file mode 100644 index 00000000..ec9cdf69 --- /dev/null +++ b/jni/love/src/modules/physics/Body.h @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BODY_H +#define LOVE_PHYSICS_BODY_H + +// LOVE +#include "common/Object.h" +#include "common/StringMap.h" + +namespace love +{ +namespace physics +{ + +class Body : public Object +{ +public: + + enum Type + { + BODY_INVALID, + BODY_STATIC, + BODY_DYNAMIC, + BODY_KINEMATIC, + BODY_MAX_ENUM + }; + + virtual ~Body(); + + static bool getConstant(const char *in, Type &out); + static bool getConstant(Type in, const char *&out); + +private: + + static StringMap::Entry typeEntries[]; + static StringMap types; +}; + +} // physics +} // love + +#endif // LOVE_PHYSICS_BODY_H diff --git a/jni/love/src/modules/physics/Joint.cpp b/jni/love/src/modules/physics/Joint.cpp new file mode 100644 index 00000000..66700e89 --- /dev/null +++ b/jni/love/src/modules/physics/Joint.cpp @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Joint.h" + +namespace love +{ +namespace physics +{ + +Joint::~Joint() +{ +} + +bool Joint::getConstant(const char *in, Type &out) +{ + return types.find(in, out); +} + +bool Joint::getConstant(Type in, const char *&out) +{ + return types.find(in, out); +} + +StringMap::Entry Joint::typeEntries[] = +{ + {"distance", Joint::JOINT_DISTANCE}, + {"revolute", Joint::JOINT_REVOLUTE}, + {"prismatic", Joint::JOINT_PRISMATIC}, + {"mouse", Joint::JOINT_MOUSE}, + {"pulley", Joint::JOINT_PULLEY}, + {"gear", Joint::JOINT_GEAR}, + {"friction", Joint::JOINT_FRICTION}, + {"weld", Joint::JOINT_WELD}, + {"wheel", Joint::JOINT_WHEEL}, + {"rope", Joint::JOINT_ROPE}, + {"motor", Joint::JOINT_MOTOR}, +}; + +StringMap Joint::types(Joint::typeEntries, sizeof(Joint::typeEntries)); + +} // physics +} // love diff --git a/jni/love/src/modules/physics/Joint.h b/jni/love/src/modules/physics/Joint.h new file mode 100644 index 00000000..f5ac26cf --- /dev/null +++ b/jni/love/src/modules/physics/Joint.h @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_JOINT_H +#define LOVE_PHYSICS_JOINT_H + +// LOVE +#include "common/Object.h" +#include "common/StringMap.h" + +namespace love +{ +namespace physics +{ + +class Joint : public Object +{ +public: + + enum Type + { + JOINT_INVALID, + JOINT_DISTANCE, + JOINT_REVOLUTE, + JOINT_PRISMATIC, + JOINT_MOUSE, + JOINT_PULLEY, + JOINT_GEAR, + JOINT_FRICTION, + JOINT_WELD, + JOINT_WHEEL, + JOINT_ROPE, + JOINT_MOTOR, + JOINT_MAX_ENUM + }; + + + virtual ~Joint(); + + static bool getConstant(const char *in, Type &out); + static bool getConstant(Type in, const char *&out); + +private: + + static StringMap::Entry typeEntries[]; + static StringMap types; +}; + +} // physics +} // love + +#endif // LOVE_PHYSICS_JOINT_H diff --git a/jni/love/src/modules/physics/Shape.cpp b/jni/love/src/modules/physics/Shape.cpp new file mode 100644 index 00000000..d250109d --- /dev/null +++ b/jni/love/src/modules/physics/Shape.cpp @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Shape.h" + +namespace love +{ +namespace physics +{ + +Shape::~Shape() +{ +} + +bool Shape::getConstant(const char *in, Type &out) +{ + return types.find(in, out); +} + +bool Shape::getConstant(Type in, const char *&out) +{ + return types.find(in, out); +} + +StringMap::Entry Shape::typeEntries[] = +{ + {"circle", Shape::SHAPE_CIRCLE}, + {"polygon", Shape::SHAPE_POLYGON}, + {"edge", Shape::SHAPE_EDGE}, + {"chain", Shape::SHAPE_CHAIN}, +}; + +StringMap Shape::types(Shape::typeEntries, sizeof(Shape::typeEntries)); + +} // physics +} // love diff --git a/jni/love/src/modules/physics/Shape.h b/jni/love/src/modules/physics/Shape.h new file mode 100644 index 00000000..498deef3 --- /dev/null +++ b/jni/love/src/modules/physics/Shape.h @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_SHAPE_H +#define LOVE_PHYSICS_SHAPE_H + +// LOVE +#include "common/Object.h" +#include "common/StringMap.h" + +namespace love +{ +namespace physics +{ + +class Shape : public Object +{ +public: + + enum Type + { + SHAPE_INVALID, + SHAPE_CIRCLE, + SHAPE_POLYGON, + SHAPE_EDGE, + SHAPE_CHAIN, + SHAPE_MAX_ENUM + }; + + virtual ~Shape(); + + static bool getConstant(const char *in, Type &out); + static bool getConstant(Type in, const char *&out); + +private: + + static StringMap::Entry typeEntries[]; + static StringMap types; +}; + +} // physics +} // love + +#endif // LOVE_PHYSICS_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/Body.cpp b/jni/love/src/modules/physics/box2d/Body.cpp new file mode 100644 index 00000000..29c941b6 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Body.cpp @@ -0,0 +1,474 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Body.h" + +#include "common/math.h" +#include "common/Memoizer.h" + +#include "Shape.h" +#include "Fixture.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Body::Body(World *world, b2Vec2 p, Body::Type type) + : world(world) +{ + world->retain(); + b2BodyDef def; + def.position = Physics::scaleDown(p); + body = world->world->CreateBody(&def); + // Box2D body holds a reference to the love Body. + this->retain(); + this->setType(type); + Memoizer::add(body, this); +} + +Body::Body(b2Body *b) + : body(b) +{ + world = (World *)Memoizer::find(b->GetWorld()); + world->retain(); + // Box2D body holds a reference to the love Body. + this->retain(); + Memoizer::add(body, this); +} + +Body::~Body() +{ + world->release(); + body = 0; +} + +float Body::getX() +{ + return Physics::scaleUp(body->GetPosition().x); +} + +float Body::getY() +{ + return Physics::scaleUp(body->GetPosition().y); +} + +void Body::getPosition(float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetPosition()); + x_o = v.x; + y_o = v.y; +} + +void Body::getLinearVelocity(float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetLinearVelocity()); + x_o = v.x; + y_o = v.y; +} + +float Body::getAngle() +{ + return body->GetAngle(); +} + +void Body::getWorldCenter(float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetWorldCenter()); + x_o = v.x; + y_o = v.y; +} + +void Body::getLocalCenter(float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetLocalCenter()); + x_o = v.x; + y_o = v.y; +} + +float Body::getAngularVelocity() const +{ + return body->GetAngularVelocity(); +} + +float Body::getMass() const +{ + return body->GetMass(); +} + +float Body::getInertia() const +{ + return Physics::scaleUp(Physics::scaleUp(body->GetInertia())); +} + +int Body::getMassData(lua_State *L) +{ + b2MassData data; + body->GetMassData(&data); + b2Vec2 center = Physics::scaleUp(data.center); + lua_pushnumber(L, center.x); + lua_pushnumber(L, center.y); + lua_pushnumber(L, data.mass); + lua_pushnumber(L, Physics::scaleUp(Physics::scaleUp(data.I))); + return 4; +} + +float Body::getAngularDamping() const +{ + return body->GetAngularDamping(); +} + +float Body::getLinearDamping() const +{ + return body->GetLinearDamping(); +} + +float Body::getGravityScale() const +{ + return body->GetGravityScale(); +} + +Body::Type Body::getType() const +{ + switch (body->GetType()) + { + case b2_staticBody: + return BODY_STATIC; + break; + case b2_dynamicBody: + return BODY_DYNAMIC; + break; + case b2_kinematicBody: + return BODY_KINEMATIC; + break; + default: + return BODY_INVALID; + break; + } +} + +void Body::applyLinearImpulse(float jx, float jy, bool wake) +{ + body->ApplyLinearImpulse(Physics::scaleDown(b2Vec2(jx, jy)), body->GetWorldCenter(), wake); +} + +void Body::applyLinearImpulse(float jx, float jy, float rx, float ry, bool wake) +{ + body->ApplyLinearImpulse(Physics::scaleDown(b2Vec2(jx, jy)), Physics::scaleDown(b2Vec2(rx, ry)), wake); +} + +void Body::applyAngularImpulse(float impulse, bool wake) +{ + // Angular impulse is in kg*m^2/s, meaning it needs to be scaled twice + body->ApplyAngularImpulse(Physics::scaleDown(Physics::scaleDown(impulse)), wake); +} + +void Body::applyTorque(float t, bool wake) +{ + // Torque is in N*m, or kg*m^2/s^2, meaning it also needs to be scaled twice + body->ApplyTorque(Physics::scaleDown(Physics::scaleDown(t)), wake); +} + +void Body::applyForce(float fx, float fy, float rx, float ry, bool wake) +{ + body->ApplyForce(Physics::scaleDown(b2Vec2(fx, fy)), Physics::scaleDown(b2Vec2(rx, ry)), wake); +} + +void Body::applyForce(float fx, float fy, bool wake) +{ + body->ApplyForceToCenter(Physics::scaleDown(b2Vec2(fx, fy)), wake); +} + +void Body::setX(float x) +{ + body->SetTransform(Physics::scaleDown(b2Vec2(x, getY())), getAngle()); +} + +void Body::setY(float y) +{ + body->SetTransform(Physics::scaleDown(b2Vec2(getX(), y)), getAngle()); +} + +void Body::setLinearVelocity(float x, float y) +{ + body->SetLinearVelocity(Physics::scaleDown(b2Vec2(x, y))); +} + +void Body::setAngle(float d) +{ + body->SetTransform(body->GetPosition(), d); +} + +void Body::setAngularVelocity(float r) +{ + body->SetAngularVelocity(r); +} + +void Body::setPosition(float x, float y) +{ + body->SetTransform(Physics::scaleDown(b2Vec2(x, y)), body->GetAngle()); +} + +void Body::setAngularDamping(float d) +{ + body->SetAngularDamping(d); +} + +void Body::setLinearDamping(float d) +{ + body->SetLinearDamping(d); +} + +void Body::resetMassData() +{ + body->ResetMassData(); +} + +void Body::setMassData(float x, float y, float m, float i) +{ + b2MassData massData; + massData.center = Physics::scaleDown(b2Vec2(x, y)); + massData.mass = m; + massData.I = Physics::scaleDown(Physics::scaleDown(i)); + body->SetMassData(&massData); +} + +void Body::setMass(float m) +{ + b2MassData data; + body->GetMassData(&data); + data.mass = m; + body->SetMassData(&data); +} + +void Body::setInertia(float i) +{ + b2MassData massData; + massData.center = body->GetLocalCenter(); + massData.mass = body->GetMass(); + massData.I = Physics::scaleDown(Physics::scaleDown(i)); + body->SetMassData(&massData); +} + +void Body::setGravityScale(float scale) +{ + body->SetGravityScale(scale); +} + +void Body::setType(Body::Type type) +{ + switch (type) + { + case Body::BODY_STATIC: + body->SetType(b2_staticBody); + break; + case Body::BODY_DYNAMIC: + body->SetType(b2_dynamicBody); + break; + case Body::BODY_KINEMATIC: + body->SetType(b2_kinematicBody); + break; + default: + break; + } +} + +void Body::getWorldPoint(float x, float y, float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetWorldPoint(Physics::scaleDown(b2Vec2(x, y)))); + x_o = v.x; + y_o = v.y; +} + +void Body::getWorldVector(float x, float y, float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetWorldVector(Physics::scaleDown(b2Vec2(x, y)))); + x_o = v.x; + y_o = v.y; +} + +int Body::getWorldPoints(lua_State *L) +{ + int argc = lua_gettop(L); + int vcount = (int)argc/2; + // at least one point + love::luax_assert_argc(L, 2); + + for (int i = 0; iGetWorldPoint(Physics::scaleDown(b2Vec2(x, y)))); + // And then we push the result + lua_pushnumber(L, point.x); + lua_pushnumber(L, point.y); + } + + return argc; +} + +void Body::getLocalPoint(float x, float y, float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetLocalPoint(Physics::scaleDown(b2Vec2(x, y)))); + x_o = v.x; + y_o = v.y; +} + +void Body::getLocalVector(float x, float y, float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetLocalVector(Physics::scaleDown(b2Vec2(x, y)))); + x_o = v.x; + y_o = v.y; +} + +void Body::getLinearVelocityFromWorldPoint(float x, float y, float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetLinearVelocityFromWorldPoint(Physics::scaleDown(b2Vec2(x, y)))); + x_o = v.x; + y_o = v.y; +} + +void Body::getLinearVelocityFromLocalPoint(float x, float y, float &x_o, float &y_o) +{ + b2Vec2 v = Physics::scaleUp(body->GetLinearVelocityFromLocalPoint(Physics::scaleDown(b2Vec2(x, y)))); + x_o = v.x; + y_o = v.y; +} + +bool Body::isBullet() const +{ + return body->IsBullet(); +} + +void Body::setBullet(bool bullet) +{ + return body->SetBullet(bullet); +} + +bool Body::isActive() const +{ + return body->IsActive(); +} + +bool Body::isAwake() const +{ + return body->IsAwake(); +} + +void Body::setSleepingAllowed(bool allow) +{ + body->SetSleepingAllowed(allow); +} + +bool Body::isSleepingAllowed() const +{ + return body->IsSleepingAllowed(); +} + +void Body::setActive(bool active) +{ + body->SetActive(active); +} + +void Body::setAwake(bool awake) +{ + body->SetAwake(awake); +} + +void Body::setFixedRotation(bool fixed) +{ + body->SetFixedRotation(fixed); +} + +bool Body::isFixedRotation() const +{ + return body->IsFixedRotation(); +} + +World *Body::getWorld() const +{ + return world; +} + +int Body::getFixtureList(lua_State *L) const +{ + lua_newtable(L); + b2Fixture *f = body->GetFixtureList(); + int i = 1; + do + { + if (!f) + break; + Fixture *fixture = (Fixture *)Memoizer::find(f); + if (!fixture) + throw love::Exception("A fixture has escaped Memoizer!"); + fixture->retain(); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, fixture); + lua_rawseti(L, -2, i); + i++; + } + while ((f = f->GetNext())); + return 1; +} + +b2Vec2 Body::getVector(lua_State *L) +{ + love::luax_assert_argc(L, 2, 2); + b2Vec2 v((float)lua_tonumber(L, 1), (float)lua_tonumber(L, 2)); + lua_pop(L, 2); + return v; +} + +int Body::pushVector(lua_State *L, const b2Vec2 &v) +{ + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + return 2; +} + +void Body::destroy() +{ + if (world->world->IsLocked()) + { + // Called during time step. Save reference for destruction afterwards. + this->retain(); + world->destructBodies.push_back(this); + return; + } + + world->world->DestroyBody(body); + Memoizer::remove(body); + body = NULL; + + // Box2D body destroyed. Release its reference to the love Body. + this->release(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/Body.h b/jni/love/src/modules/physics/box2d/Body.h new file mode 100644 index 00000000..6ee019fd --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Body.h @@ -0,0 +1,417 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_BODY_H +#define LOVE_PHYSICS_BOX2D_BODY_H + +// LOVE +#include "common/math.h" +#include "common/runtime.h" +#include "common/Object.h" +#include "physics/Body.h" + +// Box2D +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ +// Forward declarations. +class World; +class Shape; +class Fixture; + +/** + * A Body is an entity which has position and orientation + * in world space. A Body does have collision geometry + * by itself, but depend on an arbitrary number of child Shape objects + * which together constitute the final geometry for the Body. + **/ +class Body : public love::physics::Body +{ +public: + // Friends. + friend class Joint; + friend class DistanceJoint; + friend class MouseJoint; + friend class CircleShape; + friend class PolygonShape; + friend class Shape; + friend class Fixture; + + // The Box2D body. (Should not be public?) + b2Body *body; + + /** + * Create a Body at position p. + **/ + Body(World *world, b2Vec2 p, Type type); + + /** + * Create a Body from an extant b2Body. + **/ + Body(b2Body *b); + + virtual ~Body(); + + /** + * Gets the current x-position of the Body. + **/ + float getX(); + + /** + * Gets the current y-position of the Body. + **/ + float getY(); + + /** + * Gets the current angle (deg) of the Body. + **/ + float getAngle(); + + /** + * Gets the current position of the Body. + * @param[out] x_o The x-component of the position. + * @param[out] y_o The y-component of the position. + **/ + void getPosition(float &x_o, float &y_o); + + /** + * Gets the velocity in the current center of mass. + * @param[out] x_o The x-component of the velocity. + * @param[out] y_o The y-component of the velocity. + **/ + void getLinearVelocity(float &x_o, float &y_o); + + /** + * The current center of mass for the Body in world + * coordinates. + * @param[out] x_o The x-component of the center of mass. + * @param[out] y_o The y-component of the center of mass. + **/ + void getWorldCenter(float &x_o, float &y_o); + + /** + * The current center of mass for the Body in local + * coordinates. + * @param[out] x_o The x-component of the center of mass. + * @param[out] y_o The y-component of the center of mass. + **/ + void getLocalCenter(float &x_o, float &y_o); + + /** + * Get the current Body spin. (Angular velocity). + **/ + float getAngularVelocity() const; + + /** + * Gets the Body's mass. + **/ + float getMass() const; + + /** + * Gets the Body's intertia. + **/ + float getInertia() const; + + /** + * Gets mass properties. + **/ + int getMassData(lua_State *L); + + /** + * Gets the Body's angular damping. + **/ + float getAngularDamping() const; + + /** + * Gets the Body's linear damping. + **/ + float getLinearDamping() const; + + /** + * Gets the Body's gravity scale. + **/ + float getGravityScale() const; + + /** + * Gets the type of body this is. + **/ + Type getType() const; + + /** + * Apply an impulse (jx, jy) with offset (0, 0). + **/ + void applyLinearImpulse(float jx, float jy, bool wake); + + /** + * Apply an impulse (jx, jy) with offset (rx, ry). + **/ + void applyLinearImpulse(float jx, float jy, float rx, float ry, bool wake); + + /** + * Apply an angular impulse to the body. + **/ + void applyAngularImpulse(float impulse, bool wake); + + /** + * Apply torque (t). + **/ + void applyTorque(float t, bool wake); + + /** + * Apply force (fx, fy) with offset (0, 0). + **/ + void applyForce(float fx, float fy, bool wake); + + /** + * Apply force (fx, fy) with offset (rx, ry). + **/ + void applyForce(float fx, float fy, float rx, float ry, bool wake); + + /** + * Sets the x-position of the Body. + **/ + void setX(float x); + + /** + * Sets the Y-position of the Body. + **/ + void setY(float y); + + /** + * Sets the current velocity of the Body. + **/ + void setLinearVelocity(float x, float y); + + /** + * Sets the angle of the Body. + **/ + void setAngle(float d); + + /** + * Sets the current spin of the Body. + **/ + void setAngularVelocity(float r); + + /** + * Sets the current position of the Body. + **/ + void setPosition(float x, float y); + + /** + * Sets the mass from the currently attatched shapes. + **/ + void resetMassData(); + + /** + * Sets mass properties. + * @param x The x-coordinate for the local center of mass. + * @param y The y-coordinate for the local center of mass. + * @param m The mass. + * @param i The inertia. + **/ + void setMassData(float x, float y, float m, float i); + + /** + * Sets just the mass. This is provided as a LOVE bonus. Lovely! + * @param m The mass. + **/ + void setMass(float m); + + /** + * Sets the inertia while keeping the other properties + * (mass and local center). + * @param i The inertia. + **/ + void setInertia(float i); + + /** + * Sets the Body's angular damping. + **/ + void setAngularDamping(float d); + + /** + * Sets the Body's linear damping. + **/ + void setLinearDamping(float d); + + /** + * Sets the Body's gravity scale. + **/ + void setGravityScale(float scale); + + /** + * Sets the type of body this is. + **/ + void setType(Type type); + + /** + * Transforms a point (x, y) from local coordinates + * to world coordinates. + * @param x The x-coordinate of the local point. + * @param y The y-coordinate of the local point. + * @param[out] x_o The x-coordinate of the point in world coordinates. + * @param[out] y_o The y-coordinate of the point in world coordinates. + **/ + void getWorldPoint(float x, float y, float &x_o, float &y_o); + + /** + * Transforms a vector (x, y) from local coordinates + * to world coordinates. + * @param x The x-coordinate of the local vector. + * @param y The y-coordinate of the local vector. + * @param[out] x_o The x-coordinate of the vector in world coordinates. + * @param[out] y_o The y-coordinate of the vector in world coordinates. + **/ + void getWorldVector(float x, float y, float &x_o, float &y_o); + + /** + * Transforms a series of points (x, y) from local coordinates + * to world coordinates. + **/ + int getWorldPoints(lua_State *L); + + /** + * Transforms a point (x, y) from world coordinates + * to local coordinates. + * @param x The x-coordinate of the world point. + * @param y The y-coordinate of the world point. + * @param[out] x_o The x-coordinate of the point in local coordinates. + * @param[out] y_o The y-coordinate of the point in local coordinates. + **/ + void getLocalPoint(float x, float y, float &x_o, float &y_o); + + /** + * Transforms a vector (x, y) from world coordinates + * to local coordinates. + * @param x The x-coordinate of the world vector. + * @param y The y-coordinate of the world vector. + * @param[out] x_o The x-coordinate of the vector in local coordinates. + * @param[out] y_o The y-coordinate of the vector in local coordinates. + **/ + void getLocalVector(float x, float y, float &x_o, float &y_o); + + /** + * Gets the velocity on the Body for the given world point. + * @param x The x-coordinate of the world point. + * @param y The y-coordinate of the world point. + * @param[out] x_o The x-component of the velocity vector. + * @param[out] y_o The y-component of the velocity vector. + **/ + void getLinearVelocityFromWorldPoint(float x, float y, float &x_o, float &y_o); + + /** + * Gets the velocity on the Body for the given local point. + * @param x The x-coordinate of the local point. + * @param y The y-coordinate of the local point. + * @param[out] x_o The x-component of the velocity vector. + * @param[out] y_o The y-component of the velocity vector. + **/ + void getLinearVelocityFromLocalPoint(float x, float y, float &x_o, float &y_o); + + /** + * Returns true if the Body is a bullet, false otherwise. + **/ + bool isBullet() const; + + /** + * Set whether this Body should be treated as a bullet. + * Bullets require more processing power than normal shapes. + **/ + void setBullet(bool bullet); + + /** + * Checks whether a Body is active or not. An inactive body + * cannot be interacted with. + **/ + bool isActive() const; + + /** + * Checks whether a Body is awake or not. A Body + * will fall to sleep if nothing happens to it for while. + **/ + bool isAwake() const; + + /** + * Controls whether this Body should be allowed to sleep. + **/ + void setSleepingAllowed(bool allow); + bool isSleepingAllowed() const; + + /** + * Changes the body's active state. + **/ + void setActive(bool active); + + /** + * Changes the body's sleep state. + **/ + void setAwake(bool awake); + + void setFixedRotation(bool fixed); + bool isFixedRotation() const; + + /** + * Get the World this Body resides in. + */ + World *getWorld() const; + + /** + * Get an array of all the Fixtures attached to this Body. + * @return An array of Fixtures. + **/ + int getFixtureList(lua_State *L) const; + + /** + * Destroy this body. + **/ + void destroy(); + +private: + + /** + * Gets a 2d vector from the arguments on the stack. + **/ + b2Vec2 getVector(lua_State *L); + + /** + * Pushed the x- and y-components of a vector on + * the stack. + **/ + int pushVector(lua_State *L, const b2Vec2 &v); + + // We need a shared_ptr to the parent World, + // because World can not be destroyed as long as + // bodies exists in it. + // + // This ensures that a World only can be destroyed + // once all bodies have been destroyed too. + World *world; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_BODY_H diff --git a/jni/love/src/modules/physics/box2d/ChainShape.cpp b/jni/love/src/modules/physics/box2d/ChainShape.cpp new file mode 100644 index 00000000..6a319796 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/ChainShape.cpp @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "ChainShape.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +#include "common/Memoizer.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +ChainShape::ChainShape(b2ChainShape *c, bool loop, bool own) + : Shape(c, own), loop(loop) +{ +} + +ChainShape::~ChainShape() +{ +} + +void ChainShape::setNextVertex(float x, float y) +{ + if (loop) + { + throw love::Exception("Physics error: Can't call setNextVertex on a loop ChainShape"); + return; + } + b2Vec2 v(x, y); + b2ChainShape *c = (b2ChainShape *)shape; + c->SetNextVertex(Physics::scaleDown(v)); +} + +void ChainShape::setPreviousVertex(float x, float y) +{ + if (loop) + { + throw love::Exception("Physics error: Can't call setPreviousVertex on a loop ChainShape"); + return; + } + b2Vec2 v(x, y); + b2ChainShape *c = (b2ChainShape *)shape; + c->SetNextVertex(Physics::scaleDown(v)); +} + +EdgeShape *ChainShape::getChildEdge(int index) const +{ + b2ChainShape *c = (b2ChainShape *)shape; + b2EdgeShape *e = new b2EdgeShape; + + try + { + c->GetChildEdge(e, index); + } + catch (love::Exception &ex) + { + delete e; + throw; + } + + return new EdgeShape(e, true); +} + +int ChainShape::getChildCount() const +{ + b2ChainShape *c = (b2ChainShape *)shape; + return c->GetChildCount(); +} + +int ChainShape::getVertexCount() const +{ + b2ChainShape *c = (b2ChainShape *)shape; + return c->m_count; +} + +b2Vec2 ChainShape::getPoint(int index) const +{ + b2ChainShape *c = (b2ChainShape *)shape; + if (index < 0 || index >= c->m_count) + throw love::Exception("Physics error: index out of bounds"); + const b2Vec2 &v = c->m_vertices[index]; + return Physics::scaleUp(v); +} + +const b2Vec2 *ChainShape::getPoints() const +{ + b2ChainShape *c = (b2ChainShape *)shape; + return c->m_vertices; +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/ChainShape.h b/jni/love/src/modules/physics/box2d/ChainShape.h new file mode 100644 index 00000000..2df893db --- /dev/null +++ b/jni/love/src/modules/physics/box2d/ChainShape.h @@ -0,0 +1,106 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_CHAIN_SHAPE_H +#define LOVE_PHYSICS_BOX2D_CHAIN_SHAPE_H + +// Module +#include "Shape.h" +#include "EdgeShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * A ChainShape is a freeform collection of line segments. + **/ +class ChainShape : public Shape +{ +public: + + /** + * Create a new ChainShape from a Box2D chain shape. + * @param c The chain shape. + **/ + ChainShape(b2ChainShape *c, bool loop = false, bool own = true); + + virtual ~ChainShape(); + + /** + * Establish connectivity to a vertex that follows + * the last vertex. Fails if called on a loop. + * @param x The x-coordinate of the vertex. + * @param y The y-coordinate of the vertex. + **/ + void setNextVertex(float x, float y); + + /** + * Establish connectivity to a vertex that precedes + * the first vertex. Fails if called on a loop. + * @param x The x-coordinate of the vertex. + * @param y The y-coordinate of the vertex. + **/ + void setPreviousVertex(float x, float y); + + /** + * Gets the number of children shapes. + **/ + int getChildCount() const; + + /** + * Returns a child EdgeShape. + * @param index The index of the child shape. + * @returns The specified child. + **/ + EdgeShape *getChildEdge(int index) const; + + /** + * Returns the number of vertices in the shape. + * @returns The number of vertices in the shape. + **/ + int getVertexCount() const; + + /** + * Returns the vertex at the given index. + * @param index The index of the vertex. + * @returns The specified vertex. + **/ + b2Vec2 getPoint(int index) const; + + /** + * Returns all of the vertices. + * @returns The vertices the shape comprises. + **/ + const b2Vec2 *getPoints() const; + +private: + // True if this ChainShape is a loop. + bool loop; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_CHAIN_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/CircleShape.cpp b/jni/love/src/modules/physics/box2d/CircleShape.cpp new file mode 100644 index 00000000..f93b3809 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/CircleShape.cpp @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "CircleShape.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +#include "common/Memoizer.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +CircleShape::CircleShape(b2CircleShape *c, bool own) + : Shape(c, own) +{ +} + +CircleShape::~CircleShape() +{ +} + +float CircleShape::getRadius() const +{ + return Physics::scaleUp(shape->m_radius); +} + +void CircleShape::setRadius(float r) +{ + shape->m_radius = Physics::scaleDown(r); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/CircleShape.h b/jni/love/src/modules/physics/box2d/CircleShape.h new file mode 100644 index 00000000..d96a6fc1 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/CircleShape.h @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_CIRCLE_SHAPE_H +#define LOVE_PHYSICS_BOX2D_CIRCLE_SHAPE_H + +// Module +#include "Shape.h" + +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * A CircleShape represent a Circle which can + * be used for collision detection and physics. + * + * The CircleShape is much faster than the PolygonShape, + * and should generally be used where possible. + **/ +class CircleShape : public Shape +{ +public: + + /** + * Create a new CircleShape from the a Box2D CircleShape definition. + * @param c The CircleShape definition. + **/ + CircleShape(b2CircleShape *c, bool own = true); + + virtual ~CircleShape(); + + /** + * Gets the radius for the circle. + **/ + float getRadius() const; + + /** + * Sets the radius for the circle. + **/ + void setRadius(float r); +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_CIRCLE_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/Contact.cpp b/jni/love/src/modules/physics/box2d/Contact.cpp new file mode 100644 index 00000000..42416da8 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Contact.cpp @@ -0,0 +1,147 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Contact.h" +#include "World.h" +#include "Physics.h" + +#include "common/Memoizer.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Contact::Contact(b2Contact *contact) + : contact(contact) +{ + Memoizer::add(contact, this); +} + +Contact::~Contact() +{ + invalidate(); +} + +void Contact::invalidate() +{ + if (contact != NULL) + { + Memoizer::remove(contact); + contact = NULL; + } +} + +bool Contact::isValid() +{ + return contact != NULL ? true : false; +} + +int Contact::getPositions(lua_State *L) +{ + love::luax_assert_argc(L, 1, 1); + b2WorldManifold manifold; + contact->GetWorldManifold(&manifold); + int points = contact->GetManifold()->pointCount; + for (int i = 0; i < points; i++) + { + b2Vec2 position = Physics::scaleUp(manifold.points[i]); + lua_pushnumber(L, position.x); + lua_pushnumber(L, position.y); + } + return points*2; +} + +int Contact::getNormal(lua_State *L) +{ + love::luax_assert_argc(L, 1, 1); + b2WorldManifold manifold; + contact->GetWorldManifold(&manifold); + lua_pushnumber(L, manifold.normal.x); + lua_pushnumber(L, manifold.normal.y); + return 2; +} + +float Contact::getFriction() const +{ + return contact->GetFriction(); +} + +float Contact::getRestitution() const +{ + return contact->GetRestitution(); +} + +bool Contact::isEnabled() const +{ + return contact->IsEnabled(); +} + +bool Contact::isTouching() const +{ + return contact->IsTouching(); +} + +void Contact::setFriction(float friction) +{ + contact->SetFriction(friction); +} + +void Contact::setRestitution(float restitution) +{ + contact->SetRestitution(restitution); +} + +void Contact::setEnabled(bool enabled) +{ + contact->SetEnabled(enabled); +} + +void Contact::resetFriction() +{ + contact->ResetFriction(); +} + +void Contact::resetRestitution() +{ + contact->ResetRestitution(); +} + +void Contact::setTangentSpeed(float speed) +{ + contact->SetTangentSpeed(speed); +} + +float Contact::getTangentSpeed() const +{ + return contact->GetTangentSpeed(); +} + +void Contact::getChildren(int &childA, int &childB) +{ + childA = contact->GetChildIndexA(); + childB = contact->GetChildIndexB(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/Contact.h b/jni/love/src/modules/physics/box2d/Contact.h new file mode 100644 index 00000000..c68ff22c --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Contact.h @@ -0,0 +1,161 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_CONTACT_H +#define LOVE_PHYSICS_BOX2D_CONTACT_H + +// LOVE +#include "common/Object.h" +#include "common/runtime.h" +#include "World.h" + +// Box2D +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +class World; + +/** + * A Contact represents a collision point between + * two shapes. + **/ +class Contact : public Object +{ +public: + // Friends. + friend class World; + friend class World::ContactCallback; + + /** + * Creates a new Contact by copying a Box2D contact + * point. It does not store the pointer, but copy the + * data pointed to. + * @param contact Pointer to the Box2D contact. + **/ + Contact(b2Contact *contact); + + virtual ~Contact(); + + /** + * Removes the b2Contact pointer from Memoizer and sets it + * to null on the Contact. + **/ + void invalidate(); + + /** + * Returns if the Contact still points to a valid b2Contact. + * @return True if the contact is still valid or false if it has been destroyed. + **/ + bool isValid(); + + /** + * Gets the position of each point of contact. + * @return The position along the x-axis. + * @return The position along the y-axis. + **/ + int getPositions(lua_State *L); + + /** + * Gets the collision normal. + * @return The x-component of the normal. + * @return The y-component of the normal. + **/ + int getNormal(lua_State *L); + + /** + * The mixed friction between the two fixtures at + * the point of impact. + **/ + float getFriction() const; + + /** + * The mixed restitution of the two fixtures + * at the point of impact. + **/ + float getRestitution() const; + + /** + * Check if the contact is enabled. + **/ + bool isEnabled() const; + + /** + * Check if the contact is touching. + **/ + bool isTouching() const; + + // Only call the setters in PreSolve + + /** + * Override the default friction mixture. + **/ + void setFriction(float friction); + + /** + * Override the default restitution mixture. + **/ + void setRestitution(float restitution); + + /** + * Enable/disable this contact. + **/ + void setEnabled(bool enabled); + + /** + * Reset the friction mixture to the default + * value. + **/ + void resetFriction(); + + /** + * Reset the restitution mixture to the default + * value. + **/ + void resetRestitution(); + + /** + * Set the desired tangent speed. + **/ + void setTangentSpeed(float speed); + + /** + * Get the desired tangent speed. + **/ + float getTangentSpeed() const; + + void getChildren(int &childA, int &childB); + +private: + + // The Box2D contact. + b2Contact *contact; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_CONTACT_H diff --git a/jni/love/src/modules/physics/box2d/DistanceJoint.cpp b/jni/love/src/modules/physics/box2d/DistanceJoint.cpp new file mode 100644 index 00000000..2f73ea9a --- /dev/null +++ b/jni/love/src/modules/physics/box2d/DistanceJoint.cpp @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "DistanceJoint.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +DistanceJoint::DistanceJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, bool collideConnected) + : Joint(body1, body2) + , joint(NULL) +{ + b2DistanceJointDef def; + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x1,y1)), Physics::scaleDown(b2Vec2(x2,y2))); + def.collideConnected = collideConnected; + joint = (b2DistanceJoint *)createJoint(&def); +} + +DistanceJoint::~DistanceJoint() +{ +} + +void DistanceJoint::setLength(float length) +{ + joint->SetLength(Physics::scaleDown(length)); +} + +float DistanceJoint::getLength() const +{ + return Physics::scaleUp(joint->GetLength()); +} + +void DistanceJoint::setFrequency(float hz) +{ + joint->SetFrequency(hz); +} + +float DistanceJoint::getFrequency() const +{ + return joint->GetFrequency(); +} + +void DistanceJoint::setDampingRatio(float d) +{ + joint->SetDampingRatio(d); +} + +float DistanceJoint::getDampingRatio() const +{ + return joint->GetDampingRatio(); +} + + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/DistanceJoint.h b/jni/love/src/modules/physics/box2d/DistanceJoint.h new file mode 100644 index 00000000..9b49f7d2 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/DistanceJoint.h @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_DISTANCE_JOINT_H +#define LOVE_PHYSICS_BOX2D_DISTANCE_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * The DistanceJoint keeps Bodies at a fixed distance + * from eachother. + **/ +class DistanceJoint : public Joint +{ +public: + + /** + * Creates a DistanceJoint connecting body1 to body2. + **/ + DistanceJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, bool collideConnected); + + virtual ~DistanceJoint(); + + /** + * Sets the equilibrium distance between the two bodies. + **/ + void setLength(float length); + + /** + * Gets the equilibrium distance between the two bodies. + **/ + float getLength() const; + + /** + * Sets the response speed. + **/ + void setFrequency(float hz); + + /** + * Gets the response speed. + **/ + float getFrequency() const; + + /** + * Sets the damping ratio. + * 0 = no damping, 1 = critical damping. + **/ + void setDampingRatio(float d); + + /** + * Gets the damping ratio. + * 0 = no damping, 1 = critical damping. + **/ + float getDampingRatio() const; + +private: + // The Box2D DistanceJoint object. + b2DistanceJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_DISTANCE_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/EdgeShape.cpp b/jni/love/src/modules/physics/box2d/EdgeShape.cpp new file mode 100644 index 00000000..f120ee98 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/EdgeShape.cpp @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "EdgeShape.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +#include "common/Memoizer.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +EdgeShape::EdgeShape(b2EdgeShape *e, bool own) + : Shape(e, own) +{ +} + +EdgeShape::~EdgeShape() +{ +} + +int EdgeShape::getPoints(lua_State *L) +{ + b2EdgeShape *e = (b2EdgeShape *)shape; + b2Vec2 v1 = Physics::scaleUp(e->m_vertex1); + b2Vec2 v2 = Physics::scaleUp(e->m_vertex2); + lua_pushnumber(L, v1.x); + lua_pushnumber(L, v1.y); + lua_pushnumber(L, v2.x); + lua_pushnumber(L, v2.y); + return 4; + +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/EdgeShape.h b/jni/love/src/modules/physics/box2d/EdgeShape.h new file mode 100644 index 00000000..ffebe745 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/EdgeShape.h @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_EDGE_SHAPE_H +#define LOVE_PHYSICS_BOX2D_EDGE_SHAPE_H + +// Module +#include "Shape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * An Edge is just a line segment. Edges are designed to + * be connected and/or chained together. + **/ +class EdgeShape : public Shape +{ +public: + + /** + * Create a new EdgeShape from a Box2D edge shape. + * @param e The edge shape. + **/ + EdgeShape(b2EdgeShape *e, bool own = true); + + virtual ~EdgeShape(); + + /** + * Returns the transformed points of the edge shape. + * This function is useful for debug drawing and such. + * + * The result can be directly passed into love.graphics.line(). + **/ + int getPoints(lua_State *L); +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_EDGE_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/Fixture.cpp b/jni/love/src/modules/physics/box2d/Fixture.cpp new file mode 100644 index 00000000..26b1b957 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Fixture.cpp @@ -0,0 +1,325 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Fixture.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +#include "common/Memoizer.h" + +// STD +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Fixture::Fixture(Body *body, Shape *shape, float density) + : body(body) + , fixture(NULL) +{ + data = new fixtureudata(); + data->ref = 0; + b2FixtureDef def; + def.shape = shape->shape; + def.userData = (void *)data; + def.density = density; + fixture = body->body->CreateFixture(&def); + this->retain(); + Memoizer::add(fixture, this); +} + +Fixture::Fixture(b2Fixture *f) + : fixture(f) +{ + data = (fixtureudata *)f->GetUserData(); + body = (Body *)Memoizer::find(f->GetBody()); + if (!body) + body = new Body(f->GetBody()); + this->retain(); + Memoizer::add(fixture, this); +} + +Fixture::~Fixture() +{ + if (data->ref != 0) + delete data->ref; + + delete data; + data = NULL; + + fixture = NULL; +} + +Shape::Type Fixture::getType() const +{ + return Shape(fixture->GetShape(), false).getType(); +} + +void Fixture::setFriction(float friction) +{ + fixture->SetFriction(friction); +} + +void Fixture::setRestitution(float restitution) +{ + fixture->SetRestitution(restitution); +} + +void Fixture::setDensity(float density) +{ + fixture->SetDensity(density); +} + +void Fixture::setSensor(bool sensor) +{ + fixture->SetSensor(sensor); +} + +float Fixture::getFriction() const +{ + return fixture->GetFriction(); +} + +float Fixture::getRestitution() const +{ + return fixture->GetRestitution(); +} + +float Fixture::getDensity() const +{ + return fixture->GetDensity(); +} + +bool Fixture::isSensor() const +{ + return fixture->IsSensor(); +} + +Body *Fixture::getBody() const +{ + return body; +} + +Shape *Fixture::getShape() const +{ + if (!fixture->GetShape()) + return NULL; + + return new Shape(fixture->GetShape(), false); +} + +bool Fixture::isValid() const +{ + return fixture != 0; +} + +void Fixture::setFilterData(int *v) +{ + b2Filter f; + f.categoryBits = (uint16) v[0]; + f.maskBits = (uint16) v[1]; + f.groupIndex = (int16) v[2]; + fixture->SetFilterData(f); +} + +void Fixture::getFilterData(int *v) +{ + b2Filter f = fixture->GetFilterData(); + v[0] = (int) f.categoryBits; + v[1] = (int) f.maskBits; + v[2] = (int) f.groupIndex; +} + +int Fixture::setCategory(lua_State *L) +{ + b2Filter f = fixture->GetFilterData(); + f.categoryBits = (uint16)getBits(L); + fixture->SetFilterData(f); + return 0; +} + +int Fixture::setMask(lua_State *L) +{ + b2Filter f = fixture->GetFilterData(); + f.maskBits = ~(uint16)getBits(L); + fixture->SetFilterData(f); + return 0; +} + +void Fixture::setGroupIndex(int index) +{ + b2Filter f = fixture->GetFilterData(); + f.groupIndex = (uint16)index; + fixture->SetFilterData(f); +} + +int Fixture::getGroupIndex() const +{ + b2Filter f = fixture->GetFilterData(); + return f.groupIndex; +} + +int Fixture::getCategory(lua_State *L) +{ + return pushBits(L, fixture->GetFilterData().categoryBits); +} + +int Fixture::getMask(lua_State *L) +{ + return pushBits(L, ~(fixture->GetFilterData().maskBits)); +} + +uint16 Fixture::getBits(lua_State *L) +{ + // Get number of args. + int argc = lua_gettop(L); + + // The new bitset. + std::bitset<16> b; + + for (int i = 1; i<=argc; i++) + { + size_t bpos = (size_t)(lua_tointeger(L, i)-1); + if (bpos >= 16) + return luaL_error(L, "Values must be in range 1-16."); + b.set(bpos, true); + } + + return (uint16)b.to_ulong(); +} + +int Fixture::pushBits(lua_State *L, uint16 bits) +{ + // Create a bitset. + std::bitset<16> b((int)bits); + + // Push all set bits. + for (int i = 0; i<16; i++) + if (b.test(i)) + lua_pushinteger(L, i+1); + + // Count number of set bits. + return (int)b.count(); +} + +int Fixture::setUserData(lua_State *L) +{ + love::luax_assert_argc(L, 1, 1); + + if (data->ref != 0) + { + delete data->ref; + data->ref = 0; + } + + data->ref = new Reference(L); + return 0; +} + +int Fixture::getUserData(lua_State *L) +{ + love::luax_assert_argc(L, 0, 0); + if (data->ref != 0) + data->ref->push(); + else + lua_pushnil(L); + + return 1; +} + +bool Fixture::testPoint(float x, float y) const +{ + return fixture->TestPoint(Physics::scaleDown(b2Vec2(x, y))); +} + +int Fixture::rayCast(lua_State *L) const +{ + float p1x = Physics::scaleDown((float)luaL_checknumber(L, 1)); + float p1y = Physics::scaleDown((float)luaL_checknumber(L, 2)); + float p2x = Physics::scaleDown((float)luaL_checknumber(L, 3)); + float p2y = Physics::scaleDown((float)luaL_checknumber(L, 4)); + float maxFraction = (float)luaL_checknumber(L, 5); + int childIndex = (int)luaL_optint(L, 6, 1) - 1; // Convert from 1-based index + b2RayCastInput input; + input.p1.Set(p1x, p1y); + input.p2.Set(p2x, p2y); + input.maxFraction = maxFraction; + b2RayCastOutput output; + if (!fixture->RayCast(&output, input, childIndex)) + return 0; // Nothing hit. + lua_pushnumber(L, output.normal.x); + lua_pushnumber(L, output.normal.y); + lua_pushnumber(L, output.fraction); + return 3; +} + +int Fixture::getBoundingBox(lua_State *L) const +{ + int childIndex = (int)luaL_optint(L, 1, 1) - 1; // Convert from 1-based index + b2AABB box = fixture->GetAABB(childIndex); + box = Physics::scaleUp(box); + lua_pushnumber(L, box.lowerBound.x); + lua_pushnumber(L, box.lowerBound.y); + lua_pushnumber(L, box.upperBound.x); + lua_pushnumber(L, box.upperBound.y); + return 4; +} + +int Fixture::getMassData(lua_State *L) const +{ + b2MassData data; + fixture->GetMassData(&data); + b2Vec2 center = Physics::scaleUp(data.center); + lua_pushnumber(L, center.x); + lua_pushnumber(L, center.y); + lua_pushnumber(L, data.mass); + lua_pushnumber(L, data.I); + return 4; +} + +void Fixture::destroy(bool implicit) +{ + if (body->world->world->IsLocked()) + { + // Called during time step. Save reference for destruction afterwards. + this->retain(); + body->world->destructFixtures.push_back(this); + return; + } + + if (!implicit && fixture != 0) + body->body->DestroyFixture(fixture); + Memoizer::remove(fixture); + fixture = NULL; + + // Box2D fixture destroyed. Release its reference to the love Fixture. + this->release(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/Fixture.h b/jni/love/src/modules/physics/box2d/Fixture.h new file mode 100644 index 00000000..a8d22bf3 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Fixture.h @@ -0,0 +1,225 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_FIXTURE_H +#define LOVE_PHYSICS_BOX2D_FIXTURE_H + +// LOVE +#include "physics/Shape.h" +#include "physics/box2d/Body.h" +#include "physics/box2d/Shape.h" +#include "common/Object.h" +#include "common/Reference.h" + +// Box2D +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * This struct is stored in a void pointer + * in the Box2D Fixture class. For now, all we + * need is a Lua reference to arbitrary data, + * but we might need more later. + **/ +struct fixtureudata +{ + // Reference to arbitrary data. + Reference *ref; +}; + +/** + * A Fixture is used to attach a shape to a body for collision detection. + * A Fixture inherits its transform from its parent. Fixtures hold + * additional non-geometric data such as friction, collision filters, + * etc. + **/ +class Fixture : public Object +{ +public: + friend class Physics; + + /** + * Creates a Fixture. + **/ + Fixture(Body *body, Shape *shape, float density); + + /** + * Creates a Fixture. + **/ + Fixture(b2Fixture *f); + + virtual ~Fixture(); + + /** + * Gets the type of the Fixture's Shape. Useful for + * debug drawing. + **/ + Shape::Type getType() const; + + /** + * Gets the Shape attached to this Fixture. + **/ + Shape *getShape() const; + + /** + * Returns true if the fixture is active in a Box2D world. + **/ + bool isValid() const; + + /** + * Checks whether this Fixture acts as a sensor. + * @return True if sensor, false otherwise. + **/ + bool isSensor() const; + + /** + * Set whether this Fixture should be a sensor or not. + * @param sensor True if sensor, false if not. + **/ + void setSensor(bool sensor); + + /** + * Gets the Body this Fixture is attached to. + **/ + Body *getBody() const; + + /** + * Sets the filter data. An integer array is used even though the + * first two elements are unsigned shorts. The elements are: + * category (16-bits), mask (16-bits) and group (32-bits/int). + **/ + void setFilterData(int *v); + + /** + * Gets the filter data. An integer array is used even though the + * first two elements are unsigned shorts. The elements are: + * category (16-bits), mask (16-bits) and group (32-bits/int). + **/ + void getFilterData(int *v); + + /** + * This function stores an in-C reference to + * arbitrary Lua data in the Box2D Fixture object. + * + * The data set here will be passed to the collision + * handler when collisions occur. + **/ + int setUserData(lua_State *L); + + /** + * Gets the data set with setData. If no + * data is set, nil is returned. + **/ + int getUserData(lua_State *L); + + /** + * Sets the friction of the Fixture. + * @param friction The new friction. + **/ + void setFriction(float friction); + + /** + * Sets the restitution for the Fixture. + * @param restitution The restitution. + **/ + void setRestitution(float restitution); + + /** + * Sets the density of the Fixture. + * @param density The density of the Fixture. + **/ + void setDensity(float density); + + /** + * Gets the friction of the Fixture. + * @returns The friction. + **/ + float getFriction() const; + + /** + * Gets the restitution of the Fixture. + * @return The restitution of the Fixture. + **/ + float getRestitution() const; + + /** + * Gets the density of the Fixture. + * @return The density. + **/ + float getDensity() const; + + /** + * Checks if a point is inside the Fixture. + * @param x The x-component of the point. + * @param y The y-component of the point. + **/ + bool testPoint(float x, float y) const; + + /** + * Cast a ray against this Fixture. + **/ + int rayCast(lua_State *L) const; + + void setGroupIndex(int index); + int getGroupIndex() const; + + int setCategory(lua_State *L); + int setMask(lua_State *L); + int getCategory(lua_State *L); + int getMask(lua_State *L); + uint16 getBits(lua_State *L); + int pushBits(lua_State *L, uint16 bits); + + /** + * Gets the bounding box for this Fixture. + * The function returns eight values which can be + * passed directly to love.graphics.polygon. + **/ + int getBoundingBox(lua_State *L) const; + + /** + * Gets the mass data for this Fixture. + * This operation may be expensive. + **/ + int getMassData(lua_State *L) const; + + /** + * Destroys this fixture. + **/ + void destroy(bool implicit = false); + +protected: + + Body *body; + fixtureudata *data; + b2Fixture *fixture; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_FIXTURE_H diff --git a/jni/love/src/modules/physics/box2d/FrictionJoint.cpp b/jni/love/src/modules/physics/box2d/FrictionJoint.cpp new file mode 100644 index 00000000..38e7416c --- /dev/null +++ b/jni/love/src/modules/physics/box2d/FrictionJoint.cpp @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "FrictionJoint.h" + +#include "common/math.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +FrictionJoint::FrictionJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected) + : Joint(body1, body2) + , joint(NULL) +{ + b2FrictionJointDef def; + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA))); + def.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB))); + def.collideConnected = collideConnected; + joint = (b2FrictionJoint *)createJoint(&def); +} + +FrictionJoint::~FrictionJoint() +{ +} + +void FrictionJoint::setMaxForce(float force) +{ + joint->SetMaxForce(Physics::scaleDown(force)); +} + +float FrictionJoint::getMaxForce() const +{ + return Physics::scaleUp(joint->GetMaxForce()); +} + +void FrictionJoint::setMaxTorque(float torque) +{ + joint->SetMaxTorque(Physics::scaleDown(Physics::scaleDown(torque))); +} + +float FrictionJoint::getMaxTorque() const +{ + return Physics::scaleUp(Physics::scaleUp(joint->GetMaxTorque())); +} + + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/FrictionJoint.h b/jni/love/src/modules/physics/box2d/FrictionJoint.h new file mode 100644 index 00000000..d8047dcd --- /dev/null +++ b/jni/love/src/modules/physics/box2d/FrictionJoint.h @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_FRICTION_JOINT_H +#define LOVE_PHYSICS_BOX2D_FRICTION_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * A FrictionJoint applies friction to a body. + **/ +class FrictionJoint : public Joint +{ +public: + + /** + * Creates a new FrictionJoint connecting body1 and body2. + **/ + FrictionJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected); + + virtual ~FrictionJoint(); + + /** + * Sets the maximum friction force in Newtons. + **/ + void setMaxForce(float force); + + /** + * Gets the maximum friction force in Newtons. + **/ + float getMaxForce() const; + + /** + * Sets the maximum friction torque in Newton-meters. + **/ + void setMaxTorque(float torque); + + /** + * Gets the maximum friction torque in Newton-meters. + **/ + float getMaxTorque() const; + +private: + + // The Box2D friction joint object. + b2FrictionJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_FRICTION_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/GearJoint.cpp b/jni/love/src/modules/physics/box2d/GearJoint.cpp new file mode 100644 index 00000000..faa9a7cf --- /dev/null +++ b/jni/love/src/modules/physics/box2d/GearJoint.cpp @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "GearJoint.h" + +// Module +#include "Body.h" +#include "World.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +GearJoint::GearJoint(Joint *joint1, Joint *joint2, float ratio, bool collideConnected) + : Joint(joint1->body2, joint2->body2) + , joint(NULL) +{ + b2GearJointDef def; + def.joint1 = joint1->joint; + def.joint2 = joint2->joint; + def.bodyA = joint1->body2->body; + def.bodyB = joint2->body2->body; + def.ratio = ratio; + def.collideConnected = collideConnected; + + joint = (b2GearJoint *)createJoint(&def); +} + +GearJoint::~GearJoint() +{ +} + +void GearJoint::setRatio(float ratio) +{ + joint->SetRatio(ratio); +} + +float GearJoint::getRatio() const +{ + return joint->GetRatio(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/GearJoint.h b/jni/love/src/modules/physics/box2d/GearJoint.h new file mode 100644 index 00000000..167bca0c --- /dev/null +++ b/jni/love/src/modules/physics/box2d/GearJoint.h @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_GEAR_JOINT_H +#define LOVE_PHYSICS_BOX2D_GEAR_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * A gear joint is used to connect two joints together. Either joint + * can be a revolute or prismatic joint. You specify a gear ratio + * to bind the motions together: + * coordinate1 + ratio * coordinate2 = constant + * + * The ratio can be negative or positive. If one joint is a revolute joint + * and the other joint is a prismatic joint, then the ratio will have units + * of length or units of 1/length. + * Warning: The revolute and prismatic joints must be attached to + * fixed bodies (which must be body1 on those joints). + **/ +class GearJoint : public Joint +{ +public: + + /** + * Creates a GearJoint connecting joint1 to joint2. + **/ + GearJoint(Joint *joint1, Joint *joint2, float ratio, bool collideConnected); + + virtual ~GearJoint(); + + /** + * Sets the ratio. + **/ + void setRatio(float ratio); + + /** + * Gets the ratio. + **/ + float getRatio() const; + +private: + // The Box2D GearJoint object. + b2GearJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_GEAR_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/Joint.cpp b/jni/love/src/modules/physics/box2d/Joint.cpp new file mode 100644 index 00000000..539a0bc1 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Joint.cpp @@ -0,0 +1,156 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Joint.h" + +// STD +#include + +// LOVE +#include "common/Memoizer.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Joint::Joint(Body *body1) + : world(body1->world) + , body1(body1) + , body2(0) +{ +} + +Joint::Joint(Body *body1, Body *body2) + : world(body1->world) + , body1(body1) + , body2(body2) +{ +} + +Joint::~Joint() +{ +} + +Joint::Type Joint::getType() const +{ + switch (joint->GetType()) + { + case e_revoluteJoint: + return JOINT_REVOLUTE; + case e_prismaticJoint: + return JOINT_PRISMATIC; + case e_distanceJoint: + return JOINT_DISTANCE; + case e_pulleyJoint: + return JOINT_PULLEY; + case e_mouseJoint: + return JOINT_MOUSE; + case e_gearJoint: + return JOINT_GEAR; + case e_frictionJoint: + return JOINT_FRICTION; + case e_weldJoint: + return JOINT_WELD; + case e_wheelJoint: + return JOINT_WHEEL; + case e_ropeJoint: + return JOINT_ROPE; + default: + return JOINT_INVALID; + } +} + +bool Joint::isValid() const +{ + return joint != 0; +} + +int Joint::getAnchors(lua_State *L) +{ + lua_pushnumber(L, Physics::scaleUp(joint->GetAnchorA().x)); + lua_pushnumber(L, Physics::scaleUp(joint->GetAnchorA().y)); + lua_pushnumber(L, Physics::scaleUp(joint->GetAnchorB().x)); + lua_pushnumber(L, Physics::scaleUp(joint->GetAnchorB().y)); + return 4; +} + +int Joint::getReactionForce(lua_State *L) +{ + float dt = (float)luaL_checknumber(L, 1); + b2Vec2 v = Physics::scaleUp(joint->GetReactionForce(dt)); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + return 2; +} + +float Joint::getReactionTorque(float dt) +{ + return Physics::scaleUp(Physics::scaleUp(joint->GetReactionTorque(dt))); +} + +b2Joint *Joint::createJoint(b2JointDef *def) +{ + joint = world->world->CreateJoint(def); + Memoizer::add(joint, this); + // Box2D joint has a reference to this love Joint. + this->retain(); + return joint; +} + +void Joint::destroyJoint(bool implicit) +{ + if (world->world->IsLocked()) + { + // Called during time step. Save reference for destruction afterwards. + this->retain(); + world->destructJoints.push_back(this); + return; + } + + if (!implicit && joint != 0) + world->world->DestroyJoint(joint); + Memoizer::remove(joint); + joint = NULL; + // Release the reference of the Box2D joint. + this->release(); +} + +bool Joint::isActive() const +{ + return joint->IsActive(); +} + +bool Joint::getCollideConnected() const +{ + return joint->GetCollideConnected(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/Joint.h b/jni/love/src/modules/physics/box2d/Joint.h new file mode 100644 index 00000000..14aa0e9a --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Joint.h @@ -0,0 +1,137 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_JOINT_H +#define LOVE_PHYSICS_BOX2D_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "physics/Joint.h" + +// Box2D +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +// Forward declarations. +class Body; +class World; + +/** + * A Joint acts as positioning constraints on Bodies. + * A Joint can be used to prevent Bodies from going to + * far apart, or coming too close together. + **/ +class Joint : public love::physics::Joint +{ +public: + friend class GearJoint; + + /** + * This constructor will connect one end of the joint to body1, + * and the other one to the default ground body. + * + * This constructor is mainly used by MouseJoint. + **/ + Joint(Body *body1); + + /** + * Create a joint between body1 and body2. + **/ + Joint(Body *body1, Body *body2); + + virtual ~Joint(); + + /** + * Returns true if the joint is active in a Box2D world. + **/ + bool isValid() const; + + + /** + * Gets the type of joint. + **/ + Type getType() const; + + /** + * Gets the anchor positions of the Joint in world + * coordinates. This is useful for debugdrawing the joint. + **/ + int getAnchors(lua_State *L); + + /** + * Gets the reaction force on body2 at the joint anchor. + **/ + int getReactionForce(lua_State *L); + + /** + * Gets the reaction torque on body2. + **/ + float getReactionTorque(float dt); + + bool isActive() const; + + bool getCollideConnected() const; + + /** + * Joints require pointers to a Box2D joint objects at + * different polymorphic levels, which is why these function + * were created. + **/ + + /** + * Destroys the joint. This function was created just to + * get some cinsistency. + **/ + void destroyJoint(bool implicit = false); + +protected: + + /** + * Creates a Joint, and ensures that the parent class + * gets a copy of the pointer. + **/ + b2Joint *createJoint(b2JointDef *def); + + World *world; + +private: + + // A Joint must be destroyed *before* the bodies it acts upon, + // and the world they reside in. We therefore need refs + // parents and associations to prevent wrong destruction order. + Body *body1, * body2; + + + // The Box2D joint object. + b2Joint *joint; + +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/MotorJoint.cpp b/jni/love/src/modules/physics/box2d/MotorJoint.cpp new file mode 100644 index 00000000..bcf4003e --- /dev/null +++ b/jni/love/src/modules/physics/box2d/MotorJoint.cpp @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "MotorJoint.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +MotorJoint::MotorJoint(Body *body1, Body *body2) + : Joint(body1, body2) + , joint(NULL) +{ + b2MotorJointDef def; + + def.Initialize(body1->body, body2->body); + joint = (b2MotorJoint *) createJoint(&def); +} + +MotorJoint::MotorJoint(Body *body1, Body *body2, float correctionFactor) + : Joint(body1, body2) + , joint(NULL) +{ + b2MotorJointDef def; + + def.Initialize(body1->body, body2->body); + def.correctionFactor = correctionFactor; + + joint = (b2MotorJoint *) createJoint(&def); +} + +MotorJoint::~MotorJoint() +{ +} + +void MotorJoint::setLinearOffset(float x, float y) +{ + joint->SetLinearOffset(Physics::scaleDown(b2Vec2(x, y))); +} + +int MotorJoint::getLinearOffset(lua_State *L) const +{ + lua_pushnumber(L, Physics::scaleUp(joint->GetLinearOffset().x)); + lua_pushnumber(L, Physics::scaleUp(joint->GetLinearOffset().y)); + return 2; +} + +void MotorJoint::setAngularOffset(float angularOffset) +{ + joint->SetAngularOffset(angularOffset); +} + +float MotorJoint::getAngularOffset() const +{ + return joint->GetAngularOffset(); +} + +void MotorJoint::setMaxForce(float force) +{ + joint->SetMaxForce(Physics::scaleDown(force)); +} + +float MotorJoint::getMaxForce() const +{ + return Physics::scaleUp(joint->GetMaxForce()); +} + +void MotorJoint::setMaxTorque(float torque) +{ + joint->SetMaxTorque(Physics::scaleDown(Physics::scaleDown(torque))); +} + +float MotorJoint::getMaxTorque() const +{ + return Physics::scaleUp(Physics::scaleUp(joint->GetMaxTorque())); +} + +void MotorJoint::setCorrectionFactor(float factor) +{ + joint->SetCorrectionFactor(factor); +} + +float MotorJoint::getCorrectionFactor() const +{ + return joint->GetCorrectionFactor(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/MotorJoint.h b/jni/love/src/modules/physics/box2d/MotorJoint.h new file mode 100644 index 00000000..6e54d8f2 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/MotorJoint.h @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_MOTOR_JOINT_H +#define LOVE_PHYSICS_BOX2D_MOTOR_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * A motor joint is used to control the relative motion + * between two bodies. A typical usage is to control the movement + * of a dynamic body with respect to the ground. + */ +class MotorJoint : public Joint +{ +public: + + MotorJoint(Body *body1, Body* body2); + MotorJoint(Body *body1, Body* body2, float correctionFactor); + virtual ~MotorJoint(); + + /// Set/get the target linear offset, in frame A, in meters. + void setLinearOffset(float x, float y); + int getLinearOffset(lua_State *L) const; + + /// Set/get the target angular offset, in radians. + void setAngularOffset(float angularOffset); + float getAngularOffset() const; + + /// Set the maximum friction force. + void setMaxForce(float force); + + /// Get the maximum friction force. + float getMaxForce() const; + + /// Set the maximum friction torque. + void setMaxTorque(float torque); + + /// Get the maximum friction torque. + float getMaxTorque() const; + + /// Set the position correction factor in the range [0,1]. + void setCorrectionFactor(float factor); + + /// Get the position correction factor in the range [0,1]. + float getCorrectionFactor() const; + +private: + + // The Box2D MotorJoint object. + b2MotorJoint *joint; + +}; // MotorJoint + + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_MOTOR_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/MouseJoint.cpp b/jni/love/src/modules/physics/box2d/MouseJoint.cpp new file mode 100644 index 00000000..2d2b0f18 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/MouseJoint.cpp @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "MouseJoint.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +MouseJoint::MouseJoint(Body *body1, float x, float y) + : Joint(body1) + , joint(NULL) +{ + b2MouseJointDef def; + + def.bodyA = body1->world->getGroundBody(); + def.bodyB = body1->body; + def.maxForce = 1000.0f * body1->body->GetMass(); + def.target = Physics::scaleDown(b2Vec2(x,y)); + joint = (b2MouseJoint *)createJoint(&def); +} + +MouseJoint::~MouseJoint() +{ +} + +void MouseJoint::setTarget(float x, float y) +{ + joint->SetTarget(Physics::scaleDown(b2Vec2(x, y))); +} + +int MouseJoint::getTarget(lua_State *L) +{ + lua_pushnumber(L, Physics::scaleUp(joint->GetTarget().x)); + lua_pushnumber(L, Physics::scaleUp(joint->GetTarget().y)); + return 2; +} + +void MouseJoint::setMaxForce(float force) +{ + joint->SetMaxForce(Physics::scaleDown(force)); +} + +float MouseJoint::getMaxForce() const +{ + return Physics::scaleUp(joint->GetMaxForce()); +} + +void MouseJoint::setFrequency(float hz) +{ + joint->SetFrequency(hz); +} + +float MouseJoint::getFrequency() const +{ + return joint->GetFrequency(); +} + +void MouseJoint::setDampingRatio(float d) +{ + joint->SetDampingRatio(d); +} + +float MouseJoint::getDampingRatio() const +{ + return joint->GetDampingRatio(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/MouseJoint.h b/jni/love/src/modules/physics/box2d/MouseJoint.h new file mode 100644 index 00000000..4a8c73f8 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/MouseJoint.h @@ -0,0 +1,108 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_MOUSE_JOINT_H +#define LOVE_PHYSICS_BOX2D_MOUSE_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * The MouseJoint is a joint type that + * is suitable for controlling objects with the mouse. + * + * One end is anchored in the dynamic body, and the other id + * anchor to a static ground body. The anchor offset can then be + * moved to the current mouse position. + **/ +class MouseJoint : public Joint +{ +public: + + /** + * Creates a MouseJoint which connects body1 to the target point. + **/ + MouseJoint(Body *body1, float x, float y); + + virtual ~MouseJoint(); + + /** + * Sets the target of anchor2. (You usually want + * to set this to the current mouse.) + **/ + void setTarget(float x, float y); + + /** + * Gets the current anchor2 target. + **/ + int getTarget(lua_State *L); + + /** + * Sets the maximum constraint force that can be exerted + * to move the candidate body. + **/ + void setMaxForce(float force); + + /** + * Gets the maximum constraint force that can be exerted + * to move the candidate body. + **/ + float getMaxForce() const; + + /** + * Sets the response speed. + **/ + void setFrequency(float hz); + + /** + * Gets the response speed. + **/ + float getFrequency() const; + + /** + * Sets the damping ratio. + * 0 = no damping, 1 = critical damping. + **/ + void setDampingRatio(float d); + + /** + * Gets the damping ratio. + * 0 = no damping, 1 = critical damping. + **/ + float getDampingRatio() const; + +private: + // The Box2D MouseJoint object. + b2MouseJoint *joint; +}; + +} // box2d +} // physics +} // love + + +#endif // LOVE_PHYSICS_BOX2D_MOUSE_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/Physics.cpp b/jni/love/src/modules/physics/box2d/Physics.cpp new file mode 100644 index 00000000..24830e68 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Physics.cpp @@ -0,0 +1,325 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Physics.h" + +// LOVE +#include "common/math.h" +#include "wrap_Body.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +int Physics::meter = Physics::DEFAULT_METER; + +const char *Physics::getName() const +{ + return "love.physics.box2d"; +} + +World *Physics::newWorld(float gx, float gy, bool sleep) +{ + return new World(b2Vec2(gx, gy), sleep); +} + +Body *Physics::newBody(World *world, float x, float y, Body::Type type) +{ + return new Body(world, b2Vec2(x, y), type); +} + +Body *Physics::newBody(World *world, Body::Type type) +{ + return new Body(world, b2Vec2(0, 0), type); +} + +CircleShape *Physics::newCircleShape(float radius) +{ + return newCircleShape(0, 0, radius); +} + +CircleShape *Physics::newCircleShape(float x, float y, float radius) +{ + b2CircleShape *s = new b2CircleShape(); + s->m_p = Physics::scaleDown(b2Vec2(x, y)); + s->m_radius = Physics::scaleDown(radius); + return new CircleShape(s); +} + +PolygonShape *Physics::newRectangleShape(float w, float h) +{ + return newRectangleShape(0, 0, w, h, 0); +} + +PolygonShape *Physics::newRectangleShape(float x, float y, float w, float h) +{ + return newRectangleShape(x, y, w, h, 0); +} + +PolygonShape *Physics::newRectangleShape(float x, float y, float w, float h, float angle) +{ + b2PolygonShape *s = new b2PolygonShape(); + s->SetAsBox(Physics::scaleDown(w/2.0f), Physics::scaleDown(h/2.0f), Physics::scaleDown(b2Vec2(x, y)), angle); + return new PolygonShape(s); +} + +EdgeShape *Physics::newEdgeShape(float x1, float y1, float x2, float y2) +{ + b2EdgeShape *s = new b2EdgeShape(); + s->Set(Physics::scaleDown(b2Vec2(x1, y1)), Physics::scaleDown(b2Vec2(x2, y2))); + return new EdgeShape(s); +} + +int Physics::newPolygonShape(lua_State *L) +{ + int argc = lua_gettop(L); + if (argc%2 != 0) + return luaL_error(L, "Number of vertices must be a multiple of two."); + // 3 to 8 (b2_maxPolygonVertices) vertices + int vcount = argc / 2; + if (vcount < 3) + return luaL_error(L, "Expected a minimum of 3 vertices, got %d.", vcount); + else if (vcount > b2_maxPolygonVertices) + return luaL_error(L, "Expected a maximum of %d vertices, got %d.", b2_maxPolygonVertices, vcount); + + b2PolygonShape *s = new b2PolygonShape(); + + b2Vec2 vecs[b2_maxPolygonVertices]; + + for (int i = 0; i < vcount; i++) + { + float x = (float)luaL_checknumber(L, 1 + i * 2); + float y = (float)luaL_checknumber(L, 2 + i * 2); + vecs[i] = Physics::scaleDown(b2Vec2(x, y)); + } + + try + { + s->Set(vecs, vcount); + } + catch (love::Exception &) + { + delete s; + throw; + } + + PolygonShape *p = new PolygonShape(s); + + luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, p); + return 1; +} + +int Physics::newChainShape(lua_State *L) +{ + int argc = lua_gettop(L)-1; // first argument is looping + int vcount = (int)argc/2; + + b2ChainShape *s = new b2ChainShape(); + + bool loop = luax_toboolean(L, 1); + + b2Vec2 *vecs = new b2Vec2[vcount]; + + for (int i = 0; iCreateLoop(vecs, vcount); + else + s->CreateChain(vecs, vcount); + + ChainShape *c = new ChainShape(s); + delete[] vecs; + + luax_pushtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, c); + + return 1; +} + +DistanceJoint *Physics::newDistanceJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, bool collideConnected) +{ + return new DistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected); +} + +MouseJoint *Physics::newMouseJoint(Body *body, float x, float y) +{ + return new MouseJoint(body, x, y); +} + +RevoluteJoint *Physics::newRevoluteJoint(Body *body1, Body *body2, float x, float y, bool collideConnected) +{ + return new RevoluteJoint(body1, body2, x, y, collideConnected); +} + +PrismaticJoint *Physics::newPrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected) +{ + return new PrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected); +} + +PulleyJoint *Physics::newPulleyJoint(Body *body1, Body *body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio, bool collideConnected) +{ + return new PulleyJoint(body1, body2, groundAnchor1, groundAnchor2, anchor1, anchor2, ratio, collideConnected); +} + +GearJoint *Physics::newGearJoint(Joint *joint1, Joint *joint2, float ratio, bool collideConnected) +{ + return new GearJoint(joint1, joint2, ratio, collideConnected); +} + +FrictionJoint *Physics::newFrictionJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected) +{ + return new FrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected); +} + +WeldJoint *Physics::newWeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected) +{ + return new WeldJoint(body1, body2, xA, yA, xB, yB, collideConnected); +} + +WheelJoint *Physics::newWheelJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected) +{ + return new WheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected); +} + +RopeJoint *Physics::newRopeJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected) +{ + return new RopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected); +} + +MotorJoint *Physics::newMotorJoint(Body *body1, Body *body2) +{ + return new MotorJoint(body1, body2); +} + +MotorJoint *Physics::newMotorJoint(Body *body1, Body *body2, float correctionFactor) +{ + return new MotorJoint(body1, body2, correctionFactor); +} + + +Fixture *Physics::newFixture(Body *body, Shape *shape, float density) +{ + return new Fixture(body, shape, density); +} + +int Physics::getDistance(lua_State *L) +{ + Fixture *fixtureA = luax_checktype(L, 1, "Fixture", PHYSICS_FIXTURE_T); + Fixture *fixtureB = luax_checktype(L, 2, "Fixture", PHYSICS_FIXTURE_T); + b2DistanceProxy pA, pB; + b2DistanceInput i; + b2DistanceOutput o; + b2SimplexCache c; + c.count = 0; + + EXCEPT_GUARD( + pA.Set(fixtureA->fixture->GetShape(), 0); + pB.Set(fixtureB->fixture->GetShape(), 0); + i.proxyA = pA; + i.proxyB = pB; + i.transformA = fixtureA->fixture->GetBody()->GetTransform(); + i.transformB = fixtureB->fixture->GetBody()->GetTransform(); + i.useRadii = true; + b2Distance(&o, &c, &i); + ) + + lua_pushnumber(L, Physics::scaleUp(o.distance)); + lua_pushnumber(L, Physics::scaleUp(o.pointA.x)); + lua_pushnumber(L, Physics::scaleUp(o.pointA.y)); + lua_pushnumber(L, Physics::scaleUp(o.pointB.x)); + lua_pushnumber(L, Physics::scaleUp(o.pointB.y)); + return 5; +} + +void Physics::setMeter(int scale) +{ + if (scale < 1) throw love::Exception("Physics error: invalid meter"); + Physics::meter = scale; +} + +int Physics::getMeter() +{ + return meter; +} + +void Physics::scaleDown(float &x, float &y) +{ + x /= (float)meter; + y /= (float)meter; +} + +void Physics::scaleUp(float &x, float &y) +{ + x *= (float)meter; + y *= (float)meter; +} + +float Physics::scaleDown(float f) +{ + return f/(float)meter; +} + +float Physics::scaleUp(float f) +{ + return f*(float)meter; +} + +b2Vec2 Physics::scaleDown(const b2Vec2 &v) +{ + b2Vec2 t = v; + scaleDown(t.x, t.y); + return t; +} + +b2Vec2 Physics::scaleUp(const b2Vec2 &v) +{ + b2Vec2 t = v; + scaleUp(t.x, t.y); + return t; +} + +b2AABB Physics::scaleDown(const b2AABB &aabb) +{ + b2AABB t; + t.lowerBound = scaleDown(aabb.lowerBound); + t.upperBound = scaleDown(aabb.upperBound); + return t; +} + +b2AABB Physics::scaleUp(const b2AABB &aabb) +{ + b2AABB t; + t.lowerBound = scaleUp(aabb.lowerBound); + t.upperBound = scaleUp(aabb.upperBound); + return t; +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/Physics.h b/jni/love/src/modules/physics/box2d/Physics.h new file mode 100644 index 00000000..c82f9a53 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Physics.h @@ -0,0 +1,357 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_PHYSICS_H +#define LOVE_PHYSICS_BOX2D_PHYSICS_H + +// LOVE +#include "common/Module.h" +#include "World.h" +#include "Contact.h" +#include "Body.h" +#include "Fixture.h" +#include "Shape.h" +#include "CircleShape.h" +#include "PolygonShape.h" +#include "EdgeShape.h" +#include "ChainShape.h" +#include "Joint.h" +#include "MouseJoint.h" +#include "DistanceJoint.h" +#include "PrismaticJoint.h" +#include "RevoluteJoint.h" +#include "PulleyJoint.h" +#include "GearJoint.h" +#include "FrictionJoint.h" +#include "WeldJoint.h" +#include "WheelJoint.h" +#include "RopeJoint.h" +#include "MotorJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +class Physics : public Module +{ +public: + + /** + * 30 pixels in one meter by default. + **/ + static const int DEFAULT_METER = 30; + + // Implements Module. + const char *getName() const; + + /** + * Creates a new World. + * @param gx Gravity along x-axis. + * @param gy Gravity along y-axis. + * @param sleep Whether the World allows sleep. + **/ + World *newWorld(float gx, float gy, bool sleep); + + /** + * Creates a new Body at the specified position. + * @param world The world to create the Body in. + * @param x The position along the x-axis. + * @param y The position along the y-axis. + * @param type The type of body to create. + **/ + Body *newBody(World *world, float x, float y, Body::Type type); + + /** + * Creates a new Body at (0, 0) + * @param world The world to create the Body in. + * @param type The type of Body to create. + **/ + Body *newBody(World *world, Body::Type type); + + /** + * Creates a new CircleShape at (0, 0). + * @param radius The radius of the circle. + **/ + CircleShape *newCircleShape(float radius); + + /** + * Creates a new CircleShape at (x,y) in local coordinates. + * @param x The offset along the x-axis. + * @param y The offset along the y-axis. + * @param radius The radius of the circle. + **/ + CircleShape *newCircleShape(float x, float y, float radius); + + /** + * Shorthand for creating rectangular PolygonShapes. The rectangle + * will be created at the local origin. + * @param w The width of the rectangle. + * @param h The height of the rectangle. + **/ + PolygonShape *newRectangleShape(float w, float h); + + /** + * Shorthand for creating rectangular PolygonShapes. The rectangle + * will be created at (x,y) in local coordinates. + * @param x The offset along the x-axis. + * @param y The offset along the y-axis. + * @param w The width of the rectangle. + * @param h The height of the rectangle. + **/ + PolygonShape *newRectangleShape(float x, float y, float w, float h); + + /** + * Shorthand for creating rectangular PolygonShapes. The rectangle + * will be created at (x,y) in local coordinates. + * @param x The offset along the x-axis. + * @param y The offset along the y-axis. + * @param w The width of the rectangle. + * @param h The height of the rectangle. + * @param angle The angle of the rectangle. (rad) + **/ + PolygonShape *newRectangleShape(float x, float y, float w, float h, float angle); + + /** + * Creates a new EdgeShape. The edge will be created from + * (x1,y1) to (x2,y2) in local coordinates. + * @param x1 The x coordinate of the first point. + * @param y1 The y coordinate of the first point. + * @param x2 The x coordinate of the second point. + * @param y2 The y coordinate of the second point. + **/ + EdgeShape *newEdgeShape(float x1, float y1, float x2, float y2); + + /** + * Creates a new PolygonShape from a variable number of vertices. + **/ + int newPolygonShape(lua_State *L); + + /** + * Creates a new ChainShape from a variable number of vertices. + **/ + int newChainShape(lua_State *L); + + /** + * Creates a new DistanceJoint connecting body1 with body2. + * @param x1 Anchor1 along the x-axis. (World coordinates) + * @param y1 Anchor1 along the y-axis. (World coordinates) + * @param x2 Anchor2 along the x-axis. (World coordinates) + * @param y2 Anchor2 along the y-axis. (World coordinates) + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. + **/ + DistanceJoint *newDistanceJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, bool collideConnected); + + /** + * Creates a new MouseJoint connecting the body with an arbitrary point. + * @param x Anchor along the x-axis. (World coordinates) + * @param y Anchor along the y-axis. (World coordinates) + **/ + MouseJoint *newMouseJoint(Body *body, float x, float y); + + /** + * Creates a new RevoluteJoint connecting body1 with body2. + * @param x Anchor along the x-axis. (World coordinates) + * @param y Anchor along the y-axis. (World coordinates) + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. + **/ + RevoluteJoint *newRevoluteJoint(Body *body1, Body *body2, float x, float y, bool collideConnected); + + /** + * Creates a new PrismaticJoint connecting body1 with body2. + * @param xA World-anchor for body1 along the x-axis. + * @param yA World-anchor for body1 along the y-axis. + * @param xB World-anchor for body2 along the x-axis. + * @param yB World-anchor for body2 along the y-axis. + * @param ax The x-component of the world-axis. + * @param ay The y-component of the world-axis. + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. + **/ + PrismaticJoint *newPrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected); + + /** + * Creates a new PulleyJoint connecting body1 with body2. + * @param groundAnchor1 World ground-anchor for body1. + * @param groundAnchor2 World ground-anchor for body2. + * @param anchor1 World anchor on body1. + * @param anchor2 World anchor on body2. + * @param ratio The pulley ratio. + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to true. + **/ + PulleyJoint *newPulleyJoint(Body *body1, Body *body2, b2Vec2 groundAnchor1, b2Vec2 groundAnchor2, b2Vec2 anchor1, b2Vec2 anchor2, float ratio, bool collideConnected); + + /** + * Creates a new GearJoint connecting joint1 with joint2. + * @param joint1 The first joint. + * @param joint2 The second joint. + * @param ratio The gear ratio. + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. + **/ + GearJoint *newGearJoint(Joint *joint1, Joint *joint2, float ratio, bool collideConnected); + + /** + * Creates a new FrictionJoint connecting body1 with body2. + * @param xA Anchor for body 1 along the x-axis. (World coordinates) + * @param yA Anchor for body 1 along the y-axis. (World coordinates) + * @param xB Anchor for body 2 along the x-axis. (World coordinates) + * @param yB Anchor for body 2 along the y-axis. (World coordinates) + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. + **/ + FrictionJoint *newFrictionJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected); + + /** + * Creates a new WeldJoint connecting body1 with body2. + * @param xA Anchor for body 1 along the x-axis. (World coordinates) + * @param yA Anchor for body 1 along the y-axis. (World coordinates) + * @param xB Anchor for body 2 along the x-axis. (World coordinates) + * @param yB Anchor for body 2 along the y-axis. (World coordinates) + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. + **/ + WeldJoint *newWeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected); + + /** + * Creates a new WheelJoint connecting body1 with body2. + * @param xA Anchor for body 1 along the x-axis. (World coordinates) + * @param yA Anchor for body 1 along the y-axis. (World coordinates) + * @param xB Anchor for body 2 along the x-axis. (World coordinates) + * @param yB Anchor for body 2 along the y-axis. (World coordinates) + * @param ax The x-component of the world-axis. + * @param ay The y-component of the world-axis. + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. + **/ + WheelJoint *newWheelJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected); + + /** + * Creates a new RopeJoint connecting body1 with body2. + * @param x1 Anchor1 along the x-axis. (Local coordinates) + * @param y1 Anchor1 along the y-axis. (Local coordinates) + * @param x2 Anchor2 along the x-axis. (Local coordinates) + * @param y2 Anchor2 along the y-axis. (Local coordinates) + * @param maxLength The maximum distance for the bodies. + * @param collideConnected Whether the connected bodies should collide with each other. Defaults to false. + **/ + RopeJoint *newRopeJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected); + + /** + * Creates a new MotorJoint controlling the relative motion between body1 + * and body2. + **/ + MotorJoint *newMotorJoint(Body *body1, Body *body2); + MotorJoint *newMotorJoint(Body *body1, Body *body2, float correctionFactor); + + /** + * Creates a new Fixture attaching shape to body. + * @param body The body to attach the Fixture to. + * @param shape The shape to attach to the Fixture, + * @param density The density of the Fixture. + **/ + + Fixture *newFixture(Body *body, Shape *shape, float density); + + /** + * Calculates the distance between two Fixtures. + * @param fixtureA The first Fixture. + * @param fixtureB The sceond Fixture. + * @return The distance between them, and the two points closest + * to each other. + **/ + int getDistance(lua_State *L); + + /** + * Sets the number of pixels in one meter. + * @param scale The number of pixels in one meter. (1m ~= 3.3ft). + **/ + static void setMeter(int scale); + + /** + * Gets the number of pixels in one meter. + * @return The number of pixels in one meter. (1m ~= 3.3ft). + **/ + static int getMeter(); + + /** + * Scales a value down according to the current meter in pixels. + * @param f The unscaled input value. + **/ + static float scaleDown(float f); + + /** + * Scales a value up according to the current meter in pixels. + * @param f The unscaled input value. + **/ + static float scaleUp(float f); + + /** + * Scales a point down according to the current meter + * in pixels, for instance x = x0/meter, y = x0/meter. + * @param x The x-coordinate of the point to scale. + * @param y The y-coordinate of the point to scale. + **/ + static void scaleDown(float &x, float &y); + + /** + * Scales a point up according to the current meter + * in pixels, for instance x = x0/meter, y = x0/meter. + * @param x The x-coordinate of the point to scale. + * @param y The y-coordinate of the point to scale. + **/ + static void scaleUp(float &x, float &y); + + /** + * Scales a b2Vec2 down according to the current meter in pixels. + * @param v The unscaled input vector. + * @return The scaled vector. + **/ + static b2Vec2 scaleDown(const b2Vec2 &v); + + /** + * Scales a b2Vec up according to the current meter in pixels. + * @param v The unscaled input vector. + * @return The scaled vector. + **/ + static b2Vec2 scaleUp(const b2Vec2 &v); + + /** + * Scales a b2AABB down according to the current meter in pixels. + * @param aabb The unscaled input AABB. + * @return The scaled AABB. + **/ + static b2AABB scaleDown(const b2AABB &aabb); + + /** + * Scales a b2AABB up according to the current meter in pixels. + * @param aabb The unscaled input AABB. + * @return The scaled AABB. + **/ + static b2AABB scaleUp(const b2AABB &aabb); + +private: + + // The length of one meter in pixels. + static int meter; +}; // Physics + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_PHYSICS_H diff --git a/jni/love/src/modules/physics/box2d/PolygonShape.cpp b/jni/love/src/modules/physics/box2d/PolygonShape.cpp new file mode 100644 index 00000000..5743008e --- /dev/null +++ b/jni/love/src/modules/physics/box2d/PolygonShape.cpp @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "PolygonShape.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +#include "common/Memoizer.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PolygonShape::PolygonShape(b2PolygonShape *p, bool own) + : Shape(p, own) +{ +} + +PolygonShape::~PolygonShape() +{ +} + +int PolygonShape::getPoints(lua_State *L) +{ + love::luax_assert_argc(L, 0); + b2PolygonShape *p = (b2PolygonShape *)shape; + int count = p->GetVertexCount(); + for (int i = 0; iGetVertex(i)); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + } + return count*2; +} + +bool PolygonShape::validate() const +{ + b2PolygonShape *p = (b2PolygonShape *)shape; + return p->Validate(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/PolygonShape.h b/jni/love/src/modules/physics/box2d/PolygonShape.h new file mode 100644 index 00000000..d6a546a4 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/PolygonShape.h @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_POLYGON_SHAPE_H +#define LOVE_PHYSICS_BOX2D_POLYGON_SHAPE_H + +// Module +#include "Shape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * You should know what a Polygon is. :) + * + * This class is needed so that we can easily get + * the transformed points in Lua. By calling shape:getPoints(), + * the result can be passed directly to love.graphics.polygon(). + **/ +class PolygonShape : public Shape +{ +public: + + /** + * Create a new PolygonShape from a Box2D polygon definition. + * @param p The polygon definition. + **/ + PolygonShape(b2PolygonShape *p, bool own = true); + + virtual ~PolygonShape(); + + /** + * Returns the transformed points of the polygon. + * This function is useful for debug drawing and such. + * + * The result can be directly passed into love.graphics.polygon(). + **/ + int getPoints(lua_State *L); + + /** + * Validate convexity. + **/ + bool validate() const; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_POLYGON_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/PrismaticJoint.cpp b/jni/love/src/modules/physics/box2d/PrismaticJoint.cpp new file mode 100644 index 00000000..05c708f5 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/PrismaticJoint.cpp @@ -0,0 +1,144 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "PrismaticJoint.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PrismaticJoint::PrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected) + : Joint(body1, body2) + , joint(NULL) +{ + b2PrismaticJointDef def; + + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA)), b2Vec2(ax,ay)); + def.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB))); + def.lowerTranslation = 0.0f; + def.upperTranslation = 100.0f; + def.enableLimit = true; + def.collideConnected = collideConnected; + joint = (b2PrismaticJoint *)createJoint(&def); +} + +PrismaticJoint::~PrismaticJoint() +{ +} + +float PrismaticJoint::getJointTranslation() const +{ + return Physics::scaleUp(joint->GetJointTranslation()); +} + +float PrismaticJoint::getJointSpeed() const +{ + return Physics::scaleUp(joint->GetJointSpeed()); +} + +void PrismaticJoint::setMotorEnabled(bool enable) +{ + return joint->EnableMotor(enable); +} + +bool PrismaticJoint::isMotorEnabled() const +{ + return joint->IsMotorEnabled(); +} + +void PrismaticJoint::setMaxMotorForce(float force) +{ + joint->SetMaxMotorForce(Physics::scaleDown(force)); +} + +void PrismaticJoint::setMotorSpeed(float speed) +{ + joint->SetMotorSpeed(Physics::scaleDown(speed)); +} + +float PrismaticJoint::getMotorSpeed() const +{ + return Physics::scaleUp(joint->GetMotorSpeed()); +} + +float PrismaticJoint::getMotorForce(float inv_dt) const +{ + return Physics::scaleUp(joint->GetMotorForce(inv_dt)); +} + +float PrismaticJoint::getMaxMotorForce() const +{ + return Physics::scaleUp(joint->GetMaxMotorForce()); +} + +void PrismaticJoint::setLimitsEnabled(bool enable) +{ + joint->EnableLimit(enable); +} + +bool PrismaticJoint::hasLimitsEnabled() const +{ + return joint->IsLimitEnabled(); +} + +void PrismaticJoint::setUpperLimit(float limit) +{ + joint->SetLimits(joint->GetLowerLimit(), Physics::scaleDown(limit)); +} + +void PrismaticJoint::setLowerLimit(float limit) +{ + joint->SetLimits(Physics::scaleDown(limit), joint->GetUpperLimit()); +} + +void PrismaticJoint::setLimits(float lower, float upper) +{ + joint->SetLimits(Physics::scaleDown(lower), Physics::scaleDown(upper)); +} + +float PrismaticJoint::getLowerLimit() const +{ + return Physics::scaleUp(joint->GetLowerLimit()); +} + +float PrismaticJoint::getUpperLimit() const +{ + return Physics::scaleUp(joint->GetUpperLimit()); +} + +int PrismaticJoint::getLimits(lua_State *L) +{ + lua_pushnumber(L, Physics::scaleUp(joint->GetLowerLimit())); + lua_pushnumber(L, Physics::scaleUp(joint->GetUpperLimit())); + return 2; +} + + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/PrismaticJoint.h b/jni/love/src/modules/physics/box2d/PrismaticJoint.h new file mode 100644 index 00000000..4c42340c --- /dev/null +++ b/jni/love/src/modules/physics/box2d/PrismaticJoint.h @@ -0,0 +1,147 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_PRISMATIC_JOINT_H +#define LOVE_PHYSICS_BOX2D_PRISMATIC_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * PrismaticJoints allow shapes to move in relation to eachother + * along a defined axis. + **/ +class PrismaticJoint : public Joint +{ +public: + + /** + * Creates a new PrismaticJoint connecting body1 and body2. + **/ + PrismaticJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected); + + virtual ~PrismaticJoint(); + + /** + * Get the current joint translation, usually in meters. + **/ + float getJointTranslation() const; + + /** + * Get the current joint translation speed, usually in meters per second. + **/ + float getJointSpeed() const; + + /** + * Enable/disable the joint motor. + **/ + void setMotorEnabled(bool enable); + + /** + * Checks whether the motor is enabled. + **/ + bool isMotorEnabled() const; + + /** + * Set the maximum motor force, usually in N. + **/ + void setMaxMotorForce(float force); + + /** + * Set the motor speed, usually in meters per second. + **/ + void setMotorSpeed(float speed); + + /** + * Get the motor speed, usually in meters per second. + **/ + float getMotorSpeed() const; + + /** + * Get the current motor force, usually in N. + * @param inv_dt The inverse time step. + **/ + float getMotorForce(float inv_dt) const; + + /** + * Get the maximum motor force, usually in N. + **/ + float getMaxMotorForce() const; + + /** + * Enable/disable the joint limits. + **/ + void setLimitsEnabled(bool enable); + + /** + * Checks whether limits are enabled. + **/ + bool hasLimitsEnabled() const; + + /** + * Sets the upper limit, usually in meters. + **/ + void setUpperLimit(float limit); + + /** + * Sets the lower limit, usually in meters. + **/ + void setLowerLimit(float limit); + + /** + * Sets the limits, usually in meters. + **/ + void setLimits(float lower, float upper); + + /** + * Gets the lower limit, usually in meters. + **/ + float getLowerLimit() const; + + /** + * Gets the upper limit, usually in meters. + **/ + float getUpperLimit() const; + + /** + * Gets the limits, usually in meters. + * @returns The upper limit. + * @returns The lower limit. + **/ + int getLimits(lua_State *L); + +private: + + // The Box2D prismatic joint object. + b2PrismaticJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_PRISMATIC_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/PulleyJoint.cpp b/jni/love/src/modules/physics/box2d/PulleyJoint.cpp new file mode 100644 index 00000000..901752af --- /dev/null +++ b/jni/love/src/modules/physics/box2d/PulleyJoint.cpp @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "PulleyJoint.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PulleyJoint::PulleyJoint(Body *bodyA, Body *bodyB, b2Vec2 groundAnchorA, b2Vec2 groundAnchorB, b2Vec2 anchorA, b2Vec2 anchorB, float ratio, bool collideConnected) + : Joint(bodyA, bodyB) + , joint(NULL) +{ + b2PulleyJointDef def; + def.Initialize(bodyA->body, bodyB->body, Physics::scaleDown(groundAnchorA), Physics::scaleDown(groundAnchorB), \ + Physics::scaleDown(anchorA), Physics::scaleDown(anchorB), ratio); + def.collideConnected = collideConnected; + + joint = (b2PulleyJoint *)createJoint(&def); +} + +PulleyJoint::~PulleyJoint() +{ +} + +int PulleyJoint::getGroundAnchors(lua_State *L) +{ + lua_pushnumber(L, Physics::scaleUp(joint->GetGroundAnchorA().x)); + lua_pushnumber(L, Physics::scaleUp(joint->GetGroundAnchorA().y)); + lua_pushnumber(L, Physics::scaleUp(joint->GetGroundAnchorB().x)); + lua_pushnumber(L, Physics::scaleUp(joint->GetGroundAnchorB().y)); + return 4; +} + +float PulleyJoint::getLengthA() const +{ + return Physics::scaleUp(joint->GetLengthA()); +} + +float PulleyJoint::getLengthB() const +{ + return Physics::scaleUp(joint->GetLengthB()); +} + +float PulleyJoint::getRatio() const +{ + return joint->GetRatio(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/PulleyJoint.h b/jni/love/src/modules/physics/box2d/PulleyJoint.h new file mode 100644 index 00000000..3af2f792 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/PulleyJoint.h @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_PULLEY_JOINT_H +#define LOVE_PHYSICS_BOX2D_PULLEY_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * The PulleyJoint The pulley connects two bodies to ground and + * to each other. As one body goes up, the other goes down. The + * total length of the pulley rope is conserved according to the + * initial configuration: length1 + ratio * length2 <= constant. + **/ +class PulleyJoint : public Joint +{ +public: + + /** + * Creates a PulleyJoint connecting bodyA to bodyB. + **/ + PulleyJoint(Body *bodyA, Body *bodyB, b2Vec2 groundAnchorA, b2Vec2 groundAnchorB, b2Vec2 anchorA, b2Vec2 anchorB, float ratio, bool collideConnected); + + virtual ~PulleyJoint(); + + /** + * Gets the ground anchors position in world + * coordinates. + **/ + int getGroundAnchors(lua_State *L); + + /** + * Gets the current length of the segment attached to bodyA. + **/ + float getLengthA() const; + + /** + * Gets the current length of the segment attached to bodyB. + **/ + float getLengthB() const; + + /** + * Gets the pulley ratio. + **/ + float getRatio() const; + +private: + // The Box2D DistanceJoint object. + b2PulleyJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_PULLEY_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/RevoluteJoint.cpp b/jni/love/src/modules/physics/box2d/RevoluteJoint.cpp new file mode 100644 index 00000000..bb5dfba9 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/RevoluteJoint.cpp @@ -0,0 +1,140 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "RevoluteJoint.h" + +#include "common/math.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +RevoluteJoint::RevoluteJoint(Body *body1, Body *body2, float x, float y, bool collideConnected) + : Joint(body1, body2) + , joint(NULL) +{ + b2RevoluteJointDef def; + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(x,y))); + def.collideConnected = collideConnected; + joint = (b2RevoluteJoint *)createJoint(&def); +} + +RevoluteJoint::~RevoluteJoint() +{ +} + +float RevoluteJoint::getJointAngle() const +{ + return joint->GetJointAngle(); +} + +float RevoluteJoint::getJointSpeed() const +{ + return joint->GetJointSpeed(); +} + +void RevoluteJoint::setMotorEnabled(bool enable) +{ + return joint->EnableMotor(enable); +} + +bool RevoluteJoint::isMotorEnabled() const +{ + return joint->IsMotorEnabled(); +} + +void RevoluteJoint::setMaxMotorTorque(float torque) +{ + joint->SetMaxMotorTorque(Physics::scaleDown(Physics::scaleDown(torque))); +} + +void RevoluteJoint::setMotorSpeed(float speed) +{ + joint->SetMotorSpeed(speed); +} + +float RevoluteJoint::getMotorSpeed() const +{ + return joint->GetMotorSpeed(); +} + +float RevoluteJoint::getMotorTorque(float inv_dt) const +{ + return Physics::scaleUp(Physics::scaleUp(joint->GetMotorTorque(inv_dt))); +} + +float RevoluteJoint::getMaxMotorTorque() const +{ + return Physics::scaleUp(Physics::scaleUp(joint->GetMaxMotorTorque())); +} + +void RevoluteJoint::setLimitsEnabled(bool enable) +{ + joint->EnableLimit(enable); +} + +bool RevoluteJoint::hasLimitsEnabled() const +{ + return joint->IsLimitEnabled(); +} + +void RevoluteJoint::setUpperLimit(float limit) +{ + joint->SetLimits(joint->GetLowerLimit(), limit); +} + +void RevoluteJoint::setLowerLimit(float limit) +{ + joint->SetLimits(limit, joint->GetUpperLimit()); +} + +void RevoluteJoint::setLimits(float lower, float upper) +{ + joint->SetLimits(lower, upper); +} + +float RevoluteJoint::getLowerLimit() const +{ + return joint->GetLowerLimit(); +} + +float RevoluteJoint::getUpperLimit() const +{ + return joint->GetUpperLimit(); +} + +int RevoluteJoint::getLimits(lua_State *L) +{ + lua_pushnumber(L, joint->GetLowerLimit()); + lua_pushnumber(L, joint->GetUpperLimit()); + return 2; +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/RevoluteJoint.h b/jni/love/src/modules/physics/box2d/RevoluteJoint.h new file mode 100644 index 00000000..2d2bc82e --- /dev/null +++ b/jni/love/src/modules/physics/box2d/RevoluteJoint.h @@ -0,0 +1,147 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_REVOLUTE_JOINT_H +#define LOVE_PHYSICS_BOX2D_REVOLUTE_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * A RevoluteJoint allows two bodies relative rotation + * around a single point. + **/ +class RevoluteJoint : public Joint +{ +public: + + /** + * Creates a new RevoluteJoint connecting body1 and body2. + **/ + RevoluteJoint(Body *body1, Body *body2, float x, float y, bool collideConnected); + + virtual ~RevoluteJoint(); + + /** + * Get the current joint angle in degrees. + **/ + float getJointAngle() const; + + /** + * Get the current joint angle speed in degrees per second. + **/ + float getJointSpeed() const; + + /** + * Enable/disable the joint motor. + **/ + void setMotorEnabled(bool enable); + + /** + * Checks whether the motor is enabled. + **/ + bool isMotorEnabled() const; + + /** + * Set the maximum motor torque, usually in N-m. + **/ + void setMaxMotorTorque(float torque); + + /** + * Sets the motor speed in radians per second. + **/ + void setMotorSpeed(float speed); + + /** + * Gets the motor speed in radians per second. + **/ + float getMotorSpeed() const; + + /** + * Get the current motor torque, usually in N-m. + * @param inv_dt The inverse timestep. + **/ + float getMotorTorque(float inv_dt) const; + + /** + * Get the maximum motor torque, usually in N-m. + **/ + float getMaxMotorTorque() const; + + /** + * Enable/disable the joint limit. + **/ + void setLimitsEnabled(bool enable); + + /** + * Checks whether limits are enabled. + **/ + bool hasLimitsEnabled() const; + + /** + * Sets the upper limit in degrees. + **/ + void setUpperLimit(float limit); + + /** + * Sets the lower limit in degrees. + **/ + void setLowerLimit(float limit); + + /** + * Sets the limits in degrees. + **/ + void setLimits(float lower, float upper); + + /** + * Gets the lower limit in degrees. + **/ + float getLowerLimit() const; + + /** + * Gets the upper limit in degrees. + **/ + float getUpperLimit() const; + + /** + * Gets the limits in degrees. + * @returns The lower limit. + * @returns The upper limit. + **/ + int getLimits(lua_State *L); + +private: + + // The Box2D revolute joint object. + b2RevoluteJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_REVOLUTE_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/RopeJoint.cpp b/jni/love/src/modules/physics/box2d/RopeJoint.cpp new file mode 100644 index 00000000..a38095b3 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/RopeJoint.cpp @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "RopeJoint.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +RopeJoint::RopeJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected) + : Joint(body1, body2) + , joint(NULL) +{ + b2RopeJointDef def; + def.bodyA = body1->body; + def.bodyB = body2->body; + body1->getLocalPoint(x1, y1, x1, y1); + body2->getLocalPoint(x2, y2, x2, y2); + def.localAnchorA.x = Physics::scaleDown(x1); + def.localAnchorA.y = Physics::scaleDown(y1); + def.localAnchorB.x = Physics::scaleDown(x2); + def.localAnchorB.y = Physics::scaleDown(y2); + def.maxLength = Physics::scaleDown(maxLength); + def.collideConnected = collideConnected; + joint = (b2RopeJoint *)createJoint(&def); +} + +RopeJoint::~RopeJoint() +{ +} + +float RopeJoint::getMaxLength() const +{ + return Physics::scaleUp(joint->GetMaxLength()); +} + + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/RopeJoint.h b/jni/love/src/modules/physics/box2d/RopeJoint.h new file mode 100644 index 00000000..951e0634 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/RopeJoint.h @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_ROPE_JOINT_H +#define LOVE_PHYSICS_BOX2D_ROPE_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * The RopeJoint enforces a maximum distance between two points + * on two bodies. It has no other effect. + **/ +class RopeJoint : public Joint +{ +public: + + /** + * Creates a RopeJoint connecting body1 to body2. + **/ + RopeJoint(Body *body1, Body *body2, float x1, float y1, float x2, float y2, float maxLength, bool collideConnected); + + virtual ~RopeJoint(); + + /** + * Gets the maximum length of the rope. + **/ + float getMaxLength() const; + +private: + // The Box2D RopeJoint object. + b2RopeJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_ROPE_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/Shape.cpp b/jni/love/src/modules/physics/box2d/Shape.cpp new file mode 100644 index 00000000..9d911b17 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Shape.cpp @@ -0,0 +1,155 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Shape.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +#include "common/Memoizer.h" + +// STD +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Shape::Shape() + : shape(NULL) + , own(false) +{ +} + +Shape::Shape(b2Shape *shape, bool own) + : shape(shape) + , own(own) +{ + if (own) + Memoizer::add(shape, this); +} + +Shape::~Shape() +{ + if (shape && own) + { + Memoizer::remove(shape); + delete shape; + } + shape = 0; +} + +Shape::Type Shape::getType() const +{ + switch (shape->GetType()) + { + case b2Shape::e_circle: + return SHAPE_CIRCLE; + case b2Shape::e_polygon: + return SHAPE_POLYGON; + case b2Shape::e_edge: + return SHAPE_EDGE; + case b2Shape::e_chain: + return SHAPE_CHAIN; + default: + return SHAPE_INVALID; + } +} + +float Shape::getRadius() const +{ + return Physics::scaleUp(shape->m_radius); +} + +int Shape::getChildCount() const +{ + return shape->GetChildCount(); +} + +bool Shape::testPoint(float x, float y, float r, float px, float py) const +{ + b2Vec2 point(px, py); + b2Transform transform(Physics::scaleDown(b2Vec2(x, y)), b2Rot(r)); + return shape->TestPoint(transform, Physics::scaleDown(point)); +} + +int Shape::rayCast(lua_State *L) const +{ + float p1x = Physics::scaleDown((float)luaL_checknumber(L, 1)); + float p1y = Physics::scaleDown((float)luaL_checknumber(L, 2)); + float p2x = Physics::scaleDown((float)luaL_checknumber(L, 3)); + float p2y = Physics::scaleDown((float)luaL_checknumber(L, 4)); + float maxFraction = (float)luaL_checknumber(L, 5); + float x = Physics::scaleDown((float)luaL_checknumber(L, 6)); + float y = Physics::scaleDown((float)luaL_checknumber(L, 7)); + float r = (float)luaL_checknumber(L, 8); + int childIndex = (int)luaL_optint(L, 9, 1) - 1; // Convert from 1-based index + b2RayCastInput input; + input.p1.Set(p1x, p1y); + input.p2.Set(p2x, p2y); + input.maxFraction = maxFraction; + b2Transform transform(b2Vec2(x, y), b2Rot(r)); + b2RayCastOutput output; + if (!shape->RayCast(&output, input, transform, childIndex)) + return 0; // No hit. + lua_pushnumber(L, output.normal.x); + lua_pushnumber(L, output.normal.y); + lua_pushnumber(L, output.fraction); + return 3; +} + +int Shape::computeAABB(lua_State *L) const +{ + float x = Physics::scaleDown((float)luaL_checknumber(L, 1)); + float y = Physics::scaleDown((float)luaL_checknumber(L, 2)); + float r = (float)luaL_checknumber(L, 3); + int childIndex = (int)luaL_optint(L, 4, 1) - 1; // Convert from 1-based index + b2Transform transform(b2Vec2(x, y), b2Rot(r)); + b2AABB box; + shape->ComputeAABB(&box, transform, childIndex); + box = Physics::scaleUp(box); + lua_pushnumber(L, box.lowerBound.x); + lua_pushnumber(L, box.lowerBound.y); + lua_pushnumber(L, box.upperBound.x); + lua_pushnumber(L, box.upperBound.y); + return 4; +} + +int Shape::computeMass(lua_State *L) const +{ + float density = (float)luaL_checknumber(L, 1); + b2MassData data; + shape->ComputeMass(&data, density); + b2Vec2 center = Physics::scaleUp(data.center); + lua_pushnumber(L, center.x); + lua_pushnumber(L, center.y); + lua_pushnumber(L, data.mass); + lua_pushnumber(L, Physics::scaleUp(Physics::scaleUp(data.I))); + return 4; +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/Shape.h b/jni/love/src/modules/physics/box2d/Shape.h new file mode 100644 index 00000000..6ce20dcc --- /dev/null +++ b/jni/love/src/modules/physics/box2d/Shape.h @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_SHAPE_H +#define LOVE_PHYSICS_BOX2D_SHAPE_H + +// LOVE +#include "physics/Shape.h" +#include "physics/box2d/Body.h" +#include "common/Reference.h" + +// Box2D +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * A Shape is geometry, attached to a Body via a Fixture. + * A Body has position and orientation, and + * a Shape's geometry will be affected by the parent + * body's transformation. + **/ +class Shape : public love::physics::Shape +{ +public: + + friend class Fixture; + + /** + * Creates a Shape. + **/ + Shape(); + Shape(b2Shape *shape, bool own = true); + + virtual ~Shape(); + + /** + * Gets the type of Shape. Useful for + * debug drawing. + **/ + Type getType() const; + float getRadius() const; + int getChildCount() const; + bool testPoint(float x, float y, float r, float px, float py) const; + int rayCast(lua_State *L) const; + int computeAABB(lua_State *L) const; + int computeMass(lua_State *L) const; + +protected: + + // The Box2D shape. + b2Shape *shape; + bool own; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/WeldJoint.cpp b/jni/love/src/modules/physics/box2d/WeldJoint.cpp new file mode 100644 index 00000000..769ab177 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/WeldJoint.cpp @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "WeldJoint.h" + +#include "common/math.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +WeldJoint::WeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected) + : Joint(body1, body2) + , joint(NULL) +{ + b2WeldJointDef def; + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA))); + def.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB))); + def.collideConnected = collideConnected; + joint = (b2WeldJoint *)createJoint(&def); +} + +WeldJoint::~WeldJoint() +{ +} + +void WeldJoint::setFrequency(float hz) +{ + joint->SetFrequency(hz); +} + +float WeldJoint::getFrequency() const +{ + return joint->GetFrequency(); +} + +void WeldJoint::setDampingRatio(float d) +{ + joint->SetDampingRatio(d); +} + +float WeldJoint::getDampingRatio() const +{ + return joint->GetDampingRatio(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/WeldJoint.h b/jni/love/src/modules/physics/box2d/WeldJoint.h new file mode 100644 index 00000000..5cc08beb --- /dev/null +++ b/jni/love/src/modules/physics/box2d/WeldJoint.h @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WELD_JOINT_H +#define LOVE_PHYSICS_BOX2D_WELD_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * A WeldJoint essentially glues two bodies together. + **/ +class WeldJoint : public Joint +{ +public: + + /** + * Creates a new WeldJoint connecting body1 and body2. + **/ + WeldJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, bool collideConnected); + + virtual ~WeldJoint(); + + /** + * Sets the response speed. + **/ + void setFrequency(float hz); + + /** + * Gets the response speed. + **/ + float getFrequency() const; + + /** + * Sets the damping ratio. + * 0 = no damping, 1 = critical damping. + **/ + void setDampingRatio(float d); + + /** + * Gets the damping ratio. + * 0 = no damping, 1 = critical damping. + **/ + float getDampingRatio() const; + +private: + + // The Box2D weld joint object. + b2WeldJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WELD_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/WheelJoint.cpp b/jni/love/src/modules/physics/box2d/WheelJoint.cpp new file mode 100644 index 00000000..2de0bd05 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/WheelJoint.cpp @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "WheelJoint.h" + +// Module +#include "Body.h" +#include "World.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +WheelJoint::WheelJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected) + : Joint(body1, body2) + , joint(NULL) +{ + b2WheelJointDef def; + + def.Initialize(body1->body, body2->body, Physics::scaleDown(b2Vec2(xA,yA)), b2Vec2(ax,ay)); + def.localAnchorB = body2->body->GetLocalPoint(Physics::scaleDown(b2Vec2(xB, yB))); + def.collideConnected = collideConnected; + joint = (b2WheelJoint *)createJoint(&def); +} + +WheelJoint::~WheelJoint() +{ +} + +float WheelJoint::getJointTranslation() const +{ + return Physics::scaleUp(joint->GetJointTranslation()); +} + +float WheelJoint::getJointSpeed() const +{ + return Physics::scaleUp(joint->GetJointSpeed()); +} + +void WheelJoint::setMotorEnabled(bool enable) +{ + return joint->EnableMotor(enable); +} + +bool WheelJoint::isMotorEnabled() const +{ + return joint->IsMotorEnabled(); +} + +void WheelJoint::setMotorSpeed(float speed) +{ + joint->SetMotorSpeed(speed); +} + +float WheelJoint::getMotorSpeed() const +{ + return joint->GetMotorSpeed(); +} + +void WheelJoint::setMaxMotorTorque(float torque) +{ + joint->SetMaxMotorTorque(Physics::scaleDown(Physics::scaleDown(torque))); +} + +float WheelJoint::getMaxMotorTorque() const +{ + return Physics::scaleUp(Physics::scaleUp(joint->GetMaxMotorTorque())); +} + +float WheelJoint::getMotorTorque(float inv_dt) const +{ + return Physics::scaleUp(Physics::scaleUp(joint->GetMotorTorque(inv_dt))); +} + +void WheelJoint::setSpringFrequency(float hz) +{ + joint->SetSpringFrequencyHz(hz); +} + +float WheelJoint::getSpringFrequency() const +{ + return joint->GetSpringFrequencyHz(); +} + +void WheelJoint::setSpringDampingRatio(float ratio) +{ + joint->SetSpringDampingRatio(ratio); +} + +float WheelJoint::getSpringDampingRatio() const +{ + return joint->GetSpringDampingRatio(); +} + + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/WheelJoint.h b/jni/love/src/modules/physics/box2d/WheelJoint.h new file mode 100644 index 00000000..bc5961f7 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/WheelJoint.h @@ -0,0 +1,127 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WHEEL_JOINT_H +#define LOVE_PHYSICS_BOX2D_WHEEL_JOINT_H + +// Module +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +/** + * WheelJoints provide two degrees of freedom: translation + * along a defined axis and rotation in the plane. Designed + * for vehicle suspensions. + **/ +class WheelJoint : public Joint +{ +public: + + /** + * Creates a new WheelJoint connecting body1 and body2. + **/ + WheelJoint(Body *body1, Body *body2, float xA, float yA, float xB, float yB, float ax, float ay, bool collideConnected); + + virtual ~WheelJoint(); + + /** + * Get the current joint translation, usually in meters. + **/ + float getJointTranslation() const; + + /** + * Get the current joint translation speed, usually in meters per second. + **/ + float getJointSpeed() const; + + /** + * Enable/disable the joint motor. + **/ + void setMotorEnabled(bool enable); + + /** + * Checks whether the motor is enabled. + **/ + bool isMotorEnabled() const; + + /** + * Set the motor speed, usually in meters per second. + **/ + void setMotorSpeed(float speed); + + /** + * Get the motor speed, usually in meters per second. + **/ + float getMotorSpeed() const; + + /** + * Set the maximum motor torque, usually in N. + **/ + void setMaxMotorTorque(float torque); + + /** + * Get the maximum motor torque, usually in N. + **/ + float getMaxMotorTorque() const; + + /** + * Get the current motor torque, usually in N. + * @param inv_dt The inverse time step. + **/ + float getMotorTorque(float inv_dt) const; + + /** + * Set the spring frequency, in hertz. Setting the frequency to 0 + * disables the spring. + **/ + void setSpringFrequency(float hz); + + /** + * Get the spring frequency, in hertz. + **/ + float getSpringFrequency() const; + + /** + * Set the spring damping ratio. + **/ + void setSpringDampingRatio(float ratio); + + /** + * Get the spring damping ratio. + **/ + float getSpringDampingRatio() const; + +private: + + // The Box2D wheel joint object. + b2WheelJoint *joint; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WHEEL_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/World.cpp b/jni/love/src/modules/physics/box2d/World.cpp new file mode 100644 index 00000000..d870c9db --- /dev/null +++ b/jni/love/src/modules/physics/box2d/World.cpp @@ -0,0 +1,567 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "World.h" + +#include "Fixture.h" +#include "Shape.h" +#include "Contact.h" +#include "Physics.h" +#include "common/Memoizer.h" +#include "common/Reference.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +World::ContactCallback::ContactCallback() + : ref(0) +{ +} + +World::ContactCallback::~ContactCallback() +{ + if (ref != 0) + delete ref; +} + +void World::ContactCallback::process(b2Contact *contact, const b2ContactImpulse *impulse) +{ + // Process contacts. + if (ref != 0) + { + lua_State *L = ref->getL(); + ref->push(); + + // Push first fixture. + { + Fixture *a = (Fixture *)Memoizer::find(contact->GetFixtureA()); + if (a != 0) + { + a->retain(); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, a); + } + else + throw love::Exception("A fixture has escaped Memoizer!"); + } + + // Push second fixture. + { + Fixture *b = (Fixture *)Memoizer::find(contact->GetFixtureB()); + if (b != 0) + { + b->retain(); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, b); + } + else + throw love::Exception("A fixture has escaped Memoizer!"); + } + + Contact *cobj = (Contact *)Memoizer::find(contact); + if (!cobj) + cobj = new Contact(contact); + else + cobj->retain(); + + luax_pushtype(L, "Contact", (PHYSICS_CONTACT_T), cobj); + + int args = 3; + if (impulse) + { + for (int c = 0; c < impulse->count; c++) + { + lua_pushnumber(L, Physics::scaleUp(impulse->normalImpulses[c])); + lua_pushnumber(L, Physics::scaleUp(impulse->tangentImpulses[c])); + args += 2; + } + } + lua_call(L, args, 0); + } + +} + +World::ContactFilter::ContactFilter() + : ref(0) +{ +} + +World::ContactFilter::~ContactFilter() +{ + if (ref != 0) + delete ref; +} + +bool World::ContactFilter::process(Fixture *a, Fixture *b) +{ + // Handle masks, reimplemented from the manual + int filterA[3], filterB[3]; + // [0] categoryBits + // [1] maskBits + // [2] groupIndex + a->getFilterData(filterA); + b->getFilterData(filterB); + + if (filterA[2] != 0 && // 0 is the default group, so this does not count + filterA[2] == filterB[2]) // if they are in the same group + return filterA[2] > 0; // Negative indexes mean you don't collide + + if ((filterA[1] & filterB[0]) == 0 || + (filterB[1] & filterA[0]) == 0) + return false; // A and B aren't set to collide + + if (ref != 0) + { + lua_State *L = ref->getL(); + ref->push(); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, a); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, b); + lua_call(L, 2, 1); + return luax_toboolean(L, -1); + } + return true; +} + +World::QueryCallback::QueryCallback() + : ref(0) +{ +} + +World::QueryCallback::~QueryCallback() +{ + if (ref != 0) + delete ref; +} + +bool World::QueryCallback::ReportFixture(b2Fixture *fixture) +{ + if (ref != 0) + { + lua_State *L = ref->getL(); + ref->push(); + Fixture *f = (Fixture *)Memoizer::find(fixture); + if (!f) + throw love::Exception("A fixture has escaped Memoizer!"); + f->retain(); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, f); + lua_call(L, 1, 1); + return luax_toboolean(L, -1); + } + return true; +} + +World::RayCastCallback::RayCastCallback() + : ref(0) +{ +} + +World::RayCastCallback::~RayCastCallback() +{ + if (ref != 0) + delete ref; +} + +float32 World::RayCastCallback::ReportFixture(b2Fixture *fixture, const b2Vec2 &point, const b2Vec2 &normal, float32 fraction) +{ + if (ref != 0) + { + lua_State *L = ref->getL(); + ref->push(); + Fixture *f = (Fixture *)Memoizer::find(fixture); + if (!f) + throw love::Exception("A fixture has escaped Memoizer!"); + f->retain(); + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, f); + b2Vec2 scaledPoint = Physics::scaleUp(point); + lua_pushnumber(L, scaledPoint.x); + lua_pushnumber(L, scaledPoint.y); + lua_pushnumber(L, normal.x); + lua_pushnumber(L, normal.y); + lua_pushnumber(L, fraction); + lua_call(L, 6, 1); + if (!lua_isnumber(L, -1)) + luaL_error(L, "Raycast callback didn't return a number!"); + return (float32)lua_tonumber(L, -1); + } + return 0; +} + +void World::SayGoodbye(b2Fixture *fixture) +{ + Fixture *f = (Fixture *)Memoizer::find(fixture); + // Hint implicit destruction with true. + if (f) f->destroy(true); +} + +void World::SayGoodbye(b2Joint *joint) +{ + Joint *j = (Joint *)Memoizer::find(joint); + // Hint implicit destruction with true. + if (j) j->destroyJoint(true); +} + +World::World() + : world(NULL), destructWorld(false) +{ + world = new b2World(b2Vec2(0,0)); + this->retain(); // The Box2D world holds a reference to this World. + world->SetAllowSleeping(true); + world->SetContactListener(this); + world->SetContactFilter(this); + world->SetDestructionListener(this); + b2BodyDef def; + groundBody = world->CreateBody(&def); + Memoizer::add(world, this); +} + +World::World(b2Vec2 gravity, bool sleep) + : world(NULL), destructWorld(false) +{ + world = new b2World(Physics::scaleDown(gravity)); + // The Box2D world holds a reference to this World. + this->retain(); + world->SetAllowSleeping(sleep); + world->SetContactListener(this); + world->SetContactFilter(this); + world->SetDestructionListener(this); + b2BodyDef def; + groundBody = world->CreateBody(&def); + Memoizer::add(world, this); +} + +World::~World() +{ +} + +void World::update(float dt) +{ + world->Step(dt, 8, 6); + + // Destroy all objects marked during the time step. + for (auto i = destructBodies.begin(); i < destructBodies.end(); i++) + { + Body *b = *i; + if (b->body != 0) b->destroy(); + // Release for reference in vector. + b->release(); + } + for (auto i = destructFixtures.begin(); i < destructFixtures.end(); i++) + { + Fixture *f = *i; + if (f->isValid()) f->destroy(); + // Release for reference in vector. + f->release(); + } + for (auto i = destructJoints.begin(); i < destructJoints.end(); i++) + { + Joint *j = *i; + if (j->isValid()) j->destroyJoint(); + // Release for reference in vector. + j->release(); + } + destructBodies.clear(); + destructFixtures.clear(); + destructJoints.clear(); + + if (destructWorld) + destroy(); +} + +void World::BeginContact(b2Contact *contact) +{ + begin.process(contact); +} + +void World::EndContact(b2Contact *contact) +{ + end.process(contact); + + // Letting the Contact know that the b2Contact will be destroyed any second. + Contact *c = (Contact *)Memoizer::find(contact); + if (c != NULL) + c->invalidate(); +} + +void World::PreSolve(b2Contact *contact, const b2Manifold *oldManifold) +{ + B2_NOT_USED(oldManifold); // not sure what to do with this + presolve.process(contact); +} + +void World::PostSolve(b2Contact *contact, const b2ContactImpulse *impulse) +{ + postsolve.process(contact, impulse); +} + +bool World::ShouldCollide(b2Fixture *fixtureA, b2Fixture *fixtureB) +{ + // Fixtures should be memoized, if we created them + Fixture *a = (Fixture *)Memoizer::find(fixtureA); + if (!a) + throw love::Exception("A fixture has escaped Memoizer!"); + a->retain(); + Fixture *b = (Fixture *)Memoizer::find(fixtureB); + if (!b) + throw love::Exception("A fixture has escaped Memoizer!"); + b->retain(); + return filter.process(a, b); +} + +bool World::isValid() const +{ + return world != 0; +} + +int World::setCallbacks(lua_State *L) +{ + int n = lua_gettop(L); + luax_assert_argc(L, 1, 4); + + switch (n) + { + case 4: + if (postsolve.ref) + delete postsolve.ref; + postsolve.ref = luax_refif(L, LUA_TFUNCTION); + case 3: + if (presolve.ref) + delete presolve.ref; + presolve.ref = luax_refif(L, LUA_TFUNCTION); + case 2: + if (end.ref) + delete end.ref; + end.ref = luax_refif(L, LUA_TFUNCTION); + case 1: + if (begin.ref) + delete begin.ref; + begin.ref = luax_refif(L, LUA_TFUNCTION); + } + + return 0; +} + +int World::getCallbacks(lua_State *L) +{ + begin.ref ? begin.ref->push() : lua_pushnil(L); + end.ref ? end.ref->push() : lua_pushnil(L); + presolve.ref ? presolve.ref->push() : lua_pushnil(L); + postsolve.ref ? postsolve.ref->push() : lua_pushnil(L); + return 4; +} + +int World::setContactFilter(lua_State *L) +{ + luax_assert_argc(L, 1); + if (filter.ref) + delete filter.ref; + filter.ref = luax_refif(L, LUA_TFUNCTION); + return 0; +} + +int World::getContactFilter(lua_State *L) +{ + filter.ref ? filter.ref->push() : lua_pushnil(L); + return 1; +} + +void World::setGravity(float x, float y) +{ + world->SetGravity(Physics::scaleDown(b2Vec2(x, y))); +} + +int World::getGravity(lua_State *L) +{ + b2Vec2 v = Physics::scaleUp(world->GetGravity()); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + return 2; +} + +void World::translateOrigin(float x, float y) +{ + world->ShiftOrigin(Physics::scaleDown(b2Vec2(x, y))); +} + +void World::setSleepingAllowed(bool allow) +{ + world->SetAllowSleeping(allow); +} + +bool World::isSleepingAllowed() const +{ + return world->GetAllowSleeping(); +} + +bool World::isLocked() const +{ + return world->IsLocked(); +} + +int World::getBodyCount() const +{ + return world->GetBodyCount()-1; // ignore the ground body +} + +int World::getJointCount() const +{ + return world->GetJointCount(); +} + +int World::getContactCount() const +{ + return world->GetContactCount(); +} + +int World::getBodyList(lua_State *L) const +{ + lua_newtable(L); + b2Body *b = world->GetBodyList(); + int i = 1; + do + { + if (!b) + break; + if (b == groundBody) + continue; + Body *body = (Body *)Memoizer::find(b); + if (!body) + throw love::Exception("A body has escaped Memoizer!"); + body->retain(); + luax_pushtype(L, "Body", PHYSICS_BODY_T, body); + lua_rawseti(L, -2, i); + i++; + } + while ((b = b->GetNext())); + return 1; +} + +int World::getJointList(lua_State *L) const +{ + lua_newtable(L); + b2Joint *j = world->GetJointList(); + int i = 1; + do + { + if (!j) break; + Joint *joint = (Joint *)Memoizer::find(j); + if (!joint) throw love::Exception("A joint has escaped Memoizer!"); + joint->retain(); + luax_pushtype(L, "Joint", PHYSICS_JOINT_T, joint); + lua_rawseti(L, -2, i); + i++; + } + while ((j = j->GetNext())); + return 1; +} + +int World::getContactList(lua_State *L) const +{ + lua_newtable(L); + b2Contact *c = world->GetContactList(); + int i = 1; + do + { + if (!c) break; + Contact *contact = (Contact *)Memoizer::find(c); + if (!contact) + contact = new Contact(c); + else + contact->retain(); + luax_pushtype(L, "Contact", PHYSICS_CONTACT_T, contact); + lua_rawseti(L, -2, i); + i++; + } + while ((c = c->GetNext())); + return 1; +} + +b2Body *World::getGroundBody() const +{ + return groundBody; +} + +int World::queryBoundingBox(lua_State *L) +{ + luax_assert_argc(L, 5); + b2AABB box; + float lx = (float)luaL_checknumber(L, 1); + float ly = (float)luaL_checknumber(L, 2); + float ux = (float)luaL_checknumber(L, 3); + float uy = (float)luaL_checknumber(L, 4); + box.lowerBound = Physics::scaleDown(b2Vec2(lx, ly)); + box.upperBound = Physics::scaleDown(b2Vec2(ux, uy)); + if (query.ref) delete query.ref; + query.ref = luax_refif(L, LUA_TFUNCTION); + world->QueryAABB(&query, box); + return 0; +} + +int World::rayCast(lua_State *L) +{ + luax_assert_argc(L, 5); + float x1 = (float)luaL_checknumber(L, 1); + float y1 = (float)luaL_checknumber(L, 2); + float x2 = (float)luaL_checknumber(L, 3); + float y2 = (float)luaL_checknumber(L, 4); + b2Vec2 v1 = Physics::scaleDown(b2Vec2(x1, y1)); + b2Vec2 v2 = Physics::scaleDown(b2Vec2(x2, y2)); + if (raycast.ref) + delete raycast.ref; + raycast.ref = luax_refif(L, LUA_TFUNCTION); + world->RayCast(&raycast, v1, v2); + return 0; +} + +void World::destroy() +{ + if (world->IsLocked()) + { + destructWorld = true; + return; + } + + // Cleaning up the world. + b2Body *b = world->GetBodyList(); + while (b) + { + b2Body *t = b; + b = b->GetNext(); + if (t == groundBody) + continue; + Body *body = (Body *)Memoizer::find(t); + if (!body) + throw love::Exception("A body has escaped Memoizer!"); + body->destroy(); + } + + world->DestroyBody(groundBody); + Memoizer::remove(world); + delete world; + world = 0; + + // Box2D world destroyed. Release its reference. + this->release(); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/World.h b/jni/love/src/modules/physics/box2d/World.h new file mode 100644 index 00000000..c1f8483e --- /dev/null +++ b/jni/love/src/modules/physics/box2d/World.h @@ -0,0 +1,292 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WORLD_H +#define LOVE_PHYSICS_BOX2D_WORLD_H + +// LOVE +#include "common/Object.h" +#include "common/runtime.h" +#include "common/Reference.h" + +// STD +#include + +// Box2D +#include + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +class Contact; +class Body; +class Fixture; +class Joint; + +/** + * The World is the "God" container class, + * which contains all Bodies and Joints. Shapes + * are contained in their associated Body. + * + * Bodies in different worlds can obviously not + * collide. + * + * The world also controls global parameters, like + * gravity. + **/ +class World : public Object, public b2ContactListener, public b2ContactFilter, public b2DestructionListener +{ +public: + + // Friends. + friend class Joint; + friend class DistanceJoint; + friend class MouseJoint; + friend class Body; + friend class Fixture; + + class ContactCallback + { + public: + Reference *ref; + ContactCallback(); + ~ContactCallback(); + void process(b2Contact *contact, const b2ContactImpulse *impulse = NULL); + }; + + class ContactFilter + { + public: + Reference *ref; + ContactFilter(); + ~ContactFilter(); + bool process(Fixture *a, Fixture *b); + }; + + class QueryCallback : public b2QueryCallback + { + public: + Reference *ref; + QueryCallback(); + ~QueryCallback(); + virtual bool ReportFixture(b2Fixture *fixture); + }; + + class RayCastCallback : public b2RayCastCallback + { + public: + Reference *ref; + RayCastCallback(); + ~RayCastCallback(); + virtual float32 ReportFixture(b2Fixture *fixture, const b2Vec2 &point, const b2Vec2 &normal, float32 fraction); + }; + + /** + * Creates a new world. + **/ + World(); + + /** + * Creates a new world with the given gravity + * and whether or not the bodies should sleep when appropriate. + * @param gravity The gravity of the World. + * @param sleep True if the bodies should be able to sleep, + * false otherwise. + **/ + World(b2Vec2 gravity, bool sleep); + + virtual ~World(); + + /** + * Updates everything in the world one timestep. + * This is called update() and not step() to conform + * with all other objects in LOVE. + * @param dt The timestep. + **/ + void update(float dt); + + // From b2ContactListener + void BeginContact(b2Contact *contact); + void EndContact(b2Contact *contact); + void PreSolve(b2Contact *contact, const b2Manifold *oldManifold); + void PostSolve(b2Contact *contact, const b2ContactImpulse *impulse); + + // From b2ContactFilter + bool ShouldCollide(b2Fixture *fixtureA, b2Fixture *fixtureB); + + // From b2DestructionListener + void SayGoodbye(b2Fixture *fixture); + void SayGoodbye(b2Joint *joint); + + /** + * Returns true if the Box2D world is alive. + **/ + bool isValid() const; + + /** + * Receives up to four Lua functions as arguments. Each function is + * collision callback for the four events (in order): begin, end, + * presolve and postsolve. The value "nil" is accepted if one or + * more events are uninteresting. + **/ + int setCallbacks(lua_State *L); + + /** + * Returns the functions previously set by setCallbacks. + **/ + int getCallbacks(lua_State *L); + + /** + * Sets the ContactFilter callback. + **/ + int setContactFilter(lua_State *L); + + /** + * Gets the ContactFilter callback. + **/ + int getContactFilter(lua_State *L); + + /** + * Sets the current gravity of the World. + * @param x Gravity in the x-direction. + * @param y Gravity in the y-direction. + **/ + void setGravity(float x, float y); + + /** + * Gets the current gravity. + * @returns Gravity in the x-direction. + * @returns Gravity in the y-direction. + **/ + int getGravity(lua_State *L); + + /** + * Translate the world origin. + * @param x The new world origin's x-coordinate relative to the old origin. + * @param y The new world origin's y-coordinate relative to the old origin. + **/ + void translateOrigin(float x, float y); + + /** + * Sets whether this World allows sleep. + * @param allow True to allow, false to disallow. + **/ + void setSleepingAllowed(bool allow); + + /** + * Returns whether this World allows sleep. + * @return True if allowed, false if disallowed. + **/ + bool isSleepingAllowed() const; + + /** + * Returns whether this World is currently locked. + * If it's locked, it's in the middle of a timestep. + * @return Whether the World is locked. + **/ + bool isLocked() const; + + /** + * Get the current body count. + * @return The number of bodies. + **/ + int getBodyCount() const; + + /** + * Get the current joint count. + * @return The number of joints. + **/ + int getJointCount() const; + + /** + * Get the current contact count. + * @return The number of contacts. + **/ + int getContactCount() const; + + /** + * Get an array of all the Bodies in the World. + * @return An array of Bodies. + **/ + int getBodyList(lua_State *L) const; + + /** + * Get an array of all the Joints in the World. + * @return An array of Joints. + **/ + int getJointList(lua_State *L) const; + + /** + * Get an array of all the Contacts in the World. + * @return An array of Contacts. + **/ + int getContactList(lua_State *L) const; + + /** + * Gets the ground body. + * @return The ground body. + **/ + b2Body *getGroundBody() const; + + /** + * Gets all fixtures that overlap a given bounding box. + **/ + int queryBoundingBox(lua_State *L); + + /** + * Raycasts the World for all Fixtures in the path of the ray. + **/ + int rayCast(lua_State *L); + + /** + * Destroy this world. + **/ + void destroy(); + +private: + + // Pointer to the Box2D world. + b2World *world; + + // Ground body + b2Body *groundBody; + + // The list of to be destructed bodies. + std::vector destructBodies; + std::vector destructFixtures; + std::vector destructJoints; + bool destructWorld; + + // Contact callbacks. + ContactCallback begin, end, presolve, postsolve; + ContactFilter filter; + QueryCallback query; + RayCastCallback raycast; +}; + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WORLD_H diff --git a/jni/love/src/modules/physics/box2d/wrap_Body.cpp b/jni/love/src/modules/physics/box2d/wrap_Body.cpp new file mode 100644 index 00000000..4f182655 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Body.cpp @@ -0,0 +1,605 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Body.h" +#include "wrap_Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Body *luax_checkbody(lua_State *L, int idx) +{ + Body *b = luax_checktype(L, idx, "Body", PHYSICS_BODY_T); + if (b->body == 0) + luaL_error(L, "Attempt to use destroyed body."); + return b; +} + +int w_Body_getX(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getX()); + return 1; +} + +int w_Body_getY(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getY()); + return 1; +} + +int w_Body_getAngle(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getAngle()); + return 1; +} + +int w_Body_getPosition(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x_o, y_o; + t->getPosition(x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getLinearVelocity(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x_o, y_o; + t->getLinearVelocity(x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getWorldCenter(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x_o, y_o; + t->getWorldCenter(x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getLocalCenter(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x_o, y_o; + t->getLocalCenter(x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getAngularVelocity(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getAngularVelocity()); + return 1; +} + +int w_Body_getMass(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getMass()); + return 1; +} + +int w_Body_getInertia(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getInertia()); + return 1; +} + +int w_Body_getMassData(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_remove(L, 1); + return t->getMassData(L); +} + +int w_Body_getAngularDamping(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getAngularDamping()); + return 1; +} + +int w_Body_getLinearDamping(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getLinearDamping()); + return 1; +} + +int w_Body_getGravityScale(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushnumber(L, t->getGravityScale()); + return 1; +} + +int w_Body_getType(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + const char *type = ""; + Body::getConstant(t->getType(), type); + lua_pushstring(L, type); + return 1; +} + +int w_Body_applyLinearImpulse(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float jx = (float)luaL_checknumber(L, 2); + float jy = (float)luaL_checknumber(L, 3); + + int nargs = lua_gettop(L); + + if (nargs <= 3 || (nargs == 4 && lua_type(L, 4) == LUA_TBOOLEAN)) + { + bool awake = luax_optboolean(L, 4, true); + t->applyLinearImpulse(jx, jy, awake); + } + else if (nargs >= 5) + { + float rx = (float)luaL_checknumber(L, 4); + float ry = (float)luaL_checknumber(L, 5); + bool awake = luax_optboolean(L, 6, true); + t->applyLinearImpulse(jx, jy, rx, ry, awake); + } + else + { + return luaL_error(L, "Wrong number of parameters."); + } + + return 0; +} + +int w_Body_applyAngularImpulse(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float i = (float)luaL_checknumber(L, 2); + bool awake = luax_optboolean(L, 3, true); + t->applyAngularImpulse(i, awake); + return 0; +} + +int w_Body_applyTorque(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg = (float)luaL_checknumber(L, 2); + bool awake = luax_optboolean(L, 3, true); + t->applyTorque(arg, awake); + return 0; +} + +int w_Body_applyForce(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float fx = (float)luaL_checknumber(L, 2); + float fy = (float)luaL_checknumber(L, 3); + + int nargs = lua_gettop(L); + + if (nargs <= 3 || (nargs == 4 && lua_type(L, 4) == LUA_TBOOLEAN)) + { + bool awake = luax_optboolean(L, 4, true); + t->applyForce(fx, fy, awake); + } + else if (lua_gettop(L) >= 5) + { + float rx = (float)luaL_checknumber(L, 4); + float ry = (float)luaL_checknumber(L, 5); + bool awake = luax_optboolean(L, 6, true); + t->applyForce(fx, fy, rx, ry, awake); + } + else + { + return luaL_error(L, "Wrong number of parameters."); + } + + return 0; +} + +int w_Body_setX(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setX(arg1);) + return 0; +} + +int w_Body_setY(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setY(arg1);) + return 0; +} + +int w_Body_setLinearVelocity(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_checknumber(L, 3); + t->setLinearVelocity(arg1, arg2); + return 0; +} + +int w_Body_setAngle(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setAngle(arg1);) + return 0; +} + +int w_Body_setAngularVelocity(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setAngularVelocity(arg1); + return 0; +} + +int w_Body_setPosition(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_checknumber(L, 3); + EXCEPT_GUARD(t->setPosition(arg1, arg2);) + return 0; +} + +int w_Body_resetMassData(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + EXCEPT_GUARD(t->resetMassData();) + return 0; +} + +int w_Body_setMassData(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float m = (float)luaL_checknumber(L, 4); + float i = (float)luaL_checknumber(L, 5); + EXCEPT_GUARD(t->setMassData(x, y, m, i);) + return 0; +} + +int w_Body_setMass(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float m = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setMass(m);) + return 0; +} + +int w_Body_setInertia(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float i = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setInertia(i);) + return 0; +} + +int w_Body_setAngularDamping(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setAngularDamping(arg1); + return 0; +} + +int w_Body_setLinearDamping(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setLinearDamping(arg1); + return 0; +} + +int w_Body_setGravityScale(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setGravityScale(arg1); + return 0; +} + +int w_Body_setType(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + const char *typeStr = luaL_checkstring(L, 2); + Body::Type type; + Body::getConstant(typeStr, type); + EXCEPT_GUARD(t->setType(type);) + return 0; +} + +int w_Body_getWorldPoint(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float x_o, y_o; + t->getWorldPoint(x, y, x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getWorldVector(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float x_o, y_o; + t->getWorldVector(x, y, x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getWorldPoints(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_remove(L, 1); + return t->getWorldPoints(L); +} + +int w_Body_getLocalPoint(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float x_o, y_o; + t->getLocalPoint(x, y, x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getLocalVector(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float x_o, y_o; + t->getLocalVector(x, y, x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getLinearVelocityFromWorldPoint(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float x_o, y_o; + t->getLinearVelocityFromWorldPoint(x, y, x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_getLinearVelocityFromLocalPoint(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float x_o, y_o; + t->getLinearVelocityFromLocalPoint(x, y, x_o, y_o); + lua_pushnumber(L, x_o); + lua_pushnumber(L, y_o); + + return 2; +} + +int w_Body_isBullet(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + luax_pushboolean(L, t->isBullet()); + return 1; +} + +int w_Body_setBullet(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + bool b = luax_toboolean(L, 2); + t->setBullet(b); + return 0; +} + +int w_Body_isActive(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + luax_pushboolean(L, t->isActive()); + return 1; +} + +int w_Body_isAwake(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + luax_pushboolean(L, t->isAwake()); + return 1; +} + +int w_Body_setSleepingAllowed(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + bool b = luax_toboolean(L, 2); + t->setSleepingAllowed(b); + return 0; +} + +int w_Body_isSleepingAllowed(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_pushboolean(L, t->isSleepingAllowed()); + return 1; +} + +int w_Body_setActive(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + bool b = luax_toboolean(L, 2); + EXCEPT_GUARD(t->setActive(b);) + return 0; +} + +int w_Body_setAwake(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + bool b = luax_toboolean(L, 2); + t->setAwake(b); + return 0; +} + +int w_Body_setFixedRotation(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + bool b = luax_toboolean(L, 2); + EXCEPT_GUARD(t->setFixedRotation(b);) + return 0; +} + +int w_Body_isFixedRotation(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + bool b = t->isFixedRotation(); + luax_pushboolean(L, b); + return 1; +} + +int w_Body_getFixtureList(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + lua_remove(L, 1); + int n = 0; + EXCEPT_GUARD(n = t->getFixtureList(L);) + return n; +} + +int w_Body_destroy(lua_State *L) +{ + Body *t = luax_checkbody(L, 1); + EXCEPT_GUARD(t->destroy();) + return 0; +} + +static const luaL_Reg functions[] = +{ + { "getX", w_Body_getX }, + { "getY", w_Body_getY }, + { "getAngle", w_Body_getAngle }, + { "getPosition", w_Body_getPosition }, + { "getLinearVelocity", w_Body_getLinearVelocity }, + { "getWorldCenter", w_Body_getWorldCenter }, + { "getLocalCenter", w_Body_getLocalCenter }, + { "getAngularVelocity", w_Body_getAngularVelocity }, + { "getMass", w_Body_getMass }, + { "getInertia", w_Body_getInertia }, + { "getMassData", w_Body_getMassData }, + { "getAngularDamping", w_Body_getAngularDamping }, + { "getLinearDamping", w_Body_getLinearDamping }, + { "getGravityScale", w_Body_getGravityScale }, + { "getType", w_Body_getType }, + { "applyLinearImpulse", w_Body_applyLinearImpulse }, + { "applyAngularImpulse", w_Body_applyAngularImpulse }, + { "applyTorque", w_Body_applyTorque }, + { "applyForce", w_Body_applyForce }, + { "setX", w_Body_setX }, + { "setY", w_Body_setY }, + { "setLinearVelocity", w_Body_setLinearVelocity }, + { "setAngle", w_Body_setAngle }, + { "setAngularVelocity", w_Body_setAngularVelocity }, + { "setPosition", w_Body_setPosition }, + { "resetMassData", w_Body_resetMassData }, + { "setMassData", w_Body_setMassData }, + { "setMass", w_Body_setMass }, + { "setInertia", w_Body_setInertia }, + { "setAngularDamping", w_Body_setAngularDamping }, + { "setLinearDamping", w_Body_setLinearDamping }, + { "setGravityScale", w_Body_setGravityScale }, + { "setType", w_Body_setType }, + { "getWorldPoint", w_Body_getWorldPoint }, + { "getWorldVector", w_Body_getWorldVector }, + { "getWorldPoints", w_Body_getWorldPoints }, + { "getLocalPoint", w_Body_getLocalPoint }, + { "getLocalVector", w_Body_getLocalVector }, + { "getLinearVelocityFromWorldPoint", w_Body_getLinearVelocityFromWorldPoint }, + { "getLinearVelocityFromLocalPoint", w_Body_getLinearVelocityFromLocalPoint }, + { "isBullet", w_Body_isBullet }, + { "setBullet", w_Body_setBullet }, + { "isActive", w_Body_isActive }, + { "isAwake", w_Body_isAwake }, + { "setSleepingAllowed", w_Body_setSleepingAllowed }, + { "isSleepingAllowed", w_Body_isSleepingAllowed }, + { "setActive", w_Body_setActive }, + { "setAwake", w_Body_setAwake }, + { "setFixedRotation", w_Body_setFixedRotation }, + { "isFixedRotation", w_Body_isFixedRotation }, + { "getFixtureList", w_Body_getFixtureList }, + { "destroy", w_Body_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_body(lua_State *L) +{ + return luax_register_type(L, "Body", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_Body.h b/jni/love/src/modules/physics/box2d/wrap_Body.h new file mode 100644 index 00000000..960d8e5c --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Body.h @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_BODY_H +#define LOVE_PHYSICS_BOX2D_WRAP_BODY_H + +// LOVE +#include "common/runtime.h" +#include "Body.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Body *luax_checkbody(lua_State *L, int idx); +int w_Body_getX(lua_State *L); +int w_Body_getY(lua_State *L); +int w_Body_getAngle(lua_State *L); +int w_Body_getPosition(lua_State *L); +int w_Body_getLinearVelocity(lua_State *L); +int w_Body_getWorldCenter(lua_State *L); +int w_Body_getLocalCenter(lua_State *L); +int w_Body_getAngularVelocity(lua_State *L); +int w_Body_getMass(lua_State *L); +int w_Body_getInertia(lua_State *L); +int w_Body_getMassData(lua_State *L); +int w_Body_getAngularDamping(lua_State *L); +int w_Body_getLinearDamping(lua_State *L); +int w_Body_getGravityScale(lua_State *L); +int w_Body_getType(lua_State *L); +int w_Body_applyLinearImpulse(lua_State *L); +int w_Body_applyAngularImpulse(lua_State *L); +int w_Body_applyTorque(lua_State *L); +int w_Body_applyForce(lua_State *L); +int w_Body_setX(lua_State *L); +int w_Body_setY(lua_State *L); +int w_Body_setLinearVelocity(lua_State *L); +int w_Body_setAngle(lua_State *L); +int w_Body_setAngularVelocity(lua_State *L); +int w_Body_setPosition(lua_State *L); +int w_Body_resetMassData(lua_State *L); +int w_Body_setMassData(lua_State *L); +int w_Body_setMass(lua_State *L); +int w_Body_setInertia(lua_State *L); +int w_Body_setAngularDamping(lua_State *L); +int w_Body_setLinearDamping(lua_State *L); +int w_Body_setGravityScale(lua_State *L); +int w_Body_setType(lua_State *L); +int w_Body_getWorldPoint(lua_State *L); +int w_Body_getWorldVector(lua_State *L); +int w_Body_getWorldPoints(lua_State *L); +int w_Body_getLocalPoint(lua_State *L); +int w_Body_getLocalVector(lua_State *L); +int w_Body_getLinearVelocityFromWorldPoint(lua_State *L); +int w_Body_getLinearVelocityFromLocalPoint(lua_State *L); +int w_Body_isBullet(lua_State *L); +int w_Body_setBullet(lua_State *L); +int w_Body_isActive(lua_State *L); +int w_Body_isAwake(lua_State *L); +int w_Body_setSleepingAllowed(lua_State *L); +int w_Body_isSleepingAllowed(lua_State *L); +int w_Body_setActive(lua_State *L); +int w_Body_setAwake(lua_State *L); +int w_Body_setFixedRotation(lua_State *L); +int w_Body_isFixedRotation(lua_State *L); +int w_Body_getFixtureList(lua_State *L); +int w_Body_destroy(lua_State *L); +extern "C" int luaopen_body(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_BODY_H diff --git a/jni/love/src/modules/physics/box2d/wrap_ChainShape.cpp b/jni/love/src/modules/physics/box2d/wrap_ChainShape.cpp new file mode 100644 index 00000000..989ed6db --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_ChainShape.cpp @@ -0,0 +1,134 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_ChainShape.h" +#include "wrap_Physics.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +ChainShape *luax_checkchainshape(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "ChainShape", PHYSICS_CHAIN_SHAPE_T); +} + +int w_ChainShape_setNextVertex(lua_State *L) +{ + ChainShape *c = luax_checkchainshape(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + EXCEPT_GUARD(c->setNextVertex(x, y);) + return 0; +} + +int w_ChainShape_setPreviousVertex(lua_State *L) +{ + ChainShape *c = luax_checkchainshape(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + EXCEPT_GUARD(c->setPreviousVertex(x, y);) + return 0; +} + +int w_ChainShape_getChildCount(lua_State *L) +{ + ChainShape *c = luax_checkchainshape(L, 1); + lua_pushinteger(L, c->getChildCount()); + return 1; +} + +int w_ChainShape_getChildEdge(lua_State *L) +{ + ChainShape *c = luax_checkchainshape(L, 1); + int index = luaL_checkint(L, 2) - 1; // Convert from 1-based index + EdgeShape *e = 0; + EXCEPT_GUARD(e = c->getChildEdge(index);) + luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, e); + return 1; +} + +int w_ChainShape_getVertexCount(lua_State *L) +{ + ChainShape *c = luax_checkchainshape(L, 1); + int count = c->getVertexCount(); + lua_pushinteger(L, count); + return 1; +} + +int w_ChainShape_getPoint(lua_State *L) +{ + ChainShape *c = luax_checkchainshape(L, 1); + int index = luaL_checkint(L, 2) - 1; // Convert from 1-based index + b2Vec2 v; + EXCEPT_GUARD(v = c->getPoint(index);) + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + return 2; +} + +int w_ChainShape_getPoints(lua_State *L) +{ + ChainShape *c = luax_checkchainshape(L, 1); + const b2Vec2 *verts = c->getPoints(); + int count = c->getVertexCount(); + if (!lua_checkstack(L, count*2)) + return luaL_error(L, "Too many return values"); + for (int i = 0; i < count; i++) + { + b2Vec2 v = Physics::scaleUp(verts[i]); + lua_pushnumber(L, v.x); + lua_pushnumber(L, v.y); + } + return count*2; +} + +static const luaL_Reg functions[] = +{ + { "setNextVertex", w_ChainShape_setNextVertex }, + { "setPreviousVertex", w_ChainShape_setPreviousVertex }, + { "getChildCount", w_ChainShape_getChildCount }, + { "getChildEdge", w_ChainShape_getChildEdge }, + { "getVertexCount", w_ChainShape_getVertexCount }, + { "getPoint", w_ChainShape_getPoint }, + { "getPoints", w_ChainShape_getPoints }, + // From Shape. + { "getType", w_Shape_getType }, + { "getRadius", w_Shape_getRadius }, + { "getChildCount", w_Shape_getChildCount }, + { "testPoint", w_Shape_testPoint }, + { "rayCast", w_Shape_rayCast }, + { "computeAABB", w_Shape_computeAABB }, + { "computeMass", w_Shape_computeMass }, + { 0, 0 } +}; + +extern "C" int luaopen_chainshape(lua_State *L) +{ + return luax_register_type(L, "ChainShape", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_ChainShape.h b/jni/love/src/modules/physics/box2d/wrap_ChainShape.h new file mode 100644 index 00000000..abdf72df --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_ChainShape.h @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H +#define LOVE_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Shape.h" +#include "ChainShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +ChainShape *luax_checkchainshape(lua_State *L, int idx); + +int w_ChainShape_setNextVertex(lua_State *L); +int w_ChainShape_setPreviousVertex(lua_State *L); +int w_ChainShape_getChildCount(lua_State *L); +int w_ChainShape_getChildEdge(lua_State *L); +int w_ChainShape_getVertexCount(lua_State *L); +int w_ChainShape_getPoint(lua_State *L); +int w_ChainShape_getPoints(lua_State *L); + +extern "C" int luaopen_chainshape(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_CHAIN_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/wrap_CircleShape.cpp b/jni/love/src/modules/physics/box2d/wrap_CircleShape.cpp new file mode 100644 index 00000000..8fa46de7 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_CircleShape.cpp @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_CircleShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +CircleShape *luax_checkcircleshape(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "CircleShape", PHYSICS_CIRCLE_SHAPE_T); +} + +int w_CircleShape_getRadius(lua_State *L) +{ + CircleShape *c = luax_checkcircleshape(L, 1); + lua_pushnumber(L, c->getRadius()); + return 1; +} + +int w_CircleShape_setRadius(lua_State *L) +{ + CircleShape *c = luax_checkcircleshape(L, 1); + float r = (float)luaL_checknumber(L, 2); + c->setRadius(r); + return 0; +} + +static const luaL_Reg functions[] = +{ + { "getRadius", w_CircleShape_getRadius }, + { "setRadius", w_CircleShape_setRadius }, + // From Shape. + { "getType", w_Shape_getType }, + { "getRadius", w_Shape_getRadius }, + { "getChildCount", w_Shape_getChildCount }, + { "testPoint", w_Shape_testPoint }, + { "rayCast", w_Shape_rayCast }, + { "computeAABB", w_Shape_computeAABB }, + { "computeMass", w_Shape_computeMass }, + { 0, 0 } +}; + +extern "C" int luaopen_circleshape(lua_State *L) +{ + return luax_register_type(L, "CircleShape", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_CircleShape.h b/jni/love/src/modules/physics/box2d/wrap_CircleShape.h new file mode 100644 index 00000000..6876712b --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_CircleShape.h @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_CIRCLE_SHAPE_H +#define LOVE_PHYSICS_BOX2D_WRAP_CIRCLE_SHAPE_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Shape.h" +#include "CircleShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +CircleShape *luax_checkcircleshape(lua_State *L, int idx); +int w_CircleShape_getRadius(lua_State *L); +int w_CircleShape_setRadius(lua_State *L); +extern "C" int luaopen_circleshape(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_CIRCLE_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/wrap_Contact.cpp b/jni/love/src/modules/physics/box2d/wrap_Contact.cpp new file mode 100644 index 00000000..8aef8141 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Contact.cpp @@ -0,0 +1,167 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Contact.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Contact *luax_checkcontact(lua_State *L, int idx) +{ + Contact *c = luax_checktype(L, idx, "Contact", PHYSICS_CONTACT_T); + if (!c->isValid()) + luaL_error(L, "Attempt to use destroyed contact."); + return c; +} + +int w_Contact_getPositions(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + return t->getPositions(L); +} + +int w_Contact_getNormal(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + return t->getNormal(L); +} + +int w_Contact_getFriction(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + lua_pushnumber(L, t->getFriction()); + return 1; +} + +int w_Contact_getRestitution(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + lua_pushnumber(L, t->getRestitution()); + return 1; +} + +int w_Contact_isEnabled(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + lua_pushboolean(L, t->isEnabled()); + return 1; +} + +int w_Contact_isTouching(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + lua_pushboolean(L, t->isTouching()); + return 1; +} + +int w_Contact_setFriction(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + float f = (float)luaL_checknumber(L, 2); + t->setFriction(f); + return 0; +} + +int w_Contact_setRestitution(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + float r = (float)luaL_checknumber(L, 2); + t->setRestitution(r); + return 0; +} + +int w_Contact_setEnabled(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + bool e = luax_toboolean(L, 2); + t->setEnabled(e); + return 0; +} + +int w_Contact_resetFriction(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + t->resetFriction(); + return 0; +} + +int w_Contact_resetRestitution(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + t->resetRestitution(); + return 0; +} + +int w_Contact_setTangentSpeed(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + float speed = (float) luaL_checknumber(L, 2); + t->setTangentSpeed(speed); + return 0; +} + +int w_Contact_getTangentSpeed(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + lua_pushnumber(L, t->getTangentSpeed()); + return 1; +} + +int w_Contact_getChildren(lua_State *L) +{ + Contact *t = luax_checkcontact(L, 1); + int a, b; + t->getChildren(a, b); + lua_pushnumber(L, a + 1); + lua_pushnumber(L, b + 1); + return 2; +} + +extern "C" int luaopen_contact(lua_State *L) +{ + static const luaL_Reg functions[] = + { + { "getPositions", w_Contact_getPositions }, + { "getNormal", w_Contact_getNormal }, + { "getFriction", w_Contact_getFriction }, + { "getRestitution", w_Contact_getRestitution }, + { "isEnabled", w_Contact_isEnabled }, + { "isTouching", w_Contact_isTouching }, + { "setFriction", w_Contact_setFriction }, + { "setRestitution", w_Contact_setRestitution }, + { "setEnabled", w_Contact_setEnabled }, + { "resetFriction", w_Contact_resetFriction }, + { "resetRestitution", w_Contact_resetRestitution }, + { "setTangentSpeed", w_Contact_setTangentSpeed }, + { "getTangentSpeed", w_Contact_getTangentSpeed }, + { "getChildren", w_Contact_getChildren }, + { 0, 0 } + }; + + return luax_register_type(L, "Contact", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_Contact.h b/jni/love/src/modules/physics/box2d/wrap_Contact.h new file mode 100644 index 00000000..38bf54bd --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Contact.h @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_CONTACT_H +#define LOVE_PHYSICS_BOX2D_WRAP_CONTACT_H + +// LOVE +#include "common/runtime.h" +#include "Contact.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Contact *luax_checkcontact(lua_State *L, int idx); +int w_Contact_getPositions(lua_State *L); +int w_Contact_getNormal(lua_State *L); +int w_Contact_getFriction(lua_State *L); +int w_Contact_getRestitution(lua_State *L); +int w_Contact_isEnabled(lua_State *L); +int w_Contact_isTouching(lua_State *L); +int w_Contact_setFriction(lua_State *L); +int w_Contact_setRestitution(lua_State *L); +int w_Contact_setEnabled(lua_State *L); +int w_Contact_resetFriction(lua_State *L); +int w_Contact_resetRestitution(lua_State *L); +int w_Contact_setTangentSpeed(lua_State *L); +int w_Contact_getTangentSpeed(lua_State *L); +int w_Contact_getChildren(lua_State *L); +extern "C" int luaopen_contact(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_CONTACT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.cpp new file mode 100644 index 00000000..f58f610f --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.cpp @@ -0,0 +1,108 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_DistanceJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +DistanceJoint *luax_checkdistancejoint(lua_State *L, int idx) +{ + DistanceJoint *j = luax_checktype(L, idx, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_DistanceJoint_setLength(lua_State *L) +{ + DistanceJoint *t = luax_checkdistancejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setLength(arg1); + return 0; +} + +int w_DistanceJoint_getLength(lua_State *L) +{ + DistanceJoint *t = luax_checkdistancejoint(L, 1); + lua_pushnumber(L, t->getLength()); + return 1; +} + +int w_DistanceJoint_setFrequency(lua_State *L) +{ + DistanceJoint *t = luax_checkdistancejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setFrequency(arg1); + return 0; +} + +int w_DistanceJoint_getFrequency(lua_State *L) +{ + DistanceJoint *t = luax_checkdistancejoint(L, 1); + lua_pushnumber(L, t->getFrequency()); + return 1; +} + +int w_DistanceJoint_setDampingRatio(lua_State *L) +{ + DistanceJoint *t = luax_checkdistancejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setDampingRatio(arg1); + return 0; +} + +int w_DistanceJoint_getDampingRatio(lua_State *L) +{ + DistanceJoint *t = luax_checkdistancejoint(L, 1); + lua_pushnumber(L, t->getDampingRatio()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "setLength", w_DistanceJoint_setLength }, + { "getLength", w_DistanceJoint_getLength }, + { "setFrequency", w_DistanceJoint_setFrequency }, + { "getFrequency", w_DistanceJoint_getFrequency }, + { "setDampingRatio", w_DistanceJoint_setDampingRatio }, + { "getDampingRatio", w_DistanceJoint_getDampingRatio }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_distancejoint(lua_State *L) +{ + return luax_register_type(L, "DistanceJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.h b/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.h new file mode 100644 index 00000000..1d4b8ef3 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_DistanceJoint.h @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_DISTANCE_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_DISTANCE_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "DistanceJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +DistanceJoint *luax_checkdistancejoint(lua_State *L, int idx); +int w_DistanceJoint_setLength(lua_State *L); +int w_DistanceJoint_getLength(lua_State *L); +int w_DistanceJoint_setFrequency(lua_State *L); +int w_DistanceJoint_getFrequency(lua_State *L); +int w_DistanceJoint_setDampingRatio(lua_State *L); +int w_DistanceJoint_getDampingRatio(lua_State *L); +extern "C" int luaopen_distancejoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_DISTANCE_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_EdgeShape.cpp b/jni/love/src/modules/physics/box2d/wrap_EdgeShape.cpp new file mode 100644 index 00000000..95954880 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_EdgeShape.cpp @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_EdgeShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +EdgeShape *luax_checkedgeshape(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "EdgeShape", PHYSICS_EDGE_SHAPE_T); +} + +int w_EdgeShape_getPoints(lua_State *L) +{ + EdgeShape *t = luax_checkedgeshape(L, 1); + lua_remove(L, 1); + return t->getPoints(L); +} + +static const luaL_Reg functions[] = +{ + { "getPoints", w_EdgeShape_getPoints }, + // From Shape. + { "getType", w_Shape_getType }, + { "getRadius", w_Shape_getRadius }, + { "getChildCount", w_Shape_getChildCount }, + { "testPoint", w_Shape_testPoint }, + { "rayCast", w_Shape_rayCast }, + { "computeAABB", w_Shape_computeAABB }, + { "computeMass", w_Shape_computeMass }, + { 0, 0 } +}; + +extern "C" int luaopen_edgeshape(lua_State *L) +{ + return luax_register_type(L, "EdgeShape", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_EdgeShape.h b/jni/love/src/modules/physics/box2d/wrap_EdgeShape.h new file mode 100644 index 00000000..e0b53679 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_EdgeShape.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H +#define LOVE_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Shape.h" +#include "EdgeShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +EdgeShape *luax_checkedgeshape(lua_State *L, int idx); +int w_EdgeShape_getPoints(lua_State *L); +extern "C" int luaopen_edgeshape(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_EDGE_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/wrap_Fixture.cpp b/jni/love/src/modules/physics/box2d/wrap_Fixture.cpp new file mode 100644 index 00000000..2b35090c --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Fixture.cpp @@ -0,0 +1,304 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Fixture.h" +#include "common/StringMap.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Fixture *luax_checkfixture(lua_State *L, int idx) +{ + Fixture *f = luax_checktype(L, idx, "Fixture", PHYSICS_FIXTURE_T); + if (!f->isValid()) + luaL_error(L, "Attempt to use destroyed fixture."); + return f; +} + +int w_Fixture_getType(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + const char *type = ""; + Shape::getConstant(t->getType(), type); + lua_pushstring(L, type); + return 1; +} + +int w_Fixture_setFriction(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setFriction(arg1); + return 0; +} + +int w_Fixture_setRestitution(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setRestitution(arg1); + return 0; +} + +int w_Fixture_setDensity(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setDensity(arg1);) + return 0; +} + +int w_Fixture_setSensor(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + bool arg1 = luax_toboolean(L, 2); + t->setSensor(arg1); + return 0; +} + +int w_Fixture_getFriction(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_pushnumber(L, t->getFriction()); + return 1; +} + +int w_Fixture_getRestitution(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_pushnumber(L, t->getRestitution()); + return 1; +} + +int w_Fixture_getDensity(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_pushnumber(L, t->getDensity()); + return 1; +} + +int w_Fixture_isSensor(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + luax_pushboolean(L, t->isSensor()); + return 1; +} + +int w_Fixture_getBody(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + Body *body = t->getBody(); + if (body == 0) + return 0; + body->retain(); + luax_pushtype(L, "Body", PHYSICS_BODY_T, body); + return 1; +} + +int w_Fixture_getShape(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + Shape *shape = t->getShape(); + if (shape == 0) + return 0; + switch (shape->getType()) + { + case Shape::SHAPE_EDGE: + luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, shape); + break; + case Shape::SHAPE_CHAIN: + luax_pushtype(L, "ChainShape", PHYSICS_CHAIN_SHAPE_T, shape); + break; + case Shape::SHAPE_CIRCLE: + luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); + break; + case Shape::SHAPE_POLYGON: + luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); + break; + default: + luax_pushtype(L, "Shape", PHYSICS_SHAPE_T, shape); + break; + } + return 1; +} + +int w_Fixture_testPoint(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + luax_pushboolean(L, t->testPoint(x, y)); + return 1; +} + +int w_Fixture_rayCast(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + int ret = 0; + EXCEPT_GUARD(ret = t->rayCast(L);) + return ret; +} + +int w_Fixture_setFilterData(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + int v[3]; + v[0] = luaL_checkint(L, 2); + v[1] = luaL_checkint(L, 3); + v[2] = luaL_checkint(L, 4); + t->setFilterData(v); + return 0; +} + +int w_Fixture_getFilterData(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + int v[3]; + t->getFilterData(v); + lua_pushinteger(L, v[0]); + lua_pushinteger(L, v[1]); + lua_pushinteger(L, v[2]); + return 3; +} + +int w_Fixture_setCategory(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + return t->setCategory(L); +} + +int w_Fixture_getCategory(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + return t->getCategory(L); +} + +int w_Fixture_setMask(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + return t->setMask(L); +} + +int w_Fixture_getMask(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + return t->getMask(L); +} + +int w_Fixture_setUserData(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + return t->setUserData(L); +} + +int w_Fixture_getUserData(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + return t->getUserData(L); +} + +int w_Fixture_getBoundingBox(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + return t->getBoundingBox(L); +} + +int w_Fixture_getMassData(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + lua_remove(L, 1); + return t->getMassData(L); +} + +int w_Fixture_getGroupIndex(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + int i = t->getGroupIndex(); + lua_pushinteger(L, i); + return 1; +} + +int w_Fixture_setGroupIndex(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + int i = luaL_checkint(L, 2); + t->setGroupIndex(i); + return 0; +} + +int w_Fixture_destroy(lua_State *L) +{ + Fixture *t = luax_checkfixture(L, 1); + EXCEPT_GUARD(t->destroy();) + return 0; +} + +static const luaL_Reg functions[] = +{ + { "getType", w_Fixture_getType }, + { "setFriction", w_Fixture_setFriction }, + { "setRestitution", w_Fixture_setRestitution }, + { "setDensity", w_Fixture_setDensity }, + { "setSensor", w_Fixture_setSensor }, + { "getFriction", w_Fixture_getFriction }, + { "getRestitution", w_Fixture_getRestitution }, + { "getDensity", w_Fixture_getDensity }, + { "getBody", w_Fixture_getBody }, + { "getShape", w_Fixture_getShape }, + { "isSensor", w_Fixture_isSensor }, + { "testPoint", w_Fixture_testPoint }, + { "rayCast", w_Fixture_rayCast }, + { "setFilterData", w_Fixture_setFilterData }, + { "getFilterData", w_Fixture_getFilterData }, + { "setCategory", w_Fixture_setCategory }, + { "getCategory", w_Fixture_getCategory }, + { "setMask", w_Fixture_setMask }, + { "getMask", w_Fixture_getMask }, + { "setUserData", w_Fixture_setUserData }, + { "getUserData", w_Fixture_getUserData }, + { "getBoundingBox", w_Fixture_getBoundingBox }, + { "getMassData", w_Fixture_getMassData }, + { "getGroupIndex", w_Fixture_getGroupIndex }, + { "setGroupIndex", w_Fixture_setGroupIndex }, + { "destroy", w_Fixture_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_fixture(lua_State *L) +{ + return luax_register_type(L, "Fixture", functions); +} + +} // box2d +} // physics +} // love + diff --git a/jni/love/src/modules/physics/box2d/wrap_Fixture.h b/jni/love/src/modules/physics/box2d/wrap_Fixture.h new file mode 100644 index 00000000..51a5b2d2 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Fixture.h @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_FIXTURE_H +#define LOVE_PHYSICS_BOX2D_WRAP_FIXTURE_H + +// LOVE +#include "common/runtime.h" +#include "Fixture.h" +#include "wrap_Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Fixture *luax_checkfixture(lua_State *L, int idx); +int w_Fixture_getType(lua_State *L); +int w_Fixture_setFriction(lua_State *L); +int w_Fixture_setRestitution(lua_State *L); +int w_Fixture_setDensity(lua_State *L); +int w_Fixture_setSensor(lua_State *L); +int w_Fixture_getFriction(lua_State *L); +int w_Fixture_getRestitution(lua_State *L); +int w_Fixture_getDensity(lua_State *L); +int w_Fixture_isSensor(lua_State *L); +int w_Fixture_getBody(lua_State *L); +int w_Fixture_getShape(lua_State *L); +int w_Fixture_testPoint(lua_State *L); +int w_Fixture_rayCast(lua_State *L); +int w_Fixture_setFilterData(lua_State *L); +int w_Fixture_getFilterData(lua_State *L); +int w_Fixture_setCategory(lua_State *L); +int w_Fixture_getCategory(lua_State *L); +int w_Fixture_setMask(lua_State *L); +int w_Fixture_getMask(lua_State *L); +int w_Fixture_setUserData(lua_State *L); +int w_Fixture_getUserData(lua_State *L); +int w_Fixture_getBoundingBox(lua_State *L); +int w_Fixture_getMassData(lua_State *L); +int w_Fixture_getGroupIndex(lua_State *L); +int w_Fixture_setGroupIndex(lua_State *L); +int w_Fixture_destroy(lua_State *L); +extern "C" int luaopen_fixture(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_FIXTURE_H diff --git a/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.cpp new file mode 100644 index 00000000..e0c0eb90 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.cpp @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_FrictionJoint.h" +#include "wrap_Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +FrictionJoint *luax_checkfrictionjoint(lua_State *L, int idx) +{ + FrictionJoint *j = luax_checktype(L, idx, "FrictionJoint", PHYSICS_FRICTION_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_FrictionJoint_setMaxForce(lua_State *L) +{ + FrictionJoint *t = luax_checkfrictionjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setMaxForce(arg1);) + return 0; +} + +int w_FrictionJoint_getMaxForce(lua_State *L) +{ + FrictionJoint *t = luax_checkfrictionjoint(L, 1); + lua_pushnumber(L, t->getMaxForce()); + return 1; +} + +int w_FrictionJoint_setMaxTorque(lua_State *L) +{ + FrictionJoint *t = luax_checkfrictionjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setMaxTorque(arg1);) + return 0; +} + +int w_FrictionJoint_getMaxTorque(lua_State *L) +{ + FrictionJoint *t = luax_checkfrictionjoint(L, 1); + lua_pushnumber(L, t->getMaxTorque()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "setMaxForce", w_FrictionJoint_setMaxForce }, + { "getMaxForce", w_FrictionJoint_getMaxForce }, + { "setMaxTorque", w_FrictionJoint_setMaxTorque }, + { "getMaxTorque", w_FrictionJoint_getMaxTorque }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_frictionjoint(lua_State *L) +{ + return luax_register_type(L, "FrictionJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.h b/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.h new file mode 100644 index 00000000..fde5b8c8 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_FrictionJoint.h @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "FrictionJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +FrictionJoint *luax_checkfrictionjoint(lua_State *L, int idx); +int w_FrictionJoint_setMaxForce(lua_State *L); +int w_FrictionJoint_getMaxForce(lua_State *L); +int w_FrictionJoint_setMaxTorque(lua_State *L); +int w_FrictionJoint_getMaxTorque(lua_State *L); +extern "C" int luaopen_frictionjoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_FRICTION_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_GearJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_GearJoint.cpp new file mode 100644 index 00000000..760f69e5 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_GearJoint.cpp @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_GearJoint.h" +#include "wrap_Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +GearJoint *luax_checkgearjoint(lua_State *L, int idx) +{ + GearJoint *j = luax_checktype(L, idx, "GearJoint", PHYSICS_GEAR_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_GearJoint_setRatio(lua_State *L) +{ + GearJoint *t = luax_checkgearjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setRatio(arg1);) + return 0; +} + +int w_GearJoint_getRatio(lua_State *L) +{ + GearJoint *t = luax_checkgearjoint(L, 1); + lua_pushnumber(L, t->getRatio()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "setRatio", w_GearJoint_setRatio }, + { "getRatio", w_GearJoint_getRatio }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_gearjoint(lua_State *L) +{ + return luax_register_type(L, "GearJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_GearJoint.h b/jni/love/src/modules/physics/box2d/wrap_GearJoint.h new file mode 100644 index 00000000..5405794b --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_GearJoint.h @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_GEAR_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_GEAR_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "GearJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +GearJoint *luax_checkgearjoint(lua_State *L, int idx); +int w_GearJoint_setRatio(lua_State *L); +int w_GearJoint_getRatio(lua_State *L); +extern "C" int luaopen_gearjoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_GEAR_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_Joint.cpp b/jni/love/src/modules/physics/box2d/wrap_Joint.cpp new file mode 100644 index 00000000..2924bb5f --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Joint.cpp @@ -0,0 +1,103 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Joint.h" +#include "common/StringMap.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Joint *luax_checkjoint(lua_State *L, int idx) +{ + Joint *t = luax_checktype(L, idx, "Joint", PHYSICS_JOINT_T); + if (!t->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return t; +} + +int w_Joint_getType(lua_State *L) +{ + Joint *t = luax_checkjoint(L, 1); + const char *type = ""; + Joint::getConstant(t->getType(), type); + lua_pushstring(L, type); + return 1; +} + +int w_Joint_getAnchors(lua_State *L) +{ + Joint *t = luax_checkjoint(L, 1); + lua_remove(L, 1); + return t->getAnchors(L); +} + +int w_Joint_getReactionForce(lua_State *L) +{ + Joint *t = luax_checkjoint(L, 1); + lua_remove(L, 1); + return t->getReactionForce(L); +} + +int w_Joint_getReactionTorque(lua_State *L) +{ + Joint *t = luax_checkjoint(L, 1); + float inv_dt = (float)luaL_checknumber(L, 2); + lua_pushnumber(L, t->getReactionTorque(inv_dt)); + return 1; +} + +int w_Joint_getCollideConnected(lua_State *L) +{ + Joint *t = luax_checkjoint(L, 1); + luax_pushboolean(L, t->getCollideConnected()); + return 1; +} + +int w_Joint_destroy(lua_State *L) +{ + Joint *t = luax_checkjoint(L, 1); + EXCEPT_GUARD(t->destroyJoint();) + return 0; +} + +static const luaL_Reg functions[] = +{ + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_joint(lua_State *L) +{ + return luax_register_type(L, "Joint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_Joint.h b/jni/love/src/modules/physics/box2d/wrap_Joint.h new file mode 100644 index 00000000..d0446289 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Joint.h @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "Joint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Joint *luax_checkjoint(lua_State *L, int idx); +int w_Joint_getType(lua_State *L); +int w_Joint_getAnchors(lua_State *L); +int w_Joint_getReactionForce(lua_State *L); +int w_Joint_getReactionTorque(lua_State *L); +int w_Joint_getCollideConnected(lua_State *L); +int w_Joint_destroy(lua_State *L); +extern "C" int luaopen_joint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_MotorJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_MotorJoint.cpp new file mode 100644 index 00000000..f85cbec4 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_MotorJoint.cpp @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_MotorJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +MotorJoint *luax_checkmotorjoint(lua_State *L, int idx) +{ + MotorJoint *j = luax_checktype(L, idx, "MotorJoint", PHYSICS_MOTOR_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_MotorJoint_setLinearOffset(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + float x = (float) luaL_checknumber(L, 2); + float y = (float) luaL_checknumber(L, 3); + t->setLinearOffset(x, y); + return 0; +} + +int w_MotorJoint_getLinearOffset(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + return t->getLinearOffset(L); +} + +int w_MotorJoint_setAngularOffset(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + float arg1 = (float) luaL_checknumber(L, 2); + t->setAngularOffset(arg1); + return 0; +} + +int w_MotorJoint_getAngularOffset(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + lua_pushnumber(L, t->getAngularOffset()); + return 1; +} + +int w_MotorJoint_setMaxForce(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + float arg1 = (float) luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setMaxForce(arg1);) + return 0; +} + +int w_MotorJoint_getMaxForce(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + lua_pushnumber(L, t->getMaxForce()); + return 1; +} + +int w_MotorJoint_setMaxTorque(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + float arg1 = (float) luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setMaxTorque(arg1);) + return 0; +} + +int w_MotorJoint_getMaxTorque(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + lua_pushnumber(L, t->getMaxTorque()); + return 1; +} + +int w_MotorJoint_setCorrectionFactor(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + float arg1 = (float) luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setCorrectionFactor(arg1);) + return 0; +} + +int w_MotorJoint_getCorrectionFactor(lua_State *L) +{ + MotorJoint *t = luax_checkmotorjoint(L, 1); + lua_pushnumber(L, t->getCorrectionFactor()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "setLinearOffset", w_MotorJoint_setLinearOffset }, + { "getLinearOffset", w_MotorJoint_getLinearOffset }, + { "setAngularOffset", w_MotorJoint_setAngularOffset }, + { "getAngularOffset", w_MotorJoint_getAngularOffset }, + { "setMaxForce", w_MotorJoint_setMaxForce }, + { "getMaxForce", w_MotorJoint_getMaxForce }, + { "setMaxTorque", w_MotorJoint_setMaxTorque }, + { "getMaxTorque", w_MotorJoint_getMaxTorque }, + { "setCorrectionFactor", w_MotorJoint_setCorrectionFactor }, + { "getCorrectionFactor", w_MotorJoint_getCorrectionFactor }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_motorjoint(lua_State *L) +{ + return luax_register_type(L, "MotorJoint", functions); +} + + +} // box2d +} // phyics +} // love \ No newline at end of file diff --git a/jni/love/src/modules/physics/box2d/wrap_MotorJoint.h b/jni/love/src/modules/physics/box2d/wrap_MotorJoint.h new file mode 100644 index 00000000..fad2bf8a --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_MotorJoint.h @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_MOTOR_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_MOTOR_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "MotorJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +MotorJoint *luax_checkmotorjoint(lua_State *L, int idx); +int w_MotorJoint_setLinearOffset(lua_State *L); +int w_MotorJoint_getLinearOffset(lua_State *L); +int w_MotorJoint_setAngularOffset(lua_State *L); +int w_MotorJoint_getAngularOffset(lua_State *L); +int w_MotorJoint_setMaxForce(lua_State *L); +int w_MotorJoint_getMaxForce(lua_State *L); +int w_MotorJoint_setMaxTorque(lua_State *L); +int w_MotorJoint_getMaxTorque(lua_State *L); +int w_MotorJoint_setCorrectionFactor(lua_State *L); +int w_MotorJoint_getCorrectionFactor(lua_State *L); +extern "C" int luaopen_motorjoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_MOTOR_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_MouseJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_MouseJoint.cpp new file mode 100644 index 00000000..82f7f1c4 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_MouseJoint.cpp @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_MouseJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +MouseJoint *luax_checkmousejoint(lua_State *L, int idx) +{ + MouseJoint *j = luax_checktype(L, idx, "MouseJoint", PHYSICS_MOUSE_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_MouseJoint_setTarget(lua_State *L) +{ + MouseJoint *t = luax_checkmousejoint(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + t->setTarget(x, y); + return 0; +} + +int w_MouseJoint_getTarget(lua_State *L) +{ + MouseJoint *t = luax_checkmousejoint(L, 1); + lua_remove(L, 1); + return t->getTarget(L); +} + +int w_MouseJoint_setMaxForce(lua_State *L) +{ + MouseJoint *t = luax_checkmousejoint(L, 1); + float f = (float)luaL_checknumber(L, 2); + t->setMaxForce(f); + return 0; +} + +int w_MouseJoint_getMaxForce(lua_State *L) +{ + MouseJoint *t = luax_checkmousejoint(L, 1); + lua_pushnumber(L, t->getMaxForce()); + return 1; +} + +int w_MouseJoint_setFrequency(lua_State *L) +{ + MouseJoint *t = luax_checkmousejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setFrequency(arg1); + return 0; +} + +int w_MouseJoint_getFrequency(lua_State *L) +{ + MouseJoint *t = luax_checkmousejoint(L, 1); + lua_pushnumber(L, t->getFrequency()); + return 1; +} + +int w_MouseJoint_setDampingRatio(lua_State *L) +{ + MouseJoint *t = luax_checkmousejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setDampingRatio(arg1); + return 0; +} + +int w_MouseJoint_getDampingRatio(lua_State *L) +{ + MouseJoint *t = luax_checkmousejoint(L, 1); + lua_pushnumber(L, t->getDampingRatio()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "setTarget", w_MouseJoint_setTarget }, + { "getTarget", w_MouseJoint_getTarget }, + { "setMaxForce", w_MouseJoint_setMaxForce }, + { "getMaxForce", w_MouseJoint_getMaxForce }, + { "setFrequency", w_MouseJoint_setFrequency }, + { "getFrequency", w_MouseJoint_getFrequency }, + { "setDampingRatio", w_MouseJoint_setDampingRatio }, + { "getDampingRatio", w_MouseJoint_getDampingRatio }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_mousejoint(lua_State *L) +{ + return luax_register_type(L, "MouseJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_MouseJoint.h b/jni/love/src/modules/physics/box2d/wrap_MouseJoint.h new file mode 100644 index 00000000..cf361785 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_MouseJoint.h @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_MOUSE_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_MOUSE_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "MouseJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +MouseJoint *luax_checkmousejoint(lua_State *L, int idx); +int w_MouseJoint_setTarget(lua_State *L); +int w_MouseJoint_getTarget(lua_State *L); +int w_MouseJoint_setMaxForce(lua_State *L); +int w_MouseJoint_getMaxForce(lua_State *L); +int w_MouseJoint_setFrequency(lua_State *L); +int w_MouseJoint_getFrequency(lua_State *L); +int w_MouseJoint_setDampingRatio(lua_State *L); +int w_MouseJoint_getDampingRatio(lua_State *L); +extern "C" int luaopen_mousejoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_MOUSE_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_Physics.cpp b/jni/love/src/modules/physics/box2d/wrap_Physics.cpp new file mode 100644 index 00000000..f5df282e --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Physics.cpp @@ -0,0 +1,489 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_Physics.h" +#include "wrap_World.h" +#include "wrap_Contact.h" +#include "wrap_Body.h" +#include "wrap_Fixture.h" +#include "wrap_Shape.h" +#include "wrap_CircleShape.h" +#include "wrap_PolygonShape.h" +#include "wrap_EdgeShape.h" +#include "wrap_ChainShape.h" +#include "wrap_Joint.h" +#include "wrap_MouseJoint.h" +#include "wrap_DistanceJoint.h" +#include "wrap_PrismaticJoint.h" +#include "wrap_RevoluteJoint.h" +#include "wrap_PulleyJoint.h" +#include "wrap_GearJoint.h" +#include "wrap_FrictionJoint.h" +#include "wrap_WeldJoint.h" +#include "wrap_WheelJoint.h" +#include "wrap_RopeJoint.h" +#include "wrap_MotorJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +static Physics *instance = 0; + +int w_newWorld(lua_State *L) +{ + float gx = (float)luaL_optnumber(L, 1, 0); + float gy = (float)luaL_optnumber(L, 2, 0); + bool sleep = luax_optboolean(L, 3, true); + + World *w; + EXCEPT_GUARD(w = instance->newWorld(gx, gy, sleep);) + luax_pushtype(L, "World", PHYSICS_WORLD_T, w); + + return 1; +} + +int w_newBody(lua_State *L) +{ + World *world = luax_checktype(L, 1, "World", PHYSICS_WORLD_T); + float x = (float)luaL_optnumber(L, 2, 0.0); + float y = (float)luaL_optnumber(L, 3, 0.0); + + Body::Type btype = Body::BODY_STATIC; + const char *typestr = lua_isnoneornil(L, 4) ? 0 : lua_tostring(L, 4); + if (typestr && !Body::getConstant(typestr, btype)) + return luaL_error(L, "Invalid Body type: %s", typestr); + + Body *body; + EXCEPT_GUARD(body = instance->newBody(world, x, y, btype);) + luax_pushtype(L, "Body", PHYSICS_BODY_T, body); + return 1; +} + +int w_newFixture(lua_State *L) +{ + Body *body = luax_checkbody(L, 1); + Shape *shape = luax_checkshape(L, 2); + float density = (float)luaL_optnumber(L, 3, 1.0f); + Fixture *fixture; + EXCEPT_GUARD(fixture = instance->newFixture(body, shape, density);) + luax_pushtype(L, "Fixture", PHYSICS_FIXTURE_T, fixture); + return 1; +} + +int w_newCircleShape(lua_State *L) +{ + int top = lua_gettop(L); + + if (top == 1) + { + float radius = (float)luaL_checknumber(L, 1); + CircleShape *shape; + EXCEPT_GUARD(shape = instance->newCircleShape(radius);) + luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); + return 1; + } + else if (top == 3) + { + float x = (float)luaL_checknumber(L, 1); + float y = (float)luaL_checknumber(L, 2); + float radius = (float)luaL_checknumber(L, 3); + CircleShape *shape; + EXCEPT_GUARD(shape = instance->newCircleShape(x, y, radius);) + luax_pushtype(L, "CircleShape", PHYSICS_CIRCLE_SHAPE_T, shape); + return 1; + } + else + return luaL_error(L, "Incorrect number of parameters"); +} + +int w_newRectangleShape(lua_State *L) +{ + int top = lua_gettop(L); + + if (top == 2) + { + float w = (float)luaL_checknumber(L, 1); + float h = (float)luaL_checknumber(L, 2); + PolygonShape *shape; + EXCEPT_GUARD(shape = instance->newRectangleShape(w, h);) + luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); + return 1; + } + else if (top == 4 || top == 5) + { + float x = (float)luaL_checknumber(L, 1); + float y = (float)luaL_checknumber(L, 2); + float w = (float)luaL_checknumber(L, 3); + float h = (float)luaL_checknumber(L, 4); + float angle = (float)luaL_optnumber(L, 5, 0); + PolygonShape *shape; + EXCEPT_GUARD(shape = instance->newRectangleShape(x, y, w, h, angle);) + luax_pushtype(L, "PolygonShape", PHYSICS_POLYGON_SHAPE_T, shape); + return 1; + } + else + return luaL_error(L, "Incorrect number of parameters"); +} + +int w_newEdgeShape(lua_State *L) +{ + float x1 = (float)luaL_checknumber(L, 1); + float y1 = (float)luaL_checknumber(L, 2); + float x2 = (float)luaL_checknumber(L, 3); + float y2 = (float)luaL_checknumber(L, 4); + EdgeShape *shape; + EXCEPT_GUARD(shape = instance->newEdgeShape(x1, y1, x2, y2);) + luax_pushtype(L, "EdgeShape", PHYSICS_EDGE_SHAPE_T, shape); + return 1; +} + +int w_newPolygonShape(lua_State *L) +{ + int ret = 0; + EXCEPT_GUARD(ret = instance->newPolygonShape(L);) + return ret; +} + +int w_newChainShape(lua_State *L) +{ + int ret = 0; + EXCEPT_GUARD(ret = instance->newChainShape(L);) + return ret; +} + +int w_newDistanceJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + float x1 = (float)luaL_checknumber(L, 3); + float y1 = (float)luaL_checknumber(L, 4); + float x2 = (float)luaL_checknumber(L, 5); + float y2 = (float)luaL_checknumber(L, 6); + bool collideConnected = luax_optboolean(L, 7, false); + DistanceJoint *j; + EXCEPT_GUARD(j = instance->newDistanceJoint(body1, body2, x1, y1, x2, y2, collideConnected);) + luax_pushtype(L, "DistanceJoint", PHYSICS_DISTANCE_JOINT_T, j); + return 1; +} + +int w_newMouseJoint(lua_State *L) +{ + Body *body = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + MouseJoint *j; + EXCEPT_GUARD(j = instance->newMouseJoint(body, x, y);) + luax_pushtype(L, "MouseJoint", PHYSICS_MOUSE_JOINT_T, j); + return 1; +} + +int w_newRevoluteJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + float x = (float)luaL_checknumber(L, 3); + float y = (float)luaL_checknumber(L, 4); + bool collideConnected = luax_optboolean(L, 5, false); + RevoluteJoint *j; + EXCEPT_GUARD(j = instance->newRevoluteJoint(body1, body2, x, y, collideConnected);) + luax_pushtype(L, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T, j); + return 1; +} + +int w_newPrismaticJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + float xA = (float)luaL_checknumber(L, 3); + float yA = (float)luaL_checknumber(L, 4); + float xB, yB, ax, ay; + bool collideConnected; + if (lua_gettop(L) >= 8) + { + xB = (float)luaL_checknumber(L, 5); + yB = (float)luaL_checknumber(L, 6); + ax = (float)luaL_checknumber(L, 7); + ay = (float)luaL_checknumber(L, 8); + collideConnected = luax_optboolean(L, 9, false); + } + else + { + xB = xA; + yB = yA; + ax = (float)luaL_checknumber(L, 5); + ay = (float)luaL_checknumber(L, 6); + collideConnected = luax_optboolean(L, 7, false); + } + PrismaticJoint *j; + EXCEPT_GUARD(j = instance->newPrismaticJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);) + luax_pushtype(L, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T, j); + return 1; +} + +int w_newPulleyJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + float gx1 = (float)luaL_checknumber(L, 3); + float gy1 = (float)luaL_checknumber(L, 4); + float gx2 = (float)luaL_checknumber(L, 5); + float gy2 = (float)luaL_checknumber(L, 6); + float x1 = (float)luaL_checknumber(L, 7); + float y1 = (float)luaL_checknumber(L, 8); + float x2 = (float)luaL_checknumber(L, 9); + float y2 = (float)luaL_checknumber(L, 10); + float ratio = (float)luaL_optnumber(L, 11, 1.0); + bool collideConnected = luax_optboolean(L, 12, true); // PulleyJoints default to colliding connected bodies, see b2PulleyJoint.h + + PulleyJoint *j; + EXCEPT_GUARD(j = instance->newPulleyJoint(body1, body2, b2Vec2(gx1,gy1), b2Vec2(gx2,gy2), b2Vec2(x1,y1), b2Vec2(x2,y2), ratio, collideConnected);) + luax_pushtype(L, "PulleyJoint", PHYSICS_PULLEY_JOINT_T, j); + return 1; +} + +int w_newGearJoint(lua_State *L) +{ + Joint *joint1 = luax_checktype(L, 1, "Joint", PHYSICS_JOINT_T); + Joint *joint2 = luax_checktype(L, 2, "Joint", PHYSICS_JOINT_T); + float ratio = (float)luaL_optnumber(L, 3, 1.0); + bool collideConnected = luax_optboolean(L, 4, false); + + GearJoint *j; + EXCEPT_GUARD(j = instance->newGearJoint(joint1, joint2, ratio, collideConnected);) + luax_pushtype(L, "GearJoint", PHYSICS_GEAR_JOINT_T, j); + return 1; +} + +int w_newFrictionJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + float xA = (float)luaL_checknumber(L, 3); + float yA = (float)luaL_checknumber(L, 4); + float xB, yB; + bool collideConnected; + if (lua_gettop(L) >= 6) + { + xB = (float)luaL_checknumber(L, 5); + yB = (float)luaL_checknumber(L, 6); + collideConnected = luax_optboolean(L, 7, false); + } + else + { + xB = xA; + yB = yA; + collideConnected = luax_optboolean(L, 5, false); + } + FrictionJoint *j; + EXCEPT_GUARD(j = instance->newFrictionJoint(body1, body2, xA, yA, xB, yB, collideConnected);) + luax_pushtype(L, "FrictionJoint", PHYSICS_FRICTION_JOINT_T, j); + return 1; +} + +int w_newWeldJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + float xA = (float)luaL_checknumber(L, 3); + float yA = (float)luaL_checknumber(L, 4); + float xB, yB; + bool collideConnected; + if (lua_gettop(L) >= 6) + { + xB = (float)luaL_checknumber(L, 5); + yB = (float)luaL_checknumber(L, 6); + collideConnected = luax_optboolean(L, 7, false); + } + else + { + xB = xA; + yB = yA; + collideConnected = luax_optboolean(L, 5, false); + } + WeldJoint *j; + EXCEPT_GUARD(j = instance->newWeldJoint(body1, body2, xA, yA, xB, yB, collideConnected);) + luax_pushtype(L, "WeldJoint", PHYSICS_WELD_JOINT_T, j); + return 1; +} + +int w_newWheelJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + float xA = (float)luaL_checknumber(L, 3); + float yA = (float)luaL_checknumber(L, 4); + float xB, yB, ax, ay; + bool collideConnected; + if (lua_gettop(L) >= 8) + { + xB = (float)luaL_checknumber(L, 5); + yB = (float)luaL_checknumber(L, 6); + ax = (float)luaL_checknumber(L, 7); + ay = (float)luaL_checknumber(L, 8); + collideConnected = luax_optboolean(L, 9, false); + } + else + { + xB = xA; + yB = yA; + ax = (float)luaL_checknumber(L, 5); + ay = (float)luaL_checknumber(L, 6); + collideConnected = luax_optboolean(L, 7, false); + } + + WheelJoint *j; + EXCEPT_GUARD(j = instance->newWheelJoint(body1, body2, xA, yA, xB, yB, ax, ay, collideConnected);) + luax_pushtype(L, "WheelJoint", PHYSICS_WHEEL_JOINT_T, j); + return 1; +} + +int w_newRopeJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + float x1 = (float)luaL_checknumber(L, 3); + float y1 = (float)luaL_checknumber(L, 4); + float x2 = (float)luaL_checknumber(L, 5); + float y2 = (float)luaL_checknumber(L, 6); + float maxLength = (float)luaL_checknumber(L, 7); + bool collideConnected = luax_optboolean(L, 8, false); + RopeJoint *j; + EXCEPT_GUARD(j = instance->newRopeJoint(body1, body2, x1, y1, x2, y2, maxLength, collideConnected);) + luax_pushtype(L, "RopeJoint", PHYSICS_ROPE_JOINT_T, j); + return 1; +} + +int w_newMotorJoint(lua_State *L) +{ + Body *body1 = luax_checktype(L, 1, "Body", PHYSICS_BODY_T); + Body *body2 = luax_checktype(L, 2, "Body", PHYSICS_BODY_T); + MotorJoint *j = 0; + if (!lua_isnoneornil(L, 3)) + { + float correctionFactor = (float)luaL_checknumber(L, 3); + EXCEPT_GUARD(j = instance->newMotorJoint(body1, body2, correctionFactor);) + } + else + { + EXCEPT_GUARD(j = instance->newMotorJoint(body1, body2);) + } + luax_pushtype(L, "MotorJoint", PHYSICS_MOTOR_JOINT_T, j); + return 1; +} + +int w_getDistance(lua_State *L) +{ + return instance->getDistance(L); +} + +int w_setMeter(lua_State *L) +{ + int arg1 = luaL_checkint(L, 1); + EXCEPT_GUARD(Physics::setMeter(arg1);) + return 0; + +} +int w_getMeter(lua_State *L) +{ + lua_pushinteger(L, Physics::getMeter()); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "newWorld", w_newWorld }, + { "newBody", w_newBody }, + { "newFixture", w_newFixture }, + { "newCircleShape", w_newCircleShape }, + { "newRectangleShape", w_newRectangleShape }, + { "newPolygonShape", w_newPolygonShape }, + { "newEdgeShape", w_newEdgeShape }, + { "newChainShape", w_newChainShape }, + { "newDistanceJoint", w_newDistanceJoint }, + { "newMouseJoint", w_newMouseJoint }, + { "newRevoluteJoint", w_newRevoluteJoint }, + { "newPrismaticJoint", w_newPrismaticJoint }, + { "newPulleyJoint", w_newPulleyJoint }, + { "newGearJoint", w_newGearJoint }, + { "newFrictionJoint", w_newFrictionJoint }, + { "newWeldJoint", w_newWeldJoint }, + { "newWheelJoint", w_newWheelJoint }, + { "newRopeJoint", w_newRopeJoint }, + { "newMotorJoint", w_newMotorJoint }, + { "getDistance", w_getDistance }, + { "getMeter", w_getMeter }, + { "setMeter", w_setMeter }, + { 0, 0 }, +}; + +static const lua_CFunction types[] = +{ + luaopen_world, + luaopen_contact, + luaopen_body, + luaopen_fixture, + luaopen_shape, + luaopen_circleshape, + luaopen_polygonshape, + luaopen_edgeshape, + luaopen_chainshape, + luaopen_joint, + luaopen_mousejoint, + luaopen_distancejoint, + luaopen_prismaticjoint, + luaopen_revolutejoint, + luaopen_pulleyjoint, + luaopen_gearjoint, + luaopen_frictionjoint, + luaopen_weldjoint, + luaopen_wheeljoint, + luaopen_ropejoint, + luaopen_motorjoint, + 0 +}; + +extern "C" int luaopen_love_physics(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new Physics();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "physics"; + w.flags = MODULE_T; + w.functions = functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_Physics.h b/jni/love/src/modules/physics/box2d/wrap_Physics.h new file mode 100644 index 00000000..900ca8e3 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Physics.h @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_PHYSICS_H +#define LOVE_PHYSICS_BOX2D_WRAP_PHYSICS_H + +// LOVE +#include "common/config.h" +#include "Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +int w_newWorld(lua_State *L); +int w_newBody(lua_State *L); +int w_newFixture(lua_State *L); +int w_newCircleShape(lua_State *L); +int w_newRectangleShape(lua_State *L); +int w_newPolygonShape(lua_State *L); +int w_newEdgeShape(lua_State *L); +int w_newChainShape(lua_State *L); +int w_newDistanceJoint(lua_State *L); +int w_newMouseJoint(lua_State *L); +int w_newRevoluteJoint(lua_State *L); +int w_newPrismaticJoint(lua_State *L); +int w_newPulleyJoint(lua_State *L); +int w_newGearJoint(lua_State *L); +int w_newFrictionJoint(lua_State *L); +int w_newWeldJoint(lua_State *L); +int w_newWheelJoint(lua_State *L); +int w_newRopeJoint(lua_State *L); +int w_newMotorJoint(lua_State *L); +int w_getDistance(lua_State *L); +int w_setMeter(lua_State *L); +int w_getMeter(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_physics(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_PHYSICS_H diff --git a/jni/love/src/modules/physics/box2d/wrap_PolygonShape.cpp b/jni/love/src/modules/physics/box2d/wrap_PolygonShape.cpp new file mode 100644 index 00000000..96436857 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_PolygonShape.cpp @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_PolygonShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PolygonShape *luax_checkpolygonshape(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "PolygonShape", PHYSICS_POLYGON_SHAPE_T); +} + +int w_PolygonShape_getPoints(lua_State *L) +{ + PolygonShape *t = luax_checkpolygonshape(L, 1); + lua_remove(L, 1); + return t->getPoints(L); +} + +int w_PolygonShape_validate(lua_State *L) +{ + PolygonShape *t = luax_checkpolygonshape(L, 1); + luax_pushboolean(L, t->validate()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getPoints", w_PolygonShape_getPoints }, + { "validate", w_PolygonShape_validate }, + // From Shape. + { "getType", w_Shape_getType }, + { "getRadius", w_Shape_getRadius }, + { "getChildCount", w_Shape_getChildCount }, + { "testPoint", w_Shape_testPoint }, + { "rayCast", w_Shape_rayCast }, + { "computeAABB", w_Shape_computeAABB }, + { "computeMass", w_Shape_computeMass }, + { 0, 0 } +}; + +extern "C" int luaopen_polygonshape(lua_State *L) +{ + return luax_register_type(L, "PolygonShape", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_PolygonShape.h b/jni/love/src/modules/physics/box2d/wrap_PolygonShape.h new file mode 100644 index 00000000..a745a265 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_PolygonShape.h @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_POLYGON_SHAPE_H +#define LOVE_PHYSICS_BOX2D_WRAP_POLYGON_SHAPE_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Shape.h" +#include "PolygonShape.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PolygonShape *luax_checkpolygonshape(lua_State *L, int idx); +int w_PolygonShape_getPoints(lua_State *L); +int w_PolygonShape_validate(lua_State *L); +extern "C" int luaopen_polygonshape(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_POLYGON_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.cpp new file mode 100644 index 00000000..6ec44673 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.cpp @@ -0,0 +1,203 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_PrismaticJoint.h" +#include "wrap_Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PrismaticJoint *luax_checkprismaticjoint(lua_State *L, int idx) +{ + PrismaticJoint *j = luax_checktype(L, idx, "PrismaticJoint", PHYSICS_PRISMATIC_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_PrismaticJoint_getJointTranslation(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + lua_pushnumber(L, t->getJointTranslation()); + return 1; +} + +int w_PrismaticJoint_getJointSpeed(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + lua_pushnumber(L, t->getJointSpeed()); + return 1; +} + +int w_PrismaticJoint_setMotorEnabled(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + bool arg1 = luax_toboolean(L, 2); + t->setMotorEnabled(arg1); + return 0; +} + +int w_PrismaticJoint_isMotorEnabled(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + luax_pushboolean(L, t->isMotorEnabled()); + return 1; +} + +int w_PrismaticJoint_setMaxMotorForce(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setMaxMotorForce(arg1); + return 0; +} + +int w_PrismaticJoint_setMotorSpeed(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setMotorSpeed(arg1); + return 0; +} + +int w_PrismaticJoint_getMotorSpeed(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + lua_pushnumber(L, t->getMotorSpeed()); + return 1; +} + +int w_PrismaticJoint_getMotorForce(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + float inv_dt = (float)luaL_checknumber(L, 2); + lua_pushnumber(L, t->getMotorForce(inv_dt)); + return 1; +} + +int w_PrismaticJoint_getMaxMotorForce(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + lua_pushnumber(L, t->getMaxMotorForce()); + return 1; +} + +int w_PrismaticJoint_setLimitsEnabled(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + bool arg1 = luax_toboolean(L, 2); + t->setLimitsEnabled(arg1); + return 0; +} + +int w_PrismaticJoint_hasLimitsEnabled(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + luax_pushboolean(L, t->hasLimitsEnabled()); + return 1; +} + +int w_PrismaticJoint_setUpperLimit(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setUpperLimit(arg1);) + return 0; +} + +int w_PrismaticJoint_setLowerLimit(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setLowerLimit(arg1);) + return 0; +} + +int w_PrismaticJoint_setLimits(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_checknumber(L, 3); + EXCEPT_GUARD(t->setLimits(arg1, arg2);) + return 0; +} + +int w_PrismaticJoint_getLowerLimit(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + lua_pushnumber(L, t->getLowerLimit()); + return 1; +} + +int w_PrismaticJoint_getUpperLimit(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + lua_pushnumber(L, t->getUpperLimit()); + return 1; +} + +int w_PrismaticJoint_getLimits(lua_State *L) +{ + PrismaticJoint *t = luax_checkprismaticjoint(L, 1); + lua_remove(L, 1); + return t->getLimits(L); +} + +static const luaL_Reg functions[] = +{ + { "getJointTranslation", w_PrismaticJoint_getJointTranslation }, + { "getJointSpeed", w_PrismaticJoint_getJointSpeed }, + { "setMotorEnabled", w_PrismaticJoint_setMotorEnabled }, + { "isMotorEnabled", w_PrismaticJoint_isMotorEnabled }, + { "setMaxMotorForce", w_PrismaticJoint_setMaxMotorForce }, + { "setMotorSpeed", w_PrismaticJoint_setMotorSpeed }, + { "getMotorSpeed", w_PrismaticJoint_getMotorSpeed }, + { "getMotorForce", w_PrismaticJoint_getMotorForce }, + { "getMaxMotorForce", w_PrismaticJoint_getMaxMotorForce }, + { "setLimitsEnabled", w_PrismaticJoint_setLimitsEnabled }, + { "hasLimitsEnabled", w_PrismaticJoint_hasLimitsEnabled }, + { "setUpperLimit", w_PrismaticJoint_setUpperLimit }, + { "setLowerLimit", w_PrismaticJoint_setLowerLimit }, + { "setLimits", w_PrismaticJoint_setLimits }, + { "getLowerLimit", w_PrismaticJoint_getLowerLimit }, + { "getUpperLimit", w_PrismaticJoint_getUpperLimit }, + { "getLimits", w_PrismaticJoint_getLimits }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_prismaticjoint(lua_State *L) +{ + return luax_register_type(L, "PrismaticJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.h b/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.h new file mode 100644 index 00000000..ff480b15 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_PrismaticJoint.h @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "PrismaticJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PrismaticJoint *luax_checkprismaticjoint(lua_State *L, int idx); +int w_PrismaticJoint_getJointTranslation(lua_State *L); +int w_PrismaticJoint_getJointSpeed(lua_State *L); +int w_PrismaticJoint_setMotorEnabled(lua_State *L); +int w_PrismaticJoint_isMotorEnabled(lua_State *L); +int w_PrismaticJoint_setMaxMotorForce(lua_State *L); +int w_PrismaticJoint_setMotorSpeed(lua_State *L); +int w_PrismaticJoint_getMotorSpeed(lua_State *L); +int w_PrismaticJoint_getMotorForce(lua_State *L); +int w_PrismaticJoint_getMaxMotorForce(lua_State *L); +int w_PrismaticJoint_setLimitsEnabled(lua_State *L); +int w_PrismaticJoint_hasLimitsEnabled(lua_State *L); +int w_PrismaticJoint_setUpperLimit(lua_State *L); +int w_PrismaticJoint_setLowerLimit(lua_State *L); +int w_PrismaticJoint_setLimits(lua_State *L); +int w_PrismaticJoint_getLowerLimit(lua_State *L); +int w_PrismaticJoint_getUpperLimit(lua_State *L); +int w_PrismaticJoint_getLimits(lua_State *L); +extern "C" int luaopen_prismaticjoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_PRISMATIC_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.cpp new file mode 100644 index 00000000..55bf003c --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.cpp @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_PulleyJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PulleyJoint *luax_checkpulleyjoint(lua_State *L, int idx) +{ + PulleyJoint *j = luax_checktype(L, idx, "PulleyJoint", PHYSICS_PULLEY_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_PulleyJoint_getGroundAnchors(lua_State *L) +{ + PulleyJoint *t = luax_checkpulleyjoint(L, 1); + lua_remove(L, 1); + return t->getGroundAnchors(L); +} + +int w_PulleyJoint_getLengthA(lua_State *L) +{ + PulleyJoint *t = luax_checkpulleyjoint(L, 1); + lua_pushnumber(L, t->getLengthA()); + return 1; +} + +int w_PulleyJoint_getLengthB(lua_State *L) +{ + PulleyJoint *t = luax_checkpulleyjoint(L, 1); + lua_pushnumber(L, t->getLengthB()); + return 1; +} + +int w_PulleyJoint_getRatio(lua_State *L) +{ + PulleyJoint *t = luax_checkpulleyjoint(L, 1); + lua_pushnumber(L, t->getRatio()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getGroundAnchors", w_PulleyJoint_getGroundAnchors }, + { "getLengthA", w_PulleyJoint_getLengthA }, + { "getLengthB", w_PulleyJoint_getLengthB }, + { "getRatio", w_PulleyJoint_getRatio }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_pulleyjoint(lua_State *L) +{ + return luax_register_type(L, "PulleyJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.h b/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.h new file mode 100644 index 00000000..9d921e3d --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_PulleyJoint.h @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_PULLEY_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_PULLEY_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "PulleyJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +PulleyJoint *luax_checkpulleyjoint(lua_State *L, int idx); +int w_PulleyJoint_getGroundAnchors(lua_State *L); +int w_PulleyJoint_getLengthA(lua_State *L); +int w_PulleyJoint_getLengthB(lua_State *L); +int w_PulleyJoint_getRatio(lua_State *L); +extern "C" int luaopen_pulleyjoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_PULLEY_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.cpp new file mode 100644 index 00000000..931a7bdb --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.cpp @@ -0,0 +1,203 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_RevoluteJoint.h" +#include "wrap_Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +RevoluteJoint *luax_checkrevolutejoint(lua_State *L, int idx) +{ + RevoluteJoint *j = luax_checktype(L, idx, "RevoluteJoint", PHYSICS_REVOLUTE_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_RevoluteJoint_getJointAngle(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + lua_pushnumber(L, t->getJointAngle()); + return 1; +} + +int w_RevoluteJoint_getJointSpeed(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + lua_pushnumber(L, t->getJointSpeed()); + return 1; +} + +int w_RevoluteJoint_setMotorEnabled(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + bool arg1 = luax_toboolean(L, 2); + t->setMotorEnabled(arg1); + return 0; +} + +int w_RevoluteJoint_isMotorEnabled(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + luax_pushboolean(L, t->isMotorEnabled()); + return 1; +} + +int w_RevoluteJoint_setMaxMotorTorque(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setMaxMotorTorque(arg1); + return 0; +} + +int w_RevoluteJoint_setMotorSpeed(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setMotorSpeed(arg1); + return 0; +} + +int w_RevoluteJoint_getMotorSpeed(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + lua_pushnumber(L, t->getMotorSpeed()); + return 1; +} + +int w_RevoluteJoint_getMotorTorque(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + float inv_dt = (float)luaL_checknumber(L, 2); + lua_pushnumber(L, t->getMotorTorque(inv_dt)); + return 1; +} + +int w_RevoluteJoint_getMaxMotorTorque(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + lua_pushnumber(L, t->getMaxMotorTorque()); + return 1; +} + +int w_RevoluteJoint_setLimitsEnabled(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + bool arg1 = luax_toboolean(L, 2); + t->setLimitsEnabled(arg1); + return 0; +} + +int w_RevoluteJoint_hasLimitsEnabled(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + luax_pushboolean(L, t->hasLimitsEnabled()); + return 1; +} + +int w_RevoluteJoint_setUpperLimit(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setUpperLimit(arg1);) + return 0; +} + +int w_RevoluteJoint_setLowerLimit(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->setLowerLimit(arg1);) + return 0; +} + +int w_RevoluteJoint_setLimits(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_checknumber(L, 3); + EXCEPT_GUARD(t->setLimits(arg1, arg2);) + return 0; +} + +int w_RevoluteJoint_getLowerLimit(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + lua_pushnumber(L, t->getLowerLimit()); + return 1; +} + +int w_RevoluteJoint_getUpperLimit(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + lua_pushnumber(L, t->getUpperLimit()); + return 1; +} + +int w_RevoluteJoint_getLimits(lua_State *L) +{ + RevoluteJoint *t = luax_checkrevolutejoint(L, 1); + lua_remove(L, 1); + return t->getLimits(L); +} + +static const luaL_Reg functions[] = +{ + { "getJointAngle", w_RevoluteJoint_getJointAngle }, + { "getJointSpeed", w_RevoluteJoint_getJointSpeed }, + { "setMotorEnabled", w_RevoluteJoint_setMotorEnabled }, + { "isMotorEnabled", w_RevoluteJoint_isMotorEnabled }, + { "setMaxMotorTorque", w_RevoluteJoint_setMaxMotorTorque }, + { "setMotorSpeed", w_RevoluteJoint_setMotorSpeed }, + { "getMotorSpeed", w_RevoluteJoint_getMotorSpeed }, + { "getMotorTorque", w_RevoluteJoint_getMotorTorque }, + { "getMaxMotorTorque", w_RevoluteJoint_getMaxMotorTorque }, + { "setLimitsEnabled", w_RevoluteJoint_setLimitsEnabled }, + { "hasLimitsEnabled", w_RevoluteJoint_hasLimitsEnabled }, + { "setUpperLimit", w_RevoluteJoint_setUpperLimit }, + { "setLowerLimit", w_RevoluteJoint_setLowerLimit }, + { "setLimits", w_RevoluteJoint_setLimits }, + { "getLowerLimit", w_RevoluteJoint_getLowerLimit }, + { "getUpperLimit", w_RevoluteJoint_getUpperLimit }, + { "getLimits", w_RevoluteJoint_getLimits }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_revolutejoint(lua_State *L) +{ + return luax_register_type(L, "RevoluteJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.h b/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.h new file mode 100644 index 00000000..edd20003 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_RevoluteJoint.h @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_REVOLUTE_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_REVOLUTE_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "RevoluteJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +RevoluteJoint *luax_checkrevolutejoint(lua_State *L, int idx); +int w_RevoluteJoint_getJointAngle(lua_State *L); +int w_RevoluteJoint_getJointSpeed(lua_State *L); +int w_RevoluteJoint_setMotorEnabled(lua_State *L); +int w_RevoluteJoint_isMotorEnabled(lua_State *L); +int w_RevoluteJoint_setMaxMotorTorque(lua_State *L); +int w_RevoluteJoint_setMotorSpeed(lua_State *L); +int w_RevoluteJoint_getMotorSpeed(lua_State *L); +int w_RevoluteJoint_getMotorTorque(lua_State *L); +int w_RevoluteJoint_getMaxMotorTorque(lua_State *L); +int w_RevoluteJoint_setLimitsEnabled(lua_State *L); +int w_RevoluteJoint_hasLimitsEnabled(lua_State *L); +int w_RevoluteJoint_setUpperLimit(lua_State *L); +int w_RevoluteJoint_setLowerLimit(lua_State *L); +int w_RevoluteJoint_setLimits(lua_State *L); +int w_RevoluteJoint_getLowerLimit(lua_State *L); +int w_RevoluteJoint_getUpperLimit(lua_State *L); +int w_RevoluteJoint_getLimits(lua_State *L); +extern "C" int luaopen_revolutejoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_REVOLUTE_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_RopeJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_RopeJoint.cpp new file mode 100644 index 00000000..c0deec32 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_RopeJoint.cpp @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_RopeJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +RopeJoint *luax_checkropejoint(lua_State *L, int idx) +{ + RopeJoint *j = luax_checktype(L, idx, "RopeJoint", PHYSICS_ROPE_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_RopeJoint_getMaxLength(lua_State *L) +{ + RopeJoint *t = luax_checkropejoint(L, 1); + lua_pushnumber(L, t->getMaxLength()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getMaxLength", w_RopeJoint_getMaxLength }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_ropejoint(lua_State *L) +{ + return luax_register_type(L, "RopeJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_RopeJoint.h b/jni/love/src/modules/physics/box2d/wrap_RopeJoint.h new file mode 100644 index 00000000..5dd07351 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_RopeJoint.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "RopeJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +RopeJoint *luax_checkropejoint(lua_State *L, int idx); +int w_RopeJoint_getMaxLength(lua_State *L); +extern "C" int luaopen_ropejoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_ROPE_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_Shape.cpp b/jni/love/src/modules/physics/box2d/wrap_Shape.cpp new file mode 100644 index 00000000..f6a69355 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Shape.cpp @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Shape.h" +#include "common/StringMap.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Shape *luax_checkshape(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Shape", PHYSICS_SHAPE_T); +} + +int w_Shape_getType(lua_State *L) +{ + Shape *t = luax_checkshape(L, 1); + const char *type = ""; + Shape::getConstant(t->getType(), type); + lua_pushstring(L, type); + return 1; +} + +int w_Shape_getRadius(lua_State *L) +{ + Shape *t = luax_checkshape(L, 1); + float radius = t->getRadius(); + lua_pushnumber(L, radius); + return 1; +} + +int w_Shape_getChildCount(lua_State *L) +{ + Shape *t = luax_checkshape(L, 1); + int childCount = t->getChildCount(); + lua_pushinteger(L, childCount); + return 1; +} + +int w_Shape_testPoint(lua_State *L) +{ + Shape *t = luax_checkshape(L, 1); + float x = (float)luaL_checknumber(L, 2); + float y = (float)luaL_checknumber(L, 3); + float r = (float)luaL_checknumber(L, 4); + float px = (float)luaL_checknumber(L, 5); + float py = (float)luaL_checknumber(L, 6); + bool result = t->testPoint(x, y, r, px, py); + lua_pushboolean(L, result); + return 1; +} + +int w_Shape_rayCast(lua_State *L) +{ + Shape *t = luax_checkshape(L, 1); + lua_remove(L, 1); + int ret = 0; + EXCEPT_GUARD(ret = t->rayCast(L);) + return ret; +} + +int w_Shape_computeAABB(lua_State *L) +{ + Shape *t = luax_checkshape(L, 1); + lua_remove(L, 1); + return t->computeAABB(L); +} + +int w_Shape_computeMass(lua_State *L) +{ + Shape *t = luax_checkshape(L, 1); + lua_remove(L, 1); + return t->computeMass(L); +} + +static const luaL_Reg functions[] = +{ + { "getType", w_Shape_getType }, + { "getRadius", w_Shape_getRadius }, + { "getChildCount", w_Shape_getChildCount }, + { "testPoint", w_Shape_testPoint }, + { "rayCast", w_Shape_rayCast }, + { "computeAABB", w_Shape_computeAABB }, + { "computeMass", w_Shape_computeMass }, + { 0, 0 } +}; + +extern "C" int luaopen_shape(lua_State *L) +{ + return luax_register_type(L, "Shape", functions); +} + +} // box2d +} // physics +} // love + diff --git a/jni/love/src/modules/physics/box2d/wrap_Shape.h b/jni/love/src/modules/physics/box2d/wrap_Shape.h new file mode 100644 index 00000000..6177de41 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_Shape.h @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_SHAPE_H +#define LOVE_PHYSICS_BOX2D_WRAP_SHAPE_H + +// LOVE +#include "common/runtime.h" +#include "Shape.h" +#include "wrap_Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +Shape *luax_checkshape(lua_State *L, int idx); +int w_Shape_getType(lua_State *L); +int w_Shape_getRadius(lua_State *L); + +int w_Shape_getChildCount(lua_State *L); +int w_Shape_testPoint(lua_State *L); +int w_Shape_rayCast(lua_State *L); +int w_Shape_computeAABB(lua_State *L); +int w_Shape_computeMass(lua_State *L); + +extern "C" int luaopen_shape(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_SHAPE_H diff --git a/jni/love/src/modules/physics/box2d/wrap_WeldJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_WeldJoint.cpp new file mode 100644 index 00000000..89c0caf3 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_WeldJoint.cpp @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_WeldJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +WeldJoint *luax_checkweldjoint(lua_State *L, int idx) +{ + WeldJoint *j = luax_checktype(L, idx, "WeldJoint", PHYSICS_WELD_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_WeldJoint_setFrequency(lua_State *L) +{ + WeldJoint *t = luax_checkweldjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setFrequency(arg1); + return 0; +} + +int w_WeldJoint_getFrequency(lua_State *L) +{ + WeldJoint *t = luax_checkweldjoint(L, 1); + lua_pushnumber(L, t->getFrequency()); + return 1; +} + +int w_WeldJoint_setDampingRatio(lua_State *L) +{ + WeldJoint *t = luax_checkweldjoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setDampingRatio(arg1); + return 0; +} + +int w_WeldJoint_getDampingRatio(lua_State *L) +{ + WeldJoint *t = luax_checkweldjoint(L, 1); + lua_pushnumber(L, t->getDampingRatio()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "setFrequency", w_WeldJoint_setFrequency }, + { "getFrequency", w_WeldJoint_getFrequency }, + { "setDampingRatio", w_WeldJoint_setDampingRatio }, + { "getDampingRatio", w_WeldJoint_getDampingRatio }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_weldjoint(lua_State *L) +{ + return luax_register_type(L, "WeldJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_WeldJoint.h b/jni/love/src/modules/physics/box2d/wrap_WeldJoint.h new file mode 100644 index 00000000..aa75d5ee --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_WeldJoint.h @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_WELD_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_WELD_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "WeldJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +WeldJoint *luax_checkweldjoint(lua_State *L, int idx); + +int w_WeldJoint_setFrequency(lua_State *L); +int w_WeldJoint_getFrequency(lua_State *L); +int w_WeldJoint_setDampingRatio(lua_State *L); +int w_WeldJoint_getDampingRatio(lua_State *L); + +extern "C" int luaopen_weldjoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_WELD_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_WheelJoint.cpp b/jni/love/src/modules/physics/box2d/wrap_WheelJoint.cpp new file mode 100644 index 00000000..f6df2891 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_WheelJoint.cpp @@ -0,0 +1,167 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_WheelJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +WheelJoint *luax_checkwheeljoint(lua_State *L, int idx) +{ + WheelJoint *j = luax_checktype(L, idx, "WheelJoint", PHYSICS_WHEEL_JOINT_T); + if (!j->isValid()) + luaL_error(L, "Attempt to use destroyed joint."); + return j; +} + +int w_WheelJoint_getJointTranslation(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + lua_pushnumber(L, t->getJointTranslation()); + return 1; +} + +int w_WheelJoint_getJointSpeed(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + lua_pushnumber(L, t->getJointSpeed()); + return 1; +} + +int w_WheelJoint_setMotorEnabled(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + bool arg1 = luax_toboolean(L, 2); + t->setMotorEnabled(arg1); + return 0; +} + +int w_WheelJoint_isMotorEnabled(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + luax_pushboolean(L, t->isMotorEnabled()); + return 1; +} + +int w_WheelJoint_setMotorSpeed(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setMotorSpeed(arg1); + return 0; +} + +int w_WheelJoint_getMotorSpeed(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + lua_pushnumber(L, t->getMotorSpeed()); + return 1; +} + +int w_WheelJoint_setMaxMotorTorque(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setMaxMotorTorque(arg1); + return 0; +} + +int w_WheelJoint_getMaxMotorTorque(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + lua_pushnumber(L, t->getMaxMotorTorque()); + return 1; +} + +int w_WheelJoint_getMotorTorque(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + float inv_dt = (float)luaL_checknumber(L, 2); + lua_pushnumber(L, t->getMotorTorque(inv_dt)); + return 1; +} + +int w_WheelJoint_setSpringFrequency(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setSpringFrequency(arg1); + return 0; +} + +int w_WheelJoint_getSpringFrequency(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + lua_pushnumber(L, t->getSpringFrequency()); + return 1; +} + +int w_WheelJoint_setSpringDampingRatio(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + t->setSpringDampingRatio(arg1); + return 0; +} + +int w_WheelJoint_getSpringDampingRatio(lua_State *L) +{ + WheelJoint *t = luax_checkwheeljoint(L, 1); + lua_pushnumber(L, t->getSpringDampingRatio()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getJointTranslation", w_WheelJoint_getJointTranslation }, + { "getJointSpeed", w_WheelJoint_getJointSpeed }, + { "setMotorEnabled", w_WheelJoint_setMotorEnabled }, + { "isMotorEnabled", w_WheelJoint_isMotorEnabled }, + { "setMotorSpeed", w_WheelJoint_setMotorSpeed }, + { "getMotorSpeed", w_WheelJoint_getMotorSpeed }, + { "setMaxMotorTorque", w_WheelJoint_setMaxMotorTorque }, + { "getMaxMotorTorque", w_WheelJoint_getMaxMotorTorque }, + { "getMotorTorque", w_WheelJoint_getMotorTorque }, + { "setSpringFrequency", w_WheelJoint_setSpringFrequency }, + { "getSpringFrequency", w_WheelJoint_getSpringFrequency }, + { "setSpringDampingRatio", w_WheelJoint_setSpringDampingRatio }, + { "getSpringDampingRatio", w_WheelJoint_getSpringDampingRatio }, + // From Joint. + { "getType", w_Joint_getType }, + { "getAnchors", w_Joint_getAnchors }, + { "getReactionForce", w_Joint_getReactionForce }, + { "getReactionTorque", w_Joint_getReactionTorque }, + { "getCollideConnected", w_Joint_getCollideConnected }, + { "destroy", w_Joint_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_wheeljoint(lua_State *L) +{ + return luax_register_type(L, "WheelJoint", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_WheelJoint.h b/jni/love/src/modules/physics/box2d/wrap_WheelJoint.h new file mode 100644 index 00000000..96b2f55e --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_WheelJoint.h @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H +#define LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H + +// LOVE +#include "common/runtime.h" +#include "wrap_Joint.h" +#include "WheelJoint.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +WheelJoint *luax_checkwheeljoint(lua_State *L, int idx); +int w_WheelJoint_getJointTranslation(lua_State *L); +int w_WheelJoint_getJointSpeed(lua_State *L); +int w_WheelJoint_setMotorEnabled(lua_State *L); +int w_WheelJoint_isMotorEnabled(lua_State *L); +int w_WheelJoint_setMotorSpeed(lua_State *L); +int w_WheelJoint_getMotorSpeed(lua_State *L); +int w_WheelJoint_setMaxMotorTorque(lua_State *L); +int w_WheelJoint_getMaxMotorTorque(lua_State *L); +int w_WheelJoint_getMotorTorque(lua_State *L); +int w_WheelJoint_setSpringFrequency(lua_State *L); +int w_WheelJoint_getSpringFrequency(lua_State *L); +int w_WheelJoint_setSpringDampingRatio(lua_State *L); +int w_WheelJoint_getSpringDampingRatio(lua_State *L); +extern "C" int luaopen_wheeljoint(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_WHEEL_JOINT_H diff --git a/jni/love/src/modules/physics/box2d/wrap_World.cpp b/jni/love/src/modules/physics/box2d/wrap_World.cpp new file mode 100644 index 00000000..ea7e2b29 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_World.cpp @@ -0,0 +1,219 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_World.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +World *luax_checkworld(lua_State *L, int idx) +{ + World *w = luax_checktype(L, idx, "World", PHYSICS_WORLD_T); + if (!w->isValid()) + luaL_error(L, "Attempt to use destroyed world."); + return w; +} + +int w_World_update(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + float dt = (float)luaL_checknumber(L, 2); + EXCEPT_GUARD(t->update(dt);) + return 0; +} + +int w_World_setCallbacks(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->setCallbacks(L); +} + +int w_World_getCallbacks(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->getCallbacks(L); +} + +int w_World_setContactFilter(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->setContactFilter(L); +} + +int w_World_getContactFilter(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->getContactFilter(L); +} + +int w_World_setGravity(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_checknumber(L, 3); + t->setGravity(arg1, arg2); + return 0; +} + +int w_World_getGravity(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->getGravity(L); +} + +int w_World_translateOrigin(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + float arg1 = (float)luaL_checknumber(L, 2); + float arg2 = (float)luaL_checknumber(L, 3); + EXCEPT_GUARD(t->translateOrigin(arg1, arg2);) + return 0; +} + +int w_World_setSleepingAllowed(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + bool b = luax_toboolean(L, 2); + t->setSleepingAllowed(b); + return 0; +} + +int w_World_isSleepingAllowed(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + luax_pushboolean(L, t->isSleepingAllowed()); + return 1; +} + +int w_World_isLocked(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + luax_pushboolean(L, t->isLocked()); + return 1; +} + +int w_World_getBodyCount(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_pushinteger(L, t->getBodyCount()); + return 1; +} + +int w_World_getJointCount(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_pushinteger(L, t->getJointCount()); + return 1; +} + +int w_World_getContactCount(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_pushinteger(L, t->getContactCount()); + return 1; +} + +int w_World_getBodyList(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->getBodyList(L); +} + +int w_World_getJointList(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->getJointList(L); +} + +int w_World_getContactList(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->getContactList(L); +} + +int w_World_queryBoundingBox(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + return t->queryBoundingBox(L); +} + +int w_World_rayCast(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + lua_remove(L, 1); + int ret = 0; + EXCEPT_GUARD(ret = t->rayCast(L);) + return ret; +} + +int w_World_destroy(lua_State *L) +{ + World *t = luax_checkworld(L, 1); + EXCEPT_GUARD(t->destroy();) + return 0; +} + + +static const luaL_Reg functions[] = +{ + { "update", w_World_update }, + { "setCallbacks", w_World_setCallbacks }, + { "getCallbacks", w_World_getCallbacks }, + { "setContactFilter", w_World_setContactFilter }, + { "getContactFilter", w_World_getContactFilter }, + { "setGravity", w_World_setGravity }, + { "getGravity", w_World_getGravity }, + { "translateOrigin", w_World_translateOrigin }, + { "setSleepingAllowed", w_World_setSleepingAllowed }, + { "isSleepingAllowed", w_World_isSleepingAllowed }, + { "isLocked", w_World_isLocked }, + { "getBodyCount", w_World_getBodyCount }, + { "getJointCount", w_World_getJointCount }, + { "getContactCount", w_World_getContactCount }, + { "getBodyList", w_World_getBodyList }, + { "getJointList", w_World_getJointList }, + { "getContactList", w_World_getContactList }, + { "queryBoundingBox", w_World_queryBoundingBox }, + { "rayCast", w_World_rayCast }, + { "destroy", w_World_destroy }, + { 0, 0 } +}; + +extern "C" int luaopen_world(lua_State *L) +{ + return luax_register_type(L, "World", functions); +} + +} // box2d +} // physics +} // love diff --git a/jni/love/src/modules/physics/box2d/wrap_World.h b/jni/love/src/modules/physics/box2d/wrap_World.h new file mode 100644 index 00000000..2e060cd0 --- /dev/null +++ b/jni/love/src/modules/physics/box2d/wrap_World.h @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_PHYSICS_BOX2D_WRAP_WORLD_H +#define LOVE_PHYSICS_BOX2D_WRAP_WORLD_H + +// LOVE +#include "common/runtime.h" +#include "common/Exception.h" +#include "World.h" +#include "wrap_Physics.h" + +namespace love +{ +namespace physics +{ +namespace box2d +{ + +World *luax_checkworld(lua_State *L, int idx); +int w_World_update(lua_State *L); +int w_World_setCallbacks(lua_State *L); +int w_World_getCallbacks(lua_State *L); +int w_World_setContactFilter(lua_State *L); +int w_World_getContactFilter(lua_State *L); +int w_World_setGravity(lua_State *L); +int w_World_getGravity(lua_State *L); +int w_World_translateOrigin(lua_State *L); +int w_World_setSleepingAllowed(lua_State *L); +int w_World_isSleepingAllowed(lua_State *L); +int w_World_isLocked(lua_State *L); +int w_World_getBodyCount(lua_State *L); +int w_World_getJointCount(lua_State *L); +int w_World_getContactCount(lua_State *L); +int w_World_getBodyList(lua_State *L); +int w_World_getJointList(lua_State *L); +int w_World_getContactList(lua_State *L); +int w_World_queryBoundingBox(lua_State *L); +int w_World_rayCast(lua_State *L); +int w_World_destroy(lua_State *L); +extern "C" int luaopen_world(lua_State *L); + +} // box2d +} // physics +} // love + +#endif // LOVE_PHYSICS_BOX2D_WRAP_WORLD_H diff --git a/jni/love/src/modules/sound/Decoder.h b/jni/love/src/modules/sound/Decoder.h new file mode 100644 index 00000000..2690874c --- /dev/null +++ b/jni/love/src/modules/sound/Decoder.h @@ -0,0 +1,142 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_DECODER_H +#define LOVE_SOUND_DECODER_H + +// LOVE +#include "common/Object.h" + +namespace love +{ +namespace sound +{ +/** + * Decoder objects are responsible for decoding audio files. They maintain + * an interal buffer into which they write raw decoded audio data. + **/ +class Decoder : public Object +{ +public: + + /** + * Indicates how many bytes of raw data should be generated at each + * call to Decode. + **/ + static const int DEFAULT_BUFFER_SIZE = 2048; + + /** + * Indicates the quality of the sound. + **/ + static const int DEFAULT_SAMPLE_RATE = 44100; + + /** + * Default is stereo. + **/ + static const int DEFAULT_CHANNELS = 2; + + /** + * 16 bit audio is the default. + **/ + static const int DEFAULT_BIT_DEPTH = 16; + + /** + * Creates a deep of itself. The sound stream can (and should) be + * rewound, and does not have to be at the same place. + * @return A new Decoder object. + **/ + virtual Decoder *clone() = 0; + + /** + * Destructor. Should free internal buffer. + **/ + virtual ~Decoder() {}; + + /** + * Decodes the next chunk of the music stream, this will usually be + * bufferSize amount of bytes, unless EOF occurs. Zero or negative values + * indicate EOF or errors. + * @return The number of bytes actually decoded. + **/ + virtual int decode() = 0; + + /** + * Gets the size of the buffer (NOT the size of the entire stream). + * @return The size of the buffer. + **/ + virtual int getSize() const = 0; + + /** + * Gets a pointer to the actual data. The contents of this buffer will + * change with each call to decode, so the client must copy the data. + * @return A buffer to raw sound data. + **/ + virtual void *getBuffer() const = 0; + + /** + * Seeks to the specified position, if possible. + * @param s The position in the stream in seconds. + * @return True if success, false on fail/unsupported. + **/ + virtual bool seek(float s) = 0; + + /** + * Rewinds the stream to the start. + * @return True if success, false on fail/unsupported. + **/ + virtual bool rewind() = 0; + + /** + * Checks whether a stream is seekable. + * @return True if seekable, false otherwise. + **/ + virtual bool isSeekable() = 0; + + /** + * Checks whether a stream has more data to decode or not. Use + * rewind to start the stream again. + * @return False if there is more data, true on EOF. + **/ + virtual bool isFinished() = 0; + + /** + * Gets the number of channels in a stream. Supported values are 1 (mono) or 2 (stereo). + * @return Either 1 for mono, 2 for stereo, or 0 on errors. + **/ + virtual int getChannels() const = 0; + + /** + * Gets the number of bits per sample. Supported values are 8 or 16. + * @return Either 8, 16, or 0 if unsupported. + **/ + virtual int getBitDepth() const = 0; + + /** + * Gets the sample rate for the Decoder, that is, samples per second. + * @return The sample rate, eg. 44100. + **/ + virtual int getSampleRate() const = 0; + +}; // Decoder + +} // sound +} // love + +#endif // LOVE_SOUND_DECODER_H diff --git a/jni/love/src/modules/sound/Sound.cpp b/jni/love/src/modules/sound/Sound.cpp new file mode 100644 index 00000000..47290df7 --- /dev/null +++ b/jni/love/src/modules/sound/Sound.cpp @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Sound.h" + +namespace love +{ +namespace sound +{ + +Sound::~Sound() +{ +} + +SoundData *Sound::newSoundData(Decoder *decoder) +{ + return new SoundData(decoder); +} + +SoundData *Sound::newSoundData(int samples, int sampleRate, int bitDepth, int channels) +{ + return new SoundData(samples, sampleRate, bitDepth, channels); +} + + +} // sound +} // love diff --git a/jni/love/src/modules/sound/Sound.h b/jni/love/src/modules/sound/Sound.h new file mode 100644 index 00000000..379779f4 --- /dev/null +++ b/jni/love/src/modules/sound/Sound.h @@ -0,0 +1,83 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_SOUND_H +#define LOVE_SOUND_SOUND_H + +// LOVE +#include "common/Module.h" +#include "filesystem/File.h" + +#include "SoundData.h" +#include "Decoder.h" + +namespace love +{ +namespace sound +{ + +/** + * The Sound module is responsible for decoding sound data. It is + * not responsible for playing it. + **/ +class Sound : public Module +{ + +public: + + /** + * Destructor. + **/ + virtual ~Sound(); + + /** + * Creates new SoundData from a decoder. Fully expands the + * encoded sound data into raw sound data. Not recommended + * on large (long-duration) files. + * @param decoder The file to decode the data from. + * @return A SoundData object, or zero if the file type couldn't be handled. + **/ + SoundData *newSoundData(Decoder *decoder); + + /** + * Creates a new SoundData with the specified number of samples and format. + * @param samples The number of samples. + * @param sampleRate Number of samples per second. + * @param bitDepth Bits per sample (8 or 16). + * @param channels Either 1 for mono, or 2 for stereo. + * @return A new SoundData object, or zero in case of errors. + **/ + SoundData *newSoundData(int samples, int sampleRate, int bitDepth, int channels); + + /** + * Attempts to find a decoder for the encoded sound data in the + * specified file. + * @param file The file with encoded sound data. + * @param bufferSize The size of each decoded chunk. + * @return A Decoder object on success, or zero if no decoder could be found. + **/ + virtual Decoder *newDecoder(filesystem::FileData *file, int bufferSize) = 0; + +}; // Sound + +} // sound +} // love + +#endif // LOVE_SOUND_SOUND_H diff --git a/jni/love/src/modules/sound/SoundData.cpp b/jni/love/src/modules/sound/SoundData.cpp new file mode 100644 index 00000000..551b17f7 --- /dev/null +++ b/jni/love/src/modules/sound/SoundData.cpp @@ -0,0 +1,222 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "SoundData.h" + +// C +#include +#include +#include + +// STL +#include +#include + +namespace love +{ +namespace sound +{ + +SoundData::SoundData(Decoder *decoder) + : data(0) + , size(0) + , sampleRate(Decoder::DEFAULT_SAMPLE_RATE) + , bitDepth(0) + , channels(0) +{ + size_t bufferSize = 524288; // 0x80000 + int decoded = decoder->decode(); + + while (decoded > 0) + { + // Expand or allocate buffer. Note that realloc may move + // memory to other locations. + if (!data || bufferSize < (size_t) size + decoded) + { + while (bufferSize < (size_t) size + decoded) + bufferSize <<= 1; + data = (char *)realloc(data, bufferSize); + } + + if (!data) + throw love::Exception("Not enough memory."); + + // Copy memory into new part of memory. + memcpy(data + size, decoder->getBuffer(), decoded); + + // Keep this up to date. + size += decoded; + + // Overflow check. + if (size < 0) + { + free(data); + throw love::Exception("Not enough memory."); + } + + decoded = decoder->decode(); + } + + // Shrink buffer if necessary. + if (data && bufferSize > (size_t) size) + data = (char *) realloc(data, size); + + channels = decoder->getChannels(); + bitDepth = decoder->getBitDepth(); + sampleRate = decoder->getSampleRate(); +} + +SoundData::SoundData(int samples, int sampleRate, int bitDepth, int channels) + : data(0) + , size(0) + , sampleRate(0) + , bitDepth(0) + , channels(0) +{ + load(samples, sampleRate, bitDepth, channels); +} + +SoundData::SoundData(void *d, int samples, int sampleRate, int bitDepth, int channels) + : data(0) + , size(0) + , sampleRate(0) + , bitDepth(0) + , channels(0) +{ + load(samples, sampleRate, bitDepth, channels, d); +} + +SoundData::~SoundData() +{ + if (data != 0) + free(data); +} + +void SoundData::load(int samples, int sampleRate, int bitDepth, int channels, void *newData) +{ + if (samples <= 0) + throw love::Exception("Invalid sample count: %d", samples); + + if (sampleRate <= 0) + throw love::Exception("Invalid sample rate: %d", sampleRate); + + if (bitDepth <= 0) + throw love::Exception("Invalid bit depth: %d", bitDepth); + + if (channels <= 0) + throw love::Exception("Invalid channel count: %d", channels); + + if (data != 0) + { + free(data); + data = 0; + } + + size = samples * (bitDepth / 8) * channels; + this->sampleRate = sampleRate; + this->bitDepth = bitDepth; + this->channels = channels; + + double realsize = samples; + realsize *= (bitDepth / 8) * channels; + if (realsize > INT_MAX) + throw love::Exception("Data is too big!"); + + data = (char *)malloc(size); + if (!data) + throw love::Exception("Not enough memory."); + + if (newData) + memcpy(data, newData, size); +} + +void *SoundData::getData() const +{ + return (void *)data; +} + +int SoundData::getSize() const +{ + return (int)size; +} + +int SoundData::getChannels() const +{ + return channels; +} + +int SoundData::getBitDepth() const +{ + return bitDepth; +} + +int SoundData::getSampleRate() const +{ + return sampleRate; +} + +int SoundData::getSampleCount() const +{ + return (size/channels)/(bitDepth/8); +} + +float SoundData::getDuration() const +{ + return float(size) / (channels*sampleRate*bitDepth/8); +} + +void SoundData::setSample(int i, float sample) +{ + // Check range. + if (i < 0 || i >= size/(bitDepth/8)) + throw love::Exception("Attempt to set out-of-range sample!"); + + if (bitDepth == 16) + { + short *s = (short *)data; + s[i] = (short)(sample*(float)SHRT_MAX); + return; + } + else + { + data[i] = (char)(sample*(float)CHAR_MAX); + return; + } +} + +float SoundData::getSample(int i) const +{ + // Check range. + if (i < 0 || i >= size/(bitDepth/8)) + throw love::Exception("Attempt to get out-of-range sample!"); + + if (bitDepth == 16) + { + short *s = (short *)data; + return (float)s[i]/(float)SHRT_MAX; + } + else + { + return (float)data[i]/(float)CHAR_MAX; + } +} + +} // sound +} // love diff --git a/jni/love/src/modules/sound/SoundData.h b/jni/love/src/modules/sound/SoundData.h new file mode 100644 index 00000000..1afe75e5 --- /dev/null +++ b/jni/love/src/modules/sound/SoundData.h @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_SOUND_DATA_H +#define LOVE_SOUND_SOUND_DATA_H + +// LOVE +#include "filesystem/File.h" + +#include "Decoder.h" + +namespace love +{ +namespace sound +{ + +class SoundData : public love::Data +{ +public: + + SoundData(Decoder *decoder); + SoundData(int samples, int sampleRate, int bitDepth, int channels); + SoundData(void *d, int samples, int sampleRate, int bitDepth, int channels); + + virtual ~SoundData(); + + // Implements Data. + void *getData() const; + int getSize() const; + + virtual int getChannels() const; + virtual int getBitDepth() const; + virtual int getSampleRate() const; + virtual int getSampleCount() const; + + virtual float getDuration() const; + + void setSample(int i, float sample); + float getSample(int i) const; + +private: + + void load(int samples, int sampleRate, int bitDepth, int channels, void *newData = 0); + + char *data; + int size; + + int sampleRate; + int bitDepth; + int channels; +}; // SoundData + +} // sound +} // love + +#endif // LOVE_SOUND_SOUND_DATA_H diff --git a/jni/love/src/modules/sound/lullaby/Decoder.cpp b/jni/love/src/modules/sound/lullaby/Decoder.cpp new file mode 100644 index 00000000..9af26845 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/Decoder.cpp @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Decoder.h" + +#include "common/Exception.h" + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +Decoder::Decoder(Data *data, const std::string &ext, int bufferSize) + : data(data) + , ext(ext) + , bufferSize(bufferSize) + , sampleRate(DEFAULT_SAMPLE_RATE) + , buffer(0) + , eof(false) +{ + data->retain(); + buffer = new char[bufferSize]; +} + +Decoder::~Decoder() +{ + if (buffer != 0) + delete [](char *) buffer; + if (data != 0) + data->release(); +} + +void *Decoder::getBuffer() const +{ + return buffer; +} + +int Decoder::getSize() const +{ + return bufferSize; +} + +int Decoder::getSampleRate() const +{ + return sampleRate; +} + +bool Decoder::isFinished() +{ + return eof; +} + + +} // lullaby +} // sound +} // love diff --git a/jni/love/src/modules/sound/lullaby/Decoder.h b/jni/love/src/modules/sound/lullaby/Decoder.h new file mode 100644 index 00000000..5cb52bc4 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/Decoder.h @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_LULLABY_DECODER_H +#define LOVE_SOUND_LULLABY_DECODER_H + +// LOVE +#include "sound/Decoder.h" +#include "filesystem/File.h" + +#include + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +class Decoder : public love::sound::Decoder +{ +public: + + Decoder(Data *data, const std::string &ext, int bufferSize); + + virtual ~Decoder(); + + // Implement some of love::sound::Decoder, but allow subclasses + // to override them. + virtual void *getBuffer() const; + virtual int getSize() const; + virtual int getSampleRate() const; + virtual bool isFinished(); + +protected: + + // The encoded data. This should be replaced with buffered file + // reads in the future. + Data *data; + + // File extension. + std::string ext; + + // When the decoder decodes data incrementally, it writes + // this many bytes at a time (at most). + int bufferSize; + + // The desired frequency of the samples. 44100, 22050, or 11025. + int sampleRate; + + // Holds internal memory. + void *buffer; + + // Set this to true when eof has been reached. + bool eof; +}; // Decoder + +} // lullaby +} // sound +} // love + +#endif // LOVE_SOUND_LULLABY_DECODER_H diff --git a/jni/love/src/modules/sound/lullaby/FLACDecoder.cpp b/jni/love/src/modules/sound/lullaby/FLACDecoder.cpp new file mode 100644 index 00000000..955000fe --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/FLACDecoder.cpp @@ -0,0 +1,186 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +#if 0 + +#include "FLACDecoder.h" + +#include +#include "common/Exception.h" + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +FLACDecoder::FLACDecoder(Data *data, const std::string &ext, int nbufferSize) + : Decoder(data, ext, nbufferSize) + , pos(0) +{ + init(); + init_ogg(); + process_until_end_of_metadata(); + process_single(); + seek(0); + bufferSize = 256 * getBitDepth() * getChannels() * 2; + delete[](char *) buffer; + buffer = new char[bufferSize]; +} + +FLACDecoder::~FLACDecoder() +{ + finish(); +} + +bool FLACDecoder::accepts(const std::string &ext) +{ + static const std::string supported[] = + { + "flac", "" + }; + + for (int i = 0; !(supported[i].empty()); i++) + { + if (supported[i].compare(ext) == 0) + return true; + } + + return false; +} + +love::sound::Decoder *FLACDecoder::clone() +{ + return new FLACDecoder(data, ext, bufferSize, sampleRate); +} + +int FLACDecoder::decode() +{ + process_single(); + return bufferSize; +} + +bool FLACDecoder::seek(float s) +{ + return seek_absolute((int)(s*1000.0f)); +} + +bool FLACDecoder::rewind() +{ + return seek_absolute(0); +} + +bool FLACDecoder::isSeekable() +{ + return true; +} + +int FLACDecoder::getChannels() const +{ + return get_channels(); +} + +int FLACDecoder::getBitDepth() const +{ + return get_bits_per_sample(); +} + +int FLACDecoder::getSampleRate() const +{ + return get_sample_rate(); +} + +FLAC__StreamDecoderReadStatus FLACDecoder::read_callback(FLAC__byte buffer[], size_t *bytes) +{ + int size = data->getSize(); + char *d = (char *) data->getData() + pos; + if (pos >= size) + { + eof = true; + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + } + if (pos+*bytes <= (unsigned int)size) + { + memcpy(buffer, d, *bytes); + pos = pos+*bytes; + } + else + { + memcpy(buffer, d, size-pos); + *bytes = size-pos; + pos = size; + } + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; +} + +FLAC__StreamDecoderSeekStatus FLACDecoder::seek_callback(FLAC__uint64 offset) +{ + pos = (int)offset; + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +} + +FLAC__StreamDecoderTellStatus FLACDecoder::tell_callback(FLAC__uint64 *offset) +{ + *offset = pos; + return FLAC__STREAM_DECODER_TELL_STATUS_OK; +} + +FLAC__StreamDecoderLengthStatus FLACDecoder::length_callback(FLAC__uint64 *length) +{ + *length = data->getSize(); + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; +} + +bool FLACDecoder::eof_callback() +{ + eof = (pos >= data->getSize()); + return eof; +} + +FLAC__StreamDecoderWriteStatus FLACDecoder::write_callback(const FLAC__Frame *frame, const FLAC__int32 *const fbuffer[]) +{ + int i, j; + for (i = 0, j = 0; i < bufferSize; i += 4, j++) + { + ((char *)buffer)[i] = fbuffer[0][j]; + ((char *)buffer)[i+1] = fbuffer[0][j] >> 8; + ((char *)buffer)[i+2] = fbuffer[1][j]; + ((char *)buffer)[i+3] = fbuffer[1][j] >> 8; + } + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +void FLACDecoder::metadata_callback(const FLAC__StreamMetadata *metadata) +{ + //we do nothing with metadata... + return; +} + +void FLACDecoder::error_callback(FLAC__StreamDecoderErrorStatus status) +{ + //wow.. error, let's throw one (please clean this part up sometime) + throw love::Exception("FLAC error: %s!", FLAC__StreamDecoderErrorStatusString[status]); +} +} // lullaby +} // sound +} // love + +#endif // 0 \ No newline at end of file diff --git a/jni/love/src/modules/sound/lullaby/FLACDecoder.h b/jni/love/src/modules/sound/lullaby/FLACDecoder.h new file mode 100644 index 00000000..58a3af10 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/FLACDecoder.h @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_LULLABY_FLAC_DECODER_H +#define LOVE_SOUND_LULLABY_FLAC_DECODER_H + +#if 0 + +// LOVE +#include "common/Data.h" +#include "Decoder.h" + +#include +#include + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +class FLACDecoder : public Decoder, public FLAC::Decoder::Stream +{ +public: + FLACDecoder(Data *data, const std::string &ext, int bufferSize); + ~FLACDecoder(); + + static bool accepts(const std::string &ext); + love::sound::Decoder *clone(); + int decode(); + bool seek(float s); + bool rewind(); + bool isSeekable(); + int getChannels() const; + int getBitDepth() const; + int getSampleRate() const; + + //needed for FLAC + FLAC__StreamDecoderReadStatus read_callback(FLAC__byte buffer[], size_t *bytes); + FLAC__StreamDecoderSeekStatus seek_callback(FLAC__uint64 offset); + FLAC__StreamDecoderTellStatus tell_callback(FLAC__uint64 *offset); + FLAC__StreamDecoderLengthStatus length_callback(FLAC__uint64 *length); + bool eof_callback(); + FLAC__StreamDecoderWriteStatus write_callback(const FLAC__Frame *frame, const FLAC__int32 *const buffer[]); + void metadata_callback(const FLAC__StreamMetadata *metadata); + void error_callback(FLAC__StreamDecoderErrorStatus status); + +private: + int pos; +}; // Decoder + +} // lullaby +} // sound +} // love + +#endif // 0 + +#endif // LOVE_SOUND_LULLABY_FLAC_DECODER_H diff --git a/jni/love/src/modules/sound/lullaby/GmeDecoder.cpp b/jni/love/src/modules/sound/lullaby/GmeDecoder.cpp new file mode 100644 index 00000000..df2ad2ea --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/GmeDecoder.cpp @@ -0,0 +1,149 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" + +#ifdef LOVE_SUPPORT_GME + +#include "common/Exception.h" +#include "GmeDecoder.h" + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +GmeDecoder::GmeDecoder(Data *data, const std::string &ext, int bufferSize) + : Decoder(data, ext, bufferSize) + , emu(0) + , num_tracks(0) + , cur_track(0) +{ + void *d = data->getData(); + int s = data->getSize(); + + if (gme_open_data(d, s, &emu, sampleRate) != 0) + throw love::Exception("Could not open game music file"); + + num_tracks = gme_track_count(emu); + + try + { + if (num_tracks <= 0) + throw love::Exception("Game music file has no tracks"); + + if (gme_start_track(emu, cur_track) != 0) + throw love::Exception("Could not start game music playback"); + } + catch (love::Exception &) + { + gme_delete(emu); + throw; + } +} + +GmeDecoder::~GmeDecoder() +{ + if (emu) + gme_delete(emu); +} + +bool GmeDecoder::accepts(const std::string &ext) +{ + static const std::string supported[] = + { + "ay", "gbs", "gym", "hes", "kss", "nsf", + "nsfe", "sap", "spc", "vgm", "vgz", "" + }; + + for (int i = 0; !(supported[i].empty()); i++) + { + if (supported[i].compare(ext) == 0) + return true; + } + + return false; +} + +love::sound::Decoder *GmeDecoder::clone() +{ + return new GmeDecoder(data, ext, bufferSize); +} + +int GmeDecoder::decode() +{ + short *sbuf = static_cast(buffer); + int size = bufferSize / sizeof(short); + + if (gme_play(emu, size, sbuf) != 0) + throw love::Exception("Error while decoding game music"); + + if (!eof && gme_track_ended(emu)) + { + // Start the next track if this one ended. + if (cur_track < num_tracks - 1) + gme_start_track(emu, ++cur_track); + else + eof = true; + } + + return bufferSize; +} + +bool GmeDecoder::seek(float s) +{ + return gme_seek(emu, static_cast(s * 1000.f)) != 0; +} + +bool GmeDecoder::rewind() +{ + // If we're in the first track, rewind. + if (cur_track == 0) + return gme_seek(emu, 0) == 0; + else + { + // Otherwise, start from the first track again. + cur_track = 0; + return gme_start_track(emu, cur_track) == 0; + } +} + +bool GmeDecoder::isSeekable() +{ + return true; +} + +int GmeDecoder::getChannels() const +{ + return 2; +} + +int GmeDecoder::getBitDepth() const +{ + return 16; +} + +} // lullaby +} // sound +} // love + +#endif // LOVE_SUPPORT_GME \ No newline at end of file diff --git a/jni/love/src/modules/sound/lullaby/GmeDecoder.h b/jni/love/src/modules/sound/lullaby/GmeDecoder.h new file mode 100644 index 00000000..57dbbdaa --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/GmeDecoder.h @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_LULLABY_GME_DECODER_H +#define LOVE_SOUND_LULLABY_GME_DECODER_H + +#ifdef LOVE_SUPPORT_GME + +// LOVE +#include "common/Data.h" +#include "Decoder.h" + +#ifdef LOVE_MACOSX +#include +#else +#include +#endif + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +class GmeDecoder : public Decoder +{ +public: + + GmeDecoder(Data *data, const std::string &ext, int bufferSize); + virtual ~GmeDecoder(); + + static bool accepts(const std::string &ext); + + love::sound::Decoder *clone(); + int decode(); + bool seek(float s); + bool rewind(); + bool isSeekable(); + int getChannels() const; + int getBitDepth() const; + +private: + Music_Emu *emu; + int num_tracks; + int cur_track; +}; // Decoder + +} // lullaby +} // sound +} // love + +#endif // LOVE_SUPPORT_GME + +#endif // LOVE_SOUND_LULLABY_GME_DECODER_H diff --git a/jni/love/src/modules/sound/lullaby/ModPlugDecoder.cpp b/jni/love/src/modules/sound/lullaby/ModPlugDecoder.cpp new file mode 100644 index 00000000..7d3bd758 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/ModPlugDecoder.cpp @@ -0,0 +1,147 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" +#include "ModPlugDecoder.h" + +#include "common/Exception.h" + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +ModPlugDecoder::ModPlugDecoder(Data *data, const std::string &ext, int bufferSize) + : Decoder(data, ext, bufferSize) + , plug(0) +{ + + // Set some ModPlug settings. + settings.mFlags = MODPLUG_ENABLE_OVERSAMPLING | MODPLUG_ENABLE_NOISE_REDUCTION; + settings.mChannels = 2; + settings.mBits = 16; + settings.mFrequency = sampleRate; + settings.mResamplingMode = MODPLUG_RESAMPLE_LINEAR; + + // fill with modplug defaults (modplug _memsets_, so we could get + // garbage settings when the struct is only partially initialized) + // This does not exist yet on Windows. + + // Some settings not supported by some older versions +#ifndef LOVE_OLD_MODPLUG + settings.mStereoSeparation = 128; + settings.mMaxMixChannels = 32; +#endif + settings.mReverbDepth = 0; + settings.mReverbDelay = 0; + settings.mBassAmount = 0; + settings.mBassRange = 0; + settings.mSurroundDepth = 0; + settings.mSurroundDelay = 0; + settings.mLoopCount = -1; + + ModPlug_SetSettings(&settings); + + // Load the module. + plug = ModPlug_Load(data->getData(), data->getSize()); + + if (plug == 0) + throw love::Exception("Could not load file with ModPlug."); + + // set master volume for delicate ears + ModPlug_SetMasterVolume(plug, 128); +} + +ModPlugDecoder::~ModPlugDecoder() +{ + if (plug != 0) + ModPlug_Unload(plug); +} + +bool ModPlugDecoder::accepts(const std::string &ext) +{ + static const std::string supported[] = + { + "699", "abc", "amf", "ams", "dbm", "dmf", + "dsm", "far", "it", "j2b", "mdl", "med", + "mid", "mod", "mt2", "mtm", "okt", "pat", + "psm", "s3m", "stm", "ult", "umx", "xm", + "" + }; + + for (int i = 0; !(supported[i].empty()); i++) + { + if (supported[i].compare(ext) == 0) + return true; + } + + return false; +} + +love::sound::Decoder *ModPlugDecoder::clone() +{ + return new ModPlugDecoder(data, ext, bufferSize); +} + +int ModPlugDecoder::decode() +{ + int r = ModPlug_Read(plug, buffer, bufferSize); + + if (r == 0) + eof = true; + + return r; +} + +bool ModPlugDecoder::seek(float s) +{ + ModPlug_Seek(plug, (int)(s*1000.0f)); + return true; +} + +bool ModPlugDecoder::rewind() +{ + // Let's reload. + ModPlug_Unload(plug); + plug = ModPlug_Load(data->getData(), data->getSize()); + ModPlug_SetMasterVolume(plug, 128); + eof = false; + return (plug != 0); +} + +bool ModPlugDecoder::isSeekable() +{ + return true; +} + +int ModPlugDecoder::getChannels() const +{ + return 2; +} + +int ModPlugDecoder::getBitDepth() const +{ + return 16; +} + +} // lullaby +} // sound +} // love diff --git a/jni/love/src/modules/sound/lullaby/ModPlugDecoder.h b/jni/love/src/modules/sound/lullaby/ModPlugDecoder.h new file mode 100644 index 00000000..30c9685e --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/ModPlugDecoder.h @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_LULLABY_MODPLUG_DECODER_H +#define LOVE_SOUND_LULLABY_MODPLUG_DECODER_H + +// LOVE +#include "common/Data.h" +#include "Decoder.h" + +// SDL_sound +#include + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +class ModPlugDecoder : public Decoder +{ +public: + + ModPlugDecoder(Data *data, const std::string &ext, int bufferSize); + virtual ~ModPlugDecoder(); + + static bool accepts(const std::string &ext); + + love::sound::Decoder *clone(); + int decode(); + bool seek(float s); + bool rewind(); + bool isSeekable(); + int getChannels() const; + int getBitDepth() const; + +private: + + ModPlugFile *plug; + ModPlug_Settings settings; +}; // Decoder + +} // lullaby +} // sound +} // love + +#endif // LOVE_SOUND_LULLABY_MODPLUG_DECODER_H diff --git a/jni/love/src/modules/sound/lullaby/Mpg123Decoder.cpp b/jni/love/src/modules/sound/lullaby/Mpg123Decoder.cpp new file mode 100644 index 00000000..dd1142e6 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/Mpg123Decoder.cpp @@ -0,0 +1,234 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Mpg123Decoder.h" + +#include "common/Exception.h" + +#include + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +bool Mpg123Decoder::inited = false; + +Mpg123Decoder::Mpg123Decoder(Data *data, const std::string &ext, int bufferSize) + : Decoder(data, ext, bufferSize) + , handle(0) + , channels(MPG123_STEREO) +{ + + data_size = data->getSize(); + data_offset = 0; + + int ret; + + if (!inited) + { + ret = mpg123_init(); + if (ret != MPG123_OK) + throw love::Exception("Could not initialize mpg123."); + inited = (ret == MPG123_OK); + } + + //Intialize the handle + handle = mpg123_new(NULL, &ret); + if (handle == NULL) + throw love::Exception("Could not create handle."); + ret = mpg123_open_feed(handle); + if (ret != MPG123_OK) + throw love::Exception("Could not open feed."); + + ret = feed(16384); + + if (ret != MPG123_OK && ret != MPG123_DONE) + throw love::Exception("Could not feed!"); +} + +Mpg123Decoder::~Mpg123Decoder() +{ + mpg123_delete(handle); + +} + +bool Mpg123Decoder::accepts(const std::string &ext) +{ + static const std::string supported[] = + { + "mp3", "" + }; + + for (int i = 0; !(supported[i].empty()); i++) + { + if (supported[i].compare(ext) == 0) + return true; + } + + return false; +} + +void Mpg123Decoder::quit() +{ + if (inited) + mpg123_exit(); +} + +love::sound::Decoder *Mpg123Decoder::clone() +{ + return new Mpg123Decoder(data, ext, bufferSize); +} + +int Mpg123Decoder::decode() +{ + int size = 0; + bool done = false; + + while (size < bufferSize && !done && !eof) + { + size_t numbytes = 0; + + int r = mpg123_read(handle, (unsigned char *) buffer + size, bufferSize - size, &numbytes); + + switch (r) + { + case MPG123_NEW_FORMAT: + { + size += numbytes; + long rate = 0; + int encoding = 0; + int ret = mpg123_getformat(handle, &rate, &channels, &encoding); + if (rate == 0) + rate = sampleRate; + else + sampleRate = rate; + if (channels == 0) + channels = MPG123_STEREO; + if (encoding == 0) + encoding = MPG123_ENC_SIGNED_16; + ret = mpg123_format(handle, rate, channels, encoding); + if (ret != MPG123_OK) + throw love::Exception("Could not set output format."); + } + continue; + case MPG123_NEED_MORE: + { + size += numbytes; + int v = feed(8192); + + switch (v) + { + case MPG123_OK: + continue; + case MPG123_DONE: + if (numbytes == 0) + eof = true; + break; + default: + done = true; + } + + continue; + } + case MPG123_OK: + size += numbytes; + continue; + case MPG123_DONE: + // Apparently, mpg123_read does not return MPG123_DONE, but + // let's keep it here anyway. + eof = true; + default: + done = true; + break; + } + } + + return size; +} + +bool Mpg123Decoder::seek(float s) +{ + off_t offset = static_cast(s * static_cast(sampleRate)); + + if (offset < 0) + return false; + + if (mpg123_feedseek(handle, offset, SEEK_SET, &offset) >= 0) + { + data_offset = offset; + eof = false; + return true; + } + else + return false; +} + +bool Mpg123Decoder::rewind() +{ + eof = false; + off_t offset; + + if (mpg123_feedseek(handle, 0, SEEK_SET, &offset) >= 0) + { + data_offset = offset; + return true; + } + else + return false; +} + +bool Mpg123Decoder::isSeekable() +{ + return true; +} + +int Mpg123Decoder::getChannels() const +{ + return channels; +} + +int Mpg123Decoder::getBitDepth() const +{ + return 16; +} + +int Mpg123Decoder::feed(int bytes) +{ + int remaining = data_size - data_offset; + + if (remaining <= 0) + return MPG123_DONE; + + int feed_bytes = remaining < bytes ? remaining : bytes; + + int r = mpg123_feed(handle, (unsigned char *)data->getData() + data_offset, feed_bytes); + + if (r == MPG123_OK || r == MPG123_DONE) + data_offset += feed_bytes; + + return r; +} + +} // lullaby +} // sound +} // love diff --git a/jni/love/src/modules/sound/lullaby/Mpg123Decoder.h b/jni/love/src/modules/sound/lullaby/Mpg123Decoder.h new file mode 100644 index 00000000..61d571e2 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/Mpg123Decoder.h @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_LULLABY_LIBMPG123_DECODER_H +#define LOVE_SOUND_LULLABY_LIBMPG123_DECODER_H + +// LOVE +#include "common/Data.h" +#include "Decoder.h" + +// libmpg123 +#ifdef LOVE_MACOSX +#include +#else +#include +#endif + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +class Mpg123Decoder : public Decoder +{ +public: + + Mpg123Decoder(Data *data, const std::string &ext, int bufferSize); + virtual ~Mpg123Decoder(); + + static bool accepts(const std::string &ext); + static void quit(); + + love::sound::Decoder *clone(); + int decode(); + bool seek(float s); + bool rewind(); + bool isSeekable(); + int getChannels() const; + int getBitDepth() const; + +private: + + int feed(int bytes); + + mpg123_handle *handle; + static bool inited; + + int data_offset; + int data_size; + + int channels; + +}; // Decoder + +} // lullaby +} // sound +} // love + +#endif // LOVE_SOUND_LULLABY_LIBMPG123_DECODER_H diff --git a/jni/love/src/modules/sound/lullaby/Sound.cpp b/jni/love/src/modules/sound/lullaby/Sound.cpp new file mode 100644 index 00000000..15604c5b --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/Sound.cpp @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" + +#include + +#include "Sound.h" + +#include "ModPlugDecoder.h" +#include "VorbisDecoder.h" +#include "GmeDecoder.h" +#include "WaveDecoder.h" +//#include "FLACDecoder.h" + +#ifndef LOVE_NOMPG123 +# include "Mpg123Decoder.h" +#endif // LOVE_NOMPG123 + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +Sound::Sound() +{ +} + +Sound::~Sound() +{ +#ifndef LOVE_NOMPG123 + Mpg123Decoder::quit(); +#endif // LOVE_NOMPG123 +} + +const char *Sound::getName() const +{ + return "love.sound.lullaby"; +} + +sound::Decoder *Sound::newDecoder(love::filesystem::FileData *data, int bufferSize) +{ + std::string ext = data->getExtension(); + std::transform(ext.begin(), ext.end(), ext.begin(), tolower); + + sound::Decoder *decoder = 0; + + // Find a suitable decoder here, and return it. + if (ModPlugDecoder::accepts(ext)) + decoder = new ModPlugDecoder(data, ext, bufferSize); +#ifndef LOVE_NOMPG123 + else if (Mpg123Decoder::accepts(ext)) + decoder = new Mpg123Decoder(data, ext, bufferSize); +#endif // LOVE_NOMPG123 + else if (VorbisDecoder::accepts(ext)) + decoder = new VorbisDecoder(data, ext, bufferSize); +#ifdef LOVE_SUPPORT_GME + else if (GmeDecoder::accepts(ext)) + decoder = new GmeDecoder(data, ext, bufferSize); +#endif // LOVE_SUPPORT_GME + else if (WaveDecoder::accepts(ext)) + decoder = new WaveDecoder(data, ext, bufferSize); + /*else if (FLACDecoder::accepts(ext)) + decoder = new FLACDecoder(data, ext, bufferSize);*/ + + // else if (OtherDecoder::accept(ext)) + + return decoder; +} + +} // lullaby +} // sound +} // love diff --git a/jni/love/src/modules/sound/lullaby/Sound.h b/jni/love/src/modules/sound/lullaby/Sound.h new file mode 100644 index 00000000..d736f445 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/Sound.h @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_LULLABY_SOUND_H +#define LOVE_SOUND_LULLABY_SOUND_H + +// LOVE +#include +#include "sound/Decoder.h" + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +/** + * The love.sound.lullaby module is the custom sound decoder module for LOVE. Instead + * of using an intermediate library like SDL_sound, it interfaces with relevant libraries + * directly (libmpg123, libmodplug, libFLAC, etc). + * + * It was Mike that came up with the name Lullaby, which we both instantly recognized as awesome. + **/ +class Sound : public love::sound::Sound +{ +public: + + /** + * Constructor. Initializes relevant libraries. + **/ + Sound(); + + /** + * Destructor. Deinitializes relevant libraries. + **/ + virtual ~Sound(); + + /// @copydoc love::Module::getName + const char *getName() const; + + /// @copydoc love::sound::Sound::newDecoder + sound::Decoder *newDecoder(love::filesystem::FileData *file, int bufferSize); + +}; // Sound + +} // lullaby +} // sound +} // love + +#endif // LOVE_SOUND_LULLABY_SOUND_H diff --git a/jni/love/src/modules/sound/lullaby/VorbisDecoder.cpp b/jni/love/src/modules/sound/lullaby/VorbisDecoder.cpp new file mode 100644 index 00000000..e30b80c8 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/VorbisDecoder.cpp @@ -0,0 +1,258 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "VorbisDecoder.h" + +#include +#include "common/config.h" +#include "common/Exception.h" + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +/** + * CALLBACK FUNCTIONS + **/ +static int vorbisClose(void * /* ptr to the data that the vorbis files need*/) +{ + // Does nothing (handled elsewhere) + return 1; +} + +static size_t vorbisRead(void *ptr /* ptr to the data that the vorbis files need*/, + size_t byteSize /* how big a byte is*/, + size_t sizeToRead /* How much we can read*/, + void *datasource /* this is a pointer to the data we passed into ov_open_callbacks (our SOggFile struct*/) +{ + size_t spaceToEOF; // How much more we can read till we hit the EOF marker + size_t actualSizeToRead; // How much data we are actually going to read from memory + SOggFile *vorbisData; // Our vorbis data, for the typecast + + // Get the data in the right format + vorbisData = (SOggFile *)datasource; + + // Calculate how much we need to read. This can be sizeToRead*byteSize or less depending on how near the EOF marker we are + spaceToEOF = vorbisData->dataSize - vorbisData->dataRead; + if ((sizeToRead*byteSize) < spaceToEOF) + actualSizeToRead = (sizeToRead*byteSize); + else + actualSizeToRead = spaceToEOF; + + // A simple copy of the data from memory to the datastruct that the vorbis libs will use + if (actualSizeToRead) + { + // Copy the data from the start of the file PLUS how much we have already read in + memcpy(ptr, (char *)vorbisData->dataPtr + vorbisData->dataRead, actualSizeToRead); + // Increase by how much we have read by + vorbisData->dataRead += (actualSizeToRead); + } + + // Return how much we read (in the same way fread would) + return actualSizeToRead; +} + +static int vorbisSeek(void *datasource /* ptr to the data that the vorbis files need*/, + ogg_int64_t offset /*offset from the point we wish to seek to*/, + int whence /*where we want to seek to*/) +{ + int spaceToEOF; // How much more we can read till we hit the EOF marker + ogg_int64_t actualOffset; // How much we can actually offset it by + SOggFile *vorbisData; // The data we passed in (for the typecast) + + // Get the data in the right format + vorbisData = (SOggFile *) datasource; + + // Goto where we wish to seek to + switch (whence) + { + case SEEK_SET: // Seek to the start of the data file + // Make sure we are not going to the end of the file + if (vorbisData->dataSize >= offset) + actualOffset = offset; + else + actualOffset = vorbisData->dataSize; + // Set where we now are + vorbisData->dataRead = (int)actualOffset; + break; + case SEEK_CUR: // Seek from where we are + // Make sure we dont go past the end + spaceToEOF = vorbisData->dataSize - vorbisData->dataRead; + if (offset < spaceToEOF) + actualOffset = (offset); + else + actualOffset = spaceToEOF; + // Seek from our currrent location + vorbisData->dataRead += (int)actualOffset; + break; + case SEEK_END: // Seek from the end of the file + vorbisData->dataRead = vorbisData->dataSize+1; + break; + default: + throw love::Exception("Unknown seek command in vorbisSeek\n"); + break; + }; + + return 0; +} + +static long vorbisTell(void *datasource /* ptr to the data that the vorbis files need*/) +{ + SOggFile *vorbisData; + vorbisData = (SOggFile *) datasource; + return vorbisData->dataRead; +} +/** + * END CALLBACK FUNCTIONS + **/ + +VorbisDecoder::VorbisDecoder(Data *data, const std::string &ext, int bufferSize) + : Decoder(data, ext, bufferSize) +{ + // Initialize callbacks + vorbisCallbacks.close_func = vorbisClose; + vorbisCallbacks.seek_func = vorbisSeek; + vorbisCallbacks.read_func = vorbisRead; + vorbisCallbacks.tell_func = vorbisTell; + + // Check endianness +#ifdef LOVE_BIG_ENDIAN + endian = 1; +#else + endian = 0; +#endif + + // Initialize OGG file + oggFile.dataPtr = (char *) data->getData(); + oggFile.dataSize = data->getSize(); + oggFile.dataRead = 0; + + // Open Vorbis handle + if (ov_open_callbacks(&oggFile, &handle, NULL, 0, vorbisCallbacks) < 0) + throw love::Exception("Could not read Ogg bitstream"); + + // Get info and comments + vorbisInfo = ov_info(&handle, -1); + vorbisComment = ov_comment(&handle, -1); +} + +VorbisDecoder::~VorbisDecoder() +{ + ov_clear(&handle); +} + +bool VorbisDecoder::accepts(const std::string &ext) +{ + static const std::string supported[] = + { + "ogg", "oga", "" + }; + + for (int i = 0; !(supported[i].empty()); i++) + { + if (supported[i].compare(ext) == 0) + return true; + } + + return false; +} + +love::sound::Decoder *VorbisDecoder::clone() +{ + return new VorbisDecoder(data, ext, bufferSize); +} + +int VorbisDecoder::decode() +{ + int size = 0; + + while (size < bufferSize) + { + int result = ov_read(&handle, (char *) buffer + size, bufferSize - size, endian, (getBitDepth() == 16 ? 2 : 1), 1, 0); + + if (result == OV_HOLE) + continue; + else if (result <= OV_EREAD) + return -1; + else if (result == 0) + { + eof = true; + break; + } + else if (result > 0) + size += result; + } + + return size; +} + +bool VorbisDecoder::seek(float s) +{ + int result = ov_time_seek(&handle, s); + + if (result == 0) + { + eof = false; + return true; + } + + return false; +} + +bool VorbisDecoder::rewind() +{ + int result = ov_pcm_seek(&handle, 0); + + if (result == 0) + { + eof = false; + return true; + } + + return false; +} + +bool VorbisDecoder::isSeekable() +{ + long result = ov_seekable(&handle); + return (result != 0); +} + +int VorbisDecoder::getChannels() const +{ + return vorbisInfo->channels; +} + +int VorbisDecoder::getBitDepth() const +{ + return 16; +} + +int VorbisDecoder::getSampleRate() const +{ + return vorbisInfo->rate; +} + +} // lullaby +} // sound +} // love diff --git a/jni/love/src/modules/sound/lullaby/VorbisDecoder.h b/jni/love/src/modules/sound/lullaby/VorbisDecoder.h new file mode 100644 index 00000000..f60bbd95 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/VorbisDecoder.h @@ -0,0 +1,78 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_LULLABY_VORBIS_DECODER_H +#define LOVE_SOUND_LULLABY_VORBIS_DECODER_H + +// LOVE +#include "common/Data.h" +#include "Decoder.h" + +// vorbis +#include +#include + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +// Struct for handling data +struct SOggFile +{ + char *dataPtr; // Pointer to the data in memory + int dataSize; // Size of the data + int dataRead; // How much we've read so far +}; + +class VorbisDecoder : public Decoder +{ +public: + + VorbisDecoder(Data *data, const std::string &ext, int bufferSize); + virtual ~VorbisDecoder(); + + static bool accepts(const std::string &ext); + + love::sound::Decoder *clone(); + int decode(); + bool seek(float s); + bool rewind(); + bool isSeekable(); + int getChannels() const; + int getBitDepth() const; + int getSampleRate() const; + +private: + SOggFile oggFile; // (see struct) + ov_callbacks vorbisCallbacks; // Callbacks used to read the file from mem + OggVorbis_File handle; // Handle to the file + vorbis_info *vorbisInfo; // Info + vorbis_comment *vorbisComment; // Comments + int endian; // Endianness +}; // VorbisDecoder + +} // lullaby +} // sound +} // love + +#endif // LOVE_SOUND_LULLABY_VORBIS_DECODER_H diff --git a/jni/love/src/modules/sound/lullaby/WaveDecoder.cpp b/jni/love/src/modules/sound/lullaby/WaveDecoder.cpp new file mode 100644 index 00000000..d38f4098 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/WaveDecoder.cpp @@ -0,0 +1,194 @@ +/** + * Copyright (c) 2006-2012 LOVE Development Team + * + * 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 "WaveDecoder.h" + +#include +#include "common/config.h" +#include "common/Exception.h" + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +// Callbacks +wuff_sint32 read_callback(void *userdata, wuff_uint8 *buffer, size_t *size) +{ + WaveFile *input = (WaveFile *) userdata; + size_t bytes_left = input->size - input->offset; + size_t target_size = *size < bytes_left ? *size : bytes_left; + memcpy(buffer, input->data + input->offset, target_size); + input->offset += target_size; + *size = target_size; + return WUFF_SUCCESS; +} + +wuff_sint32 seek_callback(void *userdata, wuff_uint64 offset) +{ + WaveFile *input = (WaveFile *)userdata; + input->offset = (size_t) (offset < input->size ? offset : input->size); + return WUFF_SUCCESS; +} + +wuff_sint32 tell_callback(void *userdata, wuff_uint64 *offset) +{ + WaveFile *input = (WaveFile *)userdata; + *offset = input->offset; + return WUFF_SUCCESS; +} + +wuff_callback WaveDecoderCallbacks = {read_callback, seek_callback, tell_callback}; + + +WaveDecoder::WaveDecoder(Data *data, const std::string &ext, int bufferSize) + : Decoder(data, ext, bufferSize) +{ + dataFile.data = (char *) data->getData(); + dataFile.size = data->getSize(); + dataFile.offset = 0; + + int wuff_status = wuff_open(&handle, &WaveDecoderCallbacks, &dataFile); + if (wuff_status < 0) + throw love::Exception("Could not open WAVE"); + + try + { + wuff_status = wuff_stream_info(handle, &info); + if (wuff_status < 0) + throw love::Exception("Could not retrieve WAVE stream info"); + + if (info.channels > 2) + throw love::Exception("Multichannel audio not supported"); + + if (info.format != WUFF_FORMAT_PCM_U8 && info.format != WUFF_FORMAT_PCM_S16) + { + wuff_status = wuff_format(handle, WUFF_FORMAT_PCM_S16); + if (wuff_status < 0) + throw love::Exception("Could not set output format"); + } + } + catch (love::Exception &) + { + wuff_close(handle); + throw; + } +} + +WaveDecoder::~WaveDecoder() +{ + wuff_close(handle); +} + +bool WaveDecoder::accepts(const std::string &ext) +{ + static const std::string supported[] = + { + "wav", "" + }; + + for (int i = 0; !(supported[i].empty()); i++) + { + if (supported[i].compare(ext) == 0) + return true; + } + + return false; +} + +love::sound::Decoder *WaveDecoder::clone() +{ + return new WaveDecoder(data, ext, bufferSize); +} + +int WaveDecoder::decode() +{ + size_t size = 0; + + while (size < (size_t) bufferSize) + { + size_t bytes = bufferSize; + int wuff_status = wuff_read(handle, (wuff_uint8 *) buffer, &bytes); + + if (wuff_status < 0) + return 0; + else if (bytes == 0) + { + eof = true; + break; + } + + size += bytes; + } + + return size; +} + +bool WaveDecoder::seek(float s) +{ + int wuff_status = wuff_seek(handle, (wuff_uint64) (s * info.sample_rate)); + + if (wuff_status >= 0) + { + eof = false; + return true; + } + + return false; +} + +bool WaveDecoder::rewind() +{ + int wuff_status = wuff_seek(handle, 0); + + if (wuff_status >= 0) + { + eof = false; + return true; + } + + return false; +} + +bool WaveDecoder::isSeekable() +{ + return true; +} + +int WaveDecoder::getChannels() const +{ + return info.channels; +} + +int WaveDecoder::getBitDepth() const +{ + return info.bits_per_sample == 8 ? 8 : 16; +} + +int WaveDecoder::getSampleRate() const +{ + return info.sample_rate; +} + +} // lullaby +} // sound +} // love diff --git a/jni/love/src/modules/sound/lullaby/WaveDecoder.h b/jni/love/src/modules/sound/lullaby/WaveDecoder.h new file mode 100644 index 00000000..d7571949 --- /dev/null +++ b/jni/love/src/modules/sound/lullaby/WaveDecoder.h @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2006-2012 LOVE Development Team + * + * 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 LOVE_SOUND_LULLABY_WAVE_DECODER_H +#define LOVE_SOUND_LULLABY_WAVE_DECODER_H + +// LOVE +#include "common/Data.h" +#include "Decoder.h" + +#include "libraries/Wuff/wuff.h" + +namespace love +{ +namespace sound +{ +namespace lullaby +{ + +// Struct for handling data +struct WaveFile +{ + char *data; + size_t size; + size_t offset; +}; + +class WaveDecoder : public Decoder +{ +public: + + WaveDecoder(Data *data, const std::string &ext, int bufferSize); + virtual ~WaveDecoder(); + + static bool accepts(const std::string &ext); + + love::sound::Decoder *clone(); + int decode(); + bool seek(float s); + bool rewind(); + bool isSeekable(); + int getChannels() const; + int getBitDepth() const; + int getSampleRate() const; + +private: + + WaveFile dataFile; + wuff_handle * handle; + wuff_info info; + +}; // WaveDecoder + +} // lullaby +} // sound +} // love + +#endif // LOVE_SOUND_LULLABY_WAVE_DECODER_H diff --git a/jni/love/src/modules/sound/wrap_Decoder.cpp b/jni/love/src/modules/sound/wrap_Decoder.cpp new file mode 100644 index 00000000..96af1820 --- /dev/null +++ b/jni/love/src/modules/sound/wrap_Decoder.cpp @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Decoder.h" + +namespace love +{ +namespace sound +{ + +Decoder *luax_checkdecoder(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Decoder", SOUND_DECODER_T); +} + +int w_Decoder_getChannels(lua_State *L) +{ + Decoder *t = luax_checkdecoder(L, 1); + lua_pushinteger(L, t->getChannels()); + return 1; +} + +int w_Decoder_getBitDepth(lua_State *L) +{ + Decoder *t = luax_checkdecoder(L, 1); + lua_pushinteger(L, t->getBitDepth()); + return 1; +} + +int w_Decoder_getSampleRate(lua_State *L) +{ + Decoder *t = luax_checkdecoder(L, 1); + lua_pushinteger(L, t->getSampleRate()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getChannels", w_Decoder_getChannels }, + { "getBitDepth", w_Decoder_getBitDepth }, + { "getSampleRate", w_Decoder_getSampleRate }, + { 0, 0 } +}; + +extern "C" int luaopen_decoder(lua_State *L) +{ + return luax_register_type(L, "Decoder", functions); +} + +} // sound +} // love diff --git a/jni/love/src/modules/sound/wrap_Decoder.h b/jni/love/src/modules/sound/wrap_Decoder.h new file mode 100644 index 00000000..7edadf93 --- /dev/null +++ b/jni/love/src/modules/sound/wrap_Decoder.h @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_WRAP_DECODER_H +#define LOVE_SOUND_WRAP_DECODER_H + +// LOVE +#include "common/runtime.h" +#include "Decoder.h" + +namespace love +{ +namespace sound +{ + +Decoder *luax_checkdecoder(lua_State *L, int idx); +int w_Decoder_getChannels(lua_State *L); +int w_Decoder_getBitDepth(lua_State *L); +int w_Decoder_getSampleRate(lua_State *L); +extern "C" int luaopen_decoder(lua_State *L); + +} // sound +} // love + +#endif // LOVE_SOUND_WRAP_DECODER_H diff --git a/jni/love/src/modules/sound/wrap_Sound.cpp b/jni/love/src/modules/sound/wrap_Sound.cpp new file mode 100644 index 00000000..88d61435 --- /dev/null +++ b/jni/love/src/modules/sound/wrap_Sound.cpp @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Sound.h" + +// Implementations. +#include "lullaby/Sound.h" + +namespace love +{ +namespace sound +{ + +static Sound *instance = 0; + +int w_newSoundData(lua_State *L) +{ + SoundData *t = 0; + + if (lua_isnumber(L, 1)) + { + int samples = luaL_checkint(L, 1); + int sampleRate = luaL_optint(L, 2, Decoder::DEFAULT_SAMPLE_RATE); + int bitDepth = luaL_optint(L, 3, Decoder::DEFAULT_BIT_DEPTH); + int channels = luaL_optint(L, 4, Decoder::DEFAULT_CHANNELS); + + EXCEPT_GUARD(t = instance->newSoundData(samples, sampleRate, bitDepth, channels);) + } + // Must be string or decoder. + else + { + // Convert to Decoder, if necessary. + if (!luax_istype(L, 1, SOUND_DECODER_T)) + { + w_newDecoder(L); + lua_replace(L, 1); + } + + EXCEPT_GUARD(t = instance->newSoundData(luax_checkdecoder(L, 1));) + } + + luax_pushtype(L, "SoundData", SOUND_SOUND_DATA_T, t); + return 1; +} + +int w_newDecoder(lua_State *L) +{ + // Convert to FileData, if necessary. + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + love::filesystem::FileData *data = luax_checktype(L, 1, "FileData", FILESYSTEM_FILE_DATA_T); + + int bufferSize = luaL_optint(L, 2, Decoder::DEFAULT_BUFFER_SIZE); + + Decoder *t = 0; + EXCEPT_GUARD(t = instance->newDecoder(data, bufferSize);) + + if (t == 0) + return luaL_error(L, "Extension \"%s\" not supported.", data->getExtension().c_str()); + + luax_pushtype(L, "Decoder", SOUND_DECODER_T, t); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "newSoundData", w_newSoundData }, + { "newDecoder", w_newDecoder }, + { 0, 0 } +}; + +static const lua_CFunction types[] = +{ + luaopen_sounddata, + luaopen_decoder, + 0 +}; + +extern "C" int luaopen_love_sound(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new lullaby::Sound();) + } + else + instance->retain(); + + + WrappedModule w; + w.module = instance; + w.name = "sound"; + w.flags = MODULE_SOUND_T; + w.functions = functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // sound +} // love diff --git a/jni/love/src/modules/sound/wrap_Sound.h b/jni/love/src/modules/sound/wrap_Sound.h new file mode 100644 index 00000000..62772b00 --- /dev/null +++ b/jni/love/src/modules/sound/wrap_Sound.h @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_WRAP_SOUND_H +#define LOVE_SOUND_WRAP_SOUND_H + +// LOVE +#include "common/config.h" +#include "Sound.h" +#include "wrap_SoundData.h" +#include "wrap_Decoder.h" + +namespace love +{ +namespace sound +{ + +int w_newSoundData(lua_State *L); +int w_newDecoder(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_sound(lua_State *L); + +} // sound +} // love + +#endif // LOVE_SOUND_WRAP_SOUND_H diff --git a/jni/love/src/modules/sound/wrap_SoundData.cpp b/jni/love/src/modules/sound/wrap_SoundData.cpp new file mode 100644 index 00000000..a5c89de8 --- /dev/null +++ b/jni/love/src/modules/sound/wrap_SoundData.cpp @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_SoundData.h" + +#include "common/wrap_Data.h" + +namespace love +{ +namespace sound +{ + +SoundData *luax_checksounddata(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "SoundData", SOUND_SOUND_DATA_T); +} + +int w_SoundData_getChannels(lua_State *L) +{ + SoundData *t = luax_checksounddata(L, 1); + lua_pushinteger(L, t->getChannels()); + return 1; +} + +int w_SoundData_getBitDepth(lua_State *L) +{ + SoundData *t = luax_checksounddata(L, 1); + lua_pushinteger(L, t->getBitDepth()); + return 1; +} + +int w_SoundData_getSampleRate(lua_State *L) +{ + SoundData *t = luax_checksounddata(L, 1); + lua_pushinteger(L, t->getSampleRate()); + return 1; +} + +int w_SoundData_getSampleCount(lua_State *L) +{ + SoundData *t = luax_checksounddata(L, 1); + lua_pushinteger(L, t->getSampleCount()); + return 1; +} + +int w_SoundData_getDuration(lua_State *L) +{ + SoundData *t = luax_checksounddata(L, 1); + lua_pushnumber(L, t->getDuration()); + return 1; +} + +int w_SoundData_setSample(lua_State *L) +{ + SoundData *sd = luax_checksounddata(L, 1); + int i = (int) luaL_checkinteger(L, 2); + float sample = (float) luaL_checknumber(L, 3); + + EXCEPT_GUARD(sd->setSample(i, sample);) + return 0; +} + +int w_SoundData_getSample(lua_State *L) +{ + SoundData *sd = luax_checksounddata(L, 1); + int i = (int) luaL_checkinteger(L, 2); + + EXCEPT_GUARD(lua_pushnumber(L, sd->getSample(i));) + return 1; +} + +static const luaL_Reg functions[] = +{ + // Data + { "getString", w_Data_getString }, + { "getPointer", w_Data_getPointer }, + { "getSize", w_Data_getSize }, + + { "getChannels", w_SoundData_getChannels }, + { "getBitDepth", w_SoundData_getBitDepth }, + { "getSampleRate", w_SoundData_getSampleRate }, + { "getSampleCount", w_SoundData_getSampleCount }, + { "getDuration", w_SoundData_getDuration }, + { "setSample", w_SoundData_setSample }, + { "getSample", w_SoundData_getSample }, + { 0, 0 } +}; + +extern "C" int luaopen_sounddata(lua_State *L) +{ + return luax_register_type(L, "SoundData", functions); +} + +} // sound +} // love diff --git a/jni/love/src/modules/sound/wrap_SoundData.h b/jni/love/src/modules/sound/wrap_SoundData.h new file mode 100644 index 00000000..94c7f652 --- /dev/null +++ b/jni/love/src/modules/sound/wrap_SoundData.h @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SOUND_WRAP_SOUND_DATA_H +#define LOVE_SOUND_WRAP_SOUND_DATA_H + +// LOVE +#include "common/runtime.h" +#include "SoundData.h" + +namespace love +{ +namespace sound +{ + +SoundData *luax_checksounddata(lua_State *L, int idx); +int w_SoundData_getChannels(lua_State *L); +int w_SoundData_getBitDepth(lua_State *L); +int w_SoundData_getSampleRate(lua_State *L); +int w_SoundData_getSampleCount(lua_State *L); +int w_SoundData_getDuration(lua_State *L); +int w_SoundData_setSample(lua_State *L); +int w_SoundData_getSample(lua_State *L); +extern "C" int luaopen_sounddata(lua_State *L); + +} // sound +} // love + +#endif // LOVE_SOUND_WRAP_SOUND_DATA_H diff --git a/jni/love/src/modules/system/System.cpp b/jni/love/src/modules/system/System.cpp new file mode 100644 index 00000000..7760f996 --- /dev/null +++ b/jni/love/src/modules/system/System.cpp @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "System.h" + +namespace love +{ +namespace system +{ + +std::string System::getOS() const +{ +#ifdef LOVE_MACOSX + return "OS X"; +#elif LOVE_WINDOWS + return "Windows"; +#elif LOVE_LINUX + return "Linux"; +#else + return "Unknown"; +#endif +} + +bool System::getConstant(const char *in, System::PowerState &out) +{ + return powerStates.find(in, out); +} + +bool System::getConstant(System::PowerState in, const char *&out) +{ + return powerStates.find(in, out); +} + +StringMap::Entry System::powerEntries[] = +{ + {"unknown", System::POWER_UNKNOWN}, + {"battery", System::POWER_BATTERY}, + {"nobattery", System::POWER_NO_BATTERY}, + {"charging", System::POWER_CHARGING}, + {"charged", System::POWER_CHARGED}, +}; + +StringMap System::powerStates(System::powerEntries, sizeof(System::powerEntries)); + +} // system +} // love diff --git a/jni/love/src/modules/system/System.h b/jni/love/src/modules/system/System.h new file mode 100644 index 00000000..b394a914 --- /dev/null +++ b/jni/love/src/modules/system/System.h @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SYSTEM_H +#define LOVE_SYSTEM_H + +// LOVE +#include "common/config.h" +#include "common/Module.h" +#include "common/StringMap.h" + +// stdlib +#include + +namespace love +{ +namespace system +{ + +class System : public Module +{ +public: + + enum PowerState + { + POWER_UNKNOWN, + POWER_BATTERY, + POWER_NO_BATTERY, + POWER_CHARGING, + POWER_CHARGED, + POWER_MAX_ENUM + }; + + virtual ~System() {} + + /** + * Gets the current operating system. + **/ + std::string getOS() const; + + /** + * Gets the number of reported CPU cores on the current system. + * Does not account for technologies such as Hyperthreading: a 4-core + * Hyperthreading-enabled Intel CPU will report 8, instead of 4. + **/ + virtual int getProcessorCount() const = 0; + + /** + * Replaces the contents of the system's text clipboard with a string. + * @param text The clipboard text to set. + **/ + virtual void setClipboardText(const std::string &text) const = 0; + + /** + * Gets the contents of the system's text clipboard. + **/ + virtual std::string getClipboardText() const = 0; + + /** + * Gets information about the system's power supply. + * + * @param[out] seconds Time in seconds of battery life left. + * -1 if a value can't be determined. + * @param[out] percent The percentage of battery life left (0-100.) + * -1 if a value can't be determined. + * + * @return The current state of the battery. + **/ + virtual PowerState getPowerInfo(int &seconds, int &percent) const = 0; + + static bool getConstant(const char *in, PowerState &out); + static bool getConstant(PowerState in, const char *&out); + +private: + + static StringMap::Entry powerEntries[]; + static StringMap powerStates; + +}; // System + +} // system +} // love + +#endif // LOVE_SYSTEM_H diff --git a/jni/love/src/modules/system/sdl/System.cpp b/jni/love/src/modules/system/sdl/System.cpp new file mode 100644 index 00000000..39b18096 --- /dev/null +++ b/jni/love/src/modules/system/sdl/System.cpp @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "System.h" + +// SDL +#include +#include + +namespace love +{ +namespace system +{ +namespace sdl +{ + +System::System() +{ +} + +const char *System::getName() const +{ + return "love.system.sdl"; +} + +int System::getProcessorCount() const +{ + return SDL_GetCPUCount(); +} + +void System::setClipboardText(const std::string &text) const +{ + SDL_SetClipboardText(text.c_str()); +} + +std::string System::getClipboardText() const +{ + std::string text(""); + + char *ctext = SDL_GetClipboardText(); + if (ctext) + { + text = std::string(ctext); + SDL_free(ctext); + } + + return text; +} + +love::system::System::PowerState System::getPowerInfo(int &seconds, int &percent) const +{ + SDL_PowerState sdlstate = SDL_GetPowerInfo(&seconds, &percent); + + PowerState state = POWER_UNKNOWN; + powerStates.find(sdlstate, state); + + return state; +} + +EnumMap::Entry System::powerEntries[] = +{ + {System::POWER_UNKNOWN, SDL_POWERSTATE_UNKNOWN}, + {System::POWER_BATTERY, SDL_POWERSTATE_ON_BATTERY}, + {System::POWER_NO_BATTERY, SDL_POWERSTATE_NO_BATTERY}, + {System::POWER_CHARGING, SDL_POWERSTATE_CHARGING}, + {System::POWER_CHARGED, SDL_POWERSTATE_CHARGED}, +}; + +EnumMap System::powerStates(System::powerEntries, sizeof(System::powerEntries)); + +} // sdl +} // system +} // love diff --git a/jni/love/src/modules/system/sdl/System.h b/jni/love/src/modules/system/sdl/System.h new file mode 100644 index 00000000..5d2b3556 --- /dev/null +++ b/jni/love/src/modules/system/sdl/System.h @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_SYSTEM_SDL_SYSTEM_H +#define LOVE_SYSTEM_SDL_SYSTEM_H + +// LOVE +#include "system/System.h" +#include "common/EnumMap.h" + +// SDL +#include + +namespace love +{ +namespace system +{ +namespace sdl +{ + +class System : public love::system::System +{ +public: + + System(); + virtual ~System() {} + + // Implements Module. + const char *getName() const; + + int getProcessorCount() const; + + void setClipboardText(const std::string &text) const; + std::string getClipboardText() const; + + PowerState getPowerInfo(int &seconds, int &percent) const; + +private: + + static EnumMap::Entry powerEntries[]; + static EnumMap powerStates; + +}; // System + +} // sdl +} // system +} // love + +#endif // LOVE_SYSTEM_SDL_SYSTEM_H diff --git a/jni/love/src/modules/system/wrap_System.cpp b/jni/love/src/modules/system/wrap_System.cpp new file mode 100644 index 00000000..3048a94d --- /dev/null +++ b/jni/love/src/modules/system/wrap_System.cpp @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "wrap_System.h" +#include "sdl/System.h" + +namespace love +{ +namespace system +{ + +static System *instance = 0; + +int w_getOS(lua_State *L) +{ + luax_pushstring(L, instance->getOS()); + return 1; +} + +int w_getProcessorCount(lua_State *L) +{ + lua_pushinteger(L, instance->getProcessorCount()); + return 1; +} + +int w_setClipboardText(lua_State *L) +{ + const char *text = luaL_checkstring(L, 1); + instance->setClipboardText(text); + return 0; +} + +int w_getClipboardText(lua_State *L) +{ + luax_pushstring(L, instance->getClipboardText()); + return 1; +} + +int w_getPowerInfo(lua_State *L) +{ + int seconds = -1, percent = -1; + const char *str; + + System::PowerState state = instance->getPowerInfo(seconds, percent); + + if (!System::getConstant(state, str)) + str = "unknown"; + + lua_pushstring(L, str); + + if (percent >= 0) + lua_pushinteger(L, percent); + else + lua_pushnil(L); + + if (seconds >= 0) + lua_pushinteger(L, seconds); + else + lua_pushnil(L); + + return 3; +} + +static const luaL_Reg functions[] = +{ + { "getOS", w_getOS }, + { "getProcessorCount", w_getProcessorCount }, + { "setClipboardText", w_setClipboardText }, + { "getClipboardText", w_getClipboardText }, + { "getPowerInfo", w_getPowerInfo }, + { 0, 0 } +}; + +extern "C" int luaopen_love_system(lua_State *L) +{ + if (instance == 0) + { + instance = new love::system::sdl::System(); + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "system"; + w.flags = MODULE_T; + w.functions = functions; + w.types = 0; + + return luax_register_module(L, w); +} + +} // system +} // love \ No newline at end of file diff --git a/jni/love/src/modules/system/wrap_System.h b/jni/love/src/modules/system/wrap_System.h new file mode 100644 index 00000000..1bf7dc86 --- /dev/null +++ b/jni/love/src/modules/system/wrap_System.h @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_WRAP_SYSTEM_H +#define LOVE_WRAP_SYSTEM_H + +// LOVE +#include "System.h" +#include "common/runtime.h" + +namespace love +{ +namespace system +{ + +int w_getOS(lua_State *L); +int w_getProcessorCount(lua_State *L); +int w_setClipboardText(lua_State *L); +int w_getClipboardText(lua_State *L); +int w_getPowerInfo(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_system(lua_State *L); + +} // system +} // love + +#endif // LOVE_WRAP_SYSTEM_H diff --git a/jni/love/src/modules/thread/Channel.cpp b/jni/love/src/modules/thread/Channel.cpp new file mode 100644 index 00000000..e0f3ddf5 --- /dev/null +++ b/jni/love/src/modules/thread/Channel.cpp @@ -0,0 +1,234 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Channel.h" +#include +#include + +namespace +{ +union uslong +{ + unsigned long u; + long i; +}; + +// target <= current, but semi-wrapsafe, one wrap, anyway +inline bool past(unsigned int target, unsigned int current) +{ + if (target > current) + return false; + if (target == current) + return true; + + uslong t, c; + t.u = target; + c.u = current; + + return !(t.i < 0 && c.i > 0); +} +} + +namespace love +{ +namespace thread +{ +static std::map namedChannels; +static Mutex *namedChannelMutex; + +Channel *Channel::getChannel(const std::string &name) +{ + if (!namedChannelMutex) + namedChannelMutex = newMutex(); + + Lock l(namedChannelMutex); + if (!namedChannels.count(name)) + namedChannels[name] = new Channel(name); + else + namedChannels[name]->retain(); + + return namedChannels[name]; +} + +Channel::Channel() + : named(false) + , sent(0) + , received(0) +{ + mutex = newMutex(); + cond = newConditional(); +} + +Channel::Channel(const std::string &name) + : named(true) + , name(name) + , sent(0) + , received(0) +{ + mutex = newMutex(); + cond = newConditional(); +} + +Channel::~Channel() +{ + while (!queue.empty()) + { + queue.front()->release(); + queue.pop(); + } + + delete mutex; + delete cond; + + if (named) + namedChannels.erase(name); +} + +unsigned long Channel::push(Variant *var) +{ + if (!var) + return 0; + + Lock l(mutex); + var->retain(); + + // Keep a reference to ourselves + // if we're non-empty and named. + if (named && queue.empty()) + retain(); + + queue.push(var); + cond->broadcast(); + + return ++sent; +} + +void Channel::supply(Variant *var) +{ + if (!var) + return; + + Lock l(mutex); + unsigned long id = push(var); + + while (!past(id, received)) + cond->wait(mutex); +} + +Variant *Channel::pop() +{ + Lock l(mutex); + if (queue.empty()) + return 0; + + Variant *var = queue.front(); + queue.pop(); + + received++; + cond->broadcast(); + + // Release our reference to ourselves + // if we're empty and named. + if (named && queue.empty()) + release(); + + return var; +} // NOTE: Returns a retained Variant + +Variant *Channel::demand() +{ + Variant *var; + Lock l(mutex); + while (!(var = pop())) + cond->wait(mutex); + + return var; +} + +Variant *Channel::peek() +{ + Lock l(mutex); + if (queue.empty()) + return 0; + + Variant *var = queue.front(); + var->retain(); + return var; +} + +int Channel::getCount() +{ + Lock l(mutex); + return queue.size(); +} + +void Channel::clear() +{ + Lock l(mutex); + + // We're already empty. + if (queue.empty()) + return; + + while (!queue.empty()) + { + queue.front()->release(); + queue.pop(); + } + + // Finish all the supply waits + received = sent; + cond->broadcast(); + + // Once again, release our own + // reference if we're named. + if (named) + release(); +} + +void Channel::lockMutex() +{ + mutex->lock(); +} + +void Channel::unlockMutex() +{ + mutex->unlock(); +} + +void Channel::retain() +{ + EmptyLock l; + if (named) + l.setLock(namedChannelMutex); + + Object::retain(); +} + +void Channel::release() +{ + EmptyLock l; + if (named) + l.setLock(namedChannelMutex); + + Object::release(); +} +} // thread +} // love diff --git a/jni/love/src/modules/thread/Channel.h b/jni/love/src/modules/thread/Channel.h new file mode 100644 index 00000000..665e1ec0 --- /dev/null +++ b/jni/love/src/modules/thread/Channel.h @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_CHANNEL_H +#define LOVE_THREAD_CHANNEL_H + +// STL +#include +#include + +// LOVE +#include +#include + +namespace love +{ +namespace thread +{ +class Channel : public love::Object +{ +// FOR WRAPPER USE ONLY +friend void retainVariant(Channel *, Variant *); +friend void releaseVariant(Channel *, Variant *); + +public: + Channel(); + ~Channel(); + static Channel *getChannel(const std::string &name); + + unsigned long push(Variant *var); + void supply(Variant *var); // blocking push + Variant *pop(); + Variant *demand(); // blocking pop + Variant *peek(); + int getCount(); + void clear(); + + void retain(); + void release(); + +private: + Channel(const std::string &name); + void lockMutex(); + void unlockMutex(); + + Mutex *mutex; + Conditional *cond; + std::queue queue; + bool named; + std::string name; + + unsigned long sent; + unsigned long received; +}; // Channel +} // thread +} // love + +#endif // LOVE_THREAD_CHANNEL_H diff --git a/jni/love/src/modules/thread/LuaThread.cpp b/jni/love/src/modules/thread/LuaThread.cpp new file mode 100644 index 00000000..7b8f38db --- /dev/null +++ b/jni/love/src/modules/thread/LuaThread.cpp @@ -0,0 +1,128 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "LuaThread.h" +#include "event/Event.h" +#include "common/config.h" + +#ifdef LOVE_BUILD_STANDALONE +extern "C" int luaopen_love(lua_State * L); +#endif // LOVE_BUILD_STANDALONE +extern "C" int luaopen_love_thread(lua_State *L); + +namespace love +{ +namespace thread +{ +LuaThread::LuaThread(const std::string &name, love::Data *code) + : code(code) + , name(name) + , args(0) + , nargs(0) +{ + code->retain(); +} + +LuaThread::~LuaThread() +{ + code->release(); + + // No args should still exist at this point, + // but you never know. + for (int i = 0; i < nargs; ++i) + args[i]->release(); +} + +void LuaThread::threadFunction() +{ + this->retain(); + error.clear(); + lua_State *L = luaL_newstate(); + luaL_openlibs(L); +#ifdef LOVE_BUILD_STANDALONE + love::luax_preload(L, luaopen_love, "love"); + luaopen_love(L); +#endif // LOVE_BUILD_STANDALONE + luaopen_love_thread(L); + if (luaL_loadbuffer(L, (const char *) code->getData(), code->getSize(), name.c_str()) != 0) + error = luax_tostring(L, -1); + else + { + int pushedargs = nargs; + for (int i = 0; i < nargs; ++i) + { + args[i]->toLua(L); + args[i]->release(); + } + // Set both args and nargs to nil, prevents the deconstructor from + // accessing it again. + nargs = 0; + args = 0; + + if (lua_pcall(L, pushedargs, 0, 0) != 0) + error = luax_tostring(L, -1); + } + lua_close(L); + if (!error.empty()) + onError(); + this->release(); +} + +bool LuaThread::start(Variant **args, int nargs) +{ + for (int i = 0; i < this->nargs; ++i) + this->args[i]->release(); + + this->args = args; + this->nargs = nargs; + + return Threadable::start(); +} + +const std::string &LuaThread::getError() const +{ + return error; +} + +void LuaThread::onError() +{ + if (error.empty()) + return; + + event::Event *event = (event::Event *) Module::findInstance("love.event."); + if (!event) + return; + + Proxy p; + p.flags = THREAD_THREAD_T; + p.data = this; + + Variant *arg1 = new Variant(THREAD_THREAD_ID, &p); + Variant *arg2 = new Variant(error.c_str(), error.length()); + event::Message *msg = new event::Message("threaderror", arg1, arg2); + arg1->release(); + arg2->release(); + + event->push(msg); + msg->release(); +} + +} // thread +} // love diff --git a/jni/love/src/modules/thread/LuaThread.h b/jni/love/src/modules/thread/LuaThread.h new file mode 100644 index 00000000..7a60ca64 --- /dev/null +++ b/jni/love/src/modules/thread/LuaThread.h @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_LUATHREAD_H +#define LOVE_THREAD_LUATHREAD_H + +// STL +#include + +// LOVE +#include +#include +#include +#include + +namespace love +{ +namespace thread +{ +class LuaThread : public love::Object, public Threadable +{ +public: + + LuaThread(const std::string &name, love::Data *code); + ~LuaThread(); + void threadFunction(); + const std::string &getError() const; + + bool start(Variant **args, int nargs); + +private: + + void onError(); + + love::Data *code; + std::string name; + std::string error; + + Variant **args; + int nargs; +}; +} // thread +} // love + +#endif // LOVE_THREAD_LUATHREAD_H diff --git a/jni/love/src/modules/thread/Thread.h b/jni/love/src/modules/thread/Thread.h new file mode 100644 index 00000000..4fa0bf1c --- /dev/null +++ b/jni/love/src/modules/thread/Thread.h @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_THREAD_H +#define LOVE_THREAD_THREAD_H + +// LOVE +#include +#include + +namespace love +{ +namespace thread +{ + +class Thread +{ +public: + + virtual ~Thread() {} + virtual bool start() = 0; + virtual void wait() = 0; + virtual bool isRunning() = 0; + +}; // ThreadObject + +} // thread +} // love + +#endif // LOVE_THREAD_THREAD_H diff --git a/jni/love/src/modules/thread/ThreadModule.cpp b/jni/love/src/modules/thread/ThreadModule.cpp new file mode 100644 index 00000000..b70c931b --- /dev/null +++ b/jni/love/src/modules/thread/ThreadModule.cpp @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "ThreadModule.h" + +namespace love +{ +namespace thread +{ + +LuaThread *ThreadModule::newThread(const std::string &name, love::Data *data) +{ + LuaThread *lt = new LuaThread(name, data); + return lt; +} + +Channel *ThreadModule::newChannel() +{ + return new Channel(); +} + +Channel *ThreadModule::getChannel(const std::string &name) +{ + return Channel::getChannel(name); +} + +const char *ThreadModule::getName() const +{ + return "love.thread.sdl"; +} + +} // thread +} // love diff --git a/jni/love/src/modules/thread/ThreadModule.h b/jni/love/src/modules/thread/ThreadModule.h new file mode 100644 index 00000000..a004af96 --- /dev/null +++ b/jni/love/src/modules/thread/ThreadModule.h @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_THREADMODULE_H +#define LOVE_THREAD_THREADMODULE_H + +// STL +#include + +// LOVE +#include "common/Data.h" +#include "common/Module.h" +#include "common/StringMap.h" + +#include "Thread.h" +#include "Channel.h" +#include "LuaThread.h" +#include "threads.h" + +namespace love +{ +namespace thread +{ +class ThreadModule : public love::Module +{ +public: + + virtual ~ThreadModule() {} + virtual LuaThread *newThread(const std::string &name, love::Data *data); + virtual Channel *newChannel(); + virtual Channel *getChannel(const std::string &name); + + // Implements Module. + virtual const char *getName() const; + +}; // ThreadModule + +} // thread +} // love + +#endif // LOVE_THREAD_THREADMODULE_H diff --git a/jni/love/src/modules/thread/sdl/Thread.cpp b/jni/love/src/modules/thread/sdl/Thread.cpp new file mode 100644 index 00000000..f5e4c533 --- /dev/null +++ b/jni/love/src/modules/thread/sdl/Thread.cpp @@ -0,0 +1,88 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "Thread.h" + +namespace love +{ +namespace thread +{ +namespace sdl +{ +Thread::Thread(Threadable *t) + : t(t) + , running(false) + , thread(0) +{ +} + +Thread::~Thread() +{ + if (!running) // Clean up handle + wait(); + /* + if (running) + wait(); + FIXME: Needed for proper thread cleanup + */ +} + +bool Thread::start() +{ + Lock l(mutex); + if (running) + return false; + if (thread) // Clean old handle up + SDL_WaitThread(thread, 0); + thread = SDL_CreateThread(thread_runner, NULL, this); + running = (thread != 0); + return running; +} + +void Thread::wait() +{ + { + Lock l(mutex); + if (!thread) + return; + } + SDL_WaitThread(thread, 0); + Lock l(mutex); + running = false; + thread = 0; +} + +bool Thread::isRunning() +{ + Lock l(mutex); + return running; +} + +int Thread::thread_runner(void *data) +{ + Thread *self = (Thread *) data; // some compilers don't like 'this' + self->t->threadFunction(); + Lock l(self->mutex); + self->running = false; + return 0; +} +} // sdl +} // thread +} // love diff --git a/jni/love/src/modules/thread/sdl/Thread.h b/jni/love/src/modules/thread/sdl/Thread.h new file mode 100644 index 00000000..a219ca72 --- /dev/null +++ b/jni/love/src/modules/thread/sdl/Thread.h @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_SDL_THREAD_H +#define LOVE_THREAD_SDL_THREAD_H + +// LOVE +#include +#include "threads.h" + +// SDL +#include + +namespace love +{ +namespace thread +{ +namespace sdl +{ +class Thread : public thread::Thread +{ +public: + + Thread(Threadable *t); + ~Thread(); + bool start(); + void wait(); + bool isRunning(); + +private: + + Threadable *t; + bool running; + SDL_Thread *thread; + Mutex mutex; + + static int thread_runner(void *data); + +}; // Thread + +} // sdl +} // thread +} // love + +#endif // LOVE_THREAD_SDL_THREAD_H diff --git a/jni/love/src/modules/thread/sdl/threads.cpp b/jni/love/src/modules/thread/sdl/threads.cpp new file mode 100644 index 00000000..068347e0 --- /dev/null +++ b/jni/love/src/modules/thread/sdl/threads.cpp @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "threads.h" +#include "Thread.h" + +namespace love +{ +namespace thread +{ +namespace sdl +{ +Mutex::Mutex() +{ + mutex = SDL_CreateMutex(); +} + +Mutex::~Mutex() +{ + SDL_DestroyMutex(mutex); +} + +void Mutex::lock() +{ + SDL_LockMutex(mutex); +} + +void Mutex::unlock() +{ + SDL_UnlockMutex(mutex); +} + +Conditional::Conditional() +{ + cond = SDL_CreateCond(); +} + +Conditional::~Conditional() +{ + SDL_DestroyCond(cond); +} + +void Conditional::signal() +{ + SDL_CondSignal(cond); +} + +void Conditional::broadcast() +{ + SDL_CondBroadcast(cond); +} + +bool Conditional::wait(thread::Mutex *_mutex, int timeout) +{ + // Yes, I realise this can be dangerous, + // however, you're asking for it if you're + // mixing thread implementations. + Mutex *mutex = (Mutex *) _mutex; + if (timeout < 0) + return !SDL_CondWait(cond, mutex->mutex); + else + return (SDL_CondWaitTimeout(cond, mutex->mutex, timeout) == 0); +} + +} // sdl + +thread::Mutex *newMutex() +{ + return new sdl::Mutex(); +} + +thread::Conditional *newConditional() +{ + return new sdl::Conditional(); +} + +thread::Thread *newThread(Threadable *t) +{ + return new sdl::Thread(t); +} + +} // thread +} // love diff --git a/jni/love/src/modules/thread/sdl/threads.h b/jni/love/src/modules/thread/sdl/threads.h new file mode 100644 index 00000000..d80478a8 --- /dev/null +++ b/jni/love/src/modules/thread/sdl/threads.h @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_SDL_THREADS_H +#define LOVE_THREAD_SDL_THREADS_H + +#include +#include + +#include + +namespace love +{ +namespace thread +{ +namespace sdl +{ +class Conditional; + +class Mutex : public thread::Mutex +{ +public: + Mutex(); + ~Mutex(); + + void lock(); + void unlock(); + +private: + SDL_mutex *mutex; + Mutex(const Mutex&/* mutex*/) {} + + friend class Conditional; +}; + +class Conditional : public thread::Conditional +{ +public: + Conditional(); + ~Conditional(); + + void signal(); + void broadcast(); + bool wait(thread::Mutex *mutex, int timeout=-1); + +private: + SDL_cond *cond; +}; + +} // sdl +} // thread +} // love + +#endif /* LOVE_THREAD_SDL_THREADS_H */ diff --git a/jni/love/src/modules/thread/threads.cpp b/jni/love/src/modules/thread/threads.cpp new file mode 100644 index 00000000..692ce292 --- /dev/null +++ b/jni/love/src/modules/thread/threads.cpp @@ -0,0 +1,103 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "threads.h" + +namespace love +{ +namespace thread +{ + +Lock::Lock(Mutex *m) + : mutex(m) +{ + mutex->lock(); +} + +Lock::Lock(Mutex &m) + : mutex(&m) +{ + mutex->lock(); +} + +Lock::~Lock() +{ + mutex->unlock(); +} + +EmptyLock::EmptyLock() + : mutex(0) +{ +} + +EmptyLock::~EmptyLock() +{ + if (mutex) + mutex->unlock(); +} + +void EmptyLock::setLock(Mutex *m) +{ + if (m) + m->lock(); + + if (mutex) + mutex->unlock(); + + mutex = m; +} + +void EmptyLock::setLock(Mutex &m) +{ + m.lock(); + + if (mutex) + mutex->unlock(); + + mutex = &m; +} + +Threadable::Threadable() +{ + owner = newThread(this); +} + +Threadable::~Threadable() +{ + delete owner; +} + +bool Threadable::start() +{ + return owner->start(); +} + +void Threadable::wait() +{ + owner->wait(); +} + +bool Threadable::isRunning() const +{ + return owner->isRunning(); +} + +} // thread +} // love diff --git a/jni/love/src/modules/thread/threads.h b/jni/love/src/modules/thread/threads.h new file mode 100644 index 00000000..eca78e44 --- /dev/null +++ b/jni/love/src/modules/thread/threads.h @@ -0,0 +1,98 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_THREADS_H +#define LOVE_THREAD_THREADS_H + +#include +#include "Thread.h" + +namespace love +{ +namespace thread +{ + +class Mutex +{ +public: + virtual ~Mutex() {} + + virtual void lock() = 0; + virtual void unlock() = 0; +}; + +class Conditional +{ +public: + virtual ~Conditional() {} + + virtual void signal() = 0; + virtual void broadcast() = 0; + virtual bool wait(Mutex *mutex, int timeout=-1) = 0; +}; + +class Lock +{ +public: + Lock(Mutex *m); + Lock(Mutex &m); + ~Lock(); + +private: + Mutex *mutex; +}; + +class EmptyLock +{ +public: + EmptyLock(); + ~EmptyLock(); + + void setLock(Mutex *m); + void setLock(Mutex &m); + +private: + Mutex *mutex; +}; + +class Threadable +{ +public: + Threadable(); + virtual ~Threadable(); + + virtual void threadFunction() = 0; + + bool start(); + void wait(); + bool isRunning() const; + +protected: + Thread *owner; +}; + +Mutex *newMutex(); +Conditional *newConditional(); +Thread *newThread(Threadable *t); + +} // thread +} // love + +#endif /* LOVE_THREAD_THREADS_H */ diff --git a/jni/love/src/modules/thread/wrap_Channel.cpp b/jni/love/src/modules/thread/wrap_Channel.cpp new file mode 100644 index 00000000..b0d632c8 --- /dev/null +++ b/jni/love/src/modules/thread/wrap_Channel.cpp @@ -0,0 +1,135 @@ +/** +* Copyright (c) 2006-2010 LOVE Development Team +* +* 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 "wrap_Channel.h" + +namespace love +{ +namespace thread +{ +void retainVariant(Channel *c, Variant *v) +{ + c->lockMutex(); + v->retain(); + c->unlockMutex(); +} + +void releaseVariant(Channel *c, Variant *v) +{ + c->lockMutex(); + v->release(); + c->unlockMutex(); +} + +Channel *luax_checkchannel(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Channel", THREAD_CHANNEL_T); +} + +int w_Channel_push(lua_State *L) +{ + Channel *c = luax_checkchannel(L, 1); + Variant *var = lua_isnoneornil(L, 2) ? 0 : Variant::fromLua(L, 2); + if (!var) + return luaL_argerror(L, 2, "boolean, number, string, love type, or flat table expected"); + c->push(var); + releaseVariant(c, var); + return 0; +} + +int w_Channel_supply(lua_State *L) +{ + Channel *c = luax_checkchannel(L, 1); + Variant *var = lua_isnoneornil(L, 2) ? 0 : Variant::fromLua(L, 2); + if (!var) + return luaL_argerror(L, 2, "boolean, number, string, love type, or flat table expected"); + c->supply(var); + releaseVariant(c, var); + return 0; +} + +int w_Channel_pop(lua_State *L) +{ + Channel *c = luax_checkchannel(L, 1); + Variant *var = c->pop(); + if (var) + { + var->toLua(L); + releaseVariant(c, var); + } + else + lua_pushnil(L); + return 1; +} + +int w_Channel_demand(lua_State *L) +{ + Channel *c = luax_checkchannel(L, 1); + Variant *var = c->demand(); + var->toLua(L); + releaseVariant(c, var); + return 1; +} + +int w_Channel_peek(lua_State *L) +{ + Channel *c = luax_checkchannel(L, 1); + Variant *var = c->peek(); + if (var) + { + var->toLua(L); + releaseVariant(c, var); + } + else + lua_pushnil(L); + return 1; +} + +int w_Channel_getCount(lua_State *L) +{ + Channel *c = luax_checkchannel(L, 1); + lua_pushnumber(L, c->getCount()); + return 1; +} + +int w_Channel_clear(lua_State *L) +{ + Channel *c = luax_checkchannel(L, 1); + c->clear(); + return 0; +} + +static const luaL_Reg type_functions[] = { + { "push", w_Channel_push }, + { "supply", w_Channel_supply }, + { "pop", w_Channel_pop }, + { "demand", w_Channel_demand }, + { "peek", w_Channel_peek }, + { "getCount", w_Channel_getCount }, + { "clear", w_Channel_clear }, + { 0, 0 } +}; + +extern "C" int luaopen_channel(lua_State *L) +{ + return luax_register_type(L, "Channel", type_functions); +} +} +} diff --git a/jni/love/src/modules/thread/wrap_Channel.h b/jni/love/src/modules/thread/wrap_Channel.h new file mode 100644 index 00000000..3abee1cd --- /dev/null +++ b/jni/love/src/modules/thread/wrap_Channel.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_WRAP_CHANNEL_H +#define LOVE_THREAD_WRAP_CHANNEL_H + +// LOVE +#include "Channel.h" + +namespace love +{ +namespace thread +{ +Channel *luax_checkchannel(lua_State *L, int idx); +int w_Channel_push(lua_State *L); +int w_Channel_supply(lua_State *L); +int w_Channel_pop(lua_State *L); +int w_Channel_demand(lua_State *L); +int w_Channel_peek(lua_State *L); +int w_Channel_getCount(lua_State *L); +int w_Channel_clear(lua_State *L); + +extern "C" int luaopen_channel(lua_State *L); +} // thread +} // love + +#endif // LOVE_THREAD_WRAP_CHANNEL_H diff --git a/jni/love/src/modules/thread/wrap_LuaThread.cpp b/jni/love/src/modules/thread/wrap_LuaThread.cpp new file mode 100644 index 00000000..1629051c --- /dev/null +++ b/jni/love/src/modules/thread/wrap_LuaThread.cpp @@ -0,0 +1,98 @@ +/** + * Copyright (c) 2006-2010 LOVE Development Team + * + * 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 "wrap_LuaThread.h" + +namespace love +{ +namespace thread +{ + +LuaThread *luax_checkthread(lua_State *L, int idx) +{ + return luax_checktype(L, idx, "Thread", THREAD_THREAD_T); +} + +int w_Thread_start(lua_State *L) +{ + LuaThread *t = luax_checkthread(L, 1); + int nargs = lua_gettop(L) - 1; + Variant **args = 0; + + if (nargs > 0) + { + args = new Variant*[nargs]; + for (int i = 0; i < nargs; ++i) + { + args[i] = Variant::fromLua(L, i+2); + if (!args[i]) + { + for (int j = i; j >= 0; j--) + delete args[j]; + delete[] args; + return luaL_argerror(L, i+2, "boolean, number, string, love type, or flat table expected"); + } + } + } + + luax_pushboolean(L, t->start(args, nargs)); + return 1; +} + +int w_Thread_wait(lua_State *L) +{ + LuaThread *t = luax_checkthread(L, 1); + t->wait(); + return 0; +} + +int w_Thread_getError(lua_State *L) +{ + LuaThread *t = luax_checkthread(L, 1); + std::string err = t->getError(); + if (err.empty()) + lua_pushnil(L); + else + luax_pushstring(L, err); + return 1; +} + +int w_Thread_isRunning(lua_State *L) +{ + LuaThread *t = luax_checkthread(L, 1); + luax_pushboolean(L, t->isRunning()); + return 1; +} + +static const luaL_Reg type_functions[] = { + { "start", w_Thread_start }, + { "wait", w_Thread_wait }, + { "getError", w_Thread_getError }, + { "isRunning", w_Thread_isRunning }, + { 0, 0 } +}; + +extern "C" int luaopen_thread(lua_State *L) +{ + return luax_register_type(L, "Thread", type_functions); +} + +} // thread +} // love diff --git a/jni/love/src/modules/thread/wrap_LuaThread.h b/jni/love/src/modules/thread/wrap_LuaThread.h new file mode 100644 index 00000000..b53cf2e8 --- /dev/null +++ b/jni/love/src/modules/thread/wrap_LuaThread.h @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_WRAP_LUATHREAD_H +#define LOVE_THREAD_WRAP_LUATHREAD_H + +// LOVE +#include "ThreadModule.h" + +namespace love +{ +namespace thread +{ + +LuaThread *luax_checkthread(lua_State *L, int idx); +int w_Thread_start(lua_State *L); +int w_Thread_wait(lua_State *L); +int w_Thread_getError(lua_State *L); +int w_Thread_isRunning(lua_State *L); + +extern "C" int luaopen_thread(lua_State *L); + +} // thread +} // love + +#endif // LOVE_THREAD_WRAP_LUATHREAD_H diff --git a/jni/love/src/modules/thread/wrap_ThreadModule.cpp b/jni/love/src/modules/thread/wrap_ThreadModule.cpp new file mode 100644 index 00000000..c90fb9a6 --- /dev/null +++ b/jni/love/src/modules/thread/wrap_ThreadModule.cpp @@ -0,0 +1,110 @@ +/** +* Copyright (c) 2006-2010 LOVE Development Team +* +* 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. +**/ + +// LOVE +#include "wrap_ThreadModule.h" +#include "wrap_LuaThread.h" +#include "wrap_Channel.h" +#include "ThreadModule.h" + +#include "filesystem/File.h" +#include "filesystem/FileData.h" + +namespace love +{ +namespace thread +{ + +static ThreadModule *instance = 0; + +int w_newThread(lua_State *L) +{ + std::string name = "Thread code"; + love::Data *data = 0; + + if (lua_isstring(L, 1) || luax_istype(L, 1, FILESYSTEM_FILE_T)) + luax_convobj(L, 1, "filesystem", "newFileData"); + + if (luax_istype(L, 1, FILESYSTEM_FILE_DATA_T)) + { + love::filesystem::FileData *fdata = luax_checktype(L, 1, "FileData", FILESYSTEM_FILE_DATA_T); + name = std::string("@") + fdata->getFilename(); + data = fdata; + } + else + { + data = luax_checktype(L, 1, "Data", DATA_T); + } + + LuaThread *t = instance->newThread(name, data); + luax_pushtype(L, "Thread", THREAD_THREAD_T, t); + return 1; +} + +int w_newChannel(lua_State *L) +{ + Channel *c = instance->newChannel(); + luax_pushtype(L, "Channel", THREAD_CHANNEL_T, c); + return 1; +} + +int w_getChannel(lua_State *L) +{ + std::string name = luax_checkstring(L, 1); + Channel *c = instance->getChannel(name); + luax_pushtype(L, "Channel", THREAD_CHANNEL_T, c); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg module_functions[] = { + { "newThread", w_newThread }, + { "newChannel", w_newChannel }, + { "getChannel", w_getChannel }, + { 0, 0 } +}; + +static const lua_CFunction types[] = { + luaopen_thread, + luaopen_channel, + 0 +}; + +extern "C" int luaopen_love_thread(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new love::thread::ThreadModule();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "thread"; + w.flags = MODULE_T; + w.functions = module_functions; + w.types = types; + + return luax_register_module(L, w); +} + +} // thread +} // love diff --git a/jni/love/src/modules/thread/wrap_ThreadModule.h b/jni/love/src/modules/thread/wrap_ThreadModule.h new file mode 100644 index 00000000..0b9fa2a0 --- /dev/null +++ b/jni/love/src/modules/thread/wrap_ThreadModule.h @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_THREAD_WRAP_THREADMODULE_H +#define LOVE_THREAD_WRAP_THREADMODULE_H + +// LOVE +#include "common/config.h" +#include "common/runtime.h" + +namespace love +{ +namespace thread +{ +int w_newThread(lua_State *L); +int w_newChannel(lua_State *L); +int w_getChannel(lua_State *L); + +extern "C" LOVE_EXPORT int luaopen_love_thread(lua_State * L); + +} // thread +} // love + +#endif // LOVE_THREAD_WRAP_THREADMODULE_H diff --git a/jni/love/src/modules/timer/Timer.h b/jni/love/src/modules/timer/Timer.h new file mode 100644 index 00000000..40e394bb --- /dev/null +++ b/jni/love/src/modules/timer/Timer.h @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_TIMER_TIMER_H +#define LOVE_TIMER_TIMER_H + +// LOVE +#include "common/Module.h" + +namespace love +{ +namespace timer +{ + +class Timer : public Module +{ +public: + + /** + * Destructor. + **/ + virtual ~Timer() {} + + /** + * Measures the time between this call and the previous call, + * and updates internal values accordinly. + **/ + virtual void step() = 0; + + /** + * Tries to sleep for the specified amount of time. The precision is + * usually 1ms. + * @param seconds The number of seconds to sleep for. + **/ + virtual void sleep(double seconds) const = 0; + + /** + * Gets the time between the last two frames, assuming step is called + * each frame. + **/ + virtual double getDelta() const = 0; + + /** + * Gets the average FPS over the last second. Beucase the value is only updated + * once per second, it does not look erratic when displayed on screen. + * @return The "current" FPS. + **/ + virtual int getFPS() const = 0; + + /** + * Gets the average delta time (seconds per frame) over the last second. + **/ + virtual double getAverageDelta() const = 0; + + /** + * Gets the amount of time passed since an unspecified time. Useful for + * profiling code or measuring intervals. The time is microsecond-precise, + * and increases monotonically. + * @return The time (in seconds) + **/ + virtual double getTime() const = 0; + +}; // Timer + +} // timer +} // love + +#endif // LOVE_TIMER_TIMER_H diff --git a/jni/love/src/modules/timer/sdl/Timer.cpp b/jni/love/src/modules/timer/sdl/Timer.cpp new file mode 100644 index 00000000..75ac877f --- /dev/null +++ b/jni/love/src/modules/timer/sdl/Timer.cpp @@ -0,0 +1,179 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "common/config.h" +#include "Timer.h" + +#include "common/delay.h" +#include "common/int.h" + +// SDL +#include + +#if defined(LOVE_WINDOWS) +#include +#elif defined(LOVE_MACOSX) +#include +#include +#elif defined(LOVE_LINUX) +#include +#include +#include +#endif + +namespace +{ +#if defined(LOVE_LINUX) +inline double getTimeOfDay() +{ + timeval t; + gettimeofday(&t, NULL); + return (double) t.tv_sec + (double) t.tv_usec / 1000000.0; +} +#endif +} + +namespace love +{ +namespace timer +{ +namespace sdl +{ + +Timer::Timer() + : currTime(0) + , prevFpsUpdate(0) + , fps(0) + , averageDelta(0) + , fpsUpdateFrequency(1) + , frames(0) + , dt(0) + , timerPeriod(getTimerPeriod()) +{ + // Init the SDL timer system (needed for SDL_Delay.) + if (SDL_InitSubSystem(SDL_INIT_TIMER) < 0) + throw love::Exception("%s", SDL_GetError()); + + prevFpsUpdate = currTime = getTime(); +} + +Timer::~Timer() +{ + // Quit SDL timer. + SDL_QuitSubSystem(SDL_INIT_TIMER); +} + +const char *Timer::getName() const +{ + return "love.timer.sdl"; +} + +void Timer::step() +{ + // Frames rendered + frames++; + + // "Current" time is previous time by now. + prevTime = currTime; + + // Get time from system. + currTime = getTime(); + + // Convert to number of seconds. + dt = currTime - prevTime; + + double timeSinceLast = currTime - prevFpsUpdate; + // Update FPS? + if (timeSinceLast > fpsUpdateFrequency) + { + fps = int((frames/timeSinceLast) + 0.5); + averageDelta = timeSinceLast/frames; + prevFpsUpdate = currTime; + frames = 0; + } +} + +void Timer::sleep(double seconds) const +{ + if (seconds > 0) + delay((int)(seconds*1000)); +} + +double Timer::getDelta() const +{ + return dt; +} + +int Timer::getFPS() const +{ + return fps; +} + +double Timer::getAverageDelta() const +{ + return averageDelta; +} + +double Timer::getTimerPeriod() +{ +#if defined(LOVE_MACOSX) + mach_timebase_info_data_t info; + mach_timebase_info(&info); + return (double) info.numer / (double) info.denom / 1000000000.0; +#elif defined(LOVE_WINDOWS) + LARGE_INTEGER temp; + if (QueryPerformanceFrequency(&temp) != 0 && temp.QuadPart != 0) + return 1.0 / (double) temp.QuadPart; +#endif + return 0; +} + +double Timer::getTime() const +{ +#if defined(LOVE_LINUX) + double mt; + // Check for POSIX timers and monotonic clocks. If not supported, use the gettimeofday fallback. +#if _POSIX_TIMERS > 0 && defined(_POSIX_MONOTONIC_CLOCK) \ +&& (defined(CLOCK_MONOTONIC_RAW) || defined(CLOCK_MONOTONIC)) + timespec t; +#ifdef CLOCK_MONOTONIC_RAW + clockid_t clk_id = CLOCK_MONOTONIC_RAW; +#else + clockid_t clk_id = CLOCK_MONOTONIC; +#endif + if (clock_gettime(clk_id, &t) == 0) + mt = (double) t.tv_sec + (double) t.tv_nsec / 1000000000.0; + else +#endif + mt = getTimeOfDay(); + return mt; +#elif defined(LOVE_MACOSX) + return (double) mach_absolute_time() * timerPeriod; +#elif defined(LOVE_WINDOWS) + LARGE_INTEGER microTime; + QueryPerformanceCounter(µTime); + return (double) microTime.QuadPart * timerPeriod; +#endif +} + +} // sdl +} // timer +} // love diff --git a/jni/love/src/modules/timer/sdl/Timer.h b/jni/love/src/modules/timer/sdl/Timer.h new file mode 100644 index 00000000..558c13ef --- /dev/null +++ b/jni/love/src/modules/timer/sdl/Timer.h @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_TIMER_SDL_TIMER_H +#define LOVE_TIMER_SDL_TIMER_H + +// LOVE +#include "timer/Timer.h" + +namespace love +{ +namespace timer +{ +namespace sdl +{ + +/** + * An SDL timer module. Can keep track of time between certain function + * calls, and provides access to a FPS metric which updates once each second. + **/ +class Timer : public love::timer::Timer +{ +public: + + /** + * Constructor. Initializes the SDL/timer subsystem. + **/ + Timer(); + + /** + * Destructor. + **/ + virtual ~Timer(); + + const char *getName() const; + void step(); + void sleep(double seconds) const; + double getDelta() const; + int getFPS() const; + double getAverageDelta() const; + double getTime() const; + +private: + + // Frame delta vars. + double currTime; + double prevTime; + double prevFpsUpdate; + + // Updated with a certain frequency. + int fps; + double averageDelta; + + // The frequency by which to update the FPS. + double fpsUpdateFrequency; + + // Frames since last FPS update. + int frames; + + // The current timestep. + double dt; + + // The timer period (reciprocal of the frequency.) + const double timerPeriod; + + // Returns the timer period on some platforms. + static double getTimerPeriod(); + +}; // Timer + +} // sdl +} // timer +} // love + +#endif // LOVE_TIMER_SDL_TIMER_H diff --git a/jni/love/src/modules/timer/wrap_Timer.cpp b/jni/love/src/modules/timer/wrap_Timer.cpp new file mode 100644 index 00000000..068bb11a --- /dev/null +++ b/jni/love/src/modules/timer/wrap_Timer.cpp @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "common/config.h" + +// LOVE +#include "wrap_Timer.h" + +#include "sdl/Timer.h" + +namespace love +{ +namespace timer +{ + +static Timer *instance = 0; + +int w_step(lua_State *) +{ + instance->step(); + return 0; +} + +int w_getDelta(lua_State *L) +{ + lua_pushnumber(L, instance->getDelta()); + return 1; +} + +int w_getFPS(lua_State *L) +{ + lua_pushinteger(L, instance->getFPS()); + return 1; +} + +int w_getAverageDelta(lua_State *L) +{ + lua_pushnumber(L, instance->getAverageDelta()); + return 1; +} + +int w_sleep(lua_State *L) +{ + instance->sleep(luaL_checknumber(L, 1)); + return 0; +} + +int w_getTime(lua_State *L) +{ + lua_pushnumber(L, instance->getTime()); + return 1; +} + +// List of functions to wrap. +static const luaL_Reg functions[] = +{ + { "step", w_step }, + { "getDelta", w_getDelta }, + { "getFPS", w_getFPS }, + { "getAverageDelta", w_getAverageDelta }, + { "sleep", w_sleep }, + { "getTime", w_getTime }, + { 0, 0 } +}; + + +extern "C" int luaopen_love_timer(lua_State *L) +{ + if (instance == 0) + { + EXCEPT_GUARD(instance = new love::timer::sdl::Timer();) + } + else + instance->retain(); + + WrappedModule w; + w.module = instance; + w.name = "timer"; + w.flags = MODULE_T; + w.functions = functions; + w.types = 0; + + return luax_register_module(L, w); +} + +} // timer +} // love diff --git a/jni/love/src/modules/timer/wrap_Timer.h b/jni/love/src/modules/timer/wrap_Timer.h new file mode 100644 index 00000000..fd29481d --- /dev/null +++ b/jni/love/src/modules/timer/wrap_Timer.h @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_TIMER_WRAP_TIMER_H +#define LOVE_TIMER_WRAP_TIMER_H + +// LOVE +#include "Timer.h" + +namespace love +{ +namespace timer +{ + +int w_step(lua_State *L); +int w_getDelta(lua_State *L); +int w_getFPS(lua_State *L); +int w_getAverageDelta(lua_State *L); +int w_sleep(lua_State *L); +int w_getTime(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_timer(lua_State *L); + +} // timer +} // love + +#endif // LOVE_TIMER_WRAP_TIMER_H diff --git a/jni/love/src/modules/window/Window.cpp b/jni/love/src/modules/window/Window.cpp new file mode 100644 index 00000000..702a2673 --- /dev/null +++ b/jni/love/src/modules/window/Window.cpp @@ -0,0 +1,100 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "Window.h" + +namespace love +{ +namespace window +{ + +Window *Window::singleton = NULL; + +Window::~Window() +{ + if (singleton == this) + singleton = NULL; +} + +void Window::swapBuffers() +{ +} + +WindowAttributes::WindowAttributes() + : fullscreen(false) + , fstype(Window::FULLSCREEN_TYPE_NORMAL) + , vsync(true) + , fsaa(0) + , resizable(false) + , minwidth(1) + , minheight(1) + , borderless(false) + , centered(true) + , display(0) +{ +} + +bool Window::getConstant(const char *in, Window::FullscreenType &out) +{ + return fullscreenTypes.find(in, out); +} + +bool Window::getConstant(Window::FullscreenType in, const char *&out) +{ + return fullscreenTypes.find(in, out); +} + +bool Window::getConstant(const char *in, Window::Attribute &out) +{ + return attributes.find(in, out); +} + +bool Window::getConstant(Window::Attribute in, const char *&out) +{ + return attributes.find(in, out); +} + +StringMap::Entry Window::attributeEntries[] = +{ + {"fullscreen", ATTRIB_FULLSCREEN}, + {"fullscreentype", ATTRIB_FULLSCREEN_TYPE}, + {"vsync", ATTRIB_VSYNC}, + {"fsaa", ATTRIB_FSAA}, + {"resizable", ATTRIB_RESIZABLE}, + {"minwidth", ATTRIB_MIN_WIDTH}, + {"minheight", ATTRIB_MIN_HEIGHT}, + {"borderless", ATTRIB_BORDERLESS}, + {"centered", ATTRIB_CENTERED}, + {"display", ATTRIB_DISPLAY} +}; + +StringMap Window::attributes(Window::attributeEntries, sizeof(Window::attributeEntries)); + +StringMap::Entry Window::fullscreenTypeEntries[] = +{ + {"normal", Window::FULLSCREEN_TYPE_NORMAL}, + {"desktop", Window::FULLSCREEN_TYPE_DESKTOP}, +}; + +StringMap Window::fullscreenTypes(Window::fullscreenTypeEntries, sizeof(Window::fullscreenTypeEntries)); + +} // window +} // love diff --git a/jni/love/src/modules/window/Window.h b/jni/love/src/modules/window/Window.h new file mode 100644 index 00000000..87cd0cd3 --- /dev/null +++ b/jni/love/src/modules/window/Window.h @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_WINDOW_WINDOW_H +#define LOVE_WINDOW_WINDOW_H + +// LOVE +#include "common/Module.h" +#include "common/StringMap.h" +#include "image/ImageData.h" + +// C++ +#include +#include + +namespace love +{ +namespace window +{ + +// Forward-declared so it can be used in the class methods. We can't define the +// whole thing here because it uses the Window::Type enum. +struct WindowAttributes; + +class Window : public Module +{ +public: + + // Types of window attributes. + enum Attribute + { + ATTRIB_FULLSCREEN, + ATTRIB_FULLSCREEN_TYPE, + ATTRIB_VSYNC, + ATTRIB_FSAA, + ATTRIB_RESIZABLE, + ATTRIB_MIN_WIDTH, + ATTRIB_MIN_HEIGHT, + ATTRIB_BORDERLESS, + ATTRIB_CENTERED, + ATTRIB_DISPLAY, + ATTRIB_MAX_ENUM + }; + + enum FullscreenType + { + FULLSCREEN_TYPE_NORMAL, + FULLSCREEN_TYPE_DESKTOP, + FULLSCREEN_TYPE_MAX_ENUM + }; + + struct WindowSize + { + int width; + int height; + }; + + virtual ~Window(); + + virtual bool setWindow(int width = 800, int height = 600, WindowAttributes *attribs = 0) = 0; + virtual void getWindow(int &width, int &height, WindowAttributes &attribs) = 0; + + virtual bool setFullscreen(bool fullscreen, FullscreenType fstype) = 0; + virtual bool setFullscreen(bool fullscreen) = 0; + + virtual bool onWindowResize(int width, int height) = 0; + + virtual int getDisplayCount() const = 0; + + virtual std::vector getFullscreenSizes(int displayindex) const = 0; + + virtual int getWidth() const = 0; + virtual int getHeight() const = 0; + + virtual void getDesktopDimensions(int displayindex, int &width, int &height) const = 0; + + virtual bool isCreated() const = 0; + + virtual void setWindowTitle(const std::string &title) = 0; + virtual const std::string &getWindowTitle() const = 0; + + virtual bool setIcon(love::image::ImageData *imgd) = 0; + virtual love::image::ImageData *getIcon() = 0; + + // default no-op implementation + virtual void swapBuffers(); + + virtual bool hasFocus() const = 0; + virtual bool hasMouseFocus() const = 0; + + virtual bool isVisible() const = 0; + + virtual void setMouseVisible(bool visible) = 0; + virtual bool getMouseVisible() const = 0; + + virtual void setMouseGrab(bool grab) = 0; + virtual bool isMouseGrabbed() const = 0; + + virtual const void *getHandle() const = 0; + + //virtual static Window *createSingleton() = 0; + //virtual static Window *getSingleton() = 0; + // No virtual statics, of course, but you are supposed to implement these statics. + + static bool getConstant(const char *in, Attribute &out); + static bool getConstant(Attribute in, const char *&out); + + static bool getConstant(const char *in, FullscreenType &out); + static bool getConstant(FullscreenType in, const char *&out); + +protected: + + static Window *singleton; + +private: + + static StringMap::Entry attributeEntries[]; + static StringMap attributes; + + static StringMap::Entry fullscreenTypeEntries[]; + static StringMap fullscreenTypes; + +}; // Window + +struct WindowAttributes +{ + WindowAttributes(); + bool fullscreen; // = false + Window::FullscreenType fstype; // = FULLSCREEN_TYPE_NORMAL + bool vsync; // = true + int fsaa; // = 0 + bool resizable; // = false + int minwidth; // = 1 + int minheight; // = 1 + bool borderless; // = false + bool centered; // = true + int display; // = 0 +}; // WindowFlags + +} // window +} // love + +#endif // LOVE_WINDOW_WINDOW_H diff --git a/jni/love/src/modules/window/sdl/Window.cpp b/jni/love/src/modules/window/sdl/Window.cpp new file mode 100644 index 00000000..49af2244 --- /dev/null +++ b/jni/love/src/modules/window/sdl/Window.cpp @@ -0,0 +1,621 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +// LOVE +#include "common/config.h" +#include "graphics/Graphics.h" +#include "Window.h" + +// C++ +#include +#include +#include + +namespace love +{ +namespace window +{ +namespace sdl +{ + +Window::Window() + : windowTitle("") + , created(false) + , mouseGrabbed(false) + , window(0) + , context(0) +{ + if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) + throw love::Exception("%s", SDL_GetError()); +} + +Window::~Window() +{ + if (curMode.icon) + curMode.icon->release(); + + if (window) + SDL_DestroyWindow(window); + + if (context) + SDL_GL_DeleteContext(context); + + SDL_QuitSubSystem(SDL_INIT_VIDEO); +} + +Window::_currentMode::_currentMode() + : width(800) + , height(600) + , attribs() + , icon(0) +{ +} + +bool Window::setWindow(int width, int height, WindowAttributes *attribs) +{ + graphics::Graphics *gfx = (graphics::Graphics *) Module::findInstance("love.graphics."); + if (gfx) + gfx->unSetMode(); + + WindowAttributes f; + + if (attribs) + f = *attribs; + + f.minwidth = std::max(f.minwidth, 1); + f.minheight = std::max(f.minheight, 1); + + f.display = std::min(std::max(f.display, 0), getDisplayCount()); + + // Use the desktop resolution if a width or height of 0 is specified. + if (width == 0 || height == 0) + { + SDL_DisplayMode mode = {}; + SDL_GetDesktopDisplayMode(f.display, &mode); + width = mode.w; + height = mode.h; + } + + Uint32 sdlflags = SDL_WINDOW_OPENGL; + + if (f.fullscreen) + { + if (f.fstype == FULLSCREEN_TYPE_DESKTOP) + sdlflags |= SDL_WINDOW_FULLSCREEN_DESKTOP; + else + { + sdlflags |= SDL_WINDOW_FULLSCREEN; + + // Fullscreen window creation will bug out if no mode can be used. + SDL_DisplayMode mode = {0, width, height, 0, 0}; + if (SDL_GetClosestDisplayMode(f.display, &mode, &mode) == 0) + return false; + } + } + + if (f.resizable) + sdlflags |= SDL_WINDOW_RESIZABLE; + + if (f.borderless) + sdlflags |= SDL_WINDOW_BORDERLESS; + + // Destroy and recreate the window if the dimensions or flags have changed. + if (window) + { + int curdisplay = SDL_GetWindowDisplayIndex(window); + Uint32 wflags = SDL_GetWindowFlags(window); + wflags &= (SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_RESIZABLE | SDL_WINDOW_BORDERLESS); + + if (sdlflags != wflags || width != curMode.width || height != curMode.height + || f.display != curdisplay || f.fsaa != curMode.attribs.fsaa) + { + SDL_DestroyWindow(window); + window = 0; + + // The old window may have generated pending events which are no + // longer relevant. Destroy them all! + SDL_FlushEvent(SDL_WINDOWEVENT); + } + } + + int centeredpos = SDL_WINDOWPOS_CENTERED_DISPLAY(f.display); + int uncenteredpos = SDL_WINDOWPOS_UNDEFINED_DISPLAY(f.display); + + if (!window) + { + // In Windows and Linux, some GL attributes are set on window creation. + setWindowGLAttributes(f.fsaa); + + const char *title = windowTitle.c_str(); + int pos = f.centered ? centeredpos : uncenteredpos; + + window = SDL_CreateWindow(title, pos, pos, width, height, sdlflags); + + if (!window && f.fsaa > 0) + { + // FSAA might have caused the failure, disable it and try again. + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); + + window = SDL_CreateWindow(title, pos, pos, width, height, sdlflags); + f.fsaa = 0; + } + + // Make sure the window keeps any previously set icon. + if (window && curMode.icon) + setIcon(curMode.icon); + } + + if (!window) + { + displayError("Could not create window", SDL_GetError()); + return false; + } + + // Enforce minimum window dimensions. + SDL_SetWindowMinimumSize(window, f.minwidth, f.minheight); + + if (f.centered && !f.fullscreen) + SDL_SetWindowPosition(window, centeredpos, centeredpos); + + SDL_RaiseWindow(window); + + if (!setContext(f.fsaa, f.vsync)) + { + created = false; + return false; + } + + created = true; + + updateAttributes(f); + + if (gfx) + { + if (!gfx->setMode(curMode.width, curMode.height)) + displayError("Could not set graphics mode", "Unsupported OpenGL version?"); + } + + // Make sure the mouse keeps its previous grab setting. + setMouseGrab(mouseGrabbed); + + return true; +} + +bool Window::onWindowResize(int width, int height) +{ + if (!window) + return false; + + curMode.width = width; + curMode.height = height; + + return true; +} + +bool Window::setContext(int fsaa, bool vsync) +{ + // We would normally only need to recreate the context if FSAA changes or + // SDL_GL_MakeCurrent is unsuccessful, but in Windows MakeCurrent can + // sometimes claim success but the context will actually be trashed. + if (context) + { + SDL_GL_DeleteContext(context); + context = 0; + } + + // Make sure the proper attributes are set. + setWindowGLAttributes(fsaa); + + context = SDL_GL_CreateContext(window); + + if (!context && fsaa > 0) + { + // FSAA might have caused the failure, disable it and try again. + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); + context = SDL_GL_CreateContext(window); + } + + if (!context) + { + displayError("Could not create OpenGL context", SDL_GetError()); + return false; + } + + // Set vertical synchronization. + SDL_GL_SetSwapInterval(vsync ? 1 : 0); + + // Verify FSAA setting. + int buffers; + int samples; + SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers); + SDL_GL_GetAttribute(SDL_GL_MULTISAMPLESAMPLES, &samples); + + // Don't fail because of this, but issue a warning. + if ((!buffers && fsaa) || (samples != fsaa)) + { + std::cerr << "Warning, FSAA setting failed! (Result: buffers: " << buffers << ", samples: " << samples << ")" << std::endl; + fsaa = (buffers > 0) ? samples : 0; + } + + curMode.attribs.fsaa = fsaa; + curMode.attribs.vsync = SDL_GL_GetSwapInterval() != 0; + + return true; +} + +void Window::setWindowGLAttributes(int fsaa) const +{ + // Set GL window attributes. + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); + + // FSAA. + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, (fsaa > 0) ? 1 : 0); + SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, (fsaa > 0) ? fsaa : 0); + + const char *glesHint = SDL_GetHint("LOVE_GRAPHICS_USE_OPENGLES"); + if (glesHint && *glesHint == '1') + { + // Use OpenGL ES 2+. + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); + } + else + { + // Use desktop OpenGL. + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); // default + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); + } +} + +void Window::updateAttributes(const WindowAttributes &newattribs) +{ + Uint32 wflags = SDL_GetWindowFlags(window); + + // Set the new display mode as the current display mode. + SDL_GetWindowSize(window, &curMode.width, &curMode.height); + + if ((wflags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) + { + curMode.attribs.fullscreen = true; + curMode.attribs.fstype = FULLSCREEN_TYPE_DESKTOP; + } + else if ((wflags & SDL_WINDOW_FULLSCREEN) == SDL_WINDOW_FULLSCREEN) + { + curMode.attribs.fullscreen = true; + curMode.attribs.fstype = FULLSCREEN_TYPE_NORMAL; + } + else + { + curMode.attribs.fullscreen = false; + curMode.attribs.fstype = newattribs.fstype; + } + + // The min width/height is set to 0 internally in SDL when in fullscreen. + if (curMode.attribs.fullscreen) + { + curMode.attribs.minwidth = newattribs.minwidth; + curMode.attribs.minheight = newattribs.minheight; + } + else + SDL_GetWindowMinimumSize(window, &curMode.attribs.minwidth, &curMode.attribs.minheight); + + curMode.attribs.resizable = (wflags & SDL_WINDOW_RESIZABLE) != 0; + curMode.attribs.borderless = (wflags & SDL_WINDOW_BORDERLESS) != 0; + curMode.attribs.centered = newattribs.centered; + curMode.attribs.display = std::max(SDL_GetWindowDisplayIndex(window), 0); + + // Only minimize on focus loss if the window is in exclusive-fullscreen + // mode (mimics behaviour of SDL 2.0.2+). + // In OS X we always disable this to prevent dock minimization weirdness. +#ifndef LOVE_MACOSX + if (curMode.attribs.fullscreen && curMode.attribs.fstype == FULLSCREEN_TYPE_NORMAL) + SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "1"); + else +#endif + SDL_SetHint(SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS, "0"); +} + +void Window::displayError(const std::string &title, const std::string &text) const +{ + std::cerr << title << ": " << text << std::endl; + + if (!window) + return; + + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, title.c_str(), text.c_str(), window); +} + +void Window::getWindow(int &width, int &height, WindowAttributes &attribs) +{ + // Window position may be different from creation - update display index. + if (window) + curMode.attribs.display = std::max(SDL_GetWindowDisplayIndex(window), 0); + + width = curMode.width; + height = curMode.height; + attribs = curMode.attribs; +} + +bool Window::setFullscreen(bool fullscreen, Window::FullscreenType fstype) +{ + if (!window) + return false; + + WindowAttributes newattribs = curMode.attribs; + newattribs.fullscreen = fullscreen; + newattribs.fstype = fstype; + + Uint32 sdlflags = 0; + + if (fullscreen) + { + if (fstype == FULLSCREEN_TYPE_DESKTOP) + sdlflags = SDL_WINDOW_FULLSCREEN_DESKTOP; + else + { + sdlflags = SDL_WINDOW_FULLSCREEN; + + SDL_DisplayMode mode = {}; + mode.w = curMode.width; + mode.h = curMode.height; + + SDL_GetClosestDisplayMode(SDL_GetWindowDisplayIndex(window), &mode, &mode); + SDL_SetWindowDisplayMode(window, &mode); + } + } + + if (SDL_SetWindowFullscreen(window, sdlflags) == 0) + { + SDL_GL_MakeCurrent(window, context); + updateAttributes(newattribs); + + // Update the viewport size now instead of waiting for event polling. + graphics::Graphics *gfx = (graphics::Graphics *) Module::findInstance("love.graphics."); + if (gfx) + gfx->setViewportSize(curMode.width, curMode.height); + + return true; + } + + return false; +} + +bool Window::setFullscreen(bool fullscreen) +{ + return setFullscreen(fullscreen, curMode.attribs.fstype); +} + +int Window::getDisplayCount() const +{ + return SDL_GetNumVideoDisplays(); +} + +typedef Window::WindowSize WindowSize; + +std::vector Window::getFullscreenSizes(int displayindex) const +{ + std::vector sizes; + + SDL_DisplayMode mode = {}; + std::vector::const_iterator it; + for (int i = 0; i < SDL_GetNumDisplayModes(displayindex); i++) + { + SDL_GetDisplayMode(displayindex, i, &mode); + + // SDL2's display mode list has multiple entries for modes of the same + // size with different bits per pixel, so we need to filter those out. + bool alreadyhassize = false; + for (it = sizes.begin(); it != sizes.end(); ++it) + { + if (it->width == mode.w && it->height == mode.h) + { + alreadyhassize = true; + break; + } + } + + if (!alreadyhassize) + { + WindowSize w = {mode.w, mode.h}; + sizes.push_back(w); + } + } + + return sizes; +} + +int Window::getWidth() const +{ + return curMode.width; +} + +int Window::getHeight() const +{ + return curMode.height; +} + +void Window::getDesktopDimensions(int displayindex, int &width, int &height) const +{ + if (displayindex >= 0 && displayindex < getDisplayCount()) + { + SDL_DisplayMode mode = {}; + SDL_GetDesktopDisplayMode(displayindex, &mode); + width = mode.w; + height = mode.h; + } + else + { + width = 0; + height = 0; + } +} + +bool Window::isCreated() const +{ + return created; +} + +void Window::setWindowTitle(const std::string &title) +{ + windowTitle = title; + + if (window) + SDL_SetWindowTitle(window, title.c_str()); +} + +const std::string &Window::getWindowTitle() const +{ + return windowTitle; +} + +bool Window::setIcon(love::image::ImageData *imgd) +{ + if (!imgd) + return false; + + imgd->retain(); + if (curMode.icon) + curMode.icon->release(); + curMode.icon = imgd; + + if (!window) + return false; + + Uint32 rmask, gmask, bmask, amask; +#ifdef LOVE_BIG_ENDIAN + rmask = 0xFF000000; + gmask = 0x00FF0000; + bmask = 0x0000FF00; + amask = 0x000000FF; +#else + rmask = 0x000000FF; + gmask = 0x0000FF00; + bmask = 0x00FF0000; + amask = 0xFF000000; +#endif + + int w = imgd->getWidth(); + int h = imgd->getHeight(); + int pitch = imgd->getWidth() * 4; + + SDL_Surface *sdlicon = 0; + + { + // We don't want another thread modifying the ImageData mid-copy. + love::thread::Lock lock(imgd->getMutex()); + sdlicon = SDL_CreateRGBSurfaceFrom(imgd->getData(), w, h, 32, pitch, rmask, gmask, bmask, amask); + } + + if (!sdlicon) + return false; + + SDL_SetWindowIcon(window, sdlicon); + SDL_FreeSurface(sdlicon); + + return true; +} + +love::image::ImageData *Window::getIcon() +{ + return curMode.icon; +} + +void Window::swapBuffers() +{ + SDL_GL_SwapWindow(window); +} + +bool Window::hasFocus() const +{ + return (window && SDL_GetKeyboardFocus() == window); +} + +bool Window::hasMouseFocus() const +{ + return (window && SDL_GetMouseFocus() == window); +} + +bool Window::isVisible() const +{ + return window && (SDL_GetWindowFlags(window) & SDL_WINDOW_SHOWN) != 0; +} + +void Window::setMouseVisible(bool visible) +{ + SDL_ShowCursor(visible ? SDL_ENABLE : SDL_DISABLE); +} + +bool Window::getMouseVisible() const +{ + return (SDL_ShowCursor(SDL_QUERY) == SDL_ENABLE); +} + +void Window::setMouseGrab(bool grab) +{ + mouseGrabbed = grab; + if (window) + SDL_SetWindowGrab(window, (SDL_bool) grab); +} + +bool Window::isMouseGrabbed() const +{ + if (window) + return (bool) SDL_GetWindowGrab(window); + else + return mouseGrabbed; +} + +const void *Window::getHandle() const +{ + return window; +} + +love::window::Window *Window::createSingleton() +{ + if (!singleton) + singleton = new Window(); + else + singleton->retain(); + + return singleton; +} + +love::window::Window *Window::getSingleton() +{ + return singleton; +} + +const char *Window::getName() const +{ + return "love.window.sdl"; +} + +} // sdl +} // window +} // love diff --git a/jni/love/src/modules/window/sdl/Window.h b/jni/love/src/modules/window/sdl/Window.h new file mode 100644 index 00000000..41ed3c3a --- /dev/null +++ b/jni/love/src/modules/window/sdl/Window.h @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_WINDOW_SDL_WINDOW_H +#define LOVE_WINDOW_SDL_WINDOW_H + +// LOVE +#include "window/Window.h" + +// SDL +#include + +namespace love +{ +namespace window +{ +namespace sdl +{ + +class Window : public love::window::Window +{ +public: + + Window(); + ~Window(); + + bool setWindow(int width = 800, int height = 600, WindowAttributes *attribs = 0); + void getWindow(int &width, int &height, WindowAttributes &attribs); + + bool setFullscreen(bool fullscreen, FullscreenType fstype); + bool setFullscreen(bool fullscreen); + + bool onWindowResize(int width, int height); + + int getDisplayCount() const; + + std::vector getFullscreenSizes(int displayindex) const; + + int getWidth() const; + int getHeight() const; + + void getDesktopDimensions(int displayindex, int &width, int &height) const; + + bool isCreated() const; + + void setWindowTitle(const std::string &title); + const std::string &getWindowTitle() const; + + bool setIcon(love::image::ImageData *imgd); + love::image::ImageData *getIcon(); + + void swapBuffers(); + + bool hasFocus() const; + bool hasMouseFocus() const; + + bool isVisible() const; + + void setMouseVisible(bool visible); + bool getMouseVisible() const; + + void setMouseGrab(bool grab); + bool isMouseGrabbed() const; + + const void *getHandle() const; + + static love::window::Window *createSingleton(); + static love::window::Window *getSingleton(); + + const char *getName() const; + +private: + + bool setContext(int fsaa, bool vsync); + void setWindowGLAttributes(int fsaa) const; + + // Update the saved window attribs based on the window's actual state. + void updateAttributes(const WindowAttributes &newattribs); + + // Shows a warning/error message box. + void displayError(const std::string &title, const std::string &text) const; + + std::string windowTitle; + + struct _currentMode + { + _currentMode(); + + int width; + int height; + WindowAttributes attribs; + love::image::ImageData *icon; + + } curMode; + + bool created; + + bool mouseGrabbed; + + SDL_Window *window; + SDL_GLContext context; + +}; // Window + +} // sdl +} // window +} // love + +#endif // LOVE_WINDOW_WINDOW_H diff --git a/jni/love/src/modules/window/wrap_Window.cpp b/jni/love/src/modules/window/wrap_Window.cpp new file mode 100644 index 00000000..a023751a --- /dev/null +++ b/jni/love/src/modules/window/wrap_Window.cpp @@ -0,0 +1,341 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 "wrap_Window.h" +#include "sdl/Window.h" + +namespace love +{ +namespace window +{ + +static Window *instance = 0; + +int w_getDisplayCount(lua_State *L) +{ + lua_pushinteger(L, instance->getDisplayCount()); + return 1; +} + +static const char *attribName(Window::Attribute attrib) +{ + const char *name = nullptr; + Window::getConstant(attrib, name); + return name; +} + +int w_setMode(lua_State *L) +{ + int w = luaL_checkint(L, 1); + int h = luaL_checkint(L, 2); + + if (lua_isnoneornil(L, 3)) + { + luax_pushboolean(L, instance->setWindow(w, h, 0)); + return 1; + } + + luaL_checktype(L, 3, LUA_TTABLE); + + // We want to error for invalid / misspelled window attributes. + lua_pushnil(L); + while (lua_next(L, 3)) + { + if (lua_type(L, -2) != LUA_TSTRING) + return luax_typerror(L, -2, "string"); + + const char *key = luaL_checkstring(L, -2); + Window::Attribute attrib; + + if (!Window::getConstant(key, attrib)) + return luaL_error(L, "Invalid window attribute: %s", key); + + lua_pop(L, 1); + } + + WindowAttributes attribs; + + lua_getfield(L, 3, attribName(Window::ATTRIB_FULLSCREEN_TYPE)); + if (!lua_isnoneornil(L, -1)) + { + const char *typestr = luaL_checkstring(L, -1); + + if (!Window::getConstant(typestr, attribs.fstype)) + return luaL_error(L, "Invalid fullscreen type: %s", typestr); + } + else + { + // Default to "normal" fullscreen. + attribs.fstype = Window::FULLSCREEN_TYPE_NORMAL; + } + lua_pop(L, 1); + + attribs.fullscreen = luax_boolflag(L, 3, attribName(Window::ATTRIB_FULLSCREEN), false); + attribs.vsync = luax_boolflag(L, 3, attribName(Window::ATTRIB_VSYNC), true); + attribs.fsaa = luax_intflag(L, 3, attribName(Window::ATTRIB_FSAA), 0); + attribs.resizable = luax_boolflag(L, 3, attribName(Window::ATTRIB_RESIZABLE), false); + attribs.minwidth = luax_intflag(L, 3, attribName(Window::ATTRIB_MIN_WIDTH), 1); + attribs.minheight = luax_intflag(L, 3, attribName(Window::ATTRIB_MIN_HEIGHT), 1); + attribs.borderless = luax_boolflag(L, 3, attribName(Window::ATTRIB_BORDERLESS), false); + attribs.centered = luax_boolflag(L, 3, attribName(Window::ATTRIB_CENTERED), true); + attribs.display = luax_intflag(L, 3, attribName(Window::ATTRIB_DISPLAY), 1); + + // Display index is 1-based in Lua and 0-based internally. + attribs.display--; + + EXCEPT_GUARD(luax_pushboolean(L, instance->setWindow(w, h, &attribs));) + return 1; +} + +int w_getMode(lua_State *L) +{ + int w, h; + WindowAttributes attribs; + instance->getWindow(w, h, attribs); + lua_pushnumber(L, w); + lua_pushnumber(L, h); + + lua_newtable(L); + + const char *fstypestr = "normal"; + Window::getConstant(attribs.fstype, fstypestr); + + lua_pushstring(L, fstypestr); + lua_setfield(L, -2, attribName(Window::ATTRIB_FULLSCREEN_TYPE)); + + luax_pushboolean(L, attribs.fullscreen); + lua_setfield(L, -2, attribName(Window::ATTRIB_FULLSCREEN)); + + luax_pushboolean(L, attribs.vsync); + lua_setfield(L, -2, attribName(Window::ATTRIB_VSYNC)); + + lua_pushinteger(L, attribs.fsaa); + lua_setfield(L, -2, attribName(Window::ATTRIB_FSAA)); + + luax_pushboolean(L, attribs.resizable); + lua_setfield(L, -2, attribName(Window::ATTRIB_RESIZABLE)); + + lua_pushinteger(L, attribs.minwidth); + lua_setfield(L, -2, attribName(Window::ATTRIB_MIN_WIDTH)); + + lua_pushinteger(L, attribs.minheight); + lua_setfield(L, -2, attribName(Window::ATTRIB_MIN_HEIGHT)); + + luax_pushboolean(L, attribs.borderless); + lua_setfield(L, -2, attribName(Window::ATTRIB_BORDERLESS)); + + luax_pushboolean(L, attribs.centered); + lua_setfield(L, -2, attribName(Window::ATTRIB_CENTERED)); + + // Display index is 0-based internally and 1-based in Lua. + lua_pushinteger(L, attribs.display + 1); + lua_setfield(L, -2, attribName(Window::ATTRIB_DISPLAY)); + + return 3; +} + +int w_getFullscreenModes(lua_State *L) +{ + int displayindex = luaL_optint(L, 1, 1) - 1; + + std::vector modes = instance->getFullscreenSizes(displayindex); + + lua_createtable(L, modes.size(), 0); + + for (size_t i = 0; i < modes.size(); i++) + { + lua_pushinteger(L, i+1); + lua_createtable(L, 0, 2); + + // Inner table attribs. + + lua_pushinteger(L, modes[i].width); + lua_setfield(L, -2, "width"); + + lua_pushinteger(L, modes[i].height); + lua_setfield(L, -2, "height"); + + // Inner table attribs end. + + lua_settable(L, -3); + } + + return 1; +} + +int w_setFullscreen(lua_State *L) +{ + bool fullscreen = luax_toboolean(L, 1); + Window::FullscreenType fstype = Window::FULLSCREEN_TYPE_MAX_ENUM; + + const char *typestr = lua_isnoneornil(L, 2) ? 0 : luaL_checkstring(L, 2); + if (typestr && !Window::getConstant(typestr, fstype)) + return luaL_error(L, "Invalid fullscreen type: %s", typestr); + + bool success = false; + if (fstype == Window::FULLSCREEN_TYPE_MAX_ENUM) + success = instance->setFullscreen(fullscreen); + else + success = instance->setFullscreen(fullscreen, fstype); + + luax_pushboolean(L, success); + return 1; +} + +int w_getFullscreen(lua_State *L) +{ + int w, h; + WindowAttributes attribs; + instance->getWindow(w, h, attribs); + + const char *typestr; + if (!Window::getConstant(attribs.fstype, typestr)) + luaL_error(L, "Unknown fullscreen type."); + + luax_pushboolean(L, attribs.fullscreen); + lua_pushstring(L, typestr); + return 2; +} + +int w_isCreated(lua_State *L) +{ + luax_pushboolean(L, instance->isCreated()); + return 1; +} + +int w_getWidth(lua_State *L) +{ + lua_pushinteger(L, instance->getWidth()); + return 1; +} + +int w_getHeight(lua_State *L) +{ + lua_pushinteger(L, instance->getHeight()); + return 1; +} + +int w_getDimensions(lua_State *L) +{ + lua_pushinteger(L, instance->getWidth()); + lua_pushinteger(L, instance->getHeight()); + return 2; +} + +int w_getDesktopDimensions(lua_State *L) +{ + int width = 0, height = 0; + int displayindex = luaL_optint(L, 1, 1) - 1; + instance->getDesktopDimensions(displayindex, width, height); + lua_pushinteger(L, width); + lua_pushinteger(L, height); + return 2; +} + +int w_setIcon(lua_State *L) +{ + image::ImageData *i = luax_checktype(L, 1, "ImageData", IMAGE_IMAGE_DATA_T); + luax_pushboolean(L, instance->setIcon(i)); + return 1; +} + +int w_getIcon(lua_State *L) +{ + image::ImageData *i = instance->getIcon(); + if (i) + { + i->retain(); + luax_pushtype(L, "ImageData", IMAGE_IMAGE_DATA_T, i); + } + else + lua_pushnil(L); + return 1; +} + +int w_setTitle(lua_State *L) +{ + std::string title = luax_checkstring(L, 1); + instance->setWindowTitle(title); + return 0; +} + +int w_getTitle(lua_State *L) +{ + luax_pushstring(L, instance->getWindowTitle()); + return 1; +} + +int w_hasFocus(lua_State *L) +{ + luax_pushboolean(L, instance->hasFocus()); + return 1; +} + +int w_hasMouseFocus(lua_State *L) +{ + luax_pushboolean(L, instance->hasMouseFocus()); + return 1; +} + +int w_isVisible(lua_State *L) +{ + luax_pushboolean(L, instance->isVisible()); + return 1; +} + +static const luaL_Reg functions[] = +{ + { "getDisplayCount", w_getDisplayCount }, + { "setMode", w_setMode }, + { "getMode", w_getMode }, + { "getFullscreenModes", w_getFullscreenModes }, + { "setFullscreen", w_setFullscreen }, + { "getFullscreen", w_getFullscreen }, + { "isCreated", w_isCreated }, + { "getWidth", w_getWidth }, + { "getHeight", w_getHeight }, + { "getDimensions", w_getDimensions }, + { "getDesktopDimensions", w_getDesktopDimensions }, + { "setIcon", w_setIcon }, + { "getIcon", w_getIcon }, + { "setTitle", w_setTitle }, + { "getTitle", w_getTitle }, + { "hasFocus", w_hasFocus }, + { "hasMouseFocus", w_hasMouseFocus }, + { "isVisible", w_isVisible }, + { 0, 0 } +}; + +extern "C" int luaopen_love_window(lua_State *L) +{ + EXCEPT_GUARD(instance = sdl::Window::createSingleton();) + + WrappedModule w; + w.module = instance; + w.name = "window"; + w.flags = MODULE_T; + w.functions = functions; + w.types = 0; + + return luax_register_module(L, w); +} + +} // window +} // love diff --git a/jni/love/src/modules/window/wrap_Window.h b/jni/love/src/modules/window/wrap_Window.h new file mode 100644 index 00000000..41971869 --- /dev/null +++ b/jni/love/src/modules/window/wrap_Window.h @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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 LOVE_WINDOW_WRAP_WINDOW_H +#define LOVE_WINDOW_WRAP_WINDOW_H + +#include "common/config.h" +#include "common/runtime.h" + +namespace love +{ +namespace window +{ + +int w_getDisplayCount(lua_State *L); +int w_setMode(lua_State *L); +int w_getMode(lua_State *L); +int w_getFullscreenModes(lua_State *L); +int w_setFullscreen(lua_State *L); +int w_getFullscreen(lua_State *L); +int w_isCreated(lua_State *L); +int w_getWidth(lua_State *L); +int w_getHeight(lua_State *L); +int w_getDimensions(lua_State *L); +int w_getDesktopDimensions(lua_State *L); +int w_setIcon(lua_State *L); +int w_getIcon(lua_State *L); +int w_setTitle(lua_State *L); +int w_getTitle(lua_State *L); +int w_hasFocus(lua_State *L); +int w_hasMouseFocus(lua_State *L); +int w_isVisible(lua_State *L); +extern "C" LOVE_EXPORT int luaopen_love_window(lua_State *L); + +} // window +} // love + +#endif // LOVE_WINDOW_WRAP_WINDOW_H diff --git a/jni/love/src/scripts/auto.lua b/jni/love/src/scripts/auto.lua new file mode 100644 index 00000000..fdaa9021 --- /dev/null +++ b/jni/love/src/scripts/auto.lua @@ -0,0 +1,116 @@ +-- Usage: +-- lua auto.lua .. +-- +-- Example: +-- lua auto.lua boot graphics + +local max_width = 18 +local pattern = [[ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +namespace love +{ + +// [%s] +const unsigned char %s[] = +{ +%s +}; // [%s] +} // love]] +--formatting parameters: +-- - input file name +-- - c variable name +-- - array contents +-- - input file name + + +function auto(name) + --the input file name + local src = name .. ".lua" + --and the output one + local dst = name .. ".lua.h" + --the name of the variable + local cpp_name = name .. "_lua" + + --do a minimal code check + --(syntax errors, really) + loadfile(src) + --no error catching? no + --we have the main loop doing that for us + + --what character is this on this line? + local counter = 0 + + local function tohex(c) + counter = counter + 1 + --if we've reached the maximum width (or 0) + --then we'll carry on and add a newline + if counter % max_width == 0 then + return ("\n\t0x%02x, "):format(c:byte()) + end + --otherwise we just use the hex of the current byte + return ("0x%02x, "):format(c:byte()) + end + + --let's open the input file + local src_file = io.open(src, "rb") + --create an output string + local out_data = "" + --go through the input file line-by-line + for line in src_file:lines() do + --if the line is non-empty + if #line > 0 then + --set the counter to -1 + --this will start a new line (see tohex) + counter = -1 + --append the output to what we had, plus a newline character (0x0a is newline) + out_data = ("%s%s0x0a,"):format(out_data, line:gsub("\r", ""):gsub(".", tohex)) + end + end + --close our input + src_file:close() + + --open, write and close the output + out_file = io.open(dst, "wb") + --see pattern above + out_file:write(pattern:format(src, cpp_name, out_data, src)) + out_file:close() + + --tell the world we succeeded! + print(name .. ": Success") +end + +--usage +if #arg == 0 then + return print("Usage: lua auto.lua .. ") +end + +--the 'main' procedure +for i, v in ipairs(arg) do + --run the auto function for every argument + --but do it with pcall, to catch errors + local ok, err = pcall(auto, v:gsub("%.lua$","")) + if not ok then + --inform people we've failed + print(v .. ": " .. err) + end +end + diff --git a/jni/love/src/scripts/boot.lua b/jni/love/src/scripts/boot.lua new file mode 100644 index 00000000..14218cf7 --- /dev/null +++ b/jni/love/src/scripts/boot.lua @@ -0,0 +1,1615 @@ +--[[ +Copyright (c) 2006-2013 LOVE Development Team + +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. +--]] + +-- Make sure love exists. +local love = require("love") + +-- Used for setup: +love.path = {} +love.arg = {} + +-- Replace any \ with /. +function love.path.normalslashes(p) + return string.gsub(p, "\\", "/") +end + +-- Makes sure there is a slash at the end +-- of a path. +function love.path.endslash(p) + if string.sub(p, string.len(p)-1) ~= "/" then + return p .. "/" + else + return p + end +end + +-- Checks whether a path is absolute or not. +function love.path.abs(p) + + local tmp = love.path.normalslashes(p) + + -- Path is absolute if it starts with a "/". + if string.find(tmp, "/") == 1 then + return true + end + + -- Path is absolute if it starts with a + -- letter followed by a colon. + if string.find(tmp, "%a:") == 1 then + return true + end + + -- Relative. + return false + +end + +-- Converts any path into a full path. +function love.path.getfull(p) + + if love.path.abs(p) then + return love.path.normalslashes(p) + end + + local cwd = love.filesystem.getWorkingDirectory() + cwd = love.path.normalslashes(cwd) + cwd = love.path.endslash(cwd) + + -- Construct a full path. + local full = cwd .. love.path.normalslashes(p) + + -- Remove trailing /., if applicable + return full:match("(.-)/%.$") or full +end + +-- Returns the leaf of a full path. +function love.path.leaf(p) + local a = 1 + local last = p + + while a do + a = string.find(p, "/", a+1) + + if a then + last = string.sub(p, a+1) + end + end + + return last +end + +-- Finds the key in the table with the lowest integral index. The lowest +-- will typically the executable, for instance "lua5.1.exe". +function love.arg.getLow(a) + local m = math.huge + for k,v in pairs(a) do + if k < m then + m = k + end + end + return a[m] +end + +love.arg.options = { + console = { a = 0 }, + fused = {a = 0 }, + game = { a = 1 } +} + +function love.arg.parse_option(m, i) + m.set = true + + if m.a > 0 then + m.arg = {} + for j=i,i+m.a-1 do + table.insert(m.arg, arg[j]) + i = j + end + end + + return i +end + +function love.arg.parse_options() + + local game + local argc = #arg + + for i=1,argc do + -- Look for options. + local s, e, m = string.find(arg[i], "%-%-(.+)") + + if m and love.arg.options[m] then + i = love.arg.parse_option(love.arg.options[m], i+1) + elseif not game then + game = i + end + end + + if not love.arg.options.game.set then + love.arg.parse_option(love.arg.options.game, game or 0) + end +end + +function love.createhandlers() + + -- Standard callback handlers. + love.handlers = setmetatable({ + keypressed = function (b, u) + if love.keypressed then return love.keypressed(b, u) end + end, + keyreleased = function (b) + if love.keyreleased then return love.keyreleased(b) end + end, + textinput = function (t) + if love.textinput then return love.textinput(t) end + end, + textedit = function (t,s,l) + if love.textedit then return love.textedit(t,s,l) end + end, + mousepressed = function (x,y,b) + if love.mousepressed then return love.mousepressed(x,y,b) end + end, + mousereleased = function (x,y,b) + if love.mousereleased then return love.mousereleased(x,y,b) end + end, + joystickpressed = function (j,b) + if love.joystickpressed then return love.joystickpressed(j,b) end + end, + joystickreleased = function (j,b) + if love.joystickreleased then return love.joystickreleased(j,b) end + end, + joystickaxis = function (j,a,v) + if love.joystickaxis then return love.joystickaxis(j,a,v) end + end, + joystickhat = function (j,h,v) + if love.joystickhat then return love.joystickhat(j,h,v) end + end, + gamepadpressed = function (j,b) + if love.gamepadpressed then return love.gamepadpressed(j,b) end + end, + gamepadreleased = function (j,b) + if love.gamepadreleased then return love.gamepadreleased(j,b) end + end, + gamepadaxis = function (j,a,v) + if love.gamepadaxis then return love.gamepadaxis(j,a,v) end + end, + joystickadded = function (j) + if love.joystickadded then return love.joystickadded(j) end + end, + joystickremoved = function(j) + if love.joystickremoved then return love.joystickremoved(j) end + end, + focus = function (f) + if love.focus then return love.focus(f) end + end, + mousefocus = function (f) + if love.mousefocus then return love.mousefocus(f) end + end, + visible = function (v) + if love.visible then return love.visible(v) end + end, + quit = function () + return + end, + threaderror = function (t, err) + if love.threaderror then return love.threaderror(t, err) end + end, + resize = function(w, h) + if love.resize then return love.resize(w, h) end + end, + }, { + __index = function(self, name) + error("Unknown event: " .. name) + end, + }) + +end + +local is_fused_game = false +local no_game_code = false + +local function uridecode(s) + return s:gsub("%%%x%x", function(str) + return string.char(tonumber(str:sub(2), 16)) + end) +end + +-- This can't be overriden. +function love.boot() + + -- This is absolutely needed. + require("love") + require("love.filesystem") + + love.arg.parse_options() + + local o = love.arg.options + + local arg0 = love.arg.getLow(arg) + love.filesystem.init(arg0) + + -- Is this one of those fancy "fused" games? + local can_has_game = pcall(love.filesystem.setSource, arg0) + is_fused_game = can_has_game + if love.arg.options.fused.set then + is_fused_game = true + end + + if not can_has_game and o.game.set and o.game.arg[1] then + local nouri = o.game.arg[1] + if nouri:sub(1, 7) == "file://" then + nouri = uridecode(nouri:sub(8)) + end + local full_source = love.path.getfull(nouri) + local leaf = love.path.leaf(full_source) + leaf = leaf:gsub("^([%.]+)", "") -- strip leading "."'s + leaf = leaf:gsub("%.([^%.]+)$", "") -- strip extension + leaf = leaf:gsub("%.", "_") -- replace remaining "."'s with "_" + love.filesystem.setIdentity(leaf) + can_has_game = pcall(love.filesystem.setSource, full_source) + end + + if can_has_game and not (love.filesystem.exists("main.lua") or love.filesystem.exists("conf.lua")) then + no_game_code = true + end + + if not can_has_game then + love.nogame() + end + +end + +function love.init() + + -- Create default configuration settings. + -- NOTE: Adding a new module to the modules list + -- will NOT make it load, see below. + local c = { + title = "Untitled", + version = love._version, + window = { + width = 800, + height = 600, + minwidth = 1, + minheight = 1, + fullscreen = false, + fullscreentype = "normal", + display = 1, + vsync = true, + fsaa = 0, + borderless = false, + resizable = false, + centered = true, + }, + modules = { + event = true, + keyboard = true, + mouse = true, + timer = true, + joystick = true, + image = true, + graphics = true, + audio = true, + math = true, + physics = true, + sound = true, + system = true, + font = true, + thread = true, + window = true, + }, + console = false, -- Only relevant for windows. + identity = false, + appendidentity = false, + } + + -- If config file exists, load it and allow it to update config table. + if not love.conf and love.filesystem and love.filesystem.exists("conf.lua") then + require("conf") + end + + -- Yes, conf.lua might not exist, but there are other ways of making + -- love.conf appear, so we should check for it anyway. + if love.conf then + local ok, err = pcall(love.conf, c) + if not ok then + print(err) + -- continue + end + end + + if love.arg.options.console.set then + c.console = true + end + + -- Gets desired modules. + for k,v in ipairs{ + "thread", + "timer", + "event", + "keyboard", + "joystick", + "mouse", + "sound", + "system", + "audio", + "image", + "font", + "window", + "graphics", + "math", + "physics", + } do + if c.modules[v] then + require("love." .. v) + end + end + + if love.event then + love.createhandlers() + end + + -- Console hack + if c.console and love._openConsole then + love._openConsole() + end + + -- Setup window here. + if c.window and c.modules.window then + assert(love.window.setMode(c.window.width, c.window.height, + { + fullscreen = c.window.fullscreen, + fullscreentype = c.window.fullscreentype, + vsync = c.window.vsync, + fsaa = c.window.fsaa, + resizable = c.window.resizable, + minwidth = c.window.minwidth, + minheight = c.window.minheight, + borderless = c.window.borderless, + centered = c.window.centered, + display = c.window.display, + }), "Could not set window mode") + love.window.setTitle(c.window.title or c.title) + if c.window.icon then + assert(love.image, "If an icon is set in love.conf, love.image has to be loaded!") + love.window.setIcon(love.image.newImageData(c.window.icon)) + end + end + + -- Our first timestep, because window creation can take some time + if love.timer then + love.timer.step() + end + + if love.filesystem then + love.filesystem.setFused(is_fused_game) + love.filesystem.setIdentity(c.identity or love.filesystem.getIdentity(), c.appendidentity) + if love.filesystem.exists("main.lua") then + require("main") + end + end + + if no_game_code then + error("No code to run\nYour game might be packaged incorrectly\nMake sure main.lua is at the top level of the zip") + end + + -- Check the version + local compat = false + c.version = tostring(c.version) + for i, v in ipairs(love._version_compat) do + if c.version == v then + compat = true + break + end + end + if not compat then + local major, minor, revision = c.version:match("^(%d+)%.(%d+)%.(%d+)$") + if (not major or not minor or not revision) or (major ~= love._version_major and minor ~= love._version_minor) then + local msg = "This game was made for a different version of LÖVE.\n".. + "It may not be not be compatible with the running version ("..love._version..")." + + print(msg) + + local can_display = love.window and love.window.isCreated() + can_display = can_display and love.graphics and love.graphics.isCreated() + + if can_display and love.timer and love.event then + love.graphics.setBackgroundColor(89, 157, 220) + love.graphics.origin() + + local start = love.timer.getTime() + while love.timer.getTime() < start + 4 do + love.event.pump() + love.graphics.clear() + love.graphics.print(msg, 70, 70) + love.graphics.present() + love.timer.sleep(1/20) + end + love.graphics.setBackgroundColor(0, 0, 0) + end + end + end + +end + +function love.run() + + if love.math then + love.math.setRandomSeed(os.time()) + end + + if love.event then + love.event.pump() + end + + if love.load then love.load(arg) end + + -- We don't want the first frame's dt to include time taken by love.load. + if love.timer then love.timer.step() end + + local dt = 0 + + -- Main loop time. + while true do + -- Process events. + if love.event then + love.event.pump() + for e,a,b,c,d in love.event.poll() do + if e == "quit" then + if not love.quit or not love.quit() then + if love.audio then + love.audio.stop() + end + return + end + end + love.handlers[e](a,b,c,d) + end + end + + -- Update dt, as we'll be passing it to update + if love.timer then + love.timer.step() + dt = love.timer.getDelta() + end + + -- Call update and draw + if love.update then love.update(dt) end -- will pass 0 if love.timer is disabled + + if love.window and love.graphics and love.window.isCreated() then + love.graphics.clear() + love.graphics.origin() + if love.draw then love.draw() end + love.graphics.present() + end + + if love.timer then love.timer.sleep(0.001) end + + end + +end + +----------------------------------------------------------- +-- Default screen. +----------------------------------------------------------- + +function love.nogame() + + local baby_png = + "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAL1klEQVR4nO2deZAU1R3HPz3X\ + 3ruzuywEXZVLBJHAilfUpAQNGo1RPDAxKiaKkpQHlZBKhTIRjSaWlCmrrCJBDR7RaMSUBx6x\ + ElmhCIogi8dKFEQEYWGXva+Znunp/NGzbO/szuwc/XZ39r1P1dT2dr/+9a/7ffv1u59mmiYK\ + eXENtwOK4UUJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKU\ + ACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlAcpQAJEcJQHKUACRHCUBylAAkRwlA\ + cjzD7UC2YNRWO2LHPWOuI3acwlEBaJrmpLkRQ/iT9T2blwBXAMcATwL/iO6vAJ4GLgQ+A34A\ + 7AImA9cCRcAzwEdOPCMn53RQKUDy3AKstv3/pG37aeCi6PY04FtAEPgYyIvurwK+K9bF1FEC\ + GATb23+bbXcj8HJ0eyG9kQ9QCzwH/IneyAd4TZCLGaEygclxOjDT9v+zWG94MfBwTNglwDjg\ + Ztu+RuAxkQ6mi0oBEmB7+2+KOfR49O89wHjb/jXAJuDvQK5t/++ALgEuZozmZIZitGUCowLI\ + Bw5hZeQAtmGlCFOxkvuel6gNmIL1rX/LZqYmGt7wnDLPEb+yMhNoe5uyjavojXzoffvvpe/z\ + ux8IA3+17dOBGwEDBn8GTgkkFYQLIOam5wInpGmqmOHJs9xu2w4BpcB9WJm/HjoBDagGKm37\ + XwFOjf7smEAr0AE0AQeAw7ECGQpBCP8ERG9Kw8os3eHYxUYfrcAHwH+wShF7ew7ECsHROBMp\ + AJuiVwB3O3ah0U8E61OylGjm0S4CJ+NsKJLUKuCuIbjOaMIFLMaqO3CLvpAQbG//cgTfxChm\ + LlYmVBiiU4ASYIHga4x2zhdpXLQAvo16+zOlcvAg6SO6GHhaMoGONLfy5qatbK75lLqGJgK6\ + ztgyP7OnTebCc+YwY8oEwW6K4UhzK29sfJ93P9zJwfpG9FCYirISqqZPYf45c5gxOakSsS7S\ + R2GlgGgeYDVWK9qAhMJhVj23jideeovuYPz7nHfmbO669VqOHTfGMV9FoofCPPLsyzz1yr8J\ + 6qG44c4/q4rfLvkx4yvKEpl7Bbg8W0sBhfEOdHR1s2j5SlY9vy5h5AOs37KDBXfew4ef7XHc\ + Qadp7+zmht88yKNr30gY+QBvv1fDgjtWULt7b6JgcZ+hE4gWgD/egWUrH+WD2l1JG2pt7+SW\ + ux+mrqHJEcdEYJomSx9YRc3O3Umf09zWweK7H6ahqTVekHGOOBeHoSgF9OOtTduofv/DlI21\ + tHewcs3ajJ0Sxesb32fT9tqUz2tsaWPlE3HvqwLEtaUMiwBWv/B62gZf37iF/Yca0j5fJJnc\ + 16vV73KwoXGgQxUIjCfRAiiN3VHX0ETtF19lZHT9lh0ZnS+CfXX1fL7367TPN02TdwZOFV1A\ + edqGB0GIAGzJVUXssS/212Vsf48DNpxm74HDGdvYve9gvENx81KZIjIF8AO+2J3tnZl3jGlp\ + 78zYhtO0tHdkbKMt/rPJSgEMmHst9xdnbLiidMCsxbAyxgGfEtxXv0+pU4gUwNiBdp40oRK3\ + O7PLzjgx3T4l4pg28ThcGXaJOzl+zaAfxJQEHK8Ktjk5fqDjJUUFnHvqKWzY+lFa9nN8Xuad\ + MTulcw42NLLpg0/4qq6elrYOugJBy5bXi8ulUZCfR2lxIePKSzl+/FimTTyOooK8Qaz2payk\ + iLOrTk6rGAiQl+PjvNNnxTs8C/gnYDgtAkcFYHNuFv170h7lzusuZ+O2j9Oq0vzpggspKSpI\ + OnwoHOby21fQmkK+QdM0Lj3vLFYuW5ySb3dctyBtAdx81fcSiW45cAPwK+B5o7basSFmjn0C\ + bGPnHsDqCTs/XtgZUyZw68JLUr7G9EnHs+SH30/pnKbW9pQiH6wi2avV71Lf1JLSebNOmsTN\ + V140eMAYZk6dyOKrLh4sWCXWaKQJKV8gAU7nAa4Dfo3VBzAhS69fwE1XJP+wZk6dyJr7fkmu\ + r1/BIiHjykupTKMR6Zix5WllNpf95GoWXZb8CLCqaZN5dMVScnzeZILnAA+l7FQCHGsNjKYA\ + 7wFnpnLef2tqWblmLTv37BvwuL+okMVXX8yiyy7A60nvi/WvTVu5849/Tjq8S9NYvWIp3zlt\ + 5uCB47Bx28c89OSL/O/L/QMe9xcVsuSaS7j+0gvweFLqMtEN5Dv1CXBaADqQlJRj2blnH5t3\ + fEpdfRN6KMSY0hKqpk/mzG9Ox+fNPKvyzLq3+cNjz2EYkYThxpb5uff2Rcw9I26GLGlM02Tn\ + nv1srqnl0JFm9FCIijI/s6dNyvS+tJEqgBG9Fv2er+t4/MU3Wb9lB81tvRU3ebk5zDppEvPP\ + nsOV889N+TMzxOwCpo5UAewDjnPEoGCONLcS1EPk5vgcqZwaQm4EnhpxpYAoTzlsTxhjSks4\ + dtyYbIr8IPALHH7GTlcE/R5rTPzP6Ts2XpEZnwIXAHXg7DQzTqcAOrCMJDuDKpJmF9HId3q8\ + oGMCcM+Ya3cua9LVbELEYFFRjUHCmi8lJSjKsBJAdtAtyrDjAjA0NygBOE32CCDgKybozZ8Q\ + 0dT8Uw4i7BPgeH+Azlw/YXfuTN2Tiy/cTU6oM/rrwmsEnL6cLAjrBu24AALeYiIudweA7slH\ + 9+TTnmf1DXWZBr5QFznhLnJCnfjCXXgMoUPfRgsbunLEdINzXAARlxusZsv+xzQ3AV8RAV/v\ + nEuuSBhfuNv268JrBNHMxI022Yjh8hDRPERcHiKaG8PlJqK5ifT81Ty920f3uU00zZ8XjDty\ + KCOGfZ7AiMvTTxQAHkPHawTwGgE8ho7bCOGJ6HgMHZcZRnNwgGSmhN0+Qu5cwm4fhssb/VkR\ + 3RPphiv9lj9gYWdOqZCZRkUJoDlTA2G3j7DbR3ecOiXNjKCl0PiomZE+onGZRmJbpokrQSoU\ + cbkx0Qi5c4ikH7nJUoWgORhFef6lILtHMTVXam3PWlbPU1E0eJD0EFVWWyfIrqwcEGVYlABq\ + gA2CbMvIdlGGHRfAlLFHKwGXO21bYoS9TCKr6zYDLwi0LwsmsFGUcSECsKUCtwFHRFxDIrYD\ + 9aKMi66wbyDBJFGKpHgN+rxUjiJMADaHXwIeFHWdUY6B4H6WQlOAmAzhyJ3cZ+TyOILrVIaq\ + zdYAfoQ1abRq/UmOtVi9gIUl/zAEArA5b2CtqnEi8BcEdnLIYhqBR7BGVy9kCNYZGtI1g3bX\ + 9xltWwpcDVyDNSv26FpwKHkasGpO1wJvY61KAsR/87NmwYh42IVQEGjE33V4VdBb8LMuXwkB\ + XzGjvTeRhtlgor2INenDO0TXFOphsCQ/KxeNsmO/Qb32HVxmRPeGAxR2N2KiEfQWHG0iDnoK\ + MEfBamTecIB8vYX8YCu+cPc1jYWV1R15vcPWRX7nEzHs/QGiTa5H51bVMMkNdZAb6oDOOkxN\ + Q/fk01Iw/m/dvuJC4GwET5/qFLl6O/l6K/nBVjxGn259+8vb9/ONE6YMl2tHGXYBRFmLNays\ + 32ugmaaZE+q8N0fvWKF78jBcXoBjseYhmBP9zWZkiCKQp7d6CwIt7ny9FVckPFCYDcDuVPoy\ + iGTYF460zStUhbXe7rlYwjyEtQDjI1iraeE5ZV5sRtJOGTAdOBlrUcdKLKEcE90esJtamhhY\ + Q7W+whoR/TnWgpLVE+q3P0DfdYbt1ACXAgcyGeWT9ZnAWGJmvvJgrZrVpztOogeWQBR2CrFm\ + Li23/fxYg1iLgILods/07G1YS7nVY+XUD0d/DVjtG/0enL+zDn9nnQ9rlbQbsWZK6wS2Yi0f\ + /zTRXP6oFECm2CaaApwbBftFg5gOlZMr+vbUjfU/Hk6O7s2UESUAxdAzugvcikFRApAcJQDJ\ + UQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkBwl\ + AMlRApAcJQDJUQKQHCUAyVECkBwlAMlRApAcJQDJUQKQHCUAyVECkJz/A7w3h5w1bl6AAAAA\ + AElFTkSuQmCC\ + " + local background_png = + "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\ + " + local bubble_png = + "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\ + " + local inspector_png = + "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\ + CPaFrsEAAAAASUVORK5CYII=\ + " + local text_png = + "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\ + " + + local function loadimage(file, name) + return love.graphics.newImage(love.image.newImageData(love.filesystem.newFileData(file, name:gsub("_", "."), "base64"))) + end + + local inspector = {} + local background = {} + local bubble = {} + local text = {} + local rain = {} + local g_time = 0 + + local create_rain + + function love.load() + -- Subtractive blending isn't supported on some ancient systems, so + -- we should make sure it still looks decent in that case. + if love.graphics.isSupported("subtractive") then + love.graphics.setBackgroundColor(137, 194, 218) + else + love.graphics.setBackgroundColor(11, 88, 123) + end + + local win_w = love.graphics.getWidth() + local win_h = love.graphics.getHeight() + + inspector.image = loadimage(inspector_png, "inspector.png") + inspector.img_w = inspector.image:getWidth() + inspector.img_h = inspector.image:getHeight() + inspector.x = win_w * 0.45 + inspector.y = win_h * 0.55 + + background.image = loadimage(background_png, "background.png") + background.img_w = background.image:getWidth() + background.img_h = background.image:getHeight() + background.x = 0 + background.y = 0 + + bubble.image = loadimage(bubble_png, "bubble.png") + bubble.img_w = bubble.image:getWidth() + bubble.img_h = bubble.image:getHeight() + bubble.x = 140 + bubble.y = -80 + + text.image = loadimage(text_png, "text.png") + text.x = 25 + text.y = 9 + + -- Baby Rain + rain.spacing_x = 110 + rain.spacing_y = 80 + rain.image = loadimage(baby_png, "baby.png") + rain.img_w = rain.image:getWidth() + rain.img_h = rain.image:getHeight() + rain.ox = -rain.img_w / 2 + rain.oy = -rain.img_h / 2 + rain.batch = love.graphics.newSpriteBatch(rain.image, 512) + rain.t = 0 + + create_rain() + end + + function create_rain() + local batch = rain.batch + + local sx = rain.spacing_x + local sy = rain.spacing_y + local ox = rain.ox + local oy = rain.oy + + local batch_w = 2 * math.ceil(love.graphics.getWidth() / sx) + 2 + local batch_h = 2 * math.ceil(love.graphics.getHeight() / sy) + 2 + + batch:clear() + + if batch:getBufferSize() < batch_w * batch_h then + batch:setBufferSize(batch_w * batch_h) + end + + batch:bind() + + for i = 0, batch_h - 1 do + for j = 0, batch_w - 1 do + local is_even = (j % 2) == 0 + local offset_y = is_even and 0 or sy / 2 + local x = ox + j * sx + local y = oy + i * sy + offset_y + batch:add(x, y) + end + end + + batch:unbind() + end + + local function update_rain(t) + rain.t = t + end + + function love.resize(w, h) + create_rain() + end + + function love.update(dt) + g_time = g_time + dt / 2 + local int, frac = math.modf(g_time) + update_rain(frac) + inspector.x = love.graphics.getWidth() * 0.45 + inspector.y = love.graphics.getHeight() * 0.55 + end + + local function draw_grid() + local blendmode = "subtractive" + if not love.graphics.isSupported("subtractive") then + -- We also change the background color in this case, so it looks OK. + blendmode = "additive" + end + + local y = rain.spacing_y * rain.t + + local small_y = -rain.spacing_y + y / 2 + local big_y = -rain.spacing_y + y + + love.graphics.setBlendMode(blendmode) + love.graphics.setColor(255, 255, 255, 128) + love.graphics.draw(rain.batch, -rain.spacing_x, small_y, 0, 0.5, 0.5) + + love.graphics.setBlendMode("alpha") + love.graphics.setColor(255, 255, 255, 255) + love.graphics.draw(rain.batch, -rain.spacing_x, big_y) + end + + local function draw_text(x, y) + local int, frac = math.modf(g_time) + if frac < 0.5 then + return + end + local tx = x + text.x + local ty = y + text.y + love.graphics.draw(text.image, tx, ty, 0, 1, 1, 70, 70) + end + + local function draw_background(x, y) + local intensity = (math.sin(math.pi * g_time * 2) + 1) / 2 + + local bx = x + local by = y + + love.graphics.setColor(255, 255, 255, 64 + 16*intensity) + love.graphics.draw(background.image, bx, by, 0, 0.7, 0.7, 256, 256) + love.graphics.setColor(255, 255, 255, 32 + 16*intensity) + love.graphics.draw(background.image, bx, by, 0, 0.65, 0.65, 256, 256) + love.graphics.setBlendMode("additive") + love.graphics.setColor(255, 255, 255, 16 + 16*intensity) + love.graphics.draw(background.image, bx, by, 0, 0.6, 0.6, 256, 256) + end + + local function draw_bubble(x, y) + local osc = 10 * math.sin(math.pi * g_time) + local bx = x + bubble.x + local by = y + bubble.y + osc + love.graphics.draw(bubble.image, bx, by, 0, 1, 1, 70, 70) + + draw_text(bx, by) + end + + local function draw_inspector() + local x, y = inspector.x, inspector.y + local ox, oy = inspector.img_w / 2, inspector.img_h / 2 + draw_background(x, y) + love.graphics.setColor(255, 255, 255, 255) + love.graphics.setBlendMode("alpha") + love.graphics.draw(inspector.image, x, y, 0, 1, 1, ox, oy) + draw_bubble(x, y) + end + + function love.draw() + love.graphics.setColor(255, 255, 255) + + draw_grid() + draw_inspector() + end + + function love.keyreleased(key) + if key == "escape" then + love.event.quit() + end + end + + function love.conf(t) + t.title = "L\195\150VE " .. love._version .. " (" .. love._version_codename .. ")" + t.modules.audio = false + t.modules.sound = false + t.modules.physics = false + t.modules.joystick = false + t.window.resizable = true + end +end + +----------------------------------------------------------- +-- Error screen. +----------------------------------------------------------- + +local debug, print = debug, print + +local function error_printer(msg, layer) + print((debug.traceback("Error: " .. tostring(msg), 1+(layer or 1)):gsub("\n[^\n]+$", ""))) +end + +function love.errhand(msg) + msg = tostring(msg) + + error_printer(msg, 2) + + if not love.window or not love.graphics or not love.event then + return + end + + if not love.graphics.isCreated() or not love.window.isCreated() then + local success, status = pcall(love.window.setMode, 800, 600) + if not success or not status then + return + end + end + + -- Reset state. + if love.mouse then + love.mouse.setVisible(true) + love.mouse.setGrabbed(false) + end + if love.joystick then + -- Stop all joystick vibrations. + for i,v in ipairs(love.joystick.getJoysticks()) do + v:setVibration() + end + end + if love.audio then love.audio.stop() end + love.graphics.reset() + love.graphics.setBackgroundColor(89, 157, 220) + local font = love.graphics.setNewFont(14) + + love.graphics.setColor(255, 255, 255, 255) + + local trace = debug.traceback() + + love.graphics.clear() + love.graphics.origin() + + local err = {} + + table.insert(err, "Error\n") + table.insert(err, msg.."\n\n") + + for l in string.gmatch(trace, "(.-)\n") do + if not string.match(l, "boot.lua") then + l = string.gsub(l, "stack traceback:", "Traceback\n") + table.insert(err, l) + end + end + + local p = table.concat(err, "\n") + + p = string.gsub(p, "\t", "") + p = string.gsub(p, "%[string \"(.-)\"%]", "%1") + + local function draw() + love.graphics.clear() + love.graphics.printf(p, 70, 70, love.graphics.getWidth() - 70) + love.graphics.present() + end + + while true do + love.event.pump() + + for e, a, b, c in love.event.poll() do + if e == "quit" then + return + end + if e == "keypressed" and a == "escape" then + return + end + end + + draw() + + if love.timer then + love.timer.sleep(0.1) + end + end + +end + +local function deferErrhand(...) + local handler = love.errhand or error_printer + return handler(...) +end + + +----------------------------------------------------------- +-- The root of all calls. +----------------------------------------------------------- + +return function() + local result = xpcall(love.boot, error_printer) + if not result then return 1 end + local result = xpcall(love.init, deferErrhand) + if not result then return 1 end + local result, retval = xpcall(love.run, deferErrhand) + if not result then return 1 end + + return tonumber(retval) or 0 +end diff --git a/jni/love/src/scripts/boot.lua.h b/jni/love/src/scripts/boot.lua.h new file mode 100644 index 00000000..1ffff20b --- /dev/null +++ b/jni/love/src/scripts/boot.lua.h @@ -0,0 +1,5344 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +namespace love +{ + +// [boot.lua] +const unsigned char boot_lua[] = +{ + + 0x2d, 0x2d, 0x5b, 0x5b, 0x0a, + 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, + 0x2d, 0x32, 0x30, 0x31, 0x33, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x27, 0x61, 0x73, 0x2d, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x0a, + 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x2e, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x73, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x6c, 0x64, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x0a, + 0x61, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x2e, 0x0a, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x2c, 0x0a, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, + 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x74, 0x0a, + 0x66, 0x72, 0x65, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, + 0x31, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x65, 0x64, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, + 0x77, 0x72, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, + 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2c, 0x20, 0x61, + 0x6e, 0x20, 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x61, 0x70, 0x70, 0x72, 0x65, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x0a, + 0x32, 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x73, + 0x75, 0x63, 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x62, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, + 0x61, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x0a, + 0x33, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x79, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x0a, + 0x2d, 0x2d, 0x5d, 0x5d, 0x0a, + 0x2d, 0x2d, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x2e, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a, + 0x2d, 0x2d, 0x20, 0x55, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x3a, 0x0a, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x2d, 0x2d, 0x20, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x5c, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x2f, 0x2e, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x70, 0x2c, 0x20, 0x22, 0x5c, 0x5c, 0x22, 0x2c, 0x20, 0x22, 0x2f, 0x22, 0x29, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x2e, 0x65, 0x6e, 0x64, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, 0x75, 0x62, 0x28, 0x70, 0x2c, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x29, 0x2d, 0x31, 0x29, 0x20, 0x7e, + 0x3d, 0x20, 0x22, 0x2f, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2f, 0x22, 0x0a, + 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x61, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x2e, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x2e, 0x61, 0x62, 0x73, 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, + 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x65, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x61, 0x20, 0x22, 0x2f, 0x22, 0x2e, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x6d, + 0x70, 0x2c, 0x20, 0x22, 0x2f, 0x22, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x50, 0x61, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x65, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x61, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x2e, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x74, 0x6d, + 0x70, 0x2c, 0x20, 0x22, 0x25, 0x61, 0x3a, 0x22, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x74, + 0x68, 0x2e, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x2e, 0x67, 0x65, 0x74, 0x66, 0x75, 0x6c, 0x6c, 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x61, 0x62, 0x73, 0x28, + 0x70, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x28, 0x29, 0x0a, + 0x09, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x28, 0x63, 0x77, 0x64, 0x29, 0x0a, + 0x09, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x65, + 0x6e, 0x64, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x28, 0x63, 0x77, 0x64, 0x29, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x61, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x63, 0x77, 0x64, 0x20, + 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x20, 0x2f, 0x2e, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, + 0x65, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x22, 0x28, 0x2e, 0x2d, 0x29, 0x2f, 0x25, 0x2e, 0x24, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, + 0x6c, 0x6c, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, + 0x66, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, + 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x28, 0x70, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x0a, + 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, + 0x70, 0x2c, 0x20, 0x22, 0x2f, 0x22, 0x2c, 0x20, 0x61, 0x2b, 0x31, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x73, + 0x75, 0x62, 0x28, 0x70, 0x2c, 0x20, 0x61, 0x2b, 0x31, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x73, 0x74, 0x0a, + 0x2d, 0x2d, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x22, 0x6c, 0x75, 0x61, 0x35, 0x2e, 0x31, + 0x2e, 0x65, 0x78, 0x65, 0x22, 0x2e, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, + 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x77, 0x28, 0x61, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x68, 0x75, + 0x67, 0x65, 0x0a, + 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x61, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6b, 0x20, 0x3c, 0x20, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6d, 0x20, 0x3d, 0x20, 0x6b, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x5b, 0x6d, 0x5d, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x30, + 0x20, 0x7d, 0x2c, 0x0a, + 0x09, 0x66, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x61, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x7d, 0x2c, 0x0a, + 0x09, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x7d, 0x0a, + 0x7d, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x2c, 0x20, 0x69, 0x29, 0x0a, + 0x09, 0x6d, 0x2e, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6d, 0x2e, 0x61, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6d, 0x2e, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x3d, 0x69, 0x2c, 0x69, 0x2b, 0x6d, 0x2e, 0x61, 0x2d, 0x31, 0x20, + 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6d, 0x2e, + 0x61, 0x72, 0x67, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x5b, 0x6a, 0x5d, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x20, 0x3d, 0x20, 0x6a, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x63, 0x20, 0x3d, 0x20, 0x23, 0x61, 0x72, 0x67, 0x0a, + 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x3d, 0x31, 0x2c, 0x61, 0x72, 0x67, 0x63, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x4c, 0x6f, 0x6f, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x6d, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x61, 0x72, 0x67, 0x5b, 0x69, 0x5d, + 0x2c, 0x20, 0x22, 0x25, 0x2d, 0x25, 0x2d, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, + 0x67, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x6d, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, + 0x67, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x6d, 0x5d, 0x2c, 0x20, 0x69, 0x2b, 0x31, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x30, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x28, 0x29, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x2e, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, + 0x09, 0x09, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x62, 0x2c, 0x20, 0x75, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, 0x62, 0x2c, 0x20, 0x75, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6b, 0x65, 0x79, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x62, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x72, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x62, 0x29, + 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x28, 0x74, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x65, 0x64, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x2c, 0x73, 0x2c, 0x6c, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x65, 0x64, 0x69, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x74, 0x65, 0x78, 0x74, 0x65, 0x64, 0x69, 0x74, 0x28, 0x74, 0x2c, 0x73, 0x2c, 0x6c, 0x29, 0x20, 0x65, + 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, + 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x64, 0x28, 0x78, 0x2c, 0x79, 0x2c, 0x62, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, + 0x6b, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, + 0x6b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x72, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x61, 0x78, 0x69, 0x73, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x2c, 0x61, 0x2c, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, + 0x6b, 0x61, 0x78, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x61, 0x78, 0x69, 0x73, 0x28, + 0x6a, 0x2c, 0x61, 0x2c, 0x76, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x68, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x2c, 0x68, 0x2c, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, + 0x6b, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x68, 0x61, 0x74, 0x28, 0x6a, 0x2c, + 0x68, 0x2c, 0x76, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x64, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x6a, 0x2c, 0x62, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, 0x61, 0x78, 0x69, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x2c, 0x61, 0x2c, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, + 0x61, 0x78, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x70, 0x61, 0x64, 0x61, 0x78, 0x69, 0x73, 0x28, 0x6a, 0x2c, + 0x61, 0x2c, 0x76, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6a, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, + 0x6b, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x61, 0x64, 0x64, 0x65, + 0x64, 0x28, 0x6a, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6a, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, + 0x6b, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x28, 0x6a, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x28, 0x66, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x28, 0x66, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x66, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x66, 0x6f, + 0x63, 0x75, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x28, 0x66, 0x29, 0x20, 0x65, + 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x28, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x28, 0x76, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x71, 0x75, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x74, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x74, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x77, 0x2c, 0x20, 0x68, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, + 0x65, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x77, 0x2c, 0x20, 0x68, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x09, 0x7d, 0x29, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x67, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x72, 0x69, + 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x29, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, 0x25, + 0x25, 0x78, 0x25, 0x78, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, + 0x72, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x68, + 0x61, 0x72, 0x28, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x3a, 0x73, 0x75, + 0x62, 0x28, 0x32, 0x29, 0x2c, 0x20, 0x31, 0x36, 0x29, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x29, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x6e, 0x2e, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x62, 0x6f, 0x6f, 0x74, + 0x28, 0x29, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x65, 0x6c, 0x79, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x2e, 0x0a, + 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x22, 0x29, 0x0a, + 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, + 0x67, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x30, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x77, 0x28, 0x61, 0x72, 0x67, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x69, + 0x6e, 0x69, 0x74, 0x28, 0x61, 0x72, 0x67, 0x30, 0x29, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x49, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x66, 0x61, 0x6e, 0x63, 0x79, 0x20, 0x22, 0x66, 0x75, 0x73, 0x65, + 0x64, 0x22, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x3f, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x73, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, + 0x20, 0x61, 0x72, 0x67, 0x30, 0x29, 0x0a, + 0x09, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x66, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x73, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, + 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x2e, 0x67, 0x61, 0x6d, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x5b, 0x31, 0x5d, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x75, 0x72, 0x69, 0x20, 0x3d, 0x20, 0x6f, 0x2e, + 0x67, 0x61, 0x6d, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x5b, 0x31, 0x5d, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x75, 0x72, 0x69, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, + 0x37, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x2f, 0x2f, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6e, 0x6f, 0x75, 0x72, 0x69, 0x20, 0x3d, 0x20, 0x75, 0x72, 0x69, 0x64, 0x65, 0x63, 0x6f, + 0x64, 0x65, 0x28, 0x6e, 0x6f, 0x75, 0x72, 0x69, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x38, 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x67, 0x65, 0x74, + 0x66, 0x75, 0x6c, 0x6c, 0x28, 0x6e, 0x6f, 0x75, 0x72, 0x69, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x61, 0x66, 0x28, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x3a, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x22, 0x5e, 0x28, 0x5b, 0x25, 0x2e, 0x5d, 0x2b, 0x29, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2d, + 0x2d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x22, 0x2e, + 0x22, 0x27, 0x73, 0x0a, + 0x09, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x3a, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x22, 0x25, 0x2e, 0x28, 0x5b, 0x5e, 0x25, 0x2e, 0x5d, 0x2b, 0x29, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, + 0x29, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x3a, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x22, 0x25, 0x2e, 0x22, 0x2c, 0x20, 0x22, 0x5f, 0x22, 0x29, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x22, 0x2e, 0x22, + 0x27, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x22, 0x5f, 0x22, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x28, 0x6c, 0x65, 0x61, 0x66, 0x29, 0x0a, + 0x09, 0x09, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x2e, 0x73, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x66, 0x75, 0x6c, 0x6c, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x28, 0x22, 0x6d, 0x61, 0x69, 0x6e, + 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x28, 0x22, 0x63, 0x6f, + 0x6e, 0x66, 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6e, 0x6f, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x67, 0x61, + 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, 0x6d, 0x65, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6e, 0x69, 0x74, + 0x28, 0x29, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x4e, 0x4f, 0x54, 0x45, 0x3a, 0x20, 0x41, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, + 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, + 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, + 0x2e, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x55, 0x6e, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x64, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x0a, + 0x09, 0x09, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x38, 0x30, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x36, 0x30, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6d, 0x69, 0x6e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6d, 0x69, 0x6e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x22, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x76, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x73, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x0a, + 0x09, 0x09, 0x7d, 0x2c, 0x0a, + 0x09, 0x09, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x7d, 0x2c, 0x0a, + 0x09, 0x09, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, + 0x20, 0x2d, 0x2d, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x6e, 0x74, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x2e, 0x0a, + 0x09, 0x09, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x2c, 0x0a, + 0x09, 0x09, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x20, 0x3d, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x0a, + 0x09, 0x7d, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x49, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x69, 0x74, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x2e, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x6c, + 0x75, 0x61, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x22, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x59, 0x65, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x2e, 0x6c, 0x75, 0x61, 0x20, + 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, + 0x20, 0x77, 0x61, 0x79, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x61, 0x70, 0x70, 0x65, + 0x61, 0x72, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x77, 0x61, 0x79, + 0x2e, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6b, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x2c, 0x20, 0x63, + 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x72, 0x67, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, + 0x09, 0x09, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x47, 0x65, 0x74, 0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x0a, + 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x7b, 0x0a, + 0x09, 0x09, 0x22, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x6b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x66, 0x6f, 0x6e, 0x74, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x6d, 0x61, 0x74, 0x68, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x22, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x73, 0x22, 0x2c, 0x0a, + 0x09, 0x7d, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x5b, 0x76, 0x5d, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x76, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x68, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x72, 0x73, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x63, 0x6b, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x65, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x53, 0x65, 0x74, 0x75, 0x70, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x68, + 0x65, 0x72, 0x65, 0x2e, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x0a, + 0x09, 0x09, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x2e, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x63, 0x72, + 0x65, 0x65, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x76, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x76, 0x73, 0x79, 0x6e, 0x63, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x73, 0x61, 0x61, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x2e, 0x66, 0x73, 0x61, 0x61, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6d, 0x69, 0x6e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6d, 0x69, 0x6e, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6d, 0x69, 0x6e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6d, 0x69, 0x6e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x2e, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x6c, 0x65, 0x73, 0x73, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x64, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x2c, 0x0a, + 0x09, 0x09, 0x7d, 0x29, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, + 0x65, 0x74, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, + 0x69, 0x74, 0x6c, 0x65, 0x28, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x69, 0x63, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x2c, 0x20, 0x22, 0x49, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x63, 0x6f, 0x6e, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x2c, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x6f, + 0x20, 0x62, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x21, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, + 0x49, 0x63, 0x6f, 0x6e, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x6e, 0x65, + 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x28, 0x63, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x2e, 0x69, 0x63, 0x6f, 0x6e, 0x29, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x4f, 0x75, 0x72, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x65, 0x70, 0x2c, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x74, 0x61, + 0x6b, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x28, + 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, + 0x73, 0x65, 0x74, 0x46, 0x75, 0x73, 0x65, 0x64, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x75, 0x73, 0x65, 0x64, 0x5f, + 0x67, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x28, 0x63, 0x2e, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x67, 0x65, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x28, + 0x29, 0x2c, 0x20, 0x63, 0x2e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x2e, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x28, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6c, 0x75, + 0x61, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, + 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x5c, 0x6e, 0x59, 0x6f, 0x75, 0x72, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x6d, + 0x69, 0x67, 0x68, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x64, 0x20, 0x69, + 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x5c, 0x6e, 0x4d, 0x61, 0x6b, 0x65, 0x20, 0x73, + 0x75, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6c, 0x75, 0x61, 0x20, 0x69, 0x73, 0x20, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x7a, 0x69, 0x70, 0x22, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x0a, + 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, + 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x2c, 0x20, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x2e, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x25, 0x64, + 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x25, 0x2e, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x24, 0x22, + 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x6f, 0x72, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6d, 0x61, 0x6a, 0x6f, + 0x72, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x20, 0x7e, + 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x69, + 0x6e, 0x6f, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x54, 0x68, + 0x69, 0x73, 0x20, 0x67, 0x61, 0x6d, 0x65, 0x20, 0x77, 0x61, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x4c, 0xc3, 0x96, 0x56, 0x45, 0x2e, 0x5c, 0x6e, 0x22, 0x2e, + 0x2e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x22, 0x49, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x22, 0x2e, 0x2e, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x2e, 0x22, 0x29, 0x2e, 0x22, 0x0a, + 0x09, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, + 0x61, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x69, 0x73, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x3d, 0x20, 0x63, + 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x69, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, + 0x73, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x28, 0x38, 0x39, 0x2c, 0x20, 0x31, 0x35, 0x37, 0x2c, 0x20, 0x32, 0x32, 0x30, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, + 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x20, 0x3c, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x20, 0x2b, 0x20, 0x34, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x75, + 0x6d, 0x70, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x2e, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x37, 0x30, 0x2c, 0x20, 0x37, 0x30, + 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x2e, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x73, 0x6c, + 0x65, 0x65, 0x70, 0x28, 0x31, 0x2f, 0x32, 0x30, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, + 0x73, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x28, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x75, 0x6e, 0x28, + 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x65, 0x74, 0x52, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x28, 0x6f, 0x73, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x28, + 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x61, 0x72, 0x67, 0x29, 0x20, 0x65, 0x6e, + 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x57, 0x65, 0x20, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x27, 0x73, 0x20, + 0x64, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x20, 0x74, 0x61, 0x6b, 0x65, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x2e, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x28, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x4d, 0x61, 0x69, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x0a, + 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x75, 0x6d, 0x70, + 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x2c, 0x61, 0x2c, 0x62, 0x2c, 0x63, 0x2c, 0x64, 0x20, 0x69, + 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x6f, 0x6c, 0x6c, 0x28, + 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x69, 0x74, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x71, + 0x75, 0x69, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x71, 0x75, + 0x69, 0x74, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x75, 0x64, 0x69, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x2e, + 0x73, 0x74, 0x6f, 0x70, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x73, 0x5b, + 0x65, 0x5d, 0x28, 0x61, 0x2c, 0x62, 0x2c, 0x63, 0x2c, 0x64, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x64, 0x74, 0x2c, 0x20, 0x61, 0x73, + 0x20, 0x77, 0x65, 0x27, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x73, 0x74, 0x65, 0x70, + 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x64, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, + 0x2e, 0x67, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x64, 0x72, 0x61, 0x77, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x28, 0x64, 0x74, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x70, 0x61, 0x73, 0x73, + 0x20, 0x30, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x69, + 0x73, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x69, 0x73, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, + 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x73, 0x6c, 0x65, 0x65, + 0x70, 0x28, 0x30, 0x2e, 0x30, 0x30, 0x31, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x2d, 0x2d, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x0a, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6e, 0x6f, 0x67, 0x61, + 0x6d, 0x65, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x62, 0x79, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x44, 0x44, 0x50, 0x6d, 0x48, 0x4c, 0x41, 0x41, 0x41, 0x4c, 0x31, 0x6b, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x64, 0x65, 0x5a, 0x41, 0x55, 0x31, 0x52, 0x33, 0x48, 0x50, 0x7a, + 0x33, 0x58, 0x5c, 0x0a, + 0x09, 0x33, 0x72, 0x75, 0x7a, 0x75, 0x79, 0x77, 0x45, 0x58, 0x5a, 0x56, 0x4c, 0x42, 0x4a, 0x48, 0x41, 0x69, + 0x6c, 0x66, 0x55, 0x70, 0x41, 0x51, 0x4e, 0x47, 0x6f, 0x31, 0x52, 0x50, 0x44, 0x41, 0x78, 0x4b, 0x69, 0x61, + 0x4b, 0x6b, 0x70, 0x51, 0x48, 0x6c, 0x5a, 0x42, 0x4b, 0x68, 0x54, 0x49, 0x52, 0x6a, 0x53, 0x61, 0x57, 0x6c, + 0x43, 0x6d, 0x72, 0x72, 0x43, 0x4a, 0x42, 0x44, 0x52, 0x37, 0x52, 0x61, 0x4d, 0x53, 0x55, 0x42, 0x78, 0x36, + 0x78, 0x5c, 0x0a, + 0x09, 0x45, 0x6c, 0x6d, 0x68, 0x43, 0x49, 0x6f, 0x67, 0x69, 0x38, 0x64, 0x4b, 0x46, 0x45, 0x51, 0x45, 0x59, + 0x57, 0x47, 0x58, 0x76, 0x61, 0x2b, 0x5a, 0x6e, 0x75, 0x6e, 0x70, 0x2f, 0x4e, 0x47, 0x7a, 0x62, 0x4f, 0x2f, + 0x73, 0x7a, 0x75, 0x77, 0x63, 0x2f, 0x58, 0x5a, 0x33, 0x39, 0x72, 0x31, 0x50, 0x31, 0x64, 0x54, 0x32, 0x64, + 0x72, 0x2f, 0x2b, 0x39, 0x61, 0x2f, 0x37, 0x66, 0x66, 0x76, 0x31, 0x75, 0x35, 0x39, 0x6d, 0x6d, 0x69, 0x59, + 0x4b, 0x5c, 0x0a, + 0x09, 0x65, 0x58, 0x45, 0x4e, 0x74, 0x77, 0x4f, 0x4b, 0x34, 0x55, 0x55, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, + 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, + 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, + 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, + 0x55, 0x5c, 0x0a, + 0x09, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, + 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, + 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, 0x41, 0x63, 0x70, 0x51, 0x41, 0x4a, 0x45, 0x63, 0x4a, 0x51, + 0x48, 0x4b, 0x55, 0x41, 0x43, 0x52, 0x48, 0x43, 0x55, 0x42, 0x79, 0x6c, 0x41, 0x41, 0x6b, 0x52, 0x77, 0x6c, + 0x41, 0x5c, 0x0a, + 0x09, 0x63, 0x6a, 0x7a, 0x44, 0x37, 0x55, 0x43, 0x32, 0x59, 0x4e, 0x52, 0x57, 0x4f, 0x32, 0x4c, 0x48, 0x50, + 0x57, 0x4f, 0x75, 0x49, 0x33, 0x61, 0x63, 0x77, 0x6c, 0x45, 0x42, 0x61, 0x4a, 0x72, 0x6d, 0x70, 0x4c, 0x6b, + 0x52, 0x51, 0x2f, 0x69, 0x54, 0x39, 0x54, 0x32, 0x62, 0x6c, 0x77, 0x42, 0x58, 0x41, 0x4d, 0x63, 0x41, 0x54, + 0x77, 0x4c, 0x2f, 0x69, 0x4f, 0x36, 0x76, 0x41, 0x4a, 0x34, 0x47, 0x4c, 0x67, 0x51, 0x2b, 0x41, 0x33, 0x34, + 0x41, 0x5c, 0x0a, + 0x09, 0x37, 0x41, 0x49, 0x6d, 0x41, 0x39, 0x63, 0x43, 0x52, 0x63, 0x41, 0x7a, 0x77, 0x45, 0x64, 0x4f, 0x50, + 0x43, 0x4d, 0x6e, 0x35, 0x33, 0x52, 0x51, 0x4b, 0x55, 0x44, 0x79, 0x33, 0x41, 0x4b, 0x73, 0x74, 0x76, 0x33, + 0x2f, 0x70, 0x47, 0x33, 0x37, 0x61, 0x65, 0x43, 0x69, 0x36, 0x50, 0x59, 0x30, 0x34, 0x46, 0x74, 0x41, 0x45, + 0x50, 0x67, 0x59, 0x79, 0x49, 0x76, 0x75, 0x72, 0x77, 0x4b, 0x2b, 0x4b, 0x39, 0x62, 0x46, 0x31, 0x46, 0x45, + 0x43, 0x5c, 0x0a, + 0x09, 0x47, 0x41, 0x54, 0x62, 0x32, 0x33, 0x2b, 0x62, 0x62, 0x58, 0x63, 0x6a, 0x38, 0x48, 0x4a, 0x30, 0x65, + 0x79, 0x47, 0x39, 0x6b, 0x51, 0x39, 0x51, 0x43, 0x7a, 0x77, 0x48, 0x2f, 0x49, 0x6e, 0x65, 0x79, 0x41, 0x64, + 0x34, 0x54, 0x5a, 0x43, 0x4c, 0x47, 0x61, 0x45, 0x79, 0x67, 0x63, 0x6c, 0x78, 0x4f, 0x6a, 0x44, 0x54, 0x39, + 0x76, 0x2b, 0x7a, 0x57, 0x47, 0x39, 0x34, 0x4d, 0x66, 0x42, 0x77, 0x54, 0x4e, 0x67, 0x6c, 0x77, 0x44, 0x6a, + 0x67, 0x5c, 0x0a, + 0x09, 0x5a, 0x74, 0x75, 0x2b, 0x52, 0x75, 0x41, 0x78, 0x6b, 0x51, 0x36, 0x6d, 0x69, 0x30, 0x6f, 0x42, 0x45, + 0x6d, 0x42, 0x37, 0x2b, 0x32, 0x2b, 0x4b, 0x4f, 0x66, 0x52, 0x34, 0x39, 0x4f, 0x38, 0x39, 0x77, 0x48, 0x6a, + 0x62, 0x2f, 0x6a, 0x58, 0x41, 0x4a, 0x75, 0x44, 0x76, 0x51, 0x4b, 0x35, 0x74, 0x2f, 0x2b, 0x2b, 0x41, 0x4c, + 0x67, 0x45, 0x75, 0x5a, 0x6f, 0x7a, 0x6d, 0x5a, 0x49, 0x5a, 0x69, 0x74, 0x47, 0x55, 0x43, 0x6f, 0x77, 0x4c, + 0x49, 0x5c, 0x0a, + 0x09, 0x42, 0x77, 0x35, 0x68, 0x5a, 0x65, 0x51, 0x41, 0x74, 0x6d, 0x47, 0x6c, 0x43, 0x46, 0x4f, 0x78, 0x6b, + 0x76, 0x75, 0x65, 0x6c, 0x36, 0x67, 0x4e, 0x6d, 0x49, 0x4c, 0x31, 0x72, 0x58, 0x2f, 0x4c, 0x5a, 0x71, 0x59, + 0x6d, 0x47, 0x74, 0x37, 0x77, 0x6e, 0x44, 0x4c, 0x50, 0x45, 0x62, 0x2b, 0x79, 0x4d, 0x68, 0x4e, 0x6f, 0x65, + 0x35, 0x75, 0x79, 0x6a, 0x61, 0x76, 0x6f, 0x6a, 0x58, 0x7a, 0x6f, 0x66, 0x66, 0x76, 0x76, 0x70, 0x65, 0x2f, + 0x7a, 0x5c, 0x0a, + 0x09, 0x75, 0x78, 0x38, 0x49, 0x41, 0x33, 0x2b, 0x31, 0x37, 0x64, 0x4f, 0x42, 0x47, 0x77, 0x45, 0x44, 0x42, + 0x6e, 0x38, 0x47, 0x54, 0x67, 0x6b, 0x6b, 0x46, 0x59, 0x51, 0x4c, 0x49, 0x4f, 0x61, 0x6d, 0x35, 0x77, 0x49, + 0x6e, 0x70, 0x47, 0x6d, 0x71, 0x6d, 0x4f, 0x48, 0x4a, 0x73, 0x39, 0x78, 0x75, 0x32, 0x77, 0x34, 0x42, 0x70, + 0x63, 0x42, 0x39, 0x57, 0x4a, 0x6d, 0x2f, 0x48, 0x6a, 0x6f, 0x42, 0x44, 0x61, 0x67, 0x47, 0x4b, 0x6d, 0x33, + 0x37, 0x5c, 0x0a, + 0x09, 0x58, 0x77, 0x46, 0x4f, 0x6a, 0x66, 0x37, 0x73, 0x6d, 0x45, 0x41, 0x72, 0x30, 0x41, 0x45, 0x30, 0x41, + 0x51, 0x65, 0x41, 0x77, 0x37, 0x45, 0x43, 0x47, 0x51, 0x70, 0x42, 0x43, 0x50, 0x38, 0x45, 0x52, 0x47, 0x39, + 0x4b, 0x77, 0x38, 0x6f, 0x73, 0x33, 0x65, 0x48, 0x59, 0x78, 0x55, 0x59, 0x66, 0x72, 0x63, 0x41, 0x48, 0x77, + 0x48, 0x2b, 0x77, 0x53, 0x68, 0x46, 0x37, 0x65, 0x77, 0x37, 0x45, 0x43, 0x73, 0x48, 0x52, 0x4f, 0x42, 0x4d, + 0x70, 0x5c, 0x0a, + 0x09, 0x41, 0x4a, 0x75, 0x69, 0x56, 0x77, 0x42, 0x33, 0x4f, 0x33, 0x61, 0x68, 0x30, 0x55, 0x38, 0x45, 0x36, + 0x31, 0x4f, 0x79, 0x6c, 0x47, 0x6a, 0x6d, 0x30, 0x53, 0x34, 0x43, 0x4a, 0x2b, 0x4e, 0x73, 0x4b, 0x4a, 0x4c, + 0x55, 0x4b, 0x75, 0x43, 0x75, 0x49, 0x62, 0x6a, 0x4f, 0x61, 0x4d, 0x49, 0x46, 0x4c, 0x4d, 0x61, 0x71, 0x4f, + 0x33, 0x43, 0x4c, 0x76, 0x70, 0x41, 0x51, 0x62, 0x47, 0x2f, 0x2f, 0x63, 0x67, 0x54, 0x66, 0x78, 0x43, 0x68, + 0x6d, 0x5c, 0x0a, + 0x09, 0x4c, 0x6c, 0x59, 0x6d, 0x56, 0x42, 0x69, 0x69, 0x55, 0x34, 0x41, 0x53, 0x59, 0x49, 0x48, 0x67, 0x61, + 0x34, 0x78, 0x32, 0x7a, 0x68, 0x64, 0x70, 0x58, 0x4c, 0x51, 0x41, 0x76, 0x6f, 0x31, 0x36, 0x2b, 0x7a, 0x4f, + 0x6c, 0x63, 0x76, 0x41, 0x67, 0x36, 0x53, 0x4f, 0x36, 0x47, 0x48, 0x68, 0x61, 0x4d, 0x6f, 0x47, 0x4f, 0x4e, + 0x4c, 0x66, 0x79, 0x35, 0x71, 0x61, 0x74, 0x62, 0x4b, 0x37, 0x35, 0x6c, 0x4c, 0x71, 0x47, 0x4a, 0x67, 0x4b, + 0x36, 0x5c, 0x0a, + 0x09, 0x7a, 0x74, 0x67, 0x79, 0x50, 0x37, 0x4f, 0x6e, 0x54, 0x65, 0x62, 0x43, 0x63, 0x2b, 0x59, 0x77, 0x59, + 0x38, 0x6f, 0x45, 0x77, 0x57, 0x36, 0x4b, 0x34, 0x55, 0x68, 0x7a, 0x4b, 0x32, 0x39, 0x73, 0x66, 0x4a, 0x39, + 0x33, 0x50, 0x39, 0x7a, 0x4a, 0x77, 0x66, 0x70, 0x47, 0x39, 0x46, 0x43, 0x59, 0x69, 0x72, 0x49, 0x53, 0x71, + 0x71, 0x5a, 0x50, 0x59, 0x66, 0x34, 0x35, 0x63, 0x35, 0x67, 0x78, 0x4f, 0x61, 0x6b, 0x53, 0x73, 0x53, 0x37, + 0x53, 0x5c, 0x0a, + 0x09, 0x52, 0x32, 0x47, 0x6c, 0x67, 0x47, 0x67, 0x65, 0x59, 0x44, 0x56, 0x57, 0x4b, 0x39, 0x71, 0x41, 0x68, + 0x4d, 0x4a, 0x68, 0x56, 0x6a, 0x32, 0x33, 0x6a, 0x69, 0x64, 0x65, 0x65, 0x6f, 0x76, 0x75, 0x59, 0x50, 0x7a, + 0x37, 0x6e, 0x48, 0x66, 0x6d, 0x62, 0x4f, 0x36, 0x36, 0x39, 0x56, 0x71, 0x4f, 0x48, 0x54, 0x66, 0x47, 0x4d, + 0x56, 0x39, 0x46, 0x6f, 0x6f, 0x66, 0x43, 0x50, 0x50, 0x4c, 0x73, 0x79, 0x7a, 0x7a, 0x31, 0x79, 0x72, 0x38, + 0x4a, 0x5c, 0x0a, + 0x09, 0x36, 0x71, 0x47, 0x34, 0x34, 0x63, 0x34, 0x2f, 0x71, 0x34, 0x72, 0x66, 0x4c, 0x76, 0x6b, 0x78, 0x34, + 0x79, 0x76, 0x4b, 0x45, 0x70, 0x6c, 0x37, 0x42, 0x62, 0x67, 0x38, 0x57, 0x30, 0x73, 0x42, 0x68, 0x66, 0x45, + 0x4f, 0x64, 0x48, 0x52, 0x31, 0x73, 0x32, 0x6a, 0x35, 0x53, 0x6c, 0x59, 0x39, 0x76, 0x79, 0x35, 0x68, 0x35, + 0x41, 0x4f, 0x73, 0x33, 0x37, 0x4b, 0x44, 0x42, 0x58, 0x66, 0x65, 0x77, 0x34, 0x65, 0x66, 0x37, 0x58, 0x48, + 0x63, 0x5c, 0x0a, + 0x09, 0x51, 0x61, 0x64, 0x70, 0x37, 0x2b, 0x7a, 0x6d, 0x68, 0x74, 0x38, 0x38, 0x79, 0x4b, 0x4e, 0x72, 0x33, + 0x30, 0x67, 0x59, 0x2b, 0x51, 0x42, 0x76, 0x76, 0x31, 0x66, 0x44, 0x67, 0x6a, 0x74, 0x57, 0x55, 0x4c, 0x74, + 0x37, 0x62, 0x36, 0x4a, 0x67, 0x63, 0x5a, 0x2b, 0x68, 0x45, 0x34, 0x67, 0x57, 0x67, 0x44, 0x2f, 0x65, 0x67, + 0x57, 0x55, 0x72, 0x48, 0x2b, 0x57, 0x44, 0x32, 0x6c, 0x31, 0x4a, 0x47, 0x32, 0x70, 0x74, 0x37, 0x2b, 0x53, + 0x57, 0x5c, 0x0a, + 0x09, 0x75, 0x78, 0x2b, 0x6d, 0x72, 0x71, 0x48, 0x4a, 0x45, 0x63, 0x64, 0x45, 0x59, 0x4a, 0x6f, 0x6d, 0x53, + 0x78, 0x39, 0x59, 0x52, 0x63, 0x33, 0x4f, 0x33, 0x55, 0x6d, 0x66, 0x30, 0x39, 0x7a, 0x57, 0x77, 0x65, 0x4b, + 0x37, 0x48, 0x36, 0x61, 0x68, 0x71, 0x54, 0x56, 0x65, 0x6b, 0x48, 0x47, 0x4f, 0x4f, 0x42, 0x65, 0x48, 0x6f, + 0x53, 0x67, 0x46, 0x39, 0x4f, 0x4f, 0x74, 0x54, 0x64, 0x75, 0x6f, 0x66, 0x76, 0x2f, 0x44, 0x6c, 0x49, 0x32, + 0x31, 0x5c, 0x0a, + 0x09, 0x74, 0x48, 0x65, 0x77, 0x63, 0x73, 0x33, 0x61, 0x6a, 0x4a, 0x30, 0x53, 0x78, 0x65, 0x73, 0x62, 0x33, + 0x32, 0x66, 0x54, 0x39, 0x74, 0x71, 0x55, 0x7a, 0x32, 0x74, 0x73, 0x61, 0x57, 0x50, 0x6c, 0x45, 0x33, 0x48, + 0x76, 0x71, 0x77, 0x4c, 0x45, 0x74, 0x61, 0x55, 0x4d, 0x69, 0x77, 0x42, 0x57, 0x76, 0x2f, 0x42, 0x36, 0x32, + 0x67, 0x5a, 0x66, 0x33, 0x37, 0x69, 0x46, 0x2f, 0x59, 0x63, 0x61, 0x30, 0x6a, 0x35, 0x66, 0x4a, 0x4a, 0x6e, + 0x63, 0x5c, 0x0a, + 0x09, 0x31, 0x36, 0x76, 0x56, 0x37, 0x33, 0x4b, 0x77, 0x6f, 0x58, 0x47, 0x67, 0x51, 0x78, 0x55, 0x49, 0x6a, + 0x43, 0x66, 0x52, 0x41, 0x69, 0x69, 0x4e, 0x33, 0x56, 0x48, 0x58, 0x30, 0x45, 0x54, 0x74, 0x46, 0x31, 0x39, + 0x6c, 0x5a, 0x48, 0x54, 0x39, 0x6c, 0x68, 0x30, 0x5a, 0x6e, 0x53, 0x2b, 0x43, 0x66, 0x58, 0x58, 0x31, 0x66, + 0x4c, 0x37, 0x33, 0x36, 0x37, 0x54, 0x50, 0x4e, 0x30, 0x32, 0x54, 0x64, 0x77, 0x5a, 0x4f, 0x46, 0x56, 0x31, + 0x41, 0x5c, 0x0a, + 0x09, 0x65, 0x64, 0x71, 0x47, 0x42, 0x30, 0x47, 0x49, 0x41, 0x47, 0x7a, 0x4a, 0x56, 0x55, 0x58, 0x73, 0x73, + 0x53, 0x2f, 0x32, 0x31, 0x32, 0x56, 0x73, 0x66, 0x34, 0x38, 0x44, 0x4e, 0x70, 0x78, 0x6d, 0x37, 0x34, 0x48, + 0x44, 0x47, 0x64, 0x76, 0x59, 0x76, 0x65, 0x39, 0x67, 0x76, 0x45, 0x4e, 0x78, 0x38, 0x31, 0x4b, 0x5a, 0x49, + 0x6a, 0x49, 0x46, 0x38, 0x41, 0x4f, 0x2b, 0x32, 0x4a, 0x33, 0x74, 0x6e, 0x5a, 0x6c, 0x33, 0x6a, 0x47, 0x6c, + 0x70, 0x5c, 0x0a, + 0x09, 0x37, 0x38, 0x7a, 0x59, 0x68, 0x74, 0x4f, 0x30, 0x74, 0x48, 0x64, 0x6b, 0x62, 0x4b, 0x4d, 0x74, 0x2f, + 0x72, 0x50, 0x4a, 0x53, 0x67, 0x45, 0x4d, 0x6d, 0x48, 0x73, 0x74, 0x39, 0x78, 0x64, 0x6e, 0x62, 0x4c, 0x69, + 0x69, 0x64, 0x4d, 0x43, 0x73, 0x78, 0x62, 0x41, 0x79, 0x78, 0x67, 0x47, 0x66, 0x45, 0x74, 0x78, 0x58, 0x76, + 0x30, 0x2b, 0x70, 0x55, 0x34, 0x67, 0x55, 0x77, 0x4e, 0x69, 0x42, 0x64, 0x70, 0x34, 0x30, 0x6f, 0x52, 0x4b, + 0x33, 0x5c, 0x0a, + 0x09, 0x4f, 0x37, 0x50, 0x4c, 0x7a, 0x6a, 0x67, 0x78, 0x33, 0x54, 0x34, 0x6c, 0x34, 0x70, 0x67, 0x32, 0x38, + 0x54, 0x68, 0x63, 0x47, 0x58, 0x61, 0x4a, 0x4f, 0x7a, 0x6c, 0x2b, 0x7a, 0x61, 0x41, 0x66, 0x78, 0x4a, 0x51, + 0x45, 0x48, 0x4b, 0x38, 0x4b, 0x74, 0x6a, 0x6b, 0x35, 0x66, 0x71, 0x44, 0x6a, 0x4a, 0x55, 0x55, 0x46, 0x6e, + 0x48, 0x76, 0x71, 0x4b, 0x57, 0x7a, 0x59, 0x2b, 0x6c, 0x46, 0x61, 0x39, 0x6e, 0x4e, 0x38, 0x58, 0x75, 0x61, + 0x64, 0x5c, 0x0a, + 0x09, 0x4d, 0x54, 0x75, 0x6c, 0x63, 0x77, 0x34, 0x32, 0x4e, 0x4c, 0x4c, 0x70, 0x67, 0x30, 0x2f, 0x34, 0x71, + 0x71, 0x36, 0x65, 0x6c, 0x72, 0x59, 0x4f, 0x75, 0x67, 0x4a, 0x42, 0x79, 0x35, 0x62, 0x58, 0x69, 0x38, 0x75, + 0x6c, 0x55, 0x5a, 0x43, 0x66, 0x52, 0x32, 0x6c, 0x78, 0x49, 0x65, 0x50, 0x4b, 0x53, 0x7a, 0x6c, 0x2b, 0x2f, + 0x46, 0x69, 0x6d, 0x54, 0x54, 0x79, 0x4f, 0x6f, 0x6f, 0x4b, 0x38, 0x51, 0x61, 0x7a, 0x32, 0x70, 0x61, 0x79, + 0x6b, 0x5c, 0x0a, + 0x09, 0x69, 0x4c, 0x4f, 0x72, 0x54, 0x6b, 0x36, 0x72, 0x47, 0x41, 0x69, 0x51, 0x6c, 0x2b, 0x50, 0x6a, 0x76, + 0x4e, 0x4e, 0x6e, 0x78, 0x54, 0x73, 0x38, 0x43, 0x2f, 0x67, 0x6e, 0x59, 0x44, 0x67, 0x74, 0x41, 0x6b, 0x63, + 0x46, 0x59, 0x48, 0x4e, 0x75, 0x46, 0x76, 0x31, 0x37, 0x30, 0x68, 0x37, 0x6c, 0x7a, 0x75, 0x73, 0x75, 0x5a, + 0x2b, 0x4f, 0x32, 0x6a, 0x39, 0x4f, 0x71, 0x30, 0x76, 0x7a, 0x70, 0x67, 0x67, 0x73, 0x70, 0x4b, 0x53, 0x70, + 0x49, 0x5c, 0x0a, + 0x09, 0x4f, 0x6e, 0x77, 0x6f, 0x48, 0x4f, 0x62, 0x79, 0x32, 0x31, 0x66, 0x51, 0x6d, 0x6b, 0x4b, 0x2b, 0x51, + 0x64, 0x4d, 0x30, 0x4c, 0x6a, 0x33, 0x76, 0x4c, 0x46, 0x59, 0x75, 0x57, 0x35, 0x79, 0x53, 0x62, 0x33, 0x64, + 0x63, 0x74, 0x79, 0x42, 0x74, 0x41, 0x64, 0x78, 0x38, 0x31, 0x66, 0x63, 0x53, 0x69, 0x57, 0x34, 0x35, 0x63, + 0x41, 0x50, 0x77, 0x4b, 0x2b, 0x42, 0x35, 0x6f, 0x37, 0x62, 0x61, 0x73, 0x53, 0x46, 0x6d, 0x6a, 0x6e, 0x30, + 0x43, 0x5c, 0x0a, + 0x09, 0x62, 0x47, 0x50, 0x6e, 0x48, 0x73, 0x44, 0x71, 0x43, 0x54, 0x73, 0x2f, 0x58, 0x74, 0x67, 0x5a, 0x55, + 0x79, 0x5a, 0x77, 0x36, 0x38, 0x4a, 0x4c, 0x55, 0x72, 0x37, 0x47, 0x39, 0x45, 0x6e, 0x48, 0x73, 0x2b, 0x53, + 0x48, 0x33, 0x30, 0x2f, 0x70, 0x6e, 0x4b, 0x62, 0x57, 0x39, 0x70, 0x51, 0x69, 0x48, 0x36, 0x77, 0x69, 0x32, + 0x61, 0x76, 0x56, 0x37, 0x31, 0x4c, 0x66, 0x31, 0x4a, 0x4c, 0x53, 0x65, 0x62, 0x4e, 0x4f, 0x6d, 0x73, 0x54, + 0x4e, 0x5c, 0x0a, + 0x09, 0x56, 0x31, 0x34, 0x30, 0x65, 0x4d, 0x41, 0x59, 0x5a, 0x6b, 0x36, 0x64, 0x79, 0x4f, 0x4b, 0x72, 0x4c, + 0x68, 0x34, 0x73, 0x57, 0x43, 0x58, 0x57, 0x61, 0x4b, 0x51, 0x4a, 0x4b, 0x56, 0x38, 0x67, 0x41, 0x55, 0x37, + 0x6e, 0x41, 0x61, 0x34, 0x44, 0x66, 0x6f, 0x33, 0x56, 0x42, 0x7a, 0x41, 0x68, 0x53, 0x36, 0x39, 0x66, 0x77, + 0x45, 0x31, 0x58, 0x4a, 0x50, 0x2b, 0x77, 0x5a, 0x6b, 0x36, 0x64, 0x79, 0x4a, 0x72, 0x37, 0x66, 0x6b, 0x6d, + 0x75, 0x5c, 0x0a, + 0x09, 0x72, 0x31, 0x2f, 0x42, 0x49, 0x69, 0x48, 0x6a, 0x79, 0x6b, 0x75, 0x70, 0x54, 0x4b, 0x4d, 0x52, 0x36, + 0x5a, 0x69, 0x78, 0x35, 0x57, 0x6c, 0x6c, 0x4e, 0x70, 0x66, 0x39, 0x35, 0x47, 0x6f, 0x57, 0x58, 0x5a, 0x62, + 0x38, 0x43, 0x4c, 0x43, 0x71, 0x61, 0x5a, 0x4e, 0x35, 0x64, 0x4d, 0x56, 0x53, 0x63, 0x6e, 0x7a, 0x65, 0x5a, + 0x49, 0x4c, 0x6e, 0x41, 0x41, 0x2b, 0x6c, 0x37, 0x46, 0x51, 0x43, 0x48, 0x47, 0x73, 0x4e, 0x6a, 0x4b, 0x59, + 0x41, 0x5c, 0x0a, + 0x09, 0x37, 0x77, 0x46, 0x6e, 0x70, 0x6e, 0x4c, 0x65, 0x66, 0x32, 0x74, 0x71, 0x57, 0x62, 0x6c, 0x6d, 0x4c, + 0x54, 0x76, 0x33, 0x37, 0x42, 0x76, 0x77, 0x75, 0x4c, 0x2b, 0x6f, 0x6b, 0x4d, 0x56, 0x58, 0x58, 0x38, 0x79, + 0x69, 0x79, 0x79, 0x37, 0x41, 0x36, 0x30, 0x6e, 0x76, 0x69, 0x2f, 0x57, 0x76, 0x54, 0x56, 0x75, 0x35, 0x38, + 0x34, 0x39, 0x2f, 0x54, 0x6a, 0x71, 0x38, 0x53, 0x39, 0x4e, 0x59, 0x76, 0x57, 0x49, 0x70, 0x33, 0x7a, 0x6c, + 0x74, 0x5c, 0x0a, + 0x09, 0x35, 0x75, 0x43, 0x42, 0x34, 0x37, 0x42, 0x78, 0x32, 0x38, 0x63, 0x38, 0x39, 0x4f, 0x53, 0x4c, 0x2f, + 0x4f, 0x2f, 0x4c, 0x2f, 0x51, 0x4d, 0x65, 0x39, 0x78, 0x63, 0x56, 0x73, 0x75, 0x53, 0x61, 0x53, 0x37, 0x6a, + 0x2b, 0x30, 0x67, 0x76, 0x77, 0x65, 0x46, 0x4c, 0x71, 0x4d, 0x74, 0x45, 0x4e, 0x35, 0x44, 0x76, 0x31, 0x43, + 0x58, 0x42, 0x61, 0x41, 0x44, 0x71, 0x51, 0x6c, 0x4a, 0x52, 0x6a, 0x32, 0x62, 0x6c, 0x6e, 0x48, 0x35, 0x74, + 0x33, 0x5c, 0x0a, + 0x09, 0x66, 0x45, 0x70, 0x64, 0x66, 0x52, 0x4e, 0x36, 0x4b, 0x4d, 0x53, 0x59, 0x30, 0x68, 0x4b, 0x71, 0x70, + 0x6b, 0x2f, 0x6d, 0x7a, 0x47, 0x39, 0x4f, 0x78, 0x2b, 0x66, 0x4e, 0x50, 0x4b, 0x76, 0x79, 0x7a, 0x4c, 0x71, + 0x33, 0x2b, 0x63, 0x4e, 0x6a, 0x7a, 0x32, 0x45, 0x59, 0x6b, 0x59, 0x54, 0x68, 0x78, 0x70, 0x62, 0x35, 0x75, + 0x66, 0x66, 0x32, 0x52, 0x63, 0x77, 0x39, 0x49, 0x32, 0x36, 0x47, 0x4c, 0x47, 0x6c, 0x4d, 0x30, 0x32, 0x54, + 0x6e, 0x5c, 0x0a, + 0x09, 0x6e, 0x76, 0x31, 0x73, 0x72, 0x71, 0x6e, 0x6c, 0x30, 0x4a, 0x46, 0x6d, 0x39, 0x46, 0x43, 0x49, 0x69, + 0x6a, 0x49, 0x2f, 0x73, 0x36, 0x64, 0x4e, 0x79, 0x76, 0x53, 0x2b, 0x74, 0x4a, 0x45, 0x71, 0x67, 0x42, 0x47, + 0x39, 0x46, 0x76, 0x32, 0x65, 0x72, 0x2b, 0x74, 0x34, 0x2f, 0x4d, 0x55, 0x33, 0x57, 0x62, 0x39, 0x6c, 0x42, + 0x38, 0x31, 0x74, 0x76, 0x52, 0x55, 0x33, 0x65, 0x62, 0x6b, 0x35, 0x7a, 0x44, 0x70, 0x70, 0x45, 0x76, 0x50, + 0x50, 0x5c, 0x0a, + 0x09, 0x6e, 0x73, 0x4f, 0x56, 0x38, 0x38, 0x39, 0x4e, 0x2b, 0x54, 0x4d, 0x7a, 0x78, 0x4f, 0x77, 0x43, 0x70, + 0x6f, 0x35, 0x55, 0x41, 0x65, 0x77, 0x44, 0x6a, 0x6e, 0x50, 0x45, 0x6f, 0x47, 0x43, 0x4f, 0x4e, 0x4c, 0x63, + 0x53, 0x31, 0x45, 0x50, 0x6b, 0x35, 0x76, 0x67, 0x63, 0x71, 0x5a, 0x77, 0x61, 0x51, 0x6d, 0x34, 0x45, 0x6e, + 0x68, 0x70, 0x78, 0x70, 0x59, 0x41, 0x6f, 0x54, 0x7a, 0x6c, 0x73, 0x54, 0x78, 0x68, 0x6a, 0x53, 0x6b, 0x73, + 0x34, 0x5c, 0x0a, + 0x09, 0x64, 0x74, 0x79, 0x59, 0x62, 0x49, 0x72, 0x38, 0x49, 0x50, 0x41, 0x4c, 0x48, 0x48, 0x37, 0x47, 0x54, + 0x6c, 0x63, 0x45, 0x2f, 0x52, 0x35, 0x72, 0x54, 0x50, 0x7a, 0x50, 0x36, 0x54, 0x73, 0x32, 0x58, 0x70, 0x45, + 0x5a, 0x6e, 0x77, 0x49, 0x58, 0x41, 0x48, 0x58, 0x67, 0x37, 0x44, 0x51, 0x7a, 0x54, 0x71, 0x63, 0x41, 0x4f, + 0x72, 0x43, 0x4d, 0x4a, 0x44, 0x75, 0x44, 0x4b, 0x70, 0x4a, 0x6d, 0x46, 0x39, 0x48, 0x49, 0x64, 0x33, 0x71, + 0x38, 0x5c, 0x0a, + 0x09, 0x6f, 0x47, 0x4d, 0x43, 0x63, 0x4d, 0x2b, 0x59, 0x61, 0x33, 0x63, 0x75, 0x61, 0x39, 0x4c, 0x56, 0x62, + 0x45, 0x4c, 0x45, 0x59, 0x46, 0x46, 0x52, 0x6a, 0x55, 0x48, 0x43, 0x6d, 0x69, 0x38, 0x6c, 0x4a, 0x53, 0x6a, + 0x4b, 0x73, 0x42, 0x4a, 0x41, 0x64, 0x74, 0x41, 0x74, 0x79, 0x72, 0x44, 0x6a, 0x41, 0x6a, 0x41, 0x30, 0x4e, + 0x79, 0x67, 0x42, 0x4f, 0x45, 0x33, 0x32, 0x43, 0x43, 0x44, 0x67, 0x4b, 0x79, 0x62, 0x6f, 0x7a, 0x5a, 0x38, + 0x51, 0x5c, 0x0a, + 0x09, 0x30, 0x64, 0x54, 0x38, 0x55, 0x77, 0x34, 0x69, 0x37, 0x42, 0x50, 0x67, 0x65, 0x48, 0x2b, 0x41, 0x7a, + 0x6c, 0x77, 0x2f, 0x59, 0x58, 0x66, 0x75, 0x54, 0x4e, 0x32, 0x54, 0x69, 0x79, 0x2f, 0x63, 0x54, 0x55, 0x36, + 0x6f, 0x4d, 0x2f, 0x72, 0x72, 0x77, 0x6d, 0x73, 0x45, 0x6e, 0x4c, 0x36, 0x63, 0x4c, 0x41, 0x6a, 0x72, 0x42, + 0x75, 0x32, 0x34, 0x41, 0x41, 0x4c, 0x65, 0x59, 0x69, 0x49, 0x75, 0x64, 0x77, 0x65, 0x41, 0x37, 0x73, 0x6c, + 0x48, 0x5c, 0x0a, + 0x09, 0x39, 0x2b, 0x54, 0x54, 0x6e, 0x6d, 0x66, 0x31, 0x44, 0x58, 0x57, 0x5a, 0x42, 0x72, 0x35, 0x51, 0x46, + 0x7a, 0x6e, 0x68, 0x4c, 0x6e, 0x4a, 0x43, 0x6e, 0x66, 0x6a, 0x43, 0x58, 0x58, 0x67, 0x4d, 0x6f, 0x55, 0x50, + 0x66, 0x52, 0x67, 0x73, 0x62, 0x75, 0x6e, 0x4c, 0x45, 0x64, 0x49, 0x4e, 0x7a, 0x58, 0x41, 0x41, 0x52, 0x6c, + 0x78, 0x75, 0x73, 0x5a, 0x73, 0x76, 0x2b, 0x78, 0x7a, 0x51, 0x33, 0x41, 0x56, 0x38, 0x52, 0x41, 0x56, 0x2f, + 0x76, 0x5c, 0x0a, + 0x09, 0x6e, 0x45, 0x75, 0x75, 0x53, 0x42, 0x68, 0x66, 0x75, 0x4e, 0x76, 0x32, 0x36, 0x38, 0x4a, 0x72, 0x42, + 0x4e, 0x48, 0x4d, 0x78, 0x49, 0x30, 0x32, 0x32, 0x59, 0x6a, 0x68, 0x38, 0x68, 0x44, 0x52, 0x50, 0x45, 0x52, + 0x63, 0x48, 0x69, 0x4b, 0x61, 0x47, 0x38, 0x50, 0x6c, 0x4a, 0x71, 0x4b, 0x35, 0x69, 0x66, 0x54, 0x38, 0x31, + 0x54, 0x79, 0x39, 0x32, 0x30, 0x66, 0x33, 0x75, 0x55, 0x30, 0x30, 0x7a, 0x5a, 0x38, 0x58, 0x6a, 0x44, 0x74, + 0x79, 0x5c, 0x0a, + 0x09, 0x4b, 0x43, 0x4f, 0x47, 0x66, 0x5a, 0x37, 0x41, 0x69, 0x4d, 0x76, 0x54, 0x54, 0x78, 0x51, 0x41, 0x48, + 0x6b, 0x50, 0x48, 0x61, 0x77, 0x54, 0x77, 0x47, 0x67, 0x45, 0x38, 0x68, 0x6f, 0x37, 0x62, 0x43, 0x4f, 0x47, + 0x4a, 0x36, 0x48, 0x67, 0x4d, 0x48, 0x5a, 0x63, 0x5a, 0x52, 0x6e, 0x4e, 0x77, 0x67, 0x47, 0x53, 0x6d, 0x68, + 0x4e, 0x30, 0x2b, 0x51, 0x75, 0x35, 0x63, 0x77, 0x6d, 0x34, 0x66, 0x68, 0x73, 0x73, 0x62, 0x2f, 0x56, 0x6b, + 0x52, 0x5c, 0x0a, + 0x09, 0x33, 0x52, 0x50, 0x70, 0x68, 0x69, 0x76, 0x39, 0x6c, 0x6a, 0x39, 0x67, 0x59, 0x57, 0x64, 0x4f, 0x71, + 0x5a, 0x43, 0x5a, 0x52, 0x6b, 0x55, 0x4a, 0x6f, 0x44, 0x6c, 0x54, 0x41, 0x32, 0x47, 0x33, 0x6a, 0x37, 0x44, + 0x62, 0x52, 0x33, 0x65, 0x63, 0x4f, 0x69, 0x58, 0x4e, 0x6a, 0x4b, 0x43, 0x6c, 0x30, 0x50, 0x69, 0x6f, 0x6d, + 0x5a, 0x45, 0x2b, 0x6f, 0x6e, 0x47, 0x5a, 0x52, 0x6d, 0x4a, 0x62, 0x70, 0x6f, 0x6b, 0x72, 0x51, 0x53, 0x6f, + 0x55, 0x5c, 0x0a, + 0x09, 0x63, 0x62, 0x6b, 0x78, 0x30, 0x51, 0x69, 0x35, 0x63, 0x34, 0x69, 0x6b, 0x48, 0x37, 0x6e, 0x4a, 0x55, + 0x6f, 0x57, 0x67, 0x4f, 0x52, 0x68, 0x46, 0x65, 0x66, 0x36, 0x6c, 0x49, 0x4c, 0x74, 0x48, 0x4d, 0x54, 0x56, + 0x58, 0x61, 0x6d, 0x33, 0x50, 0x57, 0x6c, 0x62, 0x50, 0x55, 0x31, 0x45, 0x30, 0x65, 0x4a, 0x44, 0x30, 0x45, + 0x46, 0x56, 0x57, 0x57, 0x79, 0x66, 0x49, 0x72, 0x71, 0x77, 0x63, 0x45, 0x47, 0x56, 0x59, 0x6c, 0x41, 0x42, + 0x71, 0x5c, 0x0a, + 0x09, 0x67, 0x41, 0x32, 0x43, 0x62, 0x4d, 0x76, 0x49, 0x64, 0x6c, 0x47, 0x47, 0x48, 0x52, 0x66, 0x41, 0x6c, + 0x4c, 0x46, 0x48, 0x4b, 0x77, 0x47, 0x58, 0x4f, 0x32, 0x31, 0x62, 0x59, 0x6f, 0x53, 0x39, 0x54, 0x43, 0x4b, + 0x72, 0x36, 0x7a, 0x59, 0x44, 0x4c, 0x77, 0x69, 0x30, 0x4c, 0x77, 0x73, 0x6d, 0x73, 0x46, 0x47, 0x55, 0x63, + 0x53, 0x45, 0x43, 0x73, 0x4b, 0x55, 0x43, 0x74, 0x77, 0x46, 0x48, 0x52, 0x46, 0x78, 0x44, 0x49, 0x72, 0x59, + 0x44, 0x5c, 0x0a, + 0x09, 0x39, 0x61, 0x4b, 0x4d, 0x69, 0x36, 0x36, 0x77, 0x62, 0x79, 0x44, 0x42, 0x4a, 0x46, 0x47, 0x4b, 0x70, + 0x48, 0x67, 0x4e, 0x2b, 0x72, 0x78, 0x55, 0x6a, 0x69, 0x4a, 0x4d, 0x41, 0x44, 0x61, 0x48, 0x58, 0x77, 0x49, + 0x65, 0x46, 0x48, 0x57, 0x64, 0x55, 0x59, 0x36, 0x42, 0x34, 0x48, 0x36, 0x57, 0x51, 0x6c, 0x4f, 0x41, 0x6d, + 0x41, 0x7a, 0x68, 0x79, 0x4a, 0x33, 0x63, 0x5a, 0x2b, 0x54, 0x79, 0x4f, 0x49, 0x4c, 0x72, 0x56, 0x49, 0x61, + 0x71, 0x5c, 0x0a, + 0x09, 0x7a, 0x64, 0x59, 0x41, 0x66, 0x6f, 0x51, 0x31, 0x61, 0x62, 0x52, 0x71, 0x2f, 0x55, 0x6d, 0x4f, 0x74, + 0x56, 0x69, 0x39, 0x67, 0x49, 0x55, 0x6c, 0x2f, 0x7a, 0x41, 0x45, 0x41, 0x72, 0x41, 0x35, 0x62, 0x32, 0x43, + 0x74, 0x71, 0x6e, 0x45, 0x69, 0x38, 0x42, 0x63, 0x45, 0x64, 0x6e, 0x4c, 0x49, 0x59, 0x68, 0x71, 0x42, 0x52, + 0x37, 0x42, 0x47, 0x56, 0x79, 0x39, 0x6b, 0x43, 0x4e, 0x59, 0x5a, 0x47, 0x74, 0x49, 0x31, 0x67, 0x33, 0x62, + 0x58, 0x5c, 0x0a, + 0x09, 0x39, 0x78, 0x6c, 0x74, 0x57, 0x77, 0x70, 0x63, 0x44, 0x56, 0x79, 0x44, 0x4e, 0x53, 0x76, 0x32, 0x36, + 0x46, 0x70, 0x77, 0x4b, 0x48, 0x6b, 0x61, 0x73, 0x47, 0x70, 0x4f, 0x31, 0x77, 0x4a, 0x76, 0x59, 0x36, 0x31, + 0x4b, 0x41, 0x73, 0x52, 0x2f, 0x38, 0x37, 0x4e, 0x6d, 0x77, 0x59, 0x68, 0x34, 0x32, 0x49, 0x56, 0x51, 0x45, + 0x47, 0x6a, 0x45, 0x33, 0x33, 0x56, 0x34, 0x56, 0x64, 0x42, 0x62, 0x38, 0x4c, 0x4d, 0x75, 0x58, 0x77, 0x6b, + 0x42, 0x5c, 0x0a, + 0x09, 0x58, 0x7a, 0x47, 0x6a, 0x76, 0x54, 0x65, 0x52, 0x68, 0x74, 0x6c, 0x67, 0x6f, 0x72, 0x32, 0x49, 0x4e, + 0x65, 0x6e, 0x44, 0x4f, 0x30, 0x54, 0x58, 0x46, 0x4f, 0x70, 0x68, 0x73, 0x43, 0x51, 0x2f, 0x4b, 0x78, 0x65, + 0x4e, 0x73, 0x6d, 0x4f, 0x2f, 0x51, 0x62, 0x33, 0x32, 0x48, 0x56, 0x78, 0x6d, 0x52, 0x50, 0x65, 0x47, 0x41, + 0x78, 0x52, 0x32, 0x4e, 0x32, 0x4b, 0x69, 0x45, 0x66, 0x51, 0x57, 0x48, 0x47, 0x30, 0x69, 0x44, 0x6e, 0x6f, + 0x4b, 0x5c, 0x0a, + 0x09, 0x4d, 0x45, 0x66, 0x42, 0x61, 0x6d, 0x54, 0x65, 0x63, 0x49, 0x42, 0x38, 0x76, 0x59, 0x58, 0x38, 0x59, + 0x43, 0x75, 0x2b, 0x63, 0x50, 0x63, 0x31, 0x6a, 0x59, 0x57, 0x56, 0x31, 0x52, 0x31, 0x35, 0x76, 0x63, 0x50, + 0x57, 0x52, 0x58, 0x37, 0x6e, 0x45, 0x7a, 0x48, 0x73, 0x2f, 0x51, 0x47, 0x69, 0x54, 0x61, 0x35, 0x48, 0x35, + 0x31, 0x62, 0x56, 0x4d, 0x4d, 0x6b, 0x4e, 0x64, 0x5a, 0x41, 0x62, 0x36, 0x6f, 0x44, 0x4f, 0x4f, 0x6b, 0x78, + 0x4e, 0x5c, 0x0a, + 0x09, 0x51, 0x2f, 0x66, 0x6b, 0x30, 0x31, 0x49, 0x77, 0x2f, 0x6d, 0x2f, 0x64, 0x76, 0x75, 0x4a, 0x43, 0x34, + 0x47, 0x77, 0x45, 0x54, 0x35, 0x2f, 0x71, 0x46, 0x4c, 0x6c, 0x36, 0x4f, 0x2f, 0x6c, 0x36, 0x4b, 0x2f, 0x6e, + 0x42, 0x56, 0x6a, 0x78, 0x47, 0x6e, 0x32, 0x35, 0x39, 0x2b, 0x38, 0x76, 0x62, 0x39, 0x2f, 0x4f, 0x4e, 0x45, + 0x36, 0x59, 0x4d, 0x6c, 0x32, 0x74, 0x48, 0x47, 0x58, 0x59, 0x42, 0x52, 0x46, 0x6d, 0x4c, 0x4e, 0x61, 0x79, + 0x73, 0x5c, 0x0a, + 0x09, 0x33, 0x32, 0x75, 0x67, 0x6d, 0x61, 0x61, 0x5a, 0x45, 0x2b, 0x71, 0x38, 0x4e, 0x30, 0x66, 0x76, 0x57, + 0x4b, 0x46, 0x37, 0x38, 0x6a, 0x42, 0x63, 0x58, 0x6f, 0x42, 0x6a, 0x73, 0x65, 0x59, 0x68, 0x6d, 0x42, 0x50, + 0x39, 0x7a, 0x57, 0x5a, 0x6b, 0x69, 0x43, 0x4b, 0x51, 0x70, 0x37, 0x64, 0x36, 0x43, 0x77, 0x49, 0x74, 0x37, + 0x6e, 0x79, 0x39, 0x46, 0x56, 0x63, 0x6b, 0x50, 0x46, 0x43, 0x59, 0x44, 0x63, 0x44, 0x75, 0x56, 0x50, 0x6f, + 0x79, 0x5c, 0x0a, + 0x09, 0x69, 0x47, 0x54, 0x59, 0x46, 0x34, 0x36, 0x30, 0x7a, 0x53, 0x74, 0x55, 0x68, 0x62, 0x58, 0x65, 0x37, + 0x72, 0x6c, 0x59, 0x77, 0x6a, 0x79, 0x45, 0x74, 0x51, 0x44, 0x6a, 0x49, 0x31, 0x69, 0x72, 0x61, 0x65, 0x45, + 0x35, 0x5a, 0x56, 0x35, 0x73, 0x52, 0x74, 0x4a, 0x4f, 0x47, 0x54, 0x41, 0x64, 0x4f, 0x42, 0x6c, 0x72, 0x55, + 0x63, 0x64, 0x4b, 0x4c, 0x4b, 0x45, 0x63, 0x45, 0x39, 0x30, 0x65, 0x73, 0x4a, 0x74, 0x61, 0x6d, 0x68, 0x68, + 0x59, 0x5c, 0x0a, + 0x09, 0x51, 0x37, 0x57, 0x2b, 0x77, 0x68, 0x6f, 0x52, 0x2f, 0x54, 0x6e, 0x57, 0x67, 0x70, 0x4c, 0x56, 0x45, + 0x2b, 0x71, 0x33, 0x50, 0x30, 0x44, 0x66, 0x64, 0x59, 0x62, 0x74, 0x31, 0x41, 0x43, 0x58, 0x41, 0x67, 0x63, + 0x79, 0x47, 0x65, 0x57, 0x54, 0x39, 0x5a, 0x6e, 0x41, 0x57, 0x47, 0x4a, 0x6d, 0x76, 0x76, 0x4a, 0x67, 0x72, + 0x5a, 0x72, 0x56, 0x70, 0x7a, 0x74, 0x4f, 0x6f, 0x67, 0x65, 0x57, 0x51, 0x42, 0x52, 0x32, 0x43, 0x72, 0x46, + 0x6d, 0x5c, 0x0a, + 0x09, 0x4c, 0x69, 0x32, 0x33, 0x2f, 0x66, 0x78, 0x59, 0x67, 0x31, 0x69, 0x4c, 0x67, 0x49, 0x4c, 0x6f, 0x64, + 0x73, 0x2f, 0x30, 0x37, 0x47, 0x31, 0x59, 0x53, 0x37, 0x6e, 0x56, 0x59, 0x2b, 0x58, 0x55, 0x44, 0x30, 0x64, + 0x2f, 0x44, 0x56, 0x6a, 0x74, 0x47, 0x2f, 0x30, 0x65, 0x6e, 0x4c, 0x2b, 0x7a, 0x44, 0x6e, 0x39, 0x6e, 0x6e, + 0x51, 0x39, 0x72, 0x6c, 0x62, 0x51, 0x62, 0x73, 0x57, 0x5a, 0x4b, 0x36, 0x77, 0x53, 0x32, 0x59, 0x69, 0x30, + 0x66, 0x5c, 0x0a, + 0x09, 0x2f, 0x7a, 0x54, 0x52, 0x58, 0x50, 0x36, 0x6f, 0x46, 0x45, 0x43, 0x6d, 0x32, 0x43, 0x61, 0x61, 0x41, + 0x70, 0x77, 0x62, 0x42, 0x66, 0x74, 0x46, 0x67, 0x35, 0x67, 0x4f, 0x6c, 0x5a, 0x4d, 0x72, 0x2b, 0x76, 0x62, + 0x55, 0x6a, 0x66, 0x55, 0x2f, 0x48, 0x6b, 0x36, 0x4f, 0x37, 0x73, 0x32, 0x55, 0x45, 0x53, 0x55, 0x41, 0x78, + 0x64, 0x41, 0x7a, 0x75, 0x67, 0x76, 0x63, 0x69, 0x6b, 0x46, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, + 0x4a, 0x5c, 0x0a, + 0x09, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, + 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, + 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, + 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, + 0x6c, 0x5c, 0x0a, + 0x09, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, + 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, 0x42, 0x77, 0x6c, 0x41, 0x4d, 0x6c, 0x52, 0x41, 0x70, 0x41, + 0x63, 0x4a, 0x51, 0x44, 0x4a, 0x55, 0x51, 0x4b, 0x51, 0x48, 0x43, 0x55, 0x41, 0x79, 0x56, 0x45, 0x43, 0x6b, + 0x4a, 0x7a, 0x2f, 0x41, 0x37, 0x77, 0x33, 0x68, 0x35, 0x77, 0x31, 0x62, 0x6c, 0x36, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x5c, 0x0a, + 0x09, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x49, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x44, 0x30, 0x65, 0x4e, 0x54, 0x36, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x65, 0x5a, 0x52, 0x65, 0x64, 0x5a, 0x33, 0x6e, 0x38, 0x58, + 0x63, 0x71, 0x5c, 0x0a, + 0x09, 0x53, 0x55, 0x57, 0x54, 0x6b, 0x41, 0x55, 0x54, 0x49, 0x4c, 0x49, 0x4a, 0x52, 0x43, 0x56, 0x73, 0x41, + 0x72, 0x49, 0x6f, 0x71, 0x43, 0x6a, 0x64, 0x49, 0x4c, 0x59, 0x47, 0x48, 0x52, 0x5a, 0x62, 0x41, 0x52, 0x63, + 0x34, 0x4d, 0x77, 0x67, 0x32, 0x67, 0x69, 0x6a, 0x30, 0x64, 0x47, 0x50, 0x50, 0x61, 0x62, 0x46, 0x48, 0x50, + 0x45, 0x64, 0x45, 0x46, 0x42, 0x64, 0x55, 0x5a, 0x68, 0x6f, 0x50, 0x41, 0x71, 0x32, 0x79, 0x71, 0x4b, 0x67, + 0x6a, 0x5c, 0x0a, + 0x09, 0x41, 0x72, 0x49, 0x70, 0x74, 0x69, 0x41, 0x43, 0x43, 0x67, 0x46, 0x55, 0x61, 0x43, 0x55, 0x43, 0x67, + 0x59, 0x51, 0x6c, 0x4f, 0x34, 0x5a, 0x51, 0x71, 0x66, 0x6e, 0x6a, 0x57, 0x30, 0x55, 0x71, 0x53, 0x53, 0x33, + 0x50, 0x63, 0x75, 0x2f, 0x39, 0x33, 0x65, 0x58, 0x39, 0x4f, 0x75, 0x63, 0x35, 0x57, 0x61, 0x72, 0x79, 0x33, + 0x45, 0x2f, 0x51, 0x33, 0x4f, 0x2f, 0x33, 0x2b, 0x66, 0x37, 0x75, 0x2f, 0x64, 0x31, 0x78, 0x2f, 0x66, 0x33, + 0x39, 0x5c, 0x0a, + 0x09, 0x53, 0x43, 0x71, 0x74, 0x38, 0x63, 0x44, 0x73, 0x49, 0x61, 0x39, 0x5a, 0x77, 0x4f, 0x62, 0x41, 0x54, + 0x47, 0x41, 0x36, 0x4d, 0x41, 0x50, 0x59, 0x44, 0x48, 0x6a, 0x70, 0x77, 0x49, 0x38, 0x76, 0x47, 0x66, 0x4c, + 0x7a, 0x43, 0x51, 0x50, 0x66, 0x4e, 0x39, 0x54, 0x67, 0x31, 0x34, 0x64, 0x36, 0x44, 0x76, 0x6a, 0x72, 0x52, + 0x72, 0x2f, 0x33, 0x4c, 0x50, 0x41, 0x43, 0x73, 0x47, 0x4c, 0x49, 0x31, 0x77, 0x64, 0x2f, 0x76, 0x67, 0x4a, + 0x59, 0x5c, 0x0a, + 0x09, 0x43, 0x69, 0x77, 0x62, 0x2b, 0x4c, 0x35, 0x6e, 0x67, 0x4b, 0x65, 0x41, 0x4a, 0x55, 0x4e, 0x65, 0x66, + 0x52, 0x33, 0x2f, 0x6a, 0x53, 0x55, 0x56, 0x59, 0x70, 0x77, 0x4e, 0x67, 0x4a, 0x54, 0x4d, 0x44, 0x47, 0x43, + 0x37, 0x67, 0x64, 0x65, 0x32, 0x77, 0x44, 0x59, 0x44, 0x50, 0x32, 0x34, 0x4e, 0x62, 0x4d, 0x48, 0x36, 0x6f, + 0x74, 0x2b, 0x54, 0x4b, 0x6d, 0x43, 0x48, 0x2b, 0x6f, 0x48, 0x46, 0x52, 0x43, 0x4f, 0x77, 0x47, 0x48, 0x67, + 0x4d, 0x5c, 0x0a, + 0x09, 0x2b, 0x41, 0x76, 0x77, 0x36, 0x4d, 0x43, 0x50, 0x43, 0x77, 0x64, 0x2b, 0x66, 0x44, 0x5a, 0x56, 0x51, + 0x45, 0x6b, 0x32, 0x41, 0x46, 0x4b, 0x65, 0x78, 0x68, 0x46, 0x46, 0x66, 0x65, 0x36, 0x51, 0x31, 0x34, 0x34, + 0x44, 0x50, 0x2b, 0x35, 0x45, 0x66, 0x45, 0x70, 0x76, 0x73, 0x68, 0x58, 0x41, 0x77, 0x30, 0x4e, 0x65, 0x44, + 0x77, 0x31, 0x35, 0x50, 0x55, 0x6f, 0x30, 0x45, 0x70, 0x4a, 0x79, 0x59, 0x67, 0x4d, 0x67, 0x64, 0x61, 0x38, + 0x48, 0x5c, 0x0a, + 0x09, 0x65, 0x41, 0x57, 0x77, 0x43, 0x37, 0x41, 0x72, 0x4d, 0x41, 0x2f, 0x59, 0x44, 0x64, 0x67, 0x5a, 0x6d, + 0x4a, 0x49, 0x75, 0x56, 0x71, 0x57, 0x74, 0x41, 0x68, 0x34, 0x45, 0x37, 0x67, 0x4d, 0x65, 0x41, 0x42, 0x59, + 0x41, 0x39, 0x77, 0x4e, 0x2f, 0x42, 0x74, 0x61, 0x6c, 0x69, 0x79, 0x58, 0x56, 0x68, 0x77, 0x32, 0x41, 0x31, + 0x4a, 0x35, 0x65, 0x6f, 0x72, 0x6a, 0x76, 0x42, 0x65, 0x77, 0x4e, 0x37, 0x41, 0x6e, 0x73, 0x41, 0x55, 0x78, + 0x4e, 0x5c, 0x0a, + 0x09, 0x47, 0x61, 0x70, 0x42, 0x56, 0x67, 0x4b, 0x2f, 0x41, 0x2b, 0x34, 0x42, 0x37, 0x67, 0x62, 0x75, 0x49, + 0x70, 0x71, 0x45, 0x35, 0x31, 0x4f, 0x47, 0x6b, 0x71, 0x72, 0x49, 0x42, 0x6b, 0x41, 0x61, 0x57, 0x51, 0x2f, + 0x78, 0x4b, 0x66, 0x35, 0x31, 0x77, 0x50, 0x37, 0x41, 0x66, 0x73, 0x51, 0x6e, 0x2f, 0x49, 0x6b, 0x70, 0x51, + 0x32, 0x6b, 0x54, 0x61, 0x34, 0x6e, 0x70, 0x77, 0x4f, 0x30, 0x44, 0x72, 0x31, 0x38, 0x52, 0x30, 0x77, 0x4d, + 0x6e, 0x5c, 0x0a, + 0x09, 0x42, 0x64, 0x49, 0x6f, 0x62, 0x41, 0x43, 0x6b, 0x39, 0x61, 0x59, 0x43, 0x42, 0x77, 0x42, 0x76, 0x49, + 0x49, 0x72, 0x2b, 0x66, 0x73, 0x53, 0x56, 0x39, 0x71, 0x71, 0x65, 0x5a, 0x63, 0x41, 0x64, 0x52, 0x45, 0x50, + 0x77, 0x43, 0x2b, 0x41, 0x32, 0x59, 0x6e, 0x6f, 0x67, 0x61, 0x59, 0x41, 0x4e, 0x67, 0x4a, 0x70, 0x73, 0x42, + 0x76, 0x42, 0x47, 0x34, 0x45, 0x30, 0x44, 0x72, 0x37, 0x32, 0x4a, 0x57, 0x2b, 0x64, 0x55, 0x50, 0x79, 0x38, + 0x51, 0x5c, 0x0a, + 0x09, 0x79, 0x77, 0x57, 0x33, 0x44, 0x72, 0x78, 0x2b, 0x54, 0x74, 0x7a, 0x4b, 0x4b, 0x44, 0x57, 0x57, 0x44, + 0x59, 0x43, 0x61, 0x70, 0x4a, 0x66, 0x34, 0x64, 0x50, 0x2b, 0x33, 0x77, 0x43, 0x46, 0x45, 0x77, 0x61, 0x2f, + 0x61, 0x4c, 0x58, 0x62, 0x4b, 0x78, 0x6a, 0x71, 0x69, 0x49, 0x62, 0x67, 0x65, 0x75, 0x49, 0x47, 0x59, 0x45, + 0x4b, 0x78, 0x4a, 0x6d, 0x6b, 0x67, 0x71, 0x6d, 0x41, 0x32, 0x41, 0x36, 0x6d, 0x35, 0x6e, 0x34, 0x47, 0x31, + 0x45, 0x5c, 0x0a, + 0x09, 0x77, 0x54, 0x38, 0x49, 0x6d, 0x4a, 0x77, 0x32, 0x6a, 0x6b, 0x70, 0x71, 0x4e, 0x58, 0x41, 0x4c, 0x30, + 0x52, 0x42, 0x63, 0x53, 0x39, 0x78, 0x35, 0x49, 0x4e, 0x57, 0x61, 0x44, 0x59, 0x44, 0x71, 0x70, 0x70, 0x63, + 0x6f, 0x39, 0x47, 0x38, 0x48, 0x33, 0x6b, 0x48, 0x63, 0x62, 0x79, 0x2b, 0x31, 0x36, 0x32, 0x48, 0x67, 0x78, + 0x38, 0x43, 0x50, 0x69, 0x4d, 0x62, 0x41, 0x75, 0x77, 0x78, 0x55, 0x4f, 0x7a, 0x59, 0x41, 0x71, 0x6f, 0x4f, + 0x5a, 0x5c, 0x0a, + 0x09, 0x77, 0x4f, 0x48, 0x41, 0x66, 0x4f, 0x42, 0x51, 0x33, 0x47, 0x42, 0x48, 0x32, 0x56, 0x6f, 0x4a, 0x2f, + 0x42, 0x54, 0x34, 0x49, 0x58, 0x41, 0x4e, 0x37, 0x6d, 0x43, 0x6f, 0x6d, 0x72, 0x41, 0x42, 0x55, 0x46, 0x58, + 0x4e, 0x41, 0x74, 0x34, 0x46, 0x48, 0x41, 0x48, 0x38, 0x44, 0x66, 0x48, 0x4a, 0x58, 0x38, 0x72, 0x62, 0x57, + 0x75, 0x41, 0x6d, 0x34, 0x41, 0x72, 0x67, 0x2b, 0x38, 0x51, 0x7a, 0x45, 0x4b, 0x52, 0x4b, 0x73, 0x67, 0x46, + 0x51, 0x5c, 0x0a, + 0x09, 0x6c, 0x62, 0x77, 0x4d, 0x65, 0x44, 0x64, 0x77, 0x46, 0x44, 0x48, 0x6d, 0x48, 0x35, 0x38, 0x32, 0x6a, + 0x68, 0x71, 0x75, 0x6a, 0x31, 0x67, 0x65, 0x75, 0x42, 0x4c, 0x34, 0x4c, 0x76, 0x42, 0x30, 0x32, 0x6a, 0x68, + 0x53, 0x65, 0x32, 0x77, 0x41, 0x56, 0x48, 0x5a, 0x54, 0x67, 0x48, 0x63, 0x43, 0x78, 0x78, 0x44, 0x6a, 0x66, + 0x54, 0x66, 0x68, 0x55, 0x52, 0x6d, 0x74, 0x42, 0x61, 0x34, 0x44, 0x4c, 0x69, 0x65, 0x57, 0x43, 0x64, 0x78, + 0x7a, 0x5c, 0x0a, + 0x09, 0x51, 0x4b, 0x56, 0x6e, 0x41, 0x36, 0x41, 0x79, 0x47, 0x67, 0x2b, 0x38, 0x46, 0x54, 0x69, 0x57, 0x4b, + 0x50, 0x37, 0x75, 0x70, 0x36, 0x38, 0x71, 0x57, 0x51, 0x58, 0x38, 0x41, 0x4c, 0x69, 0x4d, 0x75, 0x48, 0x62, + 0x41, 0x52, 0x79, 0x4f, 0x72, 0x6c, 0x47, 0x77, 0x41, 0x56, 0x43, 0x59, 0x37, 0x41, 0x52, 0x38, 0x45, 0x54, + 0x67, 0x42, 0x65, 0x6e, 0x6a, 0x61, 0x4b, 0x6c, 0x49, 0x6e, 0x48, 0x67, 0x59, 0x73, 0x48, 0x58, 0x67, 0x38, + 0x6e, 0x5c, 0x0a, + 0x09, 0x7a, 0x69, 0x4a, 0x74, 0x77, 0x41, 0x5a, 0x41, 0x71, 0x55, 0x30, 0x42, 0x6a, 0x67, 0x61, 0x4f, 0x4a, + 0x33, 0x62, 0x6c, 0x47, 0x35, 0x63, 0x32, 0x6a, 0x70, 0x53, 0x4c, 0x66, 0x6d, 0x4c, 0x33, 0x77, 0x59, 0x75, + 0x4a, 0x43, 0x77, 0x68, 0x58, 0x70, 0x59, 0x30, 0x6a, 0x32, 0x51, 0x41, 0x6f, 0x6e, 0x56, 0x32, 0x41, 0x6b, + 0x34, 0x44, 0x33, 0x34, 0x33, 0x37, 0x37, 0x61, 0x70, 0x5a, 0x6c, 0x77, 0x43, 0x58, 0x41, 0x31, 0x34, 0x69, + 0x48, 0x5c, 0x0a, + 0x09, 0x47, 0x45, 0x6c, 0x4a, 0x32, 0x41, 0x43, 0x6f, 0x53, 0x4a, 0x4f, 0x49, 0x32, 0x2f, 0x5a, 0x4f, 0x49, + 0x76, 0x62, 0x65, 0x6c, 0x35, 0x72, 0x75, 0x56, 0x71, 0x49, 0x52, 0x75, 0x42, 0x71, 0x33, 0x49, 0x6c, 0x62, + 0x42, 0x62, 0x41, 0x42, 0x55, 0x68, 0x4b, 0x32, 0x41, 0x44, 0x77, 0x4d, 0x6e, 0x41, 0x6c, 0x73, 0x6d, 0x7a, + 0x69, 0x4b, 0x56, 0x30, 0x5a, 0x50, 0x41, 0x4e, 0x34, 0x43, 0x76, 0x41, 0x6b, 0x38, 0x6b, 0x7a, 0x71, 0x4b, + 0x47, 0x5c, 0x0a, + 0x09, 0x73, 0x41, 0x46, 0x51, 0x6e, 0x76, 0x59, 0x47, 0x54, 0x67, 0x50, 0x2b, 0x6e, 0x76, 0x6a, 0x30, 0x4c, + 0x32, 0x6c, 0x30, 0x61, 0x34, 0x44, 0x76, 0x41, 0x46, 0x38, 0x6b, 0x48, 0x6c, 0x59, 0x6b, 0x35, 0x63, 0x59, + 0x47, 0x51, 0x46, 0x6e, 0x72, 0x49, 0x62, 0x62, 0x6b, 0x50, 0x5a, 0x33, 0x59, 0x72, 0x45, 0x64, 0x53, 0x5a, + 0x32, 0x34, 0x42, 0x7a, 0x69, 0x65, 0x32, 0x49, 0x46, 0x36, 0x58, 0x4f, 0x49, 0x74, 0x71, 0x79, 0x41, 0x5a, + 0x41, 0x5c, 0x0a, + 0x09, 0x57, 0x65, 0x6b, 0x6c, 0x37, 0x74, 0x73, 0x2f, 0x45, 0x35, 0x69, 0x58, 0x4f, 0x49, 0x74, 0x55, 0x4a, + 0x77, 0x38, 0x41, 0x35, 0x78, 0x4c, 0x37, 0x43, 0x76, 0x68, 0x51, 0x49, 0x6d, 0x58, 0x47, 0x42, 0x6b, 0x44, + 0x64, 0x32, 0x67, 0x7a, 0x34, 0x48, 0x38, 0x51, 0x6e, 0x2f, 0x6d, 0x30, 0x53, 0x5a, 0x35, 0x48, 0x71, 0x37, + 0x46, 0x46, 0x69, 0x49, 0x6e, 0x41, 0x52, 0x73, 0x43, 0x4a, 0x78, 0x46, 0x74, 0x57, 0x41, 0x44, 0x59, 0x41, + 0x36, 0x5c, 0x0a, + 0x09, 0x4e, 0x52, 0x33, 0x34, 0x4b, 0x48, 0x41, 0x71, 0x73, 0x48, 0x6e, 0x69, 0x4c, 0x46, 0x4b, 0x54, 0x50, + 0x41, 0x4e, 0x63, 0x51, 0x46, 0x77, 0x6e, 0x73, 0x44, 0x52, 0x78, 0x46, 0x6c, 0x57, 0x59, 0x44, 0x59, 0x44, + 0x61, 0x4e, 0x5a, 0x4f, 0x34, 0x73, 0x4f, 0x38, 0x30, 0x59, 0x45, 0x62, 0x69, 0x4c, 0x46, 0x4b, 0x54, 0x4c, + 0x53, 0x57, 0x61, 0x67, 0x43, 0x2f, 0x69, 0x49, 0x34, 0x72, 0x56, 0x41, 0x52, 0x73, 0x41, 0x74, 0x57, 0x6f, + 0x6d, 0x5c, 0x0a, + 0x09, 0x4d, 0x65, 0x59, 0x2f, 0x46, 0x54, 0x66, 0x75, 0x6b, 0x63, 0x70, 0x6b, 0x47, 0x54, 0x45, 0x52, 0x2b, + 0x41, 0x49, 0x78, 0x48, 0x5a, 0x42, 0x61, 0x59, 0x67, 0x4f, 0x67, 0x73, 0x55, 0x77, 0x6c, 0x52, 0x76, 0x30, + 0x66, 0x78, 0x30, 0x2f, 0x38, 0x55, 0x70, 0x6b, 0x74, 0x42, 0x63, 0x34, 0x6a, 0x47, 0x67, 0x47, 0x66, 0x52, + 0x71, 0x67, 0x78, 0x32, 0x51, 0x42, 0x6f, 0x4a, 0x4c, 0x33, 0x45, 0x6a, 0x6e, 0x31, 0x6e, 0x34, 0x65, 0x59, + 0x39, 0x5c, 0x0a, + 0x09, 0x55, 0x70, 0x55, 0x73, 0x42, 0x6a, 0x35, 0x4e, 0x37, 0x44, 0x44, 0x6f, 0x58, 0x51, 0x4d, 0x61, 0x6b, + 0x51, 0x32, 0x41, 0x4e, 0x74, 0x59, 0x44, 0x76, 0x41, 0x38, 0x34, 0x47, 0x39, 0x67, 0x2b, 0x63, 0x52, 0x5a, + 0x4a, 0x6e, 0x58, 0x73, 0x45, 0x2b, 0x43, 0x54, 0x78, 0x33, 0x41, 0x48, 0x33, 0x45, 0x64, 0x41, 0x6d, 0x62, + 0x41, 0x41, 0x30, 0x31, 0x47, 0x48, 0x41, 0x5a, 0x34, 0x41, 0x39, 0x55, 0x77, 0x65, 0x52, 0x6c, 0x4a, 0x6c, + 0x37, 0x5c, 0x0a, + 0x09, 0x67, 0x58, 0x38, 0x45, 0x72, 0x6b, 0x30, 0x64, 0x52, 0x4f, 0x56, 0x69, 0x41, 0x79, 0x43, 0x49, 0x4a, + 0x2f, 0x4f, 0x64, 0x52, 0x7a, 0x51, 0x41, 0x6b, 0x75, 0x72, 0x70, 0x57, 0x75, 0x4a, 0x61, 0x48, 0x70, 0x39, + 0x41, 0x4b, 0x43, 0x44, 0x47, 0x76, 0x57, 0x71, 0x75, 0x4f, 0x63, 0x42, 0x58, 0x67, 0x4e, 0x39, 0x69, 0x38, + 0x5a, 0x66, 0x71, 0x37, 0x6a, 0x44, 0x69, 0x33, 0x2f, 0x72, 0x58, 0x69, 0x58, 0x2f, 0x37, 0x61, 0x6a, 0x67, + 0x6e, 0x5c, 0x0a, + 0x09, 0x41, 0x4d, 0x30, 0x30, 0x67, 0x62, 0x69, 0x64, 0x37, 0x33, 0x2f, 0x68, 0x6c, 0x66, 0x31, 0x53, 0x45, + 0x79, 0x30, 0x44, 0x2f, 0x6f, 0x33, 0x59, 0x51, 0x2b, 0x43, 0x46, 0x78, 0x46, 0x6d, 0x55, 0x69, 0x41, 0x31, + 0x41, 0x38, 0x78, 0x77, 0x4d, 0x66, 0x49, 0x6b, 0x59, 0x2b, 0x30, 0x74, 0x71, 0x74, 0x76, 0x75, 0x4a, 0x44, + 0x77, 0x4d, 0x2f, 0x53, 0x78, 0x31, 0x45, 0x78, 0x58, 0x4d, 0x4a, 0x6f, 0x44, 0x6d, 0x32, 0x41, 0x36, 0x34, + 0x67, 0x5c, 0x0a, + 0x09, 0x2f, 0x71, 0x46, 0x62, 0x2f, 0x43, 0x56, 0x42, 0x6e, 0x41, 0x74, 0x75, 0x41, 0x4b, 0x34, 0x6b, 0x7a, + 0x68, 0x46, 0x71, 0x45, 0x42, 0x75, 0x41, 0x2b, 0x70, 0x73, 0x41, 0x66, 0x49, 0x78, 0x34, 0x6f, 0x74, 0x68, + 0x52, 0x69, 0x62, 0x4e, 0x49, 0x4b, 0x71, 0x63, 0x6a, 0x69, 0x58, 0x50, 0x45, 0x78, 0x34, 0x6c, 0x7a, 0x68, + 0x68, 0x72, 0x41, 0x4a, 0x59, 0x42, 0x36, 0x65, 0x77, 0x33, 0x77, 0x66, 0x34, 0x42, 0x39, 0x55, 0x67, 0x65, + 0x52, 0x5c, 0x0a, + 0x09, 0x56, 0x42, 0x6c, 0x33, 0x45, 0x6b, 0x2f, 0x34, 0x76, 0x43, 0x64, 0x31, 0x45, 0x4f, 0x58, 0x4c, 0x43, + 0x55, 0x41, 0x39, 0x76, 0x52, 0x51, 0x34, 0x68, 0x2f, 0x69, 0x48, 0x62, 0x50, 0x47, 0x58, 0x31, 0x49, 0x35, + 0x39, 0x67, 0x46, 0x38, 0x54, 0x65, 0x34, 0x4b, 0x38, 0x4e, 0x48, 0x45, 0x57, 0x35, 0x63, 0x67, 0x4a, 0x51, + 0x50, 0x32, 0x38, 0x6d, 0x62, 0x6a, 0x4e, 0x35, 0x31, 0x57, 0x4a, 0x63, 0x30, 0x69, 0x71, 0x76, 0x6a, 0x38, + 0x41, 0x5c, 0x0a, + 0x09, 0x48, 0x77, 0x4a, 0x75, 0x54, 0x70, 0x78, 0x44, 0x4f, 0x58, 0x41, 0x43, 0x55, 0x42, 0x38, 0x7a, 0x67, + 0x49, 0x75, 0x41, 0x47, 0x37, 0x48, 0x34, 0x53, 0x38, 0x72, 0x47, 0x71, 0x34, 0x68, 0x7a, 0x79, 0x6b, 0x56, + 0x34, 0x79, 0x33, 0x44, 0x74, 0x4f, 0x41, 0x47, 0x6f, 0x68, 0x79, 0x4f, 0x49, 0x57, 0x2f, 0x74, 0x65, 0x6e, + 0x6a, 0x71, 0x49, 0x70, 0x4e, 0x70, 0x61, 0x42, 0x4a, 0x77, 0x43, 0x58, 0x4a, 0x30, 0x36, 0x69, 0x4c, 0x4a, + 0x68, 0x5c, 0x0a, + 0x09, 0x41, 0x31, 0x42, 0x74, 0x67, 0x7a, 0x76, 0x35, 0x2f, 0x62, 0x66, 0x55, 0x51, 0x53, 0x51, 0x31, 0x78, + 0x76, 0x65, 0x42, 0x44, 0x78, 0x4d, 0x4e, 0x67, 0x53, 0x72, 0x4d, 0x42, 0x71, 0x43, 0x36, 0x6a, 0x67, 0x49, + 0x75, 0x42, 0x47, 0x61, 0x6c, 0x44, 0x69, 0x4b, 0x70, 0x63, 0x5a, 0x34, 0x43, 0x54, 0x69, 0x62, 0x32, 0x44, + 0x31, 0x42, 0x46, 0x65, 0x51, 0x31, 0x41, 0x39, 0x55, 0x77, 0x6e, 0x48, 0x75, 0x39, 0x35, 0x42, 0x52, 0x5a, + 0x2f, 0x5c, 0x0a, + 0x09, 0x53, 0x57, 0x6e, 0x4d, 0x49, 0x73, 0x35, 0x42, 0x6c, 0x78, 0x44, 0x6e, 0x4a, 0x46, 0x57, 0x51, 0x45, + 0x34, 0x42, 0x71, 0x65, 0x51, 0x74, 0x77, 0x4d, 0x62, 0x42, 0x39, 0x36, 0x69, 0x43, 0x53, 0x4e, 0x47, 0x41, + 0x68, 0x38, 0x45, 0x48, 0x67, 0x70, 0x73, 0x51, 0x35, 0x31, 0x43, 0x59, 0x6e, 0x41, 0x4e, 0x55, 0x77, 0x45, + 0x66, 0x67, 0x73, 0x73, 0x57, 0x57, 0x6e, 0x78, 0x56, 0x39, 0x53, 0x6d, 0x57, 0x78, 0x48, 0x6e, 0x4a, 0x73, + 0x2b, 0x5c, 0x0a, + 0x09, 0x53, 0x35, 0x79, 0x72, 0x56, 0x42, 0x46, 0x4f, 0x41, 0x4d, 0x70, 0x76, 0x4a, 0x2b, 0x41, 0x2f, 0x67, + 0x48, 0x31, 0x54, 0x42, 0x35, 0x47, 0x6b, 0x4d, 0x66, 0x77, 0x61, 0x65, 0x43, 0x2f, 0x77, 0x63, 0x4f, 0x6f, + 0x67, 0x47, 0x70, 0x73, 0x54, 0x67, 0x48, 0x49, 0x37, 0x42, 0x72, 0x67, 0x4c, 0x69, 0x37, 0x2b, 0x6b, 0x61, + 0x74, 0x69, 0x58, 0x4f, 0x47, 0x63, 0x64, 0x6b, 0x7a, 0x71, 0x49, 0x78, 0x6d, 0x59, 0x44, 0x55, 0x45, 0x35, + 0x54, 0x5c, 0x0a, + 0x09, 0x67, 0x57, 0x38, 0x43, 0x6c, 0x77, 0x48, 0x54, 0x30, 0x6b, 0x61, 0x52, 0x70, 0x4c, 0x5a, 0x4d, 0x49, + 0x38, 0x35, 0x64, 0x33, 0x79, 0x54, 0x4f, 0x5a, 0x53, 0x6f, 0x70, 0x6c, 0x77, 0x44, 0x4b, 0x5a, 0x78, 0x36, + 0x78, 0x30, 0x63, 0x62, 0x4f, 0x71, 0x59, 0x4e, 0x49, 0x55, 0x70, 0x63, 0x65, 0x4a, 0x4a, 0x34, 0x30, 0x65, + 0x48, 0x2f, 0x71, 0x49, 0x4e, 0x71, 0x55, 0x45, 0x34, 0x42, 0x79, 0x4f, 0x52, 0x61, 0x34, 0x41, 0x34, 0x75, + 0x2f, 0x5c, 0x0a, + 0x09, 0x70, 0x48, 0x72, 0x59, 0x47, 0x62, 0x69, 0x64, 0x4f, 0x4c, 0x65, 0x70, 0x5a, 0x47, 0x77, 0x41, 0x79, + 0x6d, 0x45, 0x53, 0x73, 0x61, 0x50, 0x66, 0x70, 0x54, 0x67, 0x79, 0x6b, 0x31, 0x51, 0x76, 0x55, 0x34, 0x6c, + 0x7a, 0x32, 0x31, 0x65, 0x49, 0x63, 0x35, 0x31, 0x4b, 0x77, 0x69, 0x57, 0x41, 0x39, 0x4c, 0x59, 0x6e, 0x64, + 0x74, 0x50, 0x79, 0x73, 0x62, 0x32, 0x53, 0x36, 0x75, 0x35, 0x4f, 0x59, 0x68, 0x66, 0x54, 0x52, 0x31, 0x49, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x52, 0x4f, 0x41, 0x31, 0x41, 0x34, 0x69, 0x62, 0x70, 0x75, 0x78, 0x2b, 0x45, 0x74, 0x71, 0x67, + 0x6e, 0x32, 0x49, 0x63, 0x39, 0x35, 0x42, 0x71, 0x59, 0x50, 0x49, 0x42, 0x69, 0x43, 0x6c, 0x55, 0x34, 0x44, + 0x72, 0x67, 0x64, 0x6d, 0x70, 0x67, 0x30, 0x68, 0x53, 0x67, 0x57, 0x59, 0x54, 0x35, 0x37, 0x36, 0x50, 0x70, + 0x41, 0x37, 0x53, 0x64, 0x43, 0x34, 0x42, 0x46, 0x47, 0x38, 0x53, 0x38, 0x52, 0x43, 0x66, 0x34, 0x31, 0x4d, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x61, 0x54, 0x45, 0x4c, 0x69, 0x59, 0x65, 0x4b, 0x72, 0x51, 0x6d, 0x64, 0x5a, 0x41, 0x6d, 0x73, + 0x67, 0x45, 0x6f, 0x31, 0x6c, 0x62, 0x41, 0x39, 0x34, 0x44, 0x58, 0x70, 0x51, 0x34, 0x69, 0x53, 0x53, 0x58, + 0x78, 0x4b, 0x2b, 0x4b, 0x52, 0x35, 0x6b, 0x2b, 0x6b, 0x44, 0x74, 0x49, 0x30, 0x4e, 0x67, 0x44, 0x46, 0x32, + 0x51, 0x58, 0x34, 0x45, 0x62, 0x42, 0x44, 0x36, 0x69, 0x43, 0x53, 0x56, 0x44, 0x4a, 0x2f, 0x41, 0x75, 0x59, + 0x44, 0x5c, 0x0a, + 0x09, 0x43, 0x31, 0x49, 0x48, 0x61, 0x52, 0x4b, 0x76, 0x41, 0x53, 0x6a, 0x47, 0x57, 0x34, 0x42, 0x66, 0x59, + 0x50, 0x47, 0x58, 0x70, 0x4f, 0x48, 0x73, 0x41, 0x50, 0x77, 0x63, 0x4f, 0x44, 0x68, 0x31, 0x6b, 0x43, 0x61, + 0x78, 0x41, 0x63, 0x6a, 0x66, 0x42, 0x34, 0x42, 0x72, 0x67, 0x5a, 0x6d, 0x70, 0x67, 0x30, 0x68, 0x53, 0x69, + 0x63, 0x30, 0x45, 0x66, 0x6b, 0x4b, 0x63, 0x4d, 0x31, 0x55, 0x41, 0x47, 0x34, 0x44, 0x38, 0x6a, 0x41, 0x4d, + 0x2b, 0x5c, 0x0a, + 0x09, 0x53, 0x56, 0x7a, 0x6b, 0x30, 0x70, 0x73, 0x32, 0x69, 0x69, 0x52, 0x56, 0x51, 0x69, 0x39, 0x78, 0x7a, + 0x76, 0x77, 0x6b, 0x63, 0x51, 0x35, 0x56, 0x6a, 0x72, 0x77, 0x47, 0x49, 0x42, 0x2b, 0x39, 0x77, 0x45, 0x58, + 0x41, 0x2b, 0x31, 0x4d, 0x48, 0x6b, 0x61, 0x53, 0x4b, 0x2b, 0x68, 0x62, 0x77, 0x33, 0x34, 0x48, 0x6e, 0x55, + 0x77, 0x65, 0x70, 0x4b, 0x78, 0x75, 0x41, 0x37, 0x4d, 0x30, 0x45, 0x72, 0x69, 0x4c, 0x57, 0x2f, 0x53, 0x56, + 0x4a, 0x5c, 0x0a, + 0x09, 0x6e, 0x62, 0x73, 0x5a, 0x4f, 0x41, 0x4a, 0x34, 0x4e, 0x6e, 0x47, 0x4f, 0x57, 0x72, 0x49, 0x42, 0x79, + 0x4e, 0x59, 0x4f, 0x77, 0x49, 0x2b, 0x4a, 0x4a, 0x2f, 0x70, 0x4a, 0x6b, 0x72, 0x72, 0x33, 0x41, 0x50, 0x42, + 0x32, 0x34, 0x6b, 0x34, 0x42, 0x5a, 0x63, 0x68, 0x72, 0x41, 0x4c, 0x4c, 0x7a, 0x57, 0x75, 0x41, 0x2f, 0x73, + 0x66, 0x68, 0x4c, 0x55, 0x70, 0x62, 0x6d, 0x45, 0x65, 0x64, 0x57, 0x74, 0x30, 0x7a, 0x50, 0x6d, 0x41, 0x31, + 0x41, 0x5c, 0x0a, + 0x09, 0x4e, 0x74, 0x34, 0x4d, 0x33, 0x41, 0x68, 0x73, 0x6d, 0x54, 0x69, 0x48, 0x4a, 0x4e, 0x58, 0x52, 0x6c, + 0x73, 0x44, 0x50, 0x69, 0x48, 0x4f, 0x74, 0x4d, 0x6d, 0x49, 0x44, 0x30, 0x4c, 0x33, 0x35, 0x77, 0x50, 0x38, + 0x44, 0x70, 0x71, 0x55, 0x4f, 0x49, 0x6b, 0x6b, 0x31, 0x4e, 0x6f, 0x32, 0x34, 0x54, 0x58, 0x42, 0x2b, 0x36, + 0x69, 0x42, 0x31, 0x59, 0x51, 0x50, 0x51, 0x6e, 0x57, 0x4f, 0x42, 0x71, 0x34, 0x47, 0x58, 0x70, 0x67, 0x34, + 0x69, 0x5c, 0x0a, + 0x09, 0x53, 0x51, 0x33, 0x77, 0x45, 0x75, 0x4b, 0x63, 0x65, 0x31, 0x7a, 0x71, 0x49, 0x48, 0x56, 0x67, 0x41, + 0x39, 0x43, 0x35, 0x66, 0x79, 0x42, 0x75, 0x55, 0x35, 0x6d, 0x51, 0x4f, 0x6f, 0x67, 0x6b, 0x4e, 0x63, 0x67, + 0x45, 0x34, 0x42, 0x4c, 0x69, 0x48, 0x4b, 0x77, 0x75, 0x32, 0x41, 0x42, 0x30, 0x35, 0x75, 0x50, 0x41, 0x6c, + 0x33, 0x47, 0x6a, 0x43, 0x6b, 0x6c, 0x4b, 0x59, 0x52, 0x78, 0x78, 0x44, 0x6a, 0x34, 0x6a, 0x64, 0x5a, 0x41, + 0x71, 0x5c, 0x0a, + 0x09, 0x73, 0x77, 0x46, 0x6f, 0x33, 0x7a, 0x38, 0x44, 0x6e, 0x30, 0x73, 0x64, 0x51, 0x70, 0x4c, 0x45, 0x75, + 0x63, 0x51, 0x35, 0x57, 0x52, 0x32, 0x77, 0x41, 0x57, 0x6a, 0x50, 0x76, 0x77, 0x4c, 0x6e, 0x70, 0x41, 0x34, + 0x68, 0x53, 0x58, 0x72, 0x52, 0x4f, 0x63, 0x44, 0x5a, 0x71, 0x55, 0x4e, 0x55, 0x6b, 0x52, 0x73, 0x42, 0x74, + 0x65, 0x34, 0x63, 0x37, 0x44, 0x51, 0x6c, 0x71, 0x61, 0x77, 0x2b, 0x41, 0x35, 0x79, 0x56, 0x4f, 0x6b, 0x53, + 0x56, 0x5c, 0x0a, + 0x09, 0x4f, 0x41, 0x46, 0x6f, 0x7a, 0x61, 0x65, 0x78, 0x2b, 0x45, 0x74, 0x53, 0x6d, 0x66, 0x30, 0x7a, 0x63, + 0x61, 0x35, 0x57, 0x69, 0x32, 0x77, 0x41, 0x78, 0x76, 0x61, 0x76, 0x32, 0x46, 0x56, 0x4b, 0x55, 0x68, 0x57, + 0x63, 0x52, 0x54, 0x78, 0x4a, 0x55, 0x43, 0x31, 0x77, 0x43, 0x57, 0x42, 0x30, 0x5a, 0x32, 0x46, 0x48, 0x4b, + 0x55, 0x6c, 0x56, 0x38, 0x77, 0x6d, 0x38, 0x58, 0x6d, 0x74, 0x4d, 0x4e, 0x67, 0x41, 0x6a, 0x2b, 0x78, 0x68, + 0x77, 0x5c, 0x0a, + 0x09, 0x58, 0x75, 0x6f, 0x51, 0x6b, 0x71, 0x53, 0x4f, 0x6e, 0x49, 0x48, 0x6e, 0x38, 0x46, 0x48, 0x5a, 0x41, + 0x41, 0x7a, 0x76, 0x48, 0x34, 0x68, 0x37, 0x54, 0x43, 0x56, 0x4a, 0x31, 0x58, 0x55, 0x4b, 0x38, 0x4a, 0x58, + 0x55, 0x49, 0x63, 0x72, 0x4b, 0x42, 0x6d, 0x42, 0x54, 0x78, 0x78, 0x49, 0x37, 0x2f, 0x4c, 0x6e, 0x4a, 0x6a, + 0x79, 0x52, 0x56, 0x57, 0x7a, 0x2f, 0x77, 0x50, 0x75, 0x43, 0x79, 0x31, 0x45, 0x48, 0x4b, 0x79, 0x41, 0x5a, + 0x67, 0x5c, 0x0a, + 0x09, 0x51, 0x34, 0x63, 0x44, 0x56, 0x2b, 0x48, 0x32, 0x76, 0x70, 0x4a, 0x55, 0x46, 0x79, 0x38, 0x41, 0x52, + 0x77, 0x4c, 0x58, 0x70, 0x41, 0x35, 0x53, 0x4e, 0x6a, 0x59, 0x41, 0x36, 0x78, 0x30, 0x4d, 0x2f, 0x42, 0x43, + 0x59, 0x6e, 0x44, 0x71, 0x49, 0x4a, 0x43, 0x6c, 0x54, 0x71, 0x34, 0x6d, 0x6e, 0x43, 0x4e, 0x36, 0x59, 0x4f, + 0x6b, 0x69, 0x5a, 0x32, 0x41, 0x43, 0x45, 0x66, 0x59, 0x48, 0x72, 0x67, 0x65, 0x6d, 0x70, 0x67, 0x30, 0x69, + 0x53, 0x5c, 0x0a, + 0x09, 0x63, 0x72, 0x45, 0x4d, 0x4f, 0x42, 0x53, 0x34, 0x49, 0x33, 0x57, 0x51, 0x73, 0x72, 0x41, 0x42, 0x67, + 0x4c, 0x6e, 0x41, 0x4c, 0x34, 0x48, 0x5a, 0x71, 0x59, 0x4e, 0x49, 0x6b, 0x6e, 0x4b, 0x31, 0x42, 0x44, 0x67, + 0x41, 0x65, 0x43, 0x68, 0x31, 0x6b, 0x44, 0x4a, 0x6f, 0x2b, 0x6b, 0x5a, 0x41, 0x73, 0x34, 0x47, 0x66, 0x59, + 0x50, 0x47, 0x58, 0x70, 0x43, 0x62, 0x77, 0x6e, 0x44, 0x39, 0x45, 0x6b, 0x78, 0x75, 0x41, 0x79, 0x63, 0x53, + 0x61, 0x5c, 0x0a, + 0x09, 0x2f, 0x39, 0x7a, 0x55, 0x51, 0x53, 0x52, 0x4a, 0x68, 0x5a, 0x6d, 0x4c, 0x31, 0x33, 0x73, 0x42, 0x7a, + 0x57, 0x30, 0x41, 0x78, 0x67, 0x50, 0x2f, 0x41, 0x65, 0x79, 0x66, 0x4f, 0x6f, 0x67, 0x6b, 0x71, 0x58, 0x44, + 0x37, 0x45, 0x7a, 0x56, 0x67, 0x66, 0x4f, 0x6f, 0x67, 0x4b, 0x54, 0x57, 0x31, 0x41, 0x66, 0x67, 0x53, 0x63, + 0x63, 0x75, 0x66, 0x4a, 0x4b, 0x6d, 0x5a, 0x44, 0x69, 0x64, 0x71, 0x51, 0x57, 0x4d, 0x31, 0x73, 0x51, 0x45, + 0x34, 0x5c, 0x0a, + 0x09, 0x48, 0x54, 0x67, 0x35, 0x64, 0x51, 0x68, 0x4a, 0x55, 0x6e, 0x49, 0x6e, 0x45, 0x39, 0x75, 0x2b, 0x4e, + 0x31, 0x4c, 0x54, 0x37, 0x67, 0x49, 0x34, 0x48, 0x4c, 0x69, 0x61, 0x68, 0x6f, 0x39, 0x39, 0x4a, 0x45, 0x6b, + 0x76, 0x36, 0x67, 0x4f, 0x4f, 0x6f, 0x49, 0x45, 0x62, 0x42, 0x54, 0x57, 0x70, 0x41, 0x64, 0x67, 0x64, 0x75, + 0x41, 0x33, 0x59, 0x4c, 0x48, 0x55, 0x51, 0x53, 0x56, 0x4b, 0x70, 0x72, 0x43, 0x52, 0x75, 0x44, 0x37, 0x77, + 0x33, 0x5c, 0x0a, + 0x09, 0x64, 0x5a, 0x41, 0x69, 0x4e, 0x61, 0x55, 0x42, 0x32, 0x41, 0x72, 0x34, 0x4e, 0x62, 0x42, 0x4e, 0x36, + 0x69, 0x43, 0x53, 0x70, 0x46, 0x4a, 0x36, 0x46, 0x4e, 0x67, 0x50, 0x57, 0x4a, 0x51, 0x36, 0x53, 0x46, 0x47, + 0x61, 0x63, 0x41, 0x31, 0x41, 0x4c, 0x2f, 0x41, 0x39, 0x4c, 0x50, 0x36, 0x53, 0x70, 0x4a, 0x46, 0x74, 0x51, + 0x39, 0x53, 0x4b, 0x33, 0x74, 0x52, 0x42, 0x69, 0x74, 0x4b, 0x45, 0x42, 0x75, 0x42, 0x43, 0x34, 0x48, 0x57, + 0x70, 0x5c, 0x0a, + 0x09, 0x51, 0x30, 0x69, 0x53, 0x53, 0x6d, 0x39, 0x2f, 0x6f, 0x6d, 0x59, 0x30, 0x51, 0x74, 0x30, 0x62, 0x67, + 0x49, 0x38, 0x41, 0x4a, 0x36, 0x51, 0x4f, 0x49, 0x55, 0x6d, 0x71, 0x6a, 0x42, 0x4f, 0x49, 0x32, 0x6c, 0x46, + 0x37, 0x64, 0x62, 0x34, 0x47, 0x34, 0x43, 0x44, 0x67, 0x4f, 0x68, 0x6f, 0x30, 0x7a, 0x70, 0x45, 0x6b, 0x5a, + 0x65, 0x4a, 0x35, 0x34, 0x73, 0x46, 0x42, 0x74, 0x36, 0x51, 0x4f, 0x6b, 0x71, 0x65, 0x36, 0x4e, 0x67, 0x44, + 0x62, 0x5c, 0x0a, + 0x09, 0x41, 0x72, 0x2f, 0x42, 0x2f, 0x5a, 0x34, 0x6c, 0x53, 0x5a, 0x31, 0x5a, 0x41, 0x75, 0x77, 0x44, 0x4c, + 0x45, 0x77, 0x64, 0x4a, 0x43, 0x39, 0x31, 0x58, 0x41, 0x4c, 0x6f, 0x42, 0x61, 0x37, 0x43, 0x34, 0x69, 0x39, + 0x4a, 0x36, 0x74, 0x78, 0x73, 0x34, 0x45, 0x70, 0x71, 0x50, 0x45, 0x57, 0x75, 0x59, 0x77, 0x4e, 0x77, 0x50, + 0x72, 0x42, 0x76, 0x36, 0x68, 0x43, 0x53, 0x70, 0x4d, 0x72, 0x62, 0x6c, 0x36, 0x67, 0x70, 0x74, 0x56, 0x53, + 0x33, 0x5c, 0x0a, + 0x09, 0x4a, 0x59, 0x44, 0x33, 0x41, 0x70, 0x65, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x70, 0x56, 0x6a, 0x69, + 0x49, 0x63, 0x48, 0x31, 0x55, 0x71, 0x64, 0x47, 0x6f, 0x42, 0x35, 0x77, 0x42, 0x33, 0x41, 0x31, 0x4e, 0x52, + 0x42, 0x4a, 0x45, 0x6d, 0x31, 0x73, 0x6f, 0x71, 0x59, 0x42, 0x6a, 0x79, 0x51, 0x4f, 0x6b, 0x69, 0x57, 0x36, + 0x72, 0x49, 0x45, 0x4d, 0x49, 0x56, 0x59, 0x39, 0x37, 0x66, 0x34, 0x53, 0x35, 0x4b, 0x79, 0x56, 0x73, 0x73, + 0x61, 0x5c, 0x0a, + 0x09, 0x55, 0x35, 0x63, 0x47, 0x34, 0x4d, 0x76, 0x45, 0x42, 0x45, 0x43, 0x53, 0x70, 0x44, 0x7a, 0x4d, 0x6f, + 0x32, 0x61, 0x50, 0x44, 0x36, 0x37, 0x44, 0x45, 0x73, 0x41, 0x78, 0x77, 0x47, 0x57, 0x70, 0x51, 0x30, 0x69, + 0x53, 0x47, 0x75, 0x45, 0x34, 0x61, 0x6c, 0x4a, 0x7a, 0x71, 0x74, 0x34, 0x41, 0x37, 0x41, 0x54, 0x63, 0x42, + 0x55, 0x78, 0x4c, 0x48, 0x55, 0x53, 0x53, 0x31, 0x41, 0x6a, 0x4c, 0x67, 0x62, 0x32, 0x42, 0x68, 0x31, 0x4d, + 0x48, 0x5c, 0x0a, + 0x09, 0x36, 0x56, 0x61, 0x56, 0x6c, 0x77, 0x42, 0x36, 0x69, 0x61, 0x73, 0x79, 0x4c, 0x66, 0x36, 0x53, 0x70, + 0x4b, 0x4a, 0x4d, 0x41, 0x37, 0x35, 0x4e, 0x44, 0x66, 0x59, 0x48, 0x71, 0x48, 0x49, 0x44, 0x38, 0x4c, 0x2f, + 0x78, 0x66, 0x6e, 0x39, 0x4a, 0x55, 0x76, 0x48, 0x32, 0x49, 0x57, 0x70, 0x51, 0x70, 0x56, 0x56, 0x31, 0x43, + 0x65, 0x41, 0x74, 0x77, 0x41, 0x31, 0x55, 0x75, 0x34, 0x47, 0x52, 0x4a, 0x46, 0x56, 0x58, 0x50, 0x2f, 0x41, + 0x33, 0x5c, 0x0a, + 0x09, 0x77, 0x45, 0x32, 0x70, 0x67, 0x33, 0x53, 0x71, 0x69, 0x67, 0x33, 0x41, 0x44, 0x4f, 0x43, 0x33, 0x77, + 0x48, 0x61, 0x70, 0x67, 0x30, 0x69, 0x53, 0x47, 0x6d, 0x30, 0x68, 0x38, 0x42, 0x70, 0x67, 0x61, 0x65, 0x6f, + 0x67, 0x6e, 0x61, 0x6a, 0x69, 0x4a, 0x2b, 0x67, 0x4c, 0x73, 0x50, 0x68, 0x4c, 0x6b, 0x74, 0x4c, 0x62, 0x6a, + 0x71, 0x68, 0x4a, 0x6c, 0x56, 0x53, 0x31, 0x43, 0x63, 0x42, 0x52, 0x77, 0x42, 0x57, 0x70, 0x51, 0x30, 0x69, + 0x53, 0x5c, 0x0a, + 0x09, 0x4e, 0x4d, 0x54, 0x52, 0x78, 0x49, 0x4f, 0x44, 0x4b, 0x71, 0x56, 0x4b, 0x44, 0x63, 0x41, 0x63, 0x34, + 0x46, 0x37, 0x67, 0x5a, 0x61, 0x6d, 0x44, 0x53, 0x4a, 0x49, 0x30, 0x78, 0x4e, 0x50, 0x41, 0x37, 0x73, 0x43, + 0x69, 0x31, 0x45, 0x48, 0x61, 0x55, 0x61, 0x55, 0x6c, 0x67, 0x4b, 0x39, 0x6a, 0x38, 0x5a, 0x63, 0x6b, 0x6c, + 0x63, 0x2f, 0x4c, 0x69, 0x42, 0x70, 0x56, 0x4b, 0x56, 0x56, 0x70, 0x41, 0x4e, 0x34, 0x44, 0x7a, 0x45, 0x38, + 0x64, 0x5c, 0x0a, + 0x09, 0x51, 0x70, 0x4b, 0x6b, 0x45, 0x63, 0x77, 0x6e, 0x64, 0x71, 0x61, 0x74, 0x6a, 0x43, 0x6f, 0x73, 0x41, + 0x57, 0x77, 0x42, 0x4c, 0x41, 0x42, 0x6d, 0x70, 0x51, 0x34, 0x69, 0x53, 0x64, 0x49, 0x6f, 0x6e, 0x67, 0x4a, + 0x32, 0x42, 0x52, 0x61, 0x6e, 0x44, 0x74, 0x4b, 0x4b, 0x4b, 0x6b, 0x77, 0x41, 0x76, 0x6f, 0x4c, 0x46, 0x58, + 0x35, 0x4a, 0x55, 0x66, 0x72, 0x4f, 0x49, 0x6d, 0x6c, 0x55, 0x4a, 0x5a, 0x57, 0x38, 0x41, 0x6a, 0x68, 0x70, + 0x34, 0x5c, 0x0a, + 0x09, 0x53, 0x5a, 0x4a, 0x55, 0x42, 0x5a, 0x57, 0x70, 0x57, 0x32, 0x56, 0x65, 0x41, 0x70, 0x67, 0x42, 0x33, + 0x45, 0x39, 0x63, 0x2f, 0x53, 0x39, 0x4a, 0x55, 0x6c, 0x55, 0x73, 0x41, 0x6e, 0x61, 0x68, 0x35, 0x42, 0x73, + 0x45, 0x6c, 0x58, 0x6b, 0x43, 0x63, 0x41, 0x34, 0x57, 0x66, 0x30, 0x6c, 0x53, 0x39, 0x63, 0x77, 0x42, 0x50, + 0x70, 0x4d, 0x36, 0x78, 0x46, 0x6a, 0x4b, 0x4f, 0x67, 0x46, 0x34, 0x50, 0x66, 0x41, 0x4c, 0x79, 0x74, 0x32, + 0x67, 0x5c, 0x0a, + 0x09, 0x53, 0x4a, 0x49, 0x30, 0x6b, 0x6e, 0x58, 0x41, 0x47, 0x34, 0x46, 0x66, 0x70, 0x67, 0x34, 0x79, 0x6b, + 0x6a, 0x49, 0x32, 0x41, 0x42, 0x4f, 0x42, 0x4f, 0x34, 0x45, 0x39, 0x55, 0x67, 0x65, 0x52, 0x4a, 0x4b, 0x6b, + 0x4c, 0x76, 0x79, 0x4f, 0x65, 0x48, 0x4c, 0x67, 0x32, 0x64, 0x5a, 0x44, 0x68, 0x6c, 0x50, 0x45, 0x54, 0x39, + 0x75, 0x6c, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x31, 0x62, 0x63, 0x48, 0x38, 0x4c, 0x48, 0x55, 0x49, 0x55, 0x5a, + 0x53, 0x5c, 0x0a, + 0x09, 0x74, 0x67, 0x6e, 0x41, 0x64, 0x73, 0x41, 0x44, 0x77, 0x4f, 0x54, 0x55, 0x51, 0x53, 0x52, 0x4a, 0x79, + 0x73, 0x42, 0x71, 0x59, 0x42, 0x37, 0x78, 0x35, 0x4d, 0x42, 0x53, 0x4b, 0x64, 0x73, 0x45, 0x34, 0x48, 0x4e, + 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x39, 0x54, 0x47, 0x5a, 0x71, 0x47, 0x32, 0x6c, 0x55, 0x36, 0x59, 0x4a, 0x77, + 0x46, 0x75, 0x41, 0x47, 0x31, 0x4f, 0x48, 0x6b, 0x43, 0x51, 0x70, 0x42, 0x34, 0x63, 0x41, 0x4e, 0x36, 0x51, + 0x4f, 0x5c, 0x0a, + 0x09, 0x4d, 0x56, 0x52, 0x5a, 0x47, 0x6f, 0x43, 0x4a, 0x77, 0x44, 0x33, 0x45, 0x66, 0x5a, 0x4f, 0x53, 0x4a, + 0x4e, 0x58, 0x4e, 0x67, 0x38, 0x51, 0x31, 0x41, 0x61, 0x57, 0x35, 0x49, 0x4c, 0x41, 0x73, 0x53, 0x77, 0x43, + 0x6e, 0x59, 0x76, 0x47, 0x58, 0x4a, 0x4e, 0x58, 0x58, 0x7a, 0x6b, 0x53, 0x74, 0x4b, 0x34, 0x30, 0x79, 0x54, + 0x41, 0x43, 0x32, 0x42, 0x50, 0x34, 0x41, 0x54, 0x45, 0x73, 0x64, 0x52, 0x4a, 0x4b, 0x6b, 0x48, 0x43, 0x30, + 0x48, 0x5c, 0x0a, + 0x09, 0x58, 0x67, 0x30, 0x38, 0x6b, 0x54, 0x6f, 0x49, 0x6c, 0x47, 0x4d, 0x43, 0x63, 0x44, 0x59, 0x57, 0x66, + 0x30, 0x6c, 0x53, 0x2f, 0x55, 0x30, 0x6a, 0x61, 0x6c, 0x34, 0x70, 0x70, 0x4a, 0x34, 0x41, 0x37, 0x45, 0x71, + 0x73, 0x2f, 0x55, 0x39, 0x49, 0x47, 0x55, 0x4b, 0x53, 0x70, 0x49, 0x4c, 0x30, 0x41, 0x58, 0x73, 0x43, 0x39, + 0x36, 0x55, 0x4f, 0x6b, 0x6e, 0x6f, 0x43, 0x38, 0x44, 0x6b, 0x73, 0x2f, 0x70, 0x4b, 0x6b, 0x35, 0x68, 0x67, + 0x50, 0x5c, 0x0a, + 0x09, 0x6e, 0x4a, 0x73, 0x36, 0x42, 0x4b, 0x52, 0x74, 0x41, 0x41, 0x34, 0x42, 0x44, 0x6b, 0x74, 0x34, 0x66, + 0x45, 0x6d, 0x53, 0x55, 0x6a, 0x67, 0x4d, 0x65, 0x47, 0x76, 0x71, 0x45, 0x4b, 0x6d, 0x57, 0x41, 0x4d, 0x59, + 0x44, 0x64, 0x77, 0x4f, 0x37, 0x70, 0x7a, 0x69, 0x34, 0x4a, 0x45, 0x6d, 0x4a, 0x33, 0x55, 0x63, 0x73, 0x42, + 0x66, 0x53, 0x6c, 0x43, 0x70, 0x42, 0x71, 0x41, 0x76, 0x41, 0x2b, 0x4c, 0x50, 0x36, 0x53, 0x70, 0x4f, 0x62, + 0x61, 0x5c, 0x0a, + 0x09, 0x6a, 0x61, 0x69, 0x46, 0x79, 0x61, 0x53, 0x59, 0x41, 0x45, 0x77, 0x43, 0x66, 0x67, 0x39, 0x73, 0x58, + 0x2f, 0x53, 0x42, 0x4a, 0x55, 0x6b, 0x71, 0x6b, 0x55, 0x65, 0x49, 0x32, 0x77, 0x4c, 0x58, 0x70, 0x44, 0x68, + 0x34, 0x69, 0x67, 0x6e, 0x41, 0x69, 0x56, 0x6a, 0x38, 0x4a, 0x55, 0x6e, 0x61, 0x48, 0x6a, 0x67, 0x70, 0x31, + 0x63, 0x47, 0x4c, 0x6e, 0x67, 0x42, 0x4d, 0x41, 0x52, 0x34, 0x6d, 0x4e, 0x76, 0x2b, 0x52, 0x4a, 0x4b, 0x6e, + 0x70, 0x5c, 0x0a, + 0x09, 0x46, 0x67, 0x4e, 0x7a, 0x67, 0x52, 0x56, 0x46, 0x48, 0x37, 0x6a, 0x6f, 0x43, 0x63, 0x42, 0x48, 0x73, + 0x66, 0x68, 0x4c, 0x6b, 0x6a, 0x52, 0x6f, 0x43, 0x2b, 0x43, 0x30, 0x46, 0x41, 0x63, 0x75, 0x63, 0x67, 0x49, + 0x77, 0x45, 0x2f, 0x67, 0x54, 0x4d, 0x4c, 0x32, 0x6f, 0x41, 0x30, 0x71, 0x53, 0x56, 0x41, 0x48, 0x4c, 0x67, + 0x42, 0x32, 0x41, 0x5a, 0x34, 0x73, 0x38, 0x61, 0x4a, 0x45, 0x54, 0x67, 0x4e, 0x4f, 0x78, 0x2b, 0x45, 0x75, + 0x53, 0x5c, 0x0a, + 0x09, 0x74, 0x4c, 0x48, 0x70, 0x77, 0x4d, 0x65, 0x4b, 0x50, 0x6d, 0x68, 0x52, 0x45, 0x34, 0x41, 0x5a, 0x77, + 0x4a, 0x2b, 0x78, 0x41, 0x5a, 0x41, 0x6b, 0x61, 0x54, 0x69, 0x46, 0x54, 0x77, 0x47, 0x4b, 0x6d, 0x67, 0x42, + 0x38, 0x46, 0x49, 0x75, 0x2f, 0x4a, 0x45, 0x6b, 0x6a, 0x6d, 0x55, 0x37, 0x55, 0x79, 0x73, 0x49, 0x55, 0x4d, + 0x51, 0x47, 0x59, 0x51, 0x61, 0x7a, 0x39, 0x7a, 0x38, 0x6a, 0x37, 0x51, 0x4a, 0x49, 0x6b, 0x56, 0x64, 0x67, + 0x79, 0x5c, 0x0a, + 0x09, 0x34, 0x42, 0x58, 0x41, 0x30, 0x69, 0x49, 0x4f, 0x56, 0x73, 0x51, 0x45, 0x34, 0x44, 0x51, 0x73, 0x2f, + 0x70, 0x49, 0x6b, 0x6a, 0x57, 0x55, 0x36, 0x63, 0x62, 0x31, 0x63, 0x49, 0x66, 0x4b, 0x65, 0x41, 0x45, 0x77, + 0x46, 0x46, 0x68, 0x4a, 0x33, 0x41, 0x45, 0x69, 0x53, 0x70, 0x4e, 0x45, 0x74, 0x42, 0x62, 0x59, 0x46, 0x56, + 0x75, 0x5a, 0x39, 0x6f, 0x4c, 0x77, 0x6e, 0x41, 0x43, 0x64, 0x69, 0x38, 0x5a, 0x63, 0x6b, 0x71, 0x56, 0x55, + 0x7a, 0x5c, 0x0a, + 0x09, 0x67, 0x41, 0x38, 0x56, 0x63, 0x61, 0x41, 0x38, 0x4a, 0x77, 0x43, 0x39, 0x78, 0x4b, 0x35, 0x2f, 0x32, + 0x2b, 0x52, 0x31, 0x41, 0x45, 0x6d, 0x53, 0x61, 0x75, 0x67, 0x78, 0x59, 0x45, 0x66, 0x67, 0x2b, 0x54, 0x77, + 0x50, 0x6b, 0x75, 0x63, 0x45, 0x34, 0x46, 0x67, 0x73, 0x2f, 0x70, 0x49, 0x6b, 0x74, 0x57, 0x74, 0x72, 0x34, + 0x4c, 0x69, 0x38, 0x44, 0x35, 0x4c, 0x58, 0x42, 0x4b, 0x43, 0x48, 0x65, 0x4e, 0x62, 0x78, 0x76, 0x44, 0x7a, + 0x65, 0x5c, 0x0a, + 0x09, 0x58, 0x4a, 0x4b, 0x6b, 0x6d, 0x6e, 0x73, 0x51, 0x32, 0x42, 0x56, 0x59, 0x6c, 0x39, 0x63, 0x42, 0x38, + 0x70, 0x6f, 0x41, 0x7a, 0x4d, 0x66, 0x69, 0x4c, 0x30, 0x6c, 0x53, 0x70, 0x33, 0x59, 0x6d, 0x61, 0x6d, 0x6c, + 0x75, 0x38, 0x6d, 0x6f, 0x41, 0x43, 0x74, 0x33, 0x4d, 0x51, 0x4a, 0x4b, 0x6b, 0x47, 0x73, 0x71, 0x31, 0x6c, + 0x75, 0x61, 0x78, 0x42, 0x4c, 0x41, 0x58, 0x63, 0x46, 0x66, 0x57, 0x62, 0x79, 0x70, 0x4a, 0x55, 0x67, 0x50, + 0x74, 0x5c, 0x0a, + 0x09, 0x44, 0x64, 0x79, 0x64, 0x78, 0x78, 0x76, 0x6e, 0x4d, 0x51, 0x48, 0x77, 0x30, 0x37, 0x38, 0x6b, 0x53, + 0x64, 0x6e, 0x49, 0x72, 0x61, 0x5a, 0x6d, 0x50, 0x51, 0x47, 0x59, 0x51, 0x7a, 0x7a, 0x30, 0x70, 0x7a, 0x66, + 0x4c, 0x4e, 0x35, 0x55, 0x6b, 0x71, 0x61, 0x47, 0x65, 0x4a, 0x37, 0x59, 0x48, 0x58, 0x70, 0x54, 0x31, 0x47, + 0x32, 0x63, 0x39, 0x41, 0x66, 0x67, 0x77, 0x46, 0x6e, 0x39, 0x4a, 0x6b, 0x72, 0x4c, 0x53, 0x53, 0x39, 0x54, + 0x57, 0x5c, 0x0a, + 0x09, 0x7a, 0x47, 0x55, 0x35, 0x41, 0x65, 0x67, 0x46, 0x48, 0x67, 0x56, 0x6d, 0x5a, 0x2f, 0x57, 0x47, 0x6b, + 0x69, 0x53, 0x4a, 0x4a, 0x63, 0x53, 0x2b, 0x4f, 0x70, 0x6c, 0x75, 0x44, 0x4a, 0x54, 0x6c, 0x42, 0x4f, 0x42, + 0x49, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x47, 0x56, 0x74, 0x4e, 0x6c, 0x46, 0x6a, 0x4d, 0x35, 0x56, 0x6c, 0x41, + 0x33, 0x42, 0x53, 0x68, 0x75, 0x38, 0x6c, 0x53, 0x5a, 0x4c, 0x57, 0x4f, 0x7a, 0x6e, 0x72, 0x4e, 0x38, 0x78, + 0x71, 0x5c, 0x0a, + 0x09, 0x43, 0x57, 0x41, 0x58, 0x59, 0x45, 0x45, 0x57, 0x62, 0x79, 0x52, 0x4a, 0x6b, 0x6f, 0x61, 0x31, 0x47, + 0x78, 0x6e, 0x57, 0x32, 0x71, 0x77, 0x6d, 0x41, 0x4a, 0x6c, 0x33, 0x4a, 0x70, 0x49, 0x6b, 0x61, 0x51, 0x4f, + 0x5a, 0x54, 0x74, 0x71, 0x7a, 0x6d, 0x41, 0x42, 0x4d, 0x49, 0x53, 0x37, 0x2b, 0x6d, 0x39, 0x46, 0x39, 0x48, + 0x45, 0x6d, 0x53, 0x4e, 0x49, 0x4b, 0x6c, 0x77, 0x4c, 0x62, 0x41, 0x79, 0x69, 0x7a, 0x65, 0x4c, 0x49, 0x73, + 0x4a, 0x5c, 0x0a, + 0x09, 0x77, 0x4e, 0x46, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x79, 0x74, 0x73, 0x4d, 0x6f, 0x75, 0x5a, 0x6d, 0x49, + 0x6f, 0x73, 0x47, 0x34, 0x50, 0x67, 0x4d, 0x33, 0x6b, 0x4f, 0x53, 0x4a, 0x49, 0x33, 0x74, 0x68, 0x4b, 0x7a, + 0x65, 0x71, 0x4e, 0x73, 0x6c, 0x67, 0x46, 0x63, 0x43, 0x76, 0x77, 0x66, 0x47, 0x5a, 0x52, 0x4e, 0x48, 0x6b, + 0x69, 0x53, 0x4e, 0x6f, 0x68, 0x39, 0x34, 0x4e, 0x66, 0x44, 0x48, 0x62, 0x74, 0x2b, 0x6f, 0x32, 0x77, 0x6e, + 0x41, 0x5c, 0x0a, + 0x09, 0x42, 0x37, 0x48, 0x34, 0x53, 0x35, 0x4a, 0x55, 0x6c, 0x48, 0x46, 0x45, 0x37, 0x65, 0x33, 0x2b, 0x6a, + 0x62, 0x71, 0x59, 0x41, 0x50, 0x51, 0x41, 0x6a, 0x78, 0x43, 0x37, 0x45, 0x30, 0x6d, 0x53, 0x70, 0x47, 0x49, + 0x38, 0x42, 0x6d, 0x77, 0x50, 0x39, 0x48, 0x58, 0x7a, 0x4a, 0x74, 0x31, 0x4d, 0x41, 0x41, 0x37, 0x42, 0x34, + 0x69, 0x39, 0x4a, 0x55, 0x74, 0x47, 0x32, 0x42, 0x67, 0x37, 0x74, 0x39, 0x6b, 0x32, 0x36, 0x61, 0x51, 0x44, + 0x65, 0x5c, 0x0a, + 0x09, 0x33, 0x2b, 0x33, 0x42, 0x4a, 0x55, 0x6c, 0x53, 0x52, 0x34, 0x37, 0x72, 0x39, 0x67, 0x30, 0x36, 0x58, + 0x51, 0x4b, 0x59, 0x41, 0x6a, 0x77, 0x35, 0x38, 0x4b, 0x4d, 0x6b, 0x53, 0x53, 0x72, 0x57, 0x4b, 0x6d, 0x44, + 0x4c, 0x67, 0x52, 0x38, 0x37, 0x30, 0x75, 0x6b, 0x45, 0x34, 0x4a, 0x31, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x53, + 0x6d, 0x55, 0x4b, 0x55, 0x59, 0x73, 0x37, 0x31, 0x6d, 0x6b, 0x44, 0x63, 0x45, 0x77, 0x33, 0x42, 0x35, 0x55, + 0x6b, 0x5c, 0x0a, + 0x09, 0x53, 0x56, 0x33, 0x72, 0x71, 0x68, 0x5a, 0x33, 0x73, 0x67, 0x51, 0x77, 0x43, 0x33, 0x67, 0x63, 0x6d, + 0x4e, 0x6a, 0x4e, 0x67, 0x53, 0x56, 0x4a, 0x55, 0x6c, 0x66, 0x57, 0x41, 0x69, 0x38, 0x48, 0x6e, 0x75, 0x72, + 0x6b, 0x44, 0x33, 0x63, 0x79, 0x41, 0x54, 0x67, 0x61, 0x69, 0x37, 0x38, 0x6b, 0x53, 0x61, 0x6c, 0x4e, 0x70, + 0x49, 0x75, 0x74, 0x67, 0x54, 0x74, 0x70, 0x41, 0x49, 0x37, 0x71, 0x39, 0x47, 0x43, 0x53, 0x4a, 0x43, 0x6c, + 0x54, 0x5c, 0x0a, + 0x09, 0x48, 0x64, 0x66, 0x6b, 0x64, 0x70, 0x63, 0x41, 0x5a, 0x67, 0x4f, 0x4c, 0x67, 0x50, 0x47, 0x64, 0x48, + 0x6c, 0x43, 0x53, 0x4a, 0x47, 0x57, 0x6d, 0x44, 0x35, 0x67, 0x44, 0x4c, 0x47, 0x6e, 0x33, 0x44, 0x37, 0x59, + 0x37, 0x41, 0x54, 0x67, 0x63, 0x69, 0x37, 0x38, 0x6b, 0x53, 0x57, 0x55, 0x78, 0x6e, 0x67, 0x37, 0x76, 0x42, + 0x6d, 0x69, 0x33, 0x41, 0x58, 0x44, 0x38, 0x4c, 0x30, 0x6c, 0x53, 0x75, 0x52, 0x7a, 0x5a, 0x79, 0x52, 0x39, + 0x71, 0x5c, 0x0a, + 0x09, 0x5a, 0x77, 0x6c, 0x67, 0x42, 0x72, 0x48, 0x35, 0x54, 0x32, 0x38, 0x6e, 0x42, 0x35, 0x49, 0x6b, 0x53, + 0x62, 0x6c, 0x59, 0x43, 0x32, 0x77, 0x42, 0x4c, 0x47, 0x33, 0x6e, 0x44, 0x37, 0x55, 0x7a, 0x41, 0x5a, 0x69, + 0x50, 0x78, 0x56, 0x2b, 0x53, 0x70, 0x4c, 0x4b, 0x5a, 0x53, 0x43, 0x7a, 0x52, 0x74, 0x36, 0x58, 0x64, 0x42, + 0x6b, 0x43, 0x53, 0x4a, 0x4a, 0x56, 0x50, 0x32, 0x7a, 0x57, 0x36, 0x31, 0x53, 0x57, 0x41, 0x53, 0x63, 0x54, + 0x34, 0x5c, 0x0a, + 0x09, 0x66, 0x33, 0x71, 0x37, 0x42, 0x35, 0x41, 0x6b, 0x53, 0x62, 0x6c, 0x62, 0x53, 0x57, 0x7a, 0x55, 0x74, + 0x36, 0x62, 0x56, 0x50, 0x39, 0x44, 0x71, 0x42, 0x4f, 0x41, 0x67, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x4a, 0x58, + 0x56, 0x56, 0x4b, 0x4a, 0x57, 0x74, 0x36, 0x7a, 0x56, 0x42, 0x75, 0x44, 0x74, 0x37, 0x57, 0x65, 0x52, 0x4a, + 0x45, 0x6b, 0x46, 0x61, 0x71, 0x74, 0x57, 0x74, 0x37, 0x6f, 0x45, 0x38, 0x42, 0x43, 0x77, 0x55, 0x30, 0x64, + 0x78, 0x5c, 0x0a, + 0x09, 0x4a, 0x45, 0x6c, 0x53, 0x45, 0x52, 0x34, 0x47, 0x35, 0x72, 0x62, 0x36, 0x7a, 0x61, 0x31, 0x4d, 0x41, + 0x48, 0x62, 0x47, 0x34, 0x69, 0x39, 0x4a, 0x55, 0x74, 0x6e, 0x74, 0x42, 0x4f, 0x7a, 0x61, 0x36, 0x6a, 0x65, + 0x33, 0x30, 0x67, 0x43, 0x38, 0x72, 0x66, 0x4d, 0x73, 0x6b, 0x69, 0x53, 0x70, 0x51, 0x47, 0x39, 0x74, 0x39, + 0x52, 0x74, 0x62, 0x61, 0x51, 0x41, 0x4f, 0x36, 0x53, 0x4b, 0x49, 0x4a, 0x45, 0x6b, 0x71, 0x54, 0x73, 0x73, + 0x31, 0x5c, 0x0a, + 0x09, 0x65, 0x36, 0x78, 0x72, 0x41, 0x43, 0x59, 0x42, 0x54, 0x77, 0x4e, 0x54, 0x75, 0x6b, 0x30, 0x6b, 0x53, + 0x5a, 0x4a, 0x79, 0x39, 0x78, 0x77, 0x77, 0x6b, 0x78, 0x5a, 0x75, 0x42, 0x78, 0x78, 0x72, 0x41, 0x76, 0x42, + 0x36, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x46, 0x58, 0x46, 0x53, 0x34, 0x45, 0x44, 0x57, 0x2f, 0x6e, 0x47, 0x73, + 0x52, 0x71, 0x41, 0x51, 0x37, 0x76, 0x50, 0x49, 0x6b, 0x6d, 0x53, 0x43, 0x74, 0x54, 0x53, 0x4d, 0x73, 0x42, + 0x59, 0x5c, 0x0a, + 0x09, 0x44, 0x59, 0x44, 0x72, 0x2f, 0x35, 0x49, 0x6b, 0x56, 0x55, 0x74, 0x4c, 0x74, 0x58, 0x75, 0x30, 0x61, + 0x77, 0x42, 0x6d, 0x45, 0x4f, 0x76, 0x2f, 0x37, 0x54, 0x34, 0x79, 0x57, 0x4a, 0x49, 0x6b, 0x70, 0x62, 0x4f, + 0x4f, 0x32, 0x42, 0x62, 0x34, 0x32, 0x64, 0x47, 0x2b, 0x61, 0x62, 0x54, 0x69, 0x66, 0x75, 0x41, 0x59, 0x58, + 0x35, 0x63, 0x6b, 0x53, 0x65, 0x58, 0x54, 0x41, 0x37, 0x79, 0x68, 0x6c, 0x57, 0x38, 0x61, 0x53, 0x56, 0x74, + 0x37, 0x5c, 0x0a, + 0x09, 0x43, 0x6b, 0x75, 0x53, 0x70, 0x4e, 0x4a, 0x34, 0x30, 0x31, 0x6a, 0x66, 0x4d, 0x46, 0x6f, 0x44, 0x4d, + 0x4f, 0x59, 0x66, 0x6c, 0x69, 0x52, 0x4a, 0x70, 0x54, 0x52, 0x6d, 0x44, 0x52, 0x2f, 0x70, 0x47, 0x6f, 0x43, + 0x70, 0x78, 0x4e, 0x72, 0x42, 0x68, 0x4b, 0x77, 0x54, 0x53, 0x5a, 0x4b, 0x6b, 0x33, 0x4c, 0x30, 0x41, 0x62, + 0x41, 0x36, 0x73, 0x47, 0x4f, 0x6b, 0x62, 0x52, 0x70, 0x6f, 0x41, 0x48, 0x49, 0x6a, 0x46, 0x58, 0x35, 0x4b, + 0x6b, 0x5c, 0x0a, + 0x09, 0x71, 0x70, 0x6f, 0x41, 0x48, 0x44, 0x44, 0x61, 0x4e, 0x34, 0x7a, 0x55, 0x41, 0x49, 0x7a, 0x36, 0x68, + 0x79, 0x52, 0x4a, 0x55, 0x75, 0x6c, 0x31, 0x31, 0x41, 0x43, 0x38, 0x50, 0x6f, 0x63, 0x67, 0x6b, 0x69, 0x53, + 0x70, 0x4f, 0x4b, 0x50, 0x57, 0x38, 0x75, 0x47, 0x75, 0x41, 0x65, 0x67, 0x42, 0x6e, 0x67, 0x47, 0x6d, 0x35, + 0x35, 0x56, 0x49, 0x6b, 0x69, 0x54, 0x6c, 0x62, 0x68, 0x6c, 0x78, 0x48, 0x63, 0x43, 0x36, 0x34, 0x62, 0x34, + 0x34, 0x5c, 0x0a, + 0x09, 0x33, 0x41, 0x52, 0x67, 0x48, 0x68, 0x5a, 0x2f, 0x53, 0x5a, 0x4b, 0x71, 0x62, 0x6a, 0x70, 0x52, 0x30, + 0x34, 0x63, 0x31, 0x58, 0x41, 0x4f, 0x77, 0x58, 0x33, 0x35, 0x5a, 0x4a, 0x45, 0x6c, 0x53, 0x67, 0x56, 0x34, + 0x33, 0x30, 0x68, 0x65, 0x47, 0x61, 0x77, 0x44, 0x32, 0x7a, 0x7a, 0x47, 0x49, 0x4a, 0x45, 0x6b, 0x71, 0x7a, + 0x72, 0x34, 0x6a, 0x66, 0x63, 0x45, 0x4a, 0x67, 0x43, 0x52, 0x4a, 0x39, 0x54, 0x58, 0x69, 0x68, 0x2f, 0x71, + 0x4e, 0x5c, 0x0a, + 0x09, 0x4c, 0x77, 0x4b, 0x63, 0x52, 0x47, 0x77, 0x61, 0x4d, 0x44, 0x48, 0x76, 0x52, 0x4a, 0x49, 0x6b, 0x4b, + 0x58, 0x64, 0x72, 0x67, 0x63, 0x32, 0x41, 0x4e, 0x52, 0x74, 0x2f, 0x59, 0x65, 0x4d, 0x4a, 0x77, 0x4b, 0x35, + 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x71, 0x6f, 0x75, 0x4a, 0x77, 0x47, 0x37, 0x44, 0x66, 0x57, 0x48, 0x6a, 0x42, + 0x6d, 0x43, 0x76, 0x2f, 0x4c, 0x4e, 0x49, 0x6b, 0x71, 0x51, 0x43, 0x44, 0x56, 0x76, 0x62, 0x62, 0x51, 0x41, + 0x6b, 0x5c, 0x0a, + 0x09, 0x53, 0x61, 0x6f, 0x33, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x68, 0x70, 0x6f, 0x37, 0x2b, 0x46, 0x2b, 0x63, + 0x2b, 0x68, 0x46, 0x67, 0x44, 0x33, 0x41, 0x63, 0x6d, 0x42, 0x4b, 0x55, 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4c, + 0x75, 0x56, 0x67, 0x48, 0x54, 0x32, 0x47, 0x68, 0x48, 0x77, 0x4b, 0x45, 0x54, 0x67, 0x42, 0x32, 0x78, 0x2b, + 0x45, 0x75, 0x53, 0x56, 0x44, 0x64, 0x54, 0x67, 0x42, 0x30, 0x32, 0x2f, 0x73, 0x32, 0x68, 0x44, 0x63, 0x43, + 0x75, 0x5c, 0x0a, + 0x09, 0x78, 0x57, 0x57, 0x52, 0x4a, 0x45, 0x6b, 0x46, 0x32, 0x6d, 0x58, 0x6a, 0x33, 0x78, 0x6a, 0x61, 0x41, + 0x41, 0x78, 0x37, 0x6d, 0x34, 0x41, 0x6b, 0x53, 0x61, 0x71, 0x38, 0x54, 0x54, 0x37, 0x6b, 0x44, 0x32, 0x30, + 0x41, 0x4e, 0x75, 0x6b, 0x4f, 0x4a, 0x45, 0x6c, 0x53, 0x4c, 0x59, 0x7a, 0x61, 0x41, 0x49, 0x7a, 0x34, 0x78, + 0x43, 0x42, 0x4a, 0x6b, 0x6c, 0x52, 0x70, 0x6d, 0x33, 0x7a, 0x49, 0x48, 0x37, 0x77, 0x4c, 0x6f, 0x49, 0x66, + 0x59, 0x5c, 0x0a, + 0x09, 0x41, 0x6e, 0x68, 0x79, 0x30, 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4c, 0x75, 0x56, 0x68, 0x4e, 0x62, 0x41, + 0x72, 0x39, 0x34, 0x4a, 0x38, 0x44, 0x67, 0x42, 0x47, 0x42, 0x72, 0x4c, 0x50, 0x36, 0x53, 0x4a, 0x4e, 0x58, + 0x56, 0x5a, 0x47, 0x44, 0x62, 0x6f, 0x62, 0x38, 0x78, 0x32, 0x41, 0x44, 0x73, 0x56, 0x48, 0x77, 0x57, 0x53, + 0x5a, 0x4a, 0x55, 0x6f, 0x41, 0x31, 0x71, 0x2f, 0x57, 0x41, 0x44, 0x38, 0x4b, 0x6f, 0x45, 0x51, 0x53, 0x52, + 0x4a, 0x5c, 0x0a, + 0x09, 0x55, 0x6e, 0x48, 0x6d, 0x44, 0x76, 0x33, 0x46, 0x59, 0x41, 0x4f, 0x77, 0x59, 0x34, 0x49, 0x67, 0x6b, + 0x69, 0x53, 0x70, 0x4f, 0x4d, 0x4d, 0x32, 0x41, 0x48, 0x4f, 0x48, 0x2b, 0x55, 0x5a, 0x4a, 0x6b, 0x6c, 0x51, + 0x66, 0x4e, 0x67, 0x43, 0x53, 0x4a, 0x44, 0x58, 0x51, 0x42, 0x74, 0x63, 0x41, 0x44, 0x4e, 0x34, 0x47, 0x75, + 0x4a, 0x79, 0x34, 0x50, 0x55, 0x43, 0x53, 0x4a, 0x4e, 0x58, 0x54, 0x4b, 0x6d, 0x44, 0x71, 0x34, 0x43, 0x39, + 0x36, 0x5c, 0x0a, + 0x09, 0x67, 0x4a, 0x6c, 0x59, 0x2f, 0x43, 0x56, 0x4a, 0x71, 0x72, 0x73, 0x70, 0x77, 0x4f, 0x61, 0x44, 0x76, + 0x2b, 0x68, 0x68, 0x6f, 0x2f, 0x73, 0x43, 0x4a, 0x55, 0x6c, 0x53, 0x62, 0x62, 0x31, 0x59, 0x38, 0x32, 0x30, + 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x44, 0x68, 0x73, 0x41, 0x53, 0x5a, 0x49, 0x61, 0x61, 0x4c, 0x76, 0x42, 0x6e, + 0x2f, 0x51, 0x4d, 0x2f, 0x59, 0x55, 0x6b, 0x53, 0x61, 0x71, 0x31, 0x62, 0x51, 0x5a, 0x2f, 0x30, 0x6a, 0x50, + 0x30, 0x5c, 0x0a, + 0x09, 0x46, 0x35, 0x49, 0x6b, 0x71, 0x64, 0x59, 0x32, 0x6d, 0x41, 0x44, 0x4d, 0x53, 0x52, 0x68, 0x45, 0x6b, + 0x69, 0x51, 0x56, 0x5a, 0x36, 0x76, 0x42, 0x6e, 0x2f, 0x51, 0x41, 0x57, 0x79, 0x51, 0x4d, 0x49, 0x6b, 0x6d, + 0x53, 0x69, 0x72, 0x50, 0x6c, 0x34, 0x45, 0x39, 0x36, 0x47, 0x4e, 0x49, 0x4e, 0x53, 0x4a, 0x4b, 0x6b, 0x57, + 0x6e, 0x76, 0x78, 0x51, 0x2f, 0x2b, 0x34, 0x2f, 0x76, 0x37, 0x2b, 0x50, 0x74, 0x5a, 0x76, 0x43, 0x53, 0x78, + 0x4a, 0x5c, 0x0a, + 0x09, 0x6b, 0x75, 0x70, 0x72, 0x48, 0x64, 0x41, 0x4c, 0x39, 0x50, 0x56, 0x67, 0x38, 0x5a, 0x63, 0x6b, 0x71, + 0x53, 0x6c, 0x36, 0x67, 0x46, 0x6d, 0x44, 0x50, 0x35, 0x45, 0x6b, 0x53, 0x63, 0x30, 0x78, 0x42, 0x32, 0x77, + 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x47, 0x69, 0x63, 0x41, 0x6b, 0x69, 0x51, 0x31, 0x30, 0x41, 0x79, 0x77, 0x41, + 0x5a, 0x41, 0x6b, 0x71, 0x57, 0x6c, 0x73, 0x41, 0x43, 0x52, 0x4a, 0x61, 0x69, 0x41, 0x62, 0x41, 0x45, 0x6d, + 0x53, 0x5c, 0x0a, + 0x09, 0x47, 0x73, 0x67, 0x47, 0x51, 0x4a, 0x4b, 0x6b, 0x42, 0x72, 0x49, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x67, + 0x57, 0x77, 0x41, 0x4a, 0x45, 0x6c, 0x71, 0x6f, 0x47, 0x6c, 0x67, 0x41, 0x79, 0x42, 0x4a, 0x55, 0x74, 0x4e, + 0x4d, 0x41, 0x68, 0x73, 0x41, 0x53, 0x5a, 0x4b, 0x61, 0x5a, 0x6a, 0x4c, 0x59, 0x41, 0x45, 0x69, 0x53, 0x31, + 0x44, 0x52, 0x54, 0x77, 0x51, 0x5a, 0x41, 0x6b, 0x71, 0x53, 0x6d, 0x63, 0x51, 0x6c, 0x41, 0x6b, 0x71, 0x51, + 0x47, 0x5c, 0x0a, + 0x09, 0x6d, 0x67, 0x49, 0x32, 0x41, 0x4a, 0x49, 0x6b, 0x4e, 0x59, 0x30, 0x4e, 0x67, 0x43, 0x52, 0x4a, 0x44, + 0x54, 0x51, 0x42, 0x62, 0x41, 0x41, 0x6b, 0x53, 0x57, 0x6f, 0x6b, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x68, 0x72, + 0x49, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x47, 0x62, 0x70, 0x42, 0x52, 0x6a, 0x58, 0x33, 0x39, 0x2f, 0x66, 0x6e, + 0x7a, 0x71, 0x4a, 0x4a, 0x45, 0x6b, 0x71, 0x31, 0x44, 0x67, 0x6e, 0x41, 0x4a, 0x49, 0x6b, 0x4e, 0x5a, 0x41, + 0x4e, 0x5c, 0x0a, + 0x09, 0x67, 0x43, 0x52, 0x4a, 0x44, 0x57, 0x51, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x41, 0x39, 0x6b, 0x41, 0x53, + 0x4a, 0x4c, 0x55, 0x4c, 0x4d, 0x2b, 0x42, 0x44, 0x59, 0x41, 0x6b, 0x53, 0x55, 0x33, 0x7a, 0x50, 0x4e, 0x67, + 0x41, 0x53, 0x4a, 0x4c, 0x55, 0x53, 0x44, 0x59, 0x41, 0x6b, 0x69, 0x51, 0x31, 0x6b, 0x41, 0x32, 0x41, 0x4a, + 0x45, 0x6e, 0x4e, 0x38, 0x67, 0x4c, 0x59, 0x41, 0x45, 0x69, 0x53, 0x31, 0x44, 0x53, 0x72, 0x77, 0x41, 0x5a, + 0x41, 0x5c, 0x0a, + 0x09, 0x6b, 0x71, 0x53, 0x6d, 0x73, 0x51, 0x47, 0x51, 0x4a, 0x4b, 0x6d, 0x42, 0x31, 0x6f, 0x41, 0x4e, 0x67, + 0x43, 0x52, 0x4a, 0x54, 0x62, 0x4d, 0x53, 0x62, 0x41, 0x41, 0x6b, 0x53, 0x57, 0x71, 0x61, 0x31, 0x57, 0x41, + 0x44, 0x49, 0x45, 0x6c, 0x53, 0x30, 0x37, 0x67, 0x45, 0x49, 0x45, 0x6c, 0x53, 0x41, 0x79, 0x30, 0x48, 0x47, + 0x77, 0x42, 0x4a, 0x6b, 0x70, 0x70, 0x6d, 0x4b, 0x64, 0x67, 0x41, 0x53, 0x4a, 0x4c, 0x55, 0x4e, 0x44, 0x59, + 0x41, 0x5c, 0x0a, + 0x09, 0x6b, 0x69, 0x51, 0x31, 0x6b, 0x41, 0x32, 0x41, 0x4a, 0x45, 0x6b, 0x4e, 0x5a, 0x41, 0x4d, 0x67, 0x53, + 0x56, 0x49, 0x44, 0x32, 0x51, 0x42, 0x49, 0x6b, 0x74, 0x52, 0x41, 0x4e, 0x67, 0x43, 0x53, 0x4a, 0x44, 0x58, + 0x51, 0x55, 0x32, 0x41, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x30, 0x7a, 0x77, 0x42, 0x4d, 0x4b, 0x36, 0x2f, 0x76, + 0x37, 0x38, 0x50, 0x47, 0x77, 0x46, 0x4a, 0x6b, 0x70, 0x70, 0x67, 0x48, 0x64, 0x41, 0x4c, 0x39, 0x50, 0x55, + 0x77, 0x5c, 0x0a, + 0x09, 0x4d, 0x41, 0x71, 0x51, 0x4a, 0x45, 0x6d, 0x31, 0x39, 0x78, 0x54, 0x51, 0x42, 0x2f, 0x48, 0x4a, 0x2f, + 0x38, 0x6d, 0x30, 0x57, 0x53, 0x52, 0x4a, 0x55, 0x6b, 0x45, 0x57, 0x44, 0x2f, 0x37, 0x45, 0x42, 0x6b, 0x43, + 0x53, 0x70, 0x4f, 0x5a, 0x34, 0x73, 0x65, 0x62, 0x33, 0x41, 0x49, 0x73, 0x53, 0x42, 0x70, 0x45, 0x6b, 0x53, + 0x63, 0x56, 0x35, 0x59, 0x76, 0x41, 0x6e, 0x50, 0x63, 0x43, 0x6a, 0x43, 0x59, 0x4e, 0x49, 0x6b, 0x71, 0x54, + 0x69, 0x5c, 0x0a, + 0x09, 0x4c, 0x42, 0x7a, 0x38, 0x53, 0x63, 0x2f, 0x51, 0x58, 0x30, 0x69, 0x53, 0x70, 0x46, 0x70, 0x37, 0x38, + 0x55, 0x4f, 0x2f, 0x45, 0x77, 0x42, 0x4a, 0x6b, 0x70, 0x72, 0x44, 0x43, 0x59, 0x41, 0x6b, 0x53, 0x51, 0x32, + 0x30, 0x77, 0x51, 0x54, 0x67, 0x4c, 0x77, 0x6d, 0x44, 0x53, 0x4a, 0x4b, 0x6b, 0x34, 0x72, 0x7a, 0x34, 0x6f, + 0x58, 0x39, 0x63, 0x66, 0x33, 0x38, 0x2f, 0x77, 0x48, 0x4a, 0x67, 0x73, 0x32, 0x52, 0x78, 0x4a, 0x45, 0x6c, + 0x53, 0x5c, 0x0a, + 0x09, 0x33, 0x6c, 0x59, 0x42, 0x55, 0x77, 0x64, 0x2f, 0x4d, 0x62, 0x67, 0x46, 0x38, 0x4a, 0x2b, 0x54, 0x52, + 0x4a, 0x45, 0x6b, 0x53, 0x55, 0x56, 0x35, 0x65, 0x4f, 0x67, 0x76, 0x42, 0x68, 0x75, 0x41, 0x2f, 0x30, 0x6f, + 0x51, 0x52, 0x4a, 0x49, 0x6b, 0x46, 0x57, 0x66, 0x59, 0x42, 0x75, 0x44, 0x68, 0x59, 0x62, 0x35, 0x52, 0x6b, + 0x69, 0x54, 0x56, 0x78, 0x30, 0x4e, 0x44, 0x66, 0x32, 0x45, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x4d, 0x77, 0x7a, + 0x62, 0x5c, 0x0a, + 0x09, 0x41, 0x50, 0x77, 0x78, 0x51, 0x52, 0x42, 0x4a, 0x6b, 0x6c, 0x53, 0x63, 0x59, 0x52, 0x75, 0x41, 0x50, + 0x79, 0x51, 0x49, 0x49, 0x6b, 0x6d, 0x53, 0x69, 0x72, 0x50, 0x42, 0x74, 0x48, 0x2f, 0x77, 0x4e, 0x73, 0x41, + 0x65, 0x59, 0x41, 0x55, 0x77, 0x4f, 0x55, 0x55, 0x69, 0x53, 0x5a, 0x4b, 0x55, 0x71, 0x39, 0x58, 0x45, 0x37, + 0x66, 0x37, 0x72, 0x42, 0x6e, 0x39, 0x6a, 0x63, 0x41, 0x4b, 0x77, 0x44, 0x76, 0x68, 0x39, 0x69, 0x6b, 0x53, + 0x53, 0x5c, 0x0a, + 0x09, 0x4a, 0x43, 0x6c, 0x33, 0x44, 0x7a, 0x4b, 0x6b, 0x2b, 0x4d, 0x50, 0x36, 0x42, 0x67, 0x44, 0x67, 0x67, + 0x57, 0x4b, 0x7a, 0x53, 0x4a, 0x4b, 0x6b, 0x67, 0x74, 0x79, 0x2f, 0x38, 0x57, 0x2f, 0x30, 0x6a, 0x50, 0x5a, + 0x46, 0x53, 0x5a, 0x4a, 0x55, 0x43, 0x77, 0x73, 0x32, 0x2f, 0x6f, 0x32, 0x65, 0x30, 0x62, 0x34, 0x6f, 0x53, + 0x5a, 0x4a, 0x71, 0x59, 0x64, 0x51, 0x4a, 0x77, 0x48, 0x30, 0x46, 0x42, 0x70, 0x45, 0x6b, 0x53, 0x63, 0x58, + 0x5a, 0x5c, 0x0a, + 0x09, 0x35, 0x45, 0x50, 0x2b, 0x34, 0x46, 0x30, 0x41, 0x45, 0x4d, 0x33, 0x41, 0x63, 0x6d, 0x42, 0x4b, 0x6b, + 0x59, 0x6b, 0x6b, 0x53, 0x56, 0x4b, 0x75, 0x4e, 0x72, 0x6b, 0x44, 0x41, 0x44, 0x61, 0x63, 0x41, 0x4b, 0x77, + 0x44, 0x66, 0x6c, 0x74, 0x6b, 0x49, 0x6b, 0x6d, 0x53, 0x6c, 0x4c, 0x76, 0x66, 0x73, 0x56, 0x48, 0x78, 0x68, + 0x77, 0x30, 0x62, 0x41, 0x49, 0x43, 0x37, 0x69, 0x38, 0x6b, 0x69, 0x53, 0x5a, 0x49, 0x4b, 0x63, 0x74, 0x64, + 0x77, 0x5c, 0x0a, + 0x09, 0x76, 0x32, 0x6b, 0x44, 0x49, 0x45, 0x6c, 0x53, 0x76, 0x51, 0x31, 0x62, 0x32, 0x32, 0x30, 0x41, 0x4a, + 0x45, 0x6d, 0x71, 0x74, 0x33, 0x75, 0x47, 0x2b, 0x38, 0x32, 0x68, 0x46, 0x77, 0x45, 0x43, 0x54, 0x43, 0x4b, + 0x32, 0x42, 0x4a, 0x35, 0x59, 0x52, 0x43, 0x4a, 0x4a, 0x6b, 0x70, 0x53, 0x72, 0x74, 0x63, 0x51, 0x46, 0x67, + 0x47, 0x73, 0x32, 0x2f, 0x73, 0x4c, 0x47, 0x45, 0x34, 0x41, 0x31, 0x65, 0x44, 0x75, 0x67, 0x4a, 0x45, 0x6c, + 0x31, 0x5c, 0x0a, + 0x09, 0x73, 0x59, 0x42, 0x68, 0x69, 0x6a, 0x39, 0x73, 0x32, 0x67, 0x41, 0x41, 0x33, 0x4a, 0x46, 0x76, 0x46, + 0x6b, 0x6d, 0x53, 0x56, 0x4a, 0x42, 0x66, 0x6a, 0x2f, 0x51, 0x46, 0x47, 0x77, 0x42, 0x4a, 0x6b, 0x75, 0x72, + 0x72, 0x39, 0x70, 0x47, 0x2b, 0x4d, 0x46, 0x77, 0x44, 0x4d, 0x4f, 0x49, 0x33, 0x53, 0x35, 0x4b, 0x6b, 0x53, + 0x76, 0x6e, 0x56, 0x53, 0x46, 0x2f, 0x59, 0x2b, 0x43, 0x4a, 0x41, 0x69, 0x4b, 0x62, 0x67, 0x47, 0x57, 0x42, + 0x36, 0x5c, 0x0a, + 0x09, 0x6e, 0x6f, 0x6b, 0x6b, 0x53, 0x56, 0x4b, 0x75, 0x6c, 0x67, 0x47, 0x62, 0x4d, 0x38, 0x77, 0x6d, 0x51, + 0x44, 0x44, 0x38, 0x42, 0x47, 0x41, 0x64, 0x4c, 0x67, 0x4e, 0x49, 0x6b, 0x6c, 0x52, 0x31, 0x64, 0x7a, 0x42, + 0x43, 0x38, 0x59, 0x66, 0x68, 0x47, 0x77, 0x41, 0x59, 0x5a, 0x57, 0x51, 0x67, 0x53, 0x5a, 0x49, 0x71, 0x59, + 0x64, 0x52, 0x61, 0x50, 0x6c, 0x49, 0x44, 0x63, 0x46, 0x73, 0x4f, 0x51, 0x53, 0x52, 0x4a, 0x55, 0x6e, 0x46, + 0x47, 0x5c, 0x0a, + 0x09, 0x72, 0x65, 0x58, 0x44, 0x58, 0x51, 0x4d, 0x41, 0x73, 0x57, 0x6e, 0x41, 0x4d, 0x38, 0x43, 0x45, 0x50, + 0x42, 0x4a, 0x4a, 0x6b, 0x71, 0x52, 0x63, 0x39, 0x51, 0x45, 0x7a, 0x69, 0x63, 0x33, 0x39, 0x68, 0x6a, 0x58, + 0x53, 0x42, 0x47, 0x41, 0x46, 0x49, 0x7a, 0x77, 0x38, 0x51, 0x4a, 0x49, 0x6b, 0x6c, 0x64, 0x35, 0x64, 0x6a, + 0x46, 0x4c, 0x38, 0x59, 0x65, 0x51, 0x47, 0x41, 0x4f, 0x44, 0x57, 0x62, 0x4c, 0x4e, 0x49, 0x6b, 0x71, 0x53, + 0x43, 0x5c, 0x0a, + 0x09, 0x33, 0x44, 0x4c, 0x57, 0x4e, 0x34, 0x7a, 0x57, 0x41, 0x49, 0x7a, 0x35, 0x68, 0x79, 0x56, 0x4a, 0x55, + 0x69, 0x6d, 0x4e, 0x2b, 0x53, 0x46, 0x2b, 0x70, 0x47, 0x73, 0x41, 0x41, 0x47, 0x59, 0x41, 0x54, 0x7a, 0x4e, + 0x36, 0x6b, 0x79, 0x42, 0x4a, 0x6b, 0x73, 0x70, 0x6c, 0x48, 0x54, 0x41, 0x4c, 0x65, 0x48, 0x61, 0x30, 0x62, + 0x78, 0x71, 0x74, 0x75, 0x43, 0x2f, 0x46, 0x36, 0x77, 0x41, 0x6b, 0x53, 0x61, 0x71, 0x61, 0x75, 0x78, 0x6d, + 0x6a, 0x5c, 0x0a, + 0x09, 0x2b, 0x4d, 0x50, 0x59, 0x6e, 0x2b, 0x36, 0x76, 0x7a, 0x79, 0x61, 0x4c, 0x4a, 0x45, 0x6b, 0x71, 0x79, + 0x41, 0x32, 0x74, 0x66, 0x4a, 0x4d, 0x4e, 0x67, 0x43, 0x52, 0x4a, 0x39, 0x64, 0x4a, 0x53, 0x37, 0x52, 0x37, + 0x74, 0x47, 0x67, 0x43, 0x41, 0x53, 0x63, 0x52, 0x2b, 0x41, 0x4a, 0x4f, 0x7a, 0x53, 0x43, 0x52, 0x4a, 0x6b, + 0x6e, 0x4c, 0x31, 0x48, 0x48, 0x48, 0x2f, 0x2f, 0x35, 0x71, 0x78, 0x76, 0x6e, 0x47, 0x73, 0x43, 0x63, 0x41, + 0x61, 0x5c, 0x0a, + 0x09, 0x76, 0x42, 0x74, 0x41, 0x6b, 0x71, 0x53, 0x71, 0x75, 0x49, 0x55, 0x57, 0x69, 0x6a, 0x2b, 0x30, 0x64, + 0x6f, 0x57, 0x2f, 0x79, 0x77, 0x43, 0x53, 0x4a, 0x46, 0x56, 0x44, 0x79, 0x7a, 0x57, 0x37, 0x6c, 0x51, 0x62, + 0x67, 0x4a, 0x31, 0x30, 0x45, 0x6b, 0x53, 0x52, 0x4a, 0x78, 0x57, 0x6d, 0x35, 0x41, 0x52, 0x6a, 0x72, 0x47, + 0x6f, 0x42, 0x42, 0x44, 0x77, 0x45, 0x37, 0x64, 0x52, 0x78, 0x48, 0x6b, 0x69, 0x54, 0x6c, 0x37, 0x57, 0x46, + 0x67, 0x5c, 0x0a, + 0x09, 0x62, 0x71, 0x76, 0x66, 0x33, 0x4f, 0x6f, 0x6d, 0x50, 0x7a, 0x2f, 0x75, 0x4c, 0x49, 0x73, 0x6b, 0x53, + 0x53, 0x70, 0x49, 0x57, 0x37, 0x58, 0x61, 0x42, 0x6b, 0x43, 0x53, 0x70, 0x48, 0x70, 0x6f, 0x71, 0x31, 0x61, + 0x33, 0x75, 0x67, 0x51, 0x77, 0x43, 0x58, 0x67, 0x4b, 0x6d, 0x4e, 0x70, 0x4a, 0x49, 0x6b, 0x6d, 0x53, 0x6c, + 0x4b, 0x75, 0x56, 0x78, 0x50, 0x61, 0x2f, 0x4c, 0x64, 0x30, 0x42, 0x41, 0x4b, 0x31, 0x50, 0x41, 0x4e, 0x62, + 0x67, 0x5c, 0x0a, + 0x09, 0x78, 0x59, 0x43, 0x53, 0x4a, 0x4a, 0x58, 0x56, 0x64, 0x62, 0x52, 0x52, 0x2f, 0x4b, 0x47, 0x39, 0x42, + 0x2f, 0x33, 0x38, 0x71, 0x4c, 0x30, 0x73, 0x6b, 0x69, 0x53, 0x70, 0x49, 0x44, 0x39, 0x6f, 0x39, 0x77, 0x2b, + 0x30, 0x75, 0x67, 0x51, 0x41, 0x38, 0x58, 0x54, 0x41, 0x78, 0x63, 0x44, 0x45, 0x64, 0x67, 0x38, 0x69, 0x53, + 0x5a, 0x4a, 0x79, 0x73, 0x78, 0x62, 0x59, 0x6b, 0x68, 0x59, 0x65, 0x41, 0x44, 0x52, 0x55, 0x4f, 0x78, 0x4f, + 0x41, 0x5c, 0x0a, + 0x09, 0x70, 0x63, 0x44, 0x50, 0x32, 0x6e, 0x6c, 0x7a, 0x53, 0x5a, 0x4b, 0x55, 0x75, 0x78, 0x74, 0x70, 0x73, + 0x2f, 0x68, 0x44, 0x65, 0x77, 0x30, 0x41, 0x77, 0x46, 0x58, 0x74, 0x48, 0x6b, 0x43, 0x53, 0x4a, 0x4f, 0x57, + 0x71, 0x6f, 0x39, 0x72, 0x63, 0x7a, 0x68, 0x49, 0x41, 0x77, 0x47, 0x78, 0x67, 0x45, 0x54, 0x43, 0x2b, 0x6b, + 0x34, 0x4e, 0x4a, 0x6b, 0x71, 0x52, 0x4d, 0x39, 0x51, 0x46, 0x7a, 0x67, 0x43, 0x58, 0x74, 0x2f, 0x73, 0x46, + 0x32, 0x5c, 0x0a, + 0x09, 0x4a, 0x77, 0x42, 0x4c, 0x38, 0x4f, 0x46, 0x41, 0x6b, 0x69, 0x53, 0x56, 0x78, 0x61, 0x31, 0x30, 0x55, + 0x50, 0x79, 0x68, 0x2f, 0x51, 0x59, 0x41, 0x34, 0x4d, 0x70, 0x4f, 0x44, 0x69, 0x52, 0x4a, 0x6b, 0x6a, 0x4a, + 0x33, 0x52, 0x61, 0x64, 0x2f, 0x73, 0x4e, 0x30, 0x6c, 0x41, 0x49, 0x69, 0x4e, 0x42, 0x68, 0x37, 0x48, 0x75, + 0x77, 0x45, 0x6b, 0x53, 0x55, 0x70, 0x70, 0x4c, 0x66, 0x42, 0x79, 0x59, 0x71, 0x4f, 0x2b, 0x74, 0x6e, 0x55, + 0x79, 0x5c, 0x0a, + 0x09, 0x41, 0x58, 0x69, 0x4b, 0x32, 0x48, 0x42, 0x41, 0x6b, 0x69, 0x53, 0x6c, 0x63, 0x78, 0x30, 0x64, 0x46, + 0x6e, 0x2f, 0x6f, 0x72, 0x41, 0x45, 0x41, 0x75, 0x4c, 0x7a, 0x54, 0x41, 0x30, 0x71, 0x53, 0x70, 0x45, 0x78, + 0x30, 0x56, 0x59, 0x73, 0x37, 0x57, 0x51, 0x49, 0x41, 0x6d, 0x41, 0x49, 0x38, 0x4f, 0x66, 0x43, 0x6a, 0x4a, + 0x45, 0x6b, 0x71, 0x31, 0x69, 0x70, 0x69, 0x38, 0x35, 0x39, 0x56, 0x6e, 0x62, 0x35, 0x42, 0x70, 0x78, 0x4f, + 0x41, 0x5c, 0x0a, + 0x09, 0x56, 0x58, 0x53, 0x77, 0x37, 0x61, 0x41, 0x6b, 0x53, 0x63, 0x72, 0x45, 0x44, 0x2b, 0x69, 0x69, 0x2b, + 0x45, 0x50, 0x6e, 0x44, 0x51, 0x44, 0x41, 0x70, 0x64, 0x30, 0x63, 0x57, 0x4a, 0x49, 0x6b, 0x64, 0x61, 0x7a, + 0x72, 0x47, 0x74, 0x7a, 0x70, 0x45, 0x67, 0x42, 0x45, 0x38, 0x2f, 0x41, 0x49, 0x73, 0x45, 0x32, 0x33, 0x49, + 0x53, 0x52, 0x4a, 0x55, 0x73, 0x73, 0x65, 0x41, 0x37, 0x59, 0x6e, 0x4e, 0x67, 0x48, 0x71, 0x57, 0x44, 0x63, + 0x54, 0x5c, 0x0a, + 0x09, 0x67, 0x48, 0x58, 0x41, 0x4a, 0x64, 0x30, 0x63, 0x58, 0x4a, 0x49, 0x6b, 0x74, 0x65, 0x31, 0x62, 0x64, + 0x46, 0x6e, 0x38, 0x6f, 0x62, 0x73, 0x4a, 0x41, 0x4d, 0x41, 0x72, 0x67, 0x64, 0x38, 0x44, 0x34, 0x37, 0x6f, + 0x4e, 0x49, 0x6b, 0x6d, 0x53, 0x78, 0x74, 0x51, 0x50, 0x76, 0x42, 0x72, 0x34, 0x59, 0x37, 0x64, 0x76, 0x31, + 0x4d, 0x30, 0x45, 0x67, 0x49, 0x45, 0x41, 0x74, 0x33, 0x55, 0x62, 0x51, 0x70, 0x49, 0x6b, 0x74, 0x65, 0x51, + 0x32, 0x5c, 0x0a, + 0x09, 0x4d, 0x69, 0x6a, 0x2b, 0x30, 0x48, 0x30, 0x44, 0x41, 0x48, 0x42, 0x78, 0x42, 0x75, 0x38, 0x68, 0x53, + 0x5a, 0x4c, 0x47, 0x39, 0x73, 0x32, 0x73, 0x33, 0x71, 0x6a, 0x62, 0x4a, 0x51, 0x43, 0x41, 0x71, 0x63, 0x43, + 0x6a, 0x77, 0x50, 0x54, 0x75, 0x34, 0x30, 0x69, 0x53, 0x70, 0x42, 0x45, 0x73, 0x49, 0x79, 0x36, 0x38, 0x58, + 0x35, 0x6e, 0x46, 0x6d, 0x32, 0x55, 0x78, 0x41, 0x56, 0x68, 0x4a, 0x58, 0x4a, 0x41, 0x67, 0x53, 0x5a, 0x4c, + 0x79, 0x5c, 0x0a, + 0x09, 0x63, 0x79, 0x6b, 0x5a, 0x46, 0x58, 0x2f, 0x49, 0x5a, 0x67, 0x49, 0x41, 0x73, 0x43, 0x74, 0x77, 0x58, + 0x78, 0x5a, 0x76, 0x4a, 0x45, 0x6d, 0x53, 0x68, 0x72, 0x55, 0x62, 0x73, 0x43, 0x43, 0x72, 0x4e, 0x38, 0x74, + 0x69, 0x41, 0x67, 0x41, 0x52, 0x36, 0x4f, 0x63, 0x5a, 0x76, 0x5a, 0x63, 0x6b, 0x53, 0x64, 0x72, 0x51, 0x7a, + 0x38, 0x6d, 0x77, 0x2b, 0x45, 0x4e, 0x32, 0x44, 0x51, 0x44, 0x41, 0x68, 0x52, 0x6d, 0x2b, 0x6c, 0x79, 0x52, + 0x4a, 0x5c, 0x0a, + 0x09, 0x57, 0x75, 0x39, 0x72, 0x57, 0x62, 0x39, 0x68, 0x56, 0x6b, 0x73, 0x41, 0x41, 0x4c, 0x33, 0x45, 0x78, + 0x59, 0x43, 0x7a, 0x73, 0x33, 0x70, 0x44, 0x53, 0x5a, 0x4c, 0x45, 0x45, 0x75, 0x4c, 0x69, 0x76, 0x2b, 0x65, + 0x7a, 0x66, 0x4e, 0x4d, 0x73, 0x4a, 0x77, 0x44, 0x50, 0x41, 0x31, 0x2f, 0x50, 0x38, 0x50, 0x30, 0x6b, 0x53, + 0x56, 0x4c, 0x55, 0x31, 0x6b, 0x79, 0x4c, 0x50, 0x32, 0x51, 0x37, 0x41, 0x51, 0x43, 0x59, 0x41, 0x2f, 0x79, + 0x5a, 0x5c, 0x0a, + 0x09, 0x6d, 0x41, 0x5a, 0x49, 0x6b, 0x71, 0x54, 0x75, 0x50, 0x41, 0x2b, 0x38, 0x41, 0x6c, 0x69, 0x55, 0x39, + 0x52, 0x74, 0x6e, 0x4f, 0x51, 0x47, 0x41, 0x43, 0x50, 0x6a, 0x74, 0x6a, 0x4e, 0x39, 0x54, 0x6b, 0x71, 0x53, + 0x6d, 0x2b, 0x6a, 0x59, 0x35, 0x46, 0x48, 0x2f, 0x49, 0x66, 0x67, 0x49, 0x41, 0x73, 0x42, 0x64, 0x77, 0x56, + 0x39, 0x5a, 0x76, 0x4b, 0x6b, 0x6c, 0x53, 0x41, 0x2b, 0x30, 0x4e, 0x33, 0x4a, 0x33, 0x48, 0x47, 0x32, 0x63, + 0x39, 0x5c, 0x0a, + 0x09, 0x41, 0x59, 0x41, 0x49, 0x65, 0x6e, 0x4d, 0x4f, 0x37, 0x79, 0x74, 0x4a, 0x55, 0x70, 0x50, 0x63, 0x54, + 0x45, 0x37, 0x46, 0x48, 0x2f, 0x4a, 0x70, 0x41, 0x41, 0x43, 0x2b, 0x6b, 0x4e, 0x50, 0x37, 0x53, 0x70, 0x4c, + 0x55, 0x46, 0x46, 0x2f, 0x4d, 0x38, 0x38, 0x33, 0x7a, 0x57, 0x41, 0x4b, 0x41, 0x61, 0x43, 0x77, 0x57, 0x41, + 0x44, 0x76, 0x6e, 0x38, 0x65, 0x61, 0x53, 0x4a, 0x4e, 0x58, 0x63, 0x37, 0x34, 0x46, 0x64, 0x67, 0x48, 0x56, + 0x35, 0x5c, 0x0a, + 0x09, 0x48, 0x53, 0x43, 0x76, 0x43, 0x63, 0x41, 0x36, 0x34, 0x4e, 0x79, 0x63, 0x33, 0x6c, 0x75, 0x53, 0x70, + 0x4c, 0x6f, 0x37, 0x6c, 0x78, 0x79, 0x4c, 0x50, 0x2b, 0x51, 0x33, 0x41, 0x59, 0x43, 0x34, 0x46, 0x66, 0x43, + 0x2f, 0x67, 0x4b, 0x33, 0x7a, 0x4f, 0x6f, 0x41, 0x6b, 0x53, 0x54, 0x58, 0x30, 0x4f, 0x4c, 0x41, 0x44, 0x4f, + 0x64, 0x7a, 0x37, 0x50, 0x31, 0x52, 0x65, 0x45, 0x77, 0x43, 0x49, 0x34, 0x4f, 0x66, 0x6e, 0x2b, 0x50, 0x36, + 0x53, 0x5c, 0x0a, + 0x09, 0x4a, 0x4e, 0x58, 0x52, 0x2b, 0x65, 0x52, 0x63, 0x2f, 0x43, 0x48, 0x66, 0x43, 0x51, 0x44, 0x41, 0x56, + 0x47, 0x41, 0x68, 0x4d, 0x44, 0x50, 0x50, 0x67, 0x30, 0x69, 0x53, 0x56, 0x42, 0x4e, 0x4c, 0x67, 0x57, 0x33, + 0x4a, 0x38, 0x4c, 0x47, 0x2f, 0x49, 0x38, 0x6c, 0x7a, 0x41, 0x67, 0x44, 0x78, 0x46, 0x38, 0x6a, 0x31, 0x4b, + 0x6b, 0x5a, 0x4a, 0x6b, 0x6d, 0x72, 0x6b, 0x41, 0x67, 0x6f, 0x6f, 0x2f, 0x70, 0x44, 0x2f, 0x42, 0x41, 0x42, + 0x67, 0x5c, 0x0a, + 0x09, 0x42, 0x76, 0x43, 0x6e, 0x67, 0x52, 0x38, 0x6c, 0x53, 0x64, 0x4c, 0x77, 0x6c, 0x68, 0x46, 0x72, 0x2f, + 0x38, 0x38, 0x57, 0x63, 0x62, 0x43, 0x38, 0x4a, 0x77, 0x41, 0x51, 0x34, 0x34, 0x77, 0x4c, 0x43, 0x6a, 0x69, + 0x4f, 0x4a, 0x45, 0x6c, 0x56, 0x64, 0x67, 0x45, 0x46, 0x46, 0x58, 0x38, 0x6f, 0x5a, 0x67, 0x49, 0x41, 0x63, + 0x51, 0x33, 0x41, 0x6e, 0x34, 0x44, 0x70, 0x52, 0x52, 0x78, 0x4d, 0x6b, 0x71, 0x53, 0x4b, 0x57, 0x55, 0x34, + 0x38, 0x5c, 0x0a, + 0x09, 0x39, 0x4b, 0x65, 0x77, 0x42, 0x71, 0x43, 0x49, 0x43, 0x51, 0x44, 0x45, 0x58, 0x2b, 0x68, 0x4c, 0x42, + 0x52, 0x31, 0x4c, 0x6b, 0x71, 0x53, 0x71, 0x4b, 0x66, 0x54, 0x54, 0x50, 0x78, 0x51, 0x33, 0x41, 0x51, 0x44, + 0x59, 0x6e, 0x4a, 0x67, 0x43, 0x54, 0x43, 0x76, 0x71, 0x67, 0x4a, 0x49, 0x6b, 0x56, 0x63, 0x42, 0x79, 0x59, + 0x75, 0x33, 0x2f, 0x6d, 0x53, 0x49, 0x50, 0x57, 0x74, 0x51, 0x45, 0x41, 0x4f, 0x49, 0x76, 0x64, 0x6c, 0x36, + 0x42, 0x5c, 0x0a, + 0x09, 0x78, 0x35, 0x4d, 0x6b, 0x71, 0x51, 0x72, 0x4f, 0x6f, 0x2b, 0x44, 0x69, 0x44, 0x38, 0x56, 0x4f, 0x41, + 0x41, 0x41, 0x32, 0x41, 0x78, 0x34, 0x43, 0x74, 0x69, 0x6a, 0x79, 0x6f, 0x4a, 0x49, 0x6b, 0x6c, 0x64, 0x52, + 0x69, 0x59, 0x43, 0x36, 0x77, 0x6f, 0x75, 0x67, 0x44, 0x46, 0x7a, 0x6b, 0x42, 0x67, 0x50, 0x67, 0x4c, 0x6e, + 0x6c, 0x50, 0x77, 0x4d, 0x53, 0x56, 0x4a, 0x4b, 0x71, 0x74, 0x7a, 0x53, 0x46, 0x44, 0x38, 0x6f, 0x66, 0x67, + 0x4a, 0x5c, 0x0a, + 0x09, 0x41, 0x4d, 0x41, 0x6b, 0x34, 0x69, 0x6c, 0x48, 0x32, 0x78, 0x64, 0x39, 0x59, 0x45, 0x6d, 0x53, 0x53, + 0x75, 0x51, 0x52, 0x34, 0x4e, 0x58, 0x41, 0x6d, 0x68, 0x51, 0x48, 0x4c, 0x33, 0x6f, 0x43, 0x41, 0x50, 0x45, + 0x58, 0x2f, 0x57, 0x53, 0x43, 0x34, 0x30, 0x71, 0x53, 0x56, 0x43, 0x61, 0x66, 0x4a, 0x46, 0x48, 0x78, 0x68, + 0x7a, 0x51, 0x54, 0x41, 0x49, 0x44, 0x78, 0x77, 0x4e, 0x33, 0x41, 0x37, 0x69, 0x6b, 0x4f, 0x4c, 0x6b, 0x6c, + 0x53, 0x5c, 0x0a, + 0x09, 0x59, 0x76, 0x63, 0x42, 0x65, 0x77, 0x4a, 0x39, 0x71, 0x51, 0x4b, 0x6b, 0x6d, 0x41, 0x42, 0x41, 0x2f, + 0x49, 0x58, 0x50, 0x53, 0x48, 0x52, 0x73, 0x53, 0x5a, 0x4a, 0x53, 0x4f, 0x35, 0x4f, 0x45, 0x78, 0x52, 0x2f, + 0x53, 0x4e, 0x51, 0x41, 0x41, 0x31, 0x77, 0x48, 0x58, 0x4a, 0x6a, 0x79, 0x2b, 0x4a, 0x45, 0x6b, 0x70, 0x2f, + 0x4a, 0x51, 0x53, 0x31, 0x4c, 0x39, 0x55, 0x53, 0x77, 0x43, 0x44, 0x64, 0x67, 0x56, 0x2b, 0x53, 0x79, 0x77, + 0x4a, 0x5c, 0x0a, + 0x09, 0x53, 0x4a, 0x4a, 0x55, 0x64, 0x33, 0x33, 0x41, 0x58, 0x73, 0x43, 0x39, 0x71, 0x59, 0x4f, 0x6b, 0x6e, + 0x41, 0x41, 0x41, 0x4c, 0x41, 0x44, 0x2b, 0x62, 0x2b, 0x49, 0x4d, 0x6b, 0x69, 0x51, 0x56, 0x35, 0x64, 0x38, + 0x70, 0x51, 0x66, 0x47, 0x48, 0x39, 0x42, 0x4d, 0x41, 0x67, 0x43, 0x32, 0x42, 0x50, 0x2b, 0x41, 0x57, 0x77, + 0x5a, 0x4b, 0x6b, 0x65, 0x6c, 0x74, 0x4f, 0x33, 0x50, 0x62, 0x33, 0x52, 0x4f, 0x6f, 0x67, 0x6b, 0x48, 0x34, + 0x43, 0x5c, 0x0a, + 0x09, 0x41, 0x50, 0x41, 0x6b, 0x38, 0x4b, 0x6e, 0x55, 0x49, 0x53, 0x52, 0x4a, 0x79, 0x74, 0x6d, 0x6e, 0x4b, + 0x45, 0x6e, 0x78, 0x68, 0x33, 0x4a, 0x4d, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x72, 0x38, 0x44, 0x64, 0x6b, 0x34, + 0x64, 0x52, 0x4a, 0x4b, 0x6b, 0x48, 0x44, 0x77, 0x49, 0x37, 0x41, 0x47, 0x73, 0x54, 0x52, 0x31, 0x6b, 0x55, + 0x42, 0x6b, 0x6d, 0x41, 0x42, 0x44, 0x2f, 0x51, 0x55, 0x35, 0x4e, 0x48, 0x55, 0x4b, 0x53, 0x70, 0x4a, 0x79, + 0x63, 0x5c, 0x0a, + 0x09, 0x52, 0x6f, 0x6d, 0x4b, 0x50, 0x35, 0x53, 0x6e, 0x41, 0x51, 0x43, 0x34, 0x48, 0x72, 0x67, 0x69, 0x64, + 0x51, 0x68, 0x4a, 0x6b, 0x6a, 0x4a, 0x32, 0x4e, 0x58, 0x48, 0x72, 0x65, 0x36, 0x6d, 0x55, 0x5a, 0x51, 0x6c, + 0x67, 0x30, 0x48, 0x62, 0x41, 0x41, 0x38, 0x44, 0x6b, 0x31, 0x45, 0x45, 0x6b, 0x53, 0x63, 0x72, 0x41, 0x61, + 0x6d, 0x41, 0x65, 0x73, 0x44, 0x42, 0x31, 0x6b, 0x49, 0x32, 0x56, 0x61, 0x51, 0x49, 0x41, 0x38, 0x52, 0x2f, + 0x49, 0x5c, 0x0a, + 0x09, 0x43, 0x77, 0x49, 0x6c, 0x53, 0x58, 0x58, 0x78, 0x62, 0x35, 0x53, 0x77, 0x2b, 0x45, 0x50, 0x35, 0x4a, + 0x67, 0x41, 0x51, 0x46, 0x77, 0x54, 0x2b, 0x42, 0x70, 0x38, 0x54, 0x49, 0x45, 0x6d, 0x71, 0x74, 0x6e, 0x75, + 0x42, 0x31, 0x31, 0x4b, 0x79, 0x74, 0x66, 0x39, 0x42, 0x5a, 0x5a, 0x73, 0x41, 0x51, 0x50, 0x79, 0x48, 0x4f, + 0x67, 0x6c, 0x59, 0x6c, 0x7a, 0x71, 0x49, 0x4a, 0x45, 0x6b, 0x64, 0x36, 0x69, 0x64, 0x71, 0x57, 0x53, 0x6d, + 0x4c, 0x5c, 0x0a, + 0x09, 0x50, 0x35, 0x53, 0x7a, 0x41, 0x51, 0x44, 0x34, 0x4a, 0x58, 0x42, 0x52, 0x36, 0x68, 0x43, 0x53, 0x4a, + 0x48, 0x58, 0x6f, 0x47, 0x30, 0x51, 0x74, 0x4b, 0x36, 0x30, 0x79, 0x4c, 0x67, 0x45, 0x4d, 0x6d, 0x6b, 0x46, + 0x63, 0x45, 0x4c, 0x68, 0x56, 0x36, 0x69, 0x43, 0x53, 0x4a, 0x4c, 0x58, 0x68, 0x53, 0x57, 0x4a, 0x66, 0x6d, + 0x36, 0x57, 0x70, 0x67, 0x34, 0x79, 0x6d, 0x72, 0x42, 0x4d, 0x41, 0x69, 0x50, 0x39, 0x77, 0x48, 0x30, 0x6b, + 0x64, 0x5c, 0x0a, + 0x09, 0x51, 0x70, 0x4b, 0x6b, 0x4e, 0x70, 0x31, 0x43, 0x79, 0x59, 0x73, 0x2f, 0x6c, 0x4c, 0x73, 0x42, 0x41, + 0x4c, 0x68, 0x79, 0x34, 0x43, 0x56, 0x4a, 0x55, 0x68, 0x56, 0x55, 0x70, 0x6d, 0x36, 0x56, 0x65, 0x51, 0x6c, + 0x67, 0x30, 0x42, 0x62, 0x45, 0x55, 0x77, 0x4e, 0x6e, 0x70, 0x51, 0x34, 0x69, 0x53, 0x64, 0x49, 0x6f, 0x6e, + 0x69, 0x48, 0x75, 0x2b, 0x56, 0x2b, 0x63, 0x4f, 0x6b, 0x67, 0x72, 0x79, 0x6a, 0x34, 0x42, 0x67, 0x50, 0x67, + 0x50, 0x5c, 0x0a, + 0x09, 0x65, 0x58, 0x72, 0x71, 0x45, 0x4a, 0x49, 0x6b, 0x6a, 0x65, 0x45, 0x30, 0x4b, 0x6c, 0x4c, 0x38, 0x6f, + 0x52, 0x6f, 0x54, 0x67, 0x45, 0x48, 0x58, 0x41, 0x50, 0x4e, 0x54, 0x68, 0x35, 0x41, 0x6b, 0x61, 0x52, 0x67, + 0x2f, 0x42, 0x41, 0x35, 0x50, 0x48, 0x61, 0x49, 0x64, 0x56, 0x57, 0x6f, 0x41, 0x35, 0x67, 0x44, 0x33, 0x41, + 0x5a, 0x75, 0x6e, 0x44, 0x69, 0x4a, 0x4a, 0x30, 0x68, 0x44, 0x50, 0x41, 0x4c, 0x73, 0x42, 0x69, 0x31, 0x49, + 0x48, 0x5c, 0x0a, + 0x09, 0x61, 0x55, 0x63, 0x56, 0x6c, 0x67, 0x41, 0x47, 0x4c, 0x53, 0x49, 0x32, 0x56, 0x5a, 0x41, 0x6b, 0x71, + 0x55, 0x78, 0x4f, 0x6f, 0x6d, 0x4c, 0x46, 0x48, 0x36, 0x72, 0x56, 0x41, 0x45, 0x41, 0x38, 0x4c, 0x66, 0x42, + 0x62, 0x71, 0x55, 0x4e, 0x49, 0x6b, 0x6a, 0x54, 0x67, 0x55, 0x69, 0x72, 0x36, 0x4a, 0x4e, 0x73, 0x71, 0x4c, + 0x51, 0x45, 0x4d, 0x6d, 0x67, 0x48, 0x38, 0x6c, 0x6e, 0x68, 0x79, 0x6f, 0x43, 0x52, 0x4a, 0x71, 0x66, 0x77, + 0x46, 0x5c, 0x0a, + 0x09, 0x32, 0x49, 0x4d, 0x4b, 0x33, 0x50, 0x4d, 0x2f, 0x6e, 0x4b, 0x70, 0x4e, 0x41, 0x43, 0x44, 0x2b, 0x51, + 0x33, 0x2b, 0x51, 0x32, 0x47, 0x64, 0x5a, 0x6b, 0x71, 0x51, 0x55, 0x2b, 0x6f, 0x6c, 0x61, 0x56, 0x4d, 0x6e, + 0x69, 0x44, 0x39, 0x56, 0x73, 0x41, 0x41, 0x42, 0x75, 0x41, 0x73, 0x35, 0x4c, 0x48, 0x55, 0x4b, 0x53, 0x31, + 0x46, 0x69, 0x66, 0x42, 0x32, 0x35, 0x4d, 0x48, 0x61, 0x49, 0x62, 0x56, 0x56, 0x77, 0x43, 0x47, 0x4e, 0x51, + 0x4c, 0x5c, 0x0a, + 0x09, 0x33, 0x41, 0x62, 0x73, 0x6b, 0x7a, 0x71, 0x49, 0x4a, 0x4b, 0x6c, 0x52, 0x37, 0x67, 0x51, 0x4f, 0x42, + 0x4a, 0x35, 0x50, 0x48, 0x61, 0x51, 0x62, 0x56, 0x57, 0x34, 0x41, 0x41, 0x4f, 0x59, 0x43, 0x64, 0x77, 0x47, + 0x62, 0x70, 0x51, 0x34, 0x69, 0x53, 0x57, 0x71, 0x45, 0x46, 0x63, 0x44, 0x65, 0x77, 0x45, 0x4f, 0x70, 0x67, + 0x33, 0x53, 0x72, 0x71, 0x6b, 0x73, 0x41, 0x67, 0x78, 0x34, 0x43, 0x54, 0x6b, 0x34, 0x64, 0x51, 0x70, 0x4c, + 0x55, 0x5c, 0x0a, + 0x09, 0x47, 0x43, 0x64, 0x54, 0x67, 0x2b, 0x49, 0x50, 0x31, 0x57, 0x38, 0x41, 0x41, 0x43, 0x34, 0x44, 0x4c, + 0x6b, 0x6b, 0x64, 0x51, 0x70, 0x4a, 0x55, 0x65, 0x39, 0x38, 0x69, 0x61, 0x6b, 0x34, 0x74, 0x56, 0x48, 0x30, + 0x4a, 0x59, 0x4e, 0x42, 0x55, 0x34, 0x41, 0x37, 0x69, 0x49, 0x51, 0x79, 0x53, 0x4a, 0x47, 0x58, 0x74, 0x51, + 0x57, 0x42, 0x66, 0x59, 0x47, 0x58, 0x71, 0x49, 0x46, 0x6d, 0x70, 0x77, 0x77, 0x51, 0x41, 0x34, 0x6e, 0x2b, + 0x51, 0x5c, 0x0a, + 0x09, 0x6f, 0x34, 0x42, 0x56, 0x71, 0x59, 0x4e, 0x49, 0x6b, 0x6d, 0x70, 0x6e, 0x46, 0x58, 0x41, 0x6b, 0x4e, + 0x53, 0x72, 0x2b, 0x55, 0x4a, 0x38, 0x47, 0x41, 0x4f, 0x42, 0x2b, 0x34, 0x4d, 0x54, 0x55, 0x49, 0x53, 0x52, + 0x4a, 0x74, 0x66, 0x4d, 0x68, 0x6f, 0x73, 0x62, 0x55, 0x53, 0x70, 0x30, 0x61, 0x41, 0x49, 0x44, 0x4c, 0x67, + 0x61, 0x2b, 0x6d, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x6f, 0x30, 0x4c, 0x71, 0x64, 0x47, 0x36, 0x2f, 0x31, 0x42, + 0x31, 0x5c, 0x0a, + 0x09, 0x75, 0x51, 0x5a, 0x67, 0x4b, 0x50, 0x63, 0x48, 0x6b, 0x43, 0x52, 0x6c, 0x6f, 0x52, 0x62, 0x33, 0x2b, + 0x34, 0x2b, 0x6b, 0x6a, 0x67, 0x30, 0x41, 0x78, 0x48, 0x4d, 0x43, 0x37, 0x67, 0x52, 0x6d, 0x70, 0x77, 0x34, + 0x69, 0x53, 0x61, 0x71, 0x6b, 0x4a, 0x63, 0x51, 0x48, 0x79, 0x59, 0x57, 0x70, 0x67, 0x2b, 0x53, 0x6c, 0x62, + 0x6b, 0x73, 0x41, 0x67, 0x78, 0x59, 0x43, 0x52, 0x77, 0x4e, 0x72, 0x55, 0x77, 0x65, 0x52, 0x4a, 0x46, 0x58, + 0x4f, 0x5c, 0x0a, + 0x09, 0x57, 0x75, 0x44, 0x64, 0x31, 0x4c, 0x6a, 0x34, 0x51, 0x33, 0x30, 0x62, 0x41, 0x49, 0x42, 0x62, 0x67, + 0x49, 0x2b, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x71, 0x70, 0x77, 0x7a, 0x67, 0x4a, 0x74, 0x54, 0x68, 0x38, 0x68, + 0x62, 0x58, 0x5a, 0x63, 0x41, 0x68, 0x76, 0x70, 0x33, 0x34, 0x50, 0x6a, 0x55, 0x49, 0x53, 0x52, 0x4a, 0x6c, + 0x58, 0x41, 0x78, 0x63, 0x45, 0x4c, 0x71, 0x45, 0x45, 0x56, 0x6f, 0x51, 0x67, 0x50, 0x51, 0x43, 0x39, 0x77, + 0x4b, 0x5c, 0x0a, + 0x09, 0x37, 0x4a, 0x38, 0x36, 0x69, 0x43, 0x53, 0x70, 0x31, 0x47, 0x34, 0x48, 0x33, 0x6b, 0x52, 0x4e, 0x4c, + 0x2f, 0x72, 0x62, 0x57, 0x42, 0x4d, 0x61, 0x41, 0x49, 0x41, 0x35, 0x78, 0x45, 0x36, 0x42, 0x32, 0x36, 0x51, + 0x4f, 0x49, 0x6b, 0x6b, 0x71, 0x70, 0x55, 0x65, 0x4a, 0x44, 0x34, 0x71, 0x50, 0x70, 0x77, 0x35, 0x53, 0x6c, + 0x44, 0x70, 0x66, 0x41, 0x7a, 0x44, 0x55, 0x49, 0x75, 0x44, 0x76, 0x71, 0x4e, 0x6b, 0x75, 0x54, 0x70, 0x4b, + 0x6b, 0x5c, 0x0a, + 0x09, 0x54, 0x4b, 0x77, 0x69, 0x61, 0x6b, 0x52, 0x6a, 0x69, 0x6a, 0x38, 0x30, 0x70, 0x77, 0x45, 0x41, 0x75, + 0x42, 0x63, 0x34, 0x46, 0x75, 0x68, 0x4c, 0x48, 0x55, 0x53, 0x53, 0x56, 0x42, 0x70, 0x39, 0x77, 0x44, 0x46, + 0x45, 0x6a, 0x57, 0x69, 0x55, 0x4a, 0x6a, 0x55, 0x41, 0x41, 0x4e, 0x63, 0x41, 0x2f, 0x7a, 0x4e, 0x31, 0x43, + 0x45, 0x6c, 0x53, 0x61, 0x66, 0x77, 0x54, 0x55, 0x52, 0x73, 0x61, 0x70, 0x79, 0x6e, 0x58, 0x41, 0x47, 0x7a, + 0x73, 0x5c, 0x0a, + 0x09, 0x71, 0x38, 0x51, 0x7a, 0x6e, 0x53, 0x56, 0x4a, 0x7a, 0x58, 0x55, 0x68, 0x38, 0x4f, 0x48, 0x55, 0x49, + 0x56, 0x4a, 0x70, 0x61, 0x67, 0x4d, 0x77, 0x48, 0x72, 0x67, 0x61, 0x4f, 0x44, 0x78, 0x31, 0x45, 0x45, 0x6c, + 0x53, 0x45, 0x74, 0x63, 0x41, 0x52, 0x39, 0x44, 0x67, 0x5a, 0x65, 0x47, 0x6d, 0x4e, 0x67, 0x41, 0x41, 0x6b, + 0x34, 0x45, 0x62, 0x38, 0x66, 0x5a, 0x41, 0x53, 0x57, 0x71, 0x61, 0x32, 0x34, 0x47, 0x44, 0x67, 0x64, 0x57, + 0x70, 0x5c, 0x0a, + 0x09, 0x67, 0x36, 0x54, 0x55, 0x35, 0x41, 0x59, 0x41, 0x34, 0x6c, 0x6b, 0x42, 0x76, 0x77, 0x54, 0x6d, 0x70, + 0x67, 0x34, 0x69, 0x53, 0x53, 0x72, 0x45, 0x51, 0x38, 0x41, 0x42, 0x78, 0x46, 0x37, 0x2f, 0x6a, 0x64, 0x61, + 0x30, 0x69, 0x77, 0x41, 0x33, 0x74, 0x67, 0x52, 0x34, 0x47, 0x2f, 0x34, 0x66, 0x51, 0x5a, 0x4b, 0x61, 0x77, + 0x48, 0x50, 0x2b, 0x45, 0x45, 0x31, 0x76, 0x41, 0x43, 0x43, 0x36, 0x77, 0x58, 0x63, 0x41, 0x79, 0x31, 0x49, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x53, 0x54, 0x6c, 0x5a, 0x68, 0x6b, 0x77, 0x6e, 0x7a, 0x6a, 0x6e, 0x43, 0x78, 0x75, 0x41, 0x51, + 0x58, 0x63, 0x51, 0x46, 0x34, 0x4d, 0x38, 0x6c, 0x7a, 0x71, 0x49, 0x4a, 0x43, 0x6c, 0x7a, 0x66, 0x79, 0x58, + 0x4f, 0x38, 0x62, 0x65, 0x6e, 0x44, 0x6c, 0x49, 0x6d, 0x4e, 0x67, 0x44, 0x72, 0x33, 0x51, 0x69, 0x38, 0x68, + 0x77, 0x5a, 0x66, 0x45, 0x53, 0x70, 0x4a, 0x4e, 0x64, 0x51, 0x48, 0x2f, 0x44, 0x31, 0x78, 0x6a, 0x74, 0x63, + 0x51, 0x5c, 0x0a, + 0x09, 0x4e, 0x67, 0x41, 0x62, 0x75, 0x67, 0x62, 0x34, 0x41, 0x4e, 0x44, 0x6f, 0x4b, 0x79, 0x4d, 0x6c, 0x71, + 0x53, 0x62, 0x36, 0x69, 0x58, 0x4e, 0x36, 0x49, 0x7a, 0x66, 0x36, 0x47, 0x59, 0x73, 0x4e, 0x77, 0x4b, 0x59, + 0x75, 0x41, 0x30, 0x35, 0x4e, 0x48, 0x55, 0x4b, 0x53, 0x31, 0x4c, 0x56, 0x54, 0x69, 0x58, 0x4f, 0x36, 0x68, + 0x6d, 0x45, 0x44, 0x4d, 0x4c, 0x77, 0x76, 0x41, 0x32, 0x65, 0x6d, 0x44, 0x69, 0x46, 0x4a, 0x36, 0x74, 0x69, + 0x5a, 0x5c, 0x0a, + 0x09, 0x78, 0x4c, 0x6c, 0x63, 0x49, 0x37, 0x41, 0x42, 0x47, 0x4e, 0x6e, 0x6e, 0x67, 0x45, 0x2b, 0x6b, 0x44, + 0x69, 0x46, 0x4a, 0x61, 0x74, 0x75, 0x2f, 0x45, 0x4f, 0x64, 0x77, 0x6a, 0x63, 0x49, 0x47, 0x59, 0x48, 0x54, + 0x6e, 0x41, 0x47, 0x65, 0x6e, 0x44, 0x69, 0x46, 0x4a, 0x61, 0x74, 0x6e, 0x5a, 0x77, 0x4b, 0x64, 0x54, 0x68, + 0x36, 0x69, 0x43, 0x70, 0x75, 0x38, 0x45, 0x32, 0x4b, 0x70, 0x50, 0x41, 0x32, 0x65, 0x6c, 0x44, 0x69, 0x46, + 0x4a, 0x5c, 0x0a, + 0x09, 0x47, 0x74, 0x56, 0x6e, 0x38, 0x46, 0x7a, 0x64, 0x4d, 0x69, 0x63, 0x41, 0x72, 0x66, 0x6b, 0x45, 0x38, + 0x58, 0x38, 0x73, 0x53, 0x56, 0x49, 0x35, 0x57, 0x66, 0x7a, 0x62, 0x5a, 0x41, 0x50, 0x51, 0x75, 0x72, 0x4e, + 0x77, 0x4f, 0x55, 0x43, 0x53, 0x79, 0x75, 0x68, 0x54, 0x57, 0x50, 0x7a, 0x62, 0x35, 0x68, 0x4a, 0x41, 0x2b, + 0x2f, 0x36, 0x5a, 0x75, 0x44, 0x5a, 0x41, 0x6b, 0x70, 0x54, 0x65, 0x4a, 0x2f, 0x43, 0x63, 0x33, 0x42, 0x45, + 0x62, 0x5c, 0x0a, + 0x09, 0x67, 0x4d, 0x36, 0x63, 0x43, 0x58, 0x77, 0x32, 0x64, 0x51, 0x68, 0x4a, 0x61, 0x72, 0x68, 0x2f, 0x42, + 0x4d, 0x35, 0x4e, 0x48, 0x61, 0x4b, 0x71, 0x62, 0x41, 0x41, 0x36, 0x64, 0x77, 0x70, 0x77, 0x41, 0x54, 0x41, + 0x75, 0x64, 0x52, 0x42, 0x4a, 0x61, 0x70, 0x68, 0x2b, 0x59, 0x70, 0x4d, 0x66, 0x37, 0x2f, 0x50, 0x76, 0x67, + 0x67, 0x31, 0x41, 0x64, 0x34, 0x34, 0x44, 0x4c, 0x67, 0x59, 0x6d, 0x70, 0x41, 0x34, 0x69, 0x53, 0x51, 0x33, + 0x78, 0x5c, 0x0a, + 0x09, 0x41, 0x6e, 0x41, 0x38, 0x63, 0x47, 0x6e, 0x71, 0x49, 0x46, 0x56, 0x6e, 0x41, 0x39, 0x43, 0x39, 0x77, + 0x34, 0x48, 0x76, 0x41, 0x43, 0x39, 0x4a, 0x48, 0x55, 0x53, 0x53, 0x61, 0x75, 0x36, 0x76, 0x78, 0x49, 0x4e, + 0x39, 0x33, 0x4e, 0x73, 0x2f, 0x41, 0x7a, 0x59, 0x41, 0x32, 0x58, 0x67, 0x7a, 0x38, 0x58, 0x2f, 0x49, 0x7a, + 0x52, 0x4c, 0x6e, 0x6b, 0x4b, 0x53, 0x36, 0x57, 0x6b, 0x46, 0x38, 0x34, 0x4c, 0x6f, 0x35, 0x63, 0x59, 0x37, + 0x61, 0x5c, 0x0a, + 0x09, 0x73, 0x41, 0x48, 0x49, 0x7a, 0x6a, 0x37, 0x41, 0x6a, 0x34, 0x45, 0x74, 0x55, 0x67, 0x65, 0x52, 0x70, + 0x4a, 0x70, 0x5a, 0x41, 0x76, 0x77, 0x64, 0x63, 0x47, 0x66, 0x71, 0x49, 0x48, 0x56, 0x69, 0x41, 0x35, 0x43, + 0x74, 0x75, 0x63, 0x42, 0x50, 0x42, 0x6e, 0x36, 0x55, 0x4a, 0x48, 0x58, 0x76, 0x49, 0x65, 0x42, 0x74, 0x41, + 0x7a, 0x38, 0x71, 0x51, 0x32, 0x34, 0x45, 0x6c, 0x4b, 0x32, 0x48, 0x67, 0x41, 0x4f, 0x41, 0x4f, 0x31, 0x49, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x61, 0x51, 0x61, 0x75, 0x41, 0x4d, 0x34, 0x45, 0x49, 0x74, 0x2f, 0x4c, 0x6d, 0x77, 0x41, 0x73, + 0x72, 0x63, 0x45, 0x4f, 0x42, 0x6a, 0x34, 0x55, 0x65, 0x6f, 0x67, 0x6b, 0x6c, 0x52, 0x68, 0x50, 0x38, 0x4c, + 0x4d, 0x37, 0x4a, 0x45, 0x41, 0x41, 0x41, 0x61, 0x70, 0x53, 0x55, 0x52, 0x42, 0x56, 0x43, 0x62, 0x4f, 0x70, + 0x59, 0x74, 0x54, 0x42, 0x36, 0x6b, 0x72, 0x47, 0x34, 0x42, 0x38, 0x72, 0x41, 0x4c, 0x65, 0x42, 0x56, 0x79, + 0x55, 0x5c, 0x0a, + 0x09, 0x4f, 0x6f, 0x67, 0x6b, 0x56, 0x64, 0x42, 0x46, 0x77, 0x44, 0x75, 0x4a, 0x63, 0x36, 0x6c, 0x79, 0x59, + 0x67, 0x4f, 0x51, 0x6e, 0x7a, 0x37, 0x67, 0x52, 0x4f, 0x43, 0x4d, 0x67, 0x5a, 0x39, 0x4c, 0x6b, 0x6b, 0x62, + 0x58, 0x52, 0x2b, 0x79, 0x30, 0x65, 0x69, 0x4b, 0x65, 0x4e, 0x33, 0x50, 0x6e, 0x52, 0x59, 0x44, 0x46, 0x6d, + 0x41, 0x39, 0x63, 0x44, 0x6b, 0x78, 0x4e, 0x48, 0x55, 0x53, 0x53, 0x53, 0x6d, 0x6f, 0x6c, 0x63, 0x41, 0x7a, + 0x77, 0x5c, 0x0a, + 0x09, 0x77, 0x39, 0x52, 0x42, 0x6d, 0x73, 0x49, 0x47, 0x6f, 0x44, 0x68, 0x37, 0x45, 0x76, 0x2f, 0x48, 0x33, + 0x69, 0x5a, 0x31, 0x45, 0x45, 0x6b, 0x71, 0x6d, 0x55, 0x65, 0x4a, 0x44, 0x30, 0x72, 0x33, 0x70, 0x41, 0x37, + 0x53, 0x4a, 0x43, 0x34, 0x42, 0x46, 0x4f, 0x63, 0x65, 0x59, 0x46, 0x2f, 0x67, 0x39, 0x74, 0x52, 0x42, 0x4a, + 0x4b, 0x6c, 0x45, 0x62, 0x67, 0x66, 0x32, 0x77, 0x2b, 0x4a, 0x66, 0x4f, 0x42, 0x75, 0x41, 0x59, 0x6a, 0x31, + 0x42, 0x5c, 0x0a, + 0x09, 0x37, 0x42, 0x70, 0x34, 0x63, 0x65, 0x49, 0x63, 0x6b, 0x6c, 0x51, 0x47, 0x33, 0x79, 0x54, 0x4f, 0x69, + 0x59, 0x76, 0x53, 0x78, 0x6d, 0x67, 0x6d, 0x47, 0x34, 0x44, 0x69, 0x2f, 0x52, 0x55, 0x34, 0x67, 0x58, 0x69, + 0x53, 0x31, 0x51, 0x75, 0x4a, 0x73, 0x30, 0x68, 0x53, 0x43, 0x69, 0x38, 0x51, 0x35, 0x38, 0x44, 0x6a, 0x69, + 0x58, 0x4f, 0x69, 0x45, 0x76, 0x41, 0x61, 0x67, 0x4c, 0x54, 0x65, 0x44, 0x48, 0x77, 0x58, 0x6d, 0x4a, 0x30, + 0x34, 0x5c, 0x0a, + 0x09, 0x68, 0x79, 0x51, 0x56, 0x5a, 0x51, 0x6e, 0x78, 0x51, 0x4a, 0x2b, 0x62, 0x55, 0x67, 0x64, 0x70, 0x4f, + 0x68, 0x75, 0x41, 0x39, 0x4c, 0x59, 0x48, 0x72, 0x69, 0x53, 0x65, 0x4a, 0x53, 0x42, 0x4a, 0x64, 0x58, 0x59, + 0x6e, 0x63, 0x42, 0x54, 0x77, 0x53, 0x4f, 0x6f, 0x67, 0x63, 0x67, 0x6d, 0x67, 0x44, 0x42, 0x34, 0x42, 0x33, + 0x67, 0x42, 0x38, 0x4c, 0x58, 0x55, 0x51, 0x53, 0x63, 0x72, 0x52, 0x31, 0x34, 0x6c, 0x7a, 0x6e, 0x63, 0x57, + 0x2f, 0x5c, 0x0a, + 0x09, 0x4a, 0x4a, 0x77, 0x41, 0x6c, 0x4d, 0x75, 0x78, 0x52, 0x43, 0x50, 0x67, 0x66, 0x67, 0x47, 0x53, 0x36, + 0x6d, 0x49, 0x6c, 0x63, 0x42, 0x4a, 0x77, 0x57, 0x65, 0x6f, 0x67, 0x32, 0x70, 0x41, 0x4e, 0x51, 0x50, 0x6e, + 0x73, 0x53, 0x69, 0x77, 0x4a, 0x37, 0x4a, 0x77, 0x36, 0x69, 0x43, 0x52, 0x31, 0x36, 0x55, 0x48, 0x67, 0x61, + 0x4f, 0x43, 0x2b, 0x31, 0x45, 0x47, 0x30, 0x4b, 0x5a, 0x63, 0x41, 0x79, 0x6d, 0x63, 0x42, 0x73, 0x56, 0x2f, + 0x41, 0x5c, 0x0a, + 0x09, 0x4a, 0x61, 0x6d, 0x44, 0x53, 0x46, 0x49, 0x58, 0x4c, 0x69, 0x48, 0x4f, 0x5a, 0x52, 0x62, 0x2f, 0x6b, + 0x72, 0x49, 0x42, 0x4b, 0x4b, 0x65, 0x56, 0x77, 0x41, 0x65, 0x41, 0x39, 0x77, 0x48, 0x4c, 0x45, 0x32, 0x65, + 0x52, 0x70, 0x48, 0x61, 0x73, 0x41, 0x4e, 0x35, 0x50, 0x6e, 0x4d, 0x4e, 0x57, 0x4a, 0x73, 0x36, 0x69, 0x55, + 0x62, 0x67, 0x45, 0x55, 0x48, 0x36, 0x76, 0x4a, 0x4a, 0x34, 0x6a, 0x34, 0x46, 0x30, 0x43, 0x6b, 0x73, 0x72, + 0x75, 0x5c, 0x0a, + 0x09, 0x54, 0x6d, 0x49, 0x2f, 0x2f, 0x7a, 0x2b, 0x6d, 0x44, 0x71, 0x4b, 0x78, 0x4f, 0x51, 0x45, 0x6f, 0x76, + 0x7a, 0x38, 0x43, 0x42, 0x77, 0x4c, 0x6e, 0x41, 0x58, 0x5a, 0x72, 0x6b, 0x73, 0x71, 0x6f, 0x6e, 0x7a, 0x68, + 0x48, 0x48, 0x59, 0x6a, 0x46, 0x76, 0x7a, 0x4b, 0x63, 0x41, 0x46, 0x54, 0x4c, 0x77, 0x63, 0x54, 0x57, 0x6d, + 0x64, 0x73, 0x6d, 0x7a, 0x69, 0x46, 0x4a, 0x67, 0x2f, 0x35, 0x43, 0x37, 0x4f, 0x6a, 0x33, 0x73, 0x39, 0x52, + 0x42, 0x5c, 0x0a, + 0x09, 0x31, 0x42, 0x34, 0x6e, 0x41, 0x4e, 0x56, 0x79, 0x49, 0x37, 0x41, 0x37, 0x63, 0x47, 0x6e, 0x71, 0x49, + 0x4a, 0x4a, 0x45, 0x33, 0x4e, 0x71, 0x33, 0x42, 0x78, 0x62, 0x2f, 0x53, 0x6e, 0x49, 0x43, 0x55, 0x46, 0x31, + 0x48, 0x41, 0x78, 0x63, 0x43, 0x4c, 0x30, 0x73, 0x64, 0x52, 0x46, 0x4c, 0x6a, 0x50, 0x45, 0x50, 0x63, 0x32, + 0x33, 0x39, 0x46, 0x36, 0x69, 0x44, 0x71, 0x6e, 0x41, 0x31, 0x41, 0x74, 0x63, 0x30, 0x68, 0x64, 0x74, 0x65, + 0x61, 0x5c, 0x0a, + 0x09, 0x6e, 0x7a, 0x71, 0x49, 0x70, 0x4d, 0x62, 0x34, 0x49, 0x66, 0x41, 0x68, 0x66, 0x49, 0x4a, 0x66, 0x35, + 0x62, 0x6b, 0x45, 0x55, 0x47, 0x32, 0x4c, 0x67, 0x4d, 0x4f, 0x4a, 0x48, 0x51, 0x53, 0x66, 0x54, 0x70, 0x78, + 0x46, 0x55, 0x72, 0x30, 0x39, 0x54, 0x5a, 0x78, 0x72, 0x44, 0x73, 0x66, 0x69, 0x58, 0x77, 0x74, 0x4f, 0x41, + 0x4f, 0x70, 0x6a, 0x43, 0x2b, 0x44, 0x4c, 0x78, 0x4e, 0x4b, 0x41, 0x4a, 0x47, 0x58, 0x70, 0x53, 0x75, 0x41, + 0x55, 0x5c, 0x0a, + 0x09, 0x34, 0x4d, 0x6e, 0x55, 0x51, 0x5a, 0x51, 0x64, 0x4a, 0x77, 0x44, 0x31, 0x73, 0x52, 0x68, 0x34, 0x4e, + 0x2f, 0x47, 0x6b, 0x72, 0x53, 0x63, 0x53, 0x5a, 0x35, 0x46, 0x55, 0x44, 0x30, 0x38, 0x51, 0x35, 0x35, 0x53, + 0x6a, 0x73, 0x66, 0x6a, 0x58, 0x6a, 0x67, 0x31, 0x41, 0x2f, 0x56, 0x77, 0x46, 0x7a, 0x43, 0x4d, 0x65, 0x4b, + 0x72, 0x51, 0x75, 0x63, 0x52, 0x5a, 0x4a, 0x31, 0x62, 0x53, 0x4f, 0x75, 0x4c, 0x35, 0x6f, 0x48, 0x6e, 0x46, + 0x4f, 0x5c, 0x0a, + 0x09, 0x55, 0x51, 0x32, 0x35, 0x42, 0x46, 0x42, 0x76, 0x72, 0x79, 0x66, 0x2b, 0x45, 0x65, 0x2b, 0x65, 0x4f, + 0x6f, 0x69, 0x6b, 0x79, 0x72, 0x67, 0x58, 0x4f, 0x42, 0x6d, 0x34, 0x4c, 0x58, 0x55, 0x51, 0x35, 0x63, 0x73, + 0x4a, 0x51, 0x4c, 0x33, 0x39, 0x4a, 0x37, 0x41, 0x33, 0x38, 0x45, 0x2f, 0x41, 0x36, 0x73, 0x52, 0x5a, 0x4a, + 0x4a, 0x58, 0x62, 0x63, 0x38, 0x53, 0x35, 0x34, 0x72, 0x56, 0x59, 0x2f, 0x42, 0x76, 0x42, 0x43, 0x55, 0x42, + 0x7a, 0x5c, 0x0a, + 0x09, 0x62, 0x41, 0x65, 0x63, 0x44, 0x78, 0x79, 0x52, 0x4f, 0x6f, 0x69, 0x6b, 0x30, 0x76, 0x6b, 0x65, 0x38, + 0x46, 0x46, 0x67, 0x59, 0x65, 0x6f, 0x67, 0x4b, 0x6f, 0x34, 0x4e, 0x51, 0x50, 0x50, 0x38, 0x4c, 0x66, 0x42, + 0x46, 0x59, 0x4a, 0x66, 0x55, 0x51, 0x53, 0x51, 0x6c, 0x64, 0x7a, 0x39, 0x52, 0x2b, 0x4b, 0x39, 0x50, 0x48, + 0x55, 0x54, 0x46, 0x63, 0x77, 0x6d, 0x67, 0x65, 0x57, 0x34, 0x41, 0x58, 0x67, 0x4f, 0x63, 0x41, 0x53, 0x78, + 0x4c, 0x5c, 0x0a, + 0x09, 0x6e, 0x45, 0x56, 0x53, 0x47, 0x73, 0x75, 0x4a, 0x63, 0x38, 0x42, 0x65, 0x57, 0x50, 0x77, 0x62, 0x79, + 0x77, 0x6c, 0x41, 0x73, 0x38, 0x30, 0x42, 0x7a, 0x69, 0x59, 0x65, 0x35, 0x44, 0x45, 0x68, 0x63, 0x52, 0x5a, + 0x4a, 0x2b, 0x58, 0x73, 0x42, 0x75, 0x41, 0x54, 0x34, 0x46, 0x39, 0x7a, 0x4d, 0x70, 0x2f, 0x46, 0x73, 0x41, + 0x41, 0x53, 0x78, 0x48, 0x48, 0x41, 0x65, 0x63, 0x46, 0x6a, 0x71, 0x49, 0x4a, 0x4a, 0x79, 0x63, 0x79, 0x33, + 0x77, 0x5c, 0x0a, + 0x09, 0x63, 0x57, 0x4c, 0x73, 0x4c, 0x37, 0x6b, 0x45, 0x49, 0x43, 0x42, 0x4f, 0x43, 0x47, 0x38, 0x62, 0x65, + 0x4e, 0x32, 0x58, 0x4f, 0x49, 0x75, 0x6b, 0x62, 0x41, 0x33, 0x39, 0x39, 0x32, 0x33, 0x78, 0x31, 0x34, 0x74, + 0x73, 0x41, 0x44, 0x54, 0x55, 0x74, 0x63, 0x54, 0x31, 0x41, 0x63, 0x66, 0x6a, 0x31, 0x63, 0x42, 0x53, 0x31, + 0x53, 0x30, 0x6b, 0x2f, 0x69, 0x32, 0x2f, 0x68, 0x76, 0x69, 0x33, 0x4c, 0x57, 0x33, 0x41, 0x4a, 0x51, 0x43, + 0x4e, 0x5c, 0x0a, + 0x09, 0x70, 0x4a, 0x64, 0x34, 0x33, 0x4f, 0x63, 0x6e, 0x69, 0x4f, 0x63, 0x4d, 0x53, 0x4b, 0x71, 0x47, 0x4a, + 0x63, 0x43, 0x6e, 0x69, 0x63, 0x65, 0x46, 0x50, 0x35, 0x38, 0x34, 0x69, 0x30, 0x72, 0x4d, 0x42, 0x6b, 0x42, + 0x6a, 0x6d, 0x51, 0x71, 0x63, 0x54, 0x71, 0x77, 0x64, 0x54, 0x6b, 0x2b, 0x63, 0x52, 0x64, 0x4c, 0x49, 0x6c, + 0x68, 0x48, 0x58, 0x38, 0x70, 0x77, 0x50, 0x72, 0x45, 0x79, 0x63, 0x52, 0x52, 0x56, 0x67, 0x41, 0x36, 0x42, + 0x57, 0x5c, 0x0a, + 0x09, 0x62, 0x55, 0x37, 0x63, 0x4c, 0x33, 0x77, 0x61, 0x4d, 0x43, 0x31, 0x78, 0x46, 0x6b, 0x6e, 0x72, 0x72, + 0x51, 0x41, 0x75, 0x41, 0x44, 0x34, 0x50, 0x50, 0x4a, 0x4d, 0x34, 0x69, 0x79, 0x72, 0x45, 0x42, 0x6b, 0x44, + 0x74, 0x6d, 0x73, 0x6e, 0x36, 0x52, 0x73, 0x43, 0x4a, 0x67, 0x4a, 0x54, 0x4f, 0x63, 0x75, 0x49, 0x52, 0x34, + 0x4a, 0x38, 0x48, 0x6e, 0x6b, 0x36, 0x63, 0x52, 0x52, 0x56, 0x6b, 0x41, 0x36, 0x42, 0x4f, 0x7a, 0x53, 0x43, + 0x61, 0x5c, 0x0a, + 0x09, 0x67, 0x4e, 0x4f, 0x49, 0x70, 0x6b, 0x42, 0x53, 0x4d, 0x5a, 0x34, 0x46, 0x76, 0x6b, 0x54, 0x73, 0x36, + 0x4f, 0x6b, 0x6e, 0x66, 0x6e, 0x58, 0x4d, 0x42, 0x6b, 0x44, 0x64, 0x32, 0x67, 0x77, 0x34, 0x6b, 0x62, 0x68, + 0x4f, 0x59, 0x4f, 0x76, 0x45, 0x57, 0x61, 0x51, 0x36, 0x65, 0x34, 0x78, 0x59, 0x33, 0x2f, 0x38, 0x47, 0x4d, + 0x66, 0x61, 0x58, 0x75, 0x6d, 0x49, 0x44, 0x6f, 0x4b, 0x7a, 0x30, 0x41, 0x73, 0x63, 0x42, 0x5a, 0x77, 0x49, + 0x37, 0x5c, 0x0a, + 0x09, 0x4a, 0x38, 0x34, 0x69, 0x31, 0x63, 0x6d, 0x44, 0x77, 0x4c, 0x6e, 0x41, 0x70, 0x58, 0x68, 0x56, 0x76, + 0x7a, 0x4a, 0x6b, 0x41, 0x36, 0x43, 0x73, 0x39, 0x51, 0x44, 0x76, 0x4a, 0x4b, 0x34, 0x54, 0x65, 0x46, 0x50, + 0x69, 0x4c, 0x46, 0x4b, 0x56, 0x33, 0x51, 0x70, 0x38, 0x41, 0x66, 0x67, 0x42, 0x73, 0x43, 0x35, 0x78, 0x46, + 0x74, 0x57, 0x51, 0x44, 0x59, 0x44, 0x79, 0x74, 0x44, 0x64, 0x78, 0x6a, 0x63, 0x42, 0x37, 0x69, 0x41, 0x6d, + 0x42, 0x5c, 0x0a, + 0x09, 0x70, 0x4e, 0x45, 0x39, 0x44, 0x33, 0x79, 0x48, 0x4b, 0x50, 0x78, 0x33, 0x4a, 0x63, 0x36, 0x69, 0x6d, + 0x72, 0x4d, 0x42, 0x55, 0x42, 0x47, 0x32, 0x41, 0x6a, 0x35, 0x4d, 0x58, 0x43, 0x75, 0x77, 0x5a, 0x65, 0x49, + 0x73, 0x55, 0x68, 0x6b, 0x39, 0x53, 0x61, 0x7a, 0x74, 0x66, 0x78, 0x56, 0x34, 0x49, 0x6e, 0x45, 0x57, 0x4e, + 0x59, 0x51, 0x4e, 0x67, 0x49, 0x6f, 0x30, 0x43, 0x54, 0x69, 0x43, 0x32, 0x47, 0x48, 0x51, 0x35, 0x51, 0x45, + 0x4a, 0x5c, 0x0a, + 0x09, 0x66, 0x6b, 0x37, 0x73, 0x32, 0x48, 0x63, 0x31, 0x73, 0x43, 0x5a, 0x78, 0x46, 0x6a, 0x57, 0x4d, 0x44, + 0x59, 0x42, 0x53, 0x32, 0x5a, 0x56, 0x6f, 0x42, 0x4e, 0x36, 0x48, 0x2b, 0x77, 0x6d, 0x6f, 0x57, 0x5a, 0x59, + 0x42, 0x33, 0x77, 0x4b, 0x2b, 0x42, 0x69, 0x78, 0x49, 0x6e, 0x45, 0x55, 0x4e, 0x5a, 0x67, 0x4f, 0x67, 0x31, + 0x4b, 0x59, 0x41, 0x52, 0x78, 0x4d, 0x50, 0x4c, 0x58, 0x6b, 0x6a, 0x4d, 0x43, 0x35, 0x74, 0x48, 0x43, 0x6b, + 0x58, 0x5c, 0x0a, + 0x09, 0x2f, 0x63, 0x53, 0x6e, 0x2f, 0x59, 0x75, 0x42, 0x4b, 0x33, 0x47, 0x72, 0x58, 0x70, 0x57, 0x41, 0x44, + 0x59, 0x44, 0x4b, 0x35, 0x46, 0x58, 0x41, 0x43, 0x63, 0x52, 0x55, 0x34, 0x4f, 0x57, 0x4a, 0x73, 0x30, 0x68, + 0x5a, 0x65, 0x4a, 0x7a, 0x34, 0x74, 0x50, 0x39, 0x4e, 0x34, 0x6e, 0x59, 0x2b, 0x71, 0x54, 0x52, 0x73, 0x41, + 0x46, 0x52, 0x47, 0x34, 0x34, 0x47, 0x33, 0x45, 0x76, 0x73, 0x4b, 0x76, 0x42, 0x4f, 0x59, 0x6e, 0x44, 0x61, + 0x4f, 0x5c, 0x0a, + 0x09, 0x31, 0x4a, 0x62, 0x56, 0x78, 0x4b, 0x31, 0x37, 0x6c, 0x77, 0x49, 0x2f, 0x42, 0x66, 0x72, 0x53, 0x78, + 0x70, 0x47, 0x47, 0x5a, 0x77, 0x4f, 0x67, 0x73, 0x70, 0x74, 0x4b, 0x4e, 0x41, 0x48, 0x76, 0x42, 0x51, 0x34, + 0x46, 0x4a, 0x71, 0x61, 0x4e, 0x49, 0x77, 0x31, 0x72, 0x4c, 0x58, 0x41, 0x39, 0x63, 0x44, 0x6c, 0x52, 0x2f, + 0x42, 0x33, 0x78, 0x71, 0x2f, 0x52, 0x73, 0x41, 0x46, 0x51, 0x6c, 0x73, 0x34, 0x42, 0x33, 0x44, 0x37, 0x7a, + 0x65, 0x5c, 0x0a, + 0x09, 0x51, 0x45, 0x77, 0x4b, 0x70, 0x46, 0x54, 0x36, 0x67, 0x46, 0x38, 0x41, 0x33, 0x78, 0x31, 0x34, 0x50, + 0x5a, 0x55, 0x32, 0x6a, 0x74, 0x51, 0x65, 0x47, 0x77, 0x42, 0x56, 0x31, 0x52, 0x62, 0x41, 0x75, 0x34, 0x41, + 0x6a, 0x67, 0x62, 0x66, 0x67, 0x5a, 0x45, 0x44, 0x46, 0x57, 0x41, 0x76, 0x63, 0x42, 0x46, 0x77, 0x46, 0x66, + 0x42, 0x39, 0x59, 0x6e, 0x44, 0x61, 0x4f, 0x31, 0x44, 0x6b, 0x62, 0x41, 0x4e, 0x58, 0x42, 0x54, 0x4f, 0x44, + 0x77, 0x5c, 0x0a, + 0x09, 0x67, 0x64, 0x65, 0x68, 0x78, 0x4c, 0x4b, 0x42, 0x6c, 0x4a, 0x57, 0x56, 0x77, 0x48, 0x58, 0x41, 0x4e, + 0x51, 0x4f, 0x76, 0x5a, 0x39, 0x50, 0x47, 0x6b, 0x62, 0x4a, 0x68, 0x41, 0x36, 0x43, 0x36, 0x36, 0x51, 0x58, + 0x65, 0x44, 0x4c, 0x77, 0x44, 0x65, 0x44, 0x75, 0x77, 0x59, 0x39, 0x49, 0x30, 0x71, 0x71, 0x6f, 0x2f, 0x41, + 0x54, 0x38, 0x61, 0x65, 0x4e, 0x32, 0x43, 0x6d, 0x2f, 0x53, 0x6f, 0x68, 0x6d, 0x77, 0x41, 0x56, 0x48, 0x65, + 0x37, 0x5c, 0x0a, + 0x09, 0x41, 0x49, 0x63, 0x42, 0x68, 0x78, 0x43, 0x37, 0x44, 0x33, 0x70, 0x48, 0x67, 0x59, 0x61, 0x7a, 0x6d, + 0x72, 0x68, 0x50, 0x2f, 0x7a, 0x72, 0x67, 0x57, 0x75, 0x44, 0x2b, 0x74, 0x48, 0x47, 0x6b, 0x2f, 0x4e, 0x6b, + 0x41, 0x71, 0x45, 0x6c, 0x65, 0x41, 0x68, 0x78, 0x41, 0x4e, 0x41, 0x4f, 0x48, 0x41, 0x6e, 0x73, 0x53, 0x54, + 0x79, 0x39, 0x55, 0x38, 0x36, 0x77, 0x44, 0x37, 0x69, 0x45, 0x4b, 0x2f, 0x76, 0x58, 0x41, 0x4c, 0x34, 0x47, + 0x2f, 0x5c, 0x0a, + 0x09, 0x4a, 0x6b, 0x30, 0x6b, 0x46, 0x63, 0x77, 0x47, 0x51, 0x45, 0x30, 0x32, 0x6b, 0x37, 0x69, 0x62, 0x34, + 0x43, 0x42, 0x69, 0x4f, 0x72, 0x41, 0x58, 0x4d, 0x43, 0x46, 0x70, 0x49, 0x75, 0x58, 0x6c, 0x42, 0x65, 0x42, + 0x75, 0x34, 0x6c, 0x50, 0x2b, 0x7a, 0x63, 0x54, 0x56, 0x2b, 0x36, 0x37, 0x6c, 0x71, 0x39, 0x46, 0x73, 0x41, + 0x4b, 0x54, 0x31, 0x4e, 0x69, 0x4d, 0x6d, 0x42, 0x47, 0x38, 0x45, 0x39, 0x67, 0x66, 0x32, 0x78, 0x65, 0x63, + 0x55, 0x5c, 0x0a, + 0x09, 0x56, 0x4e, 0x56, 0x79, 0x34, 0x41, 0x37, 0x67, 0x64, 0x71, 0x4c, 0x59, 0x33, 0x77, 0x61, 0x73, 0x53, + 0x4a, 0x70, 0x49, 0x4b, 0x68, 0x6b, 0x62, 0x41, 0x47, 0x6c, 0x6b, 0x50, 0x63, 0x41, 0x38, 0x6f, 0x68, 0x6c, + 0x34, 0x48, 0x62, 0x41, 0x66, 0x63, 0x55, 0x32, 0x42, 0x74, 0x78, 0x79, 0x57, 0x79, 0x77, 0x76, 0x45, 0x51, + 0x33, 0x58, 0x75, 0x41, 0x48, 0x34, 0x31, 0x38, 0x4f, 0x50, 0x39, 0x78, 0x4a, 0x68, 0x66, 0x30, 0x67, 0x68, + 0x73, 0x5c, 0x0a, + 0x09, 0x41, 0x4b, 0x54, 0x32, 0x76, 0x41, 0x54, 0x59, 0x6a, 0x56, 0x67, 0x75, 0x32, 0x42, 0x50, 0x59, 0x47, + 0x39, 0x67, 0x44, 0x4c, 0x79, 0x34, 0x73, 0x79, 0x6d, 0x72, 0x67, 0x58, 0x75, 0x41, 0x33, 0x78, 0x42, 0x72, + 0x2b, 0x33, 0x63, 0x42, 0x39, 0x75, 0x48, 0x34, 0x76, 0x74, 0x63, 0x30, 0x47, 0x51, 0x4f, 0x72, 0x65, 0x65, + 0x47, 0x41, 0x48, 0x59, 0x6a, 0x71, 0x77, 0x43, 0x2f, 0x47, 0x6f, 0x34, 0x33, 0x6b, 0x44, 0x4c, 0x78, 0x75, + 0x44, 0x5c, 0x0a, + 0x09, 0x7a, 0x71, 0x77, 0x47, 0x48, 0x68, 0x68, 0x34, 0x4c, 0x53, 0x41, 0x2b, 0x30, 0x64, 0x39, 0x50, 0x33, + 0x4a, 0x37, 0x6e, 0x33, 0x76, 0x70, 0x53, 0x42, 0x6d, 0x77, 0x41, 0x70, 0x50, 0x7a, 0x30, 0x41, 0x4e, 0x73, + 0x43, 0x63, 0x77, 0x64, 0x65, 0x4f, 0x77, 0x37, 0x35, 0x2b, 0x55, 0x37, 0x45, 0x6f, 0x35, 0x43, 0x62, 0x62, + 0x44, 0x58, 0x77, 0x30, 0x4d, 0x44, 0x72, 0x34, 0x59, 0x48, 0x58, 0x34, 0x4b, 0x2f, 0x2f, 0x67, 0x69, 0x4e, + 0x38, 0x5c, 0x0a, + 0x09, 0x4b, 0x56, 0x63, 0x32, 0x41, 0x46, 0x49, 0x36, 0x73, 0x34, 0x42, 0x74, 0x69, 0x43, 0x5a, 0x68, 0x75, + 0x34, 0x47, 0x66, 0x62, 0x77, 0x4e, 0x73, 0x54, 0x57, 0x78, 0x31, 0x50, 0x48, 0x76, 0x67, 0x4e, 0x53, 0x35, + 0x56, 0x77, 0x41, 0x37, 0x31, 0x41, 0x30, 0x73, 0x47, 0x58, 0x6f, 0x75, 0x42, 0x78, 0x34, 0x42, 0x48, 0x42, + 0x31, 0x34, 0x4c, 0x69, 0x65, 0x4c, 0x2b, 0x4b, 0x4f, 0x36, 0x64, 0x4c, 0x79, 0x56, 0x6c, 0x41, 0x79, 0x43, + 0x56, 0x5c, 0x0a, + 0x09, 0x32, 0x33, 0x67, 0x32, 0x62, 0x41, 0x59, 0x32, 0x42, 0x32, 0x59, 0x4d, 0x38, 0x35, 0x6f, 0x79, 0x38, + 0x4a, 0x6f, 0x4d, 0x54, 0x41, 0x4b, 0x6d, 0x45, 0x52, 0x63, 0x72, 0x62, 0x6e, 0x77, 0x58, 0x77, 0x7a, 0x51, + 0x32, 0x66, 0x59, 0x68, 0x53, 0x48, 0x33, 0x48, 0x56, 0x2f, 0x46, 0x44, 0x4c, 0x69, 0x48, 0x33, 0x76, 0x6c, + 0x78, 0x4f, 0x37, 0x34, 0x4b, 0x30, 0x47, 0x56, 0x67, 0x32, 0x38, 0x6c, 0x67, 0x37, 0x7a, 0x65, 0x6f, 0x62, + 0x31, 0x5c, 0x0a, + 0x09, 0x52, 0x58, 0x38, 0x4a, 0x63, 0x57, 0x47, 0x65, 0x70, 0x42, 0x4c, 0x37, 0x2f, 0x2b, 0x36, 0x4a, 0x76, + 0x53, 0x43, 0x72, 0x32, 0x66, 0x6e, 0x73, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x6c, 0x46, 0x54, 0x6b, 0x53, + 0x75, 0x51, 0x6d, 0x43, 0x43, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6e, 0x67, 0x20, + 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x44, 0x6b, 0x74, 0x62, 0x63, 0x4b, 0x41, 0x41, 0x41, 0x48, 0x48, 0x30, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x33, 0x64, 0x79, 0x38, 0x39, 0x63, 0x63, 0x78, 0x7a, 0x48, 0x38, 0x66, + 0x66, 0x7a, 0x5c, 0x0a, + 0x09, 0x39, 0x46, 0x36, 0x58, 0x58, 0x72, 0x52, 0x39, 0x74, 0x4b, 0x36, 0x6c, 0x4c, 0x58, 0x56, 0x70, 0x56, + 0x43, 0x51, 0x6b, 0x4c, 0x68, 0x47, 0x68, 0x49, 0x57, 0x69, 0x49, 0x52, 0x46, 0x30, 0x53, 0x47, 0x34, 0x53, + 0x39, 0x68, 0x4a, 0x55, 0x56, 0x47, 0x78, 0x61, 0x57, 0x4e, 0x68, 0x62, 0x2b, 0x41, 0x49, 0x74, 0x4b, 0x42, + 0x47, 0x46, 0x68, 0x30, 0x34, 0x55, 0x67, 0x49, 0x69, 0x68, 0x42, 0x56, 0x4a, 0x75, 0x57, 0x74, 0x6d, 0x69, + 0x72, 0x5c, 0x0a, + 0x09, 0x56, 0x38, 0x56, 0x44, 0x78, 0x2b, 0x4a, 0x33, 0x4a, 0x73, 0x39, 0x30, 0x4f, 0x76, 0x4e, 0x30, 0x66, + 0x6d, 0x66, 0x6d, 0x39, 0x46, 0x78, 0x2b, 0x37, 0x31, 0x63, 0x79, 0x65, 0x57, 0x61, 0x65, 0x7a, 0x75, 0x58, + 0x62, 0x4e, 0x74, 0x2f, 0x50, 0x37, 0x33, 0x64, 0x2b, 0x35, 0x38, 0x77, 0x35, 0x59, 0x36, 0x31, 0x57, 0x43, + 0x30, 0x6c, 0x70, 0x47, 0x69, 0x2b, 0x37, 0x41, 0x45, 0x6e, 0x6c, 0x4d, 0x51, 0x43, 0x6b, 0x68, 0x4d, 0x30, + 0x73, 0x5c, 0x0a, + 0x09, 0x75, 0x77, 0x44, 0x56, 0x79, 0x36, 0x70, 0x4c, 0x56, 0x30, 0x59, 0x39, 0x2f, 0x38, 0x63, 0x64, 0x32, + 0x77, 0x75, 0x71, 0x52, 0x4b, 0x4e, 0x67, 0x41, 0x43, 0x51, 0x71, 0x74, 0x70, 0x47, 0x37, 0x6a, 0x41, 0x45, + 0x4c, 0x67, 0x47, 0x58, 0x41, 0x63, 0x6d, 0x41, 0x43, 0x57, 0x4a, 0x49, 0x39, 0x6e, 0x67, 0x43, 0x4f, 0x41, + 0x53, 0x38, 0x42, 0x68, 0x34, 0x61, 0x72, 0x55, 0x6b, 0x55, 0x62, 0x63, 0x78, 0x47, 0x77, 0x33, 0x6f, 0x5a, + 0x73, 0x5c, 0x0a, + 0x09, 0x35, 0x48, 0x48, 0x67, 0x4c, 0x47, 0x41, 0x68, 0x6f, 0x58, 0x47, 0x58, 0x41, 0x59, 0x75, 0x7a, 0x32, + 0x33, 0x6b, 0x64, 0x39, 0x78, 0x66, 0x31, 0x75, 0x48, 0x2b, 0x36, 0x7a, 0x63, 0x65, 0x33, 0x67, 0x51, 0x66, + 0x42, 0x57, 0x55, 0x43, 0x56, 0x4f, 0x51, 0x4f, 0x6f, 0x67, 0x43, 0x47, 0x62, 0x47, 0x47, 0x41, 0x57, 0x6f, + 0x5a, 0x48, 0x50, 0x4a, 0x54, 0x54, 0x75, 0x2b, 0x63, 0x42, 0x46, 0x68, 0x47, 0x5a, 0x74, 0x4e, 0x2b, 0x79, + 0x69, 0x5c, 0x0a, + 0x09, 0x72, 0x73, 0x66, 0x6e, 0x41, 0x65, 0x63, 0x4d, 0x2b, 0x38, 0x48, 0x54, 0x65, 0x41, 0x42, 0x59, 0x44, + 0x33, 0x78, 0x52, 0x34, 0x47, 0x64, 0x6f, 0x53, 0x41, 0x62, 0x41, 0x43, 0x49, 0x31, 0x67, 0x4e, 0x4a, 0x34, + 0x4e, 0x7a, 0x41, 0x50, 0x4f, 0x4a, 0x6a, 0x54, 0x70, 0x42, 0x48, 0x41, 0x68, 0x73, 0x4a, 0x4c, 0x51, 0x73, + 0x4e, 0x31, 0x4e, 0x33, 0x4c, 0x35, 0x66, 0x31, 0x63, 0x58, 0x63, 0x52, 0x7a, 0x41, 0x41, 0x4b, 0x73, 0x31, + 0x4e, 0x5c, 0x0a, + 0x09, 0x67, 0x42, 0x36, 0x47, 0x62, 0x4f, 0x51, 0x5a, 0x68, 0x42, 0x46, 0x35, 0x4c, 0x6d, 0x46, 0x55, 0x58, + 0x67, 0x41, 0x73, 0x42, 0x56, 0x59, 0x41, 0x6c, 0x77, 0x4b, 0x72, 0x43, 0x56, 0x50, 0x74, 0x37, 0x69, 0x61, + 0x65, 0x50, 0x63, 0x79, 0x48, 0x56, 0x74, 0x54, 0x6e, 0x77, 0x41, 0x33, 0x67, 0x5a, 0x6b, 0x42, 0x56, 0x4e, + 0x58, 0x6f, 0x47, 0x4d, 0x49, 0x49, 0x52, 0x65, 0x53, 0x61, 0x68, 0x4d, 0x65, 0x63, 0x54, 0x70, 0x74, 0x65, + 0x4c, 0x5c, 0x0a, + 0x09, 0x43, 0x4b, 0x50, 0x79, 0x4a, 0x63, 0x44, 0x6c, 0x77, 0x46, 0x58, 0x41, 0x42, 0x55, 0x77, 0x31, 0x38, + 0x66, 0x78, 0x68, 0x50, 0x72, 0x43, 0x42, 0x31, 0x68, 0x50, 0x2b, 0x48, 0x55, 0x2b, 0x55, 0x58, 0x59, 0x68, + 0x36, 0x71, 0x30, 0x30, 0x41, 0x44, 0x4e, 0x48, 0x4d, 0x59, 0x34, 0x52, 0x52, 0x65, 0x53, 0x59, 0x77, 0x68, + 0x39, 0x43, 0x6b, 0x43, 0x77, 0x6c, 0x54, 0x36, 0x75, 0x57, 0x45, 0x5a, 0x72, 0x34, 0x43, 0x75, 0x49, 0x59, + 0x77, 0x5c, 0x0a, + 0x09, 0x31, 0x56, 0x35, 0x4d, 0x47, 0x4d, 0x45, 0x31, 0x76, 0x48, 0x48, 0x43, 0x76, 0x2f, 0x66, 0x52, 0x73, + 0x67, 0x74, 0x52, 0x62, 0x36, 0x55, 0x45, 0x77, 0x49, 0x69, 0x61, 0x75, 0x54, 0x33, 0x46, 0x58, 0x6b, 0x69, + 0x59, 0x59, 0x69, 0x38, 0x6e, 0x6a, 0x4d, 0x70, 0x58, 0x45, 0x6b, 0x61, 0x65, 0x4b, 0x37, 0x4c, 0x6e, 0x71, + 0x6c, 0x79, 0x4c, 0x4d, 0x41, 0x41, 0x71, 0x61, 0x32, 0x51, 0x42, 0x6b, 0x4b, 0x4f, 0x70, 0x78, 0x77, 0x67, + 0x6a, 0x5c, 0x0a, + 0x09, 0x78, 0x43, 0x7a, 0x43, 0x79, 0x4e, 0x79, 0x39, 0x76, 0x62, 0x77, 0x53, 0x57, 0x41, 0x4e, 0x63, 0x42, + 0x36, 0x79, 0x6a, 0x75, 0x67, 0x74, 0x64, 0x6d, 0x74, 0x37, 0x35, 0x77, 0x4b, 0x36, 0x79, 0x69, 0x31, 0x42, + 0x76, 0x41, 0x77, 0x66, 0x41, 0x67, 0x41, 0x33, 0x65, 0x58, 0x67, 0x43, 0x62, 0x54, 0x39, 0x6a, 0x46, 0x74, + 0x4a, 0x69, 0x70, 0x5a, 0x6c, 0x35, 0x4e, 0x6d, 0x47, 0x62, 0x66, 0x68, 0x4e, 0x76, 0x4b, 0x4b, 0x62, 0x6b, + 0x49, 0x5c, 0x0a, + 0x09, 0x2b, 0x4b, 0x7a, 0x73, 0x49, 0x74, 0x54, 0x62, 0x51, 0x41, 0x48, 0x51, 0x30, 0x66, 0x79, 0x7a, 0x43, + 0x43, 0x76, 0x5a, 0x61, 0x34, 0x43, 0x31, 0x68, 0x42, 0x58, 0x65, 0x56, 0x63, 0x44, 0x46, 0x68, 0x4a, 0x46, + 0x62, 0x36, 0x6e, 0x5a, 0x35, 0x32, 0x51, 0x57, 0x6f, 0x76, 0x35, 0x68, 0x4e, 0x67, 0x48, 0x48, 0x67, 0x65, + 0x38, 0x4a, 0x6f, 0x4c, 0x67, 0x33, 0x71, 0x36, 0x72, 0x49, 0x4c, 0x55, 0x48, 0x38, 0x78, 0x32, 0x39, 0x57, + 0x72, 0x5c, 0x0a, + 0x09, 0x73, 0x50, 0x6b, 0x56, 0x62, 0x31, 0x33, 0x5a, 0x42, 0x61, 0x69, 0x2f, 0x6d, 0x41, 0x42, 0x59, 0x58, + 0x56, 0x67, 0x56, 0x61, 0x6a, 0x49, 0x44, 0x6f, 0x4d, 0x4a, 0x69, 0x41, 0x6d, 0x43, 0x69, 0x73, 0x43, 0x72, + 0x55, 0x5a, 0x44, 0x4e, 0x67, 0x4a, 0x4e, 0x39, 0x33, 0x55, 0x41, 0x46, 0x69, 0x41, 0x73, 0x42, 0x46, 0x50, + 0x75, 0x55, 0x31, 0x56, 0x6e, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x4a, 0x59, 0x55, 0x56, 0x6f, 0x57, + 0x61, 0x5c, 0x0a, + 0x09, 0x7a, 0x67, 0x43, 0x6f, 0x4b, 0x41, 0x4e, 0x41, 0x5a, 0x34, 0x4a, 0x48, 0x5a, 0x46, 0x5a, 0x55, 0x54, + 0x41, 0x43, 0x59, 0x34, 0x73, 0x72, 0x4c, 0x41, 0x4b, 0x67, 0x6f, 0x44, 0x36, 0x2f, 0x56, 0x6d, 0x57, 0x41, + 0x41, 0x56, 0x46, 0x52, 0x4d, 0x41, 0x4d, 0x77, 0x70, 0x72, 0x41, 0x6f, 0x31, 0x58, 0x57, 0x32, 0x2b, 0x64, + 0x5a, 0x71, 0x61, 0x6d, 0x41, 0x43, 0x59, 0x56, 0x31, 0x67, 0x56, 0x61, 0x6a, 0x71, 0x2f, 0x58, 0x6c, 0x31, + 0x52, 0x5c, 0x0a, + 0x09, 0x62, 0x67, 0x4c, 0x6f, 0x54, 0x44, 0x41, 0x41, 0x4b, 0x69, 0x6f, 0x6d, 0x41, 0x50, 0x59, 0x58, 0x56, + 0x6f, 0x57, 0x61, 0x7a, 0x67, 0x43, 0x6f, 0x71, 0x4a, 0x67, 0x41, 0x32, 0x46, 0x6c, 0x59, 0x46, 0x57, 0x71, + 0x36, 0x4a, 0x70, 0x37, 0x76, 0x73, 0x42, 0x46, 0x69, 0x41, 0x6d, 0x42, 0x33, 0x59, 0x56, 0x57, 0x6f, 0x36, + 0x53, 0x62, 0x4c, 0x4c, 0x6b, 0x43, 0x39, 0x78, 0x51, 0x54, 0x41, 0x6e, 0x73, 0x4b, 0x71, 0x55, 0x4e, 0x50, + 0x39, 0x5c, 0x0a, + 0x09, 0x58, 0x58, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x4c, 0x7a, 0x4d, 0x6b, 0x2f, 0x49, 0x36, 0x58, + 0x6e, 0x59, 0x42, 0x36, 0x69, 0x30, 0x6d, 0x41, 0x50, 0x34, 0x6f, 0x72, 0x41, 0x6f, 0x31, 0x6e, 0x59, 0x4e, + 0x48, 0x52, 0x52, 0x6b, 0x41, 0x4b, 0x74, 0x70, 0x78, 0x38, 0x4d, 0x49, 0x67, 0x56, 0x52, 0x55, 0x54, 0x41, + 0x4d, 0x63, 0x4b, 0x71, 0x30, 0x4a, 0x4e, 0x35, 0x69, 0x6e, 0x42, 0x4b, 0x79, 0x77, 0x6d, 0x41, 0x46, 0x7a, + 0x49, 0x5c, 0x0a, + 0x09, 0x55, 0x52, 0x35, 0x37, 0x79, 0x79, 0x35, 0x41, 0x2f, 0x63, 0x55, 0x45, 0x67, 0x4c, 0x74, 0x79, 0x6c, + 0x49, 0x65, 0x37, 0x6a, 0x79, 0x73, 0x73, 0x4a, 0x67, 0x44, 0x2b, 0x4b, 0x36, 0x77, 0x4b, 0x4e, 0x64, 0x6e, + 0x50, 0x5a, 0x52, 0x65, 0x67, 0x2f, 0x6d, 0x49, 0x43, 0x77, 0x4d, 0x73, 0x49, 0x4b, 0x77, 0x2b, 0x50, 0x48, + 0x36, 0x6d, 0x77, 0x67, 0x51, 0x4b, 0x67, 0x59, 0x77, 0x58, 0x58, 0x68, 0x55, 0x44, 0x46, 0x32, 0x6c, 0x5a, + 0x32, 0x5c, 0x0a, + 0x09, 0x41, 0x65, 0x6f, 0x76, 0x39, 0x74, 0x75, 0x41, 0x58, 0x78, 0x52, 0x53, 0x68, 0x5a, 0x72, 0x4d, 0x79, + 0x34, 0x4a, 0x56, 0x57, 0x47, 0x77, 0x41, 0x62, 0x43, 0x6d, 0x6b, 0x43, 0x6a, 0x58, 0x52, 0x62, 0x38, 0x44, + 0x72, 0x77, 0x44, 0x64, 0x6c, 0x46, 0x36, 0x4c, 0x2b, 0x59, 0x73, 0x2f, 0x55, 0x38, 0x6d, 0x55, 0x68, 0x56, + 0x61, 0x69, 0x4f, 0x57, 0x6f, 0x51, 0x6d, 0x33, 0x77, 0x6e, 0x73, 0x36, 0x50, 0x6a, 0x35, 0x48, 0x62, 0x43, + 0x56, 0x5c, 0x0a, + 0x09, 0x6a, 0x74, 0x31, 0x2f, 0x48, 0x67, 0x52, 0x55, 0x58, 0x62, 0x45, 0x42, 0x38, 0x45, 0x4d, 0x68, 0x56, + 0x61, 0x67, 0x71, 0x2f, 0x67, 0x4c, 0x32, 0x41, 0x62, 0x38, 0x53, 0x7a, 0x76, 0x2b, 0x77, 0x6a, 0x39, 0x44, + 0x6b, 0x76, 0x32, 0x66, 0x33, 0x64, 0x78, 0x4d, 0x61, 0x2b, 0x35, 0x66, 0x73, 0x64, 0x2f, 0x39, 0x4f, 0x39, + 0x32, 0x59, 0x32, 0x66, 0x76, 0x58, 0x46, 0x42, 0x73, 0x43, 0x4f, 0x49, 0x6f, 0x72, 0x51, 0x79, 0x4c, 0x55, + 0x49, 0x5c, 0x0a, + 0x09, 0x68, 0x32, 0x34, 0x66, 0x36, 0x50, 0x72, 0x5a, 0x65, 0x66, 0x38, 0x33, 0x51, 0x6c, 0x50, 0x76, 0x5a, + 0x36, 0x72, 0x4a, 0x6f, 0x78, 0x64, 0x35, 0x62, 0x66, 0x4a, 0x36, 0x69, 0x77, 0x32, 0x41, 0x67, 0x39, 0x6c, + 0x74, 0x59, 0x51, 0x47, 0x31, 0x36, 0x47, 0x53, 0x48, 0x42, 0x72, 0x6a, 0x39, 0x77, 0x61, 0x6d, 0x4e, 0x66, + 0x59, 0x44, 0x77, 0x66, 0x35, 0x53, 0x4c, 0x44, 0x5a, 0x32, 0x57, 0x32, 0x41, 0x42, 0x6f, 0x41, 0x65, 0x38, + 0x42, 0x5c, 0x0a, + 0x09, 0x6a, 0x78, 0x56, 0x51, 0x53, 0x35, 0x4d, 0x63, 0x34, 0x64, 0x52, 0x6d, 0x50, 0x64, 0x6a, 0x6a, 0x64, + 0x2f, 0x31, 0x75, 0x75, 0x52, 0x75, 0x34, 0x7a, 0x55, 0x62, 0x57, 0x49, 0x4d, 0x5a, 0x61, 0x72, 0x63, 0x47, + 0x50, 0x37, 0x38, 0x6b, 0x75, 0x38, 0x48, 0x67, 0x66, 0x38, 0x45, 0x35, 0x52, 0x42, 0x56, 0x58, 0x4d, 0x46, + 0x6d, 0x41, 0x58, 0x6f, 0x61, 0x48, 0x62, 0x74, 0x38, 0x4f, 0x45, 0x42, 0x6a, 0x33, 0x53, 0x34, 0x39, 0x5a, + 0x75, 0x5c, 0x0a, + 0x09, 0x34, 0x4b, 0x45, 0x50, 0x6d, 0x72, 0x4b, 0x42, 0x64, 0x53, 0x62, 0x6b, 0x4f, 0x56, 0x2f, 0x37, 0x75, + 0x38, 0x41, 0x6e, 0x77, 0x49, 0x30, 0x6a, 0x72, 0x69, 0x57, 0x76, 0x76, 0x77, 0x6b, 0x4e, 0x4f, 0x51, 0x6c, + 0x63, 0x4f, 0x4d, 0x4c, 0x33, 0x66, 0x52, 0x6c, 0x34, 0x4d, 0x65, 0x2b, 0x4c, 0x62, 0x57, 0x44, 0x56, 0x51, + 0x5a, 0x34, 0x41, 0x61, 0x41, 0x46, 0x33, 0x41, 0x30, 0x38, 0x41, 0x4e, 0x77, 0x43, 0x58, 0x41, 0x57, 0x63, + 0x54, 0x5c, 0x0a, + 0x09, 0x31, 0x67, 0x58, 0x6d, 0x45, 0x71, 0x34, 0x66, 0x63, 0x47, 0x37, 0x48, 0x38, 0x34, 0x38, 0x41, 0x4a, + 0x7a, 0x6f, 0x65, 0x54, 0x78, 0x49, 0x57, 0x6d, 0x37, 0x70, 0x2f, 0x48, 0x73, 0x2b, 0x65, 0x65, 0x35, 0x51, + 0x77, 0x79, 0x68, 0x37, 0x4f, 0x37, 0x68, 0x2f, 0x6c, 0x35, 0x42, 0x47, 0x32, 0x2f, 0x62, 0x75, 0x44, 0x68, + 0x47, 0x33, 0x65, 0x76, 0x37, 0x4c, 0x33, 0x66, 0x52, 0x35, 0x34, 0x4a, 0x63, 0x66, 0x66, 0x70, 0x35, 0x66, + 0x6e, 0x5c, 0x0a, + 0x09, 0x67, 0x4e, 0x66, 0x41, 0x52, 0x6c, 0x61, 0x7a, 0x52, 0x57, 0x30, 0x43, 0x51, 0x4b, 0x57, 0x76, 0x38, + 0x2f, 0x34, 0x35, 0x63, 0x50, 0x32, 0x51, 0x37, 0x33, 0x45, 0x43, 0x65, 0x41, 0x70, 0x34, 0x45, 0x32, 0x78, + 0x2b, 0x4e, 0x56, 0x39, 0x30, 0x41, 0x46, 0x52, 0x4e, 0x46, 0x6b, 0x68, 0x72, 0x67, 0x4f, 0x2b, 0x48, 0x66, + 0x4b, 0x74, 0x4a, 0x59, 0x42, 0x4f, 0x77, 0x47, 0x57, 0x78, 0x2b, 0x70, 0x61, 0x45, 0x70, 0x31, 0x32, 0x7a, + 0x62, 0x5c, 0x0a, + 0x09, 0x4e, 0x4f, 0x54, 0x72, 0x6a, 0x77, 0x45, 0x62, 0x67, 0x59, 0x2f, 0x41, 0x35, 0x6c, 0x63, 0x36, 0x61, + 0x6a, 0x30, 0x44, 0x36, 0x4e, 0x67, 0x63, 0x2b, 0x52, 0x5a, 0x59, 0x6d, 0x2f, 0x4e, 0x74, 0x39, 0x67, 0x50, + 0x33, 0x45, 0x68, 0x59, 0x32, 0x62, 0x58, 0x34, 0x6c, 0x70, 0x51, 0x6b, 0x7a, 0x67, 0x47, 0x76, 0x4a, 0x33, + 0x2f, 0x79, 0x2f, 0x45, 0x42, 0x59, 0x30, 0x74, 0x34, 0x4c, 0x4e, 0x72, 0x2f, 0x51, 0x30, 0x49, 0x51, 0x41, + 0x65, 0x5c, 0x0a, + 0x09, 0x7a, 0x66, 0x6d, 0x36, 0x62, 0x63, 0x41, 0x47, 0x34, 0x43, 0x65, 0x77, 0x2b, 0x5a, 0x57, 0x6d, 0x32, + 0x6d, 0x34, 0x43, 0x64, 0x45, 0x7a, 0x2f, 0x74, 0x78, 0x46, 0x32, 0x52, 0x63, 0x62, 0x59, 0x43, 0x74, 0x78, + 0x46, 0x39, 0x6f, 0x30, 0x31, 0x6d, 0x31, 0x2b, 0x70, 0x71, 0x76, 0x76, 0x6c, 0x77, 0x57, 0x38, 0x6b, 0x76, + 0x76, 0x6b, 0x2f, 0x42, 0x6d, 0x37, 0x42, 0x35, 0x70, 0x66, 0x71, 0x47, 0x51, 0x41, 0x64, 0x6f, 0x2f, 0x2f, + 0x44, 0x5c, 0x0a, + 0x09, 0x6b, 0x53, 0x2f, 0x39, 0x45, 0x4c, 0x69, 0x54, 0x37, 0x45, 0x6f, 0x31, 0x4e, 0x72, 0x39, 0x53, 0x56, + 0x38, 0x73, 0x41, 0x79, 0x49, 0x77, 0x44, 0x6a, 0x30, 0x51, 0x38, 0x2f, 0x79, 0x33, 0x67, 0x66, 0x75, 0x42, + 0x50, 0x73, 0x50, 0x6b, 0x6c, 0x71, 0x48, 0x63, 0x41, 0x33, 0x41, 0x79, 0x73, 0x47, 0x50, 0x43, 0x35, 0x62, + 0x78, 0x41, 0x57, 0x43, 0x2f, 0x38, 0x42, 0x6d, 0x31, 0x39, 0x71, 0x71, 0x31, 0x30, 0x41, 0x64, 0x45, 0x7a, + 0x2f, 0x5c, 0x0a, + 0x09, 0x42, 0x2f, 0x31, 0x4b, 0x38, 0x71, 0x76, 0x41, 0x4d, 0x32, 0x54, 0x58, 0x4e, 0x62, 0x44, 0x35, 0x70, + 0x53, 0x6c, 0x31, 0x33, 0x51, 0x30, 0x34, 0x41, 0x33, 0x68, 0x6f, 0x67, 0x4f, 0x65, 0x39, 0x51, 0x41, 0x67, + 0x41, 0x77, 0x4f, 0x61, 0x58, 0x75, 0x74, 0x55, 0x31, 0x41, 0x4f, 0x34, 0x45, 0x6c, 0x6b, 0x37, 0x7a, 0x35, + 0x79, 0x65, 0x41, 0x5a, 0x77, 0x6c, 0x54, 0x66, 0x78, 0x74, 0x66, 0x36, 0x71, 0x4e, 0x57, 0x41, 0x54, 0x44, + 0x67, 0x5c, 0x0a, + 0x09, 0x36, 0x76, 0x38, 0x6b, 0x38, 0x44, 0x68, 0x68, 0x30, 0x63, 0x2f, 0x6d, 0x6c, 0x36, 0x5a, 0x52, 0x71, + 0x77, 0x44, 0x49, 0x7a, 0x4b, 0x48, 0x2f, 0x39, 0x50, 0x38, 0x34, 0x38, 0x43, 0x44, 0x77, 0x41, 0x64, 0x6a, + 0x38, 0x30, 0x75, 0x6e, 0x55, 0x4d, 0x51, 0x41, 0x32, 0x41, 0x41, 0x74, 0x36, 0x2f, 0x50, 0x34, 0x51, 0x63, + 0x41, 0x2f, 0x68, 0x51, 0x42, 0x2b, 0x62, 0x58, 0x78, 0x70, 0x41, 0x62, 0x51, 0x4c, 0x67, 0x4e, 0x4b, 0x76, + 0x2f, 0x5c, 0x0a, + 0x09, 0x65, 0x77, 0x6e, 0x42, 0x38, 0x44, 0x58, 0x59, 0x2f, 0x4e, 0x4b, 0x67, 0x36, 0x72, 0x59, 0x62, 0x63, + 0x42, 0x37, 0x68, 0x59, 0x4a, 0x35, 0x4f, 0x32, 0x34, 0x46, 0x62, 0x73, 0x66, 0x6d, 0x6c, 0x61, 0x48, 0x55, + 0x4c, 0x67, 0x49, 0x33, 0x41, 0x57, 0x52, 0x32, 0x50, 0x74, 0x77, 0x4b, 0x33, 0x41, 0x54, 0x2b, 0x43, 0x7a, + 0x53, 0x2f, 0x46, 0x71, 0x6b, 0x55, 0x41, 0x39, 0x46, 0x6e, 0x39, 0x2f, 0x78, 0x53, 0x34, 0x48, 0x66, 0x67, + 0x5a, 0x5c, 0x0a, + 0x09, 0x62, 0x48, 0x34, 0x70, 0x6a, 0x31, 0x6f, 0x45, 0x51, 0x47, 0x59, 0x42, 0x34, 0x63, 0x77, 0x39, 0x45, + 0x45, 0x37, 0x64, 0x64, 0x51, 0x66, 0x68, 0x62, 0x44, 0x34, 0x32, 0x76, 0x35, 0x52, 0x54, 0x6e, 0x51, 0x4a, + 0x67, 0x49, 0x32, 0x45, 0x58, 0x34, 0x47, 0x62, 0x43, 0x61, 0x76, 0x38, 0x78, 0x73, 0x50, 0x6d, 0x6c, 0x59, + 0x56, 0x54, 0x2b, 0x68, 0x43, 0x41, 0x64, 0x30, 0x2f, 0x2f, 0x33, 0x67, 0x54, 0x33, 0x41, 0x30, 0x33, 0x68, + 0x63, 0x5c, 0x0a, + 0x09, 0x76, 0x7a, 0x51, 0x53, 0x64, 0x5a, 0x6b, 0x42, 0x4c, 0x41, 0x61, 0x2b, 0x41, 0x70, 0x37, 0x45, 0x35, + 0x70, 0x64, 0x47, 0x70, 0x69, 0x34, 0x7a, 0x67, 0x44, 0x45, 0x36, 0x72, 0x72, 0x64, 0x6e, 0x38, 0x30, 0x75, + 0x6a, 0x55, 0x5a, 0x63, 0x44, 0x67, 0x56, 0x70, 0x67, 0x34, 0x30, 0x75, 0x6a, 0x56, 0x76, 0x6b, 0x5a, 0x67, + 0x4b, 0x54, 0x69, 0x31, 0x47, 0x55, 0x4e, 0x51, 0x46, 0x49, 0x42, 0x44, 0x41, 0x41, 0x70, 0x59, 0x51, 0x61, + 0x41, 0x5c, 0x0a, + 0x09, 0x6c, 0x44, 0x41, 0x44, 0x51, 0x45, 0x71, 0x59, 0x41, 0x53, 0x41, 0x6c, 0x7a, 0x41, 0x43, 0x51, 0x45, + 0x6d, 0x59, 0x41, 0x53, 0x41, 0x6b, 0x7a, 0x41, 0x4b, 0x53, 0x45, 0x47, 0x51, 0x42, 0x53, 0x77, 0x67, 0x77, + 0x41, 0x4b, 0x57, 0x45, 0x47, 0x67, 0x4a, 0x51, 0x77, 0x41, 0x30, 0x42, 0x4b, 0x6d, 0x41, 0x45, 0x67, 0x4a, + 0x63, 0x77, 0x41, 0x6b, 0x42, 0x4a, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x4d, 0x77, 0x43, 0x6b, 0x68, 0x42, 0x6b, + 0x41, 0x5c, 0x0a, + 0x09, 0x55, 0x73, 0x49, 0x4d, 0x41, 0x43, 0x6c, 0x68, 0x42, 0x6f, 0x43, 0x55, 0x4d, 0x41, 0x4e, 0x41, 0x53, + 0x70, 0x67, 0x42, 0x49, 0x43, 0x58, 0x4d, 0x41, 0x4a, 0x41, 0x53, 0x5a, 0x67, 0x42, 0x49, 0x43, 0x54, 0x4d, + 0x41, 0x70, 0x49, 0x51, 0x5a, 0x41, 0x46, 0x4c, 0x43, 0x44, 0x41, 0x41, 0x70, 0x59, 0x51, 0x61, 0x41, 0x6c, + 0x44, 0x41, 0x44, 0x51, 0x45, 0x71, 0x59, 0x41, 0x53, 0x41, 0x6c, 0x7a, 0x41, 0x43, 0x51, 0x45, 0x6d, 0x59, + 0x41, 0x5c, 0x0a, + 0x09, 0x53, 0x41, 0x6b, 0x7a, 0x41, 0x4b, 0x53, 0x45, 0x47, 0x51, 0x42, 0x53, 0x77, 0x67, 0x77, 0x41, 0x4b, + 0x57, 0x45, 0x47, 0x67, 0x4a, 0x51, 0x77, 0x41, 0x30, 0x42, 0x4b, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x63, 0x77, + 0x41, 0x6b, 0x42, 0x4a, 0x6d, 0x41, 0x45, 0x67, 0x4a, 0x4d, 0x77, 0x43, 0x6b, 0x68, 0x42, 0x6b, 0x41, 0x55, + 0x73, 0x49, 0x4d, 0x41, 0x43, 0x6c, 0x68, 0x42, 0x6f, 0x43, 0x55, 0x4d, 0x41, 0x4e, 0x41, 0x53, 0x70, 0x67, + 0x42, 0x5c, 0x0a, + 0x09, 0x49, 0x43, 0x58, 0x4d, 0x41, 0x4a, 0x41, 0x53, 0x5a, 0x67, 0x42, 0x49, 0x43, 0x54, 0x4d, 0x41, 0x70, + 0x49, 0x51, 0x5a, 0x41, 0x46, 0x4c, 0x43, 0x44, 0x41, 0x41, 0x70, 0x59, 0x66, 0x38, 0x44, 0x63, 0x44, 0x39, + 0x39, 0x47, 0x6c, 0x32, 0x37, 0x6b, 0x55, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, + 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x70, + 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x42, 0x63, 0x63, 0x71, 0x68, 0x6d, 0x41, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x79, 0x39, 0x65, 0x62, 0x77, 0x6c, 0x56, 0x31, 0x55, 0x76, 0x2f, 0x6c, + 0x31, 0x56, 0x5c, 0x0a, + 0x09, 0x5a, 0x37, 0x68, 0x44, 0x39, 0x37, 0x33, 0x64, 0x6e, 0x52, 0x34, 0x79, 0x64, 0x79, 0x66, 0x64, 0x68, + 0x42, 0x41, 0x79, 0x51, 0x42, 0x42, 0x4d, 0x43, 0x43, 0x42, 0x44, 0x6e, 0x67, 0x4a, 0x52, 0x47, 0x63, 0x57, + 0x66, 0x54, 0x31, 0x51, 0x45, 0x55, 0x51, 0x48, 0x31, 0x5a, 0x2b, 0x43, 0x4a, 0x67, 0x6b, 0x39, 0x42, 0x48, + 0x6a, 0x6a, 0x41, 0x38, 0x34, 0x47, 0x41, 0x54, 0x49, 0x72, 0x54, 0x44, 0x35, 0x2b, 0x6f, 0x50, 0x50, 0x7a, + 0x4a, 0x5c, 0x0a, + 0x09, 0x45, 0x30, 0x55, 0x68, 0x41, 0x57, 0x51, 0x4d, 0x49, 0x43, 0x52, 0x6b, 0x41, 0x45, 0x4a, 0x43, 0x35, + 0x6e, 0x6e, 0x6f, 0x76, 0x74, 0x31, 0x33, 0x50, 0x50, 0x64, 0x55, 0x37, 0x66, 0x66, 0x48, 0x72, 0x72, 0x31, + 0x72, 0x72, 0x62, 0x56, 0x58, 0x6e, 0x64, 0x76, 0x45, 0x4f, 0x2f, 0x54, 0x7a, 0x31, 0x75, 0x72, 0x50, 0x37, + 0x56, 0x4f, 0x6e, 0x61, 0x67, 0x39, 0x72, 0x72, 0x2b, 0x47, 0x37, 0x31, 0x74, 0x36, 0x31, 0x71, 0x77, 0x34, + 0x35, 0x5c, 0x0a, + 0x09, 0x35, 0x39, 0x42, 0x53, 0x53, 0x79, 0x31, 0x74, 0x54, 0x73, 0x6f, 0x32, 0x6d, 0x6f, 0x47, 0x57, 0x57, + 0x6d, 0x70, 0x70, 0x34, 0x36, 0x67, 0x46, 0x67, 0x4a, 0x5a, 0x61, 0x32, 0x73, 0x54, 0x55, 0x41, 0x6b, 0x42, + 0x4c, 0x4c, 0x57, 0x31, 0x69, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x59, 0x32, 0x4d, 0x62, 0x55, 0x41, 0x30, + 0x46, 0x4a, 0x4c, 0x6d, 0x35, 0x68, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x55, 0x31, 0x4d, 0x4c, 0x51, 0x43, + 0x30, 0x5c, 0x0a, + 0x09, 0x31, 0x4e, 0x49, 0x6d, 0x70, 0x68, 0x59, 0x41, 0x57, 0x6d, 0x70, 0x70, 0x45, 0x31, 0x4d, 0x4c, 0x41, + 0x43, 0x32, 0x31, 0x74, 0x49, 0x6d, 0x70, 0x42, 0x59, 0x43, 0x57, 0x57, 0x74, 0x72, 0x45, 0x31, 0x41, 0x4a, + 0x41, 0x53, 0x79, 0x31, 0x74, 0x59, 0x6d, 0x6f, 0x42, 0x6f, 0x4b, 0x57, 0x57, 0x4e, 0x6a, 0x47, 0x31, 0x41, + 0x4e, 0x42, 0x53, 0x53, 0x35, 0x75, 0x59, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, 0x4e, 0x54, 0x43, 0x30, + 0x41, 0x5c, 0x0a, + 0x09, 0x74, 0x4e, 0x54, 0x53, 0x4a, 0x71, 0x59, 0x57, 0x41, 0x46, 0x70, 0x71, 0x61, 0x52, 0x4e, 0x54, 0x43, + 0x77, 0x41, 0x74, 0x74, 0x62, 0x53, 0x4a, 0x71, 0x51, 0x57, 0x41, 0x6c, 0x6c, 0x72, 0x61, 0x78, 0x4e, 0x51, + 0x43, 0x51, 0x45, 0x73, 0x74, 0x62, 0x57, 0x4a, 0x71, 0x41, 0x61, 0x43, 0x6c, 0x6c, 0x6a, 0x59, 0x78, 0x74, + 0x51, 0x44, 0x51, 0x55, 0x6b, 0x75, 0x62, 0x6d, 0x46, 0x6f, 0x41, 0x61, 0x4b, 0x6d, 0x6c, 0x54, 0x55, 0x77, + 0x74, 0x5c, 0x0a, + 0x09, 0x41, 0x4c, 0x54, 0x55, 0x30, 0x69, 0x61, 0x6d, 0x46, 0x67, 0x42, 0x61, 0x61, 0x6d, 0x6b, 0x54, 0x55, + 0x77, 0x73, 0x41, 0x4c, 0x62, 0x57, 0x30, 0x69, 0x61, 0x6b, 0x46, 0x67, 0x4a, 0x5a, 0x61, 0x32, 0x73, 0x54, + 0x55, 0x41, 0x6b, 0x42, 0x4c, 0x4c, 0x57, 0x31, 0x69, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x59, 0x32, 0x4d, + 0x62, 0x55, 0x41, 0x30, 0x46, 0x4a, 0x4c, 0x6d, 0x35, 0x68, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x55, 0x31, + 0x4d, 0x5c, 0x0a, + 0x09, 0x4c, 0x51, 0x43, 0x30, 0x31, 0x4e, 0x49, 0x6d, 0x70, 0x68, 0x59, 0x41, 0x57, 0x6d, 0x70, 0x70, 0x45, + 0x31, 0x4d, 0x4c, 0x41, 0x43, 0x32, 0x31, 0x74, 0x49, 0x6d, 0x70, 0x42, 0x59, 0x43, 0x57, 0x57, 0x74, 0x72, + 0x45, 0x31, 0x41, 0x4a, 0x41, 0x53, 0x79, 0x31, 0x74, 0x59, 0x6d, 0x6f, 0x42, 0x6f, 0x4b, 0x57, 0x57, 0x4e, + 0x6a, 0x47, 0x31, 0x41, 0x4e, 0x42, 0x53, 0x53, 0x35, 0x75, 0x59, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, + 0x4e, 0x5c, 0x0a, + 0x09, 0x54, 0x43, 0x30, 0x41, 0x74, 0x4e, 0x54, 0x53, 0x4a, 0x71, 0x59, 0x57, 0x41, 0x46, 0x70, 0x71, 0x61, + 0x52, 0x4e, 0x54, 0x43, 0x77, 0x41, 0x74, 0x74, 0x62, 0x53, 0x4a, 0x71, 0x51, 0x57, 0x41, 0x6c, 0x6c, 0x72, + 0x61, 0x78, 0x4e, 0x51, 0x43, 0x51, 0x45, 0x73, 0x74, 0x62, 0x57, 0x4a, 0x71, 0x41, 0x61, 0x43, 0x6c, 0x6c, + 0x6a, 0x59, 0x78, 0x74, 0x51, 0x44, 0x51, 0x55, 0x6b, 0x75, 0x62, 0x6d, 0x46, 0x6f, 0x41, 0x61, 0x4b, 0x6d, + 0x6c, 0x5c, 0x0a, + 0x09, 0x54, 0x55, 0x77, 0x74, 0x41, 0x4c, 0x54, 0x55, 0x30, 0x69, 0x61, 0x6d, 0x46, 0x67, 0x42, 0x61, 0x61, + 0x6d, 0x6b, 0x54, 0x55, 0x32, 0x65, 0x6a, 0x47, 0x57, 0x69, 0x70, 0x70, 0x66, 0x38, 0x6f, 0x74, 0x48, 0x2f, + 0x66, 0x76, 0x6e, 0x68, 0x4d, 0x49, 0x41, 0x44, 0x41, 0x44, 0x54, 0x66, 0x66, 0x74, 0x45, 0x48, 0x63, 0x48, + 0x42, 0x32, 0x31, 0x47, 0x55, 0x42, 0x4c, 0x4c, 0x61, 0x30, 0x75, 0x50, 0x59, 0x74, 0x41, 0x31, 0x77, 0x4f, + 0x59, 0x5c, 0x0a, + 0x09, 0x33, 0x6d, 0x68, 0x47, 0x6a, 0x6f, 0x5a, 0x61, 0x41, 0x47, 0x69, 0x70, 0x70, 0x56, 0x55, 0x67, 0x46, + 0x76, 0x31, 0x2f, 0x79, 0x6a, 0x6e, 0x33, 0x4d, 0x41, 0x43, 0x58, 0x4f, 0x6a, 0x67, 0x63, 0x32, 0x48, 0x66, + 0x61, 0x78, 0x6a, 0x46, 0x31, 0x46, 0x4e, 0x51, 0x43, 0x51, 0x45, 0x73, 0x74, 0x72, 0x52, 0x35, 0x31, 0x41, + 0x56, 0x77, 0x4d, 0x41, 0x68, 0x7a, 0x63, 0x79, 0x77, 0x6a, 0x55, 0x63, 0x33, 0x41, 0x62, 0x7a, 0x64, 0x4e, + 0x49, 0x5c, 0x0a, + 0x09, 0x61, 0x67, 0x47, 0x67, 0x70, 0x5a, 0x5a, 0x57, 0x67, 0x78, 0x78, 0x41, 0x6f, 0x4d, 0x66, 0x44, 0x59, + 0x57, 0x73, 0x31, 0x2f, 0x39, 0x2f, 0x74, 0x34, 0x48, 0x35, 0x67, 0x6f, 0x39, 0x6c, 0x61, 0x69, 0x56, 0x6f, + 0x41, 0x61, 0x4b, 0x6d, 0x6c, 0x56, 0x53, 0x4c, 0x6e, 0x33, 0x4e, 0x4f, 0x4a, 0x71, 0x50, 0x6f, 0x43, 0x45, + 0x4f, 0x67, 0x46, 0x63, 0x4d, 0x44, 0x2b, 0x76, 0x66, 0x73, 0x32, 0x6c, 0x4b, 0x39, 0x52, 0x31, 0x41, 0x4a, + 0x41, 0x5c, 0x0a, + 0x09, 0x53, 0x79, 0x33, 0x39, 0x4f, 0x79, 0x6e, 0x4d, 0x2f, 0x34, 0x6e, 0x6f, 0x6d, 0x63, 0x35, 0x56, 0x4b, + 0x62, 0x2f, 0x48, 0x67, 0x52, 0x2b, 0x47, 0x6e, 0x78, 0x59, 0x63, 0x73, 0x39, 0x51, 0x43, 0x51, 0x45, 0x73, + 0x74, 0x72, 0x51, 0x59, 0x52, 0x39, 0x6a, 0x75, 0x34, 0x63, 0x79, 0x76, 0x48, 0x42, 0x77, 0x41, 0x34, 0x75, + 0x43, 0x6b, 0x69, 0x75, 0x6d, 0x6a, 0x6a, 0x6d, 0x46, 0x71, 0x5a, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, + 0x56, 0x5c, 0x0a, + 0x09, 0x49, 0x41, 0x4c, 0x39, 0x69, 0x44, 0x6a, 0x68, 0x34, 0x6c, 0x36, 0x41, 0x5a, 0x38, 0x52, 0x70, 0x77, + 0x54, 0x46, 0x49, 0x4c, 0x51, 0x43, 0x30, 0x31, 0x4e, 0x4b, 0x2f, 0x67, 0x30, 0x4c, 0x36, 0x37, 0x2b, 0x42, + 0x2b, 0x42, 0x50, 0x42, 0x4f, 0x37, 0x2b, 0x42, 0x41, 0x52, 0x4b, 0x69, 0x6d, 0x41, 0x7a, 0x2f, 0x67, 0x34, + 0x4d, 0x51, 0x6d, 0x6f, 0x57, 0x4f, 0x4a, 0x57, 0x67, 0x42, 0x6f, 0x71, 0x61, 0x56, 0x2f, 0x50, 0x35, 0x30, + 0x44, 0x5c, 0x0a, + 0x09, 0x34, 0x48, 0x77, 0x34, 0x49, 0x4b, 0x34, 0x42, 0x41, 0x4b, 0x67, 0x69, 0x2f, 0x37, 0x6b, 0x41, 0x64, + 0x6d, 0x77, 0x51, 0x58, 0x79, 0x74, 0x53, 0x43, 0x77, 0x41, 0x74, 0x74, 0x66, 0x51, 0x51, 0x4b, 0x57, 0x7a, + 0x79, 0x49, 0x64, 0x41, 0x76, 0x45, 0x4d, 0x67, 0x37, 0x50, 0x41, 0x48, 0x68, 0x31, 0x72, 0x39, 0x7a, 0x44, + 0x67, 0x36, 0x4f, 0x41, 0x44, 0x78, 0x70, 0x77, 0x35, 0x68, 0x63, 0x67, 0x56, 0x6f, 0x41, 0x61, 0x4b, 0x6d, + 0x6c, 0x5c, 0x0a, + 0x09, 0x68, 0x30, 0x67, 0x4f, 0x44, 0x67, 0x54, 0x61, 0x42, 0x2b, 0x43, 0x6e, 0x6e, 0x58, 0x4d, 0x69, 0x2b, + 0x67, 0x4d, 0x41, 0x79, 0x45, 0x38, 0x4a, 0x43, 0x50, 0x52, 0x39, 0x36, 0x38, 0x2f, 0x64, 0x30, 0x56, 0x45, + 0x4c, 0x41, 0x43, 0x32, 0x31, 0x39, 0x42, 0x41, 0x6f, 0x52, 0x48, 0x38, 0x48, 0x39, 0x33, 0x62, 0x6e, 0x6e, + 0x4c, 0x2f, 0x56, 0x46, 0x39, 0x62, 0x36, 0x2f, 0x45, 0x37, 0x41, 0x63, 0x42, 0x30, 0x41, 0x6e, 0x67, 0x6a, + 0x67, 0x5c, 0x0a, + 0x09, 0x6d, 0x46, 0x77, 0x48, 0x61, 0x4a, 0x38, 0x47, 0x62, 0x4b, 0x6d, 0x6c, 0x37, 0x34, 0x4c, 0x55, 0x45, + 0x33, 0x2b, 0x76, 0x63, 0x6e, 0x41, 0x2f, 0x46, 0x4e, 0x4c, 0x2b, 0x73, 0x41, 0x42, 0x59, 0x58, 0x51, 0x50, + 0x67, 0x41, 0x63, 0x44, 0x42, 0x50, 0x52, 0x72, 0x2b, 0x34, 0x61, 0x43, 0x5a, 0x64, 0x57, 0x64, 0x34, 0x42, + 0x54, 0x6f, 0x6d, 0x41, 0x4f, 0x44, 0x41, 0x76, 0x74, 0x4f, 0x51, 0x37, 0x4a, 0x6d, 0x32, 0x74, 0x6c, 0x42, + 0x54, 0x5c, 0x0a, + 0x09, 0x77, 0x7a, 0x57, 0x71, 0x42, 0x51, 0x34, 0x63, 0x2b, 0x34, 0x39, 0x67, 0x74, 0x76, 0x52, 0x2f, 0x4a, + 0x37, 0x45, 0x48, 0x65, 0x77, 0x6a, 0x41, 0x71, 0x78, 0x7a, 0x63, 0x57, 0x2b, 0x41, 0x51, 0x37, 0x62, 0x4b, + 0x61, 0x45, 0x73, 0x54, 0x79, 0x44, 0x41, 0x77, 0x79, 0x41, 0x45, 0x39, 0x30, 0x63, 0x50, 0x2b, 0x77, 0x6a, + 0x75, 0x77, 0x65, 0x46, 0x52, 0x30, 0x54, 0x41, 0x46, 0x41, 0x4a, 0x37, 0x71, 0x63, 0x64, 0x33, 0x48, 0x6b, + 0x45, 0x5c, 0x0a, + 0x09, 0x6d, 0x6e, 0x56, 0x77, 0x51, 0x79, 0x49, 0x36, 0x37, 0x4a, 0x77, 0x72, 0x51, 0x54, 0x67, 0x45, 0x68, + 0x77, 0x4b, 0x45, 0x49, 0x77, 0x52, 0x61, 0x42, 0x6a, 0x44, 0x6e, 0x79, 0x43, 0x33, 0x43, 0x59, 0x52, 0x48, + 0x41, 0x50, 0x41, 0x67, 0x44, 0x41, 0x73, 0x30, 0x43, 0x47, 0x41, 0x4b, 0x59, 0x63, 0x58, 0x42, 0x4f, 0x70, + 0x31, 0x6f, 0x52, 0x6a, 0x66, 0x6b, 0x63, 0x6a, 0x64, 0x2b, 0x61, 0x64, 0x62, 0x44, 0x50, 0x4b, 0x2b, 0x49, + 0x49, 0x5c, 0x0a, + 0x09, 0x62, 0x37, 0x55, 0x50, 0x74, 0x4f, 0x44, 0x7a, 0x48, 0x34, 0x30, 0x4d, 0x57, 0x33, 0x6f, 0x34, 0x67, + 0x4c, 0x63, 0x36, 0x35, 0x35, 0x35, 0x42, 0x52, 0x48, 0x44, 0x6b, 0x2b, 0x44, 0x56, 0x76, 0x48, 0x79, 0x36, + 0x65, 0x34, 0x50, 0x51, 0x45, 0x41, 0x4d, 0x63, 0x63, 0x41, 0x46, 0x43, 0x79, 0x63, 0x4c, 0x48, 0x4f, 0x78, + 0x4b, 0x4c, 0x2f, 0x31, 0x51, 0x51, 0x36, 0x4f, 0x36, 0x42, 0x6f, 0x2f, 0x48, 0x54, 0x56, 0x50, 0x56, 0x55, + 0x6d, 0x5c, 0x0a, + 0x09, 0x57, 0x4c, 0x36, 0x78, 0x49, 0x6a, 0x71, 0x6b, 0x51, 0x31, 0x30, 0x4f, 0x6d, 0x43, 0x48, 0x51, 0x30, + 0x4d, 0x48, 0x4e, 0x45, 0x6d, 0x67, 0x41, 0x59, 0x42, 0x37, 0x41, 0x45, 0x6f, 0x41, 0x46, 0x35, 0x39, 0x77, + 0x53, 0x43, 0x41, 0x76, 0x68, 0x4f, 0x34, 0x41, 0x6c, 0x41, 0x69, 0x30, 0x34, 0x35, 0x35, 0x61, 0x49, 0x61, + 0x41, 0x48, 0x41, 0x77, 0x4d, 0x48, 0x4e, 0x45, 0x79, 0x6a, 0x35, 0x72, 0x4e, 0x70, 0x70, 0x4f, 0x6c, 0x38, + 0x34, 0x5c, 0x0a, + 0x09, 0x75, 0x43, 0x4d, 0x6a, 0x42, 0x39, 0x73, 0x45, 0x4e, 0x4e, 0x2b, 0x4e, 0x43, 0x69, 0x79, 0x41, 0x4f, + 0x6f, 0x70, 0x32, 0x62, 0x37, 0x7a, 0x6c, 0x35, 0x75, 0x2b, 0x69, 0x6b, 0x38, 0x31, 0x4a, 0x30, 0x64, 0x6c, + 0x54, 0x65, 0x55, 0x34, 0x41, 0x65, 0x41, 0x61, 0x41, 0x6e, 0x77, 0x54, 0x77, 0x51, 0x2f, 0x34, 0x32, 0x76, + 0x33, 0x4a, 0x32, 0x49, 0x4e, 0x37, 0x37, 0x5a, 0x33, 0x62, 0x49, 0x70, 0x77, 0x4b, 0x66, 0x68, 0x73, 0x4f, + 0x54, 0x5c, 0x0a, + 0x09, 0x69, 0x65, 0x69, 0x59, 0x43, 0x68, 0x49, 0x62, 0x6e, 0x67, 0x46, 0x55, 0x6a, 0x6a, 0x34, 0x4f, 0x34, + 0x42, 0x48, 0x63, 0x2b, 0x51, 0x50, 0x46, 0x44, 0x52, 0x57, 0x45, 0x78, 0x75, 0x67, 0x73, 0x36, 0x6e, 0x67, + 0x67, 0x6d, 0x4b, 0x36, 0x4f, 0x6a, 0x77, 0x73, 0x4c, 0x4d, 0x6e, 0x79, 0x44, 0x52, 0x75, 0x79, 0x37, 0x61, + 0x6a, 0x64, 0x75, 0x33, 0x4b, 0x67, 0x55, 0x79, 0x76, 0x76, 0x6b, 0x51, 0x42, 0x54, 0x36, 0x31, 0x38, 0x44, + 0x45, 0x5c, 0x0a, + 0x09, 0x41, 0x61, 0x73, 0x61, 0x30, 0x32, 0x45, 0x41, 0x6a, 0x6b, 0x42, 0x7a, 0x41, 0x4a, 0x59, 0x64, 0x33, + 0x43, 0x4b, 0x41, 0x52, 0x53, 0x49, 0x61, 0x4f, 0x75, 0x64, 0x6d, 0x71, 0x32, 0x4b, 0x48, 0x4b, 0x6a, 0x5a, + 0x6d, 0x51, 0x52, 0x6a, 0x43, 0x59, 0x52, 0x47, 0x45, 0x52, 0x51, 0x42, 0x44, 0x4f, 0x4d, 0x77, 0x53, 0x6b, + 0x58, 0x50, 0x4f, 0x7a, 0x56, 0x54, 0x54, 0x6d, 0x79, 0x50, 0x4f, 0x75, 0x51, 0x4b, 0x45, 0x42, 0x51, 0x49, + 0x74, 0x5c, 0x0a, + 0x09, 0x4f, 0x62, 0x69, 0x43, 0x51, 0x45, 0x65, 0x71, 0x4d, 0x66, 0x74, 0x36, 0x50, 0x68, 0x55, 0x39, 0x41, + 0x71, 0x44, 0x77, 0x55, 0x73, 0x42, 0x4d, 0x4e, 0x54, 0x63, 0x64, 0x41, 0x4a, 0x6a, 0x66, 0x76, 0x32, 0x2b, + 0x66, 0x6e, 0x51, 0x6d, 0x4e, 0x6f, 0x71, 0x5a, 0x73, 0x36, 0x47, 0x67, 0x79, 0x4a, 0x71, 0x75, 0x4d, 0x63, + 0x53, 0x37, 0x4a, 0x71, 0x6f, 0x34, 0x79, 0x47, 0x30, 0x76, 0x4b, 0x41, 0x6e, 0x7a, 0x7a, 0x54, 0x58, 0x4f, + 0x2f, 0x5c, 0x0a, + 0x09, 0x6d, 0x67, 0x69, 0x36, 0x7a, 0x35, 0x79, 0x49, 0x48, 0x75, 0x36, 0x63, 0x4f, 0x77, 0x2b, 0x45, 0x52, + 0x77, 0x48, 0x34, 0x58, 0x67, 0x49, 0x39, 0x33, 0x73, 0x46, 0x31, 0x49, 0x36, 0x39, 0x55, 0x32, 0x30, 0x36, + 0x77, 0x70, 0x32, 0x71, 0x75, 0x37, 0x34, 0x2f, 0x44, 0x4e, 0x57, 0x6d, 0x58, 0x6a, 0x79, 0x57, 0x69, 0x33, + 0x4d, 0x45, 0x56, 0x4b, 0x34, 0x78, 0x71, 0x58, 0x57, 0x6e, 0x44, 0x41, 0x51, 0x41, 0x41, 0x48, 0x4e, 0x79, + 0x35, 0x5c, 0x0a, + 0x09, 0x41, 0x48, 0x4c, 0x74, 0x57, 0x41, 0x49, 0x49, 0x6d, 0x50, 0x45, 0x47, 0x4a, 0x56, 0x53, 0x33, 0x57, + 0x45, 0x52, 0x62, 0x59, 0x74, 0x73, 0x6c, 0x63, 0x2b, 0x44, 0x51, 0x52, 0x6a, 0x41, 0x51, 0x49, 0x68, 0x4c, + 0x4b, 0x45, 0x2f, 0x77, 0x77, 0x42, 0x59, 0x62, 0x76, 0x75, 0x71, 0x77, 0x46, 0x45, 0x75, 0x7a, 0x36, 0x56, + 0x46, 0x56, 0x76, 0x6d, 0x6f, 0x69, 0x69, 0x49, 0x58, 0x43, 0x2b, 0x51, 0x31, 0x6b, 0x4f, 0x4c, 0x76, 0x45, + 0x38, 0x5c, 0x0a, + 0x09, 0x31, 0x58, 0x30, 0x59, 0x73, 0x75, 0x4a, 0x66, 0x61, 0x72, 0x35, 0x49, 0x7a, 0x54, 0x38, 0x44, 0x7a, + 0x35, 0x4b, 0x2f, 0x65, 0x51, 0x44, 0x4c, 0x46, 0x65, 0x38, 0x7a, 0x46, 0x63, 0x67, 0x4d, 0x41, 0x63, 0x78, + 0x57, 0x35, 0x30, 0x4a, 0x6d, 0x42, 0x43, 0x49, 0x36, 0x41, 0x70, 0x2f, 0x56, 0x6c, 0x41, 0x41, 0x4f, 0x52, + 0x2f, 0x6d, 0x68, 0x79, 0x71, 0x44, 0x71, 0x75, 0x65, 0x38, 0x79, 0x67, 0x44, 0x6b, 0x32, 0x4a, 0x6c, 0x2b, + 0x65, 0x5c, 0x0a, + 0x09, 0x61, 0x76, 0x34, 0x63, 0x33, 0x41, 0x77, 0x41, 0x78, 0x32, 0x51, 0x32, 0x43, 0x32, 0x44, 0x49, 0x39, + 0x4c, 0x4c, 0x67, 0x34, 0x4a, 0x59, 0x49, 0x46, 0x4a, 0x32, 0x4c, 0x52, 0x31, 0x48, 0x65, 0x68, 0x34, 0x69, + 0x73, 0x77, 0x52, 0x47, 0x42, 0x6a, 0x49, 0x69, 0x6d, 0x74, 0x46, 0x34, 0x71, 0x36, 0x68, 0x4c, 0x52, 0x70, + 0x48, 0x4f, 0x75, 0x43, 0x38, 0x49, 0x6b, 0x48, 0x4d, 0x4a, 0x6e, 0x68, 0x34, 0x69, 0x32, 0x4f, 0x4c, 0x68, + 0x70, 0x5c, 0x0a, + 0x09, 0x45, 0x4c, 0x62, 0x42, 0x34, 0x58, 0x67, 0x69, 0x4f, 0x74, 0x6b, 0x35, 0x64, 0x38, 0x43, 0x52, 0x47, + 0x2b, 0x4d, 0x79, 0x35, 0x72, 0x4c, 0x6c, 0x49, 0x4d, 0x41, 0x70, 0x79, 0x6a, 0x36, 0x73, 0x42, 0x7a, 0x68, + 0x6d, 0x76, 0x7a, 0x35, 0x34, 0x54, 0x54, 0x69, 0x34, 0x73, 0x77, 0x46, 0x63, 0x6c, 0x53, 0x68, 0x31, 0x41, + 0x2b, 0x6d, 0x59, 0x41, 0x41, 0x41, 0x43, 0x50, 0x64, 0x72, 0x42, 0x53, 0x63, 0x56, 0x56, 0x42, 0x6b, 0x62, + 0x77, 0x5c, 0x0a, + 0x09, 0x38, 0x79, 0x79, 0x52, 0x42, 0x66, 0x41, 0x56, 0x31, 0x31, 0x44, 0x4f, 0x53, 0x4d, 0x6d, 0x34, 0x4d, + 0x71, 0x4a, 0x2b, 0x79, 0x48, 0x41, 0x53, 0x64, 0x73, 0x79, 0x56, 0x7a, 0x63, 0x46, 0x43, 0x74, 0x36, 0x4f, + 0x7a, 0x42, 0x75, 0x37, 0x63, 0x30, 0x65, 0x47, 0x59, 0x38, 0x79, 0x6d, 0x41, 0x6b, 0x47, 0x4e, 0x4d, 0x6a, + 0x54, 0x61, 0x4a, 0x49, 0x69, 0x4c, 0x62, 0x4d, 0x4b, 0x4a, 0x50, 0x35, 0x49, 0x6b, 0x5a, 0x49, 0x73, 0x2b, + 0x4b, 0x5c, 0x0a, + 0x09, 0x71, 0x74, 0x4d, 0x54, 0x4c, 0x4d, 0x75, 0x5a, 0x44, 0x6d, 0x4d, 0x4c, 0x73, 0x75, 0x64, 0x39, 0x36, + 0x50, 0x48, 0x47, 0x66, 0x68, 0x6a, 0x50, 0x6a, 0x52, 0x51, 0x63, 0x6e, 0x35, 0x79, 0x6f, 0x45, 0x39, 0x74, + 0x7a, 0x6b, 0x6e, 0x64, 0x72, 0x34, 0x55, 0x7a, 0x49, 0x78, 0x77, 0x42, 0x4a, 0x72, 0x67, 0x50, 0x65, 0x6a, + 0x75, 0x57, 0x63, 0x51, 0x52, 0x34, 0x43, 0x51, 0x48, 0x69, 0x36, 0x37, 0x74, 0x49, 0x36, 0x2f, 0x4c, 0x72, + 0x6d, 0x5c, 0x0a, + 0x09, 0x30, 0x35, 0x79, 0x61, 0x57, 0x76, 0x55, 0x5a, 0x57, 0x46, 0x58, 0x6c, 0x4c, 0x33, 0x44, 0x4f, 0x48, + 0x56, 0x4d, 0x41, 0x63, 0x4b, 0x7a, 0x73, 0x41, 0x33, 0x68, 0x4d, 0x6f, 0x32, 0x4b, 0x64, 0x45, 0x77, 0x61, + 0x54, 0x4f, 0x42, 0x59, 0x7a, 0x78, 0x48, 0x41, 0x74, 0x52, 0x50, 0x66, 0x34, 0x6a, 0x36, 0x6a, 0x65, 0x6e, + 0x56, 0x55, 0x5a, 0x4f, 0x30, 0x2f, 0x6c, 0x51, 0x68, 0x6d, 0x65, 0x50, 0x6e, 0x4c, 0x41, 0x34, 0x55, 0x59, + 0x54, 0x5c, 0x0a, + 0x09, 0x32, 0x71, 0x6a, 0x42, 0x6e, 0x55, 0x51, 0x36, 0x79, 0x38, 0x63, 0x51, 0x32, 0x6b, 0x73, 0x79, 0x44, + 0x4f, 0x35, 0x77, 0x69, 0x70, 0x66, 0x41, 0x44, 0x32, 0x2f, 0x50, 0x6e, 0x42, 0x61, 0x70, 0x4e, 0x68, 0x4d, + 0x6e, 0x63, 0x69, 0x78, 0x44, 0x49, 0x6c, 0x6e, 0x4f, 0x64, 0x46, 0x35, 0x31, 0x53, 0x6d, 0x64, 0x5a, 0x6b, + 0x5a, 0x63, 0x52, 0x6a, 0x68, 0x39, 0x30, 0x6c, 0x66, 0x42, 0x41, 0x4a, 0x44, 0x36, 0x35, 0x54, 0x43, 0x4c, + 0x66, 0x5c, 0x0a, + 0x09, 0x59, 0x54, 0x6a, 0x4f, 0x48, 0x6c, 0x2b, 0x55, 0x47, 0x35, 0x4d, 0x72, 0x50, 0x36, 0x65, 0x4c, 0x4a, + 0x2b, 0x31, 0x43, 0x32, 0x6c, 0x55, 0x59, 0x53, 0x7a, 0x6a, 0x48, 0x77, 0x59, 0x50, 0x4c, 0x6d, 0x37, 0x66, + 0x50, 0x62, 0x55, 0x65, 0x33, 0x41, 0x34, 0x63, 0x34, 0x58, 0x6a, 0x36, 0x2b, 0x61, 0x43, 0x64, 0x65, 0x31, + 0x34, 0x39, 0x72, 0x46, 0x4e, 0x34, 0x47, 0x30, 0x59, 0x59, 0x43, 0x77, 0x50, 0x36, 0x39, 0x2b, 0x34, 0x4a, + 0x67, 0x5c, 0x0a, + 0x09, 0x48, 0x38, 0x55, 0x4e, 0x51, 0x69, 0x4f, 0x31, 0x6e, 0x6d, 0x73, 0x44, 0x38, 0x50, 0x57, 0x43, 0x4d, + 0x69, 0x43, 0x6e, 0x44, 0x4f, 0x45, 0x38, 0x4e, 0x78, 0x61, 0x74, 0x4d, 0x4f, 0x34, 0x63, 0x49, 0x6c, 0x56, + 0x7a, 0x64, 0x54, 0x62, 0x41, 0x2f, 0x31, 0x6e, 0x54, 0x6b, 0x64, 0x43, 0x58, 0x53, 0x53, 0x77, 0x71, 0x36, + 0x4e, 0x52, 0x56, 0x39, 0x4b, 0x76, 0x41, 0x49, 0x2f, 0x4a, 0x4a, 0x63, 0x6c, 0x36, 0x5a, 0x47, 0x44, 0x49, + 0x33, 0x5c, 0x0a, + 0x09, 0x4e, 0x49, 0x4f, 0x46, 0x43, 0x43, 0x34, 0x75, 0x58, 0x56, 0x63, 0x52, 0x36, 0x61, 0x6e, 0x46, 0x64, + 0x2f, 0x68, 0x30, 0x55, 0x70, 0x5a, 0x4a, 0x4f, 0x2b, 0x78, 0x66, 0x34, 0x4a, 0x6c, 0x2f, 0x61, 0x72, 0x43, + 0x49, 0x5a, 0x61, 0x6e, 0x75, 0x4a, 0x39, 0x45, 0x50, 0x72, 0x78, 0x4c, 0x30, 0x77, 0x65, 0x71, 0x49, 0x31, + 0x4e, 0x2f, 0x56, 0x66, 0x43, 0x62, 0x7a, 0x66, 0x30, 0x69, 0x77, 0x45, 0x39, 0x4d, 0x35, 0x35, 0x61, 0x51, + 0x36, 0x5c, 0x0a, + 0x09, 0x36, 0x2b, 0x44, 0x50, 0x39, 0x50, 0x4f, 0x4d, 0x69, 0x6f, 0x4d, 0x59, 0x6c, 0x32, 0x47, 0x30, 0x46, + 0x2f, 0x6b, 0x79, 0x6b, 0x47, 0x54, 0x73, 0x41, 0x43, 0x34, 0x45, 0x6a, 0x71, 0x30, 0x4e, 0x51, 0x63, 0x64, + 0x43, 0x42, 0x74, 0x41, 0x6c, 0x30, 0x4c, 0x6e, 0x68, 0x69, 0x31, 0x43, 0x69, 0x51, 0x32, 0x4a, 0x77, 0x38, + 0x53, 0x75, 0x66, 0x4b, 0x72, 0x42, 0x50, 0x45, 0x57, 0x6c, 0x34, 0x55, 0x38, 0x48, 0x51, 0x41, 0x6c, 0x67, + 0x77, 0x5c, 0x0a, + 0x09, 0x38, 0x49, 0x6a, 0x39, 0x4d, 0x4b, 0x66, 0x56, 0x6b, 0x55, 0x59, 0x72, 0x6c, 0x42, 0x75, 0x63, 0x42, + 0x68, 0x49, 0x64, 0x77, 0x51, 0x57, 0x66, 0x53, 0x4e, 0x4e, 0x4a, 0x31, 0x6f, 0x6d, 0x34, 0x72, 0x71, 0x2f, + 0x70, 0x71, 0x4b, 0x5a, 0x65, 0x50, 0x70, 0x48, 0x30, 0x41, 0x5a, 0x62, 0x42, 0x61, 0x50, 0x37, 0x46, 0x47, + 0x48, 0x6e, 0x55, 0x5a, 0x75, 0x50, 0x6a, 0x52, 0x68, 0x33, 0x54, 0x63, 0x45, 0x73, 0x57, 0x71, 0x41, 0x46, + 0x61, 0x5c, 0x0a, + 0x09, 0x33, 0x36, 0x45, 0x78, 0x6e, 0x59, 0x7a, 0x78, 0x7a, 0x4f, 0x55, 0x6f, 0x2b, 0x47, 0x54, 0x4f, 0x4c, + 0x6b, 0x43, 0x54, 0x5a, 0x57, 0x7a, 0x67, 0x30, 0x79, 0x41, 0x47, 0x32, 0x68, 0x5a, 0x70, 0x2f, 0x69, 0x49, + 0x51, 0x36, 0x4c, 0x46, 0x58, 0x4d, 0x74, 0x50, 0x79, 0x31, 0x30, 0x47, 0x47, 0x5a, 0x35, 0x58, 0x57, 0x74, + 0x46, 0x4a, 0x6e, 0x6c, 0x68, 0x58, 0x2f, 0x5a, 0x34, 0x4c, 0x38, 0x2b, 0x74, 0x43, 0x78, 0x51, 0x68, 0x73, + 0x4f, 0x5c, 0x0a, + 0x09, 0x41, 0x45, 0x52, 0x30, 0x46, 0x6f, 0x41, 0x65, 0x52, 0x31, 0x71, 0x4e, 0x77, 0x50, 0x47, 0x37, 0x55, + 0x39, 0x45, 0x62, 0x64, 0x70, 0x53, 0x70, 0x47, 0x34, 0x65, 0x4d, 0x53, 0x67, 0x6f, 0x6b, 0x51, 0x76, 0x6d, + 0x6f, 0x7a, 0x42, 0x42, 0x6c, 0x2b, 0x48, 0x66, 0x57, 0x70, 0x67, 0x61, 0x6a, 0x6d, 0x4a, 0x30, 0x77, 0x2f, + 0x72, 0x67, 0x68, 0x69, 0x58, 0x6f, 0x38, 0x30, 0x33, 0x44, 0x79, 0x47, 0x68, 0x38, 0x6a, 0x6a, 0x31, 0x44, + 0x57, 0x5c, 0x0a, + 0x09, 0x6d, 0x45, 0x52, 0x62, 0x41, 0x52, 0x51, 0x30, 0x4b, 0x41, 0x5a, 0x5a, 0x61, 0x52, 0x41, 0x4a, 0x78, + 0x55, 0x6a, 0x4b, 0x7a, 0x38, 0x71, 0x49, 0x72, 0x49, 0x7a, 0x48, 0x57, 0x76, 0x45, 0x32, 0x2b, 0x57, 0x50, + 0x31, 0x72, 0x4f, 0x79, 0x4a, 0x38, 0x38, 0x58, 0x6e, 0x32, 0x61, 0x4a, 0x74, 0x79, 0x34, 0x2b, 0x35, 0x54, + 0x74, 0x4b, 0x6e, 0x37, 0x6b, 0x62, 0x79, 0x4a, 0x57, 0x54, 0x4f, 0x2b, 0x2b, 0x54, 0x4f, 0x7a, 0x75, 0x78, + 0x44, 0x5c, 0x0a, + 0x09, 0x5a, 0x35, 0x41, 0x61, 0x33, 0x45, 0x57, 0x2f, 0x54, 0x75, 0x6f, 0x35, 0x64, 0x73, 0x6d, 0x79, 0x6d, + 0x77, 0x70, 0x6f, 0x69, 0x55, 0x44, 0x66, 0x59, 0x34, 0x78, 0x73, 0x77, 0x32, 0x6a, 0x44, 0x41, 0x51, 0x44, + 0x41, 0x59, 0x2f, 0x53, 0x4a, 0x42, 0x4d, 0x6c, 0x46, 0x49, 0x47, 0x55, 0x70, 0x71, 0x62, 0x45, 0x34, 0x78, + 0x38, 0x76, 0x46, 0x4b, 0x4f, 0x4a, 0x50, 0x4a, 0x4d, 0x71, 0x4a, 0x42, 0x73, 0x6f, 0x4d, 0x51, 0x73, 0x77, + 0x2f, 0x5c, 0x0a, + 0x09, 0x6b, 0x36, 0x43, 0x56, 0x70, 0x74, 0x30, 0x52, 0x43, 0x49, 0x4b, 0x54, 0x67, 0x4a, 0x49, 0x73, 0x68, + 0x6e, 0x38, 0x4b, 0x77, 0x47, 0x46, 0x74, 0x52, 0x6d, 0x66, 0x47, 0x43, 0x69, 0x6d, 0x36, 0x49, 0x6a, 0x30, + 0x66, 0x6a, 0x56, 0x47, 0x55, 0x4f, 0x62, 0x49, 0x77, 0x61, 0x4f, 0x59, 0x45, 0x63, 0x53, 0x79, 0x73, 0x54, + 0x77, 0x74, 0x38, 0x42, 0x4a, 0x41, 0x5a, 0x36, 0x61, 0x30, 0x41, 0x6d, 0x70, 0x43, 0x57, 0x73, 0x7a, 0x37, + 0x45, 0x5c, 0x0a, + 0x09, 0x4f, 0x42, 0x76, 0x47, 0x6c, 0x2f, 0x54, 0x4e, 0x6e, 0x5a, 0x47, 0x74, 0x6b, 0x38, 0x54, 0x7a, 0x56, + 0x47, 0x64, 0x75, 0x2b, 0x70, 0x6f, 0x59, 0x46, 0x77, 0x50, 0x6b, 0x79, 0x41, 0x75, 0x37, 0x79, 0x36, 0x51, + 0x6a, 0x65, 0x7a, 0x49, 0x6d, 0x6c, 0x58, 0x6e, 0x70, 0x31, 0x44, 0x2f, 0x79, 0x45, 0x73, 0x62, 0x49, 0x77, + 0x56, 0x6a, 0x5a, 0x5a, 0x4e, 0x56, 0x76, 0x59, 0x75, 0x38, 0x62, 0x53, 0x52, 0x73, 0x4b, 0x41, 0x42, 0x55, + 0x79, 0x5c, 0x0a, + 0x09, 0x50, 0x74, 0x6f, 0x79, 0x68, 0x71, 0x52, 0x73, 0x70, 0x51, 0x78, 0x52, 0x4c, 0x6a, 0x79, 0x42, 0x52, + 0x61, 0x78, 0x4d, 0x51, 0x78, 0x54, 0x57, 0x61, 0x56, 0x72, 0x6f, 0x68, 0x36, 0x4e, 0x32, 0x45, 0x69, 0x30, + 0x4e, 0x55, 0x4c, 0x47, 0x69, 0x61, 0x6f, 0x77, 0x55, 0x49, 0x55, 0x58, 0x56, 0x43, 0x35, 0x42, 0x49, 0x4d, + 0x78, 0x66, 0x74, 0x38, 0x4c, 0x46, 0x39, 0x66, 0x6e, 0x74, 0x53, 0x70, 0x64, 0x7a, 0x38, 0x75, 0x33, 0x41, + 0x6f, 0x5c, 0x0a, + 0x09, 0x32, 0x4f, 0x65, 0x44, 0x73, 0x2b, 0x71, 0x73, 0x67, 0x6d, 0x63, 0x50, 0x6e, 0x42, 0x2f, 0x64, 0x68, + 0x2b, 0x55, 0x55, 0x79, 0x54, 0x46, 0x7a, 0x51, 0x6e, 0x46, 0x33, 0x77, 0x74, 0x57, 0x4f, 0x31, 0x73, 0x53, + 0x72, 0x50, 0x68, 0x66, 0x4c, 0x57, 0x6d, 0x6b, 0x35, 0x61, 0x68, 0x76, 0x67, 0x66, 0x59, 0x6c, 0x78, 0x36, + 0x7a, 0x45, 0x5a, 0x55, 0x35, 0x74, 0x51, 0x56, 0x32, 0x53, 0x52, 0x6f, 0x55, 0x2b, 0x64, 0x63, 0x57, 0x71, + 0x65, 0x5c, 0x0a, + 0x09, 0x2b, 0x54, 0x77, 0x66, 0x74, 0x55, 0x36, 0x74, 0x76, 0x51, 0x63, 0x38, 0x75, 0x41, 0x53, 0x39, 0x56, + 0x75, 0x30, 0x38, 0x35, 0x69, 0x69, 0x78, 0x66, 0x56, 0x31, 0x6f, 0x77, 0x77, 0x44, 0x67, 0x77, 0x4c, 0x37, + 0x54, 0x51, 0x45, 0x54, 0x49, 0x38, 0x6c, 0x7a, 0x63, 0x41, 0x51, 0x43, 0x51, 0x70, 0x47, 0x49, 0x51, 0x38, + 0x70, 0x56, 0x7a, 0x4c, 0x37, 0x37, 0x77, 0x49, 0x71, 0x59, 0x4b, 0x37, 0x42, 0x39, 0x58, 0x4f, 0x6c, 0x2b, + 0x77, 0x5c, 0x0a, + 0x09, 0x45, 0x61, 0x6b, 0x6f, 0x36, 0x79, 0x51, 0x34, 0x72, 0x70, 0x55, 0x2b, 0x78, 0x37, 0x49, 0x61, 0x4e, + 0x4b, 0x69, 0x75, 0x78, 0x39, 0x4e, 0x35, 0x55, 0x51, 0x59, 0x71, 0x4b, 0x68, 0x73, 0x4c, 0x6c, 0x4b, 0x45, + 0x4d, 0x42, 0x7a, 0x77, 0x75, 0x41, 0x79, 0x76, 0x36, 0x78, 0x73, 0x6a, 0x45, 0x6f, 0x68, 0x4e, 0x33, 0x6c, + 0x67, 0x68, 0x4d, 0x54, 0x48, 0x61, 0x78, 0x72, 0x77, 0x43, 0x69, 0x72, 0x75, 0x5a, 0x66, 0x38, 0x38, 0x36, + 0x6a, 0x5c, 0x0a, + 0x09, 0x4a, 0x49, 0x2b, 0x65, 0x59, 0x64, 0x77, 0x57, 0x58, 0x36, 0x46, 0x76, 0x6b, 0x65, 0x6f, 0x62, 0x38, + 0x6f, 0x78, 0x67, 0x77, 0x52, 0x32, 0x53, 0x6c, 0x50, 0x78, 0x5a, 0x56, 0x73, 0x48, 0x48, 0x70, 0x67, 0x47, + 0x66, 0x67, 0x35, 0x61, 0x70, 0x4f, 0x35, 0x34, 0x39, 0x4d, 0x46, 0x6e, 0x7a, 0x64, 0x72, 0x6d, 0x38, 0x6d, + 0x6a, 0x49, 0x59, 0x62, 0x6a, 0x4d, 0x63, 0x2b, 0x42, 0x4f, 0x67, 0x67, 0x62, 0x50, 0x47, 0x38, 0x52, 0x67, + 0x41, 0x5c, 0x0a, + 0x09, 0x78, 0x38, 0x77, 0x50, 0x68, 0x6d, 0x77, 0x59, 0x41, 0x50, 0x54, 0x48, 0x78, 0x75, 0x43, 0x63, 0x79, + 0x7a, 0x71, 0x64, 0x2f, 0x44, 0x48, 0x36, 0x31, 0x6b, 0x70, 0x79, 0x37, 0x31, 0x55, 0x5a, 0x6b, 0x33, 0x55, + 0x37, 0x43, 0x63, 0x54, 0x2b, 0x55, 0x43, 0x74, 0x48, 0x4b, 0x30, 0x58, 0x55, 0x71, 0x53, 0x2b, 0x6f, 0x72, + 0x37, 0x62, 0x79, 0x6d, 0x79, 0x4b, 0x2f, 0x64, 0x70, 0x4c, 0x49, 0x4f, 0x37, 0x76, 0x48, 0x62, 0x68, 0x4c, + 0x5a, 0x5c, 0x0a, + 0x09, 0x42, 0x73, 0x6a, 0x37, 0x30, 0x30, 0x35, 0x68, 0x70, 0x61, 0x74, 0x52, 0x5a, 0x68, 0x5a, 0x65, 0x4d, + 0x61, 0x50, 0x6e, 0x42, 0x69, 0x6d, 0x63, 0x52, 0x64, 0x58, 0x6c, 0x44, 0x69, 0x62, 0x36, 0x61, 0x70, 0x67, + 0x53, 0x52, 0x53, 0x63, 0x30, 0x36, 0x70, 0x68, 0x70, 0x73, 0x73, 0x6f, 0x32, 0x65, 0x4e, 0x39, 0x4a, 0x4e, + 0x71, 0x68, 0x42, 0x6b, 0x6a, 0x6d, 0x38, 0x75, 0x45, 0x2b, 0x76, 0x6f, 0x7a, 0x62, 0x62, 0x4e, 0x32, 0x44, + 0x61, 0x5c, 0x0a, + 0x09, 0x6a, 0x62, 0x72, 0x6c, 0x71, 0x6d, 0x32, 0x4d, 0x6a, 0x35, 0x6e, 0x72, 0x6c, 0x73, 0x74, 0x66, 0x67, + 0x49, 0x4c, 0x4f, 0x38, 0x4a, 0x69, 0x38, 0x52, 0x4d, 0x5a, 0x43, 0x4f, 0x45, 0x42, 0x68, 0x70, 0x2b, 0x6f, + 0x78, 0x51, 0x42, 0x73, 0x47, 0x41, 0x4c, 0x74, 0x33, 0x37, 0x63, 0x54, 0x30, 0x74, 0x6d, 0x31, 0x6e, 0x44, + 0x67, 0x61, 0x44, 0x6e, 0x6a, 0x59, 0x49, 0x37, 0x55, 0x6a, 0x56, 0x67, 0x56, 0x51, 0x42, 0x51, 0x32, 0x68, + 0x53, 0x5c, 0x0a, + 0x09, 0x2f, 0x31, 0x44, 0x4e, 0x42, 0x2f, 0x6e, 0x39, 0x32, 0x61, 0x67, 0x58, 0x53, 0x68, 0x58, 0x4b, 0x69, + 0x65, 0x38, 0x37, 0x30, 0x44, 0x77, 0x30, 0x52, 0x52, 0x65, 0x65, 0x65, 0x51, 0x41, 0x53, 0x77, 0x45, 0x51, + 0x35, 0x48, 0x68, 0x46, 0x56, 0x57, 0x34, 0x6e, 0x6a, 0x4b, 0x47, 0x42, 0x67, 0x46, 0x78, 0x41, 0x7a, 0x47, + 0x61, 0x54, 0x70, 0x4b, 0x75, 0x65, 0x4a, 0x5a, 0x7a, 0x4c, 0x57, 0x37, 0x63, 0x41, 0x49, 0x72, 0x6b, 0x5a, + 0x62, 0x5c, 0x0a, + 0x09, 0x47, 0x6f, 0x77, 0x30, 0x38, 0x65, 0x75, 0x57, 0x63, 0x77, 0x59, 0x2b, 0x39, 0x51, 0x4a, 0x64, 0x79, + 0x47, 0x62, 0x30, 0x75, 0x6f, 0x31, 0x31, 0x53, 0x7a, 0x63, 0x36, 0x75, 0x41, 0x59, 0x4d, 0x7a, 0x6a, 0x73, + 0x48, 0x4d, 0x53, 0x34, 0x72, 0x67, 0x72, 0x41, 0x5a, 0x49, 0x52, 0x73, 0x6c, 0x5a, 0x33, 0x45, 0x6e, 0x78, + 0x4c, 0x67, 0x74, 0x47, 0x63, 0x64, 0x70, 0x36, 0x45, 0x72, 0x76, 0x4d, 0x62, 0x48, 0x34, 0x34, 0x33, 0x71, + 0x6f, 0x5c, 0x0a, + 0x09, 0x32, 0x6e, 0x6a, 0x4d, 0x2b, 0x4d, 0x53, 0x45, 0x4b, 0x64, 0x66, 0x31, 0x70, 0x67, 0x30, 0x44, 0x67, + 0x4f, 0x50, 0x33, 0x37, 0x4d, 0x48, 0x6a, 0x4c, 0x33, 0x6a, 0x73, 0x43, 0x34, 0x4b, 0x44, 0x38, 0x73, 0x69, + 0x67, 0x68, 0x5a, 0x32, 0x67, 0x71, 0x6a, 0x50, 0x53, 0x78, 0x48, 0x68, 0x5a, 0x70, 0x5a, 0x30, 0x6b, 0x32, + 0x30, 0x6d, 0x69, 0x6d, 0x72, 0x38, 0x6f, 0x32, 0x32, 0x6c, 0x77, 0x43, 0x6c, 0x48, 0x4e, 0x4d, 0x48, 0x41, + 0x4f, 0x5c, 0x0a, + 0x09, 0x4c, 0x71, 0x48, 0x50, 0x30, 0x46, 0x36, 0x6f, 0x45, 0x78, 0x79, 0x41, 0x70, 0x36, 0x38, 0x36, 0x6b, + 0x77, 0x68, 0x31, 0x4e, 0x53, 0x44, 0x71, 0x4c, 0x43, 0x6e, 0x32, 0x79, 0x65, 0x65, 0x6c, 0x6b, 0x49, 0x62, + 0x4c, 0x78, 0x79, 0x53, 0x75, 0x51, 0x78, 0x70, 0x6e, 0x7a, 0x46, 0x67, 0x61, 0x35, 0x72, 0x38, 0x42, 0x52, + 0x4d, 0x58, 0x30, 0x78, 0x69, 0x6d, 0x6a, 0x48, 0x78, 0x58, 0x6c, 0x77, 0x58, 0x52, 0x4a, 0x64, 0x63, 0x51, + 0x55, 0x5c, 0x0a, + 0x09, 0x49, 0x4b, 0x4c, 0x6c, 0x59, 0x30, 0x52, 0x6c, 0x44, 0x57, 0x68, 0x61, 0x6a, 0x70, 0x46, 0x6e, 0x4a, + 0x2b, 0x58, 0x43, 0x65, 0x59, 0x33, 0x39, 0x45, 0x64, 0x4d, 0x70, 0x43, 0x78, 0x43, 0x68, 0x72, 0x4a, 0x55, + 0x74, 0x68, 0x54, 0x46, 0x70, 0x6e, 0x71, 0x4c, 0x4f, 0x4e, 0x4f, 0x41, 0x59, 0x2b, 0x48, 0x7a, 0x79, 0x33, + 0x6c, 0x4f, 0x66, 0x74, 0x48, 0x33, 0x48, 0x39, 0x76, 0x54, 0x43, 0x42, 0x74, 0x43, 0x47, 0x41, 0x63, 0x44, + 0x6b, 0x5c, 0x0a, + 0x09, 0x35, 0x41, 0x54, 0x4b, 0x30, 0x6a, 0x32, 0x4e, 0x70, 0x37, 0x61, 0x42, 0x74, 0x44, 0x4b, 0x6a, 0x34, + 0x54, 0x50, 0x48, 0x35, 0x32, 0x6d, 0x67, 0x46, 0x72, 0x70, 0x49, 0x44, 0x53, 0x73, 0x6e, 0x53, 0x56, 0x4a, + 0x78, 0x35, 0x63, 0x79, 0x36, 0x48, 0x2b, 0x46, 0x41, 0x54, 0x72, 0x59, 0x44, 0x79, 0x4f, 0x76, 0x43, 0x55, + 0x4e, 0x53, 0x55, 0x77, 0x42, 0x64, 0x4e, 0x39, 0x37, 0x43, 0x48, 0x65, 0x68, 0x62, 0x70, 0x31, 0x44, 0x67, + 0x59, 0x5c, 0x0a, + 0x09, 0x65, 0x58, 0x4c, 0x64, 0x53, 0x4d, 0x6d, 0x74, 0x7a, 0x49, 0x48, 0x4c, 0x69, 0x6e, 0x39, 0x76, 0x79, + 0x6d, 0x51, 0x53, 0x67, 0x41, 0x79, 0x38, 0x73, 0x6b, 0x7a, 0x4b, 0x57, 0x71, 0x77, 0x4d, 0x50, 0x46, 0x6c, + 0x5a, 0x56, 0x58, 0x51, 0x4f, 0x35, 0x78, 0x4a, 0x48, 0x45, 0x64, 0x47, 0x2b, 0x47, 0x72, 0x65, 0x51, 0x6e, + 0x5a, 0x37, 0x4b, 0x75, 0x56, 0x51, 0x58, 0x69, 0x61, 0x4f, 0x53, 0x4d, 0x55, 0x36, 0x6e, 0x78, 0x68, 0x68, + 0x41, 0x5c, 0x0a, + 0x09, 0x67, 0x6b, 0x38, 0x56, 0x48, 0x45, 0x52, 0x67, 0x34, 0x58, 0x62, 0x44, 0x36, 0x79, 0x53, 0x41, 0x77, + 0x36, 0x35, 0x72, 0x47, 0x65, 0x70, 0x73, 0x63, 0x38, 0x2f, 0x75, 0x33, 0x5a, 0x64, 0x73, 0x32, 0x62, 0x6f, + 0x31, 0x6b, 0x66, 0x46, 0x47, 0x30, 0x49, 0x59, 0x42, 0x77, 0x41, 0x4d, 0x50, 0x48, 0x73, 0x53, 0x39, 0x39, + 0x39, 0x33, 0x2f, 0x4d, 0x43, 0x73, 0x56, 0x42, 0x6c, 0x43, 0x6e, 0x37, 0x67, 0x68, 0x66, 0x70, 0x62, 0x46, + 0x77, 0x5c, 0x0a, + 0x09, 0x6c, 0x41, 0x37, 0x31, 0x64, 0x45, 0x53, 0x4c, 0x37, 0x55, 0x42, 0x47, 0x61, 0x2b, 0x36, 0x45, 0x58, + 0x4f, 0x47, 0x52, 0x42, 0x37, 0x34, 0x77, 0x78, 0x51, 0x77, 0x6b, 0x39, 0x73, 0x4d, 0x57, 0x7a, 0x54, 0x52, + 0x2f, 0x4e, 0x66, 0x74, 0x70, 0x52, 0x4e, 0x66, 0x54, 0x43, 0x6d, 0x73, 0x4f, 0x79, 0x69, 0x6e, 0x4a, 0x51, + 0x46, 0x43, 0x50, 0x57, 0x59, 0x39, 0x50, 0x72, 0x4e, 0x34, 0x7a, 0x2b, 0x56, 0x67, 0x72, 0x31, 0x4c, 0x78, + 0x2f, 0x5c, 0x0a, + 0x09, 0x6b, 0x58, 0x32, 0x6f, 0x73, 0x66, 0x4c, 0x32, 0x6d, 0x79, 0x6a, 0x4b, 0x4d, 0x67, 0x79, 0x66, 0x70, + 0x38, 0x54, 0x73, 0x72, 0x67, 0x44, 0x62, 0x44, 0x4a, 0x4f, 0x41, 0x31, 0x4b, 0x6a, 0x73, 0x4c, 0x2b, 0x48, + 0x62, 0x41, 0x6a, 0x2f, 0x6d, 0x32, 0x4b, 0x49, 0x65, 0x47, 0x32, 0x76, 0x67, 0x49, 0x2f, 0x52, 0x76, 0x38, + 0x52, 0x4c, 0x36, 0x53, 0x71, 0x61, 0x58, 0x50, 0x4e, 0x4e, 0x73, 0x34, 0x44, 0x4f, 0x5a, 0x45, 0x6f, 0x7a, + 0x49, 0x5c, 0x0a, + 0x09, 0x61, 0x67, 0x38, 0x66, 0x50, 0x6e, 0x4c, 0x6d, 0x31, 0x4d, 0x51, 0x34, 0x33, 0x76, 0x66, 0x37, 0x76, + 0x7a, 0x4e, 0x43, 0x73, 0x75, 0x74, 0x44, 0x47, 0x77, 0x49, 0x41, 0x2b, 0x2f, 0x66, 0x74, 0x77, 0x39, 0x61, + 0x78, 0x4c, 0x72, 0x35, 0x7a, 0x30, 0x38, 0x33, 0x48, 0x63, 0x61, 0x51, 0x56, 0x45, 0x64, 0x52, 0x4b, 0x38, + 0x56, 0x6d, 0x61, 0x5a, 0x74, 0x32, 0x43, 0x53, 0x64, 0x4a, 0x37, 0x6c, 0x52, 0x35, 0x7a, 0x35, 0x2b, 0x4e, + 0x52, 0x5c, 0x0a, + 0x09, 0x4e, 0x54, 0x71, 0x44, 0x45, 0x51, 0x47, 0x74, 0x61, 0x41, 0x68, 0x41, 0x5a, 0x42, 0x68, 0x4a, 0x4a, + 0x48, 0x42, 0x79, 0x47, 0x69, 0x4c, 0x4b, 0x4f, 0x64, 0x6b, 0x47, 0x54, 0x33, 0x48, 0x6a, 0x2b, 0x46, 0x56, + 0x47, 0x4a, 0x4d, 0x62, 0x4f, 0x32, 0x68, 0x64, 0x33, 0x51, 0x58, 0x6a, 0x4b, 0x54, 0x61, 0x69, 0x64, 0x55, + 0x6f, 0x68, 0x50, 0x4f, 0x70, 0x61, 0x49, 0x75, 0x4e, 0x62, 0x65, 0x41, 0x35, 0x31, 0x47, 0x68, 0x37, 0x6f, + 0x71, 0x5c, 0x0a, + 0x09, 0x79, 0x6e, 0x46, 0x77, 0x35, 0x65, 0x30, 0x4b, 0x48, 0x61, 0x6b, 0x70, 0x53, 0x42, 0x4b, 0x78, 0x6e, + 0x65, 0x4a, 0x42, 0x70, 0x66, 0x58, 0x43, 0x41, 0x63, 0x4d, 0x66, 0x5a, 0x42, 0x43, 0x6f, 0x32, 0x62, 0x5a, + 0x33, 0x57, 0x6f, 0x72, 0x70, 0x68, 0x61, 0x4c, 0x59, 0x4e, 0x38, 0x73, 0x4b, 0x64, 0x4a, 0x74, 0x4e, 0x78, + 0x39, 0x77, 0x47, 0x64, 0x53, 0x44, 0x67, 0x55, 0x35, 0x52, 0x41, 0x33, 0x37, 0x6e, 0x78, 0x78, 0x69, 0x31, + 0x50, 0x5c, 0x0a, + 0x09, 0x66, 0x66, 0x78, 0x6a, 0x74, 0x77, 0x2b, 0x47, 0x77, 0x34, 0x53, 0x50, 0x39, 0x61, 0x59, 0x4e, 0x65, + 0x78, 0x72, 0x77, 0x63, 0x31, 0x2f, 0x2b, 0x61, 0x76, 0x36, 0x33, 0x66, 0x2f, 0x69, 0x37, 0x4e, 0x2f, 0x55, + 0x36, 0x2b, 0x63, 0x50, 0x6d, 0x6c, 0x67, 0x5a, 0x77, 0x5a, 0x58, 0x41, 0x65, 0x59, 0x48, 0x5a, 0x78, 0x4b, + 0x5a, 0x59, 0x62, 0x44, 0x6b, 0x76, 0x4d, 0x4c, 0x79, 0x32, 0x68, 0x72, 0x4b, 0x34, 0x76, 0x46, 0x30, 0x4d, + 0x4d, 0x5c, 0x0a, + 0x09, 0x68, 0x6b, 0x56, 0x30, 0x75, 0x63, 0x48, 0x53, 0x4d, 0x67, 0x5a, 0x46, 0x43, 0x61, 0x72, 0x4f, 0x7a, + 0x43, 0x38, 0x73, 0x6f, 0x71, 0x79, 0x55, 0x57, 0x4a, 0x59, 0x6c, 0x35, 0x6c, 0x6c, 0x62, 0x79, 0x38, 0x74, + 0x44, 0x4c, 0x43, 0x37, 0x56, 0x33, 0x35, 0x65, 0x57, 0x68, 0x78, 0x67, 0x4d, 0x42, 0x74, 0x47, 0x41, 0x35, + 0x75, 0x62, 0x6e, 0x55, 0x52, 0x59, 0x46, 0x6e, 0x41, 0x4f, 0x49, 0x67, 0x45, 0x4d, 0x7a, 0x73, 0x77, 0x67, + 0x67, 0x5c, 0x0a, + 0x09, 0x50, 0x69, 0x79, 0x47, 0x4f, 0x48, 0x7a, 0x34, 0x63, 0x4b, 0x79, 0x37, 0x75, 0x4c, 0x43, 0x41, 0x75, + 0x62, 0x6b, 0x35, 0x4d, 0x61, 0x61, 0x59, 0x68, 0x61, 0x69, 0x35, 0x64, 0x48, 0x52, 0x38, 0x35, 0x70, 0x67, + 0x6d, 0x4d, 0x4c, 0x6d, 0x36, 0x72, 0x72, 0x55, 0x49, 0x47, 0x52, 0x32, 0x47, 0x4f, 0x7a, 0x75, 0x59, 0x6f, + 0x36, 0x6e, 0x73, 0x77, 0x4a, 0x70, 0x61, 0x4a, 0x53, 0x44, 0x41, 0x48, 0x4a, 0x53, 0x44, 0x56, 0x68, 0x49, + 0x74, 0x5c, 0x0a, + 0x09, 0x51, 0x33, 0x76, 0x4b, 0x6d, 0x5a, 0x74, 0x41, 0x51, 0x77, 0x41, 0x67, 0x79, 0x51, 0x7a, 0x4e, 0x6b, + 0x70, 0x6b, 0x41, 0x4f, 0x44, 0x59, 0x4f, 0x77, 0x5a, 0x2b, 0x65, 0x63, 0x71, 0x68, 0x73, 0x52, 0x54, 0x68, + 0x77, 0x77, 0x39, 0x68, 0x45, 0x39, 0x79, 0x34, 0x64, 0x6b, 0x78, 0x36, 0x7a, 0x6d, 0x4a, 0x71, 0x77, 0x65, + 0x6a, 0x47, 0x72, 0x41, 0x4e, 0x57, 0x50, 0x62, 0x37, 0x4f, 0x78, 0x43, 0x4f, 0x42, 0x6a, 0x33, 0x34, 0x6b, + 0x49, 0x5c, 0x0a, + 0x09, 0x77, 0x2b, 0x56, 0x6c, 0x7a, 0x43, 0x30, 0x75, 0x50, 0x64, 0x63, 0x35, 0x39, 0x33, 0x35, 0x73, 0x4d, + 0x47, 0x30, 0x59, 0x41, 0x4c, 0x7a, 0x6e, 0x39, 0x5a, 0x63, 0x57, 0x6a, 0x7a, 0x70, 0x74, 0x54, 0x38, 0x38, + 0x37, 0x42, 0x67, 0x39, 0x58, 0x4b, 0x6d, 0x77, 0x46, 0x62, 0x2f, 0x52, 0x66, 0x36, 0x6d, 0x76, 0x52, 0x43, + 0x49, 0x69, 0x56, 0x55, 0x64, 0x66, 0x6a, 0x74, 0x58, 0x42, 0x4a, 0x61, 0x54, 0x2f, 0x59, 0x62, 0x71, 0x4a, + 0x67, 0x5c, 0x0a, + 0x09, 0x48, 0x58, 0x31, 0x4a, 0x39, 0x73, 0x66, 0x72, 0x56, 0x39, 0x64, 0x6d, 0x6c, 0x35, 0x59, 0x78, 0x4c, + 0x46, 0x7a, 0x73, 0x64, 0x33, 0x5a, 0x68, 0x43, 0x61, 0x56, 0x7a, 0x49, 0x41, 0x4a, 0x4b, 0x42, 0x38, 0x77, + 0x74, 0x44, 0x6d, 0x4a, 0x7a, 0x79, 0x38, 0x4d, 0x53, 0x53, 0x38, 0x76, 0x4c, 0x6b, 0x64, 0x76, 0x42, 0x73, + 0x4d, 0x44, 0x53, 0x63, 0x68, 0x30, 0x4e, 0x35, 0x68, 0x61, 0x57, 0x55, 0x4a, 0x52, 0x6c, 0x2f, 0x44, 0x36, + 0x37, 0x5c, 0x0a, + 0x09, 0x34, 0x4e, 0x2f, 0x33, 0x34, 0x65, 0x44, 0x67, 0x53, 0x6f, 0x66, 0x35, 0x78, 0x53, 0x55, 0x51, 0x43, + 0x43, 0x57, 0x41, 0x34, 0x58, 0x43, 0x49, 0x70, 0x63, 0x46, 0x79, 0x4c, 0x4c, 0x75, 0x30, 0x50, 0x4d, 0x42, + 0x77, 0x57, 0x45, 0x59, 0x6e, 0x6d, 0x56, 0x39, 0x59, 0x51, 0x75, 0x6d, 0x4b, 0x79, 0x4f, 0x37, 0x63, 0x2f, + 0x45, 0x4a, 0x31, 0x6a, 0x56, 0x41, 0x55, 0x51, 0x79, 0x77, 0x73, 0x4c, 0x43, 0x49, 0x49, 0x59, 0x6d, 0x6d, + 0x77, 0x5c, 0x0a, + 0x09, 0x6a, 0x49, 0x58, 0x46, 0x4a, 0x53, 0x38, 0x75, 0x42, 0x38, 0x7a, 0x4e, 0x7a, 0x57, 0x4b, 0x77, 0x58, + 0x50, 0x4e, 0x39, 0x38, 0x4d, 0x47, 0x44, 0x63, 0x45, 0x56, 0x52, 0x4f, 0x77, 0x63, 0x48, 0x70, 0x67, 0x42, + 0x61, 0x37, 0x42, 0x56, 0x5a, 0x77, 0x68, 0x6b, 0x55, 0x79, 0x49, 0x56, 0x6a, 0x72, 0x6e, 0x4a, 0x72, 0x44, + 0x55, 0x4e, 0x48, 0x65, 0x50, 0x35, 0x64, 0x5a, 0x41, 0x6a, 0x47, 0x71, 0x6a, 0x32, 0x72, 0x56, 0x4b, 0x66, + 0x37, 0x5c, 0x0a, + 0x09, 0x55, 0x65, 0x65, 0x79, 0x54, 0x75, 0x67, 0x76, 0x38, 0x42, 0x55, 0x65, 0x43, 0x37, 0x65, 0x6d, 0x6d, + 0x4c, 0x77, 0x74, 0x76, 0x65, 0x61, 0x51, 0x54, 0x41, 0x63, 0x55, 0x6e, 0x32, 0x48, 0x4d, 0x52, 0x2b, 0x59, + 0x57, 0x6e, 0x6c, 0x61, 0x57, 0x35, 0x65, 0x59, 0x45, 0x67, 0x42, 0x74, 0x76, 0x76, 0x68, 0x6e, 0x6c, 0x74, + 0x5a, 0x39, 0x45, 0x72, 0x66, 0x32, 0x51, 0x39, 0x73, 0x6e, 0x30, 0x71, 0x58, 0x5a, 0x45, 0x46, 0x6a, 0x36, + 0x31, 0x5c, 0x0a, + 0x09, 0x49, 0x33, 0x4b, 0x41, 0x55, 0x4e, 0x67, 0x68, 0x79, 0x73, 0x58, 0x7a, 0x7a, 0x48, 0x45, 0x70, 0x57, + 0x41, 0x59, 0x48, 0x45, 0x46, 0x55, 0x50, 0x71, 0x6a, 0x2f, 0x42, 0x4a, 0x38, 0x58, 0x50, 0x4c, 0x58, 0x33, + 0x32, 0x49, 0x37, 0x42, 0x45, 0x32, 0x44, 0x62, 0x5a, 0x5a, 0x30, 0x79, 0x77, 0x44, 0x49, 0x43, 0x42, 0x52, + 0x74, 0x49, 0x75, 0x35, 0x30, 0x32, 0x54, 0x41, 0x44, 0x53, 0x53, 0x34, 0x30, 0x37, 0x6b, 0x45, 0x43, 0x4a, + 0x61, 0x5c, 0x0a, + 0x09, 0x51, 0x33, 0x6b, 0x68, 0x5a, 0x36, 0x4f, 0x74, 0x4f, 0x47, 0x37, 0x64, 0x66, 0x71, 0x79, 0x45, 0x34, + 0x62, 0x44, 0x41, 0x37, 0x47, 0x49, 0x4e, 0x50, 0x4d, 0x50, 0x53, 0x59, 0x58, 0x35, 0x70, 0x55, 0x48, 0x58, + 0x6c, 0x4d, 0x42, 0x67, 0x36, 0x78, 0x42, 0x54, 0x58, 0x4f, 0x63, 0x77, 0x50, 0x43, 0x78, 0x54, 0x44, 0x49, + 0x72, 0x5a, 0x34, 0x5a, 0x4b, 0x48, 0x4f, 0x78, 0x41, 0x72, 0x6e, 0x63, 0x47, 0x52, 0x75, 0x41, 0x56, 0x6e, + 0x46, 0x5c, 0x0a, + 0x09, 0x77, 0x32, 0x42, 0x59, 0x59, 0x48, 0x46, 0x70, 0x43, 0x5a, 0x52, 0x6c, 0x63, 0x48, 0x42, 0x59, 0x57, + 0x68, 0x78, 0x67, 0x75, 0x58, 0x53, 0x67, 0x79, 0x73, 0x46, 0x6d, 0x46, 0x78, 0x61, 0x72, 0x5a, 0x6e, 0x33, + 0x36, 0x50, 0x56, 0x64, 0x39, 0x4a, 0x79, 0x49, 0x4d, 0x79, 0x78, 0x49, 0x4c, 0x38, 0x77, 0x74, 0x52, 0x74, + 0x6f, 0x50, 0x42, 0x41, 0x45, 0x75, 0x44, 0x49, 0x59, 0x49, 0x65, 0x46, 0x78, 0x65, 0x57, 0x4d, 0x43, 0x79, + 0x57, 0x5c, 0x0a, + 0x09, 0x34, 0x35, 0x41, 0x50, 0x48, 0x35, 0x36, 0x4e, 0x57, 0x69, 0x2f, 0x4c, 0x45, 0x6f, 0x64, 0x6d, 0x44, + 0x6b, 0x57, 0x2b, 0x6c, 0x68, 0x61, 0x58, 0x4d, 0x44, 0x63, 0x37, 0x6d, 0x32, 0x52, 0x67, 0x31, 0x6e, 0x71, + 0x41, 0x58, 0x67, 0x67, 0x4d, 0x41, 0x43, 0x4c, 0x71, 0x6b, 0x6f, 0x74, 0x54, 0x6b, 0x41, 0x64, 0x6d, 0x5a, + 0x73, 0x37, 0x64, 0x64, 0x38, 0x49, 0x65, 0x62, 0x44, 0x52, 0x74, 0x37, 0x41, 0x74, 0x42, 0x6f, 0x6f, 0x4d, + 0x72, 0x5c, 0x0a, + 0x09, 0x4a, 0x77, 0x33, 0x61, 0x30, 0x63, 0x36, 0x42, 0x63, 0x4b, 0x34, 0x43, 0x44, 0x65, 0x35, 0x4d, 0x78, + 0x4f, 0x71, 0x48, 0x6c, 0x4c, 0x4c, 0x4a, 0x53, 0x65, 0x4b, 0x70, 0x32, 0x6f, 0x46, 0x54, 0x50, 0x6d, 0x53, + 0x30, 0x53, 0x48, 0x68, 0x75, 0x41, 0x67, 0x54, 0x6e, 0x6d, 0x72, 0x4d, 0x54, 0x6e, 0x6c, 0x68, 0x77, 0x45, + 0x42, 0x44, 0x6a, 0x55, 0x33, 0x30, 0x78, 0x6b, 0x4c, 0x45, 0x64, 0x31, 0x53, 0x41, 0x75, 0x45, 0x33, 0x34, + 0x75, 0x5c, 0x0a, + 0x09, 0x36, 0x64, 0x73, 0x59, 0x72, 0x35, 0x41, 0x46, 0x42, 0x38, 0x6a, 0x36, 0x4b, 0x77, 0x42, 0x30, 0x38, + 0x67, 0x7a, 0x62, 0x74, 0x6f, 0x7a, 0x4a, 0x38, 0x57, 0x38, 0x64, 0x47, 0x79, 0x32, 0x58, 0x55, 0x61, 0x43, + 0x55, 0x6b, 0x4f, 0x6f, 0x62, 0x51, 0x4d, 0x4b, 0x4c, 0x47, 0x49, 0x73, 0x78, 0x7a, 0x67, 0x51, 0x55, 0x6d, + 0x77, 0x45, 0x74, 0x37, 0x56, 0x36, 0x42, 0x4a, 0x49, 0x44, 0x35, 0x78, 0x57, 0x55, 0x4d, 0x68, 0x76, 0x55, + 0x62, 0x5c, 0x0a, + 0x09, 0x76, 0x57, 0x61, 0x58, 0x42, 0x69, 0x68, 0x4c, 0x46, 0x35, 0x73, 0x39, 0x73, 0x6a, 0x43, 0x49, 0x2f, + 0x52, 0x52, 0x6c, 0x69, 0x59, 0x55, 0x6c, 0x6c, 0x75, 0x55, 0x56, 0x70, 0x63, 0x6a, 0x55, 0x43, 0x44, 0x51, + 0x33, 0x58, 0x4b, 0x35, 0x42, 0x63, 0x4b, 0x4e, 0x6f, 0x59, 0x77, 0x46, 0x41, 0x4f, 0x33, 0x77, 0x38, 0x62, + 0x36, 0x54, 0x6b, 0x4f, 0x72, 0x6f, 0x35, 0x64, 0x69, 0x30, 0x30, 0x35, 0x69, 0x70, 0x67, 0x69, 0x44, 0x62, + 0x63, 0x5c, 0x0a, + 0x09, 0x45, 0x47, 0x6d, 0x62, 0x70, 0x68, 0x56, 0x31, 0x41, 0x58, 0x2b, 0x4f, 0x70, 0x62, 0x4f, 0x4e, 0x66, + 0x41, 0x53, 0x6e, 0x64, 0x66, 0x77, 0x36, 0x64, 0x36, 0x36, 0x6d, 0x63, 0x52, 0x6e, 0x47, 0x6d, 0x66, 0x43, + 0x6c, 0x2b, 0x75, 0x56, 0x6c, 0x74, 0x49, 0x79, 0x73, 0x38, 0x51, 0x6e, 0x6e, 0x45, 0x53, 0x6d, 0x49, 0x71, + 0x6b, 0x38, 0x31, 0x50, 0x31, 0x61, 0x6d, 0x45, 0x61, 0x73, 0x62, 0x63, 0x75, 0x4b, 0x4f, 0x71, 0x49, 0x6b, + 0x44, 0x5c, 0x0a, + 0x09, 0x59, 0x67, 0x52, 0x42, 0x42, 0x73, 0x36, 0x69, 0x4b, 0x65, 0x33, 0x6f, 0x58, 0x41, 0x61, 0x42, 0x48, + 0x79, 0x55, 0x66, 0x44, 0x58, 0x44, 0x4f, 0x70, 0x58, 0x71, 0x78, 0x35, 0x41, 0x4e, 0x57, 0x52, 0x76, 0x52, + 0x50, 0x71, 0x61, 0x78, 0x5a, 0x6d, 0x59, 0x6d, 0x78, 0x44, 0x69, 0x5a, 0x51, 0x5a, 0x33, 0x6f, 0x52, 0x41, + 0x48, 0x6e, 0x39, 0x5a, 0x45, 0x79, 0x47, 0x58, 0x50, 0x7a, 0x59, 0x70, 0x2b, 0x2b, 0x64, 0x6d, 0x55, 0x75, + 0x76, 0x5c, 0x0a, + 0x09, 0x72, 0x54, 0x4e, 0x74, 0x2f, 0x4e, 0x4f, 0x41, 0x7a, 0x6a, 0x72, 0x68, 0x36, 0x67, 0x73, 0x6d, 0x4f, + 0x4b, 0x6a, 0x76, 0x50, 0x45, 0x72, 0x47, 0x36, 0x38, 0x79, 0x6f, 0x2b, 0x58, 0x58, 0x74, 0x65, 0x4e, 0x6f, + 0x49, 0x49, 0x6b, 0x2f, 0x42, 0x75, 0x42, 0x73, 0x69, 0x42, 0x4f, 0x64, 0x44, 0x4f, 0x49, 0x65, 0x4b, 0x39, + 0x4e, 0x48, 0x6f, 0x64, 0x63, 0x51, 0x33, 0x49, 0x6a, 0x4c, 0x6e, 0x53, 0x7a, 0x75, 0x63, 0x35, 0x54, 0x44, + 0x4a, 0x5c, 0x0a, + 0x09, 0x64, 0x33, 0x56, 0x4f, 0x31, 0x46, 0x65, 0x66, 0x73, 0x52, 0x2b, 0x64, 0x68, 0x57, 0x6c, 0x67, 0x67, + 0x58, 0x49, 0x49, 0x73, 0x50, 0x47, 0x6f, 0x66, 0x70, 0x7a, 0x53, 0x47, 0x79, 0x44, 0x6c, 0x7a, 0x38, 0x48, + 0x53, 0x36, 0x6b, 0x75, 0x6d, 0x63, 0x59, 0x62, 0x75, 0x36, 0x4f, 0x68, 0x34, 0x31, 0x74, 0x6b, 0x4c, 0x58, + 0x43, 0x72, 0x37, 0x41, 0x4e, 0x68, 0x78, 0x50, 0x4b, 0x78, 0x50, 0x70, 0x38, 0x76, 0x7a, 0x65, 0x73, 0x36, + 0x57, 0x5c, 0x0a, + 0x09, 0x4e, 0x52, 0x38, 0x7a, 0x31, 0x37, 0x6c, 0x46, 0x50, 0x67, 0x76, 0x64, 0x76, 0x6e, 0x74, 0x36, 0x30, + 0x72, 0x36, 0x2b, 0x6a, 0x72, 0x51, 0x68, 0x41, 0x46, 0x42, 0x65, 0x39, 0x79, 0x6c, 0x2f, 0x34, 0x4c, 0x41, + 0x72, 0x47, 0x6c, 0x69, 0x6b, 0x59, 0x46, 0x68, 0x4d, 0x75, 0x55, 0x6d, 0x71, 0x48, 0x42, 0x77, 0x62, 0x78, + 0x6a, 0x57, 0x4c, 0x48, 0x46, 0x50, 0x63, 0x69, 0x45, 0x78, 0x44, 0x6e, 0x47, 0x38, 0x77, 0x65, 0x74, 0x45, + 0x73, 0x5c, 0x0a, + 0x09, 0x7a, 0x79, 0x37, 0x59, 0x39, 0x63, 0x43, 0x58, 0x63, 0x4f, 0x51, 0x52, 0x42, 0x74, 0x48, 0x49, 0x41, + 0x2b, 0x38, 0x44, 0x6f, 0x39, 0x76, 0x51, 0x77, 0x46, 0x68, 0x66, 0x73, 0x48, 0x6b, 0x4d, 0x55, 0x56, 0x44, + 0x49, 0x6b, 0x48, 0x32, 0x4f, 0x54, 0x4d, 0x31, 0x5a, 0x30, 0x30, 0x6b, 0x78, 0x72, 0x53, 0x39, 0x49, 0x47, + 0x65, 0x72, 0x49, 0x48, 0x4d, 0x34, 0x6e, 0x71, 0x62, 0x7a, 0x69, 0x79, 0x30, 0x72, 0x7a, 0x4c, 0x64, 0x33, + 0x48, 0x5c, 0x0a, + 0x09, 0x61, 0x36, 0x78, 0x73, 0x62, 0x4d, 0x59, 0x70, 0x6e, 0x59, 0x6d, 0x43, 0x61, 0x54, 0x75, 0x36, 0x6a, + 0x41, 0x42, 0x70, 0x33, 0x54, 0x2f, 0x59, 0x47, 0x42, 0x72, 0x73, 0x68, 0x48, 0x39, 0x33, 0x4f, 0x43, 0x62, + 0x32, 0x41, 0x6d, 0x39, 0x63, 0x42, 0x6b, 0x41, 0x30, 0x44, 0x61, 0x49, 0x4a, 0x30, 0x32, 0x69, 0x31, 0x59, + 0x2f, 0x50, 0x30, 0x6b, 0x59, 0x4f, 0x44, 0x6b, 0x48, 0x58, 0x34, 0x6f, 0x6f, 0x77, 0x4e, 0x67, 0x4f, 0x30, + 0x59, 0x5c, 0x0a, + 0x09, 0x52, 0x6b, 0x6a, 0x55, 0x45, 0x56, 0x64, 0x48, 0x68, 0x74, 0x69, 0x75, 0x63, 0x53, 0x36, 0x65, 0x5a, + 0x75, 0x41, 0x52, 0x77, 0x43, 0x33, 0x77, 0x49, 0x69, 0x49, 0x4c, 0x34, 0x35, 0x4d, 0x37, 0x67, 0x4a, 0x34, + 0x47, 0x69, 0x44, 0x6e, 0x35, 0x55, 0x59, 0x41, 0x58, 0x35, 0x7a, 0x6c, 0x78, 0x49, 0x41, 0x57, 0x30, 0x6e, + 0x46, 0x63, 0x6f, 0x65, 0x65, 0x6b, 0x6f, 0x79, 0x79, 0x6b, 0x42, 0x62, 0x41, 0x4e, 0x34, 0x7a, 0x54, 0x48, + 0x55, 0x5c, 0x0a, + 0x09, 0x70, 0x2b, 0x6f, 0x2b, 0x57, 0x56, 0x6e, 0x64, 0x4c, 0x6e, 0x63, 0x32, 0x72, 0x51, 0x64, 0x72, 0x47, + 0x68, 0x54, 0x62, 0x56, 0x33, 0x32, 0x47, 0x73, 0x6b, 0x45, 0x6e, 0x6b, 0x74, 0x48, 0x6d, 0x66, 0x76, 0x6b, + 0x35, 0x33, 0x62, 0x62, 0x51, 0x72, 0x52, 0x35, 0x44, 0x51, 0x79, 0x43, 0x53, 0x41, 0x4c, 0x63, 0x46, 0x59, + 0x4d, 0x46, 0x77, 0x67, 0x32, 0x69, 0x44, 0x41, 0x4d, 0x41, 0x42, 0x77, 0x44, 0x34, 0x5a, 0x47, 0x56, 0x53, + 0x55, 0x5c, 0x0a, + 0x09, 0x74, 0x70, 0x51, 0x67, 0x55, 0x6c, 0x47, 0x65, 0x68, 0x6d, 0x6f, 0x48, 0x68, 0x42, 0x31, 0x52, 0x64, + 0x48, 0x74, 0x4e, 0x55, 0x34, 0x42, 0x51, 0x33, 0x34, 0x71, 0x71, 0x31, 0x68, 0x77, 0x39, 0x47, 0x70, 0x5a, + 0x79, 0x61, 0x6a, 0x46, 0x6b, 0x70, 0x77, 0x78, 0x51, 0x47, 0x58, 0x49, 0x79, 0x39, 0x32, 0x52, 0x64, 0x4a, + 0x46, 0x6b, 0x51, 0x30, 0x75, 0x2f, 0x6d, 0x32, 0x42, 0x53, 0x66, 0x76, 0x47, 0x37, 0x53, 0x48, 0x6d, 0x74, + 0x54, 0x5c, 0x0a, + 0x09, 0x67, 0x34, 0x67, 0x77, 0x63, 0x70, 0x4a, 0x31, 0x4c, 0x48, 0x36, 0x53, 0x39, 0x51, 0x57, 0x6a, 0x6e, + 0x42, 0x55, 0x70, 0x56, 0x79, 0x4b, 0x52, 0x7a, 0x75, 0x74, 0x78, 0x4b, 0x54, 0x6c, 0x71, 0x33, 0x69, 0x30, + 0x51, 0x31, 0x4b, 0x44, 0x4f, 0x78, 0x78, 0x41, 0x7a, 0x4f, 0x42, 0x58, 0x39, 0x64, 0x5a, 0x51, 0x33, 0x70, + 0x32, 0x6b, 0x4b, 0x61, 0x44, 0x52, 0x66, 0x39, 0x65, 0x65, 0x57, 0x6f, 0x78, 0x2f, 0x38, 0x32, 0x74, 0x41, + 0x47, 0x5c, 0x0a, + 0x09, 0x4c, 0x67, 0x4b, 0x36, 0x30, 0x36, 0x76, 0x50, 0x46, 0x61, 0x4b, 0x46, 0x53, 0x34, 0x57, 0x63, 0x52, + 0x47, 0x4e, 0x4b, 0x73, 0x77, 0x62, 0x64, 0x68, 0x6a, 0x79, 0x42, 0x6b, 0x5a, 0x45, 0x74, 0x53, 0x66, 0x63, + 0x5a, 0x77, 0x46, 0x44, 0x31, 0x58, 0x39, 0x4b, 0x45, 0x6b, 0x53, 0x48, 0x77, 0x4d, 0x57, 0x6c, 0x6a, 0x6a, + 0x45, 0x59, 0x52, 0x32, 0x41, 0x6c, 0x5a, 0x44, 0x6c, 0x49, 0x5a, 0x61, 0x4e, 0x34, 0x41, 0x32, 0x2f, 0x41, + 0x69, 0x5c, 0x0a, + 0x09, 0x61, 0x4c, 0x6d, 0x61, 0x54, 0x38, 0x32, 0x54, 0x6c, 0x70, 0x2b, 0x4f, 0x6c, 0x4d, 0x6e, 0x69, 0x4a, + 0x43, 0x54, 0x49, 0x6a, 0x73, 0x71, 0x45, 0x4c, 0x48, 0x36, 0x45, 0x34, 0x54, 0x4f, 0x65, 0x52, 0x70, 0x49, + 0x6c, 0x42, 0x30, 0x73, 0x2b, 0x42, 0x6f, 0x43, 0x62, 0x59, 0x31, 0x50, 0x38, 0x38, 0x4c, 0x46, 0x79, 0x2f, + 0x71, 0x33, 0x79, 0x31, 0x68, 0x68, 0x58, 0x6b, 0x68, 0x2f, 0x50, 0x31, 0x71, 0x7a, 0x2b, 0x36, 0x75, 0x75, + 0x39, 0x5c, 0x0a, + 0x09, 0x78, 0x6d, 0x78, 0x68, 0x6e, 0x57, 0x68, 0x6a, 0x4d, 0x67, 0x41, 0x48, 0x41, 0x48, 0x53, 0x36, 0x76, + 0x62, 0x41, 0x54, 0x79, 0x68, 0x69, 0x43, 0x73, 0x2b, 0x62, 0x68, 0x56, 0x6e, 0x53, 0x4d, 0x4b, 0x52, 0x6f, + 0x67, 0x6c, 0x47, 0x6d, 0x68, 0x74, 0x35, 0x6d, 0x2b, 0x68, 0x6e, 0x6f, 0x47, 0x6f, 0x6f, 0x76, 0x69, 0x54, + 0x56, 0x47, 0x65, 0x32, 0x47, 0x55, 0x56, 0x33, 0x66, 0x6e, 0x31, 0x6b, 0x4d, 0x48, 0x6f, 0x72, 0x45, 0x41, + 0x62, 0x5c, 0x0a, + 0x09, 0x72, 0x4a, 0x6d, 0x5a, 0x71, 0x4d, 0x69, 0x73, 0x78, 0x38, 0x4a, 0x5a, 0x30, 0x2f, 0x4e, 0x2b, 0x6e, + 0x6b, 0x47, 0x6c, 0x68, 0x5a, 0x56, 0x4d, 0x57, 0x43, 0x5a, 0x6b, 0x79, 0x54, 0x36, 0x4d, 0x75, 0x30, 0x6b, + 0x47, 0x41, 0x71, 0x68, 0x59, 0x57, 0x52, 0x48, 0x4e, 0x46, 0x57, 0x6d, 0x67, 0x45, 0x57, 0x6b, 0x2f, 0x36, + 0x38, 0x64, 0x63, 0x77, 0x41, 0x30, 0x79, 0x30, 0x65, 0x56, 0x34, 0x47, 0x2b, 0x46, 0x69, 0x4f, 0x4f, 0x39, + 0x73, 0x5c, 0x0a, + 0x09, 0x32, 0x54, 0x56, 0x6c, 0x42, 0x6e, 0x72, 0x38, 0x34, 0x54, 0x77, 0x76, 0x7a, 0x36, 0x64, 0x7a, 0x77, + 0x5a, 0x36, 0x43, 0x50, 0x64, 0x52, 0x5a, 0x7a, 0x4e, 0x51, 0x47, 0x2b, 0x2f, 0x38, 0x47, 0x72, 0x67, 0x47, + 0x34, 0x4b, 0x67, 0x50, 0x51, 0x63, 0x79, 0x70, 0x5a, 0x70, 0x6a, 0x70, 0x6f, 0x53, 0x4c, 0x64, 0x34, 0x78, + 0x4c, 0x49, 0x51, 0x50, 0x79, 0x34, 0x6f, 0x38, 0x6e, 0x50, 0x36, 0x32, 0x43, 0x49, 0x79, 0x6c, 0x47, 0x58, + 0x31, 0x5c, 0x0a, + 0x09, 0x7a, 0x66, 0x6f, 0x7a, 0x35, 0x35, 0x32, 0x73, 0x72, 0x4a, 0x56, 0x65, 0x78, 0x71, 0x48, 0x70, 0x79, + 0x4b, 0x54, 0x4b, 0x63, 0x79, 0x42, 0x4c, 0x30, 0x6b, 0x78, 0x74, 0x6b, 0x44, 0x78, 0x4b, 0x47, 0x76, 0x31, + 0x59, 0x36, 0x79, 0x4a, 0x6d, 0x5a, 0x46, 0x65, 0x5a, 0x69, 0x77, 0x57, 0x79, 0x76, 0x46, 0x79, 0x55, 0x43, + 0x32, 0x74, 0x44, 0x4f, 0x30, 0x51, 0x43, 0x44, 0x41, 0x5a, 0x77, 0x38, 0x62, 0x61, 0x35, 0x6a, 0x71, 0x55, + 0x77, 0x5c, 0x0a, + 0x09, 0x5a, 0x42, 0x6b, 0x7a, 0x4b, 0x32, 0x4a, 0x74, 0x72, 0x5a, 0x67, 0x5a, 0x47, 0x74, 0x48, 0x61, 0x79, + 0x73, 0x4b, 0x53, 0x39, 0x6c, 0x52, 0x67, 0x69, 0x67, 0x6b, 0x41, 0x41, 0x2f, 0x70, 0x67, 0x4f, 0x31, 0x77, + 0x6e, 0x39, 0x52, 0x72, 0x57, 0x75, 0x4e, 0x33, 0x4a, 0x2b, 0x74, 0x46, 0x47, 0x37, 0x67, 0x4d, 0x34, 0x45, + 0x59, 0x42, 0x43, 0x34, 0x34, 0x71, 0x73, 0x46, 0x46, 0x4a, 0x2f, 0x4d, 0x6d, 0x45, 0x75, 0x4c, 0x51, 0x39, + 0x78, 0x5c, 0x0a, + 0x09, 0x33, 0x2b, 0x46, 0x35, 0x50, 0x48, 0x42, 0x6b, 0x48, 0x6f, 0x64, 0x6d, 0x46, 0x33, 0x48, 0x6f, 0x79, + 0x42, 0x7a, 0x6d, 0x6c, 0x35, 0x61, 0x77, 0x74, 0x44, 0x7a, 0x45, 0x77, 0x75, 0x49, 0x41, 0x73, 0x77, 0x75, + 0x4c, 0x47, 0x41, 0x79, 0x47, 0x47, 0x41, 0x79, 0x58, 0x77, 0x66, 0x66, 0x6f, 0x4c, 0x79, 0x77, 0x75, 0x6f, + 0x53, 0x6a, 0x38, 0x78, 0x6f, 0x34, 0x38, 0x7a, 0x7a, 0x45, 0x2b, 0x78, 0x6e, 0x66, 0x76, 0x41, 0x55, 0x53, + 0x45, 0x5c, 0x0a, + 0x09, 0x79, 0x66, 0x45, 0x78, 0x67, 0x49, 0x41, 0x38, 0x79, 0x7a, 0x44, 0x65, 0x37, 0x77, 0x45, 0x41, 0x2b, + 0x74, 0x30, 0x75, 0x4f, 0x74, 0x30, 0x63, 0x6e, 0x62, 0x79, 0x44, 0x69, 0x56, 0x34, 0x58, 0x52, 0x49, 0x53, + 0x74, 0x45, 0x2f, 0x36, 0x65, 0x38, 0x48, 0x69, 0x2f, 0x69, 0x30, 0x36, 0x57, 0x6f, 0x64, 0x66, 0x74, 0x6f, + 0x4e, 0x66, 0x4a, 0x30, 0x65, 0x39, 0x32, 0x30, 0x4f, 0x74, 0x6b, 0x47, 0x4f, 0x2f, 0x31, 0x30, 0x4d, 0x6e, + 0x39, 0x5c, 0x0a, + 0x09, 0x6a, 0x73, 0x46, 0x4f, 0x7a, 0x6e, 0x48, 0x58, 0x41, 0x44, 0x32, 0x52, 0x79, 0x6a, 0x4f, 0x6a, 0x34, + 0x58, 0x4e, 0x7a, 0x71, 0x36, 0x34, 0x34, 0x48, 0x51, 0x7a, 0x4e, 0x32, 0x57, 0x56, 0x6a, 0x57, 0x7a, 0x78, + 0x6a, 0x63, 0x63, 0x70, 0x6f, 0x6c, 0x52, 0x35, 0x30, 0x50, 0x5a, 0x4d, 0x48, 0x42, 0x6e, 0x79, 0x31, 0x49, + 0x41, 0x30, 0x6d, 0x58, 0x66, 0x31, 0x42, 0x68, 0x50, 0x6d, 0x6c, 0x5a, 0x51, 0x79, 0x57, 0x43, 0x79, 0x77, + 0x4d, 0x5c, 0x0a, + 0x09, 0x68, 0x6c, 0x67, 0x75, 0x43, 0x73, 0x77, 0x76, 0x44, 0x56, 0x41, 0x36, 0x59, 0x48, 0x62, 0x52, 0x62, + 0x36, 0x36, 0x5a, 0x57, 0x31, 0x78, 0x43, 0x36, 0x59, 0x41, 0x6a, 0x38, 0x34, 0x74, 0x77, 0x7a, 0x75, 0x46, + 0x49, 0x74, 0x61, 0x56, 0x35, 0x66, 0x6e, 0x45, 0x51, 0x74, 0x30, 0x51, 0x50, 0x6c, 0x6f, 0x64, 0x77, 0x7a, + 0x6d, 0x46, 0x68, 0x30, 0x57, 0x2f, 0x44, 0x39, 0x75, 0x7a, 0x36, 0x54, 0x2f, 0x2b, 0x4d, 0x69, 0x41, 0x65, + 0x4c, 0x5c, 0x0a, + 0x09, 0x4c, 0x4d, 0x73, 0x78, 0x4d, 0x64, 0x36, 0x76, 0x57, 0x50, 0x50, 0x62, 0x6d, 0x4d, 0x66, 0x37, 0x50, + 0x66, 0x52, 0x36, 0x58, 0x59, 0x7a, 0x31, 0x2b, 0x39, 0x67, 0x79, 0x33, 0x6b, 0x65, 0x2f, 0x32, 0x38, 0x56, + 0x34, 0x76, 0x34, 0x74, 0x74, 0x57, 0x79, 0x61, 0x77, 0x66, 0x63, 0x73, 0x45, 0x64, 0x6d, 0x77, 0x64, 0x78, + 0x2b, 0x37, 0x70, 0x53, 0x66, 0x54, 0x79, 0x54, 0x4e, 0x71, 0x73, 0x6d, 0x48, 0x59, 0x41, 0x69, 0x5a, 0x50, + 0x48, 0x5c, 0x0a, + 0x09, 0x6f, 0x6b, 0x70, 0x2f, 0x76, 0x73, 0x35, 0x55, 0x49, 0x7a, 0x69, 0x74, 0x45, 0x32, 0x30, 0x6b, 0x41, + 0x42, 0x78, 0x76, 0x6e, 0x68, 0x57, 0x6f, 0x37, 0x35, 0x53, 0x64, 0x4f, 0x63, 0x7a, 0x4d, 0x4c, 0x2b, 0x45, + 0x72, 0x4e, 0x39, 0x79, 0x42, 0x61, 0x32, 0x36, 0x38, 0x46, 0x54, 0x66, 0x63, 0x65, 0x67, 0x64, 0x75, 0x76, + 0x4f, 0x6c, 0x57, 0x33, 0x48, 0x54, 0x54, 0x54, 0x52, 0x67, 0x4f, 0x6c, 0x36, 0x4e, 0x4e, 0x4a, 0x58, 0x76, + 0x4e, 0x5c, 0x0a, + 0x09, 0x41, 0x61, 0x55, 0x54, 0x75, 0x61, 0x56, 0x54, 0x50, 0x48, 0x52, 0x53, 0x39, 0x52, 0x57, 0x33, 0x63, + 0x61, 0x72, 0x67, 0x6e, 0x7a, 0x77, 0x41, 0x34, 0x79, 0x6f, 0x6a, 0x71, 0x73, 0x37, 0x78, 0x65, 0x76, 0x70, + 0x68, 0x6e, 0x48, 0x42, 0x74, 0x79, 0x35, 0x61, 0x74, 0x6d, 0x4e, 0x34, 0x32, 0x6a, 0x61, 0x6d, 0x74, 0x57, + 0x37, 0x46, 0x39, 0x32, 0x7a, 0x53, 0x6d, 0x70, 0x37, 0x5a, 0x69, 0x65, 0x75, 0x73, 0x55, 0x64, 0x6b, 0x78, + 0x76, 0x5c, 0x0a, + 0x09, 0x77, 0x61, 0x37, 0x74, 0x57, 0x37, 0x48, 0x6e, 0x75, 0x4f, 0x30, 0x34, 0x59, 0x66, 0x73, 0x57, 0x37, + 0x4e, 0x32, 0x35, 0x48, 0x56, 0x73, 0x6e, 0x75, 0x6b, 0x67, 0x4d, 0x7a, 0x5a, 0x77, 0x6a, 0x73, 0x33, 0x4d, + 0x38, 0x36, 0x6f, 0x2b, 0x63, 0x72, 0x34, 0x34, 0x67, 0x37, 0x65, 0x6a, 0x4a, 0x66, 0x4e, 0x77, 0x67, 0x55, + 0x59, 0x52, 0x77, 0x78, 0x77, 0x4e, 0x48, 0x63, 0x4f, 0x65, 0x44, 0x4d, 0x37, 0x6a, 0x72, 0x67, 0x52, 0x6e, + 0x63, 0x5c, 0x0a, + 0x09, 0x65, 0x2b, 0x67, 0x49, 0x37, 0x6a, 0x73, 0x34, 0x67, 0x35, 0x6b, 0x6a, 0x63, 0x35, 0x69, 0x5a, 0x6e, + 0x63, 0x57, 0x68, 0x51, 0x7a, 0x4f, 0x59, 0x6d, 0x54, 0x6d, 0x43, 0x67, 0x34, 0x63, 0x4f, 0x59, 0x75, 0x62, + 0x67, 0x51, 0x51, 0x79, 0x48, 0x42, 0x66, 0x51, 0x65, 0x66, 0x76, 0x36, 0x77, 0x6b, 0x33, 0x34, 0x71, 0x30, + 0x48, 0x6f, 0x49, 0x43, 0x57, 0x52, 0x38, 0x52, 0x74, 0x5a, 0x59, 0x75, 0x35, 0x44, 0x62, 0x64, 0x4a, 0x4d, + 0x45, 0x5c, 0x0a, + 0x09, 0x6f, 0x36, 0x71, 0x72, 0x37, 0x61, 0x54, 0x62, 0x36, 0x32, 0x4c, 0x66, 0x76, 0x74, 0x4e, 0x77, 0x2b, + 0x72, 0x35, 0x54, 0x63, 0x57, 0x44, 0x76, 0x53, 0x54, 0x68, 0x6e, 0x2f, 0x36, 0x6e, 0x34, 0x6e, 0x67, 0x4d, + 0x6e, 0x59, 0x57, 0x71, 0x38, 0x70, 0x79, 0x49, 0x2b, 0x55, 0x47, 0x38, 0x7a, 0x44, 0x32, 0x30, 0x36, 0x32, + 0x59, 0x48, 0x58, 0x31, 0x59, 0x34, 0x56, 0x39, 0x62, 0x44, 0x47, 0x74, 0x48, 0x45, 0x41, 0x51, 0x42, 0x59, + 0x41, 0x5c, 0x0a, + 0x09, 0x63, 0x43, 0x4f, 0x56, 0x47, 0x63, 0x46, 0x31, 0x74, 0x39, 0x2b, 0x50, 0x39, 0x2f, 0x33, 0x64, 0x5a, + 0x66, 0x6a, 0x6e, 0x54, 0x31, 0x77, 0x57, 0x6e, 0x54, 0x31, 0x35, 0x53, 0x6b, 0x73, 0x72, 0x54, 0x54, 0x6c, + 0x38, 0x31, 0x4c, 0x65, 0x31, 0x54, 0x39, 0x75, 0x6c, 0x44, 0x35, 0x30, 0x41, 0x7a, 0x50, 0x69, 0x55, 0x51, + 0x66, 0x45, 0x2b, 0x4f, 0x59, 0x43, 0x45, 0x2f, 0x64, 0x36, 0x38, 0x37, 0x33, 0x6f, 0x59, 0x33, 0x71, 0x6e, + 0x6d, 0x5c, 0x0a, + 0x09, 0x5a, 0x6d, 0x63, 0x78, 0x65, 0x2b, 0x51, 0x49, 0x37, 0x6f, 0x68, 0x42, 0x50, 0x6a, 0x58, 0x71, 0x77, + 0x4e, 0x2f, 0x70, 0x70, 0x2b, 0x2f, 0x48, 0x67, 0x66, 0x32, 0x6e, 0x34, 0x65, 0x47, 0x6e, 0x6e, 0x59, 0x4c, + 0x7a, 0x48, 0x37, 0x59, 0x58, 0x35, 0x35, 0x35, 0x32, 0x41, 0x71, 0x59, 0x6d, 0x2b, 0x6e, 0x57, 0x55, 0x6a, + 0x30, 0x42, 0x51, 0x6a, 0x37, 0x64, 0x78, 0x37, 0x55, 0x41, 0x66, 0x43, 0x37, 0x44, 0x6c, 0x57, 0x5a, 0x55, + 0x71, 0x5c, 0x0a, + 0x09, 0x4c, 0x31, 0x4a, 0x6a, 0x4e, 0x66, 0x37, 0x71, 0x32, 0x71, 0x33, 0x33, 0x48, 0x38, 0x48, 0x58, 0x62, + 0x72, 0x67, 0x56, 0x58, 0x37, 0x2f, 0x78, 0x46, 0x74, 0x78, 0x77, 0x30, 0x32, 0x32, 0x34, 0x37, 0x68, 0x76, + 0x66, 0x77, 0x71, 0x47, 0x44, 0x42, 0x31, 0x4d, 0x64, 0x4d, 0x54, 0x6c, 0x77, 0x6b, 0x4c, 0x51, 0x65, 0x44, + 0x39, 0x62, 0x36, 0x35, 0x49, 0x39, 0x55, 0x57, 0x77, 0x38, 0x49, 0x38, 0x59, 0x65, 0x50, 0x6b, 0x6f, 0x53, + 0x48, 0x5c, 0x0a, + 0x09, 0x4f, 0x54, 0x49, 0x48, 0x2b, 0x2f, 0x41, 0x41, 0x6b, 0x2b, 0x69, 0x48, 0x62, 0x48, 0x30, 0x50, 0x42, + 0x67, 0x4e, 0x63, 0x66, 0x2f, 0x32, 0x33, 0x38, 0x4f, 0x33, 0x72, 0x72, 0x38, 0x63, 0x2f, 0x56, 0x2b, 0x50, + 0x6f, 0x64, 0x4c, 0x76, 0x34, 0x34, 0x55, 0x74, 0x2b, 0x41, 0x44, 0x39, 0x39, 0x79, 0x66, 0x66, 0x68, 0x7a, + 0x4a, 0x4e, 0x33, 0x53, 0x64, 0x6e, 0x79, 0x44, 0x43, 0x34, 0x42, 0x55, 0x41, 0x63, 0x41, 0x4f, 0x7a, 0x59, + 0x36, 0x5c, 0x0a, + 0x09, 0x41, 0x36, 0x44, 0x47, 0x46, 0x31, 0x61, 0x75, 0x45, 0x66, 0x6d, 0x48, 0x67, 0x41, 0x41, 0x51, 0x4c, + 0x63, 0x4b, 0x35, 0x66, 0x69, 0x33, 0x6b, 0x5a, 0x69, 0x54, 0x38, 0x2f, 0x79, 0x37, 0x37, 0x43, 0x6e, 0x37, + 0x6e, 0x44, 0x39, 0x36, 0x54, 0x52, 0x41, 0x6e, 0x74, 0x6d, 0x4e, 0x70, 0x59, 0x77, 0x72, 0x6c, 0x59, 0x4e, + 0x70, 0x42, 0x43, 0x2f, 0x4d, 0x5a, 0x4d, 0x67, 0x46, 0x32, 0x33, 0x6a, 0x46, 0x61, 0x30, 0x70, 0x63, 0x70, + 0x70, 0x5c, 0x0a, + 0x09, 0x59, 0x2b, 0x5a, 0x41, 0x77, 0x68, 0x39, 0x42, 0x74, 0x51, 0x41, 0x69, 0x65, 0x53, 0x38, 0x41, 0x4d, + 0x2f, 0x67, 0x38, 0x7a, 0x33, 0x48, 0x52, 0x52, 0x52, 0x66, 0x69, 0x71, 0x52, 0x65, 0x63, 0x6a, 0x30, 0x73, + 0x65, 0x2b, 0x77, 0x68, 0x4d, 0x54, 0x2f, 0x53, 0x62, 0x48, 0x5a, 0x6f, 0x7a, 0x79, 0x4e, 0x4e, 0x54, 0x6e, + 0x6a, 0x33, 0x6f, 0x7a, 0x4b, 0x42, 0x70, 0x79, 0x6d, 0x58, 0x51, 0x74, 0x2b, 0x39, 0x36, 0x45, 0x42, 0x2f, + 0x35, 0x5c, 0x0a, + 0x09, 0x33, 0x4a, 0x58, 0x34, 0x78, 0x4b, 0x63, 0x2f, 0x6a, 0x78, 0x74, 0x76, 0x76, 0x4a, 0x47, 0x4a, 0x56, + 0x32, 0x56, 0x44, 0x69, 0x72, 0x53, 0x38, 0x77, 0x39, 0x67, 0x54, 0x49, 0x47, 0x7a, 0x49, 0x36, 0x4b, 0x78, + 0x48, 0x6a, 0x58, 0x6c, 0x37, 0x31, 0x6a, 0x73, 0x56, 0x45, 0x74, 0x32, 0x6f, 0x36, 0x5a, 0x53, 0x56, 0x46, + 0x57, 0x70, 0x64, 0x4e, 0x5a, 0x5a, 0x31, 0x44, 0x72, 0x31, 0x2b, 0x44, 0x37, 0x39, 0x35, 0x36, 0x53, 0x76, + 0x77, 0x5c, 0x0a, + 0x09, 0x6f, 0x30, 0x38, 0x36, 0x4e, 0x7a, 0x41, 0x39, 0x57, 0x72, 0x61, 0x65, 0x66, 0x67, 0x6e, 0x41, 0x4f, + 0x37, 0x4a, 0x48, 0x50, 0x73, 0x57, 0x55, 0x37, 0x33, 0x72, 0x51, 0x52, 0x67, 0x48, 0x41, 0x4e, 0x67, 0x41, + 0x48, 0x5a, 0x63, 0x71, 0x6b, 0x30, 0x6c, 0x73, 0x41, 0x49, 0x4f, 0x41, 0x76, 0x50, 0x2f, 0x6b, 0x31, 0x76, + 0x50, 0x34, 0x74, 0x62, 0x34, 0x2b, 0x58, 0x6b, 0x6f, 0x6a, 0x4d, 0x49, 0x67, 0x55, 0x79, 0x51, 0x69, 0x66, + 0x76, 0x5c, 0x0a, + 0x09, 0x56, 0x45, 0x33, 0x4a, 0x6c, 0x31, 0x51, 0x45, 0x63, 0x68, 0x55, 0x79, 0x2b, 0x34, 0x63, 0x34, 0x4b, + 0x67, 0x57, 0x79, 0x52, 0x32, 0x2b, 0x72, 0x51, 0x70, 0x42, 0x6e, 0x2f, 0x47, 0x4f, 0x34, 0x46, 0x72, 0x68, + 0x6f, 0x49, 0x77, 0x74, 0x39, 0x4e, 0x42, 0x6d, 0x4f, 0x61, 0x6c, 0x56, 0x63, 0x30, 0x38, 0x37, 0x53, 0x39, + 0x41, 0x78, 0x39, 0x4f, 0x4c, 0x64, 0x37, 0x7a, 0x78, 0x37, 0x38, 0x2b, 0x69, 0x2b, 0x38, 0x47, 0x4d, 0x39, + 0x34, 0x5c, 0x0a, + 0x09, 0x7a, 0x42, 0x6c, 0x4b, 0x6a, 0x6a, 0x70, 0x38, 0x73, 0x65, 0x38, 0x36, 0x74, 0x62, 0x65, 0x4d, 0x4e, + 0x44, 0x4a, 0x67, 0x4f, 0x2f, 0x37, 0x63, 0x77, 0x67, 0x43, 0x2f, 0x2f, 0x37, 0x63, 0x66, 0x78, 0x77, 0x63, + 0x2b, 0x2b, 0x43, 0x46, 0x37, 0x32, 0x73, 0x53, 0x36, 0x74, 0x62, 0x49, 0x71, 0x66, 0x56, 0x36, 0x54, 0x6b, + 0x42, 0x2b, 0x41, 0x4c, 0x4d, 0x38, 0x41, 0x45, 0x4d, 0x71, 0x79, 0x41, 0x47, 0x55, 0x5a, 0x71, 0x44, 0x72, + 0x6d, 0x5c, 0x0a, + 0x09, 0x4d, 0x74, 0x4c, 0x48, 0x38, 0x62, 0x76, 0x6d, 0x6a, 0x34, 0x47, 0x44, 0x2b, 0x56, 0x67, 0x7a, 0x64, + 0x33, 0x77, 0x56, 0x52, 0x50, 0x67, 0x34, 0x4c, 0x42, 0x44, 0x4a, 0x73, 0x68, 0x7a, 0x76, 0x65, 0x74, 0x4e, + 0x72, 0x38, 0x62, 0x54, 0x7a, 0x54, 0x76, 0x63, 0x64, 0x57, 0x6d, 0x73, 0x6f, 0x38, 0x76, 0x68, 0x31, 0x63, + 0x4f, 0x34, 0x4e, 0x6d, 0x77, 0x38, 0x41, 0x69, 0x4d, 0x34, 0x41, 0x33, 0x4c, 0x63, 0x61, 0x6a, 0x62, 0x4b, + 0x69, 0x5c, 0x0a, + 0x09, 0x47, 0x2b, 0x38, 0x2b, 0x69, 0x47, 0x65, 0x2f, 0x2f, 0x44, 0x56, 0x59, 0x57, 0x6c, 0x77, 0x53, 0x43, + 0x75, 0x74, 0x30, 0x75, 0x78, 0x67, 0x66, 0x48, 0x30, 0x65, 0x33, 0x33, 0x30, 0x65, 0x6e, 0x30, 0x30, 0x47, + 0x57, 0x35, 0x56, 0x55, 0x7a, 0x4a, 0x52, 0x77, 0x63, 0x79, 0x6d, 0x47, 0x4a, 0x30, 0x76, 0x6c, 0x6e, 0x34, + 0x6c, 0x33, 0x70, 0x55, 0x4a, 0x61, 0x46, 0x2f, 0x33, 0x51, 0x46, 0x55, 0x43, 0x6d, 0x75, 0x4c, 0x4d, 0x75, + 0x59, 0x5c, 0x0a, + 0x09, 0x70, 0x70, 0x57, 0x6c, 0x65, 0x71, 0x74, 0x4c, 0x57, 0x45, 0x43, 0x4b, 0x5a, 0x51, 0x41, 0x51, 0x6f, + 0x58, 0x43, 0x6c, 0x47, 0x62, 0x30, 0x41, 0x43, 0x49, 0x4d, 0x4d, 0x31, 0x35, 0x4e, 0x73, 0x41, 0x62, 0x61, + 0x54, 0x36, 0x41, 0x79, 0x47, 0x55, 0x31, 0x4e, 0x2f, 0x76, 0x4e, 0x77, 0x62, 0x66, 0x2b, 0x32, 0x58, 0x38, + 0x61, 0x4e, 0x50, 0x50, 0x43, 0x39, 0x31, 0x57, 0x4c, 0x46, 0x41, 0x78, 0x52, 0x32, 0x64, 0x5a, 0x77, 0x46, + 0x47, 0x5c, 0x0a, + 0x09, 0x52, 0x68, 0x41, 0x37, 0x54, 0x35, 0x31, 0x30, 0x66, 0x6e, 0x45, 0x5a, 0x72, 0x33, 0x7a, 0x6e, 0x58, + 0x2b, 0x4c, 0x79, 0x79, 0x7a, 0x2b, 0x64, 0x4f, 0x4a, 0x45, 0x46, 0x57, 0x48, 0x6d, 0x65, 0x49, 0x38, 0x74, + 0x7a, 0x35, 0x48, 0x6e, 0x4f, 0x6d, 0x69, 0x56, 0x51, 0x52, 0x70, 0x58, 0x63, 0x67, 0x70, 0x4e, 0x35, 0x2f, + 0x58, 0x6c, 0x48, 0x4c, 0x79, 0x74, 0x57, 0x58, 0x50, 0x72, 0x4a, 0x77, 0x4c, 0x71, 0x4d, 0x41, 0x67, 0x77, + 0x74, 0x5c, 0x0a, + 0x09, 0x31, 0x4a, 0x4a, 0x78, 0x5a, 0x53, 0x6e, 0x34, 0x61, 0x5a, 0x7a, 0x69, 0x57, 0x5a, 0x47, 0x2f, 0x61, + 0x74, 0x59, 0x4d, 0x49, 0x45, 0x5a, 0x57, 0x78, 0x34, 0x48, 0x6d, 0x78, 0x4a, 0x4e, 0x50, 0x77, 0x74, 0x2b, + 0x39, 0x39, 0x54, 0x65, 0x77, 0x77, 0x33, 0x70, 0x51, 0x69, 0x4e, 0x75, 0x35, 0x50, 0x2f, 0x64, 0x4f, 0x77, + 0x50, 0x31, 0x69, 0x64, 0x74, 0x62, 0x47, 0x41, 0x63, 0x44, 0x47, 0x72, 0x41, 0x45, 0x34, 0x74, 0x79, 0x4f, + 0x39, 0x5c, 0x0a, + 0x09, 0x50, 0x5a, 0x4f, 0x6d, 0x73, 0x65, 0x2f, 0x35, 0x75, 0x30, 0x39, 0x67, 0x6b, 0x54, 0x33, 0x72, 0x6a, + 0x59, 0x78, 0x77, 0x30, 0x6b, 0x6d, 0x6e, 0x59, 0x48, 0x4c, 0x72, 0x56, 0x70, 0x52, 0x6c, 0x69, 0x62, 0x49, + 0x6f, 0x55, 0x4a, 0x51, 0x6c, 0x69, 0x73, 0x49, 0x2f, 0x64, 0x31, 0x34, 0x55, 0x4a, 0x63, 0x70, 0x69, 0x36, + 0x43, 0x4e, 0x47, 0x41, 0x5a, 0x54, 0x6b, 0x54, 0x53, 0x52, 0x44, 0x6a, 0x68, 0x49, 0x46, 0x73, 0x6a, 0x4b, + 0x4c, 0x5c, 0x0a, + 0x09, 0x4c, 0x39, 0x71, 0x67, 0x4c, 0x41, 0x50, 0x4b, 0x45, 0x73, 0x34, 0x42, 0x57, 0x65, 0x61, 0x4e, 0x4c, + 0x68, 0x68, 0x67, 0x31, 0x46, 0x57, 0x57, 0x69, 0x65, 0x77, 0x67, 0x42, 0x38, 0x58, 0x4d, 0x67, 0x47, 0x4c, + 0x36, 0x55, 0x58, 0x32, 0x72, 0x79, 0x75, 0x72, 0x6e, 0x76, 0x2f, 0x55, 0x4c, 0x50, 0x75, 0x4f, 0x31, 0x59, + 0x48, 0x52, 0x55, 0x47, 0x35, 0x57, 0x31, 0x31, 0x6d, 0x43, 0x6d, 0x78, 0x70, 0x42, 0x74, 0x76, 0x66, 0x46, + 0x74, 0x5c, 0x0a, + 0x09, 0x37, 0x38, 0x56, 0x35, 0x70, 0x2f, 0x38, 0x33, 0x6e, 0x48, 0x6e, 0x79, 0x54, 0x75, 0x6e, 0x6f, 0x6f, + 0x78, 0x62, 0x39, 0x43, 0x45, 0x62, 0x32, 0x70, 0x63, 0x76, 0x70, 0x36, 0x51, 0x50, 0x77, 0x2f, 0x6f, 0x39, + 0x39, 0x41, 0x5a, 0x64, 0x66, 0x2f, 0x6d, 0x6b, 0x6d, 0x67, 0x37, 0x72, 0x6f, 0x32, 0x4d, 0x51, 0x34, 0x2b, + 0x6d, 0x4e, 0x39, 0x39, 0x48, 0x70, 0x6a, 0x79, 0x50, 0x49, 0x4d, 0x57, 0x64, 0x36, 0x42, 0x4b, 0x38, 0x73, + 0x49, 0x5c, 0x0a, + 0x09, 0x77, 0x4d, 0x34, 0x35, 0x46, 0x50, 0x47, 0x59, 0x41, 0x58, 0x52, 0x31, 0x6a, 0x4e, 0x4a, 0x56, 0x2b, + 0x73, 0x68, 0x51, 0x6c, 0x6d, 0x58, 0x4d, 0x41, 0x76, 0x67, 0x6e, 0x38, 0x68, 0x79, 0x75, 0x4b, 0x41, 0x41, + 0x69, 0x5a, 0x45, 0x61, 0x6d, 0x46, 0x72, 0x6a, 0x79, 0x2b, 0x6d, 0x43, 0x67, 0x70, 0x4e, 0x63, 0x4d, 0x46, + 0x46, 0x43, 0x48, 0x4d, 0x6e, 0x6f, 0x4b, 0x6d, 0x41, 0x42, 0x35, 0x41, 0x41, 0x59, 0x4f, 0x32, 0x6d, 0x78, + 0x36, 0x5c, 0x0a, + 0x09, 0x65, 0x4f, 0x63, 0x64, 0x64, 0x2b, 0x42, 0x2f, 0x2f, 0x65, 0x74, 0x58, 0x38, 0x64, 0x4a, 0x6e, 0x58, + 0x69, 0x67, 0x56, 0x79, 0x51, 0x55, 0x66, 0x32, 0x33, 0x63, 0x37, 0x6a, 0x51, 0x4c, 0x72, 0x53, 0x68, 0x75, + 0x31, 0x44, 0x32, 0x41, 0x48, 0x41, 0x4e, 0x53, 0x33, 0x75, 0x78, 0x68, 0x56, 0x33, 0x2b, 0x39, 0x36, 0x63, + 0x41, 0x37, 0x2f, 0x38, 0x49, 0x2f, 0x2f, 0x58, 0x4a, 0x33, 0x7a, 0x48, 0x79, 0x65, 0x64, 0x63, 0x69, 0x71, + 0x6d, 0x5c, 0x0a, + 0x09, 0x64, 0x2b, 0x78, 0x41, 0x6e, 0x75, 0x58, 0x49, 0x73, 0x67, 0x78, 0x5a, 0x37, 0x6a, 0x38, 0x37, 0x48, + 0x66, 0x2b, 0x49, 0x5a, 0x70, 0x35, 0x6e, 0x79, 0x4c, 0x49, 0x63, 0x52, 0x4f, 0x51, 0x4e, 0x45, 0x46, 0x6d, + 0x4d, 0x4e, 0x6c, 0x6d, 0x65, 0x67, 0x37, 0x49, 0x4d, 0x65, 0x62, 0x68, 0x4f, 0x42, 0x47, 0x52, 0x68, 0x2b, + 0x41, 0x35, 0x5a, 0x6c, 0x6f, 0x45, 0x6f, 0x51, 0x7a, 0x44, 0x36, 0x36, 0x45, 0x4d, 0x5a, 0x45, 0x31, 0x47, + 0x6f, 0x5c, 0x0a, + 0x09, 0x4a, 0x36, 0x4a, 0x4f, 0x7a, 0x58, 0x2b, 0x57, 0x5a, 0x66, 0x35, 0x53, 0x31, 0x4b, 0x2b, 0x2f, 0x48, + 0x46, 0x2b, 0x52, 0x35, 0x62, 0x78, 0x44, 0x36, 0x37, 0x66, 0x4a, 0x36, 0x42, 0x51, 0x7a, 0x4c, 0x49, 0x6a, + 0x35, 0x4c, 0x6f, 0x31, 0x55, 0x56, 0x43, 0x51, 0x51, 0x44, 0x6b, 0x75, 0x4c, 0x69, 0x2f, 0x6a, 0x6a, 0x6a, + 0x31, 0x7a, 0x4f, 0x5a, 0x4f, 0x56, 0x69, 0x64, 0x70, 0x4e, 0x57, 0x71, 0x4a, 0x67, 0x4b, 0x54, 0x69, 0x32, + 0x41, 0x5c, 0x0a, + 0x09, 0x57, 0x41, 0x4d, 0x4d, 0x41, 0x78, 0x4c, 0x6e, 0x63, 0x50, 0x2f, 0x68, 0x42, 0x62, 0x7a, 0x2f, 0x4c, + 0x2f, 0x39, 0x61, 0x39, 0x4e, 0x33, 0x72, 0x39, 0x33, 0x48, 0x69, 0x4b, 0x61, 0x66, 0x69, 0x59, 0x59, 0x38, + 0x34, 0x43, 0x36, 0x66, 0x73, 0x4f, 0x77, 0x33, 0x48, 0x37, 0x64, 0x71, 0x44, 0x4c, 0x56, 0x4e, 0x54, 0x36, + 0x49, 0x2b, 0x4e, 0x49, 0x38, 0x38, 0x7a, 0x35, 0x4a, 0x6e, 0x58, 0x43, 0x54, 0x49, 0x2f, 0x4a, 0x65, 0x74, + 0x6b, 0x5c, 0x0a, + 0x09, 0x4f, 0x53, 0x67, 0x6a, 0x45, 0x44, 0x48, 0x64, 0x78, 0x4f, 0x4d, 0x73, 0x79, 0x6a, 0x32, 0x72, 0x35, + 0x4d, 0x37, 0x66, 0x4c, 0x78, 0x69, 0x35, 0x79, 0x76, 0x4d, 0x49, 0x64, 0x42, 0x6c, 0x6c, 0x45, 0x54, 0x37, + 0x72, 0x4d, 0x58, 0x69, 0x4a, 0x42, 0x64, 0x31, 0x5a, 0x36, 0x30, 0x41, 0x4f, 0x48, 0x70, 0x41, 0x43, 0x43, + 0x46, 0x73, 0x4c, 0x79, 0x67, 0x6c, 0x34, 0x4f, 0x79, 0x54, 0x74, 0x78, 0x4f, 0x73, 0x42, 0x47, 0x42, 0x7a, + 0x77, 0x5c, 0x0a, + 0x09, 0x6a, 0x35, 0x2f, 0x36, 0x66, 0x47, 0x68, 0x41, 0x79, 0x5a, 0x32, 0x56, 0x39, 0x35, 0x6e, 0x41, 0x54, + 0x67, 0x50, 0x54, 0x31, 0x35, 0x55, 0x32, 0x42, 0x67, 0x43, 0x49, 0x74, 0x6b, 0x63, 0x44, 0x62, 0x5a, 0x69, + 0x44, 0x58, 0x6e, 0x62, 0x6c, 0x74, 0x7a, 0x43, 0x73, 0x49, 0x6a, 0x75, 0x42, 0x30, 0x4f, 0x76, 0x33, 0x73, + 0x57, 0x76, 0x6e, 0x62, 0x6e, 0x54, 0x79, 0x48, 0x4a, 0x52, 0x6e, 0x4e, 0x51, 0x68, 0x6b, 0x33, 0x6e, 0x6a, + 0x38, 0x5c, 0x0a, + 0x09, 0x33, 0x4c, 0x39, 0x79, 0x66, 0x41, 0x34, 0x43, 0x6c, 0x46, 0x55, 0x47, 0x52, 0x2f, 0x35, 0x38, 0x5a, + 0x58, 0x43, 0x41, 0x51, 0x30, 0x62, 0x6b, 0x6a, 0x61, 0x6e, 0x53, 0x59, 0x41, 0x30, 0x43, 0x58, 0x6b, 0x4d, + 0x4a, 0x43, 0x49, 0x54, 0x37, 0x79, 0x41, 0x77, 0x6f, 0x67, 0x73, 0x46, 0x56, 0x63, 0x63, 0x63, 0x44, 0x6a, + 0x54, 0x4c, 0x61, 0x75, 0x48, 0x71, 0x4e, 0x47, 0x67, 0x79, 0x73, 0x39, 0x38, 0x77, 0x6c, 0x61, 0x61, 0x64, + 0x4c, 0x5c, 0x0a, + 0x09, 0x6a, 0x54, 0x62, 0x55, 0x35, 0x57, 0x44, 0x67, 0x34, 0x50, 0x43, 0x52, 0x66, 0x2f, 0x77, 0x59, 0x37, + 0x70, 0x75, 0x5a, 0x6a, 0x37, 0x79, 0x4c, 0x56, 0x44, 0x4e, 0x59, 0x71, 0x4d, 0x34, 0x4f, 0x6e, 0x4a, 0x59, + 0x2f, 0x79, 0x38, 0x4a, 0x63, 0x74, 0x50, 0x61, 0x59, 0x75, 0x6e, 0x37, 0x30, 0x69, 0x71, 0x73, 0x78, 0x4e, + 0x7a, 0x65, 0x48, 0x38, 0x43, 0x61, 0x65, 0x54, 0x74, 0x37, 0x42, 0x67, 0x54, 0x4d, 0x66, 0x67, 0x65, 0x4e, + 0x32, 0x5c, 0x0a, + 0x09, 0x37, 0x6b, 0x53, 0x2f, 0x31, 0x30, 0x65, 0x65, 0x2b, 0x56, 0x54, 0x66, 0x79, 0x37, 0x72, 0x53, 0x54, + 0x51, 0x55, 0x43, 0x6e, 0x64, 0x79, 0x44, 0x41, 0x49, 0x67, 0x38, 0x43, 0x47, 0x63, 0x77, 0x51, 0x43, 0x43, + 0x72, 0x51, 0x4b, 0x44, 0x57, 0x42, 0x35, 0x65, 0x6a, 0x53, 0x46, 0x51, 0x43, 0x43, 0x44, 0x69, 0x48, 0x6e, + 0x4f, 0x6c, 0x4d, 0x67, 0x33, 0x4c, 0x51, 0x6e, 0x5a, 0x37, 0x71, 0x36, 0x6a, 0x73, 0x46, 0x31, 0x74, 0x75, + 0x54, 0x5c, 0x0a, + 0x09, 0x78, 0x52, 0x75, 0x4f, 0x34, 0x65, 0x71, 0x6d, 0x46, 0x51, 0x43, 0x48, 0x4f, 0x69, 0x47, 0x4c, 0x75, + 0x4f, 0x61, 0x61, 0x61, 0x33, 0x44, 0x48, 0x67, 0x30, 0x66, 0x53, 0x7a, 0x45, 0x6f, 0x41, 0x43, 0x51, 0x48, + 0x4f, 0x6e, 0x58, 0x44, 0x35, 0x6c, 0x36, 0x2f, 0x65, 0x30, 0x4a, 0x38, 0x4a, 0x57, 0x39, 0x63, 0x70, 0x77, + 0x49, 0x46, 0x39, 0x70, 0x2b, 0x48, 0x4e, 0x72, 0x33, 0x34, 0x5a, 0x6e, 0x76, 0x33, 0x6b, 0x78, 0x2b, 0x30, + 0x51, 0x5c, 0x0a, + 0x09, 0x74, 0x30, 0x65, 0x4d, 0x74, 0x50, 0x58, 0x72, 0x33, 0x37, 0x36, 0x35, 0x2b, 0x75, 0x70, 0x54, 0x72, + 0x4e, 0x30, 0x6e, 0x6e, 0x49, 0x42, 0x4f, 0x72, 0x34, 0x74, 0x69, 0x4f, 0x41, 0x53, 0x49, 0x4d, 0x4d, 0x51, + 0x51, 0x57, 0x53, 0x58, 0x77, 0x34, 0x58, 0x42, 0x59, 0x75, 0x36, 0x4e, 0x7a, 0x79, 0x44, 0x73, 0x35, 0x55, + 0x4a, 0x43, 0x66, 0x44, 0x6e, 0x51, 0x79, 0x59, 0x46, 0x68, 0x4e, 0x42, 0x7a, 0x49, 0x2b, 0x48, 0x63, 0x68, + 0x52, 0x5c, 0x0a, + 0x09, 0x75, 0x67, 0x49, 0x5a, 0x41, 0x53, 0x37, 0x50, 0x66, 0x66, 0x72, 0x75, 0x58, 0x45, 0x77, 0x2f, 0x77, + 0x33, 0x76, 0x7a, 0x71, 0x49, 0x6f, 0x45, 0x6c, 0x47, 0x55, 0x2b, 0x39, 0x61, 0x77, 0x6f, 0x69, 0x39, 0x4d, + 0x42, 0x50, 0x77, 0x37, 0x76, 0x6e, 0x4e, 0x55, 0x51, 0x73, 0x69, 0x79, 0x75, 0x43, 0x66, 0x67, 0x53, 0x46, + 0x52, 0x42, 0x51, 0x48, 0x66, 0x32, 0x54, 0x37, 0x44, 0x44, 0x36, 0x48, 0x67, 0x4d, 0x4b, 0x49, 0x2f, 0x72, + 0x72, 0x5c, 0x0a, + 0x09, 0x32, 0x31, 0x6e, 0x42, 0x38, 0x46, 0x78, 0x5a, 0x34, 0x76, 0x50, 0x58, 0x33, 0x59, 0x52, 0x6e, 0x58, + 0x58, 0x42, 0x57, 0x62, 0x43, 0x75, 0x38, 0x77, 0x65, 0x62, 0x49, 0x34, 0x6c, 0x49, 0x55, 0x38, 0x61, 0x41, + 0x6f, 0x6b, 0x52, 0x45, 0x68, 0x4a, 0x7a, 0x2b, 0x32, 0x54, 0x70, 0x5a, 0x6a, 0x76, 0x4e, 0x64, 0x42, 0x76, + 0x39, 0x76, 0x42, 0x65, 0x43, 0x39, 0x50, 0x73, 0x37, 0x49, 0x49, 0x46, 0x4d, 0x41, 0x58, 0x76, 0x2f, 0x35, + 0x4e, 0x5c, 0x0a, + 0x09, 0x6b, 0x66, 0x7a, 0x73, 0x4f, 0x66, 0x45, 0x6b, 0x6a, 0x49, 0x33, 0x31, 0x55, 0x51, 0x78, 0x4c, 0x4f, + 0x41, 0x41, 0x35, 0x61, 0x69, 0x63, 0x59, 0x73, 0x6a, 0x66, 0x65, 0x6c, 0x67, 0x43, 0x6f, 0x41, 0x50, 0x49, + 0x4d, 0x4b, 0x46, 0x45, 0x41, 0x4a, 0x5a, 0x42, 0x6e, 0x48, 0x52, 0x51, 0x6f, 0x67, 0x44, 0x4c, 0x7a, 0x4a, + 0x54, 0x49, 0x67, 0x4b, 0x77, 0x6b, 0x6c, 0x2f, 0x46, 0x54, 0x50, 0x46, 0x62, 0x36, 0x6a, 0x70, 0x75, 0x6b, + 0x41, 0x5c, 0x0a, + 0x09, 0x34, 0x45, 0x48, 0x41, 0x46, 0x59, 0x55, 0x48, 0x5a, 0x55, 0x42, 0x4e, 0x42, 0x77, 0x49, 0x35, 0x76, + 0x39, 0x35, 0x51, 0x51, 0x69, 0x7a, 0x61, 0x36, 0x62, 0x57, 0x4b, 0x78, 0x6b, 0x56, 0x4a, 0x6b, 0x6c, 0x4f, + 0x32, 0x65, 0x4d, 0x75, 0x52, 0x74, 0x53, 0x55, 0x57, 0x46, 0x36, 0x76, 0x7a, 0x6c, 0x33, 0x33, 0x31, 0x6d, + 0x2f, 0x69, 0x65, 0x68, 0x2b, 0x2b, 0x7a, 0x32, 0x2f, 0x51, 0x4d, 0x6f, 0x48, 0x44, 0x6c, 0x43, 0x54, 0x2f, + 0x2f, 0x5c, 0x0a, + 0x09, 0x2b, 0x72, 0x66, 0x32, 0x75, 0x74, 0x33, 0x75, 0x6f, 0x4c, 0x6e, 0x67, 0x32, 0x74, 0x4b, 0x36, 0x72, + 0x77, 0x47, 0x38, 0x2b, 0x73, 0x33, 0x76, 0x6e, 0x72, 0x35, 0x76, 0x6f, 0x62, 0x6a, 0x6f, 0x39, 0x42, 0x4e, + 0x33, 0x6a, 0x79, 0x78, 0x33, 0x31, 0x54, 0x58, 0x58, 0x69, 0x66, 0x6e, 0x56, 0x74, 0x75, 0x30, 0x37, 0x6b, + 0x47, 0x55, 0x5a, 0x58, 0x46, 0x68, 0x4d, 0x36, 0x6e, 0x51, 0x77, 0x4a, 0x4b, 0x41, 0x63, 0x46, 0x73, 0x6a, + 0x7a, 0x5c, 0x0a, + 0x09, 0x48, 0x41, 0x56, 0x38, 0x4f, 0x74, 0x4f, 0x68, 0x4c, 0x6f, 0x62, 0x44, 0x5a, 0x65, 0x52, 0x35, 0x42, + 0x72, 0x6a, 0x63, 0x72, 0x78, 0x77, 0x54, 0x49, 0x61, 0x64, 0x71, 0x2f, 0x70, 0x2f, 0x4a, 0x4e, 0x59, 0x48, + 0x77, 0x34, 0x6b, 0x35, 0x6b, 0x42, 0x46, 0x63, 0x43, 0x63, 0x4b, 0x55, 0x43, 0x41, 0x59, 0x5a, 0x52, 0x46, + 0x56, 0x41, 0x45, 0x79, 0x6f, 0x68, 0x51, 0x4f, 0x68, 0x66, 0x39, 0x75, 0x5a, 0x36, 0x42, 0x2b, 0x68, 0x58, + 0x68, 0x5c, 0x0a, + 0x09, 0x73, 0x69, 0x79, 0x6b, 0x6b, 0x54, 0x45, 0x67, 0x69, 0x50, 0x65, 0x31, 0x39, 0x5a, 0x30, 0x43, 0x59, + 0x76, 0x65, 0x37, 0x41, 0x5a, 0x45, 0x56, 0x57, 0x41, 0x74, 0x61, 0x2f, 0x4e, 0x7a, 0x62, 0x2f, 0x76, 0x53, + 0x44, 0x65, 0x50, 0x2b, 0x48, 0x74, 0x75, 0x43, 0x42, 0x42, 0x78, 0x37, 0x45, 0x6f, 0x55, 0x4d, 0x48, 0x73, + 0x54, 0x78, 0x59, 0x54, 0x75, 0x65, 0x37, 0x4d, 0x41, 0x79, 0x36, 0x75, 0x6a, 0x34, 0x32, 0x4d, 0x59, 0x62, + 0x74, 0x5c, 0x0a, + 0x09, 0x32, 0x33, 0x64, 0x67, 0x32, 0x39, 0x51, 0x30, 0x4a, 0x72, 0x64, 0x4f, 0x59, 0x75, 0x65, 0x32, 0x62, + 0x54, 0x68, 0x75, 0x2b, 0x7a, 0x53, 0x32, 0x54, 0x57, 0x33, 0x42, 0x72, 0x6d, 0x33, 0x54, 0x2b, 0x4f, 0x49, + 0x56, 0x58, 0x78, 0x61, 0x38, 0x37, 0x74, 0x69, 0x31, 0x45, 0x33, 0x6e, 0x65, 0x41, 0x64, 0x77, 0x51, 0x42, + 0x47, 0x41, 0x49, 0x6f, 0x45, 0x4d, 0x64, 0x46, 0x45, 0x57, 0x42, 0x54, 0x71, 0x63, 0x54, 0x51, 0x55, 0x41, + 0x37, 0x5c, 0x0a, + 0x09, 0x56, 0x77, 0x6e, 0x2f, 0x6b, 0x74, 0x49, 0x63, 0x75, 0x51, 0x4b, 0x42, 0x44, 0x46, 0x6c, 0x4a, 0x4b, + 0x46, 0x79, 0x42, 0x4c, 0x49, 0x4a, 0x79, 0x79, 0x55, 0x41, 0x67, 0x71, 0x38, 0x62, 0x4f, 0x4d, 0x75, 0x70, + 0x71, 0x4c, 0x59, 0x66, 0x72, 0x41, 0x78, 0x41, 0x35, 0x41, 0x44, 0x77, 0x49, 0x5a, 0x48, 0x41, 0x4d, 0x6c, + 0x4c, 0x6b, 0x38, 0x68, 0x42, 0x7a, 0x5a, 0x4a, 0x39, 0x65, 0x5a, 0x6c, 0x6e, 0x56, 0x6a, 0x39, 0x6c, 0x44, + 0x56, 0x5c, 0x0a, + 0x09, 0x65, 0x65, 0x50, 0x2f, 0x65, 0x4a, 0x65, 0x38, 0x48, 0x63, 0x6e, 0x57, 0x45, 0x56, 0x69, 0x62, 0x4f, + 0x79, 0x59, 0x6d, 0x4a, 0x30, 0x37, 0x61, 0x73, 0x32, 0x76, 0x6e, 0x54, 0x64, 0x67, 0x67, 0x32, 0x6f, 0x68, + 0x46, 0x77, 0x4e, 0x50, 0x65, 0x2f, 0x49, 0x37, 0x33, 0x2f, 0x69, 0x69, 0x41, 0x78, 0x41, 0x43, 0x74, 0x56, + 0x7a, 0x41, 0x48, 0x6f, 0x55, 0x31, 0x4f, 0x54, 0x73, 0x62, 0x55, 0x50, 0x73, 0x59, 0x57, 0x6c, 0x32, 0x50, + 0x59, 0x5c, 0x0a, + 0x09, 0x41, 0x57, 0x68, 0x49, 0x30, 0x51, 0x43, 0x70, 0x4c, 0x4e, 0x48, 0x70, 0x65, 0x42, 0x44, 0x49, 0x34, + 0x72, 0x62, 0x4e, 0x49, 0x63, 0x71, 0x69, 0x52, 0x45, 0x61, 0x5a, 0x57, 0x68, 0x67, 0x45, 0x73, 0x72, 0x4b, + 0x73, 0x51, 0x43, 0x42, 0x44, 0x6c, 0x6a, 0x6d, 0x55, 0x4d, 0x66, 0x49, 0x51, 0x79, 0x68, 0x41, 0x31, 0x57, + 0x43, 0x59, 0x67, 0x72, 0x4d, 0x2b, 0x35, 0x79, 0x75, 0x69, 0x41, 0x65, 0x68, 0x72, 0x67, 0x79, 0x7a, 0x76, + 0x34, 0x5c, 0x0a, + 0x09, 0x4c, 0x61, 0x63, 0x63, 0x4d, 0x50, 0x51, 0x39, 0x2f, 0x57, 0x67, 0x55, 0x4c, 0x4f, 0x6f, 0x6e, 0x35, + 0x34, 0x32, 0x49, 0x4a, 0x51, 0x77, 0x70, 0x6f, 0x41, 0x38, 0x42, 0x64, 0x39, 0x78, 0x2b, 0x75, 0x2b, 0x67, + 0x72, 0x72, 0x6a, 0x74, 0x51, 0x65, 0x69, 0x74, 0x52, 0x79, 0x39, 0x76, 0x42, 0x59, 0x57, 0x46, 0x75, 0x41, + 0x51, 0x76, 0x7a, 0x64, 0x2b, 0x44, 0x4f, 0x4f, 0x2b, 0x35, 0x49, 0x51, 0x49, 0x50, 0x50, 0x63, 0x51, 0x45, + 0x67, 0x5c, 0x0a, + 0x09, 0x79, 0x33, 0x4e, 0x4d, 0x62, 0x5a, 0x6e, 0x79, 0x69, 0x33, 0x6f, 0x56, 0x4b, 0x4f, 0x63, 0x41, 0x43, + 0x67, 0x4b, 0x79, 0x61, 0x6a, 0x79, 0x64, 0x6a, 0x67, 0x65, 0x44, 0x6f, 0x6d, 0x44, 0x4c, 0x4c, 0x62, 0x33, + 0x58, 0x52, 0x38, 0x55, 0x41, 0x41, 0x43, 0x41, 0x41, 0x53, 0x55, 0x52, 0x42, 0x56, 0x42, 0x57, 0x56, 0x5a, + 0x51, 0x45, 0x51, 0x6b, 0x47, 0x63, 0x63, 0x42, 0x41, 0x6f, 0x67, 0x49, 0x2b, 0x54, 0x49, 0x55, 0x62, 0x71, + 0x79, 0x5c, 0x0a, + 0x09, 0x63, 0x6d, 0x35, 0x72, 0x59, 0x52, 0x42, 0x52, 0x48, 0x33, 0x46, 0x68, 0x4d, 0x49, 0x41, 0x41, 0x67, + 0x44, 0x4a, 0x4a, 0x73, 0x52, 0x67, 0x6f, 0x46, 0x30, 0x57, 0x4d, 0x36, 0x6e, 0x70, 0x38, 0x34, 0x59, 0x33, + 0x47, 0x63, 0x56, 0x46, 0x57, 0x36, 0x53, 0x55, 0x43, 0x41, 0x34, 0x2f, 0x38, 0x31, 0x58, 0x63, 0x4f, 0x47, + 0x6f, 0x45, 0x76, 0x6b, 0x62, 0x55, 0x45, 0x55, 0x46, 0x65, 0x73, 0x50, 0x65, 0x75, 0x53, 0x70, 0x2b, 0x38, + 0x34, 0x5c, 0x0a, + 0x09, 0x64, 0x50, 0x44, 0x67, 0x70, 0x67, 0x4b, 0x41, 0x5a, 0x4b, 0x37, 0x4c, 0x35, 0x38, 0x63, 0x61, 0x5a, + 0x59, 0x4d, 0x52, 0x39, 0x2f, 0x70, 0x2b, 0x37, 0x2f, 0x5a, 0x77, 0x47, 0x63, 0x68, 0x7a, 0x78, 0x78, 0x76, + 0x43, 0x30, 0x41, 0x31, 0x42, 0x63, 0x41, 0x67, 0x33, 0x6d, 0x68, 0x77, 0x48, 0x67, 0x51, 0x79, 0x41, 0x38, + 0x31, 0x66, 0x4b, 0x73, 0x76, 0x52, 0x52, 0x50, 0x30, 0x77, 0x48, 0x4b, 0x49, 0x43, 0x41, 0x58, 0x34, 0x6b, + 0x4f, 0x5c, 0x0a, + 0x09, 0x36, 0x77, 0x5a, 0x6c, 0x34, 0x65, 0x38, 0x47, 0x79, 0x4c, 0x73, 0x44, 0x6a, 0x47, 0x63, 0x69, 0x63, + 0x59, 0x73, 0x77, 0x49, 0x30, 0x4c, 0x68, 0x77, 0x68, 0x52, 0x41, 0x52, 0x64, 0x65, 0x73, 0x76, 0x71, 0x32, + 0x6c, 0x6c, 0x53, 0x39, 0x53, 0x66, 0x42, 0x37, 0x52, 0x53, 0x52, 0x70, 0x61, 0x6c, 0x4a, 0x4f, 0x36, 0x68, + 0x38, 0x33, 0x4c, 0x57, 0x74, 0x48, 0x4c, 0x4d, 0x6b, 0x35, 0x42, 0x4a, 0x45, 0x45, 0x70, 0x76, 0x74, 0x4b, + 0x62, 0x5c, 0x0a, + 0x09, 0x38, 0x78, 0x6d, 0x6d, 0x75, 0x48, 0x48, 0x73, 0x2f, 0x6c, 0x79, 0x2f, 0x33, 0x30, 0x65, 0x6e, 0x32, + 0x77, 0x48, 0x59, 0x62, 0x31, 0x73, 0x34, 0x35, 0x30, 0x41, 0x75, 0x78, 0x37, 0x42, 0x44, 0x6f, 0x4b, 0x4c, + 0x77, 0x30, 0x7a, 0x46, 0x32, 0x2b, 0x79, 0x38, 0x36, 0x54, 0x74, 0x56, 0x57, 0x50, 0x52, 0x30, 0x49, 0x49, + 0x4a, 0x42, 0x44, 0x54, 0x67, 0x63, 0x51, 0x49, 0x33, 0x78, 0x39, 0x74, 0x30, 0x62, 0x65, 0x46, 0x59, 0x68, + 0x4f, 0x5c, 0x0a, + 0x09, 0x47, 0x71, 0x5a, 0x6f, 0x52, 0x4d, 0x69, 0x63, 0x42, 0x77, 0x47, 0x65, 0x6b, 0x51, 0x58, 0x5a, 0x42, + 0x50, 0x32, 0x4b, 0x73, 0x55, 0x62, 0x32, 0x35, 0x49, 0x71, 0x2b, 0x30, 0x42, 0x55, 0x6b, 0x43, 0x44, 0x54, + 0x75, 0x44, 0x53, 0x42, 0x6d, 0x76, 0x38, 0x61, 0x59, 0x49, 0x36, 0x42, 0x58, 0x31, 0x2f, 0x65, 0x65, 0x73, + 0x48, 0x76, 0x48, 0x4a, 0x52, 0x65, 0x63, 0x47, 0x31, 0x38, 0x4d, 0x6b, 0x70, 0x33, 0x31, 0x35, 0x46, 0x52, + 0x50, 0x5c, 0x0a, + 0x09, 0x61, 0x30, 0x6a, 0x72, 0x41, 0x67, 0x42, 0x68, 0x39, 0x39, 0x39, 0x72, 0x66, 0x76, 0x59, 0x2f, 0x34, + 0x33, 0x66, 0x65, 0x39, 0x7a, 0x38, 0x54, 0x77, 0x51, 0x72, 0x44, 0x56, 0x59, 0x49, 0x50, 0x52, 0x74, 0x37, + 0x74, 0x64, 0x4e, 0x51, 0x74, 0x61, 0x70, 0x38, 0x4a, 0x4f, 0x44, 0x66, 0x30, 0x36, 0x53, 0x5a, 0x71, 0x4a, + 0x52, 0x56, 0x67, 0x6d, 0x55, 0x41, 0x78, 0x46, 0x43, 0x75, 0x64, 0x4a, 0x53, 0x6f, 0x51, 0x71, 0x47, 0x61, + 0x4d, 0x5c, 0x0a, + 0x09, 0x57, 0x52, 0x61, 0x6d, 0x41, 0x31, 0x52, 0x6e, 0x41, 0x6a, 0x6d, 0x78, 0x39, 0x4a, 0x4e, 0x51, 0x6c, + 0x68, 0x6e, 0x43, 0x42, 0x71, 0x49, 0x34, 0x48, 0x65, 0x43, 0x33, 0x43, 0x4a, 0x30, 0x54, 0x74, 0x77, 0x6a, + 0x35, 0x32, 0x47, 0x49, 0x66, 0x70, 0x52, 0x46, 0x35, 0x41, 0x68, 0x42, 0x53, 0x62, 0x55, 0x42, 0x38, 0x63, + 0x55, 0x2b, 0x73, 0x66, 0x49, 0x50, 0x45, 0x4f, 0x2f, 0x64, 0x35, 0x2b, 0x37, 0x45, 0x39, 0x39, 0x73, 0x6c, + 0x54, 0x5c, 0x0a, + 0x09, 0x7a, 0x76, 0x35, 0x59, 0x48, 0x35, 0x4e, 0x62, 0x37, 0x48, 0x64, 0x50, 0x50, 0x48, 0x44, 0x2f, 0x2f, + 0x61, 0x4c, 0x2f, 0x71, 0x6d, 0x47, 0x70, 0x43, 0x77, 0x64, 0x70, 0x30, 0x4f, 0x51, 0x42, 0x4f, 0x65, 0x2f, + 0x6b, 0x6f, 0x69, 0x30, 0x69, 0x2f, 0x36, 0x4d, 0x58, 0x6e, 0x53, 0x7a, 0x48, 0x45, 0x41, 0x36, 0x35, 0x79, + 0x31, 0x45, 0x55, 0x66, 0x6f, 0x72, 0x6d, 0x62, 0x2f, 0x4d, 0x42, 0x79, 0x4a, 0x7a, 0x58, 0x67, 0x66, 0x4d, + 0x72, 0x5c, 0x0a, + 0x09, 0x2f, 0x6f, 0x55, 0x41, 0x67, 0x53, 0x48, 0x4c, 0x42, 0x44, 0x4b, 0x66, 0x6e, 0x59, 0x48, 0x67, 0x73, + 0x68, 0x78, 0x55, 0x46, 0x69, 0x4e, 0x76, 0x45, 0x54, 0x72, 0x6e, 0x36, 0x69, 0x6b, 0x61, 0x6b, 0x56, 0x2b, + 0x6a, 0x59, 0x51, 0x59, 0x54, 0x73, 0x6a, 0x4d, 0x48, 0x76, 0x37, 0x45, 0x6f, 0x2f, 0x68, 0x41, 0x4e, 0x56, + 0x49, 0x51, 0x32, 0x35, 0x4b, 0x74, 0x76, 0x52, 0x59, 0x37, 0x61, 0x72, 0x78, 0x48, 0x4b, 0x62, 0x35, 0x32, + 0x61, 0x5c, 0x0a, + 0x09, 0x51, 0x71, 0x39, 0x36, 0x65, 0x47, 0x77, 0x55, 0x58, 0x58, 0x44, 0x57, 0x36, 0x54, 0x39, 0x2b, 0x31, + 0x69, 0x6d, 0x37, 0x75, 0x67, 0x41, 0x2b, 0x42, 0x65, 0x66, 0x6d, 0x67, 0x36, 0x2b, 0x73, 0x31, 0x2b, 0x61, + 0x67, 0x4e, 0x64, 0x38, 0x49, 0x46, 0x4c, 0x66, 0x2b, 0x2b, 0x75, 0x7a, 0x73, 0x50, 0x33, 0x33, 0x39, 0x6c, + 0x6e, 0x74, 0x66, 0x2b, 0x6f, 0x34, 0x50, 0x2f, 0x73, 0x4e, 0x7a, 0x51, 0x4a, 0x54, 0x78, 0x4c, 0x5a, 0x37, + 0x31, 0x5c, 0x0a, + 0x09, 0x73, 0x55, 0x2f, 0x76, 0x50, 0x76, 0x32, 0x76, 0x6e, 0x34, 0x6d, 0x37, 0x37, 0x77, 0x44, 0x67, 0x34, + 0x71, 0x63, 0x2f, 0x45, 0x79, 0x42, 0x43, 0x4d, 0x53, 0x78, 0x51, 0x6c, 0x50, 0x34, 0x64, 0x38, 0x30, 0x55, + 0x78, 0x39, 0x43, 0x6e, 0x6d, 0x63, 0x42, 0x6c, 0x46, 0x36, 0x66, 0x78, 0x69, 0x59, 0x46, 0x47, 0x69, 0x4b, + 0x41, 0x75, 0x55, 0x52, 0x59, 0x48, 0x53, 0x2b, 0x51, 0x30, 0x2f, 0x77, 0x2b, 0x6f, 0x70, 0x77, 0x4c, 0x4a, + 0x30, 0x5c, 0x0a, + 0x09, 0x4b, 0x41, 0x73, 0x2f, 0x48, 0x58, 0x44, 0x4f, 0x4e, 0x57, 0x77, 0x57, 0x38, 0x6d, 0x35, 0x63, 0x4f, + 0x6c, 0x64, 0x46, 0x48, 0x74, 0x38, 0x2f, 0x33, 0x79, 0x63, 0x51, 0x65, 0x41, 0x59, 0x51, 0x6f, 0x30, 0x35, + 0x41, 0x70, 0x7a, 0x54, 0x39, 0x5a, 0x4c, 0x49, 0x6f, 0x43, 0x7a, 0x4f, 0x39, 0x4e, 0x39, 0x50, 0x7a, 0x6b, + 0x42, 0x6e, 0x6f, 0x6a, 0x45, 0x4a, 0x46, 0x46, 0x31, 0x35, 0x33, 0x2f, 0x2f, 0x34, 0x44, 0x65, 0x4e, 0x4f, + 0x6c, 0x5c, 0x0a, + 0x09, 0x4c, 0x38, 0x48, 0x55, 0x65, 0x42, 0x38, 0x54, 0x76, 0x51, 0x36, 0x32, 0x6a, 0x50, 0x66, 0x38, 0x63, + 0x77, 0x4f, 0x69, 0x59, 0x52, 0x58, 0x68, 0x71, 0x71, 0x59, 0x4f, 0x4c, 0x77, 0x78, 0x77, 0x5a, 0x47, 0x45, + 0x4a, 0x63, 0x30, 0x76, 0x4c, 0x6d, 0x46, 0x31, 0x63, 0x78, 0x74, 0x7a, 0x69, 0x49, 0x75, 0x35, 0x35, 0x38, + 0x44, 0x41, 0x4f, 0x48, 0x70, 0x37, 0x46, 0x66, 0x51, 0x63, 0x50, 0x34, 0x37, 0x61, 0x37, 0x37, 0x38, 0x56, + 0x6c, 0x5c, 0x0a, + 0x09, 0x6c, 0x33, 0x30, 0x79, 0x38, 0x6a, 0x43, 0x35, 0x64, 0x51, 0x73, 0x65, 0x2f, 0x38, 0x51, 0x6e, 0x59, + 0x31, 0x67, 0x73, 0x6f, 0x79, 0x78, 0x4b, 0x4c, 0x43, 0x38, 0x76, 0x56, 0x2b, 0x6c, 0x2b, 0x67, 0x58, 0x49, + 0x34, 0x52, 0x4f, 0x6b, 0x63, 0x68, 0x6d, 0x55, 0x42, 0x4e, 0x79, 0x77, 0x78, 0x4c, 0x50, 0x78, 0x54, 0x65, + 0x76, 0x47, 0x36, 0x4b, 0x2f, 0x33, 0x2b, 0x67, 0x4b, 0x48, 0x66, 0x78, 0x31, 0x47, 0x36, 0x61, 0x6d, 0x39, + 0x41, 0x5c, 0x0a, + 0x09, 0x61, 0x65, 0x38, 0x54, 0x4b, 0x45, 0x72, 0x2f, 0x53, 0x31, 0x42, 0x38, 0x45, 0x62, 0x5a, 0x70, 0x73, + 0x78, 0x43, 0x41, 0x4f, 0x6a, 0x75, 0x4c, 0x61, 0x77, 0x4b, 0x57, 0x54, 0x70, 0x77, 0x41, 0x41, 0x53, 0x45, + 0x50, 0x61, 0x2b, 0x46, 0x50, 0x5a, 0x51, 0x66, 0x4a, 0x47, 0x67, 0x77, 0x72, 0x51, 0x30, 0x52, 0x34, 0x33, + 0x35, 0x74, 0x2f, 0x45, 0x30, 0x39, 0x2b, 0x35, 0x44, 0x34, 0x35, 0x5a, 0x57, 0x78, 0x61, 0x61, 0x50, 0x51, + 0x44, 0x5c, 0x0a, + 0x09, 0x75, 0x41, 0x64, 0x45, 0x66, 0x77, 0x62, 0x6e, 0x33, 0x67, 0x62, 0x67, 0x62, 0x6d, 0x42, 0x39, 0x51, + 0x47, 0x42, 0x4e, 0x4d, 0x77, 0x44, 0x32, 0x76, 0x72, 0x4f, 0x4c, 0x51, 0x66, 0x51, 0x4f, 0x41, 0x47, 0x65, + 0x65, 0x75, 0x32, 0x38, 0x33, 0x2f, 0x75, 0x6a, 0x58, 0x58, 0x69, 0x4b, 0x46, 0x59, 0x74, 0x77, 0x4b, 0x66, + 0x4d, 0x71, 0x4e, 0x33, 0x38, 0x48, 0x74, 0x74, 0x39, 0x31, 0x57, 0x74, 0x31, 0x57, 0x57, 0x36, 0x49, 0x2b, + 0x4e, 0x5c, 0x0a, + 0x09, 0x41, 0x53, 0x42, 0x51, 0x45, 0x59, 0x54, 0x61, 0x38, 0x55, 0x61, 0x53, 0x64, 0x77, 0x41, 0x4d, 0x67, + 0x55, 0x34, 0x48, 0x42, 0x52, 0x58, 0x41, 0x73, 0x46, 0x4c, 0x51, 0x73, 0x41, 0x41, 0x79, 0x6f, 0x4a, 0x4e, + 0x33, 0x4d, 0x43, 0x79, 0x47, 0x79, 0x48, 0x4f, 0x71, 0x68, 0x6a, 0x79, 0x73, 0x70, 0x77, 0x4f, 0x77, 0x46, + 0x67, 0x5a, 0x4c, 0x66, 0x33, 0x63, 0x67, 0x70, 0x70, 0x2b, 0x4f, 0x5a, 0x51, 0x4a, 0x68, 0x73, 0x78, 0x44, + 0x56, 0x5c, 0x0a, + 0x09, 0x55, 0x53, 0x63, 0x59, 0x5a, 0x6b, 0x77, 0x2f, 0x41, 0x5a, 0x46, 0x62, 0x56, 0x6c, 0x59, 0x54, 0x6f, + 0x70, 0x63, 0x76, 0x57, 0x68, 0x75, 0x51, 0x54, 0x74, 0x31, 0x44, 0x39, 0x61, 0x5a, 0x64, 0x68, 0x45, 0x30, + 0x72, 0x31, 0x69, 0x65, 0x63, 0x73, 0x42, 0x76, 0x6e, 0x6e, 0x38, 0x36, 0x65, 0x73, 0x62, 0x4c, 0x41, 0x6e, + 0x61, 0x72, 0x2f, 0x43, 0x45, 0x4c, 0x75, 0x55, 0x78, 0x4e, 0x39, 0x54, 0x45, 0x33, 0x30, 0x55, 0x44, 0x74, + 0x4b, 0x5c, 0x0a, + 0x09, 0x35, 0x51, 0x6c, 0x56, 0x6d, 0x56, 0x76, 0x75, 0x4f, 0x34, 0x78, 0x50, 0x58, 0x48, 0x5a, 0x35, 0x35, + 0x48, 0x6c, 0x35, 0x73, 0x49, 0x78, 0x4f, 0x78, 0x39, 0x39, 0x36, 0x58, 0x63, 0x59, 0x41, 0x48, 0x56, 0x65, + 0x62, 0x6b, 0x6c, 0x39, 0x32, 0x4b, 0x5a, 0x44, 0x44, 0x6f, 0x63, 0x7a, 0x39, 0x77, 0x75, 0x42, 0x77, 0x4f, + 0x50, 0x53, 0x4c, 0x75, 0x4d, 0x36, 0x42, 0x48, 0x50, 0x6b, 0x73, 0x4c, 0x66, 0x65, 0x72, 0x39, 0x79, 0x69, + 0x42, 0x5c, 0x0a, + 0x09, 0x67, 0x67, 0x6f, 0x51, 0x73, 0x55, 0x7a, 0x41, 0x5a, 0x55, 0x41, 0x5a, 0x31, 0x67, 0x54, 0x38, 0x59, + 0x6d, 0x32, 0x5a, 0x35, 0x30, 0x77, 0x66, 0x4f, 0x68, 0x4e, 0x67, 0x4a, 0x68, 0x57, 0x6d, 0x41, 0x32, 0x4b, + 0x4e, 0x68, 0x75, 0x76, 0x45, 0x70, 0x7a, 0x47, 0x55, 0x65, 0x62, 0x73, 0x53, 0x74, 0x77, 0x52, 0x44, 0x39, + 0x6f, 0x4d, 0x55, 0x6d, 0x50, 0x6e, 0x55, 0x7a, 0x46, 0x70, 0x41, 0x35, 0x47, 0x56, 0x4f, 0x4f, 0x2f, 0x36, + 0x34, 0x5c, 0x0a, + 0x09, 0x32, 0x71, 0x62, 0x6a, 0x32, 0x6f, 0x35, 0x4c, 0x51, 0x53, 0x43, 0x63, 0x49, 0x39, 0x6f, 0x44, 0x34, + 0x46, 0x64, 0x42, 0x65, 0x44, 0x45, 0x63, 0x6e, 0x67, 0x7a, 0x67, 0x75, 0x6c, 0x52, 0x35, 0x71, 0x30, 0x39, + 0x72, 0x74, 0x67, 0x2b, 0x67, 0x76, 0x4f, 0x36, 0x54, 0x71, 0x4b, 0x7a, 0x34, 0x46, 0x30, 0x48, 0x30, 0x4c, + 0x77, 0x44, 0x4f, 0x39, 0x46, 0x63, 0x43, 0x68, 0x44, 0x5a, 0x55, 0x72, 0x41, 0x52, 0x79, 0x36, 0x73, 0x6b, + 0x6e, 0x5c, 0x0a, + 0x09, 0x56, 0x61, 0x58, 0x39, 0x47, 0x73, 0x44, 0x69, 0x34, 0x69, 0x4c, 0x79, 0x50, 0x45, 0x65, 0x33, 0x30, + 0x30, 0x48, 0x57, 0x79, 0x64, 0x48, 0x70, 0x64, 0x50, 0x31, 0x47, 0x6b, 0x37, 0x7a, 0x6a, 0x74, 0x77, 0x50, + 0x6e, 0x48, 0x57, 0x52, 0x55, 0x33, 0x58, 0x2f, 0x75, 0x31, 0x50, 0x73, 0x41, 0x77, 0x6a, 0x33, 0x70, 0x54, + 0x71, 0x63, 0x4c, 0x45, 0x4d, 0x58, 0x4e, 0x51, 0x6d, 0x48, 0x2f, 0x51, 0x45, 0x35, 0x36, 0x73, 0x31, 0x43, + 0x31, 0x5c, 0x0a, + 0x09, 0x75, 0x53, 0x51, 0x61, 0x55, 0x39, 0x67, 0x50, 0x51, 0x47, 0x79, 0x66, 0x51, 0x48, 0x55, 0x74, 0x4c, + 0x41, 0x37, 0x6c, 0x75, 0x56, 0x42, 0x32, 0x32, 0x43, 0x55, 0x51, 0x7a, 0x49, 0x67, 0x62, 0x58, 0x74, 0x79, + 0x32, 0x7a, 0x49, 0x79, 0x4d, 0x52, 0x78, 0x43, 0x52, 0x68, 0x6a, 0x73, 0x6e, 0x72, 0x6f, 0x66, 0x79, 0x4f, + 0x76, 0x30, 0x4d, 0x49, 0x4c, 0x4a, 0x6a, 0x32, 0x33, 0x51, 0x38, 0x59, 0x7a, 0x71, 0x2f, 0x71, 0x68, 0x64, + 0x42, 0x5c, 0x0a, + 0x09, 0x49, 0x46, 0x34, 0x4c, 0x58, 0x73, 0x51, 0x69, 0x5a, 0x6a, 0x57, 0x75, 0x48, 0x5a, 0x4e, 0x6a, 0x6b, + 0x52, 0x63, 0x43, 0x59, 0x62, 0x43, 0x30, 0x35, 0x4b, 0x63, 0x2b, 0x65, 0x59, 0x35, 0x4f, 0x70, 0x31, 0x64, + 0x39, 0x64, 0x76, 0x7a, 0x57, 0x33, 0x38, 0x78, 0x76, 0x2f, 0x38, 0x30, 0x6f, 0x38, 0x7a, 0x72, 0x49, 0x73, + 0x2b, 0x70, 0x38, 0x56, 0x6d, 0x33, 0x64, 0x39, 0x76, 0x73, 0x7a, 0x38, 0x6a, 0x78, 0x48, 0x33, 0x76, 0x48, + 0x6e, 0x5c, 0x0a, + 0x09, 0x63, 0x37, 0x5a, 0x5a, 0x4b, 0x4d, 0x38, 0x36, 0x6c, 0x55, 0x35, 0x79, 0x68, 0x41, 0x31, 0x43, 0x47, + 0x63, 0x68, 0x76, 0x49, 0x38, 0x68, 0x71, 0x77, 0x37, 0x48, 0x32, 0x43, 0x55, 0x52, 0x4a, 0x4d, 0x35, 0x33, + 0x55, 0x6d, 0x37, 0x63, 0x49, 0x33, 0x50, 0x41, 0x63, 0x6b, 0x4f, 0x67, 0x6a, 0x5a, 0x41, 0x4d, 0x61, 0x6a, + 0x44, 0x55, 0x51, 0x38, 0x30, 0x2f, 0x41, 0x36, 0x79, 0x72, 0x63, 0x31, 0x64, 0x6d, 0x39, 0x65, 0x77, 0x2f, + 0x32, 0x5c, 0x0a, + 0x09, 0x37, 0x70, 0x79, 0x71, 0x5a, 0x53, 0x73, 0x79, 0x41, 0x4f, 0x4d, 0x63, 0x31, 0x34, 0x48, 0x44, 0x4c, + 0x68, 0x44, 0x39, 0x41, 0x62, 0x41, 0x2b, 0x4c, 0x77, 0x78, 0x64, 0x45, 0x77, 0x41, 0x6f, 0x72, 0x2f, 0x31, + 0x6b, 0x47, 0x4f, 0x64, 0x7a, 0x41, 0x4c, 0x77, 0x64, 0x67, 0x46, 0x2b, 0x36, 0x64, 0x62, 0x55, 0x6a, 0x2b, + 0x41, 0x2f, 0x31, 0x79, 0x53, 0x34, 0x64, 0x4f, 0x4f, 0x30, 0x55, 0x41, 0x50, 0x56, 0x43, 0x31, 0x70, 0x48, + 0x5a, 0x5c, 0x0a, + 0x09, 0x49, 0x33, 0x36, 0x6a, 0x53, 0x54, 0x64, 0x48, 0x4a, 0x38, 0x2b, 0x52, 0x42, 0x65, 0x66, 0x76, 0x64, + 0x69, 0x6f, 0x51, 0x79, 0x4a, 0x46, 0x33, 0x4f, 0x76, 0x35, 0x61, 0x74, 0x55, 0x73, 0x77, 0x62, 0x45, 0x7a, + 0x78, 0x42, 0x75, 0x64, 0x33, 0x6f, 0x51, 0x48, 0x77, 0x52, 0x70, 0x64, 0x33, 0x34, 0x6c, 0x32, 0x43, 0x75, + 0x42, 0x4f, 0x4e, 0x36, 0x73, 0x31, 0x43, 0x65, 0x64, 0x79, 0x51, 0x51, 0x73, 0x6b, 0x4f, 0x4e, 0x54, 0x45, + 0x33, 0x5c, 0x0a, + 0x09, 0x44, 0x38, 0x61, 0x6e, 0x6c, 0x72, 0x6c, 0x7a, 0x37, 0x73, 0x77, 0x36, 0x6b, 0x6d, 0x54, 0x31, 0x74, + 0x62, 0x67, 0x7a, 0x45, 0x48, 0x55, 0x61, 0x47, 0x39, 0x32, 0x4d, 0x7a, 0x55, 0x31, 0x35, 0x2b, 0x57, 0x43, + 0x51, 0x76, 0x44, 0x77, 0x41, 0x37, 0x44, 0x73, 0x35, 0x52, 0x48, 0x2b, 0x2b, 0x59, 0x4b, 0x63, 0x7a, 0x45, + 0x5a, 0x4c, 0x66, 0x31, 0x56, 0x30, 0x4e, 0x55, 0x54, 0x2b, 0x43, 0x41, 0x62, 0x42, 0x31, 0x76, 0x49, 0x76, + 0x39, 0x5c, 0x0a, + 0x09, 0x42, 0x77, 0x35, 0x45, 0x6e, 0x54, 0x6a, 0x6e, 0x73, 0x4c, 0x43, 0x34, 0x69, 0x45, 0x34, 0x6c, 0x38, + 0x32, 0x36, 0x33, 0x68, 0x37, 0x78, 0x54, 0x67, 0x34, 0x42, 0x33, 0x37, 0x67, 0x35, 0x79, 0x71, 0x6e, 0x59, + 0x44, 0x52, 0x6e, 0x44, 0x49, 0x32, 0x41, 0x61, 0x75, 0x43, 0x71, 0x41, 0x5a, 0x43, 0x46, 0x41, 0x45, 0x67, + 0x64, 0x72, 0x35, 0x69, 0x51, 0x69, 0x55, 0x5a, 0x38, 0x67, 0x6f, 0x72, 0x39, 0x5a, 0x6f, 0x36, 0x73, 0x31, + 0x57, 0x5c, 0x0a, + 0x09, 0x4e, 0x51, 0x6a, 0x34, 0x7a, 0x34, 0x7a, 0x72, 0x68, 0x75, 0x6b, 0x6b, 0x49, 0x36, 0x36, 0x66, 0x61, + 0x6a, 0x32, 0x6e, 0x4f, 0x67, 0x34, 0x50, 0x47, 0x46, 0x6e, 0x62, 0x74, 0x6d, 0x50, 0x47, 0x35, 0x61, 0x54, + 0x73, 0x59, 0x37, 0x70, 0x66, 0x42, 0x61, 0x68, 0x51, 0x68, 0x6f, 0x68, 0x77, 0x33, 0x6a, 0x6d, 0x50, 0x4e, + 0x4b, 0x4b, 0x39, 0x5a, 0x66, 0x73, 0x61, 0x42, 0x43, 0x6a, 0x55, 0x75, 0x52, 0x68, 0x45, 0x50, 0x77, 0x69, + 0x73, 0x5c, 0x0a, + 0x09, 0x50, 0x51, 0x69, 0x73, 0x35, 0x55, 0x37, 0x41, 0x63, 0x54, 0x69, 0x38, 0x79, 0x78, 0x39, 0x57, 0x45, + 0x5a, 0x38, 0x50, 0x57, 0x71, 0x53, 0x61, 0x53, 0x4d, 0x36, 0x66, 0x66, 0x75, 0x49, 0x4a, 0x56, 0x54, 0x58, + 0x2f, 0x37, 0x35, 0x34, 0x37, 0x37, 0x76, 0x54, 0x4f, 0x54, 0x6a, 0x34, 0x4c, 0x36, 0x48, 0x61, 0x37, 0x79, + 0x44, 0x76, 0x42, 0x79, 0x54, 0x50, 0x6b, 0x65, 0x62, 0x66, 0x4b, 0x42, 0x44, 0x78, 0x41, 0x64, 0x44, 0x6f, + 0x64, 0x5c, 0x0a, + 0x09, 0x55, 0x4d, 0x63, 0x62, 0x56, 0x56, 0x35, 0x46, 0x48, 0x63, 0x6f, 0x38, 0x61, 0x41, 0x42, 0x2b, 0x52, + 0x64, 0x6c, 0x48, 0x71, 0x73, 0x6f, 0x49, 0x77, 0x34, 0x37, 0x42, 0x4c, 0x49, 0x43, 0x41, 0x6a, 0x7a, 0x70, + 0x41, 0x5a, 0x56, 0x79, 0x5a, 0x4e, 0x4c, 0x71, 0x6a, 0x41, 0x59, 0x45, 0x73, 0x70, 0x76, 0x44, 0x47, 0x6b, + 0x6c, 0x47, 0x6d, 0x56, 0x70, 0x79, 0x72, 0x6f, 0x54, 0x76, 0x32, 0x54, 0x34, 0x67, 0x6c, 0x74, 0x46, 0x4c, + 0x35, 0x5c, 0x0a, + 0x09, 0x63, 0x45, 0x68, 0x62, 0x4f, 0x55, 0x44, 0x73, 0x50, 0x2b, 0x6c, 0x34, 0x33, 0x67, 0x57, 0x59, 0x51, + 0x53, 0x6c, 0x79, 0x30, 0x75, 0x6d, 0x4a, 0x41, 0x55, 0x4d, 0x77, 0x52, 0x6d, 0x33, 0x41, 0x52, 0x48, 0x6a, + 0x34, 0x77, 0x30, 0x36, 0x76, 0x4d, 0x78, 0x55, 0x69, 0x48, 0x48, 0x7a, 0x77, 0x51, 0x58, 0x51, 0x37, 0x6e, + 0x65, 0x6a, 0x30, 0x58, 0x5a, 0x55, 0x4a, 0x35, 0x48, 0x6d, 0x4f, 0x76, 0x4e, 0x76, 0x78, 0x4f, 0x73, 0x68, + 0x71, 0x5c, 0x0a, + 0x09, 0x52, 0x38, 0x2b, 0x79, 0x76, 0x4d, 0x34, 0x45, 0x34, 0x72, 0x62, 0x75, 0x72, 0x4e, 0x37, 0x4b, 0x6e, + 0x58, 0x4d, 0x51, 0x51, 0x41, 0x55, 0x55, 0x55, 0x4e, 0x75, 0x47, 0x4b, 0x62, 0x4b, 0x6e, 0x51, 0x55, 0x43, + 0x77, 0x4c, 0x55, 0x43, 0x67, 0x42, 0x6d, 0x54, 0x48, 0x50, 0x6c, 0x30, 0x41, 0x41, 0x53, 0x55, 0x72, 0x6e, + 0x64, 0x72, 0x7a, 0x7a, 0x36, 0x41, 0x37, 0x73, 0x5a, 0x5a, 0x54, 0x58, 0x58, 0x76, 0x73, 0x32, 0x51, 0x2b, + 0x76, 0x5c, 0x0a, + 0x09, 0x5a, 0x53, 0x73, 0x59, 0x43, 0x6e, 0x4b, 0x76, 0x50, 0x76, 0x6e, 0x55, 0x68, 0x4d, 0x76, 0x64, 0x30, + 0x35, 0x38, 0x43, 0x57, 0x50, 0x4f, 0x33, 0x42, 0x71, 0x38, 0x64, 0x41, 0x42, 0x43, 0x39, 0x43, 0x45, 0x53, + 0x56, 0x52, 0x66, 0x4c, 0x49, 0x77, 0x79, 0x30, 0x65, 0x36, 0x6e, 0x78, 0x4e, 0x46, 0x35, 0x31, 0x39, 0x75, + 0x6a, 0x68, 0x31, 0x37, 0x7a, 0x31, 0x33, 0x59, 0x62, 0x67, 0x38, 0x52, 0x4c, 0x66, 0x58, 0x52, 0x5a, 0x62, + 0x6c, 0x5c, 0x0a, + 0x09, 0x79, 0x4c, 0x50, 0x4d, 0x67, 0x30, 0x43, 0x33, 0x34, 0x36, 0x63, 0x44, 0x48, 0x5a, 0x39, 0x36, 0x78, + 0x71, 0x66, 0x50, 0x73, 0x67, 0x79, 0x64, 0x33, 0x45, 0x38, 0x58, 0x59, 0x72, 0x70, 0x5a, 0x58, 0x51, 0x2f, + 0x62, 0x68, 0x6e, 0x6b, 0x6d, 0x51, 0x45, 0x54, 0x79, 0x32, 0x59, 0x47, 0x73, 0x33, 0x6e, 0x49, 0x4d, 0x49, + 0x4b, 0x61, 0x66, 0x52, 0x35, 0x30, 0x4a, 0x56, 0x4e, 0x2f, 0x7a, 0x4d, 0x4e, 0x38, 0x55, 0x71, 0x61, 0x64, + 0x48, 0x5c, 0x0a, + 0x09, 0x2b, 0x79, 0x79, 0x58, 0x4b, 0x53, 0x78, 0x69, 0x53, 0x57, 0x5a, 0x6b, 0x6f, 0x6b, 0x35, 0x64, 0x52, + 0x70, 0x44, 0x7a, 0x2f, 0x58, 0x37, 0x50, 0x67, 0x5a, 0x50, 0x72, 0x45, 0x34, 0x6d, 0x63, 0x5a, 0x58, 0x6e, + 0x47, 0x65, 0x47, 0x71, 0x6f, 0x70, 0x44, 0x49, 0x44, 0x7a, 0x77, 0x77, 0x65, 0x66, 0x65, 0x5a, 0x2b, 0x77, + 0x63, 0x75, 0x64, 0x64, 0x39, 0x36, 0x4f, 0x72, 0x41, 0x4c, 0x6a, 0x43, 0x41, 0x49, 0x68, 0x45, 0x2b, 0x68, + 0x32, 0x5c, 0x0a, + 0x09, 0x34, 0x70, 0x4f, 0x61, 0x49, 0x52, 0x76, 0x4c, 0x71, 0x71, 0x32, 0x2b, 0x6e, 0x64, 0x78, 0x48, 0x38, + 0x67, 0x41, 0x53, 0x47, 0x57, 0x55, 0x4d, 0x6f, 0x48, 0x4d, 0x66, 0x36, 0x53, 0x73, 0x51, 0x36, 0x47, 0x53, + 0x64, 0x57, 0x68, 0x38, 0x4b, 0x42, 0x4a, 0x44, 0x56, 0x64, 0x79, 0x45, 0x79, 0x49, 0x58, 0x65, 0x53, 0x4d, + 0x6d, 0x56, 0x62, 0x75, 0x59, 0x50, 0x42, 0x38, 0x7a, 0x51, 0x2b, 0x57, 0x6d, 0x43, 0x59, 0x58, 0x6a, 0x69, + 0x59, 0x5c, 0x0a, + 0x09, 0x4f, 0x75, 0x44, 0x54, 0x4d, 0x73, 0x75, 0x63, 0x51, 0x7a, 0x62, 0x33, 0x31, 0x50, 0x50, 0x50, 0x72, + 0x47, 0x57, 0x70, 0x4d, 0x39, 0x38, 0x41, 0x74, 0x6b, 0x48, 0x47, 0x73, 0x52, 0x45, 0x6d, 0x66, 0x77, 0x38, + 0x51, 0x4f, 0x77, 0x47, 0x38, 0x45, 0x47, 0x74, 0x4d, 0x71, 0x77, 0x34, 0x41, 0x62, 0x4e, 0x58, 0x2f, 0x2b, + 0x66, 0x47, 0x6b, 0x4d, 0x69, 0x53, 0x5a, 0x59, 0x33, 0x46, 0x72, 0x72, 0x46, 0x50, 0x4f, 0x66, 0x62, 0x75, + 0x6d, 0x5c, 0x0a, + 0x09, 0x63, 0x63, 0x34, 0x35, 0x35, 0x38, 0x52, 0x30, 0x6b, 0x30, 0x43, 0x34, 0x39, 0x5a, 0x61, 0x62, 0x30, + 0x59, 0x6e, 0x47, 0x31, 0x66, 0x56, 0x70, 0x66, 0x54, 0x55, 0x64, 0x36, 0x46, 0x54, 0x54, 0x67, 0x45, 0x36, + 0x6e, 0x4d, 0x73, 0x5a, 0x4f, 0x78, 0x30, 0x65, 0x64, 0x4c, 0x41, 0x4e, 0x31, 0x73, 0x67, 0x6f, 0x63, 0x73, + 0x72, 0x68, 0x4f, 0x49, 0x44, 0x4b, 0x42, 0x76, 0x49, 0x4d, 0x38, 0x7a, 0x30, 0x54, 0x71, 0x58, 0x32, 0x63, + 0x43, 0x5c, 0x0a, + 0x09, 0x46, 0x43, 0x4e, 0x48, 0x76, 0x56, 0x63, 0x64, 0x73, 0x57, 0x37, 0x59, 0x74, 0x77, 0x37, 0x55, 0x69, + 0x33, 0x4f, 0x55, 0x79, 0x39, 0x74, 0x6a, 0x50, 0x42, 0x50, 0x67, 0x35, 0x4f, 0x65, 0x67, 0x57, 0x52, 0x31, + 0x70, 0x39, 0x42, 0x53, 0x64, 0x71, 0x49, 0x37, 0x32, 0x4d, 0x42, 0x79, 0x66, 0x6c, 0x66, 0x75, 0x65, 0x78, + 0x7a, 0x34, 0x47, 0x75, 0x36, 0x62, 0x44, 0x6a, 0x38, 0x30, 0x77, 0x77, 0x30, 0x72, 0x53, 0x65, 0x30, 0x6a, + 0x6a, 0x5c, 0x0a, + 0x09, 0x69, 0x35, 0x48, 0x65, 0x4b, 0x57, 0x4f, 0x74, 0x79, 0x72, 0x6d, 0x4b, 0x55, 0x77, 0x49, 0x75, 0x4f, + 0x75, 0x65, 0x4d, 0x79, 0x49, 0x65, 0x44, 0x77, 0x33, 0x31, 0x33, 0x33, 0x59, 0x58, 0x35, 0x75, 0x56, 0x6d, + 0x66, 0x64, 0x59, 0x57, 0x73, 0x4c, 0x4b, 0x34, 0x4a, 0x73, 0x43, 0x79, 0x67, 0x6d, 0x75, 0x76, 0x6e, 0x57, + 0x59, 0x5a, 0x4f, 0x4a, 0x36, 0x2f, 0x65, 0x32, 0x79, 0x43, 0x6e, 0x41, 0x33, 0x6b, 0x65, 0x73, 0x72, 0x52, + 0x71, 0x5c, 0x0a, + 0x09, 0x48, 0x59, 0x65, 0x38, 0x37, 0x42, 0x47, 0x6d, 0x62, 0x6b, 0x51, 0x67, 0x34, 0x69, 0x43, 0x51, 0x65, + 0x31, 0x33, 0x6d, 0x51, 0x52, 0x2f, 0x56, 0x73, 0x78, 0x78, 0x42, 0x62, 0x75, 0x77, 0x54, 0x71, 0x45, 0x43, + 0x67, 0x47, 0x72, 0x64, 0x66, 0x6f, 0x39, 0x48, 0x36, 0x38, 0x4d, 0x64, 0x5a, 0x6c, 0x72, 0x4d, 0x5a, 0x6c, + 0x4a, 0x79, 0x47, 0x38, 0x54, 0x61, 0x54, 0x39, 0x5a, 0x70, 0x4b, 0x52, 0x6b, 0x39, 0x36, 0x34, 0x68, 0x4f, + 0x77, 0x5c, 0x0a, + 0x09, 0x64, 0x39, 0x63, 0x30, 0x77, 0x44, 0x4b, 0x44, 0x36, 0x50, 0x52, 0x69, 0x76, 0x53, 0x55, 0x63, 0x75, + 0x6d, 0x59, 0x64, 0x41, 0x55, 0x2f, 0x56, 0x75, 0x6c, 0x35, 0x74, 0x57, 0x71, 0x73, 0x4d, 0x49, 0x41, 0x50, + 0x63, 0x52, 0x66, 0x37, 0x51, 0x70, 0x63, 0x62, 0x47, 0x42, 0x79, 0x31, 0x51, 0x44, 0x2b, 0x42, 0x6f, 0x2b, + 0x4c, 0x53, 0x4c, 0x48, 0x6c, 0x63, 0x64, 0x65, 0x69, 0x56, 0x38, 0x38, 0x39, 0x70, 0x72, 0x41, 0x50, 0x67, + 0x64, 0x5c, 0x0a, + 0x09, 0x5a, 0x67, 0x45, 0x45, 0x38, 0x72, 0x43, 0x77, 0x56, 0x4b, 0x30, 0x4a, 0x2b, 0x4b, 0x67, 0x65, 0x4d, + 0x6f, 0x46, 0x4f, 0x7a, 0x41, 0x51, 0x6f, 0x4c, 0x50, 0x37, 0x46, 0x70, 0x77, 0x4c, 0x39, 0x77, 0x71, 0x41, + 0x33, 0x51, 0x4c, 0x2f, 0x67, 0x6c, 0x46, 0x56, 0x47, 0x49, 0x68, 0x59, 0x47, 0x77, 0x33, 0x53, 0x41, 0x38, + 0x6f, 0x6f, 0x58, 0x44, 0x67, 0x4a, 0x38, 0x59, 0x56, 0x43, 0x6c, 0x69, 0x6a, 0x6f, 0x54, 0x34, 0x47, 0x58, + 0x55, 0x5c, 0x0a, + 0x09, 0x50, 0x44, 0x7a, 0x4c, 0x63, 0x6e, 0x45, 0x72, 0x74, 0x42, 0x59, 0x48, 0x57, 0x35, 0x6a, 0x69, 0x6e, + 0x39, 0x46, 0x67, 0x61, 0x6d, 0x64, 0x38, 0x36, 0x75, 0x4d, 0x65, 0x58, 0x63, 0x75, 0x59, 0x55, 0x35, 0x41, + 0x33, 0x31, 0x30, 0x48, 0x73, 0x67, 0x2b, 0x6c, 0x44, 0x52, 0x79, 0x55, 0x64, 0x75, 0x52, 0x78, 0x77, 0x34, + 0x50, 0x68, 0x74, 0x65, 0x4e, 0x53, 0x6a, 0x48, 0x69, 0x58, 0x34, 0x75, 0x66, 0x47, 0x47, 0x47, 0x39, 0x44, + 0x72, 0x5c, 0x0a, + 0x09, 0x64, 0x66, 0x33, 0x36, 0x53, 0x38, 0x67, 0x47, 0x38, 0x68, 0x7a, 0x64, 0x54, 0x72, 0x66, 0x4b, 0x43, + 0x4c, 0x70, 0x78, 0x59, 0x62, 0x44, 0x54, 0x37, 0x53, 0x41, 0x6a, 0x42, 0x67, 0x4c, 0x56, 0x4e, 0x43, 0x43, + 0x5a, 0x44, 0x72, 0x43, 0x70, 0x67, 0x6e, 0x79, 0x41, 0x4b, 0x43, 0x77, 0x4d, 0x56, 0x69, 0x41, 0x51, 0x73, + 0x71, 0x73, 0x34, 0x50, 0x66, 0x4e, 0x33, 0x61, 0x34, 0x51, 0x65, 0x4e, 0x41, 0x68, 0x55, 0x59, 0x36, 0x37, + 0x31, 0x5c, 0x0a, + 0x09, 0x55, 0x53, 0x2b, 0x76, 0x68, 0x6a, 0x45, 0x46, 0x55, 0x42, 0x62, 0x72, 0x4c, 0x30, 0x7a, 0x57, 0x51, + 0x72, 0x77, 0x4d, 0x75, 0x41, 0x6d, 0x45, 0x35, 0x31, 0x78, 0x38, 0x45, 0x63, 0x53, 0x63, 0x54, 0x71, 0x6f, + 0x36, 0x36, 0x69, 0x33, 0x52, 0x6b, 0x2f, 0x43, 0x48, 0x57, 0x47, 0x6d, 0x76, 0x76, 0x5a, 0x69, 0x37, 0x65, + 0x72, 0x51, 0x32, 0x41, 0x45, 0x44, 0x59, 0x43, 0x77, 0x64, 0x2f, 0x41, 0x39, 0x72, 0x46, 0x2f, 0x39, 0x68, + 0x31, 0x5c, 0x0a, + 0x09, 0x6c, 0x51, 0x47, 0x49, 0x72, 0x4b, 0x42, 0x47, 0x77, 0x32, 0x64, 0x66, 0x64, 0x42, 0x37, 0x36, 0x2f, + 0x62, 0x46, 0x34, 0x65, 0x6d, 0x46, 0x2b, 0x48, 0x74, 0x64, 0x64, 0x65, 0x31, 0x30, 0x56, 0x35, 0x58, 0x4e, + 0x30, 0x75, 0x78, 0x31, 0x30, 0x75, 0x7a, 0x31, 0x30, 0x77, 0x6e, 0x53, 0x67, 0x57, 0x68, 0x50, 0x6f, 0x64, + 0x50, 0x49, 0x59, 0x67, 0x54, 0x70, 0x64, 0x6e, 0x79, 0x6e, 0x6b, 0x65, 0x59, 0x34, 0x73, 0x58, 0x4b, 0x39, + 0x41, 0x5c, 0x0a, + 0x09, 0x49, 0x45, 0x51, 0x65, 0x4d, 0x52, 0x33, 0x49, 0x4d, 0x6b, 0x44, 0x4e, 0x4e, 0x65, 0x75, 0x37, 0x41, + 0x79, 0x79, 0x79, 0x5a, 0x6d, 0x79, 0x56, 0x4f, 0x56, 0x4d, 0x70, 0x70, 0x77, 0x61, 0x42, 0x53, 0x6f, 0x6c, + 0x31, 0x35, 0x4f, 0x48, 0x7a, 0x53, 0x32, 0x39, 0x6b, 0x59, 0x54, 0x6f, 0x51, 0x72, 0x78, 0x45, 0x6c, 0x78, + 0x68, 0x55, 0x2b, 0x39, 0x53, 0x37, 0x4b, 0x79, 0x63, 0x6b, 0x4a, 0x2f, 0x4f, 0x43, 0x46, 0x35, 0x36, 0x52, + 0x36, 0x5c, 0x0a, + 0x09, 0x53, 0x46, 0x61, 0x61, 0x30, 0x33, 0x6d, 0x39, 0x69, 0x46, 0x53, 0x36, 0x44, 0x76, 0x45, 0x79, 0x6e, + 0x74, 0x64, 0x6e, 0x58, 0x66, 0x77, 0x6b, 0x77, 0x63, 0x38, 0x33, 0x72, 0x37, 0x6b, 0x61, 0x68, 0x32, 0x64, + 0x6d, 0x4a, 0x41, 0x68, 0x55, 0x43, 0x34, 0x4f, 0x64, 0x62, 0x69, 0x39, 0x6d, 0x42, 0x78, 0x59, 0x49, 0x45, + 0x46, 0x47, 0x38, 0x6c, 0x56, 0x68, 0x6e, 0x41, 0x33, 0x56, 0x6b, 0x62, 0x31, 0x77, 0x59, 0x44, 0x4a, 0x6c, + 0x41, 0x5c, 0x0a, + 0x09, 0x58, 0x6a, 0x2f, 0x65, 0x37, 0x66, 0x58, 0x68, 0x6e, 0x58, 0x6f, 0x6b, 0x43, 0x49, 0x54, 0x73, 0x72, + 0x4c, 0x70, 0x46, 0x4b, 0x50, 0x50, 0x52, 0x4f, 0x71, 0x72, 0x48, 0x4b, 0x51, 0x55, 0x58, 0x44, 0x64, 0x4e, + 0x64, 0x33, 0x48, 0x2f, 0x41, 0x4d, 0x72, 0x2b, 0x7a, 0x7a, 0x7a, 0x6b, 0x62, 0x33, 0x2f, 0x2f, 0x6f, 0x4d, + 0x36, 0x41, 0x61, 0x54, 0x57, 0x33, 0x63, 0x6d, 0x6d, 0x4c, 0x5a, 0x30, 0x36, 0x37, 0x6a, 0x45, 0x69, 0x5a, + 0x57, 0x5c, 0x0a, + 0x09, 0x6d, 0x56, 0x59, 0x66, 0x41, 0x48, 0x78, 0x6b, 0x6e, 0x42, 0x62, 0x7a, 0x53, 0x5a, 0x59, 0x71, 0x65, + 0x57, 0x4b, 0x47, 0x79, 0x41, 0x63, 0x65, 0x55, 0x30, 0x35, 0x2f, 0x2f, 0x71, 0x54, 0x6a, 0x70, 0x76, 0x42, + 0x6a, 0x7a, 0x33, 0x39, 0x32, 0x76, 0x64, 0x42, 0x43, 0x77, 0x4e, 0x56, 0x66, 0x2f, 0x54, 0x66, 0x4d, 0x7a, + 0x42, 0x78, 0x43, 0x6e, 0x6e, 0x65, 0x52, 0x64, 0x37, 0x73, 0x2b, 0x45, 0x2b, 0x6a, 0x32, 0x2f, 0x4a, 0x70, + 0x41, 0x5c, 0x0a, + 0x09, 0x74, 0x52, 0x62, 0x51, 0x79, 0x61, 0x76, 0x50, 0x63, 0x4b, 0x75, 0x77, 0x30, 0x30, 0x47, 0x6e, 0x4d, + 0x71, 0x69, 0x73, 0x57, 0x69, 0x76, 0x67, 0x68, 0x74, 0x66, 0x70, 0x2b, 0x46, 0x64, 0x37, 0x35, 0x39, 0x56, + 0x4c, 0x4c, 0x50, 0x49, 0x71, 0x46, 0x59, 0x32, 0x5a, 0x41, 0x49, 0x46, 0x6c, 0x41, 0x74, 0x55, 0x35, 0x49, + 0x42, 0x6f, 0x61, 0x77, 0x4e, 0x63, 0x45, 0x58, 0x42, 0x77, 0x57, 0x6f, 0x45, 0x41, 0x67, 0x52, 0x68, 0x36, + 0x65, 0x5c, 0x0a, + 0x09, 0x42, 0x64, 0x53, 0x66, 0x56, 0x45, 0x57, 0x65, 0x69, 0x49, 0x47, 0x6f, 0x6e, 0x5a, 0x4e, 0x76, 0x65, + 0x49, 0x6b, 0x70, 0x61, 0x58, 0x58, 0x74, 0x52, 0x35, 0x2f, 0x37, 0x4c, 0x4f, 0x7a, 0x5a, 0x74, 0x6f, 0x58, + 0x4a, 0x47, 0x2f, 0x4b, 0x59, 0x4c, 0x2f, 0x54, 0x70, 0x4e, 0x4c, 0x54, 0x4b, 0x5a, 0x4f, 0x7a, 0x4e, 0x4b, + 0x6c, 0x77, 0x76, 0x33, 0x6f, 0x43, 0x66, 0x2b, 0x2f, 0x68, 0x7a, 0x63, 0x4f, 0x72, 0x65, 0x76, 0x57, 0x49, + 0x75, 0x5c, 0x0a, + 0x09, 0x66, 0x4d, 0x58, 0x6e, 0x50, 0x77, 0x38, 0x43, 0x6f, 0x64, 0x76, 0x31, 0x47, 0x56, 0x61, 0x6e, 0x36, + 0x38, 0x47, 0x67, 0x6d, 0x33, 0x66, 0x51, 0x71, 0x62, 0x49, 0x79, 0x6e, 0x51, 0x6e, 0x6b, 0x56, 0x54, 0x59, + 0x47, 0x71, 0x6d, 0x2f, 0x4e, 0x69, 0x6b, 0x79, 0x67, 0x41, 0x75, 0x7a, 0x77, 0x58, 0x59, 0x42, 0x41, 0x70, + 0x71, 0x63, 0x44, 0x66, 0x6d, 0x6f, 0x58, 0x30, 0x33, 0x7a, 0x6f, 0x57, 0x34, 0x51, 0x79, 0x75, 0x2b, 0x49, + 0x4c, 0x5c, 0x0a, + 0x09, 0x67, 0x33, 0x6d, 0x79, 0x4e, 0x6c, 0x50, 0x72, 0x78, 0x47, 0x63, 0x4d, 0x4b, 0x53, 0x42, 0x62, 0x49, + 0x41, 0x77, 0x48, 0x2f, 0x4f, 0x49, 0x4c, 0x6e, 0x34, 0x4e, 0x65, 0x4a, 0x34, 0x65, 0x77, 0x2b, 0x57, 0x53, + 0x36, 0x61, 0x30, 0x79, 0x7a, 0x4c, 0x46, 0x44, 0x32, 0x4e, 0x6e, 0x38, 0x49, 0x61, 0x30, 0x79, 0x72, 0x44, + 0x77, 0x42, 0x2b, 0x62, 0x4b, 0x55, 0x2b, 0x45, 0x57, 0x46, 0x52, 0x72, 0x77, 0x45, 0x45, 0x45, 0x6f, 0x41, + 0x52, 0x5c, 0x0a, + 0x09, 0x71, 0x6a, 0x69, 0x38, 0x39, 0x4a, 0x49, 0x6e, 0x59, 0x50, 0x75, 0x4f, 0x48, 0x53, 0x4a, 0x74, 0x2f, + 0x75, 0x54, 0x48, 0x2f, 0x77, 0x55, 0x4c, 0x43, 0x2f, 0x50, 0x6f, 0x56, 0x4b, 0x6c, 0x2b, 0x48, 0x66, 0x45, + 0x39, 0x43, 0x47, 0x52, 0x35, 0x57, 0x50, 0x33, 0x50, 0x34, 0x39, 0x32, 0x42, 0x76, 0x4a, 0x6f, 0x75, 0x35, + 0x4e, 0x58, 0x37, 0x42, 0x4d, 0x4c, 0x43, 0x59, 0x46, 0x77, 0x54, 0x43, 0x4f, 0x38, 0x51, 0x79, 0x41, 0x67, + 0x55, 0x5c, 0x0a, + 0x09, 0x4d, 0x67, 0x45, 0x4b, 0x61, 0x77, 0x4a, 0x5a, 0x73, 0x6b, 0x2f, 0x41, 0x41, 0x30, 0x4f, 0x34, 0x4a, + 0x56, 0x57, 0x39, 0x58, 0x30, 0x44, 0x73, 0x45, 0x36, 0x69, 0x4e, 0x52, 0x4b, 0x77, 0x4a, 0x78, 0x4d, 0x67, + 0x6a, 0x4d, 0x34, 0x48, 0x67, 0x31, 0x41, 0x46, 0x49, 0x39, 0x44, 0x36, 0x42, 0x63, 0x4d, 0x77, 0x58, 0x6e, + 0x51, 0x42, 0x67, 0x35, 0x36, 0x35, 0x64, 0x65, 0x4f, 0x6b, 0x6c, 0x54, 0x30, 0x72, 0x58, 0x55, 0x73, 0x51, + 0x71, 0x5c, 0x0a, + 0x09, 0x50, 0x39, 0x4c, 0x35, 0x66, 0x54, 0x77, 0x30, 0x73, 0x67, 0x44, 0x47, 0x71, 0x39, 0x62, 0x4c, 0x78, + 0x46, 0x67, 0x58, 0x4c, 0x33, 0x2f, 0x68, 0x38, 0x78, 0x6d, 0x6d, 0x45, 0x2b, 0x36, 0x39, 0x35, 0x79, 0x35, + 0x38, 0x34, 0x58, 0x4f, 0x66, 0x42, 0x5a, 0x43, 0x68, 0x32, 0x2f, 0x56, 0x37, 0x4d, 0x75, 0x70, 0x70, 0x57, + 0x67, 0x65, 0x64, 0x76, 0x42, 0x74, 0x54, 0x2f, 0x51, 0x41, 0x43, 0x65, 0x53, 0x64, 0x48, 0x4a, 0x2b, 0x67, + 0x6a, 0x5c, 0x0a, + 0x09, 0x79, 0x32, 0x4d, 0x57, 0x46, 0x64, 0x63, 0x4d, 0x71, 0x6b, 0x77, 0x67, 0x72, 0x42, 0x30, 0x63, 0x44, + 0x51, 0x68, 0x34, 0x55, 0x4b, 0x36, 0x6e, 0x57, 0x68, 0x47, 0x67, 0x72, 0x62, 0x73, 0x44, 0x51, 0x53, 0x63, + 0x55, 0x33, 0x67, 0x39, 0x52, 0x54, 0x77, 0x4c, 0x71, 0x6b, 0x64, 0x55, 0x4c, 0x74, 0x51, 0x46, 0x34, 0x2b, + 0x5a, 0x6f, 0x41, 0x76, 0x31, 0x50, 0x7a, 0x37, 0x42, 0x2b, 0x2b, 0x42, 0x45, 0x38, 0x35, 0x4a, 0x2f, 0x7a, + 0x61, 0x5c, 0x0a, + 0x09, 0x6e, 0x51, 0x5a, 0x5a, 0x37, 0x75, 0x54, 0x73, 0x32, 0x4a, 0x4a, 0x35, 0x4f, 0x4f, 0x39, 0x42, 0x35, + 0x4b, 0x62, 0x47, 0x4d, 0x71, 0x74, 0x45, 0x2b, 0x65, 0x74, 0x66, 0x2f, 0x2f, 0x70, 0x56, 0x62, 0x64, 0x44, + 0x64, 0x64, 0x7a, 0x50, 0x67, 0x67, 0x65, 0x56, 0x56, 0x49, 0x75, 0x6f, 0x49, 0x51, 0x37, 0x4a, 0x41, 0x51, + 0x45, 0x38, 0x44, 0x2f, 0x50, 0x48, 0x6b, 0x57, 0x41, 0x2f, 0x62, 0x6a, 0x7a, 0x38, 0x52, 0x6c, 0x33, 0x33, + 0x6d, 0x5c, 0x0a, + 0x09, 0x69, 0x37, 0x48, 0x6b, 0x63, 0x4c, 0x43, 0x4d, 0x57, 0x32, 0x37, 0x36, 0x44, 0x6e, 0x62, 0x76, 0x33, + 0x6f, 0x4d, 0x74, 0x57, 0x36, 0x65, 0x71, 0x64, 0x6c, 0x46, 0x50, 0x4e, 0x79, 0x71, 0x42, 0x65, 0x34, 0x66, + 0x78, 0x62, 0x59, 0x56, 0x6e, 0x2b, 0x6f, 0x4e, 0x79, 0x48, 0x4f, 0x72, 0x55, 0x73, 0x48, 0x37, 0x71, 0x69, + 0x37, 0x33, 0x6f, 0x6f, 0x7a, 0x70, 0x32, 0x6a, 0x6b, 0x66, 0x72, 0x63, 0x4f, 0x79, 0x64, 0x31, 0x6a, 0x39, + 0x41, 0x5c, 0x0a, + 0x09, 0x78, 0x4d, 0x63, 0x6b, 0x30, 0x30, 0x33, 0x2b, 0x50, 0x62, 0x79, 0x43, 0x4c, 0x46, 0x42, 0x34, 0x6b, + 0x30, 0x33, 0x74, 0x33, 0x4b, 0x7a, 0x39, 0x77, 0x44, 0x59, 0x54, 0x52, 0x57, 0x77, 0x33, 0x66, 0x4b, 0x2f, + 0x2b, 0x76, 0x65, 0x6e, 0x56, 0x76, 0x34, 0x42, 0x48, 0x6e, 0x58, 0x36, 0x43, 0x6a, 0x50, 0x5a, 0x31, 0x35, + 0x79, 0x49, 0x61, 0x4c, 0x53, 0x30, 0x58, 0x75, 0x50, 0x7a, 0x71, 0x37, 0x2b, 0x44, 0x50, 0x2f, 0x75, 0x6d, + 0x7a, 0x5c, 0x0a, + 0x09, 0x2b, 0x50, 0x4f, 0x50, 0x66, 0x68, 0x6f, 0x66, 0x2b, 0x75, 0x51, 0x56, 0x2b, 0x4f, 0x71, 0x4e, 0x64, + 0x77, 0x4a, 0x35, 0x44, 0x36, 0x66, 0x75, 0x6e, 0x4a, 0x5a, 0x70, 0x72, 0x37, 0x67, 0x4e, 0x4b, 0x50, 0x56, + 0x31, 0x35, 0x73, 0x6d, 0x37, 0x38, 0x65, 0x33, 0x37, 0x5a, 0x6e, 0x48, 0x44, 0x6a, 0x64, 0x2b, 0x4a, 0x70, + 0x77, 0x38, 0x2b, 0x2b, 0x41, 0x42, 0x6d, 0x5a, 0x6d, 0x5a, 0x77, 0x2f, 0x50, 0x45, 0x6e, 0x6f, 0x74, 0x66, + 0x72, 0x5c, 0x0a, + 0x09, 0x65, 0x67, 0x6c, 0x56, 0x66, 0x4e, 0x63, 0x6a, 0x35, 0x45, 0x2f, 0x4a, 0x49, 0x55, 0x59, 0x37, 0x79, + 0x6f, 0x68, 0x6a, 0x47, 0x67, 0x50, 0x41, 0x71, 0x6b, 0x35, 0x47, 0x6c, 0x54, 0x77, 0x71, 0x4f, 0x56, 0x66, + 0x6a, 0x35, 0x32, 0x56, 0x41, 0x74, 0x5a, 0x61, 0x53, 0x36, 0x52, 0x68, 0x62, 0x58, 0x37, 0x47, 0x75, 0x68, + 0x65, 0x73, 0x31, 0x4b, 0x4e, 0x65, 0x36, 0x63, 0x47, 0x43, 0x4c, 0x75, 0x45, 0x7a, 0x32, 0x6e, 0x45, 0x34, + 0x2f, 0x5c, 0x0a, + 0x09, 0x63, 0x41, 0x42, 0x76, 0x76, 0x66, 0x52, 0x46, 0x6d, 0x4f, 0x68, 0x33, 0x70, 0x65, 0x79, 0x31, 0x6a, + 0x53, 0x76, 0x62, 0x53, 0x4c, 0x4b, 0x44, 0x64, 0x46, 0x72, 0x77, 0x64, 0x6a, 0x6a, 0x38, 0x47, 0x2b, 0x30, + 0x2b, 0x44, 0x57, 0x74, 0x46, 0x61, 0x77, 0x4d, 0x41, 0x52, 0x41, 0x73, 0x67, 0x65, 0x69, 0x57, 0x63, 0x36, + 0x39, 0x56, 0x47, 0x79, 0x49, 0x79, 0x49, 0x4b, 0x52, 0x38, 0x49, 0x78, 0x32, 0x42, 0x47, 0x44, 0x49, 0x47, + 0x61, 0x5c, 0x0a, + 0x09, 0x5a, 0x35, 0x32, 0x79, 0x42, 0x34, 0x66, 0x51, 0x78, 0x56, 0x56, 0x58, 0x58, 0x78, 0x63, 0x56, 0x50, + 0x31, 0x77, 0x65, 0x34, 0x73, 0x5a, 0x76, 0x58, 0x34, 0x2b, 0x5a, 0x77, 0x34, 0x63, 0x41, 0x2b, 0x44, 0x63, + 0x43, 0x39, 0x63, 0x62, 0x36, 0x63, 0x59, 0x48, 0x46, 0x4c, 0x2b, 0x52, 0x41, 0x4b, 0x4d, 0x32, 0x4a, 0x71, + 0x45, 0x68, 0x77, 0x42, 0x4a, 0x41, 0x6a, 0x31, 0x6e, 0x30, 0x77, 0x54, 0x76, 0x38, 0x51, 0x6b, 0x4c, 0x43, + 0x76, 0x5c, 0x0a, + 0x09, 0x47, 0x50, 0x49, 0x63, 0x77, 0x6a, 0x71, 0x79, 0x42, 0x34, 0x48, 0x4b, 0x75, 0x4b, 0x67, 0x32, 0x59, + 0x71, 0x6c, 0x6e, 0x5a, 0x6e, 0x78, 0x73, 0x45, 0x51, 0x71, 0x78, 0x36, 0x64, 0x43, 0x4a, 0x42, 0x42, 0x6b, + 0x69, 0x38, 0x6e, 0x76, 0x56, 0x6c, 0x63, 0x48, 0x78, 0x68, 0x31, 0x46, 0x65, 0x2f, 0x4d, 0x49, 0x66, 0x77, + 0x30, 0x75, 0x65, 0x66, 0x6f, 0x47, 0x55, 0x72, 0x54, 0x6c, 0x33, 0x42, 0x36, 0x36, 0x34, 0x2f, 0x6e, 0x62, + 0x38, 0x5c, 0x0a, + 0x09, 0x38, 0x75, 0x2b, 0x2f, 0x48, 0x33, 0x2f, 0x2b, 0x77, 0x51, 0x2f, 0x6a, 0x32, 0x75, 0x75, 0x2b, 0x69, + 0x64, 0x74, 0x75, 0x76, 0x77, 0x31, 0x33, 0x33, 0x6e, 0x45, 0x58, 0x72, 0x76, 0x33, 0x47, 0x4e, 0x2f, 0x45, + 0x50, 0x6c, 0x2f, 0x30, 0x72, 0x76, 0x6e, 0x6a, 0x39, 0x48, 0x54, 0x6a, 0x37, 0x6a, 0x50, 0x33, 0x59, 0x4f, + 0x61, 0x56, 0x2b, 0x74, 0x6c, 0x37, 0x72, 0x70, 0x6a, 0x72, 0x38, 0x33, 0x72, 0x50, 0x50, 0x77, 0x47, 0x65, + 0x76, 0x5c, 0x0a, + 0x09, 0x76, 0x67, 0x48, 0x33, 0x33, 0x2f, 0x39, 0x41, 0x50, 0x48, 0x2f, 0x34, 0x30, 0x43, 0x46, 0x38, 0x2b, + 0x31, 0x76, 0x66, 0x42, 0x43, 0x6a, 0x44, 0x32, 0x4e, 0x67, 0x59, 0x78, 0x73, 0x62, 0x36, 0x55, 0x54, 0x5a, + 0x78, 0x78, 0x50, 0x71, 0x42, 0x70, 0x69, 0x44, 0x6e, 0x49, 0x41, 0x58, 0x4c, 0x53, 0x51, 0x49, 0x41, 0x4f, + 0x74, 0x6e, 0x47, 0x4b, 0x42, 0x43, 0x51, 0x2f, 0x4d, 0x70, 0x33, 0x4b, 0x46, 0x6a, 0x72, 0x4e, 0x52, 0x34, + 0x45, 0x5c, 0x0a, + 0x09, 0x4d, 0x70, 0x51, 0x49, 0x75, 0x79, 0x2b, 0x6a, 0x4a, 0x71, 0x72, 0x72, 0x69, 0x4c, 0x6f, 0x49, 0x59, + 0x45, 0x42, 0x45, 0x32, 0x4c, 0x48, 0x6a, 0x4f, 0x4c, 0x7a, 0x6e, 0x64, 0x5a, 0x66, 0x69, 0x31, 0x4a, 0x31, + 0x54, 0x4b, 0x73, 0x67, 0x5a, 0x6c, 0x47, 0x77, 0x4f, 0x34, 0x73, 0x4e, 0x4d, 0x6e, 0x50, 0x38, 0x42, 0x4f, + 0x50, 0x63, 0x53, 0x41, 0x49, 0x4f, 0x31, 0x42, 0x49, 0x42, 0x56, 0x66, 0x78, 0x6a, 0x49, 0x37, 0x31, 0x78, + 0x79, 0x5c, 0x0a, + 0x09, 0x41, 0x50, 0x41, 0x52, 0x67, 0x48, 0x34, 0x6f, 0x69, 0x66, 0x5a, 0x4a, 0x5a, 0x45, 0x45, 0x4b, 0x43, + 0x49, 0x41, 0x55, 0x6c, 0x48, 0x4d, 0x59, 0x46, 0x41, 0x36, 0x76, 0x2f, 0x37, 0x4f, 0x2f, 0x78, 0x34, 0x63, + 0x2b, 0x2f, 0x42, 0x47, 0x42, 0x78, 0x76, 0x79, 0x7a, 0x31, 0x2b, 0x39, 0x68, 0x32, 0x2f, 0x62, 0x6a, 0x73, + 0x48, 0x56, 0x36, 0x47, 0x75, 0x50, 0x6a, 0x34, 0x2b, 0x6a, 0x31, 0x65, 0x76, 0x55, 0x74, 0x77, 0x36, 0x7a, + 0x61, 0x5c, 0x0a, + 0x09, 0x54, 0x31, 0x34, 0x4d, 0x4d, 0x52, 0x7a, 0x36, 0x68, 0x34, 0x57, 0x47, 0x52, 0x65, 0x46, 0x66, 0x4c, + 0x6a, 0x6f, 0x73, 0x55, 0x4a, 0x62, 0x56, 0x67, 0x79, 0x6e, 0x56, 0x51, 0x30, 0x54, 0x44, 0x34, 0x54, 0x4b, + 0x41, 0x2b, 0x6b, 0x57, 0x6a, 0x5a, 0x56, 0x6d, 0x4b, 0x46, 0x31, 0x6a, 0x57, 0x44, 0x78, 0x43, 0x56, 0x37, + 0x47, 0x65, 0x6f, 0x79, 0x75, 0x70, 0x52, 0x34, 0x6b, 0x6f, 0x57, 0x37, 0x46, 0x48, 0x69, 0x4d, 0x48, 0x51, + 0x41, 0x5c, 0x0a, + 0x09, 0x79, 0x57, 0x76, 0x49, 0x2b, 0x51, 0x4d, 0x72, 0x44, 0x67, 0x36, 0x75, 0x4b, 0x4f, 0x76, 0x73, 0x68, + 0x4b, 0x30, 0x4a, 0x65, 0x4c, 0x48, 0x34, 0x38, 0x79, 0x39, 0x34, 0x33, 0x72, 0x50, 0x77, 0x75, 0x70, 0x2f, + 0x36, 0x59, 0x58, 0x51, 0x37, 0x32, 0x51, 0x6a, 0x44, 0x38, 0x68, 0x55, 0x2f, 0x63, 0x50, 0x6c, 0x58, 0x38, + 0x61, 0x61, 0x33, 0x76, 0x68, 0x76, 0x44, 0x34, 0x52, 0x41, 0x6e, 0x37, 0x7a, 0x30, 0x56, 0x7a, 0x33, 0x76, + 0x36, 0x5c, 0x0a, + 0x09, 0x78, 0x54, 0x6a, 0x33, 0x59, 0x61, 0x64, 0x69, 0x57, 0x4a, 0x53, 0x34, 0x38, 0x76, 0x71, 0x62, 0x38, + 0x44, 0x63, 0x66, 0x2b, 0x53, 0x63, 0x38, 0x65, 0x50, 0x38, 0x44, 0x6d, 0x4a, 0x71, 0x65, 0x78, 0x6e, 0x2f, + 0x2f, 0x39, 0x66, 0x38, 0x58, 0x54, 0x7a, 0x37, 0x37, 0x4e, 0x4d, 0x6d, 0x77, 0x70, 0x52, 0x4d, 0x41, 0x4e, + 0x39, 0x38, 0x33, 0x67, 0x35, 0x39, 0x2f, 0x77, 0x7a, 0x76, 0x77, 0x6e, 0x65, 0x6f, 0x33, 0x41, 0x66, 0x68, + 0x30, 0x5c, 0x0a, + 0x09, 0x68, 0x6b, 0x41, 0x59, 0x47, 0x78, 0x2f, 0x48, 0x38, 0x53, 0x65, 0x64, 0x6a, 0x4b, 0x6e, 0x70, 0x61, + 0x55, 0x78, 0x4f, 0x62, 0x45, 0x46, 0x76, 0x72, 0x49, 0x64, 0x4f, 0x70, 0x34, 0x4f, 0x79, 0x4c, 0x46, 0x45, + 0x4d, 0x68, 0x2f, 0x48, 0x68, 0x6f, 0x4f, 0x46, 0x77, 0x57, 0x4c, 0x33, 0x67, 0x74, 0x66, 0x43, 0x2f, 0x2f, + 0x56, 0x43, 0x57, 0x2f, 0x71, 0x47, 0x68, 0x30, 0x71, 0x47, 0x6f, 0x5a, 0x46, 0x2b, 0x57, 0x52, 0x61, 0x57, + 0x44, 0x5c, 0x0a, + 0x09, 0x45, 0x6b, 0x58, 0x31, 0x77, 0x42, 0x65, 0x63, 0x41, 0x38, 0x72, 0x71, 0x6f, 0x61, 0x50, 0x53, 0x77, + 0x54, 0x6e, 0x2f, 0x78, 0x43, 0x44, 0x58, 0x55, 0x2f, 0x6c, 0x64, 0x50, 0x45, 0x41, 0x55, 0x39, 0x42, 0x41, + 0x66, 0x45, 0x6f, 0x71, 0x5a, 0x59, 0x66, 0x71, 0x6f, 0x4e, 0x51, 0x41, 0x63, 0x76, 0x2b, 0x64, 0x34, 0x76, + 0x50, 0x4e, 0x31, 0x6c, 0x2b, 0x4b, 0x38, 0x66, 0x58, 0x75, 0x6b, 0x44, 0x75, 0x4b, 0x55, 0x53, 0x67, 0x55, + 0x35, 0x5c, 0x0a, + 0x09, 0x50, 0x67, 0x31, 0x57, 0x41, 0x4a, 0x33, 0x6f, 0x30, 0x4c, 0x6b, 0x66, 0x41, 0x2f, 0x42, 0x42, 0x59, + 0x47, 0x30, 0x66, 0x43, 0x6c, 0x71, 0x54, 0x70, 0x77, 0x48, 0x39, 0x63, 0x77, 0x42, 0x30, 0x4d, 0x59, 0x43, + 0x50, 0x43, 0x32, 0x46, 0x6f, 0x45, 0x67, 0x36, 0x66, 0x48, 0x43, 0x52, 0x43, 0x47, 0x53, 0x77, 0x58, 0x65, + 0x4d, 0x39, 0x48, 0x50, 0x34, 0x73, 0x2f, 0x2f, 0x4f, 0x4f, 0x2f, 0x45, 0x4b, 0x2f, 0x63, 0x53, 0x74, 0x42, + 0x5a, 0x5c, 0x0a, + 0x09, 0x55, 0x59, 0x6a, 0x2b, 0x6e, 0x54, 0x78, 0x48, 0x74, 0x39, 0x39, 0x48, 0x72, 0x39, 0x2f, 0x33, 0x69, + 0x30, 0x7a, 0x38, 0x78, 0x61, 0x47, 0x35, 0x33, 0x4b, 0x77, 0x44, 0x49, 0x50, 0x36, 0x57, 0x58, 0x48, 0x67, + 0x69, 0x7a, 0x62, 0x50, 0x6b, 0x2f, 0x43, 0x75, 0x6e, 0x79, 0x62, 0x2f, 0x53, 0x4f, 0x72, 0x7a, 0x31, 0x70, + 0x6e, 0x37, 0x6d, 0x33, 0x37, 0x47, 0x33, 0x43, 0x66, 0x6b, 0x6e, 0x45, 0x50, 0x6e, 0x38, 0x75, 0x2b, 0x53, + 0x4f, 0x5c, 0x0a, + 0x09, 0x62, 0x72, 0x77, 0x6e, 0x67, 0x45, 0x65, 0x59, 0x4f, 0x72, 0x44, 0x56, 0x42, 0x70, 0x68, 0x6e, 0x47, + 0x56, 0x37, 0x78, 0x73, 0x7a, 0x2b, 0x46, 0x6c, 0x2f, 0x2f, 0x67, 0x45, 0x2b, 0x73, 0x35, 0x72, 0x6b, 0x34, + 0x66, 0x6d, 0x58, 0x46, 0x39, 0x38, 0x4e, 0x4e, 0x58, 0x34, 0x6a, 0x64, 0x2f, 0x37, 0x77, 0x2f, 0x67, 0x34, + 0x50, 0x43, 0x66, 0x58, 0x2f, 0x41, 0x38, 0x76, 0x4f, 0x6f, 0x46, 0x33, 0x31, 0x38, 0x2f, 0x49, 0x56, 0x69, + 0x56, 0x5c, 0x0a, + 0x09, 0x75, 0x66, 0x2f, 0x77, 0x41, 0x6e, 0x37, 0x6a, 0x66, 0x58, 0x2b, 0x44, 0x54, 0x31, 0x7a, 0x2b, 0x53, + 0x66, 0x54, 0x37, 0x59, 0x2f, 0x6a, 0x54, 0x74, 0x2f, 0x77, 0x47, 0x48, 0x6e, 0x76, 0x67, 0x70, 0x46, 0x51, + 0x48, 0x71, 0x5a, 0x48, 0x69, 0x33, 0x70, 0x6c, 0x35, 0x2f, 0x4e, 0x71, 0x37, 0x2f, 0x69, 0x63, 0x2b, 0x38, + 0x39, 0x6e, 0x50, 0x43, 0x66, 0x6e, 0x72, 0x34, 0x37, 0x71, 0x4b, 0x77, 0x2f, 0x6a, 0x45, 0x4f, 0x4d, 0x62, + 0x47, 0x5c, 0x0a, + 0x09, 0x4a, 0x39, 0x45, 0x62, 0x36, 0x79, 0x48, 0x50, 0x71, 0x6c, 0x75, 0x33, 0x6d, 0x63, 0x2b, 0x43, 0x73, + 0x71, 0x78, 0x2b, 0x34, 0x57, 0x64, 0x5a, 0x44, 0x72, 0x33, 0x6f, 0x55, 0x44, 0x6c, 0x6f, 0x36, 0x65, 0x4a, + 0x6a, 0x32, 0x6d, 0x56, 0x52, 0x6f, 0x75, 0x42, 0x50, 0x45, 0x51, 0x59, 0x39, 0x4f, 0x48, 0x38, 0x39, 0x50, + 0x46, 0x48, 0x6f, 0x66, 0x2f, 0x75, 0x78, 0x65, 0x6d, 0x53, 0x34, 0x65, 0x6e, 0x4b, 0x7a, 0x72, 0x4f, 0x62, + 0x7a, 0x5c, 0x0a, + 0x09, 0x34, 0x49, 0x37, 0x4f, 0x5a, 0x4f, 0x31, 0x56, 0x6b, 0x6a, 0x36, 0x69, 0x7a, 0x73, 0x64, 0x78, 0x34, + 0x59, 0x55, 0x58, 0x34, 0x49, 0x30, 0x76, 0x2b, 0x33, 0x39, 0x77, 0x79, 0x6e, 0x46, 0x68, 0x43, 0x73, 0x70, + 0x74, 0x52, 0x30, 0x55, 0x6e, 0x64, 0x68, 0x64, 0x46, 0x67, 0x49, 0x4b, 0x75, 0x56, 0x2b, 0x76, 0x78, 0x74, + 0x51, 0x42, 0x2b, 0x42, 0x31, 0x6a, 0x37, 0x4a, 0x77, 0x4c, 0x58, 0x43, 0x41, 0x41, 0x2b, 0x46, 0x56, 0x44, + 0x77, 0x5c, 0x0a, + 0x09, 0x44, 0x2b, 0x48, 0x77, 0x38, 0x6b, 0x59, 0x41, 0x41, 0x47, 0x79, 0x45, 0x62, 0x4b, 0x4a, 0x4b, 0x55, + 0x56, 0x66, 0x64, 0x66, 0x41, 0x2f, 0x65, 0x2b, 0x63, 0x47, 0x50, 0x34, 0x74, 0x50, 0x2f, 0x2b, 0x74, 0x6e, + 0x71, 0x4e, 0x4d, 0x73, 0x68, 0x6f, 0x59, 0x41, 0x67, 0x4f, 0x46, 0x43, 0x59, 0x35, 0x79, 0x6c, 0x6c, 0x57, + 0x34, 0x2f, 0x57, 0x38, 0x68, 0x52, 0x50, 0x37, 0x38, 0x50, 0x58, 0x6b, 0x56, 0x6c, 0x38, 0x68, 0x7a, 0x4a, + 0x32, 0x5c, 0x0a, + 0x09, 0x42, 0x6b, 0x59, 0x38, 0x4d, 0x75, 0x71, 0x32, 0x72, 0x4c, 0x4c, 0x68, 0x48, 0x44, 0x2f, 0x2b, 0x33, + 0x73, 0x63, 0x39, 0x44, 0x71, 0x2f, 0x36, 0x79, 0x65, 0x66, 0x67, 0x30, 0x65, 0x47, 0x4a, 0x76, 0x35, 0x69, + 0x61, 0x75, 0x2f, 0x71, 0x59, 0x79, 0x58, 0x4e, 0x70, 0x4d, 0x4d, 0x52, 0x50, 0x2f, 0x4e, 0x59, 0x37, 0x63, + 0x65, 0x58, 0x58, 0x72, 0x73, 0x4c, 0x4c, 0x66, 0x2b, 0x59, 0x6e, 0x38, 0x63, 0x76, 0x50, 0x66, 0x51, 0x71, + 0x4c, 0x5c, 0x0a, + 0x09, 0x54, 0x74, 0x57, 0x67, 0x71, 0x2b, 0x2b, 0x4c, 0x67, 0x77, 0x4b, 0x2f, 0x39, 0x74, 0x36, 0x2f, 0x78, + 0x54, 0x2f, 0x2b, 0x30, 0x37, 0x2f, 0x67, 0x42, 0x63, 0x39, 0x37, 0x46, 0x74, 0x37, 0x34, 0x6b, 0x6d, 0x64, + 0x42, 0x47, 0x71, 0x2f, 0x57, 0x51, 0x31, 0x31, 0x33, 0x65, 0x65, 0x6a, 0x77, 0x56, 0x35, 0x2f, 0x36, 0x4e, + 0x37, 0x7a, 0x33, 0x41, 0x78, 0x2f, 0x43, 0x76, 0x66, 0x66, 0x65, 0x6b, 0x77, 0x4b, 0x61, 0x6d, 0x6d, 0x4e, + 0x7a, 0x5c, 0x0a, + 0x09, 0x30, 0x6d, 0x4d, 0x56, 0x4c, 0x34, 0x49, 0x4a, 0x75, 0x6c, 0x56, 0x74, 0x52, 0x62, 0x41, 0x33, 0x5a, + 0x4b, 0x6a, 0x50, 0x6a, 0x36, 0x7a, 0x50, 0x35, 0x43, 0x76, 0x4b, 0x61, 0x6a, 0x4e, 0x6b, 0x2f, 0x6e, 0x7a, + 0x4b, 0x33, 0x6c, 0x50, 0x78, 0x34, 0x68, 0x63, 0x38, 0x43, 0x79, 0x39, 0x34, 0x34, 0x71, 0x50, 0x51, 0x36, + 0x32, 0x59, 0x69, 0x4f, 0x78, 0x4e, 0x52, 0x33, 0x33, 0x4c, 0x73, 0x30, 0x46, 0x6a, 0x55, 0x6d, 0x37, 0x36, + 0x47, 0x5c, 0x0a, + 0x09, 0x65, 0x2b, 0x44, 0x63, 0x79, 0x77, 0x46, 0x38, 0x47, 0x46, 0x69, 0x66, 0x78, 0x34, 0x48, 0x58, 0x37, + 0x48, 0x30, 0x41, 0x31, 0x59, 0x35, 0x41, 0x41, 0x74, 0x46, 0x76, 0x41, 0x48, 0x67, 0x4e, 0x67, 0x44, 0x45, + 0x7a, 0x55, 0x76, 0x45, 0x55, 0x56, 0x36, 0x52, 0x46, 0x47, 0x6a, 0x32, 0x68, 0x36, 0x67, 0x46, 0x58, 0x33, + 0x33, 0x49, 0x50, 0x50, 0x76, 0x36, 0x56, 0x61, 0x33, 0x48, 0x31, 0x4e, 0x32, 0x2f, 0x45, 0x31, 0x36, 0x36, + 0x38, 0x5c, 0x0a, + 0x09, 0x45, 0x76, 0x4e, 0x7a, 0x38, 0x37, 0x36, 0x59, 0x4d, 0x6a, 0x54, 0x4c, 0x43, 0x48, 0x57, 0x30, 0x31, + 0x32, 0x2f, 0x62, 0x43, 0x65, 0x30, 0x6b, 0x42, 0x74, 0x70, 0x77, 0x72, 0x6a, 0x70, 0x68, 0x41, 0x6b, 0x6d, + 0x43, 0x61, 0x58, 0x47, 0x38, 0x61, 0x61, 0x54, 0x55, 0x6b, 0x65, 0x66, 0x6b, 0x55, 0x30, 0x2f, 0x42, 0x45, + 0x79, 0x39, 0x34, 0x4c, 0x4a, 0x37, 0x35, 0x2b, 0x50, 0x4e, 0x78, 0x77, 0x52, 0x6b, 0x6e, 0x48, 0x52, 0x31, + 0x51, 0x5c, 0x0a, + 0x09, 0x73, 0x6b, 0x37, 0x6d, 0x42, 0x30, 0x50, 0x38, 0x30, 0x35, 0x65, 0x2b, 0x69, 0x65, 0x64, 0x64, 0x64, + 0x4c, 0x62, 0x4d, 0x78, 0x41, 0x77, 0x6a, 0x6e, 0x56, 0x74, 0x63, 0x78, 0x76, 0x2f, 0x2b, 0x30, 0x72, 0x56, + 0x34, 0x2f, 0x6b, 0x58, 0x6e, 0x2b, 0x73, 0x30, 0x36, 0x69, 0x58, 0x55, 0x37, 0x6f, 0x33, 0x35, 0x74, 0x30, + 0x45, 0x63, 0x57, 0x42, 0x76, 0x6a, 0x48, 0x4c, 0x31, 0x32, 0x4c, 0x54, 0x33, 0x33, 0x6c, 0x61, 0x6e, 0x7a, + 0x32, 0x5c, 0x0a, + 0x09, 0x63, 0x31, 0x2f, 0x41, 0x34, 0x75, 0x4c, 0x43, 0x69, 0x67, 0x41, 0x51, 0x78, 0x71, 0x33, 0x6c, 0x33, + 0x53, 0x68, 0x66, 0x41, 0x48, 0x71, 0x64, 0x51, 0x4c, 0x2b, 0x77, 0x77, 0x33, 0x78, 0x7a, 0x30, 0x67, 0x68, + 0x77, 0x48, 0x37, 0x58, 0x41, 0x35, 0x35, 0x7a, 0x44, 0x32, 0x57, 0x63, 0x2f, 0x45, 0x75, 0x65, 0x63, 0x39, + 0x58, 0x41, 0x38, 0x34, 0x64, 0x47, 0x50, 0x77, 0x42, 0x4d, 0x66, 0x63, 0x52, 0x72, 0x47, 0x2b, 0x39, 0x57, + 0x62, 0x5c, 0x0a, + 0x09, 0x70, 0x49, 0x38, 0x6d, 0x6c, 0x57, 0x66, 0x79, 0x54, 0x57, 0x30, 0x2f, 0x6e, 0x4d, 0x63, 0x69, 0x67, + 0x44, 0x66, 0x41, 0x34, 0x64, 0x32, 0x41, 0x76, 0x2f, 0x58, 0x33, 0x66, 0x2f, 0x30, 0x4c, 0x51, 0x64, 0x69, + 0x57, 0x59, 0x4d, 0x41, 0x2f, 0x45, 0x2f, 0x42, 0x6a, 0x41, 0x43, 0x34, 0x41, 0x38, 0x4d, 0x6a, 0x71, 0x62, + 0x7a, 0x52, 0x5a, 0x4b, 0x46, 0x71, 0x33, 0x78, 0x38, 0x6f, 0x41, 0x41, 0x47, 0x46, 0x78, 0x4d, 0x4d, 0x54, + 0x4e, 0x5c, 0x0a, + 0x09, 0x39, 0x78, 0x37, 0x43, 0x72, 0x66, 0x63, 0x66, 0x78, 0x45, 0x31, 0x33, 0x33, 0x49, 0x65, 0x37, 0x48, + 0x7a, 0x69, 0x49, 0x75, 0x2b, 0x2b, 0x37, 0x48, 0x33, 0x66, 0x64, 0x63, 0x78, 0x39, 0x75, 0x75, 0x66, 0x6b, + 0x57, 0x7a, 0x4d, 0x33, 0x4f, 0x2b, 0x69, 0x6f, 0x6a, 0x6f, 0x70, 0x43, 0x2b, 0x4c, 0x68, 0x79, 0x79, 0x41, + 0x55, 0x43, 0x53, 0x6c, 0x48, 0x65, 0x46, 0x7a, 0x4d, 0x4c, 0x4d, 0x54, 0x75, 0x42, 0x66, 0x73, 0x58, 0x33, + 0x36, 0x5c, 0x0a, + 0x09, 0x36, 0x61, 0x66, 0x6a, 0x31, 0x46, 0x4e, 0x50, 0x78, 0x72, 0x36, 0x54, 0x6a, 0x73, 0x65, 0x5a, 0x65, + 0x30, 0x2f, 0x43, 0x6d, 0x61, 0x63, 0x65, 0x6a, 0x34, 0x63, 0x64, 0x76, 0x78, 0x31, 0x5a, 0x54, 0x70, 0x45, + 0x6a, 0x51, 0x31, 0x42, 0x49, 0x6e, 0x48, 0x4a, 0x55, 0x78, 0x4e, 0x46, 0x31, 0x47, 0x36, 0x2f, 0x70, 0x6f, + 0x67, 0x31, 0x47, 0x4c, 0x71, 0x5a, 0x34, 0x64, 0x61, 0x67, 0x38, 0x73, 0x72, 0x43, 0x4d, 0x36, 0x32, 0x36, + 0x39, 0x5c, 0x0a, + 0x09, 0x42, 0x39, 0x66, 0x63, 0x64, 0x41, 0x65, 0x2b, 0x66, 0x65, 0x75, 0x64, 0x75, 0x4f, 0x58, 0x32, 0x4f, + 0x33, 0x44, 0x44, 0x74, 0x32, 0x2f, 0x45, 0x6f, 0x55, 0x4f, 0x48, 0x52, 0x41, 0x51, 0x58, 0x30, 0x64, 0x6c, + 0x79, 0x32, 0x42, 0x58, 0x6b, 0x7a, 0x6b, 0x48, 0x42, 0x63, 0x6d, 0x51, 0x74, 0x36, 0x33, 0x72, 0x6b, 0x73, + 0x72, 0x33, 0x6a, 0x54, 0x7a, 0x67, 0x42, 0x4a, 0x35, 0x39, 0x79, 0x45, 0x6b, 0x37, 0x63, 0x76, 0x51, 0x74, + 0x37, 0x5c, 0x0a, + 0x09, 0x64, 0x75, 0x37, 0x41, 0x33, 0x75, 0x4e, 0x33, 0x34, 0x66, 0x51, 0x54, 0x64, 0x32, 0x48, 0x2f, 0x43, + 0x54, 0x75, 0x77, 0x50, 0x66, 0x7a, 0x2b, 0x34, 0x71, 0x68, 0x46, 0x50, 0x43, 0x45, 0x58, 0x50, 0x67, 0x57, + 0x6f, 0x50, 0x32, 0x79, 0x51, 0x63, 0x41, 0x44, 0x6f, 0x43, 0x33, 0x44, 0x75, 0x38, 0x61, 0x47, 0x5a, 0x39, + 0x66, 0x79, 0x70, 0x73, 0x4c, 0x56, 0x2f, 0x49, 0x78, 0x42, 0x2f, 0x6e, 0x4e, 0x48, 0x33, 0x39, 0x57, 0x77, + 0x51, 0x5c, 0x0a, + 0x09, 0x2f, 0x5a, 0x30, 0x6f, 0x4a, 0x46, 0x4b, 0x76, 0x4a, 0x70, 0x52, 0x73, 0x4f, 0x4f, 0x5a, 0x6b, 0x47, + 0x58, 0x2b, 0x6c, 0x34, 0x4e, 0x6d, 0x46, 0x4a, 0x64, 0x78, 0x2f, 0x5a, 0x41, 0x47, 0x48, 0x35, 0x68, 0x5a, + 0x78, 0x61, 0x47, 0x34, 0x42, 0x68, 0x32, 0x63, 0x58, 0x4d, 0x4c, 0x65, 0x34, 0x69, 0x50, 0x6d, 0x46, 0x4a, + 0x53, 0x77, 0x73, 0x2b, 0x54, 0x66, 0x67, 0x7a, 0x43, 0x30, 0x73, 0x59, 0x6d, 0x46, 0x78, 0x43, 0x58, 0x4d, + 0x4c, 0x5c, 0x0a, + 0x09, 0x43, 0x31, 0x68, 0x65, 0x48, 0x6d, 0x4b, 0x32, 0x41, 0x67, 0x32, 0x41, 0x73, 0x4c, 0x43, 0x34, 0x69, + 0x4b, 0x58, 0x42, 0x4d, 0x67, 0x68, 0x2b, 0x76, 0x6e, 0x39, 0x6f, 0x70, 0x74, 0x36, 0x6a, 0x73, 0x57, 0x58, + 0x4c, 0x46, 0x6e, 0x53, 0x72, 0x7a, 0x55, 0x52, 0x45, 0x68, 0x4b, 0x31, 0x62, 0x4a, 0x6a, 0x30, 0x4c, 0x57, + 0x59, 0x61, 0x74, 0x6b, 0x35, 0x50, 0x59, 0x4d, 0x6a, 0x47, 0x4f, 0x79, 0x59, 0x6c, 0x78, 0x54, 0x49, 0x36, + 0x50, 0x5c, 0x0a, + 0x09, 0x59, 0x57, 0x4a, 0x38, 0x44, 0x4a, 0x4e, 0x6a, 0x66, 0x55, 0x79, 0x4f, 0x39, 0x37, 0x46, 0x39, 0x61, + 0x67, 0x76, 0x32, 0x62, 0x4e, 0x75, 0x4b, 0x48, 0x56, 0x76, 0x47, 0x73, 0x58, 0x74, 0x71, 0x41, 0x6d, 0x4f, + 0x39, 0x6a, 0x68, 0x79, 0x48, 0x64, 0x57, 0x7a, 0x4a, 0x69, 0x35, 0x2b, 0x72, 0x68, 0x53, 0x46, 0x6c, 0x6f, + 0x39, 0x76, 0x51, 0x35, 0x30, 0x33, 0x35, 0x42, 0x52, 0x6b, 0x61, 0x37, 0x57, 0x6b, 0x6a, 0x46, 0x39, 0x6b, + 0x61, 0x5c, 0x0a, + 0x09, 0x7a, 0x31, 0x42, 0x6b, 0x74, 0x6e, 0x4c, 0x76, 0x6f, 0x54, 0x6e, 0x63, 0x65, 0x33, 0x67, 0x57, 0x39, + 0x38, 0x33, 0x4d, 0x34, 0x39, 0x36, 0x44, 0x4d, 0x35, 0x69, 0x64, 0x58, 0x38, 0x54, 0x63, 0x34, 0x68, 0x4c, + 0x6d, 0x35, 0x68, 0x63, 0x78, 0x75, 0x37, 0x69, 0x49, 0x75, 0x64, 0x6c, 0x35, 0x7a, 0x4d, 0x37, 0x4e, 0x59, + 0x62, 0x62, 0x4b, 0x35, 0x67, 0x62, 0x4c, 0x79, 0x31, 0x68, 0x59, 0x58, 0x50, 0x49, 0x74, 0x4b, 0x62, 0x6c, + 0x76, 0x5c, 0x0a, + 0x09, 0x6d, 0x39, 0x34, 0x57, 0x58, 0x7a, 0x49, 0x79, 0x50, 0x6a, 0x36, 0x47, 0x58, 0x74, 0x66, 0x66, 0x68, + 0x75, 0x76, 0x32, 0x65, 0x68, 0x6a, 0x72, 0x39, 0x37, 0x46, 0x6c, 0x66, 0x42, 0x7a, 0x6a, 0x6b, 0x32, 0x50, + 0x59, 0x4f, 0x6a, 0x36, 0x4f, 0x69, 0x66, 0x45, 0x2b, 0x4a, 0x76, 0x6f, 0x39, 0x72, 0x34, 0x75, 0x78, 0x48, + 0x71, 0x61, 0x32, 0x54, 0x47, 0x44, 0x37, 0x6c, 0x6e, 0x48, 0x73, 0x6e, 0x4a, 0x72, 0x45, 0x63, 0x56, 0x76, + 0x47, 0x5c, 0x0a, + 0x09, 0x61, 0x39, 0x6b, 0x48, 0x6e, 0x67, 0x55, 0x77, 0x73, 0x6d, 0x79, 0x55, 0x6b, 0x35, 0x61, 0x54, 0x4d, + 0x36, 0x36, 0x74, 0x42, 0x42, 0x71, 0x65, 0x76, 0x67, 0x33, 0x67, 0x6a, 0x50, 0x56, 0x2b, 0x48, 0x79, 0x43, + 0x77, 0x44, 0x67, 0x44, 0x41, 0x71, 0x66, 0x70, 0x64, 0x77, 0x4a, 0x38, 0x45, 0x38, 0x4f, 0x63, 0x41, 0x6a, + 0x49, 0x69, 0x6c, 0x55, 0x6c, 0x73, 0x39, 0x58, 0x37, 0x58, 0x71, 0x48, 0x45, 0x33, 0x4b, 0x4e, 0x51, 0x49, + 0x59, 0x5c, 0x0a, + 0x09, 0x6d, 0x76, 0x73, 0x30, 0x2b, 0x6f, 0x75, 0x73, 0x4e, 0x44, 0x67, 0x6c, 0x70, 0x34, 0x5a, 0x46, 0x4f, + 0x65, 0x6b, 0x34, 0x49, 0x77, 0x43, 0x75, 0x61, 0x65, 0x70, 0x6a, 0x4f, 0x72, 0x49, 0x31, 0x31, 0x57, 0x67, + 0x79, 0x4f, 0x73, 0x4f, 0x68, 0x78, 0x64, 0x69, 0x4d, 0x61, 0x31, 0x59, 0x32, 0x4d, 0x56, 0x4c, 0x2b, 0x7a, + 0x42, 0x6d, 0x61, 0x6a, 0x46, 0x2b, 0x74, 0x49, 0x30, 0x67, 0x41, 0x55, 0x58, 0x77, 0x6c, 0x55, 0x30, 0x4c, + 0x47, 0x5c, 0x0a, + 0x09, 0x6f, 0x78, 0x6b, 0x63, 0x72, 0x4d, 0x7a, 0x47, 0x34, 0x4f, 0x6b, 0x6f, 0x31, 0x6a, 0x64, 0x45, 0x50, + 0x35, 0x78, 0x45, 0x47, 0x64, 0x6a, 0x6a, 0x46, 0x54, 0x70, 0x6e, 0x59, 0x30, 0x7a, 0x6c, 0x63, 0x67, 0x68, + 0x77, 0x32, 0x77, 0x46, 0x67, 0x76, 0x58, 0x38, 0x6e, 0x63, 0x48, 0x31, 0x2f, 0x47, 0x59, 0x68, 0x55, 0x6e, + 0x30, 0x45, 0x49, 0x32, 0x73, 0x6d, 0x42, 0x57, 0x6c, 0x42, 0x4f, 0x66, 0x59, 0x39, 0x31, 0x72, 0x43, 0x6a, + 0x46, 0x5c, 0x0a, + 0x09, 0x79, 0x6c, 0x72, 0x47, 0x71, 0x64, 0x74, 0x4d, 0x6a, 0x67, 0x32, 0x44, 0x30, 0x50, 0x33, 0x78, 0x64, + 0x6e, 0x6c, 0x5a, 0x67, 0x6e, 0x47, 0x4f, 0x55, 0x76, 0x42, 0x77, 0x31, 0x58, 0x2b, 0x4f, 0x6a, 0x34, 0x6c, + 0x64, 0x4a, 0x45, 0x6a, 0x44, 0x34, 0x6d, 0x33, 0x7a, 0x66, 0x6f, 0x56, 0x42, 0x68, 0x6e, 0x34, 0x4a, 0x6f, + 0x6b, 0x46, 0x74, 0x74, 0x43, 0x34, 0x34, 0x51, 0x58, 0x43, 0x53, 0x68, 0x6f, 0x6a, 0x6d, 0x77, 0x6a, 0x58, + 0x6c, 0x5c, 0x0a, + 0x09, 0x58, 0x46, 0x61, 0x45, 0x71, 0x77, 0x65, 0x6c, 0x2b, 0x4e, 0x46, 0x6c, 0x64, 0x4c, 0x75, 0x73, 0x6e, + 0x53, 0x41, 0x54, 0x41, 0x64, 0x43, 0x36, 0x50, 0x72, 0x63, 0x56, 0x4a, 0x65, 0x4d, 0x77, 0x6c, 0x73, 0x67, + 0x72, 0x30, 0x72, 0x5a, 0x69, 0x66, 0x53, 0x4f, 0x53, 0x77, 0x36, 0x56, 0x74, 0x43, 0x48, 0x6c, 0x43, 0x6e, + 0x68, 0x63, 0x41, 0x47, 0x4d, 0x5a, 0x4c, 0x36, 0x58, 0x68, 0x72, 0x5a, 0x75, 0x72, 0x78, 0x38, 0x2f, 0x6f, + 0x31, 0x5c, 0x0a, + 0x09, 0x48, 0x39, 0x73, 0x41, 0x64, 0x49, 0x33, 0x4b, 0x61, 0x30, 0x34, 0x62, 0x38, 0x4e, 0x4e, 0x67, 0x33, + 0x42, 0x6c, 0x47, 0x52, 0x43, 0x4e, 0x53, 0x43, 0x6d, 0x38, 0x4b, 0x61, 0x46, 0x45, 0x4a, 0x6b, 0x45, 0x49, + 0x64, 0x6c, 0x58, 0x6f, 0x46, 0x4a, 0x34, 0x4f, 0x54, 0x39, 0x65, 0x4a, 0x35, 0x6b, 0x75, 0x31, 0x6f, 0x67, + 0x30, 0x77, 0x56, 0x6d, 0x41, 0x4b, 0x56, 0x61, 0x4a, 0x65, 0x55, 0x59, 0x62, 0x48, 0x50, 0x34, 0x46, 0x69, + 0x78, 0x5c, 0x0a, + 0x09, 0x58, 0x7a, 0x62, 0x6d, 0x36, 0x4b, 0x51, 0x6a, 0x6f, 0x71, 0x6a, 0x6c, 0x66, 0x4d, 0x5a, 0x68, 0x37, + 0x44, 0x50, 0x4b, 0x52, 0x50, 0x47, 0x6b, 0x51, 0x5a, 0x6a, 0x4c, 0x4e, 0x59, 0x34, 0x66, 0x54, 0x45, 0x62, + 0x38, 0x55, 0x34, 0x31, 0x58, 0x38, 0x41, 0x63, 0x6b, 0x44, 0x68, 0x66, 0x59, 0x31, 0x69, 0x41, 0x57, 0x4c, + 0x76, 0x4c, 0x32, 0x65, 0x41, 0x53, 0x4e, 0x49, 0x4f, 0x54, 0x53, 0x74, 0x6f, 0x6e, 0x58, 0x34, 0x55, 0x77, + 0x70, 0x5c, 0x0a, + 0x09, 0x4a, 0x30, 0x36, 0x79, 0x48, 0x53, 0x67, 0x52, 0x57, 0x76, 0x62, 0x4a, 0x36, 0x6f, 0x63, 0x79, 0x5a, + 0x69, 0x42, 0x53, 0x64, 0x54, 0x69, 0x49, 0x52, 0x46, 0x42, 0x53, 0x31, 0x32, 0x73, 0x66, 0x32, 0x4a, 0x41, + 0x66, 0x43, 0x74, 0x32, 0x6f, 0x48, 0x77, 0x64, 0x4e, 0x55, 0x37, 0x64, 0x41, 0x53, 0x53, 0x6f, 0x63, 0x4c, + 0x7a, 0x51, 0x59, 0x50, 0x4b, 0x76, 0x44, 0x6f, 0x34, 0x70, 0x49, 0x57, 0x31, 0x56, 0x45, 0x44, 0x63, 0x62, + 0x76, 0x5c, 0x0a, + 0x09, 0x64, 0x46, 0x6e, 0x56, 0x64, 0x32, 0x78, 0x62, 0x4b, 0x55, 0x34, 0x37, 0x4e, 0x51, 0x65, 0x50, 0x70, + 0x67, 0x77, 0x69, 0x38, 0x4d, 0x4c, 0x37, 0x34, 0x56, 0x6b, 0x44, 0x35, 0x7a, 0x30, 0x36, 0x50, 0x36, 0x54, + 0x52, 0x36, 0x43, 0x6c, 0x41, 0x4b, 0x42, 0x76, 0x6c, 0x78, 0x79, 0x4b, 0x5a, 0x48, 0x6f, 0x38, 0x6c, 0x4e, + 0x2b, 0x32, 0x41, 0x31, 0x6c, 0x52, 0x44, 0x52, 0x48, 0x34, 0x6d, 0x4d, 0x33, 0x59, 0x71, 0x38, 0x69, 0x68, + 0x6b, 0x5c, 0x0a, + 0x09, 0x6f, 0x74, 0x72, 0x68, 0x73, 0x72, 0x41, 0x79, 0x4a, 0x64, 0x36, 0x67, 0x6e, 0x6d, 0x4a, 0x77, 0x2b, + 0x66, 0x4d, 0x4d, 0x49, 0x4d, 0x71, 0x64, 0x38, 0x61, 0x39, 0x31, 0x4b, 0x51, 0x64, 0x63, 0x79, 0x35, 0x6f, + 0x44, 0x50, 0x62, 0x63, 0x46, 0x79, 0x77, 0x61, 0x69, 0x72, 0x4a, 0x79, 0x73, 0x4a, 0x2b, 0x52, 0x75, 0x6a, + 0x51, 0x56, 0x53, 0x70, 0x72, 0x79, 0x6f, 0x30, 0x4c, 0x63, 0x44, 0x67, 0x46, 0x33, 0x4e, 0x55, 0x57, 0x37, + 0x74, 0x5c, 0x0a, + 0x09, 0x61, 0x41, 0x4d, 0x41, 0x77, 0x45, 0x42, 0x4f, 0x4b, 0x31, 0x49, 0x6e, 0x43, 0x4f, 0x74, 0x67, 0x47, + 0x7a, 0x77, 0x6a, 0x62, 0x58, 0x52, 0x42, 0x57, 0x61, 0x46, 0x65, 0x76, 0x4f, 0x5a, 0x59, 0x65, 0x2b, 0x48, + 0x34, 0x4b, 0x50, 0x6b, 0x4f, 0x68, 0x7a, 0x72, 0x54, 0x34, 0x49, 0x46, 0x61, 0x54, 0x44, 0x39, 0x34, 0x74, + 0x42, 0x72, 0x52, 0x5a, 0x70, 0x4b, 0x32, 0x4b, 0x32, 0x66, 0x69, 0x71, 0x58, 0x4d, 0x77, 0x50, 0x70, 0x35, + 0x68, 0x5c, 0x0a, + 0x09, 0x68, 0x44, 0x6f, 0x69, 0x61, 0x75, 0x76, 0x72, 0x44, 0x64, 0x30, 0x6e, 0x37, 0x59, 0x41, 0x42, 0x45, + 0x77, 0x63, 0x6f, 0x48, 0x58, 0x57, 0x35, 0x67, 0x33, 0x44, 0x65, 0x6b, 0x62, 0x59, 0x6c, 0x6a, 0x6b, 0x66, + 0x78, 0x35, 0x57, 0x53, 0x35, 0x6d, 0x47, 0x30, 0x78, 0x70, 0x67, 0x56, 0x51, 0x61, 0x54, 0x36, 0x63, 0x6c, + 0x4c, 0x4f, 0x5a, 0x70, 0x53, 0x48, 0x74, 0x57, 0x2b, 0x43, 0x30, 0x6b, 0x7a, 0x72, 0x57, 0x66, 0x59, 0x58, + 0x72, 0x5c, 0x0a, + 0x09, 0x77, 0x71, 0x6b, 0x56, 0x79, 0x4e, 0x70, 0x7a, 0x66, 0x51, 0x56, 0x71, 0x34, 0x4d, 0x64, 0x37, 0x30, + 0x71, 0x6e, 0x4a, 0x32, 0x74, 0x50, 0x47, 0x54, 0x77, 0x48, 0x4d, 0x4e, 0x4a, 0x45, 0x35, 0x71, 0x58, 0x41, + 0x65, 0x70, 0x35, 0x53, 0x6a, 0x6b, 0x62, 0x67, 0x69, 0x4b, 0x38, 0x32, 0x57, 0x42, 0x64, 0x52, 0x35, 0x35, + 0x6a, 0x68, 0x36, 0x6a, 0x6d, 0x32, 0x6d, 0x74, 0x5a, 0x54, 0x32, 0x49, 0x62, 0x49, 0x56, 0x58, 0x56, 0x62, + 0x78, 0x5c, 0x0a, + 0x09, 0x5a, 0x59, 0x31, 0x64, 0x7a, 0x37, 0x6d, 0x31, 0x51, 0x57, 0x6e, 0x65, 0x65, 0x66, 0x5a, 0x67, 0x6a, + 0x56, 0x31, 0x45, 0x61, 0x78, 0x56, 0x46, 0x6f, 0x32, 0x7a, 0x54, 0x5a, 0x6d, 0x30, 0x6a, 0x5a, 0x41, 0x59, + 0x72, 0x70, 0x67, 0x74, 0x49, 0x35, 0x53, 0x5a, 0x4f, 0x51, 0x6d, 0x55, 0x42, 0x41, 0x62, 0x53, 0x51, 0x79, + 0x69, 0x4a, 0x38, 0x4f, 0x6c, 0x37, 0x66, 0x43, 0x42, 0x61, 0x38, 0x4c, 0x32, 0x73, 0x61, 0x45, 0x4f, 0x54, + 0x53, 0x5c, 0x0a, + 0x09, 0x35, 0x49, 0x42, 0x4f, 0x79, 0x56, 0x67, 0x37, 0x4a, 0x4b, 0x38, 0x54, 0x51, 0x63, 0x2b, 0x77, 0x4c, + 0x77, 0x35, 0x34, 0x49, 0x53, 0x73, 0x52, 0x51, 0x4b, 0x31, 0x73, 0x6a, 0x4f, 0x76, 0x62, 0x6d, 0x6b, 0x71, + 0x73, 0x77, 0x37, 0x50, 0x2f, 0x46, 0x6d, 0x31, 0x63, 0x42, 0x68, 0x43, 0x2f, 0x63, 0x67, 0x64, 0x53, 0x44, + 0x71, 0x6b, 0x52, 0x4e, 0x35, 0x59, 0x33, 0x44, 0x44, 0x2f, 0x4a, 0x42, 0x6e, 0x69, 0x45, 0x4e, 0x76, 0x6f, + 0x4c, 0x5c, 0x0a, + 0x09, 0x6a, 0x68, 0x6b, 0x4d, 0x62, 0x73, 0x56, 0x30, 0x6c, 0x55, 0x63, 0x64, 0x41, 0x2b, 0x6e, 0x44, 0x30, + 0x48, 0x69, 0x6b, 0x35, 0x6b, 0x43, 0x6c, 0x69, 0x54, 0x75, 0x4d, 0x6d, 0x63, 0x36, 0x6a, 0x72, 0x6b, 0x65, + 0x4d, 0x56, 0x35, 0x33, 0x65, 0x57, 0x79, 0x54, 0x41, 0x69, 0x51, 0x4d, 0x6c, 0x62, 0x35, 0x63, 0x5a, 0x71, + 0x41, 0x61, 0x76, 0x78, 0x47, 0x69, 0x5a, 0x7a, 0x4d, 0x53, 0x6e, 0x49, 0x51, 0x63, 0x4f, 0x7a, 0x4b, 0x4a, + 0x39, 0x5c, 0x0a, + 0x09, 0x42, 0x70, 0x7a, 0x63, 0x4f, 0x58, 0x53, 0x35, 0x30, 0x4c, 0x36, 0x59, 0x74, 0x6a, 0x54, 0x49, 0x6e, + 0x6d, 0x63, 0x6f, 0x63, 0x5a, 0x78, 0x4b, 0x42, 0x6c, 0x6f, 0x75, 0x4d, 0x61, 0x4e, 0x67, 0x38, 0x6b, 0x69, + 0x79, 0x47, 0x33, 0x36, 0x42, 0x79, 0x59, 0x70, 0x6e, 0x42, 0x54, 0x77, 0x44, 0x45, 0x48, 0x70, 0x69, 0x50, + 0x4f, 0x69, 0x78, 0x43, 0x5a, 0x59, 0x53, 0x38, 0x4e, 0x71, 0x52, 0x4d, 0x72, 0x7a, 0x32, 0x74, 0x4d, 0x34, + 0x41, 0x5c, 0x0a, + 0x09, 0x6f, 0x46, 0x43, 0x66, 0x43, 0x78, 0x35, 0x6f, 0x6a, 0x74, 0x69, 0x6b, 0x46, 0x4b, 0x48, 0x6e, 0x74, + 0x41, 0x47, 0x42, 0x74, 0x59, 0x45, 0x30, 0x39, 0x63, 0x76, 0x6e, 0x63, 0x6a, 0x70, 0x71, 0x36, 0x66, 0x71, + 0x78, 0x50, 0x4c, 0x75, 0x6d, 0x41, 0x59, 0x46, 0x6e, 0x4b, 0x74, 0x45, 0x41, 0x46, 0x4c, 0x39, 0x57, 0x70, + 0x6d, 0x50, 0x31, 0x5a, 0x55, 0x57, 0x6b, 0x4f, 0x41, 0x78, 0x6d, 0x38, 0x46, 0x62, 0x6d, 0x59, 0x37, 0x55, + 0x62, 0x5c, 0x0a, + 0x09, 0x2b, 0x47, 0x62, 0x73, 0x4a, 0x4f, 0x33, 0x46, 0x63, 0x55, 0x41, 0x61, 0x71, 0x70, 0x56, 0x68, 0x43, + 0x44, 0x6b, 0x78, 0x35, 0x7a, 0x4d, 0x7a, 0x49, 0x6b, 0x4f, 0x33, 0x53, 0x66, 0x2b, 0x51, 0x4f, 0x75, 0x42, + 0x39, 0x4b, 0x2f, 0x2b, 0x58, 0x37, 0x65, 0x69, 0x4c, 0x70, 0x41, 0x70, 0x71, 0x30, 0x67, 0x37, 0x48, 0x48, + 0x5a, 0x4b, 0x6b, 0x6e, 0x48, 0x54, 0x51, 0x74, 0x36, 0x5a, 0x6c, 0x53, 0x52, 0x5a, 0x70, 0x38, 0x51, 0x67, + 0x70, 0x5c, 0x0a, + 0x09, 0x51, 0x35, 0x48, 0x64, 0x4a, 0x4f, 0x31, 0x74, 0x33, 0x34, 0x41, 0x6c, 0x67, 0x41, 0x31, 0x61, 0x42, + 0x42, 0x52, 0x52, 0x7a, 0x48, 0x42, 0x4f, 0x67, 0x65, 0x78, 0x47, 0x76, 0x57, 0x67, 0x63, 0x77, 0x66, 0x43, + 0x59, 0x51, 0x35, 0x67, 0x47, 0x36, 0x53, 0x41, 0x64, 0x52, 0x6a, 0x75, 0x52, 0x69, 0x68, 0x7a, 0x57, 0x33, + 0x43, 0x2b, 0x32, 0x68, 0x62, 0x71, 0x4e, 0x5a, 0x47, 0x35, 0x76, 0x39, 0x4b, 0x6c, 0x54, 0x58, 0x64, 0x57, + 0x45, 0x5c, 0x0a, + 0x09, 0x62, 0x55, 0x44, 0x71, 0x65, 0x77, 0x49, 0x65, 0x54, 0x73, 0x6e, 0x48, 0x73, 0x54, 0x2b, 0x6f, 0x73, + 0x52, 0x6b, 0x4e, 0x57, 0x38, 0x44, 0x44, 0x51, 0x54, 0x57, 0x43, 0x6e, 0x5a, 0x5a, 0x62, 0x77, 0x78, 0x68, + 0x6a, 0x4a, 0x61, 0x54, 0x6c, 0x56, 0x35, 0x72, 0x32, 0x43, 0x4c, 0x6d, 0x7a, 0x76, 0x72, 0x6e, 0x73, 0x43, + 0x49, 0x59, 0x74, 0x42, 0x42, 0x35, 0x56, 0x74, 0x72, 0x44, 0x53, 0x74, 0x45, 0x39, 0x63, 0x5a, 0x7a, 0x72, + 0x55, 0x5c, 0x0a, + 0x09, 0x77, 0x4b, 0x65, 0x72, 0x4a, 0x6e, 0x4a, 0x77, 0x61, 0x56, 0x6b, 0x74, 0x43, 0x32, 0x4c, 0x6e, 0x75, + 0x65, 0x35, 0x46, 0x4e, 0x68, 0x5a, 0x70, 0x68, 0x77, 0x6e, 0x36, 0x61, 0x30, 0x77, 0x62, 0x41, 0x77, 0x43, + 0x6d, 0x30, 0x43, 0x43, 0x64, 0x44, 0x51, 0x33, 0x43, 0x46, 0x6e, 0x4d, 0x73, 0x35, 0x66, 0x6a, 0x52, 0x38, + 0x4b, 0x73, 0x36, 0x4f, 0x6c, 0x33, 0x6d, 0x68, 0x75, 0x52, 0x55, 0x6d, 0x31, 0x59, 0x30, 0x74, 0x4f, 0x61, + 0x52, 0x5c, 0x0a, + 0x09, 0x65, 0x69, 0x37, 0x6e, 0x47, 0x70, 0x54, 0x4e, 0x30, 0x32, 0x51, 0x78, 0x70, 0x32, 0x53, 0x52, 0x79, + 0x71, 0x6d, 0x32, 0x64, 0x63, 0x71, 0x75, 0x35, 0x53, 0x49, 0x69, 0x69, 0x53, 0x61, 0x53, 0x39, 0x54, 0x69, + 0x49, 0x78, 0x67, 0x79, 0x4b, 0x39, 0x78, 0x4d, 0x48, 0x78, 0x49, 0x7a, 0x66, 0x4b, 0x47, 0x4e, 0x46, 0x37, + 0x69, 0x5a, 0x51, 0x34, 0x50, 0x33, 0x79, 0x39, 0x6a, 0x57, 0x77, 0x78, 0x33, 0x4a, 0x38, 0x54, 0x45, 0x79, + 0x4f, 0x5c, 0x0a, + 0x09, 0x44, 0x55, 0x6d, 0x48, 0x48, 0x43, 0x37, 0x76, 0x45, 0x7a, 0x4a, 0x71, 0x43, 0x36, 0x42, 0x6c, 0x6c, + 0x55, 0x66, 0x50, 0x77, 0x52, 0x45, 0x7a, 0x4e, 0x36, 0x66, 0x4f, 0x63, 0x2f, 0x41, 0x51, 0x30, 0x31, 0x54, + 0x44, 0x52, 0x71, 0x30, 0x70, 0x6b, 0x35, 0x42, 0x76, 0x67, 0x34, 0x31, 0x68, 0x55, 0x30, 0x77, 0x42, 0x6d, + 0x4a, 0x43, 0x34, 0x34, 0x31, 0x6b, 0x49, 0x6e, 0x67, 0x67, 0x59, 0x68, 0x6d, 0x49, 0x67, 0x36, 0x34, 0x6a, + 0x72, 0x5c, 0x0a, + 0x09, 0x34, 0x62, 0x77, 0x32, 0x56, 0x43, 0x65, 0x2f, 0x38, 0x72, 0x62, 0x44, 0x5a, 0x36, 0x4f, 0x68, 0x4f, + 0x48, 0x6c, 0x4f, 0x74, 0x4b, 0x47, 0x63, 0x4c, 0x36, 0x34, 0x72, 0x49, 0x44, 0x30, 0x57, 0x55, 0x55, 0x2b, + 0x50, 0x6b, 0x62, 0x4f, 0x71, 0x51, 0x63, 0x43, 0x4b, 0x63, 0x67, 0x77, 0x77, 0x7a, 0x4f, 0x6b, 0x4c, 0x62, + 0x38, 0x63, 0x5a, 0x35, 0x78, 0x56, 0x6f, 0x38, 0x6a, 0x47, 0x46, 0x4b, 0x45, 0x75, 0x42, 0x62, 0x77, 0x36, + 0x32, 0x5c, 0x0a, + 0x09, 0x6a, 0x4e, 0x65, 0x6d, 0x4b, 0x51, 0x73, 0x66, 0x54, 0x35, 0x4c, 0x70, 0x36, 0x59, 0x34, 0x67, 0x5a, + 0x53, 0x6c, 0x30, 0x79, 0x68, 0x72, 0x6a, 0x6d, 0x59, 0x6b, 0x31, 0x42, 0x34, 0x63, 0x71, 0x6e, 0x2b, 0x67, + 0x6c, 0x5a, 0x53, 0x63, 0x42, 0x63, 0x57, 0x73, 0x51, 0x57, 0x76, 0x39, 0x36, 0x4b, 0x68, 0x64, 0x45, 0x30, + 0x42, 0x54, 0x63, 0x6d, 0x73, 0x43, 0x70, 0x4c, 0x6e, 0x39, 0x63, 0x34, 0x35, 0x52, 0x75, 0x44, 0x57, 0x6c, + 0x64, 0x5c, 0x0a, + 0x09, 0x66, 0x68, 0x35, 0x63, 0x6b, 0x68, 0x73, 0x4b, 0x35, 0x77, 0x64, 0x53, 0x6f, 0x53, 0x56, 0x52, 0x52, + 0x31, 0x39, 0x48, 0x37, 0x53, 0x41, 0x6a, 0x31, 0x77, 0x30, 0x67, 0x46, 0x52, 0x4d, 0x56, 0x4c, 0x62, 0x7a, + 0x4d, 0x42, 0x68, 0x43, 0x72, 0x66, 0x38, 0x66, 0x71, 0x63, 0x73, 0x63, 0x57, 0x76, 0x44, 0x44, 0x6a, 0x31, + 0x4f, 0x32, 0x4a, 0x63, 0x38, 0x46, 0x6f, 0x56, 0x48, 0x38, 0x38, 0x43, 0x78, 0x44, 0x76, 0x42, 0x56, 0x4f, + 0x6b, 0x5c, 0x0a, + 0x09, 0x78, 0x35, 0x35, 0x6b, 0x46, 0x77, 0x59, 0x50, 0x33, 0x45, 0x38, 0x46, 0x2b, 0x50, 0x4a, 0x2b, 0x32, + 0x58, 0x6a, 0x6a, 0x64, 0x52, 0x4b, 0x6e, 0x54, 0x56, 0x6b, 0x4c, 0x4a, 0x7a, 0x4c, 0x47, 0x4a, 0x4d, 0x42, + 0x4d, 0x44, 0x34, 0x61, 0x4e, 0x4f, 0x59, 0x52, 0x79, 0x70, 0x36, 0x2b, 0x6a, 0x6c, 0x6c, 0x65, 0x69, 0x4a, + 0x32, 0x4d, 0x73, 0x59, 0x72, 0x6f, 0x45, 0x6f, 0x33, 0x2b, 0x6c, 0x6c, 0x31, 0x41, 0x32, 0x6d, 0x61, 0x61, + 0x4a, 0x5c, 0x0a, + 0x09, 0x4c, 0x7a, 0x44, 0x31, 0x78, 0x6a, 0x50, 0x50, 0x61, 0x41, 0x75, 0x68, 0x69, 0x36, 0x42, 0x4c, 0x4a, + 0x51, 0x50, 0x6e, 0x5a, 0x46, 0x6d, 0x48, 0x37, 0x56, 0x6f, 0x71, 0x36, 0x30, 0x45, 0x62, 0x41, 0x41, 0x41, + 0x30, 0x4b, 0x35, 0x53, 0x69, 0x6a, 0x5a, 0x69, 0x66, 0x74, 0x2b, 0x62, 0x6a, 0x34, 0x50, 0x57, 0x55, 0x73, + 0x65, 0x74, 0x79, 0x54, 0x63, 0x66, 0x63, 0x4f, 0x49, 0x51, 0x6a, 0x4e, 0x2f, 0x53, 0x6e, 0x76, 0x7a, 0x64, + 0x47, 0x5c, 0x0a, + 0x09, 0x43, 0x71, 0x4f, 0x65, 0x64, 0x67, 0x77, 0x65, 0x74, 0x55, 0x52, 0x6b, 0x59, 0x32, 0x58, 0x45, 0x4d, + 0x61, 0x75, 0x76, 0x73, 0x77, 0x38, 0x64, 0x42, 0x54, 0x6e, 0x41, 0x43, 0x58, 0x42, 0x6c, 0x52, 0x67, 0x6a, + 0x56, 0x6a, 0x67, 0x6c, 0x34, 0x51, 0x47, 0x4b, 0x34, 0x54, 0x62, 0x4b, 0x77, 0x31, 0x6a, 0x70, 0x45, 0x47, + 0x5a, 0x61, 0x5a, 0x6d, 0x46, 0x45, 0x64, 0x53, 0x70, 0x38, 0x61, 0x74, 0x48, 0x54, 0x37, 0x72, 0x4b, 0x34, + 0x46, 0x5c, 0x0a, + 0x09, 0x58, 0x73, 0x6c, 0x30, 0x69, 0x34, 0x31, 0x48, 0x41, 0x42, 0x70, 0x33, 0x57, 0x4d, 0x55, 0x7a, 0x7a, + 0x33, 0x70, 0x41, 0x69, 0x6c, 0x39, 0x4b, 0x65, 0x54, 0x66, 0x37, 0x55, 0x2f, 0x4a, 0x77, 0x71, 0x6e, 0x2b, + 0x6d, 0x74, 0x71, 0x72, 0x39, 0x48, 0x66, 0x62, 0x55, 0x62, 0x6d, 0x31, 0x70, 0x59, 0x2b, 0x34, 0x43, 0x56, + 0x43, 0x43, 0x66, 0x52, 0x69, 0x42, 0x75, 0x2f, 0x4c, 0x77, 0x61, 0x53, 0x59, 0x50, 0x51, 0x78, 0x69, 0x30, + 0x63, 0x5c, 0x0a, + 0x09, 0x77, 0x39, 0x56, 0x47, 0x77, 0x39, 0x4e, 0x46, 0x33, 0x56, 0x37, 0x67, 0x70, 0x39, 0x48, 0x4a, 0x6c, + 0x66, 0x45, 0x4b, 0x78, 0x70, 0x46, 0x65, 0x34, 0x38, 0x72, 0x56, 0x35, 0x2b, 0x50, 0x59, 0x47, 0x75, 0x70, + 0x47, 0x30, 0x5a, 0x41, 0x79, 0x46, 0x4d, 0x34, 0x54, 0x42, 0x79, 0x2b, 0x53, 0x4d, 0x74, 0x47, 0x67, 0x43, + 0x63, 0x56, 0x37, 0x37, 0x46, 0x62, 0x31, 0x36, 0x64, 0x68, 0x46, 0x34, 0x52, 0x68, 0x4b, 0x43, 0x5a, 0x61, + 0x4d, 0x5c, 0x0a, + 0x09, 0x64, 0x4e, 0x75, 0x79, 0x55, 0x61, 0x59, 0x44, 0x53, 0x46, 0x35, 0x35, 0x65, 0x39, 0x79, 0x35, 0x2b, + 0x54, 0x52, 0x45, 0x52, 0x32, 0x44, 0x6c, 0x78, 0x79, 0x5a, 0x6f, 0x4f, 0x39, 0x56, 0x75, 0x4d, 0x72, 0x33, + 0x51, 0x51, 0x44, 0x61, 0x43, 0x70, 0x38, 0x69, 0x62, 0x30, 0x61, 0x2b, 0x65, 0x56, 0x67, 0x56, 0x67, 0x62, + 0x6e, 0x4a, 0x65, 0x61, 0x2f, 0x71, 0x52, 0x54, 0x4d, 0x30, 0x41, 0x67, 0x48, 0x61, 0x73, 0x47, 0x46, 0x6a, + 0x57, 0x5c, 0x0a, + 0x09, 0x67, 0x44, 0x5a, 0x6d, 0x44, 0x51, 0x42, 0x49, 0x6a, 0x5a, 0x79, 0x66, 0x35, 0x38, 0x61, 0x65, 0x54, + 0x41, 0x2f, 0x59, 0x73, 0x61, 0x2f, 0x41, 0x4b, 0x30, 0x4d, 0x34, 0x42, 0x37, 0x48, 0x76, 0x47, 0x67, 0x78, + 0x30, 0x4e, 0x45, 0x31, 0x59, 0x56, 0x55, 0x59, 0x56, 0x69, 0x7a, 0x61, 0x42, 0x52, 0x35, 0x50, 0x6a, 0x57, + 0x71, 0x51, 0x41, 0x4c, 0x62, 0x52, 0x72, 0x31, 0x59, 0x30, 0x47, 0x62, 0x6b, 0x52, 0x52, 0x43, 0x30, 0x68, + 0x34, 0x5c, 0x0a, + 0x09, 0x48, 0x38, 0x5a, 0x68, 0x57, 0x70, 0x36, 0x44, 0x71, 0x4d, 0x6f, 0x55, 0x64, 0x48, 0x6c, 0x75, 0x75, + 0x4a, 0x77, 0x2f, 0x37, 0x58, 0x67, 0x63, 0x6a, 0x41, 0x52, 0x59, 0x75, 0x4c, 0x53, 0x4e, 0x42, 0x4d, 0x51, + 0x74, 0x5a, 0x2b, 0x4a, 0x39, 0x42, 0x52, 0x6d, 0x4d, 0x41, 0x43, 0x55, 0x4e, 0x47, 0x4c, 0x79, 0x2f, 0x42, + 0x49, 0x53, 0x4e, 0x64, 0x6f, 0x54, 0x39, 0x71, 0x43, 0x49, 0x61, 0x64, 0x42, 0x57, 0x4c, 0x63, 0x69, 0x78, + 0x41, 0x5c, 0x0a, + 0x09, 0x59, 0x67, 0x50, 0x4e, 0x31, 0x37, 0x62, 0x44, 0x72, 0x63, 0x39, 0x50, 0x67, 0x6e, 0x50, 0x61, 0x69, + 0x4a, 0x32, 0x41, 0x38, 0x2b, 0x4b, 0x72, 0x6d, 0x48, 0x74, 0x43, 0x47, 0x54, 0x73, 0x37, 0x46, 0x38, 0x73, + 0x71, 0x67, 0x7a, 0x49, 0x58, 0x74, 0x70, 0x41, 0x61, 0x65, 0x6b, 0x44, 0x70, 0x42, 0x48, 0x67, 0x61, 0x44, + 0x44, 0x36, 0x5a, 0x45, 0x75, 0x68, 0x50, 0x78, 0x71, 0x75, 0x49, 0x58, 0x69, 0x4d, 0x63, 0x71, 0x44, 0x46, + 0x4e, 0x5c, 0x0a, + 0x09, 0x68, 0x67, 0x51, 0x33, 0x71, 0x31, 0x35, 0x6a, 0x6d, 0x37, 0x77, 0x78, 0x4a, 0x2b, 0x58, 0x48, 0x54, + 0x73, 0x65, 0x79, 0x56, 0x76, 0x6f, 0x66, 0x49, 0x78, 0x75, 0x37, 0x5a, 0x67, 0x49, 0x4f, 0x6a, 0x4c, 0x61, + 0x56, 0x51, 0x2b, 0x74, 0x30, 0x6e, 0x59, 0x39, 0x4c, 0x4f, 0x4a, 0x55, 0x47, 0x62, 0x68, 0x68, 0x6a, 0x4e, + 0x50, 0x51, 0x62, 0x39, 0x4a, 0x2f, 0x49, 0x56, 0x59, 0x4f, 0x49, 0x34, 0x74, 0x2f, 0x53, 0x75, 0x38, 0x57, + 0x2f, 0x5c, 0x0a, + 0x09, 0x36, 0x45, 0x76, 0x4a, 0x6d, 0x64, 0x74, 0x71, 0x46, 0x42, 0x66, 0x50, 0x58, 0x6b, 0x4c, 0x42, 0x4a, + 0x6a, 0x32, 0x4d, 0x41, 0x47, 0x7a, 0x6e, 0x2b, 0x69, 0x42, 0x61, 0x39, 0x79, 0x63, 0x43, 0x31, 0x78, 0x63, + 0x41, 0x66, 0x4b, 0x51, 0x62, 0x78, 0x4f, 0x39, 0x61, 0x59, 0x53, 0x49, 0x71, 0x73, 0x50, 0x4f, 0x78, 0x76, + 0x69, 0x6f, 0x54, 0x46, 0x42, 0x44, 0x62, 0x63, 0x72, 0x61, 0x42, 0x36, 0x62, 0x6d, 0x69, 0x6a, 0x6b, 0x70, + 0x4a, 0x5c, 0x0a, + 0x09, 0x32, 0x2b, 0x70, 0x37, 0x34, 0x49, 0x55, 0x44, 0x6b, 0x49, 0x35, 0x79, 0x6f, 0x59, 0x77, 0x59, 0x72, + 0x48, 0x4a, 0x71, 0x66, 0x59, 0x33, 0x4c, 0x49, 0x59, 0x78, 0x46, 0x52, 0x35, 0x30, 0x6d, 0x6f, 0x34, 0x6c, + 0x70, 0x4a, 0x77, 0x63, 0x32, 0x4e, 0x65, 0x35, 0x45, 0x46, 0x73, 0x47, 0x41, 0x56, 0x65, 0x51, 0x6a, 0x56, + 0x55, 0x2b, 0x33, 0x77, 0x38, 0x76, 0x78, 0x39, 0x6e, 0x53, 0x47, 0x46, 0x76, 0x6c, 0x69, 0x30, 0x56, 0x57, + 0x6e, 0x5c, 0x0a, + 0x09, 0x78, 0x35, 0x5a, 0x7a, 0x57, 0x56, 0x6c, 0x47, 0x77, 0x6a, 0x4e, 0x6e, 0x54, 0x76, 0x48, 0x51, 0x5a, + 0x43, 0x4f, 0x69, 0x54, 0x64, 0x32, 0x75, 0x71, 0x38, 0x65, 0x64, 0x5a, 0x4a, 0x6b, 0x4b, 0x47, 0x49, 0x4f, + 0x63, 0x2b, 0x54, 0x6d, 0x77, 0x63, 0x35, 0x77, 0x34, 0x6b, 0x4f, 0x6f, 0x73, 0x30, 0x77, 0x52, 0x79, 0x59, + 0x66, 0x4e, 0x54, 0x61, 0x59, 0x4e, 0x72, 0x53, 0x2b, 0x75, 0x66, 0x41, 0x54, 0x68, 0x33, 0x52, 0x45, 0x62, + 0x39, 0x5c, 0x0a, + 0x09, 0x52, 0x41, 0x68, 0x41, 0x34, 0x68, 0x77, 0x73, 0x73, 0x6f, 0x6a, 0x55, 0x53, 0x30, 0x55, 0x44, 0x78, + 0x2b, 0x72, 0x71, 0x43, 0x4b, 0x47, 0x56, 0x6c, 0x6b, 0x51, 0x72, 0x31, 0x50, 0x55, 0x63, 0x71, 0x37, 0x66, + 0x79, 0x65, 0x47, 0x72, 0x2b, 0x59, 0x2f, 0x31, 0x67, 0x42, 0x4f, 0x46, 0x50, 0x52, 0x54, 0x4a, 0x68, 0x55, + 0x49, 0x78, 0x33, 0x41, 0x55, 0x70, 0x38, 0x7a, 0x4d, 0x6f, 0x4a, 0x74, 0x43, 0x4f, 0x69, 0x34, 0x54, 0x76, + 0x6e, 0x5c, 0x0a, + 0x09, 0x4c, 0x33, 0x5a, 0x43, 0x7a, 0x4c, 0x41, 0x4e, 0x51, 0x34, 0x34, 0x79, 0x55, 0x61, 0x43, 0x6a, 0x77, + 0x55, 0x54, 0x4c, 0x54, 0x71, 0x54, 0x67, 0x66, 0x47, 0x77, 0x47, 0x65, 0x49, 0x6d, 0x49, 0x61, 0x52, 0x43, + 0x66, 0x6a, 0x69, 0x52, 0x41, 0x51, 0x51, 0x33, 0x6a, 0x5a, 0x76, 0x78, 0x5a, 0x55, 0x37, 0x4f, 0x45, 0x4c, + 0x36, 0x34, 0x62, 0x59, 0x33, 0x7a, 0x63, 0x4a, 0x76, 0x55, 0x34, 0x72, 0x53, 0x44, 0x52, 0x6c, 0x4b, 0x48, + 0x70, 0x5c, 0x0a, + 0x09, 0x63, 0x33, 0x72, 0x36, 0x4a, 0x4f, 0x31, 0x67, 0x71, 0x79, 0x57, 0x4f, 0x74, 0x61, 0x54, 0x31, 0x42, + 0x77, 0x43, 0x69, 0x49, 0x6b, 0x33, 0x46, 0x74, 0x4f, 0x4d, 0x62, 0x54, 0x68, 0x6b, 0x6a, 0x53, 0x39, 0x4a, + 0x65, 0x72, 0x59, 0x7a, 0x6f, 0x61, 0x30, 0x59, 0x45, 0x69, 0x46, 0x2b, 0x64, 0x62, 0x61, 0x68, 0x4e, 0x63, + 0x7a, 0x37, 0x42, 0x46, 0x2b, 0x2f, 0x54, 0x55, 0x43, 0x4b, 0x2f, 0x6c, 0x6a, 0x69, 0x59, 0x59, 0x61, 0x41, + 0x36, 0x5c, 0x0a, + 0x09, 0x62, 0x62, 0x59, 0x69, 0x55, 0x65, 0x4b, 0x6b, 0x4b, 0x6e, 0x72, 0x7a, 0x38, 0x68, 0x47, 0x4d, 0x51, + 0x6a, 0x6b, 0x4e, 0x63, 0x47, 0x70, 0x38, 0x53, 0x63, 0x6f, 0x4c, 0x31, 0x71, 0x63, 0x46, 0x66, 0x69, 0x73, + 0x41, 0x59, 0x71, 0x7a, 0x72, 0x32, 0x4a, 0x43, 0x4a, 0x73, 0x61, 0x34, 0x69, 0x59, 0x57, 0x4e, 0x6d, 0x77, + 0x35, 0x31, 0x66, 0x79, 0x55, 0x37, 0x55, 0x59, 0x57, 0x50, 0x56, 0x6d, 0x52, 0x77, 0x72, 0x49, 0x6a, 0x36, + 0x62, 0x5c, 0x0a, + 0x09, 0x5a, 0x4a, 0x4a, 0x6b, 0x68, 0x4c, 0x79, 0x62, 0x45, 0x57, 0x6a, 0x46, 0x78, 0x38, 0x7a, 0x50, 0x78, + 0x58, 0x70, 0x4f, 0x6c, 0x72, 0x4d, 0x79, 0x6c, 0x2f, 0x72, 0x38, 0x74, 0x75, 0x61, 0x4f, 0x31, 0x6f, 0x62, + 0x57, 0x2b, 0x59, 0x31, 0x41, 0x42, 0x41, 0x43, 0x48, 0x45, 0x6b, 0x4e, 0x76, 0x69, 0x6b, 0x54, 0x68, 0x4d, + 0x7a, 0x71, 0x34, 0x5a, 0x59, 0x41, 0x4e, 0x55, 0x53, 0x46, 0x65, 0x43, 0x2f, 0x32, 0x53, 0x4b, 0x43, 0x37, + 0x36, 0x5c, 0x0a, + 0x09, 0x34, 0x46, 0x6d, 0x46, 0x6e, 0x6a, 0x4e, 0x79, 0x5a, 0x78, 0x67, 0x31, 0x44, 0x39, 0x62, 0x58, 0x74, + 0x4a, 0x47, 0x76, 0x5a, 0x45, 0x51, 0x6d, 0x61, 0x52, 0x43, 0x6f, 0x6d, 0x4e, 0x56, 0x74, 0x36, 0x55, 0x67, + 0x56, 0x4d, 0x67, 0x79, 0x72, 0x79, 0x77, 0x43, 0x69, 0x53, 0x62, 0x62, 0x56, 0x59, 0x4d, 0x44, 0x57, 0x57, + 0x4b, 0x76, 0x6d, 0x61, 0x38, 0x66, 0x54, 0x35, 0x58, 0x54, 0x32, 0x6f, 0x2f, 0x6a, 0x55, 0x57, 0x56, 0x4f, + 0x55, 0x5c, 0x0a, + 0x09, 0x76, 0x33, 0x49, 0x57, 0x69, 0x33, 0x38, 0x39, 0x56, 0x64, 0x48, 0x70, 0x74, 0x67, 0x6b, 0x75, 0x4b, + 0x6f, 0x43, 0x4d, 0x42, 0x42, 0x34, 0x32, 0x68, 0x4b, 0x5a, 0x72, 0x75, 0x6b, 0x43, 0x59, 0x35, 0x76, 0x42, + 0x41, 0x45, 0x2f, 0x58, 0x52, 0x6f, 0x41, 0x65, 0x37, 0x33, 0x66, 0x2f, 0x6f, 0x47, 0x59, 0x41, 0x44, 0x41, + 0x50, 0x57, 0x4c, 0x48, 0x70, 0x41, 0x4f, 0x6d, 0x4b, 0x52, 0x6b, 0x59, 0x45, 0x37, 0x4c, 0x49, 0x36, 0x57, + 0x46, 0x5c, 0x0a, + 0x09, 0x31, 0x46, 0x43, 0x52, 0x56, 0x42, 0x6d, 0x79, 0x52, 0x75, 0x41, 0x6d, 0x51, 0x33, 0x4f, 0x36, 0x4c, + 0x33, 0x55, 0x78, 0x4d, 0x52, 0x62, 0x56, 0x4a, 0x71, 0x63, 0x59, 0x6a, 0x64, 0x56, 0x6e, 0x59, 0x38, 0x52, + 0x69, 0x2f, 0x54, 0x5a, 0x46, 0x6f, 0x53, 0x52, 0x79, 0x4f, 0x2f, 0x61, 0x6e, 0x73, 0x78, 0x50, 0x49, 0x64, + 0x6b, 0x6a, 0x58, 0x35, 0x32, 0x55, 0x61, 0x67, 0x4d, 0x7a, 0x71, 0x4f, 0x7a, 0x69, 0x34, 0x54, 0x6d, 0x4d, + 0x31, 0x5c, 0x0a, + 0x09, 0x62, 0x79, 0x6f, 0x34, 0x31, 0x6d, 0x32, 0x51, 0x4c, 0x43, 0x50, 0x47, 0x61, 0x79, 0x68, 0x45, 0x70, + 0x2f, 0x56, 0x38, 0x71, 0x74, 0x4b, 0x49, 0x72, 0x59, 0x36, 0x31, 0x47, 0x2b, 0x53, 0x71, 0x78, 0x6d, 0x53, + 0x42, 0x61, 0x52, 0x79, 0x66, 0x64, 0x62, 0x37, 0x68, 0x6e, 0x43, 0x56, 0x72, 0x66, 0x63, 0x30, 0x71, 0x4c, + 0x77, 0x46, 0x72, 0x45, 0x36, 0x77, 0x42, 0x77, 0x42, 0x33, 0x78, 0x48, 0x30, 0x41, 0x30, 0x49, 0x42, 0x47, + 0x52, 0x5c, 0x0a, + 0x09, 0x64, 0x42, 0x62, 0x41, 0x42, 0x4b, 0x75, 0x64, 0x50, 0x52, 0x54, 0x58, 0x44, 0x73, 0x54, 0x2f, 0x41, + 0x42, 0x59, 0x68, 0x57, 0x55, 0x56, 0x7a, 0x48, 0x73, 0x6c, 0x5a, 0x4c, 0x54, 0x62, 0x5a, 0x31, 0x77, 0x41, + 0x41, 0x49, 0x41, 0x42, 0x4a, 0x52, 0x45, 0x46, 0x55, 0x73, 0x42, 0x54, 0x4f, 0x2b, 0x7a, 0x57, 0x4d, 0x53, + 0x47, 0x63, 0x57, 0x59, 0x70, 0x79, 0x38, 0x41, 0x49, 0x76, 0x59, 0x41, 0x6d, 0x53, 0x63, 0x35, 0x46, 0x48, + 0x7a, 0x5c, 0x0a, + 0x09, 0x5a, 0x34, 0x31, 0x4c, 0x70, 0x38, 0x6c, 0x57, 0x4e, 0x68, 0x4c, 0x61, 0x46, 0x71, 0x6b, 0x31, 0x34, + 0x35, 0x55, 0x55, 0x58, 0x78, 0x7a, 0x38, 0x72, 0x44, 0x55, 0x42, 0x4b, 0x7a, 0x4f, 0x49, 0x38, 0x6f, 0x58, + 0x73, 0x33, 0x77, 0x4c, 0x52, 0x70, 0x6d, 0x78, 0x49, 0x4f, 0x35, 0x45, 0x41, 0x2b, 0x69, 0x5a, 0x48, 0x56, + 0x63, 0x64, 0x69, 0x36, 0x73, 0x4d, 0x64, 0x54, 0x39, 0x6d, 0x58, 0x7a, 0x76, 0x52, 0x57, 0x36, 0x71, 0x38, + 0x4a, 0x5c, 0x0a, + 0x09, 0x73, 0x44, 0x56, 0x50, 0x54, 0x64, 0x6c, 0x63, 0x6f, 0x68, 0x66, 0x56, 0x6e, 0x71, 0x2b, 0x33, 0x37, + 0x68, 0x6e, 0x41, 0x75, 0x75, 0x34, 0x45, 0x2f, 0x4f, 0x67, 0x58, 0x76, 0x34, 0x35, 0x4c, 0x4c, 0x6a, 0x68, + 0x76, 0x6b, 0x46, 0x7a, 0x51, 0x55, 0x34, 0x4a, 0x77, 0x4c, 0x6a, 0x48, 0x41, 0x32, 0x73, 0x6a, 0x76, 0x66, + 0x4f, 0x41, 0x77, 0x48, 0x49, 0x43, 0x35, 0x68, 0x53, 0x55, 0x4d, 0x42, 0x6b, 0x4d, 0x4d, 0x69, 0x77, 0x4a, + 0x7a, 0x5c, 0x0a, + 0x09, 0x43, 0x2f, 0x37, 0x31, 0x30, 0x51, 0x65, 0x50, 0x7a, 0x4b, 0x4d, 0x73, 0x53, 0x79, 0x77, 0x4f, 0x6c, + 0x6a, 0x45, 0x6f, 0x53, 0x73, 0x41, 0x35, 0x7a, 0x43, 0x30, 0x75, 0x59, 0x54, 0x6a, 0x30, 0x79, 0x63, 0x66, + 0x43, 0x30, 0x67, 0x44, 0x4c, 0x52, 0x51, 0x45, 0x69, 0x77, 0x73, 0x4c, 0x69, 0x41, 0x4d, 0x76, 0x44, 0x6f, + 0x54, 0x38, 0x65, 0x4c, 0x47, 0x4e, 0x59, 0x2b, 0x4e, 0x2b, 0x63, 0x57, 0x31, 0x77, 0x75, 0x2f, 0x48, 0x6e, + 0x34, 0x5c, 0x0a, + 0x09, 0x39, 0x38, 0x30, 0x76, 0x4c, 0x41, 0x31, 0x51, 0x73, 0x4e, 0x2f, 0x30, 0x49, 0x79, 0x49, 0x4d, 0x6c, + 0x6f, 0x64, 0x59, 0x4c, 0x6f, 0x71, 0x4b, 0x52, 0x63, 0x39, 0x33, 0x55, 0x54, 0x67, 0x73, 0x4c, 0x43, 0x2f, + 0x4c, 0x78, 0x45, 0x55, 0x62, 0x6d, 0x61, 0x74, 0x2b, 0x30, 0x70, 0x4a, 0x46, 0x53, 0x77, 0x65, 0x67, 0x6b, + 0x32, 0x55, 0x59, 0x36, 0x33, 0x57, 0x71, 0x39, 0x76, 0x77, 0x76, 0x36, 0x50, 0x61, 0x36, 0x4f, 0x62, 0x71, + 0x35, 0x5c, 0x0a, + 0x09, 0x2f, 0x34, 0x6e, 0x73, 0x69, 0x62, 0x45, 0x2b, 0x38, 0x69, 0x7a, 0x48, 0x6c, 0x72, 0x45, 0x65, 0x4a, + 0x73, 0x66, 0x48, 0x4d, 0x44, 0x6e, 0x65, 0x77, 0x37, 0x59, 0x74, 0x6b, 0x39, 0x69, 0x7a, 0x66, 0x51, 0x70, + 0x37, 0x54, 0x39, 0x79, 0x4a, 0x2f, 0x53, 0x66, 0x74, 0x78, 0x72, 0x62, 0x4a, 0x76, 0x68, 0x49, 0x75, 0x63, + 0x2f, 0x41, 0x6f, 0x5a, 0x70, 0x56, 0x64, 0x61, 0x52, 0x37, 0x6a, 0x4e, 0x59, 0x63, 0x62, 0x37, 0x33, 0x6f, + 0x51, 0x5c, 0x0a, + 0x09, 0x63, 0x43, 0x58, 0x32, 0x6e, 0x37, 0x51, 0x4c, 0x41, 0x2b, 0x51, 0x34, 0x50, 0x4c, 0x75, 0x41, 0x65, + 0x2b, 0x38, 0x2f, 0x69, 0x41, 0x64, 0x6e, 0x5a, 0x72, 0x47, 0x77, 0x4f, 0x4d, 0x44, 0x69, 0x59, 0x49, 0x41, + 0x6a, 0x63, 0x77, 0x73, 0x6f, 0x69, 0x54, 0x41, 0x33, 0x76, 0x2b, 0x6a, 0x6c, 0x42, 0x32, 0x43, 0x35, 0x4b, + 0x4c, 0x43, 0x77, 0x4e, 0x49, 0x69, 0x79, 0x30, 0x6d, 0x2b, 0x66, 0x46, 0x75, 0x2f, 0x6f, 0x72, 0x36, 0x35, + 0x52, 0x5c, 0x0a, + 0x09, 0x42, 0x5a, 0x4b, 0x48, 0x35, 0x78, 0x59, 0x41, 0x35, 0x37, 0x42, 0x6c, 0x59, 0x68, 0x7a, 0x73, 0x42, + 0x35, 0x31, 0x5a, 0x58, 0x57, 0x43, 0x73, 0x32, 0x30, 0x4d, 0x6e, 0x39, 0x7a, 0x2f, 0x68, 0x54, 0x6c, 0x55, + 0x62, 0x2f, 0x72, 0x63, 0x42, 0x67, 0x47, 0x36, 0x65, 0x59, 0x33, 0x4b, 0x38, 0x4c, 0x38, 0x59, 0x30, 0x4f, + 0x64, 0x5a, 0x48, 0x48, 0x6e, 0x2b, 0x43, 0x50, 0x4d, 0x50, 0x30, 0x6c, 0x76, 0x70, 0x48, 0x55, 0x48, 0x75, + 0x64, 0x5c, 0x0a, + 0x09, 0x48, 0x4f, 0x50, 0x39, 0x58, 0x6d, 0x78, 0x37, 0x79, 0x2f, 0x67, 0x34, 0x75, 0x74, 0x30, 0x73, 0x36, + 0x6d, 0x6a, 0x58, 0x74, 0x71, 0x33, 0x6f, 0x5a, 0x70, 0x42, 0x5a, 0x6f, 0x78, 0x43, 0x78, 0x71, 0x32, 0x55, + 0x72, 0x67, 0x68, 0x6d, 0x37, 0x72, 0x76, 0x57, 0x68, 0x70, 0x30, 0x47, 0x2b, 0x34, 0x74, 0x51, 0x4e, 0x74, + 0x39, 0x2b, 0x4c, 0x4d, 0x38, 0x37, 0x43, 0x75, 0x74, 0x45, 0x36, 0x41, 0x38, 0x44, 0x56, 0x65, 0x50, 0x6b, + 0x66, 0x5c, 0x0a, + 0x09, 0x2f, 0x4f, 0x58, 0x55, 0x39, 0x35, 0x2f, 0x33, 0x79, 0x48, 0x4b, 0x38, 0x33, 0x38, 0x6b, 0x57, 0x6c, + 0x70, 0x5a, 0x52, 0x6c, 0x47, 0x56, 0x30, 0x72, 0x71, 0x58, 0x42, 0x4d, 0x70, 0x61, 0x4c, 0x41, 0x6f, 0x50, + 0x43, 0x2f, 0x30, 0x6a, 0x6b, 0x30, 0x76, 0x49, 0x51, 0x51, 0x31, 0x66, 0x36, 0x7a, 0x36, 0x4c, 0x41, 0x63, + 0x6c, 0x46, 0x69, 0x71, 0x53, 0x69, 0x67, 0x34, 0x43, 0x41, 0x35, 0x35, 0x74, 0x52, 0x55, 0x52, 0x73, 0x55, + 0x30, 0x5c, 0x0a, + 0x09, 0x73, 0x30, 0x31, 0x64, 0x50, 0x79, 0x33, 0x48, 0x76, 0x34, 0x58, 0x66, 0x71, 0x5a, 0x57, 0x2f, 0x67, + 0x47, 0x50, 0x31, 0x62, 0x37, 0x57, 0x58, 0x74, 0x70, 0x61, 0x4f, 0x49, 0x65, 0x56, 0x57, 0x6e, 0x53, 0x58, + 0x43, 0x33, 0x6c, 0x30, 0x37, 0x38, 0x66, 0x74, 0x76, 0x2b, 0x4b, 0x39, 0x34, 0x78, 0x43, 0x4d, 0x65, 0x42, + 0x71, 0x49, 0x4d, 0x6f, 0x41, 0x77, 0x67, 0x49, 0x4d, 0x74, 0x79, 0x6c, 0x41, 0x42, 0x75, 0x76, 0x66, 0x6c, + 0x57, 0x5c, 0x0a, + 0x09, 0x76, 0x4f, 0x76, 0x64, 0x37, 0x38, 0x55, 0x58, 0x76, 0x76, 0x77, 0x56, 0x4c, 0x41, 0x30, 0x47, 0x47, + 0x42, 0x5a, 0x44, 0x50, 0x4f, 0x2b, 0x48, 0x66, 0x67, 0x69, 0x76, 0x66, 0x4e, 0x57, 0x6c, 0x32, 0x44, 0x6f, + 0x39, 0x37, 0x64, 0x74, 0x32, 0x4a, 0x54, 0x71, 0x35, 0x4e, 0x34, 0x32, 0x33, 0x76, 0x65, 0x39, 0x58, 0x38, + 0x43, 0x2b, 0x66, 0x2b, 0x51, 0x79, 0x6d, 0x74, 0x30, 0x37, 0x68, 0x34, 0x4f, 0x77, 0x73, 0x6c, 0x71, 0x72, + 0x66, 0x5c, 0x0a, + 0x09, 0x34, 0x4c, 0x50, 0x47, 0x59, 0x6f, 0x33, 0x35, 0x61, 0x4d, 0x64, 0x59, 0x31, 0x30, 0x74, 0x6c, 0x71, + 0x66, 0x74, 0x71, 0x30, 0x71, 0x4d, 0x64, 0x65, 0x32, 0x55, 0x62, 0x54, 0x58, 0x61, 0x6a, 0x32, 0x37, 0x50, + 0x37, 0x4a, 0x47, 0x51, 0x45, 0x6a, 0x48, 0x55, 0x37, 0x73, 0x62, 0x39, 0x75, 0x70, 0x34, 0x4e, 0x75, 0x6e, + 0x73, 0x58, 0x79, 0x34, 0x37, 0x30, 0x65, 0x73, 0x73, 0x71, 0x70, 0x2b, 0x37, 0x30, 0x75, 0x63, 0x73, 0x70, + 0x41, 0x5c, 0x0a, + 0x09, 0x35, 0x44, 0x44, 0x52, 0x39, 0x38, 0x42, 0x4d, 0x52, 0x4e, 0x67, 0x79, 0x50, 0x68, 0x5a, 0x39, 0x66, + 0x32, 0x4b, 0x73, 0x44, 0x79, 0x4a, 0x67, 0x66, 0x6e, 0x47, 0x41, 0x38, 0x38, 0x2f, 0x59, 0x74, 0x33, 0x33, + 0x5a, 0x46, 0x54, 0x6a, 0x6a, 0x2b, 0x31, 0x39, 0x67, 0x6a, 0x6d, 0x51, 0x74, 0x61, 0x4e, 0x31, 0x2b, 0x46, + 0x2b, 0x44, 0x6b, 0x38, 0x78, 0x37, 0x6e, 0x4f, 0x77, 0x54, 0x65, 0x36, 0x59, 0x42, 0x58, 0x4e, 0x42, 0x6c, + 0x35, 0x5c, 0x0a, + 0x09, 0x30, 0x37, 0x6b, 0x6d, 0x78, 0x2b, 0x54, 0x58, 0x6d, 0x77, 0x78, 0x75, 0x70, 0x54, 0x4a, 0x57, 0x6e, + 0x53, 0x59, 0x48, 0x48, 0x4e, 0x58, 0x75, 0x4b, 0x42, 0x36, 0x61, 0x6a, 0x4c, 0x57, 0x70, 0x76, 0x74, 0x55, + 0x33, 0x70, 0x37, 0x71, 0x64, 0x32, 0x6d, 0x48, 0x4b, 0x73, 0x73, 0x54, 0x38, 0x2f, 0x42, 0x77, 0x65, 0x64, + 0x76, 0x4c, 0x4a, 0x2b, 0x50, 0x4b, 0x6e, 0x50, 0x32, 0x37, 0x57, 0x6d, 0x7a, 0x31, 0x79, 0x42, 0x49, 0x2b, + 0x35, 0x5c, 0x0a, + 0x09, 0x38, 0x43, 0x49, 0x63, 0x6d, 0x5a, 0x50, 0x37, 0x73, 0x58, 0x37, 0x72, 0x4e, 0x61, 0x2f, 0x42, 0x53, + 0x33, 0x2f, 0x32, 0x4a, 0x65, 0x4c, 0x63, 0x2f, 0x50, 0x77, 0x38, 0x54, 0x6a, 0x2f, 0x2f, 0x51, 0x69, 0x77, + 0x4d, 0x42, 0x68, 0x6a, 0x72, 0x39, 0x39, 0x48, 0x74, 0x39, 0x52, 0x67, 0x2f, 0x64, 0x62, 0x2f, 0x79, 0x7a, + 0x4d, 0x70, 0x41, 0x4e, 0x71, 0x70, 0x4f, 0x45, 0x39, 0x58, 0x6c, 0x36, 0x70, 0x4a, 0x32, 0x4f, 0x37, 0x4b, + 0x6c, 0x5c, 0x0a, + 0x09, 0x55, 0x53, 0x44, 0x42, 0x48, 0x56, 0x75, 0x44, 0x52, 0x4e, 0x32, 0x75, 0x48, 0x47, 0x63, 0x54, 0x47, + 0x45, 0x6b, 0x75, 0x5a, 0x42, 0x6e, 0x4a, 0x58, 0x38, 0x6f, 0x58, 0x61, 0x2b, 0x4d, 0x54, 0x70, 0x2b, 0x7a, + 0x61, 0x38, 0x5a, 0x39, 0x75, 0x76, 0x65, 0x39, 0x42, 0x33, 0x48, 0x37, 0x56, 0x6c, 0x37, 0x41, 0x65, 0x74, + 0x43, 0x35, 0x72, 0x41, 0x4b, 0x64, 0x55, 0x7a, 0x67, 0x2f, 0x67, 0x42, 0x77, 0x46, 0x36, 0x68, 0x54, 0x46, + 0x77, 0x5c, 0x0a, + 0x09, 0x51, 0x51, 0x54, 0x2b, 0x53, 0x37, 0x31, 0x55, 0x52, 0x59, 0x4b, 0x36, 0x54, 0x6d, 0x70, 0x59, 0x54, + 0x53, 0x33, 0x78, 0x4d, 0x76, 0x58, 0x2f, 0x31, 0x6a, 0x58, 0x65, 0x4e, 0x6a, 0x38, 0x76, 0x66, 0x7a, 0x5a, + 0x4d, 0x6b, 0x6a, 0x4d, 0x2b, 0x43, 0x64, 0x49, 0x45, 0x75, 0x57, 0x48, 0x57, 0x42, 0x70, 0x6f, 0x61, 0x4a, + 0x4b, 0x6e, 0x36, 0x6d, 0x6c, 0x50, 0x48, 0x2f, 0x69, 0x54, 0x66, 0x6c, 0x54, 0x4f, 0x55, 0x4a, 0x65, 0x59, + 0x58, 0x5c, 0x0a, + 0x09, 0x46, 0x75, 0x43, 0x63, 0x77, 0x2f, 0x57, 0x33, 0x33, 0x59, 0x59, 0x2f, 0x66, 0x76, 0x2b, 0x66, 0x6d, + 0x32, 0x50, 0x39, 0x71, 0x37, 0x2f, 0x36, 0x36, 0x2f, 0x69, 0x72, 0x4f, 0x35, 0x7a, 0x37, 0x4e, 0x37, 0x7a, + 0x35, 0x7a, 0x66, 0x6a, 0x73, 0x5a, 0x7a, 0x38, 0x6e, 0x79, 0x72, 0x37, 0x2b, 0x76, 0x2f, 0x30, 0x75, 0x46, + 0x67, 0x59, 0x2b, 0x6a, 0x56, 0x38, 0x61, 0x4c, 0x46, 0x55, 0x2f, 0x66, 0x53, 0x37, 0x64, 0x52, 0x50, 0x4e, + 0x66, 0x5c, 0x0a, + 0x09, 0x38, 0x30, 0x62, 0x73, 0x2f, 0x33, 0x72, 0x38, 0x41, 0x4e, 0x67, 0x35, 0x4c, 0x62, 0x75, 0x36, 0x4c, + 0x4b, 0x6c, 0x79, 0x6d, 0x6c, 0x2b, 0x74, 0x72, 0x7a, 0x52, 0x49, 0x70, 0x4b, 0x37, 0x5a, 0x44, 0x4b, 0x61, + 0x32, 0x38, 0x34, 0x64, 0x72, 0x4b, 0x6f, 0x46, 0x50, 0x39, 0x4f, 0x42, 0x47, 0x48, 0x73, 0x6d, 0x78, 0x57, + 0x2f, 0x56, 0x59, 0x65, 0x78, 0x66, 0x66, 0x65, 0x74, 0x2b, 0x44, 0x4c, 0x77, 0x62, 0x71, 0x67, 0x4c, 0x6e, + 0x57, 0x5c, 0x0a, + 0x09, 0x74, 0x4f, 0x59, 0x5a, 0x77, 0x43, 0x6e, 0x6e, 0x50, 0x53, 0x34, 0x6f, 0x35, 0x31, 0x51, 0x41, 0x56, + 0x7a, 0x72, 0x34, 0x78, 0x78, 0x35, 0x48, 0x49, 0x32, 0x4b, 0x4b, 0x34, 0x6a, 0x44, 0x4f, 0x63, 0x32, 0x71, + 0x4f, 0x33, 0x73, 0x30, 0x52, 0x6f, 0x53, 0x6c, 0x56, 0x58, 0x54, 0x6e, 0x71, 0x6a, 0x75, 0x72, 0x44, 0x6a, + 0x68, 0x6a, 0x63, 0x2b, 0x62, 0x55, 0x52, 0x57, 0x35, 0x45, 0x74, 0x35, 0x59, 0x48, 0x2f, 0x50, 0x70, 0x37, + 0x69, 0x5c, 0x0a, + 0x09, 0x71, 0x79, 0x77, 0x78, 0x74, 0x37, 0x44, 0x67, 0x66, 0x36, 0x4b, 0x63, 0x2f, 0x50, 0x57, 0x70, 0x69, + 0x55, 0x6c, 0x38, 0x36, 0x79, 0x75, 0x66, 0x52, 0x37, 0x66, 0x6e, 0x35, 0x37, 0x59, 0x42, 0x36, 0x5a, 0x2f, + 0x37, 0x76, 0x42, 0x2f, 0x42, 0x6c, 0x37, 0x37, 0x32, 0x56, 0x62, 0x50, 0x6e, 0x37, 0x56, 0x4e, 0x62, 0x38, + 0x61, 0x2b, 0x66, 0x2f, 0x77, 0x4b, 0x79, 0x4c, 0x45, 0x4f, 0x57, 0x45, 0x38, 0x34, 0x2b, 0x2f, 0x77, 0x49, + 0x63, 0x5c, 0x0a, + 0x09, 0x6e, 0x70, 0x2b, 0x50, 0x55, 0x39, 0x59, 0x38, 0x79, 0x7a, 0x41, 0x78, 0x4d, 0x5a, 0x6b, 0x77, 0x6f, + 0x4d, 0x66, 0x49, 0x2b, 0x57, 0x79, 0x4b, 0x6e, 0x4c, 0x79, 0x75, 0x70, 0x51, 0x75, 0x77, 0x74, 0x6c, 0x62, + 0x4b, 0x4a, 0x47, 0x79, 0x39, 0x72, 0x5a, 0x53, 0x50, 0x48, 0x46, 0x56, 0x45, 0x58, 0x73, 0x45, 0x65, 0x52, + 0x32, 0x56, 0x75, 0x54, 0x62, 0x2b, 0x47, 0x62, 0x50, 0x55, 0x76, 0x64, 0x4c, 0x38, 0x41, 0x34, 0x4c, 0x45, + 0x41, 0x5c, 0x0a, + 0x09, 0x72, 0x69, 0x55, 0x41, 0x74, 0x36, 0x31, 0x78, 0x4a, 0x72, 0x41, 0x75, 0x47, 0x51, 0x41, 0x42, 0x48, + 0x51, 0x66, 0x38, 0x4e, 0x55, 0x44, 0x62, 0x4f, 0x52, 0x4c, 0x7a, 0x4b, 0x41, 0x39, 0x77, 0x67, 0x61, 0x53, + 0x70, 0x5a, 0x58, 0x43, 0x72, 0x46, 0x44, 0x58, 0x54, 0x2b, 0x43, 0x41, 0x6a, 0x67, 0x78, 0x4f, 0x6f, 0x4c, + 0x65, 0x4e, 0x72, 0x58, 0x56, 0x64, 0x48, 0x49, 0x34, 0x6e, 0x59, 0x5a, 0x4b, 0x69, 0x79, 0x6d, 0x66, 0x4f, + 0x6d, 0x5c, 0x0a, + 0x09, 0x62, 0x4d, 0x4c, 0x46, 0x66, 0x35, 0x62, 0x42, 0x70, 0x61, 0x44, 0x41, 0x2b, 0x32, 0x33, 0x36, 0x5a, + 0x64, 0x33, 0x53, 0x75, 0x64, 0x72, 0x35, 0x51, 0x31, 0x30, 0x48, 0x7a, 0x4d, 0x7a, 0x4e, 0x34, 0x68, 0x64, + 0x65, 0x2f, 0x65, 0x76, 0x34, 0x78, 0x72, 0x30, 0x7a, 0x2b, 0x4d, 0x61, 0x39, 0x4d, 0x37, 0x6a, 0x6d, 0x6e, + 0x6f, 0x4f, 0x34, 0x35, 0x74, 0x34, 0x5a, 0x44, 0x4d, 0x6f, 0x51, 0x78, 0x56, 0x50, 0x54, 0x6e, 0x6c, 0x74, + 0x63, 0x5c, 0x0a, + 0x09, 0x77, 0x70, 0x32, 0x7a, 0x53, 0x37, 0x68, 0x74, 0x5a, 0x67, 0x36, 0x2f, 0x2f, 0x65, 0x59, 0x2f, 0x77, + 0x4f, 0x48, 0x35, 0x65, 0x64, 0x2b, 0x7a, 0x41, 0x34, 0x68, 0x51, 0x72, 0x64, 0x63, 0x73, 0x43, 0x75, 0x6e, + 0x70, 0x6a, 0x4d, 0x62, 0x4f, 0x41, 0x35, 0x72, 0x6b, 0x78, 0x6b, 0x76, 0x4c, 0x48, 0x45, 0x33, 0x4c, 0x70, + 0x4f, 0x35, 0x50, 0x79, 0x71, 0x55, 0x5a, 0x74, 0x45, 0x4e, 0x64, 0x78, 0x34, 0x36, 0x6b, 0x62, 0x70, 0x75, + 0x6a, 0x5c, 0x0a, + 0x09, 0x76, 0x6b, 0x56, 0x53, 0x30, 0x36, 0x6b, 0x46, 0x36, 0x63, 0x78, 0x47, 0x74, 0x74, 0x49, 0x55, 0x56, + 0x44, 0x69, 0x50, 0x56, 0x64, 0x76, 0x6a, 0x42, 0x50, 0x77, 0x4e, 0x41, 0x52, 0x4e, 0x72, 0x47, 0x35, 0x6f, + 0x39, 0x72, 0x53, 0x6b, 0x41, 0x68, 0x4f, 0x67, 0x50, 0x34, 0x50, 0x55, 0x41, 0x4c, 0x74, 0x41, 0x4b, 0x72, + 0x5a, 0x55, 0x69, 0x55, 0x7a, 0x43, 0x4e, 0x71, 0x76, 0x77, 0x63, 0x49, 0x4a, 0x56, 0x67, 0x4f, 0x5a, 0x77, + 0x56, 0x5c, 0x0a, + 0x09, 0x4c, 0x57, 0x6f, 0x46, 0x2b, 0x4e, 0x5a, 0x53, 0x35, 0x37, 0x53, 0x6a, 0x62, 0x75, 0x69, 0x44, 0x67, + 0x35, 0x5a, 0x74, 0x4d, 0x44, 0x55, 0x63, 0x68, 0x66, 0x5a, 0x30, 0x32, 0x6d, 0x63, 0x5a, 0x7a, 0x69, 0x6a, + 0x44, 0x43, 0x48, 0x78, 0x61, 0x55, 0x63, 0x6c, 0x56, 0x42, 0x2f, 0x50, 0x4d, 0x2b, 0x51, 0x47, 0x77, 0x4f, + 0x36, 0x65, 0x45, 0x76, 0x2f, 0x2f, 0x59, 0x78, 0x33, 0x44, 0x77, 0x2f, 0x76, 0x74, 0x5a, 0x78, 0x52, 0x4c, + 0x50, 0x5c, 0x0a, + 0x09, 0x2b, 0x62, 0x45, 0x66, 0x4e, 0x33, 0x6a, 0x33, 0x64, 0x4d, 0x61, 0x42, 0x41, 0x35, 0x34, 0x6e, 0x79, + 0x76, 0x43, 0x68, 0x44, 0x2f, 0x38, 0x76, 0x77, 0x57, 0x46, 0x6f, 0x74, 0x78, 0x67, 0x75, 0x49, 0x36, 0x78, + 0x71, 0x42, 0x39, 0x31, 0x4a, 0x66, 0x66, 0x43, 0x32, 0x74, 0x62, 0x37, 0x54, 0x47, 0x46, 0x33, 0x4c, 0x4a, + 0x4d, 0x31, 0x2b, 0x4c, 0x4c, 0x32, 0x47, 0x55, 0x70, 0x61, 0x75, 0x6f, 0x4d, 0x70, 0x70, 0x76, 0x72, 0x6a, + 0x4d, 0x5c, 0x0a, + 0x09, 0x30, 0x34, 0x69, 0x64, 0x39, 0x70, 0x66, 0x32, 0x54, 0x4d, 0x6d, 0x31, 0x70, 0x67, 0x77, 0x6e, 0x4c, + 0x5a, 0x6e, 0x61, 0x68, 0x58, 0x57, 0x39, 0x71, 0x6e, 0x2b, 0x57, 0x41, 0x2f, 0x34, 0x48, 0x49, 0x4b, 0x62, + 0x50, 0x61, 0x30, 0x4a, 0x72, 0x42, 0x67, 0x41, 0x6e, 0x31, 0x36, 0x6e, 0x2f, 0x45, 0x78, 0x7a, 0x77, 0x47, + 0x71, 0x30, 0x77, 0x79, 0x79, 0x6b, 0x41, 0x62, 0x53, 0x4a, 0x70, 0x75, 0x73, 0x58, 0x4c, 0x42, 0x45, 0x46, + 0x62, 0x5c, 0x0a, + 0x09, 0x4b, 0x61, 0x47, 0x75, 0x7a, 0x36, 0x4d, 0x64, 0x4e, 0x79, 0x51, 0x4c, 0x63, 0x4f, 0x6f, 0x32, 0x6e, + 0x4c, 0x69, 0x6d, 0x77, 0x53, 0x41, 0x6c, 0x65, 0x36, 0x32, 0x43, 0x31, 0x48, 0x58, 0x62, 0x45, 0x48, 0x67, + 0x38, 0x74, 0x59, 0x33, 0x55, 0x36, 0x41, 0x35, 0x5a, 0x6c, 0x71, 0x6d, 0x37, 0x54, 0x6e, 0x57, 0x74, 0x35, + 0x65, 0x55, 0x68, 0x2f, 0x76, 0x75, 0x62, 0x33, 0x67, 0x6a, 0x6e, 0x79, 0x75, 0x71, 0x4f, 0x41, 0x4f, 0x47, + 0x43, 0x5c, 0x0a, + 0x09, 0x4a, 0x7a, 0x38, 0x4e, 0x35, 0x7a, 0x2f, 0x36, 0x66, 0x4c, 0x4f, 0x48, 0x43, 0x37, 0x2f, 0x76, 0x4b, + 0x58, 0x41, 0x41, 0x4c, 0x76, 0x2f, 0x6f, 0x52, 0x2f, 0x46, 0x41, 0x2f, 0x42, 0x56, 0x65, 0x56, 0x73, 0x59, + 0x42, 0x45, 0x2b, 0x4d, 0x54, 0x63, 0x43, 0x53, 0x6a, 0x4e, 0x65, 0x39, 0x5a, 0x36, 0x31, 0x4f, 0x4f, 0x33, + 0x35, 0x6d, 0x79, 0x56, 0x6b, 0x4e, 0x4b, 0x64, 0x47, 0x49, 0x42, 0x4f, 0x6a, 0x2f, 0x6d, 0x75, 0x76, 0x4c, + 0x66, 0x5c, 0x0a, + 0x09, 0x4e, 0x58, 0x2b, 0x6b, 0x64, 0x43, 0x46, 0x72, 0x4e, 0x6a, 0x6b, 0x6f, 0x6e, 0x33, 0x35, 0x49, 0x59, + 0x4a, 0x4d, 0x52, 0x58, 0x6f, 0x4e, 0x39, 0x34, 0x47, 0x65, 0x6c, 0x37, 0x49, 0x66, 0x58, 0x54, 0x38, 0x76, + 0x51, 0x7a, 0x78, 0x48, 0x77, 0x77, 0x77, 0x35, 0x72, 0x75, 0x78, 0x36, 0x77, 0x31, 0x6c, 0x4f, 0x41, 0x4b, + 0x51, 0x41, 0x66, 0x6f, 0x4b, 0x71, 0x66, 0x5a, 0x6f, 0x4d, 0x6d, 0x59, 0x53, 0x6a, 0x38, 0x30, 0x34, 0x71, + 0x61, 0x5c, 0x0a, + 0x09, 0x4f, 0x73, 0x72, 0x6f, 0x44, 0x4d, 0x47, 0x69, 0x4f, 0x6c, 0x4b, 0x6c, 0x61, 0x57, 0x6e, 0x54, 0x63, + 0x52, 0x4d, 0x77, 0x70, 0x47, 0x6c, 0x67, 0x62, 0x59, 0x49, 0x36, 0x45, 0x6b, 0x71, 0x65, 0x6e, 0x46, 0x6d, + 0x2f, 0x6a, 0x71, 0x51, 0x75, 0x4d, 0x61, 0x54, 0x41, 0x73, 0x32, 0x34, 0x76, 0x39, 0x44, 0x6b, 0x78, 0x4e, + 0x6f, 0x59, 0x38, 0x34, 0x33, 0x64, 0x7a, 0x4b, 0x58, 0x34, 0x51, 0x41, 0x5a, 0x2f, 0x37, 0x30, 0x70, 0x64, + 0x77, 0x5c, 0x0a, + 0x09, 0x32, 0x38, 0x32, 0x33, 0x69, 0x47, 0x75, 0x2f, 0x2b, 0x47, 0x75, 0x76, 0x78, 0x65, 0x54, 0x45, 0x42, + 0x44, 0x68, 0x4e, 0x54, 0x6b, 0x7a, 0x67, 0x36, 0x63, 0x39, 0x35, 0x48, 0x67, 0x6a, 0x41, 0x6e, 0x2f, 0x37, + 0x5a, 0x6e, 0x38, 0x69, 0x6f, 0x58, 0x54, 0x55, 0x35, 0x31, 0x75, 0x38, 0x6a, 0x7a, 0x33, 0x4d, 0x68, 0x48, + 0x7a, 0x33, 0x47, 0x6c, 0x45, 0x2b, 0x62, 0x39, 0x4f, 0x4b, 0x71, 0x42, 0x4f, 0x62, 0x36, 0x76, 0x4f, 0x56, + 0x45, 0x5c, 0x0a, + 0x09, 0x64, 0x67, 0x59, 0x6d, 0x75, 0x65, 0x41, 0x36, 0x73, 0x4f, 0x39, 0x56, 0x49, 0x4a, 0x46, 0x33, 0x57, + 0x71, 0x4c, 0x2b, 0x7a, 0x75, 0x4f, 0x39, 0x74, 0x73, 0x6e, 0x36, 0x75, 0x77, 0x77, 0x79, 0x4b, 0x62, 0x2b, + 0x6b, 0x76, 0x71, 0x63, 0x5a, 0x44, 0x79, 0x2f, 0x6c, 0x67, 0x50, 0x63, 0x44, 0x32, 0x49, 0x55, 0x31, 0x70, + 0x44, 0x55, 0x42, 0x41, 0x4a, 0x61, 0x32, 0x2f, 0x43, 0x36, 0x41, 0x76, 0x65, 0x47, 0x4c, 0x54, 0x6f, 0x74, + 0x71, 0x5c, 0x0a, + 0x09, 0x70, 0x63, 0x74, 0x55, 0x6b, 0x58, 0x38, 0x47, 0x6b, 0x56, 0x74, 0x52, 0x67, 0x4b, 0x41, 0x56, 0x55, + 0x46, 0x4e, 0x54, 0x31, 0x4e, 0x44, 0x6d, 0x6b, 0x46, 0x4c, 0x4b, 0x59, 0x35, 0x4d, 0x52, 0x61, 0x77, 0x50, + 0x54, 0x64, 0x79, 0x4d, 0x34, 0x2f, 0x32, 0x6b, 0x64, 0x75, 0x32, 0x63, 0x72, 0x55, 0x74, 0x6d, 0x4c, 0x66, + 0x2f, 0x55, 0x34, 0x4a, 0x73, 0x62, 0x48, 0x68, 0x57, 0x4f, 0x47, 0x6a, 0x70, 0x30, 0x44, 0x43, 0x6c, 0x66, + 0x69, 0x5c, 0x0a, + 0x09, 0x37, 0x57, 0x2f, 0x35, 0x50, 0x5a, 0x38, 0x46, 0x41, 0x48, 0x43, 0x75, 0x78, 0x41, 0x6d, 0x6e, 0x37, + 0x73, 0x56, 0x50, 0x76, 0x4f, 0x53, 0x6c, 0x6f, 0x73, 0x58, 0x48, 0x58, 0x2f, 0x51, 0x45, 0x62, 0x4a, 0x6d, + 0x61, 0x78, 0x72, 0x56, 0x66, 0x2b, 0x78, 0x70, 0x75, 0x76, 0x66, 0x4f, 0x75, 0x68, 0x4d, 0x46, 0x75, 0x74, + 0x34, 0x74, 0x65, 0x74, 0x61, 0x43, 0x34, 0x6b, 0x71, 0x79, 0x74, 0x72, 0x49, 0x31, 0x48, 0x35, 0x2f, 0x53, + 0x63, 0x5c, 0x0a, + 0x09, 0x2f, 0x63, 0x66, 0x62, 0x74, 0x7a, 0x49, 0x71, 0x4c, 0x6e, 0x57, 0x39, 0x57, 0x4a, 0x68, 0x47, 0x5a, + 0x4e, 0x75, 0x4a, 0x39, 0x56, 0x69, 0x61, 0x2b, 0x4e, 0x64, 0x6a, 0x6c, 0x59, 0x42, 0x56, 0x63, 0x79, 0x53, + 0x64, 0x6d, 0x43, 0x42, 0x44, 0x54, 0x6e, 0x71, 0x33, 0x77, 0x51, 0x62, 0x4b, 0x43, 0x43, 0x63, 0x37, 0x43, + 0x58, 0x67, 0x58, 0x41, 0x4a, 0x78, 0x79, 0x33, 0x76, 0x64, 0x69, 0x4c, 0x57, 0x6a, 0x56, 0x41, 0x59, 0x43, + 0x6c, 0x5c, 0x0a, + 0x09, 0x2f, 0x6b, 0x38, 0x42, 0x38, 0x44, 0x4b, 0x41, 0x43, 0x31, 0x45, 0x65, 0x61, 0x55, 0x63, 0x4f, 0x33, + 0x37, 0x54, 0x67, 0x72, 0x62, 0x54, 0x62, 0x64, 0x6d, 0x49, 0x79, 0x6a, 0x6d, 0x77, 0x44, 0x30, 0x6d, 0x6c, + 0x62, 0x66, 0x54, 0x35, 0x64, 0x48, 0x34, 0x43, 0x71, 0x59, 0x77, 0x47, 0x43, 0x42, 0x6a, 0x49, 0x35, 0x70, + 0x68, 0x52, 0x30, 0x67, 0x6f, 0x6f, 0x74, 0x41, 0x36, 0x76, 0x37, 0x63, 0x67, 0x6d, 0x6f, 0x63, 0x46, 0x35, + 0x43, 0x5c, 0x0a, + 0x09, 0x65, 0x5a, 0x44, 0x50, 0x42, 0x43, 0x6a, 0x4c, 0x5a, 0x43, 0x45, 0x34, 0x4f, 0x4f, 0x66, 0x77, 0x70, + 0x53, 0x75, 0x76, 0x78, 0x41, 0x33, 0x66, 0x2b, 0x45, 0x5a, 0x39, 0x69, 0x54, 0x4a, 0x73, 0x6e, 0x64, 0x6f, + 0x71, 0x57, 0x68, 0x34, 0x4d, 0x2f, 0x43, 0x37, 0x4b, 0x39, 0x37, 0x33, 0x37, 0x58, 0x53, 0x6a, 0x4b, 0x38, + 0x4c, 0x69, 0x47, 0x37, 0x36, 0x57, 0x54, 0x35, 0x52, 0x6a, 0x76, 0x6a, 0x37, 0x45, 0x7a, 0x64, 0x6d, 0x59, + 0x47, 0x5c, 0x0a, + 0x09, 0x34, 0x33, 0x74, 0x36, 0x47, 0x7a, 0x58, 0x49, 0x6c, 0x7a, 0x74, 0x73, 0x43, 0x67, 0x70, 0x4e, 0x49, + 0x4a, 0x33, 0x61, 0x51, 0x56, 0x70, 0x53, 0x36, 0x30, 0x69, 0x57, 0x53, 0x4f, 0x57, 0x5a, 0x42, 0x70, 0x7a, + 0x6d, 0x30, 0x6a, 0x71, 0x44, 0x43, 0x36, 0x76, 0x39, 0x54, 0x70, 0x7a, 0x6e, 0x77, 0x4d, 0x33, 0x7a, 0x75, + 0x39, 0x48, 0x32, 0x77, 0x38, 0x64, 0x55, 0x31, 0x38, 0x4c, 0x7a, 0x43, 0x66, 0x52, 0x63, 0x42, 0x37, 0x63, + 0x6d, 0x5c, 0x0a, + 0x09, 0x55, 0x34, 0x47, 0x31, 0x6d, 0x67, 0x4c, 0x30, 0x41, 0x50, 0x77, 0x52, 0x59, 0x4b, 0x63, 0x34, 0x51, + 0x42, 0x6f, 0x4a, 0x72, 0x47, 0x67, 0x71, 0x68, 0x52, 0x7a, 0x71, 0x4e, 0x54, 0x76, 0x78, 0x61, 0x46, 0x57, + 0x6e, 0x62, 0x71, 0x33, 0x76, 0x4e, 0x2f, 0x4e, 0x53, 0x6f, 0x77, 0x78, 0x51, 0x47, 0x34, 0x72, 0x64, 0x68, + 0x70, 0x30, 0x33, 0x61, 0x47, 0x43, 0x77, 0x44, 0x4e, 0x55, 0x78, 0x33, 0x6b, 0x49, 0x5a, 0x57, 0x34, 0x62, + 0x73, 0x5c, 0x0a, + 0x09, 0x58, 0x4a, 0x5a, 0x68, 0x63, 0x6e, 0x77, 0x63, 0x47, 0x54, 0x39, 0x5a, 0x37, 0x59, 0x45, 0x76, 0x48, + 0x66, 0x44, 0x4f, 0x74, 0x37, 0x37, 0x56, 0x31, 0x36, 0x45, 0x4d, 0x7a, 0x70, 0x58, 0x34, 0x36, 0x68, 0x65, + 0x2f, 0x4b, 0x4f, 0x44, 0x34, 0x47, 0x39, 0x64, 0x65, 0x69, 0x37, 0x74, 0x75, 0x76, 0x77, 0x31, 0x58, 0x66, + 0x65, 0x4d, 0x62, 0x64, 0x63, 0x74, 0x45, 0x79, 0x49, 0x67, 0x77, 0x50, 0x6a, 0x59, 0x47, 0x30, 0x4d, 0x72, + 0x47, 0x5c, 0x0a, + 0x09, 0x79, 0x78, 0x32, 0x36, 0x50, 0x75, 0x2f, 0x4d, 0x73, 0x76, 0x55, 0x34, 0x77, 0x78, 0x68, 0x72, 0x71, + 0x59, 0x32, 0x4f, 0x2b, 0x46, 0x4c, 0x2b, 0x6c, 0x73, 0x78, 0x31, 0x41, 0x4a, 0x48, 0x31, 0x6e, 0x61, 0x45, + 0x2f, 0x32, 0x31, 0x4b, 0x73, 0x49, 0x4d, 0x48, 0x62, 0x31, 0x2b, 0x4d, 0x6a, 0x79, 0x44, 0x37, 0x34, 0x4f, + 0x4d, 0x4e, 0x31, 0x76, 0x59, 0x69, 0x73, 0x78, 0x77, 0x46, 0x52, 0x4e, 0x73, 0x72, 0x6e, 0x6e, 0x56, 0x69, + 0x6a, 0x5c, 0x0a, + 0x09, 0x35, 0x77, 0x52, 0x57, 0x46, 0x51, 0x42, 0x4f, 0x71, 0x58, 0x66, 0x37, 0x58, 0x51, 0x70, 0x67, 0x76, + 0x7a, 0x5a, 0x63, 0x4f, 0x55, 0x69, 0x6e, 0x6c, 0x4b, 0x63, 0x46, 0x7a, 0x38, 0x30, 0x7a, 0x7a, 0x52, 0x78, + 0x53, 0x51, 0x4c, 0x41, 0x53, 0x4f, 0x6d, 0x35, 0x49, 0x55, 0x75, 0x7a, 0x63, 0x52, 0x45, 0x4d, 0x45, 0x34, + 0x69, 0x6c, 0x64, 0x65, 0x6e, 0x74, 0x4c, 0x4c, 0x74, 0x44, 0x70, 0x73, 0x61, 0x56, 0x4b, 0x74, 0x61, 0x63, + 0x61, 0x5c, 0x0a, + 0x09, 0x61, 0x5a, 0x54, 0x68, 0x57, 0x32, 0x5a, 0x34, 0x4f, 0x62, 0x76, 0x2b, 0x79, 0x47, 0x69, 0x62, 0x5a, + 0x52, 0x67, 0x62, 0x47, 0x36, 0x39, 0x37, 0x69, 0x51, 0x30, 0x34, 0x66, 0x4f, 0x33, 0x61, 0x61, 0x2f, 0x43, + 0x64, 0x36, 0x37, 0x38, 0x46, 0x35, 0x2f, 0x77, 0x64, 0x67, 0x32, 0x39, 0x2b, 0x34, 0x31, 0x72, 0x77, 0x38, + 0x64, 0x39, 0x37, 0x2f, 0x33, 0x31, 0x34, 0x31, 0x39, 0x76, 0x65, 0x69, 0x6d, 0x47, 0x31, 0x31, 0x54, 0x65, + 0x30, 0x5c, 0x0a, + 0x09, 0x50, 0x54, 0x59, 0x2b, 0x44, 0x6d, 0x53, 0x5a, 0x45, 0x5a, 0x6d, 0x62, 0x62, 0x34, 0x31, 0x79, 0x47, + 0x4c, 0x41, 0x63, 0x4d, 0x5a, 0x53, 0x51, 0x33, 0x31, 0x31, 0x53, 0x54, 0x67, 0x4f, 0x39, 0x76, 0x65, 0x47, + 0x4c, 0x75, 0x55, 0x6c, 0x44, 0x41, 0x4c, 0x44, 0x41, 0x51, 0x6b, 0x74, 0x62, 0x66, 0x37, 0x4e, 0x73, 0x31, + 0x78, 0x71, 0x50, 0x46, 0x5a, 0x6a, 0x30, 0x64, 0x54, 0x31, 0x4f, 0x69, 0x77, 0x39, 0x65, 0x54, 0x67, 0x63, + 0x51, 0x5c, 0x0a, + 0x09, 0x42, 0x35, 0x78, 0x41, 0x77, 0x47, 0x75, 0x42, 0x31, 0x56, 0x38, 0x51, 0x58, 0x46, 0x55, 0x41, 0x71, + 0x41, 0x61, 0x78, 0x78, 0x77, 0x47, 0x2f, 0x72, 0x71, 0x39, 0x5a, 0x77, 0x74, 0x4c, 0x58, 0x77, 0x2b, 0x63, + 0x6f, 0x51, 0x30, 0x6c, 0x54, 0x77, 0x50, 0x44, 0x70, 0x7a, 0x59, 0x51, 0x4c, 0x7a, 0x7a, 0x49, 0x2b, 0x4f, + 0x34, 0x4a, 0x70, 0x46, 0x4c, 0x66, 0x63, 0x72, 0x38, 0x62, 0x37, 0x4e, 0x50, 0x4d, 0x59, 0x48, 0x61, 0x45, + 0x31, 0x5c, 0x0a, + 0x09, 0x57, 0x59, 0x62, 0x50, 0x46, 0x78, 0x41, 0x44, 0x49, 0x4e, 0x69, 0x5a, 0x68, 0x46, 0x77, 0x77, 0x6c, + 0x65, 0x6b, 0x6f, 0x30, 0x4f, 0x6c, 0x30, 0x4b, 0x78, 0x44, 0x77, 0x49, 0x77, 0x6b, 0x50, 0x32, 0x4a, 0x51, + 0x4f, 0x2b, 0x4a, 0x50, 0x33, 0x76, 0x41, 0x64, 0x45, 0x47, 0x51, 0x37, 0x64, 0x66, 0x7a, 0x2f, 0x75, 0x76, + 0x50, 0x4e, 0x4f, 0x61, 0x4d, 0x6c, 0x2b, 0x34, 0x53, 0x76, 0x2f, 0x35, 0x6f, 0x2b, 0x71, 0x30, 0x2f, 0x33, + 0x2b, 0x5c, 0x0a, + 0x09, 0x47, 0x44, 0x70, 0x35, 0x62, 0x68, 0x70, 0x31, 0x55, 0x2b, 0x6f, 0x4e, 0x53, 0x50, 0x6c, 0x77, 0x4a, + 0x7a, 0x67, 0x61, 0x4d, 0x4c, 0x43, 0x69, 0x65, 0x39, 0x32, 0x4f, 0x64, 0x63, 0x73, 0x33, 0x35, 0x57, 0x5a, + 0x55, 0x50, 0x79, 0x6b, 0x41, 0x31, 0x2b, 0x57, 0x34, 0x6a, 0x56, 0x68, 0x6a, 0x67, 0x43, 0x71, 0x6a, 0x36, + 0x7a, 0x58, 0x33, 0x54, 0x36, 0x59, 0x63, 0x41, 0x6b, 0x77, 0x47, 0x63, 0x4e, 0x4d, 0x77, 0x70, 0x4f, 0x7a, + 0x73, 0x5c, 0x0a, + 0x09, 0x55, 0x67, 0x43, 0x6e, 0x47, 0x36, 0x7a, 0x2f, 0x75, 0x32, 0x6a, 0x56, 0x41, 0x43, 0x41, 0x73, 0x55, + 0x6a, 0x6a, 0x67, 0x31, 0x51, 0x43, 0x32, 0x36, 0x6b, 0x48, 0x57, 0x2f, 0x2f, 0x75, 0x6a, 0x4a, 0x73, 0x4f, + 0x6f, 0x53, 0x36, 0x52, 0x4f, 0x78, 0x6f, 0x2b, 0x62, 0x6f, 0x72, 0x45, 0x76, 0x55, 0x78, 0x73, 0x4b, 0x78, + 0x48, 0x6c, 0x74, 0x42, 0x4a, 0x4b, 0x76, 0x2b, 0x6c, 0x4f, 0x36, 0x6e, 0x2b, 0x58, 0x73, 0x54, 0x57, 0x33, + 0x7a, 0x5c, 0x0a, + 0x09, 0x53, 0x47, 0x47, 0x68, 0x75, 0x6a, 0x51, 0x75, 0x53, 0x73, 0x37, 0x72, 0x4d, 0x65, 0x68, 0x65, 0x6d, + 0x32, 0x35, 0x4e, 0x31, 0x52, 0x48, 0x5a, 0x6f, 0x64, 0x76, 0x74, 0x6f, 0x74, 0x2f, 0x72, 0x2b, 0x58, 0x4f, + 0x73, 0x30, 0x47, 0x65, 0x75, 0x75, 0x41, 0x4c, 0x33, 0x33, 0x33, 0x4d, 0x33, 0x72, 0x76, 0x7a, 0x79, 0x46, + 0x78, 0x56, 0x55, 0x41, 0x75, 0x6a, 0x31, 0x73, 0x54, 0x52, 0x59, 0x38, 0x6a, 0x30, 0x37, 0x76, 0x2b, 0x6a, + 0x58, 0x5c, 0x0a, + 0x09, 0x37, 0x58, 0x5a, 0x5a, 0x36, 0x7a, 0x4c, 0x62, 0x30, 0x6d, 0x44, 0x56, 0x6c, 0x4d, 0x6f, 0x32, 0x36, + 0x64, 0x69, 0x4a, 0x36, 0x7a, 0x6f, 0x66, 0x30, 0x32, 0x4f, 0x79, 0x49, 0x71, 0x6b, 0x64, 0x50, 0x54, 0x6d, + 0x2f, 0x2b, 0x6c, 0x6f, 0x54, 0x49, 0x4d, 0x73, 0x65, 0x6d, 0x36, 0x36, 0x6b, 0x5a, 0x41, 0x55, 0x78, 0x4b, + 0x33, 0x74, 0x49, 0x4e, 0x63, 0x55, 0x42, 0x58, 0x6d, 0x65, 0x6a, 0x30, 0x6a, 0x59, 0x59, 0x37, 0x33, 0x30, + 0x43, 0x5c, 0x0a, + 0x09, 0x66, 0x68, 0x56, 0x59, 0x33, 0x53, 0x78, 0x67, 0x46, 0x54, 0x4d, 0x41, 0x42, 0x77, 0x4b, 0x4e, 0x41, + 0x2f, 0x69, 0x5a, 0x31, 0x41, 0x68, 0x30, 0x76, 0x48, 0x42, 0x4b, 0x4d, 0x62, 0x55, 0x49, 0x56, 0x6b, 0x4c, + 0x6e, 0x75, 0x67, 0x57, 0x72, 0x6c, 0x47, 0x30, 0x4d, 0x2b, 0x6a, 0x78, 0x50, 0x72, 0x6e, 0x51, 0x30, 0x64, + 0x38, 0x6e, 0x5a, 0x74, 0x4c, 0x36, 0x4d, 0x44, 0x6d, 0x6c, 0x76, 0x4b, 0x57, 0x43, 0x52, 0x4d, 0x41, 0x51, + 0x65, 0x5c, 0x0a, + 0x09, 0x76, 0x52, 0x79, 0x6b, 0x66, 0x4a, 0x6f, 0x64, 0x4b, 0x5a, 0x56, 0x69, 0x4c, 0x5a, 0x64, 0x30, 0x79, + 0x32, 0x79, 0x2f, 0x33, 0x30, 0x65, 0x6e, 0x4b, 0x31, 0x38, 0x79, 0x57, 0x35, 0x51, 0x46, 0x2f, 0x75, 0x4c, + 0x39, 0x66, 0x34, 0x79, 0x62, 0x76, 0x76, 0x55, 0x74, 0x31, 0x71, 0x71, 0x6e, 0x5a, 0x63, 0x71, 0x72, 0x78, + 0x33, 0x49, 0x4a, 0x57, 0x5a, 0x35, 0x6a, 0x72, 0x46, 0x72, 0x30, 0x34, 0x2b, 0x4f, 0x74, 0x5a, 0x5a, 0x43, + 0x36, 0x5c, 0x0a, + 0x09, 0x73, 0x77, 0x53, 0x49, 0x4e, 0x4a, 0x70, 0x61, 0x33, 0x37, 0x58, 0x4a, 0x38, 0x33, 0x46, 0x4c, 0x65, + 0x55, 0x6e, 0x64, 0x4e, 0x6f, 0x48, 0x4b, 0x53, 0x73, 0x2b, 0x45, 0x4e, 0x47, 0x56, 0x72, 0x4b, 0x39, 0x30, + 0x4f, 0x64, 0x4f, 0x70, 0x59, 0x36, 0x31, 0x64, 0x71, 0x31, 0x63, 0x35, 0x41, 0x72, 0x44, 0x48, 0x72, 0x67, + 0x47, 0x51, 0x46, 0x4d, 0x57, 0x57, 0x62, 0x50, 0x34, 0x46, 0x56, 0x66, 0x6d, 0x6e, 0x49, 0x71, 0x67, 0x46, + 0x41, 0x5c, 0x0a, + 0x09, 0x70, 0x62, 0x41, 0x6e, 0x41, 0x70, 0x6a, 0x53, 0x5a, 0x71, 0x4c, 0x78, 0x4e, 0x58, 0x57, 0x6d, 0x2b, + 0x73, 0x78, 0x6f, 0x46, 0x65, 0x6f, 0x4e, 0x48, 0x53, 0x6b, 0x50, 0x56, 0x73, 0x53, 0x32, 0x44, 0x4a, 0x42, + 0x7a, 0x4a, 0x46, 0x50, 0x4e, 0x35, 0x70, 0x6b, 0x6d, 0x4c, 0x38, 0x2f, 0x56, 0x62, 0x51, 0x47, 0x55, 0x6a, + 0x49, 0x36, 0x70, 0x71, 0x57, 0x73, 0x6e, 0x53, 0x64, 0x73, 0x64, 0x76, 0x63, 0x48, 0x4a, 0x63, 0x68, 0x52, + 0x64, 0x5c, 0x0a, + 0x09, 0x62, 0x72, 0x78, 0x4b, 0x34, 0x51, 0x48, 0x45, 0x71, 0x63, 0x44, 0x48, 0x4c, 0x37, 0x73, 0x63, 0x68, + 0x77, 0x34, 0x64, 0x42, 0x49, 0x2b, 0x39, 0x57, 0x62, 0x65, 0x48, 0x59, 0x74, 0x6e, 0x50, 0x2f, 0x58, 0x4d, + 0x69, 0x6a, 0x49, 0x2b, 0x50, 0x78, 0x30, 0x5a, 0x47, 0x79, 0x56, 0x71, 0x36, 0x37, 0x61, 0x68, 0x4e, 0x54, + 0x6e, 0x55, 0x70, 0x72, 0x52, 0x4d, 0x39, 0x52, 0x6e, 0x34, 0x74, 0x63, 0x47, 0x67, 0x39, 0x57, 0x38, 0x44, + 0x72, 0x5c, 0x0a, + 0x09, 0x57, 0x7a, 0x71, 0x31, 0x2b, 0x67, 0x2f, 0x58, 0x65, 0x48, 0x39, 0x36, 0x66, 0x44, 0x6f, 0x6f, 0x38, + 0x66, 0x5a, 0x30, 0x42, 0x68, 0x4b, 0x75, 0x42, 0x61, 0x75, 0x32, 0x67, 0x6f, 0x54, 0x57, 0x69, 0x64, 0x57, + 0x58, 0x78, 0x57, 0x46, 0x44, 0x2b, 0x58, 0x45, 0x43, 0x6e, 0x6d, 0x52, 0x57, 0x65, 0x34, 0x69, 0x30, 0x32, + 0x6d, 0x73, 0x41, 0x31, 0x61, 0x73, 0x37, 0x70, 0x47, 0x6d, 0x6b, 0x79, 0x55, 0x33, 0x39, 0x72, 0x56, 0x5a, + 0x67, 0x5c, 0x0a, + 0x09, 0x45, 0x31, 0x78, 0x77, 0x51, 0x63, 0x72, 0x36, 0x70, 0x4b, 0x37, 0x70, 0x43, 0x47, 0x52, 0x46, 0x43, + 0x32, 0x31, 0x34, 0x64, 0x56, 0x38, 0x38, 0x4c, 0x76, 0x73, 0x7a, 0x4e, 0x54, 0x4c, 0x72, 0x2b, 0x56, 0x6c, + 0x74, 0x38, 0x50, 0x70, 0x73, 0x79, 0x72, 0x63, 0x45, 0x43, 0x49, 0x73, 0x58, 0x51, 0x42, 0x70, 0x73, 0x44, + 0x59, 0x70, 0x57, 0x32, 0x33, 0x61, 0x32, 0x6c, 0x42, 0x6f, 0x54, 0x65, 0x59, 0x73, 0x5a, 0x47, 0x30, 0x4f, + 0x57, 0x5c, 0x0a, + 0x09, 0x5a, 0x58, 0x45, 0x71, 0x63, 0x47, 0x52, 0x2b, 0x44, 0x72, 0x66, 0x66, 0x63, 0x58, 0x65, 0x73, 0x34, + 0x51, 0x41, 0x73, 0x35, 0x31, 0x30, 0x55, 0x7a, 0x69, 0x45, 0x6a, 0x51, 0x6e, 0x39, 0x38, 0x48, 0x44, 0x6d, + 0x6c, 0x4f, 0x72, 0x43, 0x4f, 0x72, 0x5a, 0x6a, 0x58, 0x35, 0x48, 0x68, 0x63, 0x6c, 0x72, 0x4a, 0x31, 0x69, + 0x33, 0x50, 0x65, 0x73, 0x6f, 0x50, 0x6d, 0x52, 0x74, 0x65, 0x6f, 0x64, 0x53, 0x79, 0x42, 0x45, 0x4a, 0x44, + 0x79, 0x5c, 0x0a, + 0x09, 0x31, 0x6e, 0x7a, 0x77, 0x36, 0x39, 0x62, 0x74, 0x79, 0x71, 0x4d, 0x42, 0x46, 0x61, 0x33, 0x4c, 0x4a, + 0x6b, 0x43, 0x70, 0x79, 0x2b, 0x6f, 0x46, 0x5a, 0x36, 0x6c, 0x54, 0x6f, 0x4a, 0x36, 0x63, 0x57, 0x54, 0x6f, + 0x48, 0x61, 0x48, 0x5a, 0x30, 0x6b, 0x50, 0x7a, 0x75, 0x61, 0x4c, 0x56, 0x76, 0x41, 0x31, 0x37, 0x6d, 0x67, + 0x42, 0x75, 0x31, 0x73, 0x56, 0x74, 0x71, 0x74, 0x6c, 0x49, 0x75, 0x66, 0x6f, 0x61, 0x6e, 0x52, 0x53, 0x74, + 0x46, 0x5c, 0x0a, + 0x09, 0x43, 0x6b, 0x37, 0x61, 0x52, 0x49, 0x37, 0x6d, 0x63, 0x56, 0x35, 0x2f, 0x72, 0x47, 0x2f, 0x4a, 0x63, + 0x62, 0x44, 0x52, 0x47, 0x7a, 0x68, 0x6b, 0x53, 0x32, 0x6b, 0x30, 0x6c, 0x45, 0x63, 0x36, 0x31, 0x62, 0x50, + 0x71, 0x4e, 0x6b, 0x58, 0x37, 0x4e, 0x4b, 0x72, 0x71, 0x36, 0x5a, 0x4d, 0x73, 0x70, 0x2f, 0x6c, 0x48, 0x6c, + 0x6d, 0x46, 0x69, 0x66, 0x4a, 0x79, 0x39, 0x72, 0x59, 0x72, 0x38, 0x52, 0x70, 0x39, 0x51, 0x76, 0x39, 0x50, + 0x44, 0x5c, 0x0a, + 0x09, 0x59, 0x46, 0x67, 0x41, 0x42, 0x50, 0x52, 0x59, 0x78, 0x67, 0x43, 0x6b, 0x68, 0x74, 0x79, 0x73, 0x73, + 0x78, 0x54, 0x6f, 0x4f, 0x49, 0x56, 0x4d, 0x53, 0x50, 0x44, 0x46, 0x57, 0x6b, 0x71, 0x7a, 0x41, 0x52, 0x6b, + 0x4f, 0x36, 0x72, 0x48, 0x5a, 0x6d, 0x33, 0x31, 0x30, 0x58, 0x37, 0x78, 0x65, 0x55, 0x38, 0x61, 0x67, 0x2b, + 0x2b, 0x59, 0x61, 0x74, 0x32, 0x53, 0x62, 0x6a, 0x71, 0x63, 0x70, 0x6d, 0x30, 0x68, 0x42, 0x4b, 0x72, 0x57, + 0x57, 0x5c, 0x0a, + 0x09, 0x56, 0x46, 0x63, 0x79, 0x6b, 0x36, 0x6e, 0x68, 0x6a, 0x41, 0x63, 0x52, 0x41, 0x46, 0x63, 0x44, 0x37, + 0x74, 0x50, 0x47, 0x73, 0x42, 0x38, 0x79, 0x72, 0x64, 0x6f, 0x62, 0x67, 0x53, 0x35, 0x39, 0x33, 0x73, 0x56, + 0x59, 0x47, 0x67, 0x79, 0x48, 0x64, 0x39, 0x78, 0x39, 0x36, 0x46, 0x38, 0x2b, 0x38, 0x75, 0x55, 0x72, 0x58, + 0x2b, 0x62, 0x50, 0x31, 0x67, 0x50, 0x52, 0x71, 0x54, 0x42, 0x2f, 0x31, 0x4c, 0x4d, 0x75, 0x6d, 0x54, 0x70, + 0x41, 0x5c, 0x0a, + 0x09, 0x2b, 0x4d, 0x62, 0x56, 0x6f, 0x77, 0x57, 0x57, 0x66, 0x6d, 0x72, 0x58, 0x58, 0x67, 0x6d, 0x64, 0x30, + 0x34, 0x63, 0x33, 0x7a, 0x59, 0x69, 0x71, 0x32, 0x72, 0x58, 0x53, 0x4e, 0x4a, 0x33, 0x39, 0x38, 0x46, 0x71, + 0x32, 0x63, 0x30, 0x67, 0x5a, 0x79, 0x64, 0x55, 0x43, 0x44, 0x6d, 0x68, 0x70, 0x56, 0x73, 0x57, 0x58, 0x44, + 0x71, 0x30, 0x4d, 0x49, 0x35, 0x37, 0x4c, 0x4d, 0x6f, 0x79, 0x50, 0x54, 0x32, 0x42, 0x68, 0x59, 0x52, 0x34, + 0x67, 0x5c, 0x0a, + 0x09, 0x34, 0x4e, 0x35, 0x44, 0x42, 0x39, 0x47, 0x76, 0x49, 0x6e, 0x37, 0x5a, 0x37, 0x61, 0x4e, 0x63, 0x58, + 0x45, 0x53, 0x48, 0x4c, 0x66, 0x6f, 0x31, 0x5a, 0x53, 0x61, 0x57, 0x4a, 0x4a, 0x6f, 0x79, 0x6d, 0x69, 0x5a, + 0x67, 0x53, 0x74, 0x74, 0x30, 0x6b, 0x42, 0x4f, 0x37, 0x31, 0x4d, 0x6c, 0x31, 0x57, 0x78, 0x70, 0x59, 0x59, + 0x5a, 0x51, 0x66, 0x31, 0x61, 0x2f, 0x46, 0x76, 0x38, 0x77, 0x35, 0x35, 0x46, 0x68, 0x54, 0x6e, 0x76, 0x30, + 0x56, 0x5c, 0x0a, + 0x09, 0x76, 0x55, 0x4e, 0x54, 0x51, 0x6b, 0x70, 0x71, 0x32, 0x32, 0x6d, 0x77, 0x73, 0x74, 0x39, 0x57, 0x46, + 0x44, 0x61, 0x41, 0x61, 0x5a, 0x74, 0x38, 0x78, 0x54, 0x4f, 0x66, 0x66, 0x45, 0x57, 0x33, 0x6e, 0x7a, 0x76, + 0x4b, 0x64, 0x45, 0x73, 0x50, 0x6e, 0x56, 0x62, 0x74, 0x66, 0x51, 0x44, 0x6c, 0x74, 0x5a, 0x38, 0x45, 0x67, + 0x4a, 0x30, 0x67, 0x75, 0x76, 0x6c, 0x35, 0x72, 0x33, 0x33, 0x48, 0x35, 0x4a, 0x64, 0x76, 0x75, 0x6b, 0x31, + 0x32, 0x5c, 0x0a, + 0x09, 0x68, 0x43, 0x5a, 0x6e, 0x6c, 0x57, 0x52, 0x46, 0x51, 0x46, 0x31, 0x66, 0x6c, 0x78, 0x31, 0x56, 0x58, + 0x76, 0x65, 0x76, 0x79, 0x2b, 0x70, 0x6e, 0x2b, 0x64, 0x4d, 0x34, 0x59, 0x44, 0x6d, 0x6b, 0x62, 0x5a, 0x69, + 0x6a, 0x65, 0x45, 0x72, 0x35, 0x72, 0x2f, 0x75, 0x31, 0x78, 0x6a, 0x6a, 0x4b, 0x38, 0x54, 0x51, 0x6f, 0x6a, + 0x41, 0x49, 0x75, 0x33, 0x76, 0x5a, 0x77, 0x4f, 0x4d, 0x54, 0x38, 0x77, 0x67, 0x4b, 0x49, 0x67, 0x4a, 0x34, + 0x72, 0x5c, 0x0a, + 0x09, 0x30, 0x4d, 0x30, 0x79, 0x7a, 0x46, 0x4d, 0x48, 0x47, 0x59, 0x43, 0x4a, 0x73, 0x59, 0x6d, 0x59, 0x44, + 0x7a, 0x62, 0x70, 0x36, 0x57, 0x67, 0x79, 0x46, 0x58, 0x73, 0x38, 0x6f, 0x31, 0x37, 0x74, 0x5a, 0x58, 0x50, + 0x63, 0x4a, 0x41, 0x66, 0x4c, 0x39, 0x4a, 0x76, 0x73, 0x61, 0x5a, 0x51, 0x74, 0x57, 0x66, 0x58, 0x74, 0x74, + 0x6c, 0x49, 0x75, 0x64, 0x45, 0x42, 0x72, 0x41, 0x72, 0x76, 0x56, 0x73, 0x4e, 0x31, 0x77, 0x2f, 0x4e, 0x52, + 0x48, 0x5c, 0x0a, + 0x09, 0x50, 0x68, 0x78, 0x2f, 0x39, 0x6c, 0x39, 0x66, 0x73, 0x67, 0x79, 0x34, 0x41, 0x77, 0x42, 0x75, 0x7a, + 0x63, 0x35, 0x36, 0x43, 0x6c, 0x61, 0x44, 0x56, 0x6e, 0x63, 0x4b, 0x51, 0x50, 0x52, 0x7a, 0x41, 0x43, 0x5a, + 0x2f, 0x37, 0x32, 0x55, 0x2f, 0x69, 0x75, 0x33, 0x6a, 0x31, 0x54, 0x76, 0x51, 0x77, 0x4a, 0x32, 0x70, 0x4a, + 0x71, 0x31, 0x59, 0x50, 0x6d, 0x42, 0x39, 0x57, 0x30, 0x6b, 0x72, 0x52, 0x46, 0x38, 0x4c, 0x39, 0x58, 0x57, + 0x45, 0x5c, 0x0a, + 0x09, 0x34, 0x4d, 0x64, 0x61, 0x37, 0x58, 0x58, 0x45, 0x6b, 0x45, 0x74, 0x30, 0x64, 0x52, 0x33, 0x65, 0x6f, + 0x68, 0x31, 0x31, 0x6d, 0x76, 0x6d, 0x33, 0x2b, 0x70, 0x48, 0x31, 0x30, 0x30, 0x7a, 0x42, 0x33, 0x6c, 0x68, + 0x6a, 0x52, 0x5a, 0x48, 0x67, 0x49, 0x71, 0x4d, 0x7a, 0x6c, 0x6c, 0x51, 0x65, 0x6e, 0x55, 0x34, 0x48, 0x2f, + 0x58, 0x37, 0x66, 0x50, 0x79, 0x4f, 0x51, 0x64, 0x56, 0x43, 0x51, 0x66, 0x2b, 0x50, 0x6d, 0x32, 0x50, 0x67, + 0x34, 0x5c, 0x0a, + 0x09, 0x58, 0x4a, 0x5a, 0x47, 0x56, 0x42, 0x32, 0x4a, 0x39, 0x54, 0x6a, 0x35, 0x65, 0x4b, 0x7a, 0x4d, 0x53, + 0x73, 0x76, 0x56, 0x6b, 0x70, 0x33, 0x65, 0x4c, 0x73, 0x76, 0x37, 0x44, 0x6d, 0x31, 0x5a, 0x57, 0x59, 0x58, + 0x6d, 0x42, 0x38, 0x5a, 0x33, 0x61, 0x34, 0x65, 0x66, 0x4e, 0x53, 0x62, 0x4f, 0x6d, 0x77, 0x58, 0x43, 0x44, + 0x72, 0x4c, 0x50, 0x45, 0x44, 0x52, 0x73, 0x51, 0x4c, 0x50, 0x35, 0x61, 0x67, 0x4b, 0x7a, 0x35, 0x73, 0x42, + 0x55, 0x5c, 0x0a, + 0x09, 0x57, 0x39, 0x37, 0x75, 0x4c, 0x5a, 0x50, 0x34, 0x37, 0x5a, 0x2f, 0x2f, 0x45, 0x51, 0x43, 0x75, 0x43, + 0x39, 0x44, 0x50, 0x6d, 0x59, 0x62, 0x79, 0x45, 0x47, 0x6e, 0x31, 0x41, 0x4d, 0x42, 0x7a, 0x2b, 0x30, 0x77, + 0x34, 0x68, 0x77, 0x4f, 0x6e, 0x37, 0x4d, 0x61, 0x76, 0x76, 0x4f, 0x41, 0x53, 0x4a, 0x6c, 0x67, 0x5a, 0x61, + 0x37, 0x56, 0x52, 0x70, 0x77, 0x4b, 0x33, 0x49, 0x78, 0x73, 0x2f, 0x4b, 0x78, 0x58, 0x53, 0x6e, 0x4b, 0x70, + 0x70, 0x5c, 0x0a, + 0x09, 0x49, 0x2b, 0x54, 0x74, 0x4e, 0x53, 0x56, 0x53, 0x55, 0x75, 0x45, 0x72, 0x37, 0x38, 0x6a, 0x54, 0x69, + 0x71, 0x39, 0x48, 0x4f, 0x37, 0x6f, 0x65, 0x2f, 0x7a, 0x5a, 0x71, 0x46, 0x39, 0x73, 0x6f, 0x35, 0x77, 0x35, + 0x6c, 0x6e, 0x62, 0x72, 0x47, 0x5a, 0x63, 0x71, 0x76, 0x39, 0x58, 0x73, 0x39, 0x64, 0x4c, 0x70, 0x64, 0x6c, + 0x4d, 0x35, 0x68, 0x32, 0x66, 0x6c, 0x46, 0x51, 0x71, 0x4b, 0x6d, 0x4a, 0x79, 0x51, 0x6c, 0x2b, 0x44, 0x56, + 0x46, 0x5c, 0x0a, + 0x09, 0x74, 0x79, 0x62, 0x6e, 0x74, 0x67, 0x79, 0x63, 0x39, 0x79, 0x54, 0x31, 0x62, 0x67, 0x63, 0x4a, 0x32, + 0x7a, 0x6e, 0x53, 0x5a, 0x7a, 0x71, 0x31, 0x30, 0x77, 0x53, 0x37, 0x53, 0x2b, 0x33, 0x43, 0x47, 0x6b, 0x31, + 0x39, 0x4a, 0x72, 0x55, 0x35, 0x61, 0x35, 0x71, 0x61, 0x4c, 0x6c, 0x6c, 0x62, 0x34, 0x44, 0x51, 0x4b, 0x49, + 0x43, 0x7a, 0x62, 0x74, 0x32, 0x77, 0x33, 0x4a, 0x2b, 0x43, 0x33, 0x58, 0x76, 0x51, 0x63, 0x6e, 0x4c, 0x68, + 0x7a, 0x5c, 0x0a, + 0x09, 0x79, 0x70, 0x64, 0x30, 0x37, 0x76, 0x73, 0x54, 0x78, 0x76, 0x38, 0x64, 0x74, 0x48, 0x6f, 0x41, 0x34, + 0x41, 0x44, 0x41, 0x6e, 0x65, 0x32, 0x50, 0x48, 0x56, 0x37, 0x34, 0x39, 0x41, 0x76, 0x77, 0x2f, 0x4d, 0x63, + 0x2f, 0x52, 0x71, 0x6b, 0x62, 0x36, 0x73, 0x69, 0x54, 0x68, 0x59, 0x35, 0x4e, 0x35, 0x32, 0x73, 0x44, 0x53, + 0x41, 0x56, 0x6e, 0x4f, 0x58, 0x56, 0x7a, 0x65, 0x6a, 0x58, 0x36, 0x4c, 0x54, 0x2b, 0x36, 0x48, 0x59, 0x6e, + 0x2b, 0x5c, 0x0a, + 0x09, 0x2f, 0x46, 0x79, 0x54, 0x6b, 0x39, 0x67, 0x50, 0x41, 0x45, 0x6e, 0x6a, 0x73, 0x48, 0x59, 0x63, 0x6a, + 0x42, 0x34, 0x50, 0x6b, 0x6e, 0x4f, 0x32, 0x49, 0x65, 0x73, 0x49, 0x79, 0x6b, 0x48, 0x4e, 0x50, 0x7a, 0x69, + 0x55, 0x49, 0x79, 0x4e, 0x2f, 0x7a, 0x7a, 0x2f, 0x64, 0x39, 0x6d, 0x79, 0x50, 0x77, 0x4d, 0x6f, 0x34, 0x4c, + 0x47, 0x4f, 0x33, 0x53, 0x4d, 0x62, 0x35, 0x64, 0x41, 0x32, 0x48, 0x5a, 0x77, 0x6b, 0x32, 0x4c, 0x39, 0x78, + 0x5a, 0x5c, 0x0a, + 0x09, 0x58, 0x4e, 0x4b, 0x4f, 0x35, 0x44, 0x47, 0x31, 0x74, 0x5a, 0x72, 0x66, 0x65, 0x73, 0x32, 0x68, 0x53, + 0x62, 0x5a, 0x36, 0x62, 0x4b, 0x4e, 0x41, 0x6d, 0x4e, 0x64, 0x4d, 0x67, 0x61, 0x36, 0x32, 0x6a, 0x6d, 0x5a, + 0x37, 0x6b, 0x70, 0x2f, 0x68, 0x4f, 0x46, 0x7a, 0x2f, 0x6d, 0x52, 0x39, 0x34, 0x45, 0x69, 0x36, 0x35, 0x36, + 0x4e, 0x79, 0x71, 0x6b, 0x67, 0x4d, 0x49, 0x71, 0x2f, 0x72, 0x53, 0x38, 0x4e, 0x57, 0x64, 0x41, 0x6a, 0x68, + 0x4d, 0x5c, 0x0a, + 0x09, 0x38, 0x66, 0x66, 0x35, 0x76, 0x2b, 0x6e, 0x6e, 0x6e, 0x34, 0x39, 0x7a, 0x54, 0x7a, 0x30, 0x70, 0x4b, + 0x57, 0x5a, 0x46, 0x4e, 0x32, 0x30, 0x51, 0x56, 0x6e, 0x53, 0x72, 0x42, 0x57, 0x75, 0x62, 0x6e, 0x58, 0x61, + 0x6d, 0x4a, 0x75, 0x50, 0x55, 0x66, 0x66, 0x4b, 0x36, 0x32, 0x67, 0x41, 0x35, 0x50, 0x31, 0x59, 0x45, 0x31, + 0x50, 0x66, 0x34, 0x72, 0x66, 0x54, 0x53, 0x47, 0x69, 0x38, 0x33, 0x36, 0x4b, 0x5a, 0x73, 0x77, 0x68, 0x70, + 0x48, 0x5c, 0x0a, + 0x09, 0x6b, 0x35, 0x4d, 0x32, 0x52, 0x2b, 0x49, 0x55, 0x4c, 0x68, 0x79, 0x41, 0x79, 0x66, 0x45, 0x4a, 0x55, + 0x42, 0x37, 0x57, 0x67, 0x4f, 0x31, 0x62, 0x58, 0x71, 0x6e, 0x63, 0x4b, 0x4f, 0x45, 0x31, 0x33, 0x51, 0x56, + 0x6f, 0x50, 0x2b, 0x53, 0x6c, 0x59, 0x37, 0x59, 0x65, 0x55, 0x35, 0x4d, 0x38, 0x5a, 0x46, 0x2b, 0x68, 0x4a, + 0x56, 0x6b, 0x33, 0x6b, 0x49, 0x37, 0x79, 0x54, 0x55, 0x47, 0x69, 0x43, 0x64, 0x68, 0x57, 0x30, 0x68, 0x33, + 0x59, 0x5c, 0x0a, + 0x09, 0x39, 0x7a, 0x54, 0x69, 0x36, 0x79, 0x63, 0x33, 0x55, 0x38, 0x36, 0x30, 0x62, 0x69, 0x7a, 0x65, 0x2b, + 0x4c, 0x55, 0x6e, 0x6e, 0x72, 0x6b, 0x66, 0x76, 0x2f, 0x4c, 0x43, 0x5a, 0x37, 0x43, 0x54, 0x42, 0x49, 0x41, + 0x6d, 0x56, 0x6b, 0x54, 0x62, 0x37, 0x34, 0x4a, 0x57, 0x65, 0x77, 0x32, 0x67, 0x65, 0x6a, 0x65, 0x56, 0x41, + 0x77, 0x67, 0x59, 0x36, 0x32, 0x5a, 0x34, 0x37, 0x36, 0x2b, 0x38, 0x43, 0x4b, 0x64, 0x73, 0x6e, 0x7a, 0x59, + 0x46, 0x5c, 0x0a, + 0x09, 0x4f, 0x47, 0x72, 0x6e, 0x56, 0x6c, 0x4d, 0x45, 0x6b, 0x44, 0x75, 0x6b, 0x48, 0x45, 0x67, 0x5a, 0x42, + 0x43, 0x39, 0x76, 0x6f, 0x57, 0x34, 0x64, 0x2f, 0x65, 0x73, 0x53, 0x2b, 0x74, 0x61, 0x4e, 0x4e, 0x67, 0x44, + 0x70, 0x32, 0x50, 0x62, 0x72, 0x78, 0x44, 0x51, 0x31, 0x4f, 0x62, 0x34, 0x75, 0x4d, 0x79, 0x71, 0x43, 0x63, + 0x71, 0x66, 0x67, 0x66, 0x49, 0x30, 0x61, 0x57, 0x78, 0x72, 0x78, 0x39, 0x66, 0x37, 0x35, 0x53, 0x6d, 0x49, + 0x45, 0x5c, 0x0a, + 0x09, 0x63, 0x35, 0x2b, 0x2f, 0x64, 0x6e, 0x34, 0x5a, 0x6c, 0x56, 0x50, 0x48, 0x30, 0x66, 0x4b, 0x77, 0x70, + 0x47, 0x48, 0x6c, 0x46, 0x39, 0x59, 0x36, 0x6a, 0x33, 0x54, 0x62, 0x5a, 0x73, 0x44, 0x56, 0x63, 0x74, 0x44, + 0x79, 0x71, 0x48, 0x6d, 0x79, 0x34, 0x36, 0x38, 0x46, 0x6c, 0x45, 0x30, 0x41, 0x62, 0x31, 0x33, 0x54, 0x34, + 0x77, 0x6a, 0x6c, 0x62, 0x66, 0x6d, 0x73, 0x33, 0x49, 0x66, 0x56, 0x39, 0x73, 0x4e, 0x50, 0x32, 0x49, 0x4e, + 0x33, 0x5c, 0x0a, + 0x09, 0x76, 0x50, 0x4b, 0x6e, 0x30, 0x45, 0x31, 0x58, 0x2f, 0x41, 0x76, 0x54, 0x34, 0x42, 0x34, 0x69, 0x72, + 0x66, 0x59, 0x2b, 0x67, 0x48, 0x74, 0x30, 0x7a, 0x44, 0x78, 0x78, 0x35, 0x7a, 0x54, 0x65, 0x2f, 0x56, 0x39, + 0x65, 0x68, 0x47, 0x31, 0x6a, 0x66, 0x53, 0x50, 0x4b, 0x36, 0x70, 0x46, 0x49, 0x56, 0x31, 0x77, 0x4a, 0x4e, + 0x46, 0x4a, 0x41, 0x47, 0x49, 0x58, 0x51, 0x2f, 0x4a, 0x77, 0x54, 0x6e, 0x79, 0x45, 0x64, 0x64, 0x45, 0x62, + 0x37, 0x5c, 0x0a, + 0x09, 0x76, 0x4a, 0x35, 0x31, 0x58, 0x6b, 0x65, 0x4e, 0x65, 0x68, 0x53, 0x70, 0x57, 0x70, 0x73, 0x69, 0x71, + 0x34, 0x34, 0x56, 0x45, 0x68, 0x6a, 0x30, 0x61, 0x38, 0x62, 0x73, 0x64, 0x4e, 0x4c, 0x4b, 0x63, 0x71, 0x7a, + 0x4d, 0x68, 0x62, 0x74, 0x51, 0x65, 0x4c, 0x57, 0x58, 0x72, 0x70, 0x39, 0x47, 0x5a, 0x58, 0x73, 0x35, 0x7a, + 0x58, 0x61, 0x59, 0x5a, 0x41, 0x39, 0x37, 0x76, 0x4f, 0x35, 0x45, 0x43, 0x53, 0x66, 0x71, 0x63, 0x56, 0x43, + 0x33, 0x5c, 0x0a, + 0x09, 0x31, 0x6f, 0x41, 0x34, 0x6e, 0x30, 0x30, 0x4f, 0x72, 0x55, 0x47, 0x58, 0x62, 0x37, 0x57, 0x57, 0x54, + 0x6b, 0x2b, 0x69, 0x6e, 0x69, 0x5a, 0x43, 0x73, 0x32, 0x35, 0x72, 0x2f, 0x71, 0x57, 0x56, 0x6a, 0x67, 0x49, + 0x50, 0x4f, 0x62, 0x36, 0x56, 0x6e, 0x35, 0x73, 0x34, 0x66, 0x6e, 0x6f, 0x72, 0x2f, 0x75, 0x68, 0x58, 0x58, + 0x6f, 0x77, 0x64, 0x57, 0x2f, 0x71, 0x71, 0x59, 0x51, 0x63, 0x34, 0x64, 0x36, 0x66, 0x42, 0x38, 0x6b, 0x4f, + 0x6d, 0x5c, 0x0a, + 0x09, 0x56, 0x5a, 0x34, 0x43, 0x75, 0x43, 0x73, 0x73, 0x77, 0x7a, 0x2f, 0x6e, 0x74, 0x42, 0x50, 0x78, 0x33, + 0x6c, 0x64, 0x36, 0x45, 0x4c, 0x43, 0x69, 0x47, 0x56, 0x65, 0x2b, 0x2f, 0x7a, 0x38, 0x56, 0x61, 0x71, 0x31, + 0x41, 0x6e, 0x65, 0x6a, 0x56, 0x52, 0x74, 0x47, 0x73, 0x73, 0x4f, 0x2f, 0x6d, 0x76, 0x45, 0x75, 0x75, 0x4e, + 0x52, 0x6c, 0x4a, 0x33, 0x62, 0x65, 0x6b, 0x65, 0x6f, 0x59, 0x71, 0x65, 0x65, 0x63, 0x39, 0x63, 0x43, 0x4f, + 0x53, 0x5c, 0x0a, + 0x09, 0x34, 0x39, 0x54, 0x52, 0x7a, 0x34, 0x6e, 0x7a, 0x54, 0x6b, 0x6d, 0x6e, 0x61, 0x57, 0x78, 0x61, 0x53, + 0x6b, 0x31, 0x52, 0x6b, 0x33, 0x39, 0x61, 0x45, 0x63, 0x74, 0x71, 0x33, 0x53, 0x6c, 0x4e, 0x38, 0x46, 0x7a, + 0x4b, 0x6c, 0x71, 0x5a, 0x73, 0x54, 0x30, 0x39, 0x62, 0x39, 0x4c, 0x46, 0x46, 0x36, 0x57, 0x34, 0x35, 0x2b, + 0x57, 0x42, 0x56, 0x6d, 0x6a, 0x4e, 0x59, 0x6f, 0x46, 0x68, 0x7a, 0x6f, 0x47, 0x58, 0x4f, 0x78, 0x39, 0x38, + 0x55, 0x5c, 0x0a, + 0x09, 0x54, 0x50, 0x69, 0x6f, 0x4e, 0x4a, 0x6a, 0x77, 0x50, 0x71, 0x30, 0x67, 0x78, 0x6d, 0x74, 0x61, 0x6a, + 0x68, 0x2b, 0x64, 0x66, 0x32, 0x6f, 0x72, 0x2f, 0x75, 0x4b, 0x31, 0x50, 0x34, 0x75, 0x39, 0x4a, 0x32, 0x79, + 0x48, 0x2f, 0x45, 0x33, 0x44, 0x32, 0x4d, 0x48, 0x6e, 0x73, 0x49, 0x71, 0x30, 0x32, 0x6c, 0x4f, 0x41, 0x39, + 0x34, 0x72, 0x76, 0x37, 0x49, 0x63, 0x50, 0x4c, 0x7a, 0x78, 0x6e, 0x50, 0x39, 0x35, 0x39, 0x36, 0x59, 0x73, + 0x77, 0x5c, 0x0a, + 0x09, 0x50, 0x65, 0x34, 0x66, 0x4d, 0x74, 0x48, 0x52, 0x53, 0x55, 0x63, 0x39, 0x6f, 0x42, 0x61, 0x77, 0x6c, + 0x53, 0x70, 0x71, 0x68, 0x4c, 0x59, 0x45, 0x43, 0x33, 0x5a, 0x64, 0x47, 0x35, 0x6f, 0x32, 0x48, 0x76, 0x6b, + 0x35, 0x2b, 0x6b, 0x63, 0x73, 0x62, 0x49, 0x64, 0x6d, 0x59, 0x6a, 0x69, 0x4b, 0x2f, 0x71, 0x55, 0x52, 0x38, + 0x62, 0x4a, 0x70, 0x39, 0x4e, 0x4f, 0x6d, 0x70, 0x4a, 0x38, 0x64, 0x48, 0x44, 0x55, 0x6d, 0x36, 0x7a, 0x6b, + 0x45, 0x5c, 0x0a, + 0x09, 0x7a, 0x5a, 0x63, 0x56, 0x50, 0x53, 0x33, 0x6a, 0x74, 0x79, 0x4b, 0x6d, 0x4e, 0x4e, 0x48, 0x6d, 0x68, + 0x35, 0x71, 0x73, 0x42, 0x33, 0x71, 0x61, 0x51, 0x4d, 0x73, 0x43, 0x68, 0x58, 0x53, 0x74, 0x52, 0x55, 0x35, + 0x74, 0x6d, 0x76, 0x76, 0x6c, 0x31, 0x31, 0x4d, 0x62, 0x30, 0x52, 0x76, 0x4c, 0x30, 0x67, 0x56, 0x52, 0x43, + 0x59, 0x4d, 0x70, 0x51, 0x4b, 0x53, 0x4c, 0x6c, 0x39, 0x6f, 0x65, 0x74, 0x53, 0x34, 0x31, 0x63, 0x49, 0x5a, + 0x79, 0x5c, 0x0a, + 0x09, 0x4a, 0x30, 0x35, 0x50, 0x34, 0x58, 0x33, 0x2f, 0x35, 0x61, 0x66, 0x78, 0x38, 0x46, 0x50, 0x33, 0x31, + 0x42, 0x57, 0x53, 0x33, 0x32, 0x76, 0x45, 0x32, 0x37, 0x47, 0x4b, 0x74, 0x49, 0x71, 0x33, 0x41, 0x51, 0x6c, + 0x77, 0x37, 0x6d, 0x4e, 0x77, 0x37, 0x70, 0x33, 0x4a, 0x2b, 0x59, 0x6f, 0x75, 0x4f, 0x6e, 0x63, 0x2f, 0x50, + 0x76, 0x44, 0x61, 0x6e, 0x38, 0x4d, 0x70, 0x32, 0x36, 0x62, 0x4d, 0x69, 0x42, 0x4f, 0x6f, 0x56, 0x6f, 0x6a, + 0x39, 0x5c, 0x0a, + 0x09, 0x49, 0x4d, 0x30, 0x6f, 0x4a, 0x56, 0x74, 0x6c, 0x64, 0x48, 0x61, 0x67, 0x6e, 0x56, 0x76, 0x58, 0x30, + 0x61, 0x76, 0x4c, 0x73, 0x6f, 0x35, 0x38, 0x36, 0x49, 0x58, 0x7a, 0x78, 0x71, 0x4d, 0x53, 0x50, 0x34, 0x5a, + 0x71, 0x78, 0x2b, 0x6f, 0x2f, 0x64, 0x61, 0x77, 0x30, 0x67, 0x6e, 0x42, 0x4a, 0x36, 0x49, 0x69, 0x56, 0x41, + 0x6f, 0x59, 0x4e, 0x68, 0x35, 0x5a, 0x7a, 0x61, 0x65, 0x65, 0x30, 0x2b, 0x4e, 0x62, 0x58, 0x72, 0x57, 0x74, + 0x70, 0x5c, 0x0a, + 0x09, 0x2b, 0x33, 0x57, 0x37, 0x2b, 0x6f, 0x47, 0x65, 0x65, 0x6c, 0x6f, 0x68, 0x6f, 0x55, 0x62, 0x6d, 0x4f, + 0x32, 0x6e, 0x62, 0x7a, 0x56, 0x48, 0x5a, 0x72, 0x71, 0x33, 0x35, 0x53, 0x6b, 0x74, 0x72, 0x77, 0x45, 0x30, + 0x74, 0x30, 0x67, 0x49, 0x39, 0x66, 0x6c, 0x34, 0x43, 0x4a, 0x70, 0x38, 0x43, 0x70, 0x55, 0x38, 0x2b, 0x57, + 0x4f, 0x30, 0x41, 0x77, 0x46, 0x6b, 0x6e, 0x37, 0x4d, 0x45, 0x48, 0x58, 0x2f, 0x63, 0x4b, 0x6e, 0x48, 0x66, + 0x67, 0x5c, 0x0a, + 0x09, 0x70, 0x4e, 0x72, 0x70, 0x6b, 0x35, 0x2b, 0x62, 0x70, 0x31, 0x38, 0x46, 0x38, 0x41, 0x56, 0x6a, 0x4b, + 0x41, 0x2b, 0x5a, 0x56, 0x67, 0x30, 0x41, 0x73, 0x72, 0x4f, 0x65, 0x48, 0x41, 0x35, 0x2f, 0x45, 0x58, 0x41, + 0x76, 0x42, 0x50, 0x42, 0x31, 0x2f, 0x35, 0x55, 0x4e, 0x42, 0x72, 0x6a, 0x2b, 0x33, 0x50, 0x30, 0x6e, 0x76, + 0x75, 0x57, 0x56, 0x50, 0x2f, 0x4b, 0x4d, 0x52, 0x78, 0x50, 0x6f, 0x58, 0x51, 0x44, 0x6d, 0x41, 0x52, 0x77, + 0x42, 0x5c, 0x0a, + 0x09, 0x55, 0x46, 0x67, 0x6d, 0x30, 0x5a, 0x78, 0x6b, 0x70, 0x59, 0x72, 0x56, 0x78, 0x6d, 0x6b, 0x39, 0x55, + 0x47, 0x49, 0x5a, 0x6a, 0x32, 0x56, 0x63, 0x2f, 0x4c, 0x79, 0x4f, 0x37, 0x74, 0x78, 0x67, 0x55, 0x71, 0x50, + 0x69, 0x45, 0x56, 0x41, 0x76, 0x76, 0x75, 0x6d, 0x53, 0x4b, 0x78, 0x6d, 0x6e, 0x45, 0x34, 0x62, 0x45, 0x2b, + 0x78, 0x73, 0x56, 0x4b, 0x53, 0x6d, 0x70, 0x54, 0x36, 0x49, 0x4d, 0x7a, 0x36, 0x70, 0x34, 0x74, 0x4a, 0x4a, + 0x31, 0x5c, 0x0a, + 0x09, 0x6a, 0x34, 0x34, 0x73, 0x6d, 0x63, 0x6d, 0x36, 0x64, 0x6b, 0x74, 0x53, 0x67, 0x79, 0x6d, 0x63, 0x36, + 0x6d, 0x6c, 0x4f, 0x63, 0x2f, 0x38, 0x53, 0x75, 0x45, 0x49, 0x4e, 0x65, 0x2f, 0x72, 0x56, 0x70, 0x41, 0x6e, + 0x37, 0x43, 0x75, 0x63, 0x6f, 0x72, 0x5a, 0x57, 0x75, 0x63, 0x77, 0x52, 0x51, 0x6b, 0x78, 0x6d, 0x63, 0x4c, + 0x52, 0x45, 0x72, 0x75, 0x4e, 0x77, 0x39, 0x63, 0x2f, 0x69, 0x36, 0x76, 0x53, 0x64, 0x73, 0x2f, 0x79, 0x55, + 0x41, 0x5c, 0x0a, + 0x09, 0x6c, 0x34, 0x4e, 0x6f, 0x68, 0x74, 0x57, 0x59, 0x41, 0x66, 0x41, 0x78, 0x41, 0x45, 0x38, 0x44, 0x38, + 0x47, 0x59, 0x51, 0x49, 0x58, 0x76, 0x6b, 0x55, 0x38, 0x78, 0x78, 0x50, 0x42, 0x52, 0x61, 0x39, 0x5a, 0x38, + 0x47, 0x4b, 0x36, 0x2f, 0x37, 0x70, 0x44, 0x39, 0x77, 0x41, 0x49, 0x69, 0x6d, 0x41, 0x4f, 0x77, 0x44, 0x55, + 0x4d, 0x4b, 0x35, 0x57, 0x77, 0x41, 0x63, 0x75, 0x66, 0x33, 0x65, 0x67, 0x2f, 0x6a, 0x6f, 0x46, 0x56, 0x66, + 0x6a, 0x5c, 0x0a, + 0x09, 0x6f, 0x31, 0x2f, 0x38, 0x4f, 0x71, 0x36, 0x73, 0x74, 0x67, 0x73, 0x54, 0x38, 0x4c, 0x38, 0x42, 0x2f, + 0x47, 0x43, 0x6f, 0x56, 0x70, 0x32, 0x72, 0x6d, 0x32, 0x48, 0x74, 0x70, 0x34, 0x71, 0x56, 0x35, 0x58, 0x55, + 0x64, 0x4b, 0x31, 0x72, 0x7a, 0x74, 0x4d, 0x39, 0x71, 0x67, 0x39, 0x66, 0x52, 0x5a, 0x58, 0x6a, 0x5a, 0x55, + 0x55, 0x36, 0x70, 0x32, 0x32, 0x6a, 0x69, 0x53, 0x34, 0x39, 0x4c, 0x74, 0x39, 0x45, 0x30, 0x50, 0x73, 0x36, + 0x44, 0x5c, 0x0a, + 0x09, 0x35, 0x6f, 0x74, 0x66, 0x61, 0x5a, 0x49, 0x46, 0x67, 0x54, 0x41, 0x73, 0x68, 0x76, 0x46, 0x74, 0x77, + 0x6b, 0x63, 0x37, 0x33, 0x6c, 0x48, 0x6e, 0x6d, 0x73, 0x59, 0x4a, 0x53, 0x4f, 0x64, 0x6f, 0x49, 0x6f, 0x75, + 0x48, 0x70, 0x6e, 0x4f, 0x61, 0x52, 0x75, 0x6c, 0x73, 0x56, 0x46, 0x33, 0x75, 0x75, 0x4e, 0x71, 0x52, 0x6d, + 0x2b, 0x71, 0x74, 0x70, 0x45, 0x64, 0x62, 0x66, 0x33, 0x58, 0x72, 0x31, 0x6a, 0x6f, 0x57, 0x67, 0x50, 0x2f, + 0x2f, 0x5c, 0x0a, + 0x09, 0x4a, 0x79, 0x36, 0x2b, 0x34, 0x44, 0x6c, 0x76, 0x66, 0x50, 0x46, 0x7a, 0x71, 0x67, 0x73, 0x30, 0x58, + 0x51, 0x58, 0x4e, 0x47, 0x56, 0x2f, 0x49, 0x6c, 0x32, 0x53, 0x42, 0x64, 0x6c, 0x56, 0x6f, 0x7a, 0x58, 0x34, + 0x62, 0x73, 0x4c, 0x7a, 0x75, 0x55, 0x2f, 0x55, 0x58, 0x31, 0x6f, 0x64, 0x47, 0x72, 0x2b, 0x6f, 0x39, 0x67, + 0x6a, 0x2f, 0x75, 0x67, 0x41, 0x2b, 0x6b, 0x53, 0x58, 0x4f, 0x7a, 0x41, 0x73, 0x44, 0x4f, 0x61, 0x36, 0x58, + 0x78, 0x5c, 0x0a, + 0x09, 0x63, 0x6e, 0x72, 0x50, 0x64, 0x6a, 0x67, 0x48, 0x32, 0x4f, 0x61, 0x6f, 0x6e, 0x58, 0x59, 0x6c, 0x58, + 0x71, 0x44, 0x61, 0x49, 0x6e, 0x55, 0x2b, 0x50, 0x5a, 0x59, 0x38, 0x36, 0x50, 0x48, 0x77, 0x32, 0x6b, 0x31, + 0x39, 0x48, 0x38, 0x31, 0x78, 0x33, 0x55, 0x39, 0x7a, 0x2f, 0x61, 0x49, 0x6f, 0x6b, 0x4c, 0x4e, 0x62, 0x67, + 0x64, 0x2b, 0x4e, 0x4a, 0x54, 0x53, 0x50, 0x54, 0x73, 0x71, 0x33, 0x4f, 0x59, 0x62, 0x7a, 0x58, 0x43, 0x57, + 0x74, 0x5c, 0x0a, + 0x09, 0x4d, 0x30, 0x6f, 0x48, 0x7a, 0x61, 0x42, 0x67, 0x41, 0x31, 0x38, 0x6f, 0x4d, 0x57, 0x71, 0x64, 0x53, + 0x4c, 0x5a, 0x76, 0x77, 0x2b, 0x41, 0x6f, 0x50, 0x64, 0x6c, 0x41, 0x30, 0x74, 0x77, 0x76, 0x42, 0x38, 0x5a, + 0x71, 0x33, 0x47, 0x38, 0x42, 0x38, 0x4f, 0x72, 0x62, 0x72, 0x2f, 0x71, 0x53, 0x39, 0x35, 0x30, 0x52, 0x50, + 0x72, 0x4f, 0x61, 0x74, 0x47, 0x70, 0x50, 0x41, 0x32, 0x72, 0x36, 0x37, 0x70, 0x43, 0x4b, 0x50, 0x6b, 0x78, + 0x77, 0x5c, 0x0a, + 0x09, 0x4d, 0x77, 0x35, 0x75, 0x47, 0x6d, 0x69, 0x4b, 0x4c, 0x50, 0x62, 0x44, 0x46, 0x39, 0x4b, 0x74, 0x30, + 0x69, 0x68, 0x6e, 0x50, 0x57, 0x31, 0x6c, 0x47, 0x61, 0x64, 0x6c, 0x57, 0x4a, 0x59, 0x6a, 0x70, 0x51, 0x59, + 0x6b, 0x6a, 0x56, 0x61, 0x32, 0x6d, 0x50, 0x4a, 0x57, 0x74, 0x39, 0x48, 0x38, 0x31, 0x42, 0x6b, 0x48, 0x6b, + 0x5a, 0x58, 0x53, 0x38, 0x7a, 0x42, 0x47, 0x7a, 0x59, 0x4d, 0x65, 0x76, 0x39, 0x56, 0x2b, 0x52, 0x76, 0x5a, + 0x4f, 0x5c, 0x0a, + 0x09, 0x6a, 0x4b, 0x4f, 0x52, 0x41, 0x34, 0x7a, 0x6a, 0x55, 0x63, 0x36, 0x6a, 0x78, 0x77, 0x4d, 0x34, 0x79, + 0x4f, 0x63, 0x66, 0x4e, 0x45, 0x67, 0x33, 0x6a, 0x58, 0x63, 0x55, 0x4f, 0x49, 0x51, 0x32, 0x72, 0x48, 0x78, + 0x44, 0x77, 0x68, 0x56, 0x33, 0x30, 0x44, 0x52, 0x50, 0x73, 0x53, 0x4b, 0x30, 0x66, 0x46, 0x4c, 0x54, 0x44, + 0x6b, 0x68, 0x57, 0x76, 0x73, 0x50, 0x72, 0x57, 0x50, 0x71, 0x4d, 0x33, 0x37, 0x38, 0x65, 0x61, 0x71, 0x39, + 0x32, 0x5c, 0x0a, + 0x09, 0x6c, 0x42, 0x39, 0x46, 0x36, 0x2f, 0x4c, 0x6a, 0x6f, 0x4b, 0x4f, 0x4a, 0x41, 0x4c, 0x67, 0x46, 0x41, + 0x42, 0x2b, 0x51, 0x5a, 0x2f, 0x56, 0x43, 0x6b, 0x42, 0x53, 0x63, 0x4c, 0x68, 0x75, 0x75, 0x53, 0x55, 0x64, + 0x4e, 0x30, 0x33, 0x7a, 0x52, 0x4b, 0x32, 0x43, 0x32, 0x36, 0x70, 0x4b, 0x53, 0x36, 0x54, 0x57, 0x58, 0x6c, + 0x4c, 0x4f, 0x4e, 0x6f, 0x6a, 0x6d, 0x71, 0x45, 0x76, 0x76, 0x66, 0x67, 0x6f, 0x76, 0x67, 0x76, 0x43, 0x54, + 0x4f, 0x5c, 0x0a, + 0x09, 0x38, 0x54, 0x48, 0x79, 0x36, 0x4d, 0x4a, 0x62, 0x71, 0x35, 0x31, 0x58, 0x6d, 0x6d, 0x5a, 0x69, 0x75, + 0x45, 0x35, 0x7a, 0x6e, 0x58, 0x4b, 0x6e, 0x2b, 0x64, 0x50, 0x6a, 0x54, 0x72, 0x4f, 0x78, 0x4e, 0x42, 0x75, + 0x71, 0x36, 0x37, 0x71, 0x6b, 0x72, 0x41, 0x62, 0x7a, 0x55, 0x66, 0x4b, 0x56, 0x59, 0x36, 0x76, 0x62, 0x61, + 0x51, 0x4c, 0x6c, 0x64, 0x45, 0x7a, 0x61, 0x41, 0x58, 0x55, 0x57, 0x74, 0x6a, 0x4c, 0x76, 0x46, 0x74, 0x69, + 0x54, 0x5c, 0x0a, + 0x09, 0x4f, 0x75, 0x4b, 0x41, 0x4c, 0x4b, 0x2f, 0x4c, 0x57, 0x6b, 0x71, 0x4f, 0x56, 0x78, 0x6b, 0x73, 0x72, + 0x7a, 0x6c, 0x74, 0x4f, 0x41, 0x44, 0x63, 0x64, 0x74, 0x55, 0x56, 0x34, 0x66, 0x43, 0x74, 0x41, 0x41, 0x71, + 0x4e, 0x6a, 0x50, 0x34, 0x34, 0x4b, 0x4e, 0x70, 0x36, 0x6d, 0x30, 0x6f, 0x74, 0x38, 0x42, 0x53, 0x33, 0x6d, + 0x31, 0x66, 0x73, 0x51, 0x79, 0x6c, 0x74, 0x69, 0x4c, 0x79, 0x46, 0x46, 0x4d, 0x47, 0x74, 0x43, 0x43, 0x6a, + 0x76, 0x5c, 0x0a, + 0x09, 0x52, 0x33, 0x4e, 0x48, 0x73, 0x7a, 0x4d, 0x44, 0x7a, 0x59, 0x55, 0x38, 0x55, 0x2f, 0x65, 0x52, 0x76, + 0x6a, 0x34, 0x36, 0x6a, 0x55, 0x7a, 0x61, 0x58, 0x4f, 0x30, 0x78, 0x51, 0x68, 0x31, 0x48, 0x57, 0x52, 0x46, + 0x59, 0x71, 0x2f, 0x4c, 0x35, 0x69, 0x6e, 0x43, 0x6c, 0x48, 0x6b, 0x2b, 0x36, 0x4d, 0x6c, 0x39, 0x48, 0x2f, + 0x46, 0x51, 0x6e, 0x6e, 0x45, 0x69, 0x56, 0x35, 0x58, 0x64, 0x53, 0x6f, 0x44, 0x34, 0x74, 0x66, 0x75, 0x31, + 0x4d, 0x5c, 0x0a, + 0x09, 0x59, 0x7a, 0x53, 0x77, 0x32, 0x32, 0x33, 0x71, 0x67, 0x43, 0x44, 0x74, 0x70, 0x73, 0x6c, 0x47, 0x6d, + 0x6e, 0x6a, 0x56, 0x2f, 0x56, 0x74, 0x54, 0x30, 0x4a, 0x6f, 0x76, 0x45, 0x6e, 0x4b, 0x55, 0x65, 0x79, 0x48, + 0x6f, 0x4d, 0x41, 0x48, 0x58, 0x47, 0x63, 0x4e, 0x5a, 0x63, 0x39, 0x70, 0x77, 0x41, 0x41, 0x6a, 0x6b, 0x2f, + 0x4a, 0x75, 0x45, 0x2f, 0x6b, 0x5a, 0x48, 0x5a, 0x47, 0x36, 0x55, 0x58, 0x4d, 0x42, 0x79, 0x42, 0x56, 0x67, + 0x2f, 0x5c, 0x0a, + 0x09, 0x48, 0x44, 0x51, 0x71, 0x2f, 0x6b, 0x6f, 0x38, 0x62, 0x6a, 0x49, 0x6d, 0x33, 0x6f, 0x4a, 0x73, 0x57, + 0x2f, 0x65, 0x76, 0x55, 0x33, 0x6e, 0x4a, 0x75, 0x78, 0x30, 0x70, 0x5a, 0x44, 0x38, 0x45, 0x62, 0x71, 0x67, + 0x6b, 0x2b, 0x70, 0x45, 0x77, 0x70, 0x45, 0x64, 0x56, 0x47, 0x31, 0x4e, 0x61, 0x4b, 0x6f, 0x32, 0x55, 0x75, + 0x6f, 0x53, 0x56, 0x59, 0x65, 0x6b, 0x78, 0x31, 0x4f, 0x56, 0x53, 0x57, 0x65, 0x72, 0x7a, 0x2b, 0x74, 0x5a, + 0x6e, 0x5c, 0x0a, + 0x09, 0x71, 0x67, 0x55, 0x58, 0x2b, 0x65, 0x56, 0x6a, 0x31, 0x65, 0x50, 0x53, 0x51, 0x43, 0x52, 0x35, 0x6c, + 0x52, 0x5a, 0x67, 0x5a, 0x51, 0x37, 0x61, 0x53, 0x58, 0x55, 0x66, 0x56, 0x74, 0x38, 0x61, 0x5a, 0x4e, 0x4b, + 0x6f, 0x62, 0x67, 0x57, 0x59, 0x5a, 0x71, 0x44, 0x56, 0x59, 0x4d, 0x5a, 0x33, 0x6e, 0x36, 0x62, 0x42, 0x78, + 0x48, 0x30, 0x47, 0x4c, 0x50, 0x69, 0x74, 0x4a, 0x78, 0x30, 0x54, 0x41, 0x48, 0x44, 0x62, 0x56, 0x56, 0x38, + 0x43, 0x5c, 0x0a, + 0x09, 0x41, 0x44, 0x6a, 0x67, 0x74, 0x51, 0x51, 0x73, 0x63, 0x6e, 0x4e, 0x4f, 0x6f, 0x33, 0x30, 0x67, 0x2f, + 0x68, 0x77, 0x41, 0x56, 0x37, 0x73, 0x38, 0x73, 0x6a, 0x66, 0x4f, 0x31, 0x75, 0x55, 0x30, 0x77, 0x6b, 0x4d, + 0x64, 0x38, 0x37, 0x4d, 0x57, 0x79, 0x48, 0x42, 0x46, 0x63, 0x6d, 0x54, 0x6e, 0x34, 0x43, 0x4a, 0x62, 0x61, + 0x62, 0x34, 0x57, 0x61, 0x6b, 0x6f, 0x48, 0x73, 0x4a, 0x39, 0x61, 0x35, 0x41, 0x36, 0x76, 0x6a, 0x59, 0x33, + 0x33, 0x5c, 0x0a, + 0x09, 0x6f, 0x31, 0x31, 0x5a, 0x52, 0x37, 0x4a, 0x52, 0x32, 0x55, 0x6e, 0x49, 0x75, 0x6b, 0x49, 0x4e, 0x69, + 0x32, 0x66, 0x65, 0x72, 0x6a, 0x56, 0x4e, 0x6b, 0x34, 0x43, 0x70, 0x39, 0x32, 0x50, 0x59, 0x50, 0x33, 0x32, + 0x6d, 0x78, 0x38, 0x47, 0x50, 0x35, 0x59, 0x33, 0x57, 0x70, 0x6a, 0x4a, 0x32, 0x66, 0x51, 0x37, 0x32, 0x54, + 0x57, 0x73, 0x6a, 0x71, 0x52, 0x31, 0x59, 0x62, 0x33, 0x37, 0x69, 0x4f, 0x56, 0x50, 0x61, 0x31, 0x30, 0x71, + 0x67, 0x5c, 0x0a, + 0x09, 0x78, 0x44, 0x50, 0x5a, 0x36, 0x73, 0x6f, 0x2f, 0x4f, 0x4e, 0x52, 0x2b, 0x73, 0x4a, 0x35, 0x30, 0x54, + 0x41, 0x41, 0x41, 0x6f, 0x35, 0x73, 0x42, 0x2f, 0x49, 0x35, 0x47, 0x30, 0x4b, 0x62, 0x49, 0x36, 0x55, 0x78, + 0x7a, 0x6b, 0x4b, 0x57, 0x61, 0x31, 0x77, 0x35, 0x30, 0x70, 0x45, 0x30, 0x6a, 0x46, 0x74, 0x2b, 0x5a, 0x6f, + 0x4f, 0x65, 0x41, 0x54, 0x61, 0x6b, 0x65, 0x32, 0x48, 0x57, 0x64, 0x72, 0x59, 0x42, 0x39, 0x74, 0x2f, 0x69, + 0x52, 0x5c, 0x0a, + 0x09, 0x6e, 0x47, 0x75, 0x44, 0x6c, 0x30, 0x35, 0x4e, 0x72, 0x49, 0x37, 0x56, 0x76, 0x78, 0x32, 0x35, 0x37, + 0x4e, 0x7a, 0x49, 0x79, 0x6e, 0x44, 0x71, 0x75, 0x6d, 0x6c, 0x32, 0x6b, 0x59, 0x4b, 0x48, 0x4c, 0x65, 0x4e, + 0x61, 0x44, 0x6d, 0x46, 0x70, 0x7a, 0x53, 0x72, 0x6e, 0x7a, 0x47, 0x39, 0x4e, 0x6d, 0x5a, 0x6c, 0x32, 0x57, + 0x4e, 0x32, 0x58, 0x35, 0x42, 0x32, 0x6f, 0x6f, 0x59, 0x65, 0x45, 0x50, 0x76, 0x52, 0x47, 0x71, 0x32, 0x5a, + 0x41, 0x5c, 0x0a, + 0x09, 0x35, 0x4d, 0x43, 0x58, 0x51, 0x72, 0x5a, 0x6c, 0x6d, 0x31, 0x5a, 0x2f, 0x6e, 0x43, 0x39, 0x65, 0x7a, + 0x38, 0x45, 0x56, 0x44, 0x76, 0x68, 0x37, 0x6f, 0x35, 0x6c, 0x31, 0x6f, 0x57, 0x4d, 0x47, 0x41, 0x47, 0x36, + 0x76, 0x73, 0x34, 0x44, 0x66, 0x64, 0x6d, 0x71, 0x33, 0x6b, 0x35, 0x57, 0x4f, 0x6a, 0x34, 0x35, 0x34, 0x61, + 0x54, 0x61, 0x51, 0x70, 0x76, 0x6a, 0x4e, 0x76, 0x37, 0x6e, 0x48, 0x79, 0x33, 0x44, 0x6a, 0x64, 0x36, 0x71, + 0x38, 0x5c, 0x0a, + 0x09, 0x5a, 0x54, 0x77, 0x36, 0x4c, 0x65, 0x56, 0x4f, 0x56, 0x4a, 0x74, 0x2f, 0x32, 0x70, 0x36, 0x56, 0x54, + 0x4b, 0x5a, 0x67, 0x45, 0x39, 0x61, 0x33, 0x36, 0x33, 0x5a, 0x30, 0x6e, 0x38, 0x79, 0x77, 0x6b, 0x72, 0x71, + 0x36, 0x50, 0x57, 0x73, 0x73, 0x6d, 0x6d, 0x51, 0x32, 0x6b, 0x6c, 0x37, 0x54, 0x33, 0x47, 0x74, 0x51, 0x61, + 0x67, 0x4b, 0x50, 0x4d, 0x42, 0x70, 0x2b, 0x74, 0x63, 0x6d, 0x5a, 0x65, 0x42, 0x38, 0x79, 0x6f, 0x78, 0x69, + 0x74, 0x5c, 0x0a, + 0x09, 0x6a, 0x79, 0x43, 0x68, 0x4f, 0x76, 0x6e, 0x6d, 0x2f, 0x4e, 0x6b, 0x62, 0x74, 0x64, 0x49, 0x78, 0x38, + 0x58, 0x55, 0x44, 0x43, 0x61, 0x41, 0x36, 0x30, 0x76, 0x4f, 0x78, 0x38, 0x4a, 0x57, 0x56, 0x74, 0x43, 0x2b, + 0x52, 0x31, 0x58, 0x30, 0x59, 0x77, 0x46, 0x33, 0x59, 0x49, 0x44, 0x70, 0x6d, 0x41, 0x49, 0x44, 0x52, 0x45, + 0x4d, 0x42, 0x7a, 0x41, 0x64, 0x79, 0x34, 0x55, 0x6b, 0x47, 0x5a, 0x6f, 0x71, 0x62, 0x4f, 0x31, 0x42, 0x54, + 0x6c, 0x5c, 0x0a, + 0x09, 0x6d, 0x6f, 0x79, 0x61, 0x52, 0x79, 0x7a, 0x5a, 0x33, 0x74, 0x45, 0x35, 0x53, 0x37, 0x68, 0x75, 0x67, + 0x5a, 0x4e, 0x75, 0x54, 0x33, 0x4b, 0x71, 0x6f, 0x36, 0x6c, 0x63, 0x37, 0x5a, 0x66, 0x58, 0x74, 0x44, 0x6d, + 0x6e, 0x6a, 0x71, 0x30, 0x4e, 0x73, 0x6b, 0x35, 0x6c, 0x4a, 0x53, 0x65, 0x6c, 0x53, 0x2b, 0x56, 0x6e, 0x38, + 0x63, 0x6a, 0x35, 0x30, 0x55, 0x44, 0x44, 0x36, 0x2b, 0x71, 0x73, 0x62, 0x47, 0x56, 0x79, 0x4a, 0x71, 0x38, + 0x63, 0x5c, 0x0a, + 0x09, 0x79, 0x4a, 0x73, 0x79, 0x46, 0x6a, 0x34, 0x42, 0x63, 0x4f, 0x4a, 0x38, 0x7a, 0x62, 0x48, 0x64, 0x74, + 0x75, 0x64, 0x53, 0x32, 0x67, 0x44, 0x46, 0x64, 0x75, 0x78, 0x41, 0x6b, 0x50, 0x49, 0x58, 0x61, 0x6a, 0x57, + 0x56, 0x30, 0x32, 0x65, 0x6c, 0x76, 0x63, 0x58, 0x2b, 0x53, 0x77, 0x4c, 0x65, 0x42, 0x4e, 0x51, 0x42, 0x63, + 0x4c, 0x33, 0x70, 0x6d, 0x41, 0x49, 0x41, 0x4a, 0x6f, 0x53, 0x37, 0x48, 0x58, 0x41, 0x78, 0x67, 0x4b, 0x73, + 0x74, 0x5c, 0x0a, + 0x09, 0x42, 0x35, 0x63, 0x6f, 0x72, 0x4f, 0x38, 0x41, 0x2b, 0x4a, 0x4a, 0x53, 0x57, 0x55, 0x31, 0x6d, 0x7a, + 0x59, 0x2f, 0x54, 0x65, 0x39, 0x49, 0x61, 0x37, 0x62, 0x55, 0x6a, 0x38, 0x32, 0x6a, 0x4d, 0x4d, 0x35, 0x4f, + 0x6d, 0x74, 0x4e, 0x4b, 0x4b, 0x68, 0x6d, 0x6c, 0x61, 0x6e, 0x34, 0x37, 0x4a, 0x63, 0x6d, 0x34, 0x4c, 0x37, + 0x4e, 0x49, 0x73, 0x52, 0x34, 0x37, 0x55, 0x6e, 0x67, 0x44, 0x59, 0x6d, 0x55, 0x4b, 0x41, 0x49, 0x53, 0x66, + 0x71, 0x5c, 0x0a, + 0x09, 0x70, 0x57, 0x50, 0x55, 0x6a, 0x71, 0x6e, 0x35, 0x74, 0x63, 0x64, 0x58, 0x66, 0x32, 0x71, 0x51, 0x6c, + 0x58, 0x70, 0x4c, 0x64, 0x2b, 0x4f, 0x6c, 0x59, 0x4b, 0x71, 0x31, 0x4a, 0x72, 0x2f, 0x70, 0x6a, 0x46, 0x48, + 0x66, 0x53, 0x41, 0x57, 0x43, 0x76, 0x43, 0x31, 0x48, 0x72, 0x65, 0x58, 0x51, 0x42, 0x4b, 0x34, 0x31, 0x4c, + 0x35, 0x53, 0x4d, 0x52, 0x5a, 0x4d, 0x4f, 0x49, 0x67, 0x35, 0x34, 0x73, 0x77, 0x4f, 0x75, 0x73, 0x71, 0x31, + 0x7a, 0x5c, 0x0a, + 0x09, 0x66, 0x65, 0x69, 0x59, 0x41, 0x67, 0x42, 0x41, 0x67, 0x4d, 0x44, 0x4e, 0x44, 0x72, 0x67, 0x51, 0x63, + 0x47, 0x38, 0x44, 0x4d, 0x4d, 0x66, 0x4c, 0x6a, 0x42, 0x49, 0x59, 0x4e, 0x31, 0x69, 0x74, 0x4c, 0x47, 0x31, + 0x77, 0x32, 0x6d, 0x41, 0x73, 0x42, 0x65, 0x6f, 0x37, 0x44, 0x47, 0x6c, 0x76, 0x69, 0x44, 0x30, 0x32, 0x70, + 0x63, 0x6e, 0x61, 0x43, 0x47, 0x58, 0x4e, 0x39, 0x4e, 0x77, 0x6f, 0x67, 0x39, 0x4f, 0x52, 0x57, 0x50, 0x63, + 0x42, 0x5c, 0x0a, + 0x09, 0x39, 0x53, 0x6d, 0x6a, 0x70, 0x61, 0x71, 0x54, 0x43, 0x57, 0x4d, 0x55, 0x73, 0x75, 0x50, 0x72, 0x2b, + 0x52, 0x59, 0x76, 0x2b, 0x6c, 0x62, 0x65, 0x53, 0x6d, 0x4f, 0x71, 0x51, 0x53, 0x67, 0x46, 0x67, 0x39, 0x52, + 0x42, 0x65, 0x56, 0x30, 0x37, 0x47, 0x39, 0x4c, 0x6a, 0x35, 0x35, 0x39, 0x4e, 0x35, 0x51, 0x44, 0x75, 0x37, + 0x48, 0x57, 0x57, 0x74, 0x37, 0x49, 0x44, 0x36, 0x6c, 0x47, 0x6b, 0x41, 0x43, 0x64, 0x7a, 0x45, 0x6e, 0x6d, + 0x37, 0x5c, 0x0a, + 0x09, 0x32, 0x67, 0x42, 0x76, 0x52, 0x38, 0x41, 0x37, 0x55, 0x50, 0x32, 0x49, 0x37, 0x6b, 0x59, 0x73, 0x2f, + 0x67, 0x55, 0x36, 0x35, 0x67, 0x41, 0x41, 0x45, 0x43, 0x41, 0x77, 0x35, 0x2f, 0x79, 0x76, 0x6f, 0x68, 0x35, + 0x50, 0x66, 0x6c, 0x72, 0x77, 0x4a, 0x77, 0x43, 0x2b, 0x44, 0x61, 0x53, 0x47, 0x45, 0x38, 0x34, 0x46, 0x6b, + 0x74, 0x64, 0x47, 0x4a, 0x36, 0x56, 0x70, 0x6a, 0x75, 0x47, 0x50, 0x72, 0x61, 0x69, 0x72, 0x67, 0x55, 0x41, + 0x36, 0x5c, 0x0a, + 0x09, 0x6d, 0x34, 0x34, 0x73, 0x4e, 0x67, 0x69, 0x46, 0x38, 0x74, 0x71, 0x68, 0x69, 0x56, 0x32, 0x78, 0x30, + 0x74, 0x6f, 0x6d, 0x33, 0x76, 0x51, 0x66, 0x72, 0x79, 0x65, 0x6a, 0x62, 0x66, 0x50, 0x4f, 0x76, 0x78, 0x54, + 0x38, 0x30, 0x74, 0x32, 0x46, 0x65, 0x6e, 0x53, 0x57, 0x37, 0x44, 0x56, 0x66, 0x64, 0x64, 0x74, 0x4e, 0x4f, + 0x79, 0x5a, 0x72, 0x52, 0x39, 0x66, 0x5a, 0x42, 0x6c, 0x69, 0x39, 0x6c, 0x4f, 0x50, 0x52, 0x36, 0x58, 0x67, + 0x4b, 0x5c, 0x0a, + 0x09, 0x67, 0x69, 0x6b, 0x51, 0x41, 0x44, 0x59, 0x76, 0x74, 0x73, 0x78, 0x6c, 0x32, 0x37, 0x71, 0x63, 0x6c, + 0x48, 0x73, 0x4b, 0x47, 0x42, 0x55, 0x64, 0x64, 0x4d, 0x41, 0x66, 0x41, 0x58, 0x69, 0x55, 0x41, 0x33, 0x34, + 0x4a, 0x51, 0x44, 0x6d, 0x69, 0x6d, 0x33, 0x57, 0x68, 0x4e, 0x58, 0x73, 0x57, 0x59, 0x4c, 0x57, 0x49, 0x2f, + 0x78, 0x49, 0x71, 0x45, 0x2f, 0x67, 0x4f, 0x41, 0x68, 0x34, 0x33, 0x6e, 0x44, 0x76, 0x79, 0x63, 0x33, 0x44, + 0x6c, 0x5c, 0x0a, + 0x09, 0x73, 0x36, 0x6e, 0x62, 0x52, 0x39, 0x37, 0x74, 0x77, 0x57, 0x57, 0x5a, 0x4b, 0x4e, 0x66, 0x6b, 0x72, + 0x45, 0x44, 0x74, 0x45, 0x50, 0x37, 0x59, 0x6d, 0x66, 0x56, 0x30, 0x6c, 0x41, 0x72, 0x48, 0x69, 0x70, 0x63, + 0x59, 0x4c, 0x61, 0x32, 0x36, 0x73, 0x69, 0x2f, 0x37, 0x31, 0x70, 0x55, 0x33, 0x66, 0x76, 0x30, 0x54, 0x57, + 0x4f, 0x6c, 0x57, 0x59, 0x63, 0x76, 0x4a, 0x36, 0x76, 0x34, 0x34, 0x44, 0x38, 0x30, 0x6d, 0x48, 0x4b, 0x34, + 0x37, 0x5c, 0x0a, + 0x09, 0x4f, 0x46, 0x44, 0x56, 0x67, 0x4f, 0x62, 0x62, 0x48, 0x71, 0x4e, 0x64, 0x4c, 0x76, 0x33, 0x6b, 0x4d, + 0x56, 0x48, 0x79, 0x72, 0x33, 0x6e, 0x57, 0x37, 0x58, 0x49, 0x65, 0x56, 0x78, 0x70, 0x7a, 0x55, 0x2f, 0x76, + 0x68, 0x57, 0x39, 0x4f, 0x6d, 0x6e, 0x46, 0x46, 0x39, 0x57, 0x37, 0x70, 0x70, 0x47, 0x69, 0x75, 0x48, 0x4e, + 0x55, 0x74, 0x76, 0x31, 0x62, 0x6b, 0x35, 0x41, 0x46, 0x38, 0x45, 0x38, 0x43, 0x6b, 0x48, 0x66, 0x49, 0x71, + 0x41, 0x5c, 0x0a, + 0x09, 0x4b, 0x78, 0x79, 0x77, 0x48, 0x45, 0x70, 0x75, 0x5a, 0x4f, 0x51, 0x50, 0x64, 0x4d, 0x77, 0x44, 0x67, + 0x4b, 0x59, 0x41, 0x43, 0x4c, 0x50, 0x33, 0x33, 0x59, 0x32, 0x5a, 0x75, 0x32, 0x35, 0x37, 0x50, 0x59, 0x44, + 0x58, 0x68, 0x57, 0x75, 0x39, 0x73, 0x54, 0x47, 0x4d, 0x54, 0x55, 0x77, 0x69, 0x37, 0x2f, 0x61, 0x51, 0x64, + 0x2f, 0x76, 0x49, 0x75, 0x6c, 0x33, 0x6b, 0x6e, 0x51, 0x36, 0x51, 0x64, 0x5a, 0x48, 0x2f, 0x6e, 0x2f, 0x62, + 0x75, 0x5c, 0x0a, + 0x09, 0x33, 0x73, 0x65, 0x4e, 0x49, 0x67, 0x37, 0x6a, 0x2b, 0x48, 0x66, 0x73, 0x6e, 0x4f, 0x39, 0x38, 0x75, + 0x75, 0x53, 0x4d, 0x6c, 0x45, 0x52, 0x45, 0x53, 0x68, 0x6f, 0x4b, 0x6f, 0x45, 0x45, 0x52, 0x46, 0x4e, 0x42, + 0x52, 0x30, 0x46, 0x4d, 0x68, 0x55, 0x64, 0x4e, 0x52, 0x49, 0x53, 0x45, 0x71, 0x61, 0x76, 0x34, 0x41, 0x30, + 0x69, 0x48, 0x45, 0x50, 0x34, 0x41, 0x6f, 0x45, 0x4a, 0x52, 0x49, 0x55, 0x59, 0x51, 0x69, 0x51, 0x55, 0x53, + 0x56, 0x5c, 0x0a, + 0x09, 0x41, 0x71, 0x56, 0x42, 0x52, 0x4a, 0x45, 0x53, 0x68, 0x55, 0x4d, 0x6f, 0x51, 0x46, 0x37, 0x4f, 0x54, + 0x6f, 0x7a, 0x74, 0x33, 0x52, 0x2f, 0x46, 0x37, 0x4a, 0x35, 0x6e, 0x33, 0x32, 0x78, 0x66, 0x58, 0x70, 0x52, + 0x62, 0x7a, 0x2f, 0x4e, 0x70, 0x37, 0x72, 0x7a, 0x65, 0x6c, 0x31, 0x6e, 0x76, 0x7a, 0x4c, 0x4f, 0x7a, 0x34, + 0x37, 0x57, 0x39, 0x63, 0x51, 0x7a, 0x72, 0x46, 0x44, 0x2f, 0x35, 0x6c, 0x76, 0x38, 0x50, 0x70, 0x59, 0x5a, + 0x52, 0x5c, 0x0a, + 0x09, 0x6d, 0x46, 0x61, 0x65, 0x74, 0x33, 0x4b, 0x51, 0x61, 0x79, 0x70, 0x55, 0x33, 0x58, 0x72, 0x71, 0x7a, + 0x2b, 0x79, 0x4c, 0x7a, 0x6a, 0x5a, 0x4e, 0x35, 0x61, 0x78, 0x62, 0x76, 0x72, 0x6b, 0x42, 0x46, 0x43, 0x74, + 0x71, 0x57, 0x42, 0x5a, 0x6e, 0x76, 0x69, 0x39, 0x61, 0x33, 0x6c, 0x64, 0x58, 0x57, 0x63, 0x66, 0x63, 0x6f, + 0x70, 0x41, 0x4c, 0x79, 0x31, 0x33, 0x65, 0x69, 0x2b, 0x5a, 0x39, 0x4c, 0x41, 0x5a, 0x47, 0x58, 0x57, 0x67, + 0x76, 0x5c, 0x0a, + 0x09, 0x4f, 0x78, 0x75, 0x48, 0x32, 0x31, 0x2f, 0x55, 0x36, 0x4a, 0x76, 0x4b, 0x32, 0x37, 0x53, 0x74, 0x70, + 0x6c, 0x43, 0x63, 0x6c, 0x2f, 0x58, 0x67, 0x37, 0x65, 0x46, 0x39, 0x2f, 0x49, 0x31, 0x73, 0x31, 0x2f, 0x46, + 0x33, 0x39, 0x50, 0x31, 0x71, 0x2f, 0x74, 0x62, 0x65, 0x47, 0x35, 0x54, 0x4f, 0x38, 0x6b, 0x65, 0x6c, 0x34, + 0x65, 0x65, 0x65, 0x32, 0x59, 0x65, 0x42, 0x6e, 0x70, 0x58, 0x38, 0x38, 0x73, 0x44, 0x35, 0x4c, 0x30, 0x72, + 0x6f, 0x5c, 0x0a, + 0x09, 0x75, 0x50, 0x78, 0x37, 0x37, 0x63, 0x79, 0x59, 0x6a, 0x4d, 0x64, 0x4d, 0x78, 0x75, 0x50, 0x47, 0x5a, + 0x54, 0x76, 0x64, 0x4c, 0x72, 0x32, 0x74, 0x50, 0x68, 0x75, 0x39, 0x6e, 0x67, 0x2b, 0x4a, 0x54, 0x68, 0x65, + 0x36, 0x48, 0x54, 0x59, 0x32, 0x74, 0x33, 0x34, 0x2f, 0x74, 0x6a, 0x4f, 0x34, 0x41, 0x6e, 0x62, 0x61, 0x77, + 0x55, 0x6d, 0x44, 0x30, 0x38, 0x42, 0x70, 0x68, 0x2b, 0x74, 0x58, 0x42, 0x34, 0x65, 0x73, 0x55, 0x6d, 0x6c, + 0x7a, 0x5c, 0x0a, + 0x09, 0x38, 0x38, 0x70, 0x69, 0x6c, 0x55, 0x59, 0x55, 0x76, 0x69, 0x31, 0x58, 0x37, 0x6f, 0x36, 0x47, 0x5a, + 0x35, 0x43, 0x6d, 0x77, 0x61, 0x6a, 0x79, 0x76, 0x50, 0x57, 0x39, 0x6a, 0x4f, 0x4a, 0x38, 0x52, 0x74, 0x36, + 0x78, 0x72, 0x6a, 0x4a, 0x38, 0x34, 0x38, 0x2f, 0x4c, 0x57, 0x52, 0x77, 0x32, 0x7a, 0x51, 0x4b, 0x69, 0x73, + 0x5a, 0x7a, 0x56, 0x62, 0x54, 0x61, 0x46, 0x52, 0x2f, 0x48, 0x75, 0x7a, 0x65, 0x72, 0x79, 0x35, 0x53, 0x61, + 0x32, 0x5c, 0x0a, + 0x09, 0x72, 0x41, 0x48, 0x6d, 0x70, 0x51, 0x31, 0x44, 0x5a, 0x58, 0x46, 0x33, 0x6e, 0x4e, 0x4a, 0x38, 0x78, + 0x58, 0x31, 0x72, 0x4f, 0x74, 0x76, 0x50, 0x4a, 0x36, 0x5a, 0x59, 0x6b, 0x70, 0x44, 0x4f, 0x45, 0x69, 0x79, + 0x5a, 0x6b, 0x73, 0x36, 0x6d, 0x70, 0x4e, 0x4d, 0x4a, 0x53, 0x54, 0x49, 0x6a, 0x6e, 0x55, 0x34, 0x5a, 0x50, + 0x78, 0x7a, 0x65, 0x33, 0x6a, 0x35, 0x31, 0x35, 0x74, 0x7a, 0x32, 0x43, 0x79, 0x63, 0x62, 0x41, 0x2f, 0x31, + 0x35, 0x5c, 0x0a, + 0x09, 0x6a, 0x66, 0x43, 0x76, 0x6f, 0x6e, 0x55, 0x42, 0x55, 0x44, 0x49, 0x4b, 0x65, 0x7a, 0x44, 0x4f, 0x4f, + 0x52, 0x62, 0x31, 0x61, 0x4e, 0x49, 0x6b, 0x59, 0x54, 0x77, 0x61, 0x4d, 0x68, 0x35, 0x56, 0x6e, 0x76, 0x70, + 0x79, 0x63, 0x4f, 0x62, 0x73, 0x35, 0x7a, 0x75, 0x6e, 0x7a, 0x70, 0x51, 0x61, 0x74, 0x50, 0x57, 0x41, 0x58, + 0x57, 0x41, 0x41, 0x37, 0x4c, 0x72, 0x73, 0x4c, 0x39, 0x6a, 0x41, 0x5a, 0x64, 0x4d, 0x64, 0x62, 0x68, 0x64, + 0x73, 0x5c, 0x0a, + 0x09, 0x31, 0x32, 0x44, 0x67, 0x59, 0x47, 0x43, 0x77, 0x34, 0x32, 0x41, 0x4c, 0x32, 0x41, 0x45, 0x37, 0x37, + 0x71, 0x41, 0x50, 0x72, 0x6c, 0x39, 0x2f, 0x39, 0x69, 0x2f, 0x33, 0x43, 0x70, 0x6f, 0x61, 0x58, 0x66, 0x33, + 0x33, 0x46, 0x31, 0x44, 0x7a, 0x4f, 0x43, 0x74, 0x33, 0x46, 0x6a, 0x5a, 0x4e, 0x50, 0x36, 0x30, 0x64, 0x72, + 0x69, 0x73, 0x73, 0x67, 0x77, 0x58, 0x50, 0x7a, 0x78, 0x74, 0x4b, 0x65, 0x56, 0x76, 0x4c, 0x4c, 0x67, 0x76, + 0x43, 0x5c, 0x0a, + 0x09, 0x55, 0x71, 0x31, 0x32, 0x52, 0x6d, 0x34, 0x65, 0x62, 0x36, 0x6a, 0x66, 0x52, 0x76, 0x30, 0x50, 0x66, + 0x72, 0x6a, 0x53, 0x65, 0x6f, 0x4a, 0x74, 0x4a, 0x4d, 0x44, 0x51, 0x34, 0x44, 0x37, 0x59, 0x45, 0x4e, 0x77, + 0x6f, 0x6e, 0x55, 0x78, 0x4f, 0x70, 0x4e, 0x4e, 0x48, 0x72, 0x36, 0x52, 0x70, 0x69, 0x69, 0x56, 0x54, 0x62, + 0x4a, 0x61, 0x51, 0x70, 0x41, 0x6c, 0x70, 0x4f, 0x73, 0x4e, 0x6d, 0x43, 0x62, 0x50, 0x70, 0x68, 0x50, 0x38, + 0x65, 0x5c, 0x0a, + 0x09, 0x50, 0x53, 0x4b, 0x5a, 0x7a, 0x56, 0x68, 0x69, 0x50, 0x50, 0x33, 0x6a, 0x4a, 0x76, 0x2f, 0x65, 0x75, + 0x72, 0x46, 0x73, 0x76, 0x69, 0x4f, 0x70, 0x37, 0x51, 0x46, 0x77, 0x4b, 0x33, 0x79, 0x77, 0x79, 0x75, 0x56, + 0x4d, 0x54, 0x55, 0x69, 0x4d, 0x67, 0x61, 0x2f, 0x76, 0x2f, 0x58, 0x6d, 0x62, 0x75, 0x33, 0x76, 0x7a, 0x33, + 0x7a, 0x50, 0x4d, 0x4c, 0x6a, 0x55, 0x6d, 0x77, 0x42, 0x33, 0x67, 0x54, 0x72, 0x57, 0x62, 0x66, 0x62, 0x44, + 0x56, 0x5c, 0x0a, + 0x09, 0x53, 0x73, 0x4f, 0x6f, 0x6e, 0x6c, 0x6b, 0x4d, 0x68, 0x7a, 0x74, 0x68, 0x57, 0x4e, 0x38, 0x48, 0x41, + 0x67, 0x4f, 0x67, 0x62, 0x39, 0x69, 0x57, 0x38, 0x38, 0x47, 0x79, 0x62, 0x64, 0x44, 0x44, 0x68, 0x38, 0x55, + 0x6d, 0x50, 0x6e, 0x69, 0x32, 0x67, 0x61, 0x37, 0x42, 0x38, 0x53, 0x77, 0x59, 0x42, 0x74, 0x6c, 0x36, 0x6a, + 0x77, 0x4e, 0x64, 0x35, 0x73, 0x76, 0x30, 0x73, 0x75, 0x58, 0x7a, 0x37, 0x66, 0x65, 0x79, 0x35, 0x38, 0x67, + 0x61, 0x5c, 0x0a, + 0x09, 0x63, 0x4d, 0x39, 0x67, 0x32, 0x34, 0x48, 0x72, 0x4f, 0x74, 0x63, 0x46, 0x4e, 0x6d, 0x5a, 0x6d, 0x50, + 0x53, 0x75, 0x55, 0x4c, 0x6e, 0x74, 0x74, 0x43, 0x76, 0x32, 0x47, 0x34, 0x6d, 0x74, 0x5a, 0x50, 0x6f, 0x75, + 0x48, 0x44, 0x61, 0x7a, 0x75, 0x74, 0x51, 0x6b, 0x65, 0x54, 0x38, 0x45, 0x39, 0x44, 0x4f, 0x4d, 0x6d, 0x2b, + 0x33, 0x74, 0x76, 0x58, 0x67, 0x49, 0x53, 0x59, 0x44, 0x2f, 0x62, 0x34, 0x6e, 0x32, 0x48, 0x4d, 0x38, 0x4f, + 0x47, 0x5c, 0x0a, + 0x09, 0x2b, 0x48, 0x74, 0x43, 0x78, 0x73, 0x34, 0x66, 0x6f, 0x79, 0x6e, 0x2b, 0x6d, 0x74, 0x71, 0x41, 0x2b, + 0x39, 0x6b, 0x36, 0x48, 0x68, 0x68, 0x4d, 0x48, 0x65, 0x79, 0x62, 0x2f, 0x2b, 0x61, 0x63, 0x6b, 0x59, 0x4d, + 0x68, 0x75, 0x42, 0x48, 0x2b, 0x38, 0x58, 0x36, 0x32, 0x7a, 0x44, 0x67, 0x38, 0x4e, 0x71, 0x4f, 0x2f, 0x2f, + 0x2b, 0x4c, 0x65, 0x33, 0x73, 0x32, 0x50, 0x38, 0x52, 0x39, 0x41, 0x4f, 0x37, 0x52, 0x53, 0x48, 0x64, 0x70, + 0x4c, 0x5c, 0x0a, + 0x09, 0x30, 0x2b, 0x63, 0x2b, 0x6c, 0x76, 0x66, 0x59, 0x57, 0x68, 0x30, 0x41, 0x7a, 0x72, 0x6c, 0x66, 0x38, + 0x67, 0x4d, 0x52, 0x58, 0x67, 0x6f, 0x30, 0x7a, 0x49, 0x75, 0x5a, 0x31, 0x54, 0x31, 0x2f, 0x67, 0x5a, 0x6f, + 0x37, 0x73, 0x5a, 0x35, 0x6d, 0x74, 0x2b, 0x33, 0x63, 0x2b, 0x62, 0x63, 0x77, 0x37, 0x41, 0x47, 0x2b, 0x77, + 0x68, 0x61, 0x55, 0x4c, 0x79, 0x47, 0x61, 0x4c, 0x69, 0x33, 0x43, 0x2f, 0x38, 0x73, 0x39, 0x67, 0x55, 0x57, + 0x78, 0x5c, 0x0a, + 0x09, 0x46, 0x7a, 0x5a, 0x4f, 0x73, 0x2b, 0x71, 0x5a, 0x74, 0x74, 0x54, 0x6a, 0x77, 0x63, 0x47, 0x75, 0x48, + 0x59, 0x77, 0x4d, 0x65, 0x50, 0x58, 0x42, 0x56, 0x37, 0x75, 0x64, 0x45, 0x64, 0x6b, 0x67, 0x56, 0x32, 0x47, + 0x37, 0x77, 0x56, 0x5a, 0x57, 0x75, 0x52, 0x59, 0x76, 0x68, 0x30, 0x2f, 0x64, 0x76, 0x69, 0x35, 0x36, 0x66, + 0x61, 0x6a, 0x5a, 0x58, 0x6e, 0x67, 0x38, 0x73, 0x37, 0x70, 0x79, 0x74, 0x33, 0x35, 0x50, 0x4b, 0x4d, 0x78, + 0x58, 0x5c, 0x0a, + 0x09, 0x56, 0x35, 0x39, 0x4b, 0x30, 0x79, 0x34, 0x76, 0x57, 0x38, 0x39, 0x52, 0x31, 0x72, 0x70, 0x42, 0x77, + 0x46, 0x79, 0x6e, 0x30, 0x38, 0x6b, 0x50, 0x78, 0x47, 0x58, 0x67, 0x37, 0x57, 0x58, 0x7a, 0x4e, 0x78, 0x7a, + 0x4d, 0x48, 0x34, 0x42, 0x33, 0x67, 0x56, 0x6c, 0x62, 0x58, 0x34, 0x65, 0x6e, 0x36, 0x64, 0x7a, 0x35, 0x4e, + 0x78, 0x65, 0x47, 0x79, 0x53, 0x71, 0x4f, 0x32, 0x69, 0x42, 0x58, 0x6e, 0x53, 0x77, 0x41, 0x33, 0x67, 0x45, + 0x75, 0x5c, 0x0a, + 0x09, 0x72, 0x54, 0x70, 0x2f, 0x51, 0x2f, 0x31, 0x49, 0x67, 0x46, 0x65, 0x42, 0x36, 0x32, 0x32, 0x74, 0x50, + 0x36, 0x30, 0x4e, 0x41, 0x44, 0x67, 0x34, 0x6b, 0x47, 0x2f, 0x67, 0x50, 0x7a, 0x76, 0x51, 0x4f, 0x2b, 0x54, + 0x69, 0x58, 0x77, 0x45, 0x66, 0x34, 0x62, 0x76, 0x35, 0x4b, 0x31, 0x30, 0x2b, 0x79, 0x48, 0x72, 0x49, 0x36, + 0x73, 0x30, 0x4f, 0x38, 0x41, 0x38, 0x4c, 0x36, 0x6b, 0x31, 0x54, 0x77, 0x77, 0x2b, 0x6d, 0x58, 0x77, 0x41, + 0x2b, 0x5c, 0x0a, + 0x09, 0x67, 0x66, 0x62, 0x57, 0x6e, 0x79, 0x4e, 0x35, 0x49, 0x39, 0x41, 0x68, 0x58, 0x63, 0x58, 0x66, 0x4a, + 0x48, 0x54, 0x77, 0x54, 0x61, 0x72, 0x4f, 0x4c, 0x65, 0x79, 0x30, 0x2f, 0x6f, 0x7a, 0x2f, 0x68, 0x74, 0x55, + 0x50, 0x55, 0x65, 0x4f, 0x50, 0x32, 0x52, 0x44, 0x34, 0x42, 0x6e, 0x78, 0x39, 0x71, 0x61, 0x73, 0x7a, 0x54, + 0x66, 0x55, 0x69, 0x6d, 0x33, 0x34, 0x52, 0x2b, 0x48, 0x54, 0x52, 0x66, 0x47, 0x33, 0x51, 0x36, 0x68, 0x34, + 0x41, 0x5c, 0x0a, + 0x09, 0x46, 0x42, 0x72, 0x37, 0x69, 0x2f, 0x69, 0x37, 0x71, 0x39, 0x34, 0x44, 0x58, 0x67, 0x35, 0x6d, 0x47, + 0x54, 0x6e, 0x6e, 0x72, 0x70, 0x6e, 0x6f, 0x56, 0x57, 0x38, 0x39, 0x41, 0x41, 0x41, 0x42, 0x58, 0x6b, 0x6c, + 0x45, 0x51, 0x56, 0x54, 0x5a, 0x4a, 0x65, 0x42, 0x62, 0x66, 0x47, 0x41, 0x41, 0x37, 0x54, 0x35, 0x77, 0x38, + 0x6d, 0x53, 0x79, 0x65, 0x6e, 0x50, 0x57, 0x4f, 0x58, 0x66, 0x56, 0x7a, 0x45, 0x36, 0x56, 0x70, 0x69, 0x2b, + 0x72, 0x5c, 0x0a, + 0x09, 0x47, 0x31, 0x2f, 0x67, 0x37, 0x31, 0x42, 0x74, 0x2f, 0x51, 0x6d, 0x6b, 0x39, 0x51, 0x45, 0x41, 0x74, + 0x57, 0x66, 0x38, 0x54, 0x66, 0x78, 0x6f, 0x4f, 0x2f, 0x69, 0x65, 0x51, 0x66, 0x47, 0x74, 0x33, 0x54, 0x58, + 0x59, 0x5a, 0x33, 0x6b, 0x79, 0x65, 0x5a, 0x31, 0x78, 0x7a, 0x72, 0x31, 0x6d, 0x5a, 0x74, 0x38, 0x44, 0x4c, + 0x79, 0x32, 0x62, 0x33, 0x38, 0x77, 0x75, 0x41, 0x70, 0x38, 0x42, 0x50, 0x2b, 0x58, 0x54, 0x32, 0x31, 0x36, + 0x58, 0x5c, 0x0a, + 0x09, 0x31, 0x69, 0x49, 0x41, 0x51, 0x6b, 0x33, 0x64, 0x2f, 0x33, 0x58, 0x62, 0x54, 0x33, 0x6c, 0x79, 0x77, + 0x55, 0x42, 0x79, 0x48, 0x2f, 0x6a, 0x41, 0x4f, 0x66, 0x63, 0x2b, 0x38, 0x4c, 0x71, 0x5a, 0x2f, 0x33, 0x5a, + 0x71, 0x59, 0x41, 0x2b, 0x34, 0x42, 0x76, 0x77, 0x49, 0x66, 0x41, 0x66, 0x38, 0x6c, 0x69, 0x2b, 0x37, 0x4c, + 0x76, 0x56, 0x70, 0x37, 0x51, 0x4a, 0x41, 0x35, 0x44, 0x43, 0x57, 0x6a, 0x42, 0x64, 0x56, 0x72, 0x46, 0x74, + 0x37, 0x5c, 0x0a, + 0x09, 0x55, 0x51, 0x43, 0x49, 0x52, 0x47, 0x77, 0x64, 0x33, 0x67, 0x55, 0x51, 0x6b, 0x63, 0x65, 0x6b, 0x41, + 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, + 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, + 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, + 0x69, 0x5c, 0x0a, + 0x09, 0x43, 0x67, 0x43, 0x52, 0x69, 0x43, 0x6b, 0x41, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, + 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, + 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, + 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, + 0x52, 0x5c, 0x0a, + 0x09, 0x69, 0x43, 0x6b, 0x41, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, + 0x47, 0x49, 0x4b, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, + 0x59, 0x41, 0x6b, 0x41, 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, + 0x67, 0x41, 0x51, 0x69, 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, 0x52, 0x69, 0x43, 0x6b, + 0x41, 0x5c, 0x0a, + 0x09, 0x52, 0x43, 0x4b, 0x6d, 0x41, 0x42, 0x43, 0x4a, 0x6d, 0x41, 0x4a, 0x41, 0x4a, 0x47, 0x49, 0x4b, 0x41, + 0x4a, 0x47, 0x49, 0x4b, 0x51, 0x42, 0x45, 0x49, 0x71, 0x59, 0x41, 0x45, 0x49, 0x6d, 0x59, 0x41, 0x6b, 0x41, + 0x6b, 0x59, 0x67, 0x6f, 0x41, 0x6b, 0x59, 0x67, 0x70, 0x41, 0x45, 0x51, 0x69, 0x70, 0x67, 0x41, 0x51, 0x69, + 0x5a, 0x67, 0x43, 0x51, 0x43, 0x52, 0x69, 0x43, 0x67, 0x43, 0x52, 0x69, 0x50, 0x30, 0x50, 0x38, 0x66, 0x52, + 0x4d, 0x5c, 0x0a, + 0x09, 0x43, 0x50, 0x61, 0x46, 0x72, 0x73, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, + 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, 0x3d, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x6e, 0x67, 0x20, 0x3d, 0x0a, + 0x09, 0x22, 0x69, 0x56, 0x42, 0x4f, 0x52, 0x77, 0x30, 0x4b, 0x47, 0x67, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x4e, + 0x53, 0x55, 0x68, 0x45, 0x55, 0x67, 0x41, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x43, 0x41, + 0x59, 0x41, 0x41, 0x41, 0x44, 0x53, 0x31, 0x6e, 0x39, 0x2f, 0x41, 0x41, 0x41, 0x48, 0x6c, 0x45, 0x6c, 0x45, + 0x51, 0x56, 0x52, 0x34, 0x6e, 0x4f, 0x32, 0x62, 0x65, 0x34, 0x78, 0x64, 0x56, 0x52, 0x58, 0x47, 0x66, 0x7a, + 0x4f, 0x64, 0x5c, 0x0a, + 0x09, 0x61, 0x57, 0x6c, 0x4c, 0x69, 0x7a, 0x43, 0x30, 0x59, 0x68, 0x38, 0x38, 0x4f, 0x79, 0x6b, 0x57, 0x78, + 0x51, 0x6f, 0x74, 0x64, 0x41, 0x6f, 0x71, 0x31, 0x42, 0x52, 0x45, 0x53, 0x56, 0x56, 0x53, 0x59, 0x77, 0x31, + 0x70, 0x51, 0x67, 0x69, 0x52, 0x67, 0x42, 0x41, 0x44, 0x78, 0x6f, 0x51, 0x59, 0x69, 0x64, 0x68, 0x45, 0x78, + 0x47, 0x42, 0x4a, 0x4e, 0x43, 0x67, 0x59, 0x45, 0x74, 0x4e, 0x71, 0x55, 0x6a, 0x48, 0x57, 0x38, 0x45, 0x61, + 0x6b, 0x5c, 0x0a, + 0x09, 0x74, 0x63, 0x58, 0x36, 0x41, 0x4d, 0x61, 0x71, 0x69, 0x50, 0x61, 0x68, 0x56, 0x69, 0x69, 0x56, 0x55, + 0x74, 0x73, 0x69, 0x46, 0x4b, 0x61, 0x4d, 0x4c, 0x5a, 0x33, 0x32, 0x38, 0x34, 0x2b, 0x31, 0x54, 0x75, 0x36, + 0x2b, 0x5a, 0x38, 0x34, 0x35, 0x64, 0x31, 0x36, 0x33, 0x63, 0x34, 0x65, 0x7a, 0x76, 0x2b, 0x52, 0x6b, 0x33, + 0x37, 0x50, 0x58, 0x32, 0x6e, 0x75, 0x74, 0x73, 0x2f, 0x64, 0x33, 0x39, 0x6c, 0x6e, 0x37, 0x63, 0x5a, 0x73, + 0x6b, 0x5c, 0x0a, + 0x09, 0x45, 0x56, 0x46, 0x65, 0x4e, 0x41, 0x2b, 0x33, 0x41, 0x78, 0x48, 0x44, 0x69, 0x30, 0x69, 0x41, 0x6b, + 0x69, 0x4d, 0x53, 0x6f, 0x4c, 0x48, 0x52, 0x42, 0x49, 0x77, 0x48, 0x52, 0x74, 0x58, 0x4c, 0x51, 0x43, 0x52, + 0x41, 0x59, 0x2b, 0x4d, 0x6d, 0x59, 0x44, 0x2f, 0x77, 0x6c, 0x58, 0x6f, 0x5a, 0x69, 0x41, 0x52, 0x6f, 0x62, + 0x45, 0x7a, 0x77, 0x39, 0x48, 0x33, 0x31, 0x4d, 0x68, 0x41, 0x4a, 0x30, 0x4e, 0x68, 0x34, 0x77, 0x39, 0x4d, + 0x70, 0x5c, 0x0a, + 0x09, 0x39, 0x54, 0x49, 0x51, 0x43, 0x64, 0x44, 0x59, 0x36, 0x50, 0x4c, 0x30, 0x68, 0x48, 0x6f, 0x5a, 0x69, + 0x41, 0x52, 0x6f, 0x62, 0x4f, 0x7a, 0x32, 0x39, 0x4d, 0x52, 0x36, 0x47, 0x57, 0x69, 0x70, 0x56, 0x38, 0x55, + 0x52, 0x6d, 0x5a, 0x67, 0x4c, 0x66, 0x42, 0x69, 0x59, 0x42, 0x4c, 0x77, 0x43, 0x50, 0x41, 0x6c, 0x73, 0x4c, + 0x64, 0x42, 0x2f, 0x31, 0x64, 0x4e, 0x49, 0x67, 0x44, 0x71, 0x69, 0x44, 0x66, 0x67, 0x44, 0x38, 0x47, 0x2f, + 0x67, 0x5c, 0x0a, + 0x09, 0x49, 0x30, 0x48, 0x2b, 0x61, 0x47, 0x41, 0x42, 0x63, 0x43, 0x72, 0x77, 0x4f, 0x76, 0x42, 0x62, 0x59, + 0x47, 0x65, 0x71, 0x37, 0x48, 0x51, 0x76, 0x76, 0x78, 0x33, 0x59, 0x56, 0x32, 0x42, 0x6a, 0x4e, 0x76, 0x41, + 0x44, 0x34, 0x4c, 0x77, 0x4d, 0x32, 0x55, 0x72, 0x67, 0x65, 0x71, 0x41, 0x37, 0x51, 0x37, 0x62, 0x48, 0x30, + 0x32, 0x5a, 0x73, 0x4b, 0x6e, 0x69, 0x34, 0x77, 0x4d, 0x61, 0x41, 0x30, 0x44, 0x51, 0x43, 0x6c, 0x34, 0x4a, + 0x48, 0x5c, 0x0a, + 0x09, 0x41, 0x65, 0x33, 0x41, 0x54, 0x4f, 0x41, 0x30, 0x34, 0x46, 0x6e, 0x67, 0x36, 0x5a, 0x52, 0x4f, 0x45, + 0x39, 0x62, 0x59, 0x35, 0x77, 0x4e, 0x54, 0x4d, 0x61, 0x4c, 0x76, 0x77, 0x54, 0x72, 0x77, 0x6c, 0x38, 0x44, + 0x65, 0x51, 0x48, 0x63, 0x36, 0x73, 0x4d, 0x4e, 0x2f, 0x7a, 0x77, 0x55, 0x32, 0x41, 0x6e, 0x4f, 0x41, 0x31, + 0x63, 0x41, 0x70, 0x67, 0x64, 0x35, 0x68, 0x34, 0x44, 0x37, 0x67, 0x69, 0x38, 0x41, 0x30, 0x34, 0x4d, 0x66, + 0x41, 0x5c, 0x0a, + 0x09, 0x66, 0x4a, 0x63, 0x4a, 0x65, 0x41, 0x43, 0x34, 0x41, 0x64, 0x69, 0x56, 0x38, 0x6d, 0x55, 0x68, 0x38, + 0x42, 0x41, 0x77, 0x31, 0x75, 0x2b, 0x66, 0x42, 0x76, 0x34, 0x4a, 0x76, 0x4e, 0x66, 0x74, 0x41, 0x54, 0x77, + 0x49, 0x66, 0x44, 0x72, 0x6a, 0x57, 0x63, 0x64, 0x53, 0x49, 0x63, 0x59, 0x34, 0x34, 0x48, 0x38, 0x5a, 0x4f, + 0x6f, 0x4f, 0x44, 0x70, 0x4a, 0x46, 0x77, 0x48, 0x53, 0x50, 0x70, 0x4b, 0x6b, 0x6d, 0x50, 0x53, 0x75, 0x70, + 0x53, 0x5c, 0x0a, + 0x09, 0x4e, 0x66, 0x36, 0x65, 0x30, 0x72, 0x31, 0x51, 0x30, 0x69, 0x62, 0x6c, 0x34, 0x77, 0x6c, 0x4a, 0x73, + 0x31, 0x4a, 0x6c, 0x4e, 0x72, 0x70, 0x73, 0x75, 0x61, 0x54, 0x4a, 0x6b, 0x76, 0x62, 0x34, 0x66, 0x59, 0x2b, + 0x6b, 0x54, 0x6b, 0x6e, 0x50, 0x42, 0x65, 0x55, 0x66, 0x6c, 0x76, 0x53, 0x76, 0x34, 0x50, 0x35, 0x41, 0x38, + 0x48, 0x75, 0x62, 0x70, 0x4c, 0x61, 0x67, 0x33, 0x71, 0x6d, 0x53, 0x58, 0x67, 0x39, 0x6b, 0x48, 0x53, 0x6d, + 0x37, 0x5c, 0x0a, + 0x09, 0x69, 0x34, 0x4f, 0x79, 0x63, 0x33, 0x4b, 0x65, 0x2f, 0x51, 0x32, 0x58, 0x74, 0x2b, 0x58, 0x49, 0x42, + 0x33, 0x55, 0x4e, 0x64, 0x38, 0x66, 0x32, 0x35, 0x66, 0x71, 0x4d, 0x70, 0x46, 0x32, 0x71, 0x78, 0x6d, 0x46, + 0x4a, 0x4f, 0x34, 0x4c, 0x37, 0x34, 0x31, 0x54, 0x70, 0x2f, 0x4c, 0x63, 0x39, 0x37, 0x36, 0x43, 0x6b, 0x64, + 0x5a, 0x4a, 0x57, 0x2b, 0x50, 0x57, 0x77, 0x4b, 0x68, 0x31, 0x35, 0x57, 0x4e, 0x4c, 0x70, 0x67, 0x59, 0x30, + 0x76, 0x5c, 0x0a, + 0x09, 0x65, 0x66, 0x34, 0x32, 0x53, 0x58, 0x66, 0x36, 0x37, 0x78, 0x32, 0x53, 0x5a, 0x67, 0x59, 0x36, 0x69, + 0x79, 0x51, 0x64, 0x43, 0x6d, 0x79, 0x2b, 0x4b, 0x6d, 0x6d, 0x32, 0x70, 0x47, 0x5a, 0x4a, 0x6c, 0x30, 0x6e, + 0x61, 0x36, 0x2f, 0x6b, 0x2f, 0x44, 0x4d, 0x72, 0x63, 0x35, 0x58, 0x6e, 0x2f, 0x6b, 0x54, 0x51, 0x74, 0x35, + 0x2f, 0x6b, 0x53, 0x38, 0x6e, 0x30, 0x2b, 0x52, 0x37, 0x37, 0x56, 0x35, 0x61, 0x66, 0x6e, 0x79, 0x42, 0x75, + 0x57, 0x5c, 0x0a, + 0x09, 0x41, 0x47, 0x4d, 0x6b, 0x6a, 0x52, 0x70, 0x6b, 0x48, 0x54, 0x63, 0x46, 0x44, 0x66, 0x36, 0x79, 0x70, + 0x47, 0x39, 0x49, 0x75, 0x6c, 0x6a, 0x53, 0x73, 0x5a, 0x4a, 0x61, 0x4a, 0x58, 0x57, 0x37, 0x62, 0x47, 0x47, + 0x71, 0x4d, 0x54, 0x73, 0x6c, 0x54, 0x63, 0x2b, 0x6f, 0x37, 0x36, 0x4b, 0x67, 0x76, 0x6c, 0x75, 0x43, 0x2f, + 0x4a, 0x6c, 0x42, 0x66, 0x6a, 0x4c, 0x43, 0x4c, 0x4d, 0x34, 0x6f, 0x66, 0x32, 0x2b, 0x67, 0x39, 0x2b, 0x57, + 0x55, 0x5c, 0x0a, + 0x09, 0x37, 0x42, 0x4c, 0x50, 0x50, 0x79, 0x4b, 0x70, 0x33, 0x66, 0x4e, 0x32, 0x65, 0x74, 0x34, 0x39, 0x37, + 0x6e, 0x4f, 0x36, 0x76, 0x6b, 0x6b, 0x79, 0x49, 0x6b, 0x6e, 0x53, 0x30, 0x70, 0x77, 0x32, 0x65, 0x4d, 0x72, + 0x6c, 0x38, 0x77, 0x62, 0x5a, 0x6c, 0x76, 0x30, 0x69, 0x77, 0x48, 0x73, 0x6b, 0x76, 0x53, 0x52, 0x37, 0x4d, + 0x79, 0x5a, 0x4c, 0x57, 0x69, 0x5a, 0x70, 0x72, 0x61, 0x52, 0x6e, 0x4a, 0x50, 0x31, 0x4d, 0x4e, 0x68, 0x79, + 0x33, 0x5c, 0x0a, + 0x09, 0x46, 0x6c, 0x51, 0x38, 0x56, 0x64, 0x4a, 0x62, 0x37, 0x76, 0x68, 0x4c, 0x6b, 0x6c, 0x5a, 0x4a, 0x2b, + 0x70, 0x54, 0x73, 0x62, 0x65, 0x6d, 0x72, 0x63, 0x7a, 0x4e, 0x6c, 0x51, 0x37, 0x41, 0x6b, 0x66, 0x56, 0x66, + 0x53, 0x32, 0x41, 0x79, 0x64, 0x70, 0x4d, 0x4e, 0x76, 0x63, 0x7a, 0x38, 0x54, 0x76, 0x44, 0x2b, 0x6e, 0x7a, + 0x75, 0x38, 0x45, 0x4f, 0x6e, 0x39, 0x4a, 0x79, 0x56, 0x34, 0x49, 0x5a, 0x41, 0x64, 0x79, 0x37, 0x48, 0x30, + 0x6f, 0x5c, 0x0a, + 0x09, 0x30, 0x45, 0x6c, 0x2f, 0x52, 0x73, 0x4c, 0x4f, 0x75, 0x6c, 0x33, 0x53, 0x52, 0x46, 0x57, 0x6a, 0x52, + 0x39, 0x4c, 0x7a, 0x33, 0x6e, 0x34, 0x72, 0x4a, 0x4b, 0x32, 0x57, 0x39, 0x4a, 0x72, 0x4c, 0x33, 0x6e, 0x54, + 0x2f, 0x73, 0x33, 0x7a, 0x2b, 0x75, 0x6d, 0x7a, 0x45, 0x2b, 0x6d, 0x41, 0x2f, 0x32, 0x6d, 0x37, 0x51, 0x42, + 0x47, 0x68, 0x33, 0x78, 0x37, 0x5a, 0x4c, 0x32, 0x71, 0x31, 0x73, 0x2f, 0x45, 0x33, 0x53, 0x47, 0x54, 0x6e, + 0x6c, 0x5c, 0x0a, + 0x09, 0x46, 0x2b, 0x65, 0x55, 0x32, 0x53, 0x4c, 0x70, 0x67, 0x6a, 0x34, 0x36, 0x64, 0x36, 0x75, 0x58, 0x65, + 0x55, 0x35, 0x53, 0x55, 0x34, 0x37, 0x4f, 0x61, 0x74, 0x64, 0x35, 0x53, 0x74, 0x4a, 0x70, 0x67, 0x5a, 0x33, + 0x6a, 0x4d, 0x33, 0x54, 0x48, 0x71, 0x50, 0x4b, 0x32, 0x4a, 0x5a, 0x67, 0x66, 0x79, 0x4f, 0x38, 0x4f, 0x38, + 0x6a, 0x66, 0x6e, 0x32, 0x47, 0x73, 0x50, 0x64, 0x4d, 0x37, 0x4b, 0x6b, 0x46, 0x38, 0x58, 0x2b, 0x48, 0x78, + 0x69, 0x5c, 0x0a, + 0x09, 0x6f, 0x4e, 0x75, 0x74, 0x66, 0x4c, 0x77, 0x73, 0x47, 0x39, 0x57, 0x4b, 0x32, 0x71, 0x4b, 0x6c, 0x68, + 0x6e, 0x7a, 0x41, 0x56, 0x39, 0x34, 0x30, 0x4d, 0x46, 0x6d, 0x43, 0x54, 0x4b, 0x4c, 0x67, 0x62, 0x6d, 0x77, + 0x61, 0x38, 0x31, 0x66, 0x67, 0x5a, 0x4f, 0x42, 0x61, 0x34, 0x43, 0x78, 0x67, 0x50, 0x58, 0x41, 0x4f, 0x6c, + 0x66, 0x6b, 0x71, 0x77, 0x43, 0x4c, 0x67, 0x70, 0x38, 0x48, 0x39, 0x49, 0x31, 0x68, 0x6b, 0x76, 0x42, 0x51, + 0x34, 0x5c, 0x0a, + 0x09, 0x45, 0x39, 0x67, 0x41, 0x58, 0x41, 0x6e, 0x63, 0x58, 0x79, 0x4d, 0x2b, 0x62, 0x66, 0x4e, 0x30, 0x4d, + 0x78, 0x5a, 0x6c, 0x5a, 0x32, 0x47, 0x2f, 0x70, 0x78, 0x33, 0x59, 0x71, 0x6c, 0x6b, 0x50, 0x46, 0x76, 0x48, + 0x50, 0x41, 0x64, 0x61, 0x6b, 0x64, 0x4b, 0x2f, 0x78, 0x4f, 0x74, 0x2f, 0x79, 0x35, 0x35, 0x67, 0x48, 0x33, + 0x4f, 0x4c, 0x2b, 0x41, 0x6a, 0x77, 0x47, 0x66, 0x4d, 0x46, 0x2f, 0x37, 0x79, 0x45, 0x62, 0x34, 0x34, 0x50, + 0x66, 0x5c, 0x0a, + 0x09, 0x6b, 0x7a, 0x4c, 0x6b, 0x47, 0x7a, 0x77, 0x39, 0x47, 0x7a, 0x6a, 0x6f, 0x74, 0x73, 0x59, 0x44, 0x56, + 0x32, 0x41, 0x7a, 0x6a, 0x54, 0x4f, 0x42, 0x6b, 0x37, 0x41, 0x70, 0x35, 0x6b, 0x48, 0x67, 0x65, 0x61, 0x41, + 0x54, 0x4f, 0x4a, 0x52, 0x6a, 0x4c, 0x30, 0x46, 0x50, 0x44, 0x66, 0x6e, 0x41, 0x6b, 0x63, 0x4f, 0x4d, 0x59, + 0x77, 0x4f, 0x47, 0x48, 0x70, 0x44, 0x30, 0x67, 0x5a, 0x52, 0x38, 0x73, 0x69, 0x7a, 0x36, 0x6c, 0x71, 0x54, + 0x37, 0x5c, 0x0a, + 0x09, 0x55, 0x2b, 0x57, 0x53, 0x59, 0x4f, 0x68, 0x5a, 0x53, 0x54, 0x4d, 0x43, 0x32, 0x53, 0x6d, 0x71, 0x44, + 0x4e, 0x6e, 0x64, 0x71, 0x68, 0x33, 0x55, 0x58, 0x4f, 0x2b, 0x36, 0x75, 0x79, 0x56, 0x4e, 0x79, 0x4e, 0x46, + 0x5a, 0x45, 0x2f, 0x69, 0x35, 0x55, 0x4e, 0x4c, 0x6a, 0x67, 0x65, 0x33, 0x52, 0x67, 0x64, 0x34, 0x73, 0x56, + 0x61, 0x4c, 0x70, 0x4f, 0x31, 0x77, 0x33, 0x77, 0x52, 0x57, 0x75, 0x63, 0x34, 0x79, 0x6b, 0x2f, 0x5a, 0x36, + 0x33, 0x5c, 0x0a, + 0x09, 0x4d, 0x63, 0x66, 0x65, 0x37, 0x4b, 0x44, 0x63, 0x68, 0x52, 0x6e, 0x79, 0x46, 0x74, 0x6c, 0x77, 0x4c, + 0x55, 0x6e, 0x6e, 0x53, 0x76, 0x71, 0x35, 0x2f, 0x31, 0x35, 0x54, 0x34, 0x31, 0x6d, 0x48, 0x37, 0x63, 0x6f, + 0x54, 0x6a, 0x41, 0x34, 0x65, 0x39, 0x4a, 0x34, 0x63, 0x6e, 0x66, 0x6b, 0x75, 0x44, 0x34, 0x4f, 0x65, 0x70, + 0x5a, 0x36, 0x33, 0x56, 0x39, 0x6e, 0x44, 0x63, 0x4a, 0x73, 0x71, 0x45, 0x66, 0x32, 0x33, 0x61, 0x6a, 0x6a, + 0x58, 0x5c, 0x0a, + 0x09, 0x4a, 0x6d, 0x6d, 0x66, 0x36, 0x7a, 0x36, 0x6d, 0x33, 0x74, 0x2f, 0x6b, 0x4e, 0x6c, 0x56, 0x50, 0x77, + 0x57, 0x36, 0x58, 0x64, 0x46, 0x37, 0x51, 0x41, 0x62, 0x2b, 0x54, 0x39, 0x41, 0x6c, 0x4a, 0x4e, 0x30, 0x72, + 0x36, 0x72, 0x2b, 0x64, 0x74, 0x56, 0x34, 0x56, 0x4d, 0x53, 0x65, 0x64, 0x30, 0x71, 0x52, 0x4a, 0x67, 0x72, + 0x66, 0x53, 0x38, 0x58, 0x54, 0x6b, 0x2b, 0x6e, 0x52, 0x48, 0x59, 0x4f, 0x7a, 0x56, 0x48, 0x4a, 0x2f, 0x6c, + 0x6b, 0x5c, 0x0a, + 0x09, 0x4c, 0x70, 0x4b, 0x30, 0x49, 0x4e, 0x44, 0x2f, 0x61, 0x6f, 0x33, 0x6e, 0x6e, 0x61, 0x6a, 0x73, 0x4f, + 0x4b, 0x42, 0x46, 0x30, 0x6a, 0x63, 0x6c, 0x58, 0x56, 0x6d, 0x6a, 0x2f, 0x4a, 0x41, 0x53, 0x6f, 0x44, 0x6c, + 0x77, 0x2f, 0x4f, 0x4d, 0x46, 0x46, 0x57, 0x78, 0x77, 0x6e, 0x54, 0x76, 0x39, 0x50, 0x76, 0x6d, 0x4f, 0x66, + 0x72, 0x2b, 0x67, 0x7a, 0x4e, 0x64, 0x63, 0x5a, 0x32, 0x30, 0x66, 0x48, 0x50, 0x78, 0x63, 0x34, 0x4d, 0x63, + 0x6d, 0x5c, 0x0a, + 0x09, 0x53, 0x5a, 0x2b, 0x56, 0x64, 0x65, 0x44, 0x4a, 0x73, 0x76, 0x6c, 0x38, 0x69, 0x48, 0x56, 0x65, 0x35, + 0x6a, 0x70, 0x56, 0x53, 0x42, 0x44, 0x69, 0x46, 0x56, 0x56, 0x2f, 0x74, 0x39, 0x74, 0x55, 0x47, 0x63, 0x57, + 0x36, 0x5a, 0x42, 0x48, 0x35, 0x52, 0x2f, 0x33, 0x2b, 0x7a, 0x59, 0x4a, 0x32, 0x57, 0x53, 0x58, 0x70, 0x4a, + 0x38, 0x71, 0x50, 0x53, 0x2f, 0x37, 0x73, 0x64, 0x58, 0x7a, 0x53, 0x37, 0x33, 0x38, 0x55, 0x2b, 0x4c, 0x42, + 0x4b, 0x5c, 0x0a, + 0x09, 0x6c, 0x5a, 0x63, 0x6c, 0x4a, 0x4e, 0x55, 0x79, 0x74, 0x39, 0x6d, 0x74, 0x33, 0x6e, 0x48, 0x56, 0x58, + 0x43, 0x39, 0x37, 0x71, 0x4d, 0x44, 0x6d, 0x6b, 0x42, 0x4f, 0x41, 0x77, 0x4f, 0x6e, 0x5a, 0x42, 0x54, 0x6f, + 0x33, 0x75, 0x4d, 0x34, 0x6d, 0x76, 0x31, 0x2f, 0x68, 0x39, 0x30, 0x56, 0x76, 0x39, 0x32, 0x32, 0x75, 0x38, + 0x33, 0x67, 0x66, 0x6e, 0x62, 0x78, 0x4b, 0x31, 0x57, 0x39, 0x36, 0x47, 0x73, 0x6c, 0x63, 0x75, 0x79, 0x73, + 0x6f, 0x5c, 0x0a, + 0x09, 0x30, 0x79, 0x45, 0x4c, 0x45, 0x4c, 0x65, 0x35, 0x62, 0x39, 0x2b, 0x57, 0x39, 0x4f, 0x36, 0x4d, 0x75, + 0x71, 0x64, 0x4a, 0x2b, 0x70, 0x4d, 0x73, 0x36, 0x42, 0x76, 0x6e, 0x65, 0x55, 0x74, 0x6b, 0x52, 0x42, 0x68, + 0x6f, 0x6f, 0x38, 0x36, 0x53, 0x66, 0x56, 0x61, 0x53, 0x47, 0x63, 0x38, 0x59, 0x53, 0x59, 0x2b, 0x6b, 0x66, + 0x4e, 0x34, 0x75, 0x43, 0x78, 0x52, 0x33, 0x70, 0x76, 0x4a, 0x66, 0x6c, 0x44, 0x51, 0x6c, 0x56, 0x56, 0x2b, + 0x72, 0x5c, 0x0a, + 0x09, 0x70, 0x41, 0x64, 0x6c, 0x6e, 0x36, 0x56, 0x68, 0x49, 0x55, 0x42, 0x52, 0x59, 0x35, 0x77, 0x64, 0x36, + 0x4a, 0x30, 0x67, 0x47, 0x36, 0x6f, 0x6b, 0x36, 0x52, 0x63, 0x35, 0x2b, 0x6a, 0x4e, 0x55, 0x47, 0x59, 0x35, + 0x76, 0x37, 0x49, 0x65, 0x6a, 0x37, 0x54, 0x4a, 0x79, 0x68, 0x61, 0x75, 0x41, 0x6d, 0x32, 0x56, 0x44, 0x66, + 0x42, 0x69, 0x76, 0x6e, 0x44, 0x54, 0x55, 0x44, 0x54, 0x52, 0x45, 0x56, 0x35, 0x4f, 0x6b, 0x61, 0x79, 0x54, + 0x39, 0x5c, 0x0a, + 0x09, 0x51, 0x37, 0x31, 0x78, 0x52, 0x4e, 0x4c, 0x76, 0x4a, 0x56, 0x32, 0x72, 0x36, 0x72, 0x6a, 0x6c, 0x71, + 0x46, 0x78, 0x46, 0x65, 0x77, 0x45, 0x39, 0x32, 0x4c, 0x72, 0x37, 0x45, 0x71, 0x71, 0x6a, 0x2b, 0x68, 0x41, + 0x74, 0x32, 0x50, 0x70, 0x30, 0x43, 0x37, 0x59, 0x75, 0x50, 0x67, 0x72, 0x34, 0x44, 0x52, 0x61, 0x31, 0x58, + 0x77, 0x7a, 0x38, 0x32, 0x76, 0x58, 0x47, 0x41, 0x6c, 0x63, 0x44, 0x79, 0x37, 0x43, 0x39, 0x37, 0x52, 0x65, + 0x77, 0x5c, 0x0a, + 0x09, 0x55, 0x79, 0x37, 0x39, 0x58, 0x64, 0x74, 0x75, 0x78, 0x74, 0x62, 0x32, 0x44, 0x31, 0x49, 0x64, 0x71, + 0x65, 0x38, 0x44, 0x6a, 0x6e, 0x4d, 0x66, 0x30, 0x76, 0x73, 0x43, 0x6a, 0x59, 0x59, 0x5a, 0x32, 0x4f, 0x78, + 0x71, 0x41, 0x76, 0x59, 0x4d, 0x57, 0x34, 0x48, 0x58, 0x68, 0x73, 0x75, 0x5a, 0x6f, 0x74, 0x33, 0x41, 0x54, + 0x6d, 0x78, 0x36, 0x31, 0x56, 0x61, 0x67, 0x30, 0x34, 0x4d, 0x39, 0x78, 0x42, 0x52, 0x73, 0x65, 0x76, 0x4d, + 0x41, 0x5c, 0x0a, + 0x09, 0x38, 0x41, 0x54, 0x77, 0x4d, 0x57, 0x41, 0x74, 0x73, 0x4d, 0x35, 0x74, 0x7a, 0x4d, 0x4d, 0x32, 0x4d, + 0x38, 0x42, 0x32, 0x33, 0x53, 0x35, 0x6c, 0x59, 0x42, 0x73, 0x62, 0x52, 0x37, 0x78, 0x38, 0x47, 0x67, 0x6b, + 0x42, 0x69, 0x6e, 0x78, 0x74, 0x46, 0x47, 0x7a, 0x7a, 0x71, 0x79, 0x46, 0x51, 0x64, 0x43, 0x43, 0x6b, 0x30, + 0x39, 0x50, 0x4a, 0x4e, 0x65, 0x70, 0x49, 0x31, 0x67, 0x41, 0x6d, 0x65, 0x72, 0x6f, 0x45, 0x6d, 0x31, 0x4f, + 0x33, 0x5c, 0x0a, + 0x09, 0x41, 0x4a, 0x64, 0x67, 0x57, 0x36, 0x72, 0x6a, 0x73, 0x4c, 0x6e, 0x75, 0x66, 0x64, 0x6a, 0x57, 0x61, + 0x48, 0x38, 0x61, 0x34, 0x48, 0x7a, 0x67, 0x4c, 0x75, 0x44, 0x34, 0x41, 0x70, 0x32, 0x45, 0x58, 0x4c, 0x58, + 0x6d, 0x30, 0x78, 0x45, 0x70, 0x46, 0x49, 0x30, 0x41, 0x7a, 0x32, 0x42, 0x62, 0x6e, 0x30, 0x58, 0x37, 0x33, + 0x47, 0x42, 0x76, 0x66, 0x52, 0x65, 0x32, 0x4b, 0x41, 0x53, 0x32, 0x69, 0x48, 0x51, 0x35, 0x63, 0x43, 0x35, + 0x77, 0x5c, 0x0a, + 0x09, 0x41, 0x64, 0x59, 0x35, 0x4c, 0x77, 0x4b, 0x2f, 0x6f, 0x6e, 0x72, 0x42, 0x71, 0x4b, 0x2b, 0x34, 0x41, + 0x37, 0x67, 0x49, 0x32, 0x38, 0x70, 0x64, 0x6e, 0x69, 0x45, 0x66, 0x52, 0x2b, 0x58, 0x49, 0x56, 0x4e, 0x34, + 0x43, 0x54, 0x6b, 0x51, 0x4f, 0x69, 0x6d, 0x4b, 0x41, 0x56, 0x75, 0x78, 0x74, 0x33, 0x55, 0x6a, 0x2b, 0x53, + 0x74, 0x7a, 0x52, 0x77, 0x48, 0x4c, 0x67, 0x5a, 0x75, 0x7a, 0x62, 0x50, 0x6a, 0x39, 0x44, 0x76, 0x67, 0x41, + 0x6a, 0x5c, 0x0a, + 0x09, 0x31, 0x39, 0x76, 0x41, 0x75, 0x36, 0x6a, 0x48, 0x6e, 0x76, 0x6b, 0x37, 0x47, 0x45, 0x57, 0x66, 0x67, + 0x45, 0x50, 0x59, 0x53, 0x5a, 0x6e, 0x68, 0x50, 0x6a, 0x47, 0x79, 0x79, 0x74, 0x4d, 0x4f, 0x62, 0x4e, 0x6b, + 0x35, 0x6a, 0x61, 0x73, 0x39, 0x58, 0x55, 0x2f, 0x73, 0x2f, 0x48, 0x35, 0x6a, 0x4a, 0x42, 0x77, 0x4b, 0x2f, + 0x53, 0x4e, 0x32, 0x48, 0x41, 0x76, 0x67, 0x62, 0x6d, 0x77, 0x64, 0x50, 0x55, 0x45, 0x48, 0x46, 0x6e, 0x4d, + 0x41, 0x5c, 0x0a, + 0x09, 0x66, 0x4f, 0x39, 0x6f, 0x4f, 0x76, 0x56, 0x4f, 0x77, 0x55, 0x67, 0x35, 0x45, 0x6e, 0x59, 0x4f, 0x46, + 0x70, 0x4f, 0x30, 0x59, 0x6d, 0x2f, 0x36, 0x76, 0x64, 0x68, 0x52, 0x72, 0x6c, 0x75, 0x78, 0x36, 0x48, 0x38, + 0x39, 0x39, 0x69, 0x6d, 0x49, 0x36, 0x43, 0x64, 0x47, 0x43, 0x67, 0x48, 0x41, 0x64, 0x68, 0x42, 0x58, 0x30, + 0x76, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x77, 0x77, 0x35, 0x78, 0x37, 0x65, 0x35, 0x57, 0x49, 0x71, 0x49, 0x6d, + 0x52, 0x5c, 0x0a, + 0x09, 0x52, 0x41, 0x43, 0x77, 0x6b, 0x65, 0x42, 0x6d, 0x62, 0x4c, 0x36, 0x2f, 0x42, 0x54, 0x76, 0x67, 0x75, + 0x59, 0x34, 0x34, 0x2f, 0x52, 0x73, 0x77, 0x52, 0x68, 0x6f, 0x42, 0x49, 0x6f, 0x59, 0x59, 0x49, 0x79, 0x45, + 0x49, 0x6a, 0x4b, 0x67, 0x6a, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, + 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, + 0x53, 0x5c, 0x0a, + 0x09, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, + 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, + 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, + 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, 0x67, 0x46, + 0x4b, 0x5c, 0x0a, + 0x09, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, 0x35, 0x49, + 0x67, 0x46, 0x4b, 0x6a, 0x6b, 0x69, 0x41, 0x6b, 0x69, 0x4d, 0x53, 0x6f, 0x4f, 0x53, 0x49, 0x42, 0x43, 0x67, + 0x35, 0x49, 0x67, 0x46, 0x4b, 0x6a, 0x76, 0x38, 0x44, 0x2f, 0x7a, 0x63, 0x46, 0x56, 0x65, 0x67, 0x2b, 0x6a, + 0x62, 0x55, 0x41, 0x41, 0x41, 0x41, 0x41, 0x53, 0x55, 0x56, 0x4f, 0x52, 0x4b, 0x35, 0x43, 0x59, 0x49, 0x49, + 0x3d, 0x5c, 0x0a, + 0x09, 0x22, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, + 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, + 0x6e, 0x65, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5f, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x22, + 0x29, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x29, 0x29, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x62, + 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x63, 0x69, + 0x65, 0x6e, 0x74, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x6b, + 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x69, 0x74, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x6c, 0x6f, + 0x6f, 0x6b, 0x73, 0x20, 0x64, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x63, 0x61, 0x73, 0x65, 0x2e, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, + 0x2e, 0x69, 0x73, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x28, 0x22, 0x73, 0x75, 0x62, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, + 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, + 0x31, 0x33, 0x37, 0x2c, 0x20, 0x31, 0x39, 0x34, 0x2c, 0x20, 0x32, 0x31, 0x38, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, + 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, + 0x31, 0x31, 0x2c, 0x20, 0x38, 0x38, 0x2c, 0x20, 0x31, 0x32, 0x33, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x6e, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x6e, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, + 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, + 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, + 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, + 0x3d, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, + 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x77, 0x69, + 0x6e, 0x5f, 0x77, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x69, + 0x6e, 0x5f, 0x68, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x35, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, + 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, + 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, + 0x20, 0x3d, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, + 0x20, 0x3d, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x61, 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x6e, + 0x67, 0x2c, 0x20, 0x22, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x62, + 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x62, + 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x31, 0x34, 0x30, 0x0a, + 0x09, 0x09, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x38, 0x30, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, + 0x74, 0x65, 0x78, 0x74, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x32, 0x35, 0x0a, + 0x09, 0x09, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x39, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x42, 0x61, 0x62, 0x79, 0x20, 0x52, 0x61, 0x69, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x20, 0x3d, + 0x20, 0x31, 0x31, 0x30, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x3d, + 0x20, 0x38, 0x30, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x28, 0x62, 0x61, 0x62, 0x79, 0x5f, 0x70, 0x6e, 0x67, 0x2c, 0x20, 0x22, + 0x62, 0x61, 0x62, 0x79, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, + 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, + 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x28, + 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x72, 0x69, + 0x74, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x35, 0x31, 0x32, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x61, + 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x78, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x78, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x6f, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, + 0x6f, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x20, 0x3d, 0x20, + 0x32, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, 0x74, 0x68, + 0x28, 0x29, 0x20, 0x2f, 0x20, 0x73, 0x78, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x68, 0x20, 0x3d, 0x20, + 0x32, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x28, 0x29, 0x20, 0x2f, 0x20, 0x73, 0x79, 0x29, 0x20, 0x2b, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x67, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x28, 0x29, 0x20, 0x3c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, + 0x20, 0x2a, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x73, 0x65, 0x74, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x53, 0x69, 0x7a, 0x65, 0x28, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x77, 0x20, 0x2a, 0x20, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x68, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x5f, 0x77, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x20, + 0x3d, 0x20, 0x28, 0x6a, 0x20, 0x25, 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x79, + 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x20, 0x6f, + 0x72, 0x20, 0x73, 0x79, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x20, 0x3d, 0x20, 0x6f, 0x78, 0x20, 0x2b, + 0x20, 0x6a, 0x20, 0x2a, 0x20, 0x73, 0x78, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x6f, 0x79, 0x20, 0x2b, + 0x20, 0x69, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x79, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x79, + 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x3a, 0x75, 0x6e, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x74, 0x29, 0x09, 0x09, 0x0a, + 0x09, 0x09, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x72, 0x65, 0x73, + 0x69, 0x7a, 0x65, 0x28, 0x77, 0x2c, 0x20, 0x68, 0x29, 0x0a, + 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x28, 0x64, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x2b, 0x20, 0x64, 0x74, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x6f, 0x64, 0x66, 0x28, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x29, 0x0a, + 0x09, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x69, 0x6e, 0x28, 0x66, 0x72, 0x61, 0x63, + 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x34, 0x35, 0x0a, + 0x09, 0x09, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x35, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x6f, 0x64, 0x65, 0x20, + 0x3d, 0x20, 0x22, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x73, 0x2e, 0x69, 0x73, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x28, 0x22, + 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x57, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x73, 0x65, + 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x73, 0x20, 0x4f, 0x4b, 0x2e, 0x0a, + 0x09, 0x09, 0x09, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, + 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2a, 0x20, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x74, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f, 0x79, 0x20, 0x3d, 0x20, + 0x2d, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2b, 0x20, + 0x79, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x69, 0x67, 0x5f, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x72, + 0x61, 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x79, 0x20, 0x2b, 0x20, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x6d, 0x6f, + 0x64, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x31, 0x32, 0x38, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x2d, 0x72, 0x61, + 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x2c, 0x20, 0x73, 0x6d, 0x61, 0x6c, + 0x6c, 0x5f, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x22, + 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x2d, 0x72, 0x61, + 0x69, 0x6e, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x78, 0x2c, 0x20, 0x62, 0x69, 0x67, 0x5f, + 0x79, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, + 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x6f, 0x64, 0x66, 0x28, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x66, 0x72, 0x61, 0x63, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x2e, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2b, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x2e, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x78, 0x2c, + 0x20, 0x74, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x30, 0x2c, 0x20, + 0x37, 0x30, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x78, 0x2c, 0x20, 0x79, + 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x79, 0x20, + 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, + 0x69, 0x20, 0x2a, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x32, 0x29, 0x20, 0x2b, 0x20, + 0x31, 0x29, 0x20, 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x36, 0x34, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x2c, + 0x20, 0x30, 0x2e, 0x37, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x33, 0x32, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x35, + 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x31, 0x36, 0x20, 0x2b, 0x20, 0x31, 0x36, 0x2a, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x74, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x36, 0x2c, + 0x20, 0x30, 0x2e, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x73, 0x63, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x20, 0x2a, + 0x20, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x69, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x69, 0x20, + 0x2a, 0x20, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x78, 0x20, 0x3d, 0x20, 0x78, 0x20, 0x2b, 0x20, 0x62, + 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x78, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x20, 0x3d, 0x20, 0x79, 0x20, 0x2b, 0x20, 0x62, + 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x6f, 0x73, 0x63, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x62, + 0x78, 0x2c, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x37, 0x30, + 0x2c, 0x20, 0x37, 0x30, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x28, 0x62, 0x78, 0x2c, 0x20, 0x62, 0x79, + 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x2e, 0x79, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x78, 0x2c, 0x20, 0x6f, 0x79, 0x20, 0x3d, 0x20, 0x69, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x77, 0x20, 0x2f, 0x20, 0x32, + 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x67, 0x5f, 0x68, 0x20, + 0x2f, 0x20, 0x32, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, + 0x78, 0x2c, 0x20, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x28, 0x22, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x22, + 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x2c, 0x20, 0x78, 0x2c, 0x20, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6f, + 0x78, 0x2c, 0x20, 0x6f, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x62, 0x75, 0x62, 0x62, 0x6c, 0x65, 0x28, 0x78, 0x2c, 0x20, 0x79, + 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x64, 0x72, 0x61, + 0x77, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, + 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x67, 0x72, 0x69, 0x64, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6b, 0x65, 0x79, + 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x73, 0x63, 0x61, 0x70, + 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x69, 0x74, + 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x28, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x5c, 0x31, 0x39, 0x35, + 0x5c, 0x31, 0x35, 0x30, 0x56, 0x45, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x28, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, + 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x74, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x2d, 0x2d, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x2e, 0x0a, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x6c, 0x61, + 0x79, 0x65, 0x72, 0x29, 0x0a, + 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x28, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x2c, 0x20, 0x31, 0x2b, + 0x28, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x29, 0x29, 0x3a, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x22, 0x5c, 0x6e, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x29, + 0x29, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x68, + 0x61, 0x6e, 0x64, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, + 0x09, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x73, + 0x67, 0x29, 0x0a, + 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x6d, 0x73, 0x67, + 0x2c, 0x20, 0x32, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x69, 0x63, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x69, 0x63, 0x73, 0x2e, 0x69, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x28, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x69, + 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x28, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x38, + 0x30, 0x30, 0x2c, 0x20, 0x36, 0x30, 0x30, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x6f, + 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x52, 0x65, 0x73, 0x65, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x56, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6d, 0x6f, 0x75, 0x73, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x47, 0x72, + 0x61, 0x62, 0x62, 0x65, 0x64, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x53, 0x74, 0x6f, 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6a, 0x6f, 0x79, 0x73, + 0x74, 0x69, 0x63, 0x6b, 0x20, 0x76, 0x69, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x6a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x2e, 0x67, 0x65, + 0x74, 0x4a, 0x6f, 0x79, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x28, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x76, 0x3a, 0x73, 0x65, 0x74, 0x56, 0x69, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x6f, 0x70, 0x28, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x72, 0x65, 0x73, + 0x65, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, + 0x42, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x38, 0x39, + 0x2c, 0x20, 0x31, 0x35, 0x37, 0x2c, 0x20, 0x32, 0x32, 0x30, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, + 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x46, 0x6f, + 0x6e, 0x74, 0x28, 0x31, 0x34, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, + 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x35, + 0x35, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, 0x6c, 0x65, + 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, 0x72, 0x72, 0x2c, + 0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, 0x72, 0x72, 0x2c, + 0x20, 0x6d, 0x73, 0x67, 0x2e, 0x2e, 0x22, 0x5c, 0x6e, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x22, 0x28, 0x2e, 0x2d, 0x29, + 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x6c, 0x2c, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x74, 0x2e, 0x6c, 0x75, 0x61, 0x22, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x6c, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, + 0x63, 0x6b, 0x3a, 0x22, 0x2c, 0x20, 0x22, 0x54, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5c, 0x6e, + 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, 0x72, + 0x72, 0x2c, 0x20, 0x6c, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x09, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x70, + 0x2c, 0x20, 0x22, 0x5c, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, 0x0a, + 0x09, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 0x73, 0x75, 0x62, 0x28, 0x70, + 0x2c, 0x20, 0x22, 0x25, 0x5b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x5c, 0x22, 0x28, 0x2e, 0x2d, 0x29, + 0x5c, 0x22, 0x25, 0x5d, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x31, 0x22, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x72, + 0x61, 0x77, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x63, 0x6c, + 0x65, 0x61, 0x72, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x66, 0x28, 0x70, 0x2c, 0x20, 0x37, 0x30, 0x2c, 0x20, 0x37, 0x30, 0x2c, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x57, 0x69, 0x64, + 0x74, 0x68, 0x28, 0x29, 0x20, 0x2d, 0x20, 0x37, 0x30, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x28, + 0x29, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x2c, 0x20, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x20, 0x69, + 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x6f, 0x6c, 0x6c, 0x28, + 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x71, 0x75, 0x69, 0x74, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x73, + 0x63, 0x61, 0x70, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x64, 0x72, 0x61, 0x77, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x72, 0x2e, 0x73, 0x6c, 0x65, 0x65, + 0x70, 0x28, 0x30, 0x2e, 0x31, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, + 0x65, 0x72, 0x45, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x28, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x2d, 0x2d, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x2e, 0x0a, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x78, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x62, 0x6f, 0x6f, 0x74, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x78, 0x70, + 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x2c, 0x20, 0x64, 0x65, + 0x66, 0x65, 0x72, 0x45, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x74, + 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, + 0x72, 0x75, 0x6e, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x65, 0x72, 0x45, 0x72, 0x72, 0x68, 0x61, 0x6e, 0x64, 0x29, 0x0a, + 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x31, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x72, + 0x65, 0x74, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x30, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, +}; // [boot.lua] +} // love \ No newline at end of file diff --git a/jni/love/src/scripts/graphics.lua b/jni/love/src/scripts/graphics.lua new file mode 100644 index 00000000..45412e26 --- /dev/null +++ b/jni/love/src/scripts/graphics.lua @@ -0,0 +1,1530 @@ +--[[ +Copyright (c) 2006-2013 LOVE Development Team + +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. +--]] + +do + + local vera_ttf = love.filesystem.newFileData([[ + AAEAAAARAQAABAAQT1MvMrRf9GMAAOtwAAAAVlBDTFTRil6XAADryAAAADZjbWFwpMPooAAA + sWwAAANYY3Z0IP/THTkAAB78AAAB/GZwZ23ntPHEAAAmYAAAAItnYXNwAAcABwABAUgAAAAM + Z2x5Zgx0Qc8AACbsAACKfmhkbXg08CEOAADsAAAAFUhoZWFk3YSi0AABAVQAAAA2aGhlYRBF + CG8AAOtMAAAAJGhtdHgJxo6yAAC0xAAABDBrZXJu3FLVmQAAvaAAAC2KbG9jYfPL0j0AALuE + AAACGm1heHAFRwY6AADrLAAAACBuYW1l2bzItQAAARwAAB3fcG9zdLRaL7sAALj0AAACjnBy + ZXA7B/EAAAAg+AAABWgAAAAWAQ4AAQAAAAAAAAA6AAAAAQAAAAAAAQATADoAAQAAAAAAAgAF + AF8AAQAAAAAAAwATADoAAQAAAAAABAATADoAAQAAAAAABQAMAGQAAQAAAAAABgAXAE0AAQAA + AAAABwAwAK0AAQAAAAAACAAOCGwAAQAAAAAACwAYCYMAAQAAAAAADQkTAHAAAwABBAkAAAB0 + CZsAAwABBAkAAQAmCg8AAwABBAkAAgAKClkAAwABBAkAAwAmCg8AAwABBAkABAAmCg8AAwAB + BAkABQAYCmMAAwABBAkABgAuCjUAAwABBAkABwBgCvUAAwABBAkACAAcGnMAAwABBAkACwAw + HKEAAwABBAkADRImCntDb3B5cmlnaHQgKGMpIDIwMDMgYnkgQml0c3RyZWFtLCBJbmMuIEFs + bCBSaWdodHMgUmVzZXJ2ZWQuQml0c3RyZWFtIFZlcmEgU2Fuc0JpdHN0cmVhbVZlcmFTYW5z + LVJvbWFuUmVsZWFzZSAxLjEwQ29weXJpZ2h0IChjKSAyMDAzIGJ5IEJpdHN0cmVhbSwgSW5j + Lg0KQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCkJpdHN0cmVhbSBWZXJhIGlzIGEgdHJhZGVtYXJr + IG9mIEJpdHN0cmVhbSwgSW5jLg0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBm + cmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBm + b250cyBhY2NvbXBhbnlpbmcgdGhpcyBsaWNlbnNlICgiRm9udHMiKSBhbmQgYXNzb2NpYXRl + ZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIkZvbnQgU29mdHdhcmUiKSwgdG8gcmVwcm9k + dWNlIGFuZCBkaXN0cmlidXRlIHRoZSBGb250IFNvZnR3YXJlLCBpbmNsdWRpbmcgd2l0aG91 + dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtZXJnZSwgcHVibGlzaCwg + ZGlzdHJpYnV0ZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBh + bmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgRm9udCBTb2Z0d2FyZSBpcyBmdXJu + aXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0K + DQpUaGUgYWJvdmUgY29weXJpZ2h0IGFuZCB0cmFkZW1hcmsgbm90aWNlcyBhbmQgdGhpcyBw + ZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIG9u + ZSBvciBtb3JlIG9mIHRoZSBGb250IFNvZnR3YXJlIHR5cGVmYWNlcy4NCg0KVGhlIEZvbnQg + U29mdHdhcmUgbWF5IGJlIG1vZGlmaWVkLCBhbHRlcmVkLCBvciBhZGRlZCB0bywgYW5kIGlu + IHBhcnRpY3VsYXIgdGhlIGRlc2lnbnMgb2YgZ2x5cGhzIG9yIGNoYXJhY3RlcnMgaW4gdGhl + IEZvbnRzIG1heSBiZSBtb2RpZmllZCBhbmQgYWRkaXRpb25hbCBnbHlwaHMgb3IgY2hhcmFj + dGVycyBtYXkgYmUgYWRkZWQgdG8gdGhlIEZvbnRzLCBvbmx5IGlmIHRoZSBmb250cyBhcmUg + cmVuYW1lZCB0byBuYW1lcyBub3QgY29udGFpbmluZyBlaXRoZXIgdGhlIHdvcmRzICJCaXRz + dHJlYW0iIG9yIHRoZSB3b3JkICJWZXJhIi4NCg0KVGhpcyBMaWNlbnNlIGJlY29tZXMgbnVs + bCBhbmQgdm9pZCB0byB0aGUgZXh0ZW50IGFwcGxpY2FibGUgdG8gRm9udHMgb3IgRm9udCBT + b2Z0d2FyZSB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIGFuZCBpcyBkaXN0cmlidXRlZCB1bmRl + ciB0aGUgIkJpdHN0cmVhbSBWZXJhIiBuYW1lcy4NCg0KVGhlIEZvbnQgU29mdHdhcmUgbWF5 + IGJlIHNvbGQgYXMgcGFydCBvZiBhIGxhcmdlciBzb2Z0d2FyZSBwYWNrYWdlIGJ1dCBubyBj + b3B5IG9mIG9uZSBvciBtb3JlIG9mIHRoZSBGb250IFNvZnR3YXJlIHR5cGVmYWNlcyBtYXkg + YmUgc29sZCBieSBpdHNlbGYuDQoNClRIRSBGT05UIFNPRlRXQVJFIElTIFBST1ZJREVEICJB + UyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElF + RCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBBTlkgV0FSUkFOVElFUyBPRiBNRVJD + SEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05J + TkZSSU5HRU1FTlQgT0YgQ09QWVJJR0hULCBQQVRFTlQsIFRSQURFTUFSSywgT1IgT1RIRVIg + UklHSFQuIElOIE5PIEVWRU5UIFNIQUxMIEJJVFNUUkVBTSBPUiBUSEUgR05PTUUgRk9VTkRB + VElPTiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJ + VFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5U + QUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0Yg + Q09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUg + VVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhF + UiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS4NCg0KRXhjZXB0IGFzIGNvbnRhaW5l + ZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWVzIG9mIEdub21lLCB0aGUgR25vbWUgRm91bmRh + dGlvbiwgYW5kIEJpdHN0cmVhbSBJbmMuLCBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRp + c2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRl + YWxpbmdzIGluIHRoaXMgRm9udCBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0 + aG9yaXphdGlvbiBmcm9tIHRoZSBHbm9tZSBGb3VuZGF0aW9uIG9yIEJpdHN0cmVhbSBJbmMu + LCByZXNwZWN0aXZlbHkuIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBjb250YWN0OiBmb250 + cyBhdCBnbm9tZSBkb3Qgb3JnLmh0dHA6Ly93d3cuYml0c3RyZWFtLmNvbQBDAG8AcAB5AHIA + aQBnAGgAdAAgACgAYwApACAAMgAwADAAMwAgAGIAeQAgAEIAaQB0AHMAdAByAGUAYQBtACwA + IABJAG4AYwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAEIA + aQB0AHMAdAByAGUAYQBtACAAVgBlAHIAYQAgAFMAYQBuAHMAQgBpAHQAcwB0AHIAZQBhAG0A + VgBlAHIAYQBTAGEAbgBzAC0AUgBvAG0AYQBuAFIAZQBsAGUAYQBzAGUAIAAxAC4AMQAwAEMA + bwBwAHkAcgBpAGcAaAB0ACAAKABjACkAIAAyADAAMAAzACAAYgB5ACAAQgBpAHQAcwB0AHIA + ZQBhAG0ALAAgAEkAbgBjAC4ADQAKAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIA + dgBlAGQALgANAAoAQgBpAHQAcwB0AHIAZQBhAG0AIABWAGUAcgBhACAAaQBzACAAYQAgAHQA + cgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQgBpAHQAcwB0AHIAZQBhAG0ALAAgAEkAbgBjAC4A + DQAKAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIA + YQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEA + bgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAA + bwBmACAAdABoAGUAIABmAG8AbgB0AHMAIABhAGMAYwBvAG0AcABhAG4AeQBpAG4AZwAgAHQA + aABpAHMAIABsAGkAYwBlAG4AcwBlACAAKAAiAEYAbwBuAHQAcwAiACkAIABhAG4AZAAgAGEA + cwBzAG8AYwBpAGEAdABlAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuACAAZgBpAGwA + ZQBzACAAKAB0AGgAZQAgACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACkALAAgAHQA + bwAgAHIAZQBwAHIAbwBkAHUAYwBlACAAYQBuAGQAIABkAGkAcwB0AHIAaQBiAHUAdABlACAA + dABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABpAG4AYwBsAHUAZABpAG4A + ZwAgAHcAaQB0AGgAbwB1AHQAIABsAGkAbQBpAHQAYQB0AGkAbwBuACAAdABoAGUAIAByAGkA + ZwBoAHQAcwAgAHQAbwAgAHUAcwBlACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAHAA + dQBiAGwAaQBzAGgALAAgAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkAC8AbwByACAA + cwBlAGwAbAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYA + dAB3AGEAcgBlACwAIABhAG4AZAAgAHQAbwAgAHAAZQByAG0AaQB0ACAAcABlAHIAcwBvAG4A + cwAgAHQAbwAgAHcAaABvAG0AIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUA + IABpAHMAIABmAHUAcgBuAGkAcwBoAGUAZAAgAHQAbwAgAGQAbwAgAHMAbwAsACAAcwB1AGIA + agBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkA + dABpAG8AbgBzADoADQAKAA0ACgBUAGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcA + aAB0ACAAYQBuAGQAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG4AbwB0AGkAYwBlAHMAIABhAG4A + ZAAgAHQAaABpAHMAIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAbgBvAHQAaQBjAGUAIABzAGgA + YQBsAGwAIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABpAG4AIABhAGwAbAAgAGMAbwBwAGkA + ZQBzACAAbwBmACAAbwBuAGUAIABvAHIAIABtAG8AcgBlACAAbwBmACAAdABoAGUAIABGAG8A + bgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdAB5AHAAZQBmAGEAYwBlAHMALgANAAoADQAKAFQA + aABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAbQBvAGQA + aQBmAGkAZQBkACwAIABhAGwAdABlAHIAZQBkACwAIABvAHIAIABhAGQAZABlAGQAIAB0AG8A + LAAgAGEAbgBkACAAaQBuACAAcABhAHIAdABpAGMAdQBsAGEAcgAgAHQAaABlACAAZABlAHMA + aQBnAG4AcwAgAG8AZgAgAGcAbAB5AHAAaABzACAAbwByACAAYwBoAGEAcgBhAGMAdABlAHIA + cwAgAGkAbgAgAHQAaABlACAARgBvAG4AdABzACAAbQBhAHkAIABiAGUAIABtAG8AZABpAGYA + aQBlAGQAIABhAG4AZAAgAGEAZABkAGkAdABpAG8AbgBhAGwAIABnAGwAeQBwAGgAcwAgAG8A + cgAgAGMAaABhAHIAYQBjAHQAZQByAHMAIABtAGEAeQAgAGIAZQAgAGEAZABkAGUAZAAgAHQA + bwAgAHQAaABlACAARgBvAG4AdABzACwAIABvAG4AbAB5ACAAaQBmACAAdABoAGUAIABmAG8A + bgB0AHMAIABhAHIAZQAgAHIAZQBuAGEAbQBlAGQAIAB0AG8AIABuAGEAbQBlAHMAIABuAG8A + dAAgAGMAbwBuAHQAYQBpAG4AaQBuAGcAIABlAGkAdABoAGUAcgAgAHQAaABlACAAdwBvAHIA + ZABzACAAIgBCAGkAdABzAHQAcgBlAGEAbQAiACAAbwByACAAdABoAGUAIAB3AG8AcgBkACAA + IgBWAGUAcgBhACIALgANAAoADQAKAFQAaABpAHMAIABMAGkAYwBlAG4AcwBlACAAYgBlAGMA + bwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIAB0AG8AIAB0AGgAZQAgAGUA + eAB0AGUAbgB0ACAAYQBwAHAAbABpAGMAYQBiAGwAZQAgAHQAbwAgAEYAbwBuAHQAcwAgAG8A + cgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIAB0AGgAYQB0ACAAaABhAHMAIABiAGUA + ZQBuACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIABpAHMAIABkAGkAcwB0AHIAaQBiAHUA + dABlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgACIAQgBpAHQAcwB0AHIAZQBhAG0AIABWAGUA + cgBhACIAIABuAGEAbQBlAHMALgANAAoADQAKAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQA + dwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAcwBvAGwAZAAgAGEAcwAgAHAAYQByAHQAIABvAGYA + IABhACAAbABhAHIAZwBlAHIAIABzAG8AZgB0AHcAYQByAGUAIABwAGEAYwBrAGEAZwBlACAA + YgB1AHQAIABuAG8AIABjAG8AcAB5ACAAbwBmACAAbwBuAGUAIABvAHIAIABtAG8AcgBlACAA + bwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdAB5AHAAZQBmAGEA + YwBlAHMAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0A + CgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8A + VgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIA + QQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8A + UgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8A + VAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMA + IABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMA + UwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAA + QQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkA + UgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8A + UgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAA + UwBIAEEATABMACAAQgBJAFQAUwBUAFIARQBBAE0AIABPAFIAIABUAEgARQAgAEcATgBPAE0A + RQAgAEYATwBVAE4ARABBAFQASQBPAE4AIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAA + QQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIA + IABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcA + RQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAA + SQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEA + TAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMA + VABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8A + VABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQA + IABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8A + IABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYA + UgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYA + TwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoADQAKAEUAeABjAGUAcAB0ACAAYQBzACAA + YwBvAG4AdABhAGkAbgBlAGQAIABpAG4AIAB0AGgAaQBzACAAbgBvAHQAaQBjAGUALAAgAHQA + aABlACAAbgBhAG0AZQBzACAAbwBmACAARwBuAG8AbQBlACwAIAB0AGgAZQAgAEcAbgBvAG0A + ZQAgAEYAbwB1AG4AZABhAHQAaQBvAG4ALAAgAGEAbgBkACAAQgBpAHQAcwB0AHIAZQBhAG0A + IABJAG4AYwAuACwAIABzAGgAYQBsAGwAIABuAG8AdAAgAGIAZQAgAHUAcwBlAGQAIABpAG4A + IABhAGQAdgBlAHIAdABpAHMAaQBuAGcAIABvAHIAIABvAHQAaABlAHIAdwBpAHMAZQAgAHQA + bwAgAHAAcgBvAG0AbwB0AGUAIAB0AGgAZQAgAHMAYQBsAGUALAAgAHUAcwBlACAAbwByACAA + bwB0AGgAZQByACAAZABlAGEAbABpAG4AZwBzACAAaQBuACAAdABoAGkAcwAgAEYAbwBuAHQA + IABTAG8AZgB0AHcAYQByAGUAIAB3AGkAdABoAG8AdQB0ACAAcAByAGkAbwByACAAdwByAGkA + dAB0AGUAbgAgAGEAdQB0AGgAbwByAGkAegBhAHQAaQBvAG4AIABmAHIAbwBtACAAdABoAGUA + IABHAG4AbwBtAGUAIABGAG8AdQBuAGQAYQB0AGkAbwBuACAAbwByACAAQgBpAHQAcwB0AHIA + ZQBhAG0AIABJAG4AYwAuACwAIAByAGUAcwBwAGUAYwB0AGkAdgBlAGwAeQAuACAARgBvAHIA + IABmAHUAcgB0AGgAZQByACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACwAIABjAG8AbgB0AGEA + YwB0ADoAIABmAG8AbgB0AHMAIABhAHQAIABnAG4AbwBtAGUAIABkAG8AdAAgAG8AcgBnAC4A + aAB0AHQAcAA6AC8ALwB3AHcAdwAuAGIAaQB0AHMAdAByAGUAYQBtAC4AYwBvAG0AATUAuADL + AMsAwQCqAJwBpgC4AGYAAABxAMsAoAKyAIUAdQC4AMMBywGJAi0AywCmAPAA0wCqAIcAywOq + BAABSgAzAMsAAADZBQIA9AFUALQAnAE5ARQBOQcGBAAETgS0BFIEuATnBM0ANwRzBM0EYARz + ATMDogVWBaYFVgU5A8UCEgDJAB8AuAHfAHMAugPpAzMDvAREBA4A3wPNA6oA5QOqBAQAAADL + AI8ApAB7ALgAFAFvAH8CewJSAI8AxwXNAJoAmgBvAMsAzQGeAdMA8AC6AYMA1QCYAwQCSACe + AdUAwQDLAPYAgwNUAn8AAAMzAmYA0wDHAKQAzQCPAJoAcwQABdUBCgD+AisApAC0AJwAAABi + AJwAAAAdAy0F1QXVBdUF8AB/AHsAVACkBrgGFAcjAdMAuADLAKYBwwHsBpMAoADTA1wDcQPb + AYUEIwSoBEgAjwE5ARQBOQNgAI8F1QGaBhQHIwZmAXkEYARgBGAEewCcAAACdwRgAaoA6QRg + B2IAewDFAH8CewAAALQCUgXNAGYAvABmAHcGEADNATsBhQOJAI8AewAAAB0AzQdKBC8AnACc + AAAHfQBvAAAAbwM1AGoAbwB7AK4AsgAtA5YAjwJ7APYAgwNUBjcF9gCPAJwE4QJmAI8BjQL2 + AM0DRAApAGYE7gBzAAAUALgCgED/+/4D+hQD+SUD+DID95YD9g4D9f4D9P4D8yUD8g4D8ZYD + 8CUD74pBBe/+A+6WA+2WA+z6A+v6A+r+A+k6A+hCA+f+A+YyA+XkUwXllgPkikEF5FMD4+Iv + BeP6A+IvA+H+A+D+A98yA94UA92WA9z+A9sSA9p9A9m7A9j+A9aKQQXWfQPV1EcF1X0D1EcD + 09IbBdP+A9IbA9H+A9D+A8/+A87+A82WA8zLHgXM/gPLHgPKMgPJ/gPGhREFxhwDxRYDxP4D + w/4Dwv4Dwf4DwP4Dv/4Dvv4Dvf4DvP4Du/4DuhEDuYYlBbn+A7i3uwW4/gO3tl0Ft7sDt4AE + trUlBbZdQP8DtkAEtSUDtP4Ds5YDsv4Dsf4DsP4Dr/4DrmQDrQ4DrKslBaxkA6uqEgWrJQOq + EgOpikEFqfoDqP4Dp/4Dpv4DpRIDpP4Do6IOBaMyA6IOA6FkA6CKQQWglgOf/gOenQwFnv4D + nQwDnJsZBZxkA5uaEAWbGQOaEAOZCgOY/gOXlg0Fl/4Dlg0DlYpBBZWWA5STDgWUKAOTDgOS + +gORkLsFkf4DkI9dBZC7A5CABI+OJQWPXQOPQASOJQON/gOMiy4FjP4Diy4DioYlBYpBA4mI + CwWJFAOICwOHhiUFh2QDhoURBYYlA4URA4T+A4OCEQWD/gOCEQOB/gOA/gN//gNA/359fQV+ + /gN9fQN8ZAN7VBUFeyUDev4Def4DeA4DdwwDdgoDdf4DdPoDc/oDcvoDcfoDcP4Db/4Dbv4D + bCEDa/4DahFCBWpTA2n+A2h9A2cRQgVm/gNl/gNk/gNj/gNi/gNhOgNg+gNeDANd/gNb/gNa + /gNZWAoFWfoDWAoDVxYZBVcyA1b+A1VUFQVVQgNUFQNTARAFUxgDUhQDUUoTBVH+A1ALA0/+ + A05NEAVO/gNNEANM/gNLShMFS/4DSkkQBUoTA0kdDQVJEANIDQNH/gNGlgNFlgNE/gNDAi0F + Q/oDQrsDQUsDQP4DP/4DPj0SBT4UAz08DwU9EgM8Ow0FPED/DwM7DQM6/gM5/gM4NxQFOPoD + NzYQBTcUAzY1CwU2EAM1CwM0HgMzDQMyMQsFMv4DMQsDMC8LBTANAy8LAy4tCQUuEAMtCQMs + MgMrKiUFK2QDKikSBSolAykSAygnJQUoQQMnJQMmJQsFJg8DJQsDJP4DI/4DIg8DIQEQBSES + AyBkAx/6Ax4dDQUeZAMdDQMcEUIFHP4DG/oDGkIDGRFCBRn+AxhkAxcWGQUX/gMWARAFFhkD + Ff4DFP4DE/4DEhFCBRL+AxECLQURQgMQfQMPZAMO/gMNDBYFDf4DDAEQBQwWAwv+AwoQAwn+ + AwgCLQUI/gMHFAMGZAMEARAFBP4DQBUDAi0FA/4DAgEQBQItAwEQAwD+AwG4AWSFjQErKysr + KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr + KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr + KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysA + KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr + KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr + KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKx22BgUE + AwIBACwgELACJUlksEBRWCDIWSEtLLACJUlksEBRWCDIWSEtLCAQByCwAFCwDXkguP//UFgE + GwVZsAUcsAMlCLAEJSPhILAAULANeSC4//9QWAQbBVmwBRywAyUI4S0sS1BYILD9RURZIS0s + sAIlRWBELSxLU1iwAiWwAiVFRFkhIS0sRUQtAAACAGb+lgRmBaQAAwAHABpADAT7AAb7AQgF + fwIEAC/E1OwxABDU7NTsMBMRIRElIREhZgQA/HMDG/zl/pYHDvjycgYpAAIBNQAAAgAF1QAD + AAkAQEAPBwCDBIECCAcFAQMEAAAKEPw87DI5OTEAL+T8zDABS7ALVFi9AAoAQAABAAoACv/A + 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 + b3D8i/7u/u0BEwESa6jVAZGm/X9TVQGZAW0BbgGZSEbXX2D+zv7R/tL+ziUAAQDJAAAFOwXV + AAsALEAUCJUCrQQAgQoGBwMcBTgJARwABAwQ/Owy/OwyMQAvPOQy/OwwslANAQFdEzMRIREz + ESMRIREjycoC3srK/SLKBdX9nAJk+isCx/05AAABAMkAAAGTBdUAAwA5twCvAgEcAAQEEPzs + MQAv7DABS7AQVFi9AAT/wAABAAQABABAOBE3OFlADTAFQAVQBWAFjwWfBQZdEzMRI8nKygXV + +isAAf+W/mYBkwXVAAsATUATCwIAB5UFsACBDAUIBjkBHAAEDBD87OQ5OTEAEOT87BE5OTAB + S7AQVFi9AAz/wAABAAwADABAOBE3OFlADTANQA1QDWANjw2fDQZdEzMREAYrATUzMjY1ycrN + 400/hm4F1fqT/vL0qpbCAAABAMkAAAVqBdUACgDvQCgIEQUGBQcRBgYFAxEEBQQCEQUFBEII + BQIDAwCvCQYFAQQGCAEcAAQLEPzsMtTEETkxAC887DIXOTBLU1gHEATtBxAF7QcQBe0HEATt + WSKyCAMBAV1AkhQCAQQCCQgWAigFKAg3AjYFNAhHAkYFQwhVAmcCdgJ3BYMCiAWPCJQCmwjn + AhUGAwkFCQYbAxkHBQoDCgcYAygFKwYqBzYENgU2BjUHMAxBA0AERQVABkAHQAxiA2AEaAVn + B3cFcAyLA4sFjgaPB48MmgOdBp0HtgO1B8UDxQfXA9YH6APpBOgF6gb3A/gF+QYsXXEAXXET + MxEBIQkBIQERI8nKAp4BBP0bAxr+9v0zygXV/YkCd/1I/OMCz/0xAAABAMkAAARqBdUABQAl + QAwClQCBBAEcAzoABAYQ/OzsMQAv5OwwQAkwB1AHgAOABAQBXRMzESEVIcnKAtf8XwXV+tWq + AAEAyQAABh8F1QAMAL9ANAMRBwgHAhEBAggIBwIRAwIJCgkBEQoKCUIKBwIDCAMArwgLBQkI + AwIBBQoGHAQ+ChwABA0Q/Oz87BEXOTEALzzE7DIRFzkwS1NYBxAF7QcQCO0HEAjtBxAF7Vki + snAOAQFdQFYDBw8IDwkCChUCFAcTCiYCJgcgByYKIAo0BzUKaQJ8AnsHeQqAAoIHggqQAhYE + AQsDEwEbAyMBLAMnCCgJNAE8A1YIWQllCGoJdgh5CYEBjQOVAZsDFF0AXRMhCQEhESMRASMB + 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 + JAogCj4CPgU0CjAKTAJNBUIKQApZAmoCawVnCmAKewJ/AnwFfwWACpYClQUdBwAJAggDAAQG + BQAFAAYBBwQIAAgHCQAJBAoKDAAOGgMVBBUIGQwQDiAEIQUgBiAHIAgjCSQKJQsgDiAOPAI6 + AzUEMwUwCDYJOQs/DDAORgBGAUoCQARFBUAFQgZCB0IIQAhACUQKTQxADkAOWAJWCFkMUA5m + AmcDYQRiBWAGYAdgCGQJZApkC3cAdgF7AngDdwR0BXkGeQd3CHAIeAx/DH8OhgKHA4gEiQWF + CYoLjw6XBJ8Orw5bXQBdEzMJATMJATMBIwkBI0TMAToBOeMBOgE5zf6J/v7F/sL+BdX7EgTu + +xIE7vorBRD68AABAD0AAAU7BdUACwFdQEYJEQoLCggRBwgLCwoIEQkIBQYFBxEGBgUDEQQF + BAIRAQIFBQQCEQMCCwALAREAAAtCCwgFAgQDAK8JBgsIBQIEAAQGAAoMENTE3MQRFzkxAC88 + 7DIXOTBLU1gHEAXtBxAI7QcQCO0HEAXtBxAF7QcQCO0HEAjtBxAF7VkiAUuwDFRLsA1UW0uw + DlRbWL0ADP/AAAEADAAMAEA4ETc4WUC4BwIICBYCGQgXCycIJws0AjgINgtLCFgFWwhmAmsI + dwJ3C4YCgAKHBYsIhQuUApAClwWdCJYLGwYBCQMIBwcJFgEZAxkHFwkQDSYBKAIpAyYFKAcn + CSkLIA01ADQBPAM7BDoGOwc0CTQKOAs/DUgJTw1YC18NZQBlAWoDagRoBWkGaQdsCWwKeAN5 + BnkHeAh9CX8KeAuAAIABgwKIA4UFhAiDC48NkACQAZQClwWXBpUIkwufDa8NQF0AXRMzCQEz + CQEjCQEjAYHZAXMBddn+IAIA2f5c/lnaAhUF1f3VAiv9M/z4Anv9hQMdAAH//AAABOcF1QAI + AJRAKAMRBAUEAhEBAgUFBAIRAwIIAAgBEQAACEICAwCvBgIHBEAFHABABwkQ1OT85BI5MQAv + 7DI5MEtTWAcQBe0HEAjtBxAI7QcQBe1ZIrIACgEBXUA8BQIUAjUCMAIwBTAIRgJAAkAFQAhR + AlEFUQhlAoQCkwIQFgEaAx8KJgEpAzcBOANACmcBaAN4A3AKnwoNXQBdAzMJATMBESMRBNkB + ngGb2f3wywXV/ZoCZvzy/TkCxwAAAQBcAAAFHwXVAAkAm0AbAxEHCAcIEQIDAkIIlQCBA5UF + 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 + AQANAA0AQDgRNzhZAUuwDFRLsA1UW0uwEFRbWL0ADQBAAAEADQAN/8A4ETc4WUD/BQIWAhYF + Igo1CkkCSQVGCkAKWwJbBVUKUApuAm4FZgp5An8CeQV/BYcCmQKYBZQKvAK8Bc4CxwPPBR0F + AgkDBgQLBQoICwkECwUMFQIZAxYEGgUbCBsJFAsVDCUAJQEjAicDIQQlBSIGIgclCCcJJAoh + CyMMOQM2BDYIOQwwDkYCSANGBEAEQgVABkAHQAhECUQKRAtADkAOVgBWAVYCUARRBVIGUgdQ + CFMJVApVC2MAZAFlAmoDZQRqBWoGagduCWELZwxvDnUAdQF5An0DeAR9BXoGfwZ6B38HeAh5 + CX8Jewp2C30MhwKIBY8OlwCXAZQCkwOcBJsFmAaYB5kIQC+WDJ8OpgCmAaQCpAOrBKsFqQap + B6sIpAyvDrUCsQO9BLsFuAm/DsQCwwPMBMoFeV0AXRMzGwEzGwEzASMLASNWuObl2ebluP7b + 2fHy2QRg/JYDavyWA2r7oAOW/GoAAQA7AAAEeQRgAAsBWkBGBREGBwYEEQMEBwcGBBEFBAEC + AQMRAgIBCxEAAQAKEQkKAQEAChELCgcIBwkRCAgHQgoHBAEECAC/BQIKBwQBBAgAAggGDBDU + xNTEERc5MQAvPOwyFzkwS1NYBxAF7QcQCO0HEAjtBxAF7QcQBe0HEAjtBxAI7QcQBe1ZIgFL + sApUS7APVFtLsBBUW0uwEVRbWL0ADP/AAAEADAAMAEA4ETc4WQFLsBRUWL0ADABAAAEADAAM + /8A4ETc4WUCYCgQEChoEFQomCj0EMQpVBFcHWApmCnYBegR2B3QKjQSCCpkEnwSXB5IKkAqm + AakErwSlB6MKoAocCgMEBQUJCgsaAxUFFQkaCykDJgUlCSoLIA06ATkDNwU0BzYJOQswDUkD + RgVFCUoLQA1ZAFYBWQJZA1cFVgZZB1YIVglZC1ANbw14AX8NmwGUB6sBpAewDc8N3w3/DS9d + AF0JAiMJASMJATMJAQRk/msBqtn+uv662QGz/nLZASkBKQRg/d/9wQG4/kgCSgIW/nEBjwAB + AD3+VgR/BGAADwGiQEMHCAIJEQAPChELCgAADw4RDwAPDREMDQAADw0RDg0KCwoMEQsLCkIN + CwkQAAsFhwO9Dgu8EA4NDAoJBgMACA8EDwsQENTExBEXOTEAEOQy9OwRORE5EjkwS1NYBxAF + 7QcQCO0HEAjtBxAF7QcQCO0HBe0XMlkiAUuwClRLsAhUW1i9ABD/wAABABAAEABAOBE3OFkB + S7AUVFi9ABAAQAABABAAEP/AOBE3OFlA8AYABQgGCQMNFgoXDRANIw01DUkKTwpODVoJWgpq + CocNgA2TDRIKAAoJBgsFDAsOCw8XARUCEAQQBRcKFAsUDBoOGg8nACQBJAIgBCAFKQgoCSUK + JAskDCcNKg4qDyARNwA1ATUCMAQwBTgKNgs2DDgNOQ45DzARQQBAAUACQANABEAFQAZAB0AI + QglFCkcNSQ5JD0ARVABRAVECVQNQBFAFVgZVB1YIVwlXClULVQxZDlkPUBFmAWYCaAppDmkP + YBF7CHgOeA+JAIoJhQuFDIkNiQ6JD5kJlQuVDJoOmg+kC6QMqw6rD7ARzxHfEf8RZV0AXQUO + ASsBNTMyNj8BATMJATMCk06UfJNsTFQzIf47wwFeAV7DaMh6mkiGVARO/JQDbAABAFgAAAPb + BGAACQC0QBoIEQIDAgMRBwgHQgipALwDqQUIAwEABAEGChDcxDLEETk5MQAv7PTsMEtTWAcQ + Be0HEAXtWSIBS7ALVEuwDFRbWL0ACgBAAAEACgAK/8A4ETc4WQFLsBNUWL0ACv/AAAEACgAK + AEA4ETc4WUBCBQIWAiYCRwJJBwULCA8LGAMbCCsIIAs2AzkIMAtAAUACRQNABEAFQwhXA1kI + XwtgAWACZgNgBGAFYgh/C4ALrwsbXQBdEyEVASEVITUBIXEDav1MArT8fQK0/WUEYKj825Oo + AyUAAQEA/rIEFwYUACQAgkA0GQ8VCwYlCRoQFR0LBSAhAwALqQkAqQHACRWpE7ElDAkKBSQW + GQAdCgUTAhQAIBlDCg8FJRDUPMT8PMQyOTkREjkREjk5ERI5OTEAEPzsxPTsEO4SFzkSORE5 + ORESORESOTkwAUuwDFRYvQAl/8AAAQAlACUAQDgRNzhZsgAmAV0FFSMiJj0BNCYrATUzMjY9 + ATQ2OwEVIyIGHQEUBgceAR0BFBYzBBc++alsjj09j2up+T5EjVZbbm9aVo2+kJTd75d0j3OV + 8N2Tj1iN+J2OGRuOnPiNWAABAQT+HQGuBh0AAwAStwEAsQQABQIEENTsMQAQ/MwwAREjEQGu + qgYd+AAIAAAAAQEA/rIEFwYUACQAnkA2HyUbFgwPCBsLFRkPBAUgAwAZqRsAqSPAGw+pEbEl + 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 + IyIGFREjuu/a0NsDl6g6QTmmYOHTQIhJUIxBdHg7ZVxgV6eXCINxgoi7BHHI2+jgCHNgL1Eq + JWqOZKy3GRikHh1fWz9UPjc7h1t/rB1ncIuD+5MAAAQBGwAABuUFzQAXAC8AOABMAGBANkVC + Qz8yyUgwyTlKQ8oMOcoAyRjIDMkkSEUzMAQxQjw/OTZJMWBLNmBDPF4SCR5LXgYJHl8qTRDc + 5PzsEP79xO4Q7jIROTkSORIXOTEAL+72/u0Q7TIQ7tbuORI5OTABIgYHBgYVFBYXFhYzMjY3 + NjY1NCYnJiYnMgQXFhIVFAIHBgQjIiQnJgI1NBI3NiQTIxEzMjY1NCYnMhYVFAYHFhYXFyMn + JiYjIxEjEQQAg+JeXmBgXl7ig4TjXl1dXlxe44SYAQdtbWxsbW3++ZiY/vltbWxsbW0BB317 + e25XWGawrmlgGEMuiayBO0k2QpsFZl5eXuWCgeNeXl9fXl3ig4XjXV5eZ25tbf76mpj++21t + bm5tbQEFmJoBBm1tbv5i/uw+S0w/Z3d5VnARCE1J39FgM/6cA0QAAwEbAAAG5QXNABcALwBJ + AENAJj3LPjrMQcokMcswNMxHyhjJAMgkyQw3YUQ9MF4qCQZEXh4JBhJKENzM/OwQ/u0yEO4x + AC/u9v797tbuEP3u1u4wATIEFxYSFRQCBwYEIyIkJyYCNTQSNzYkFyIGBwYGFRQWFxYWMzI2 + NzY2NTQmJyYmFxUmJiMiBhUUFjMyNjcVBgYjIiY1NDYzMhYEAJgBB21tbGxtbf75mJj++W1t + bGxtbQEHmIPiXl5gYF5e4oOE415dXV5cXuOnQoJClaerm0B6QkOJRtj7+9hJiAXNbm1t/vqa + mP77bW1ubm1tAQWYmgEGbW1uZ15eXuWCgeNeXl9fXl3ig4XjXV5e9YEhIK+dn64fIn8dHPTQ + 0fIcAAACAScDkwZGBdUADAAUAD5AIQEGBxAKBBIOCQMGyQ0CAIEVAQkFYgMJYgsNYw9iE2MR + FRDU5Pzk1OzU7BE5MQAQ9Dw87Bcy1Dw8xBE5MAETEzMRIxEDIwMRIxEjFSMRIxEjNQRKrqSq + ccM3y3Jxy3LJBdX/AAEA/b4B5P7RAS/+HAJCXv4cAeReAAABAXME7gNSBmYAAwAxQAkCtACz + BANEAQQQ1OwxABD07DAAS7AJVEuwDlRbWL0ABP/AAAEABAAEAEA4ETc4WQEzASMCi8f+upkG + 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 + AAAA/AAAAAAA+gAAAAAAAAD6APwAAAAAAQIAAAAAAAAAAAEgASgAAAAAAUIAAAAAAAAArACj + AIQAhQC9AJYA5wCGAI4AiwCdAKkApAEAAIoA2QCDAJMA8QDyAI0AlwCIAMMA3QDwAJ4AqgDz + APQA9QCiAK0AyQDHAK4AYgBjAJAAZADLAGUAyADKAM8AzADNAM4A6ABmANIA0ADRAK8AZwDv + AJEA1QDTANQAaADqAOwAiQBqAGkAawBtAGwAbgCgAG8AcQBwAHIAcwB1AHQAdgB3AOkAeAB6 + AHkAewB9AHwAuAChAH8AfgCAAIEA6wDtALoA/QD+AAAAAAAAAP8A+ADWAPkA+gDjAOQA1wDg + ANoA2wDcAN8A2ADeALIAswAAAAAAAAC2ALcAxAAAALQAtQDFAAAAggDCAIcAAAAAAAAAqwCY + AAAAAAAAAKgAmgAAAJkA7gAAAAAAvAAAAAAAAAEBAKUAAAAAAAAAkgCPAAAAAAAAAJQAlQTN + AGYAAAAAAosAAAKLAAADNQE1A64AxQa0AJ4FFwCqB5oAcQY9AIECMwDFAx8AsAMfAKQEAAA9 + BrQA2QKLAJ4C4wBkAosA2wKyAAAFFwCHBRcA4QUXAJYFFwCcBRcAZAUXAJ4FFwCPBRcAqAUX + AIsFFwCBArIA8AKyAJ4GtADZBrQA2Qa0ANkEPwCTCAAAhwV5ABAFfQDJBZYAcwYpAMkFDgDJ + BJoAyQYzAHMGBADJAlwAyQJc/5YFPwDJBHUAyQbnAMkF/ADJBkwAcwTTAMkGTABzBY8AyQUU + AIcE4//6BdsAsgV5ABAH6QBEBXsAPQTj//wFewBcAx8AsAKyAAADHwDHBrQA2QQA/+wEAACq + BOcAewUUALoEZgBxBRQAcQTsAHEC0QAvBRQAcQUSALoCOQDBAjn/2wSiALoCOQDBB8sAugUS + ALoE5QBxBRQAugUUAHEDSgC6BCsAbwMjADcFEgCuBLwAPQaLAFYEvAA7BLwAPQQzAFgFFwEA + ArIBBAUXAQAGtADZBXkAEAV5ABAFlgBzBQ4AyQX8AMkGTABzBdsAsgTnAHsE5wB7BOcAewTn + AHsE5wB7BOcAewRmAHEE7ABxBOwAcQTsAHEE7ABxAjkAkAI5/8cCOf/eAjn/9AUSALoE5QBx + BOUAcQTlAHEE5QBxBOUAcQUSAK4FEgCuBRIArgUSAK4EAAA5BAAAwwUXAKwFFwCBBAAAXAS4 + ATMFFwCeBQoAuggAARsIAAEbCAABJwQAAXMEAADXBrQA2QfLAAgGTABmBqoA3Qa0ANkGtADZ + BrQA2QUXAFIFFwCuBCMAaAVkABkGDgCcBLb/4QQrAC8DxQBzA8UAYAYdAE4H2wB7BOUASAQ/ + AI8DNQE1BrQA2QUZAD0FFwAfBrQA2QVa//oE5QCeBOUAwQgAAOwFFwAABXkAEAV5ABAGTABz + CI8AcwgvAHEEAAAACAAAAAQlAK4EJQCuAosArgKLALIGtADZA/QABgS8AD0E4//8AVb+iQUX + AF4DMwCeAzMAwQUKAC8FCgAvBAAAOQKLANsCiwCuBCUArgq8AHEFeQAQBQ4AyQV5ABAFDgDJ + BQ4AyQJcAKICXP/+AlwABgJcADsGTABzBkwAcwZMAHMF2wCyBdsAsgXbALICOQDBBAAAwQQA + ALYEAADVBAAAxwQAAZoEAADuBAABIwQAAPAEAAFMBAAAwQR///ICRgACBRQAhwQrAG8FewBc + BDMAWAKyAQQGMwAKBOUAcQTj//wEvAA9BNcAyQUUALoGtADZBrQBGQM1AIkDNQBeAzUAYgfB + AIkHwQCJB8EAYgYzAHMFFABxAlwAyQUUAIcEKwBvBZYAcwRmAHEFlgBzBGYAcQUUAHEC4wBk + AosA2wUXAAAEAADXBAABcwQAALYEAAEMBAAAzwQAAM8DNQA/BAAAxwQAAZoAAgAAAAAAAP8r + AI8AAAAAAAAAAAAAAAAAAAAAAAAAAAEMAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAO + AA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAAp + ACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBE + AEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBf + AGAAYQBiAGMAZABlAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAHIAcwB0AHUAdgB3AHgAeQB6 + AHsAfAB9AH4AfwCAAIEAggCDAIQAhQCGAIcAiACJAIoAiwCMAI0AjgCPAJAAkQCSAJMAlACV + AJYAlwCYAJkAmgCbAJwAnQCeAJ8AoAChAKIAowCkAKUApgCnAKgAqQCqAKsArACtAK4ArwCw + ALEAsgCzALQAtQC2ALcAuAC5ALoAuwC8AL0AvgC/AMAAwQDCAMMAxADFAMYAxwDIAMkAygDL + AMwAzQDOAM8A0ADRANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDn + AOgA6QDqAOsA7ADtAO4A7wDwAPEA8gDzAPUA9AD2APgA+QD6APsA/AD9AP4A/wEAAQEBAgED + AQQBBQEGAQcBCAEJAQoBCwEMAQ0Jc2Z0aHlwaGVuDnBlcmlvZGNlbnRlcmVkBEV1cm8FYzY0 + NTkFYzY0NjAFYzY0NjEFYzY0NjIFYzY0NjMFYzY0NjYFYzY0NjcFYzY0NjgFYzY0NjkAAAAA + ACIAIgAiACIAWACTAP8BtgJPA4MDsgP2BCEEbgSYBLQEygTeBQMFRQWCBgUGfgbhB0wHtwf8 + CGUIzwjuCRYJUglzCa4KHwrfC1gLsAv7DDoMaQyTDOYNFA09DXoODQ4vDqwPAA9FD4UP6xB1 + EPERKRFwEeASvROKE+sUUBSLFLEU4RUDFRgVQBXWFiIWbRa5FyMXexffGBsYQxiAGPgZFhl3 + GbMaBBpSGqEa2BuHG8QcABydHboehx93H+ggWyByIPMhNSFCIeIh7yH8IgkiFiIjIjAiPSJK + IlciZCJxIn4iiyKYIqUisiK/Iswi2SLmIvMjACMNIxojJyM0I0EjTiNbI2gjlCPPJDQkjyUz + JVMlgSYUJronSyeQJ7coEyhYKMMpXyolKlwqoyrpK3or0yxELI8ssS1QLaAuDi5SLqovhzBB + ML0xBTEhMVAxzzJIMnoy3zNGM3AzcDN9M4ozlzPmNHo0jzSjNNE0/zUcNTk1ZzWRNZ41qzXP + Nls2kzbNN0M3qTfrOAA4HDhKOQ85HDkpOTY5QzlQOV05ajl3OYQ5kTmeOas5uDnFOdI57zoc + Ons6oDrlOwg7XjuOO8Q79DwiPF88pzy0PME8zjzbPP49Yz47Pkg+VT6YPuc+/T9hP40/3EA6 + QEtAXEBtQHpAh0CUQKFArkC7QMhA1UDiQUBBVkFrQkVCqkL3Q19DskP/RFVE20UqRT8AAAAA + AAEAAC2GAAEHlBgAAAoVeAAQACT/0wAQACX/twAQACYAAAAQACcAAAAQACkAAAAQACoASwAQ + ACsAAAAQAC0AcgAQAC4AAAAQAC8AAAAQADIAOQAQADMAAAAQADQASwAQADUAAAAQADf/RAAQ + ADn/iAAQADr/rQAQADv/mgAQADz/DQAQAD0AAAAQAEkAAAAQAFEAAAAQAFIAJgAQAFUAAAAQ + AFn/yQAQAFoAAAAQAFz/3AAQAGL/0wAQAGQAAAAQAGcAOQAQAHgAAAAQAHkAJgAQAHoAJgAQ + AHsAJgAQAHwAJgAQAH0AJgAQAIkAAAAQAJAAAAAQAK3/0wAQAK7/0wAQAK8AOQAQALr/3AAQ + ALv/DQAQAMf/0wAQAMn/0wAQANAAOQAQANEAOQAQANIAOQAQAOUAAAAQAOkAAAAQAOr/DQAQ + AOv/3AAQAOwAAAAQAPYASwAQAPsAAAAQAP0AAAAkABD/0wAkABH/3AAkAB3/3AAkACQAOQAk + ACb/3AAkACr/3AAkADL/3AAkADT/3AAkADYAAAAkADf/YQAkADgAAAAkADn/fQAkADr/kAAk + ADsAAAAkADz/YQAkAEb/3AAkAEf/3AAkAEj/3AAkAEn/twAkAFL/3AAkAFT/3AAkAFf/3AAk + AFgAAAAkAFn/iAAkAFr/rQAkAFz/dQAkAGIAOQAkAGT/3AAkAGf/3AAkAGgAAAAkAG//3AAk + AHD/3AAkAHH/3AAkAHL/3AAkAHP/3AAkAHn/3AAkAHr/3AAkAHv/3AAkAHz/3AAkAH3/3AAk + AH4AAAAkAH8AAAAkAIAAAAAkAIEAAAAkAKn/twAkAKoAAAAkAK0AOQAkAK4AOQAkAK//3AAk + ALT++AAkALX/AwAkALr/dQAkALv/YQAkAMUALwAkAMcAOQAkAMkAOQAkAND/3AAkANH/3AAk + ANL/3AAkANMAAAAkANQAAAAkANUAAAAkAOMAAAAkAOr/YQAkAOv/dQAkAPb/3AAkAPkAAAAk + APv/3AAkAPz/3AAkAP3/3AAkAP7/3AAlABAAAAAlACb/3AAlACr/3AAlADL/3AAlADb/3AAl + ADn/wQAlADr/twAlADz/kAAlAGT/3AAlAGf/3AAlAKn/wQAlAKr/3AAlAK//3AAlALT/kAAl + ALX/kAAlALv/kAAlAMX/rQAlAND/3AAlANH/3AAlANL/3AAlAOP/3AAlAOr/kAAlAPb/3AAl + APn/3AAlAPv/3AAlAP3/3AAmABAAAAAmACQAAAAmADYAAAAmADz/3AAmAGIAAAAmAKn/3AAm + AKr/3AAmAK0AAAAmAK4AAAAmALQAAAAmALUAJgAmALv/3AAmAMUAAAAmAMcAAAAmAMkAAAAm + AOMAAAAmAOr/3AAmAPkAAAAnABAAAAAnACT/3AAnADn/3AAnADoAAAAnADz/kAAnAGL/3AAn + AKn/3AAnAKr/3AAnAK3/3AAnAK7/3AAnALT/0wAnALX/yQAnALv/kAAnAMX/RAAnAMf/3AAn + AMn/3AAnAOr/kAApABAAAAApABH+twApAB3/YQApACT/RAApADb/3AApADf/3AApAET/RAAp + AEj/kAApAEz/awApAFL/twApAFX/awApAFj/kAApAFz/RAApAGL/RAApAGn/RAApAGr/RAAp + AGv/RAApAGz/RAApAG3/RAApAG7/RAApAHD/kAApAHH/kAApAHL/kAApAHP/kAApAHn/twAp + AHr/twApAHv/twApAHz/twApAH3/twApAH7/kAApAH//kAApAID/kAApAIH/kAApAKkAAAAp + AKoAAAApAK3/RAApAK7/RAApALT/0wApALUAAAApALr/RAApAMX+iAApAMf/RAApAMn/RAAp + AOP/3AApAOv/RAApAPn/3AAqABAAAAAqACQAAAAqADf/twAqADoAAAAqADz/mgAqAGIAAAAq + AKn/3AAqAKr/3AAqAK0AAAAqAK4AAAAqALT/0wAqALX/0wAqALv/mgAqAMX/yQAqAMcAAAAq + AMkAAAAqAOr/mgArABAAAAArABH/3AArAB0AAAArAKkAAAArAKoAAAArALT/twArALX/wQAr + AMX/twAtABD/twAtACT/3AAtAGL/3AAtAKn/3AAtAKr/3AAtAK3/3AAtAK7/3AAtALT/twAt + ALX/wQAtAMX/kAAtAMf/3AAtAMn/3AAuABD/KQAuACT/3AAuACb/kAAuADL/kAAuADf/YQAu + ADj/yQAuADr/twAuADz/twAuAET/3AAuAEj/mgAuAFL/mgAuAFj/mgAuAFz/awAuAGL/3AAu + AGT/kAAuAGf/kAAuAGj/yQAuAGn/3AAuAGr/3AAuAGv/3AAuAGz/3AAuAG3/3AAuAG7/3AAu + AHD/mgAuAHH/mgAuAHL/mgAuAHP/mgAuAHn/mgAuAHr/mgAuAHv/mgAuAHz/mgAuAH3/mgAu + AH7/mgAuAH//mgAuAID/mgAuAIH/mgAuAKn/fQAuAKoAAAAuAK3/3AAuAK7/3AAuAK//kAAu + ALT/wQAuALX/wQAuALr/awAuALv/twAuAMUAAAAuAMf/3AAuAMn/3AAuAND/kAAuANH/kAAu + ANL/kAAuANP/yQAuANT/yQAuANX/yQAuAOr/twAuAOv/awAuAPv/kAAuAP3/kAAvABD/3AAv + ACQALwAvADL/twAvADf+5gAvADj/mgAvADn/HwAvADr/RAAvADz+8AAvAEQAAAAvAEj/3AAv + AFL/3AAvAFj/3AAvAFz/RAAvAGIALwAvAGf/twAvAGj/mgAvAGkAAAAvAGoAAAAvAGsAAAAv + AGwAAAAvAG0AAAAvAG4AAAAvAHD/3AAvAHH/3AAvAHL/3AAvAHP/3AAvAHn/3AAvAHr/3AAv + AHv/3AAvAHz/3AAvAH3/3AAvAH7/3AAvAH//3AAvAID/3AAvAIH/3AAvAKkAAAAvAKoAAAAv + AK0ALwAvAK4ALwAvAK//twAvALT+YQAvALX95gAvALr/RAAvALv+8AAvAMUAAAAvAMcALwAv + AMkALwAvAND/twAvANH/twAvANL/twAvANP/mgAvANT/mgAvANX/mgAvAOr+8AAvAOv/RAAy + ABAAOQAyABH/rQAyAB3/3AAyACT/3AAyADn/3AAyADv/fQAyADz/kAAyAGL/3AAyAKn/3AAy + AKoAAAAyAK3/3AAyAK7/3AAyALT/0wAyALX/3AAyALv/kAAyAMX/RAAyAMf/3AAyAMn/3AAy + AOr/kAAzABD/0wAzABH+wQAzAB0AAAAzACT/fQAzADgAAAAzADoAAAAzADz/0wAzAET/pAAz + AEj/twAzAEz/0wAzAFH/3AAzAFL/twAzAFX/3AAzAFb/3AAzAFj/3AAzAFwAAAAzAGL/fQAz + AGgAAAAzAGn/pAAzAGr/pAAzAGv/pAAzAGz/pAAzAG3/pAAzAG7/pAAzAHD/twAzAHH/twAz + AHL/twAzAHP/twAzAHj/3AAzAHn/twAzAHr/twAzAHv/twAzAHz/twAzAH3/twAzAH7/3AAz + AH//3AAzAID/3AAzAIH/3AAzAKn/3AAzAKoAAAAzAK3/fQAzAK7/fQAzALQAJgAzALUAJgAz + ALoAAAAzALv/0wAzAMX+twAzAMf/fQAzAMn/fQAzANMAAAAzANQAAAAzANUAAAAzAOT/3AAz + AOr/0wAzAOsAAAAzAPr/3AA0ABAAOQA0AKkAAAA0AKoAAAA0ALT/0wA0ALX/3AA0AMX/fQA1 + ABD/rQA1ABH/twA1AB3/wQA1ACT/rQA1ACb/mgA1ADf/awA1ADn/kAA1ADr/rQA1ADz/fQA1 + AET/0wA1AEj/pAA1AFL/pAA1AFj/pAA1AFz/kAA1AGL/rQA1AGT/mgA1AGn/0wA1AGr/0wA1 + AGv/0wA1AGz/0wA1AG3/0wA1AG7/0wA1AHD/pAA1AHH/pAA1AHL/pAA1AHP/pAA1AHn/pAA1 + AHr/pAA1AHv/pAA1AHz/pAA1AH3/pAA1AH7/pAA1AH//pAA1AID/pAA1AIH/pAA1AKn/kAA1 + AKr/3AA1AK3/rQA1AK7/rQA1ALT/awA1ALX/fQA1ALr/kAA1ALv/fQA1AMX/3AA1AMf/rQA1 + AMn/rQA1AOr/fQA1AOv/kAA1APv/mgA1AP3/mgA2ACQAJgA2ACYAAAA2ACoAAAA2ADIAAAA2 + ADQAAAA2ADYAAAA2AGIAJgA2AGQAAAA2AGcAAAA2AK0AJgA2AK4AJgA2AK8AAAA2AMcAJgA2 + AMkAJgA2ANAAAAA2ANEAAAA2ANIAAAA2AOMAAAA2APYAAAA2APkAAAA2APsAAAA2AP0AAAA3 + ABD/RAA3ABH/DQA3AB3/HwA3ACT/YQA3ACb/iAA3ADf/3AA3AET+rQA3AEb+pAA3AEj+pAA3 + AEz/wQA3AFL+pAA3AFX+0wA3AFb+rQA3AFj+yQA3AFr+rQA3AFz+wQA3AGL/YQA3AGT/iAA3 + AGn+rQA3AGr+rQA3AGv+rQA3AGz+rQA3AG3+rQA3AG7+rQA3AG/+pAA3AHD+pAA3AHH+pAA3 + AHL+pAA3AHP+pAA3AHn+pAA3AHr+pAA3AHv+pAA3AHz+pAA3AH3+pAA3AH7+yQA3AH/+yQA3 + AID+yQA3AIH+yQA3AKn/RAA3AKr/kAA3AK3/YQA3AK7/YQA3ALQAAAA3ALX/0wA3ALr+wQA3 + AMX++AA3AMf/YQA3AMn/YQA3AOT+rQA3AOv+wQA3APr+rQA3APv/iAA3APz+pAA3AP3/iAA3 + AP7+pAA4ACQAAAA4AC0AAAA4AD3/3AA4AGIAAAA4AK0AAAA4AK4AAAA4AMcAAAA4AMkAAAA4 + AOX/3AA5ABD/iAA5ABH++AA5AB3/WQA5ACT/fQA5ADL/3AA5AET/YQA5AEj/YQA5AEz/0wA5 + AFL/YQA5AFj/dQA5AFz/yQA5AGL/fQA5AGf/3AA5AGn/YQA5AGr/YQA5AGv/YQA5AGz/YQA5 + AG3/YQA5AG7/YQA5AHD/YQA5AHH/YQA5AHL/YQA5AHP/YQA5AHn/YQA5AHr/YQA5AHv/YQA5 + AHz/YQA5AH3/YQA5AH7/dQA5AH//dQA5AID/dQA5AIH/dQA5AKn/TgA5AKr/kAA5AK3/fQA5 + AK7/fQA5AK//3AA5ALQAAAA5ALUAAAA5ALr/yQA5AMX+5gA5AMf/fQA5AMn/fQA5AND/3AA5 + ANH/3AA5ANL/3AA5AOv/yQA6ABD/rQA6ABH/FQA6AB3/iAA6ACT/kAA6AET/fQA6AEj/iAA6 + AEz/0wA6AFL/iAA6AFX/pAA6AFj/twA6AFz/3AA6AGL/kAA6AGn/fQA6AGr/fQA6AGv/fQA6 + AGz/fQA6AG3/fQA6AG7/fQA6AHD/iAA6AHH/iAA6AHL/iAA6AHP/iAA6AHn/iAA6AHr/iAA6 + AHv/iAA6AHz/iAA6AH3/iAA6AH7/twA6AH//twA6AID/twA6AIH/twA6AKn/kAA6AKr/3AA6 + AK3/kAA6AK7/kAA6ALT/3AA6ALUAAAA6ALr/3AA6AMX++AA6AMf/kAA6AMn/kAA6AOv/3AA7 + ABD/mgA7ACQAAAA7ACb/awA7ADL/fQA7ADf/3AA7AEj/pAA7AGIAAAA7AGT/awA7AGf/fQA7 + AHD/pAA7AHH/pAA7AHL/pAA7AHP/pAA7AKn/kAA7AKoAAAA7AK0AAAA7AK4AAAA7AK//fQA7 + ALT/YQA7ALX/rQA7AMX/0wA7AMcAAAA7AMkAAAA7AND/fQA7ANH/fQA7ANL/fQA7APv/awA7 + AP3/awA8ABD/DQA8ABH+YQA8AB3+8AA8ACT/YQA8ACb/kAA8ADL/kAA8AET+5gA8AEj+8AA8 + AEz/twA8AFL+8AA8AFj/FQA8AGL/YQA8AGT/kAA8AGf/kAA8AGn+5gA8AGr+5gA8AGv+5gA8 + AGz+5gA8AG3+5gA8AG7+5gA8AHD+8AA8AHH+8AA8AHL+8AA8AHP+8AA8AHn+8AA8AHr+8AA8 + AHv+8AA8AHz+8AA8AH3+8AA8AH7/FQA8AH//FQA8AID/FQA8AIH/FQA8AKn/HwA8AKr/awA8 + AK3/YQA8AK7/YQA8AK//kAA8ALT/kAA8ALX/3AA8AMX++AA8AMf/YQA8AMn/YQA8AND/kAA8 + ANH/kAA8ANL/kAA8APv/kAA8AP3/kAA9ABD/3AA9AKkAAAA9AKoAAAA9ALT/3AA9ALX/3AA9 + AMX/3ABIAFv/3ABJABD/kABJABH/awBJAB3/twBJAFf/3ABJAFr/3ABJAFz/3ABJAKn/twBJ + AKr/3ABJALQAQQBJALUAAABJALr/3ABJAMX/FQBJAOv/3ABOAET/3ABOAEj/twBOAFL/twBO + AFj/wQBOAFz/twBOAGn/3ABOAGr/3ABOAGv/3ABOAGz/3ABOAG3/3ABOAG7/3ABOAHD/twBO + AHH/twBOAHL/twBOAHP/twBOAHn/twBOAHr/twBOAHv/twBOAHz/twBOAH3/twBOAH7/wQBO + AH//wQBOAID/wQBOAIH/wQBOALr/twBOAOv/twBRABAAAABRABEAAABRAB0AAABRAKkAAABR + AKoAAABRALT/awBRALX/kABRAMX/pABSABAAJgBSABH/3ABSAB0AAABSAFv/wQBSAKkAAABS + AKoAAABSALT/awBSALX/twBSAMX/fQBVABD/fQBVABH/RABVAB3/3ABVAEb/0wBVAEf/3ABV + AEj/0wBVAEkAAABVAEr/3ABVAEv/3ABVAFD/3ABVAFH/3ABVAFL/0wBVAFT/3ABVAFX/3ABV + AFgAAABVAFkAAABVAFoAAABVAFv/yQBVAFwAAABVAF0AAABVAG//0wBVAHD/0wBVAHH/0wBV + AHL/0wBVAHP/0wBVAHj/3ABVAHn/0wBVAHr/0wBVAHv/0wBVAHz/0wBVAH3/0wBVAH4AAABV + AH8AAABVAIAAAABVAIEAAABVAKn/twBVAKoAAABVALQAAABVALUAVgBVALoAAABVAMX+yQBV + AOYAAABVAOsAAABVAPf/3ABVAPz/0wBVAP7/0wBZABD/yQBZABH/YQBZAB3/kABZAKn/3ABZ + AKr/3ABZALQAAABZALX/3ABZAMX+8ABaABAAAABaABH/RABaAB3/kABaAKn/3ABaAKr/3ABa + ALQAAABaALUAAABaAMX/KQBbAEb/3ABbAEj/wQBbAFL/wQBbAG//3ABbAHD/wQBbAHH/wQBb + AHL/wQBbAHP/wQBbAHn/wQBbAHr/wQBbAHv/wQBbAHz/wQBbAH3/wQBbAPz/3ABbAP7/3ABc + ABD/3ABcABH+3ABcAB3/awBcAKn/3ABcAKr/3ABcALQAAABcALUAAABcAMX+0wBiABD/0wBi + ABH/3ABiAB3/3ABiACQAOQBiACb/3ABiACr/3ABiADL/3ABiADT/3ABiADYAAABiADf/YQBi + ADgAAABiADn/fQBiADr/kABiADsAAABiADz/YQBiAEb/3ABiAEf/3ABiAEj/3ABiAEn/twBi + AFL/3ABiAFT/3ABiAFf/3ABiAFgAAABiAFn/iABiAFr/rQBiAFz/dQBiAGIAOQBiAGT/3ABi + AGf/3ABiAGgAAABiAG//3ABiAHD/3ABiAHH/3ABiAHL/3ABiAHP/3ABiAHn/3ABiAHr/3ABi + AHv/3ABiAHz/3ABiAH3/3ABiAH4AAABiAH8AAABiAIAAAABiAIEAAABiAKn/twBiAKoAAABi + AK0AOQBiAK4AOQBiAK//3ABiALT++ABiALX/AwBiALr/dQBiALv/YQBiAMUALwBiAMcAOQBi + AMkAOQBiAND/3ABiANH/3ABiANL/3ABiANMAAABiANQAAABiANUAAABiAOMAAABiAOr/YQBi + AOv/dQBiAPb/3ABiAPkAAABiAPv/3ABiAPz/3ABiAP3/3ABiAP7/3ABkABAAAABkACQAAABk + ADYAAABkADz/3ABkAGIAAABkAKn/3ABkAKr/3ABkAK0AAABkAK4AAABkALQAAABkALUAJgBk + ALv/3ABkAMUAAABkAMcAAABkAMkAAABkAOMAAABkAOr/3ABkAPkAAABnABAAOQBnABH/rQBn + AB3/3ABnACT/3ABnADn/3ABnADv/fQBnADz/kABnAGL/3ABnAKn/3ABnAKoAAABnAK3/3ABn + AK7/3ABnALT/0wBnALX/3ABnALv/kABnAMX/RABnAMf/3ABnAMn/3ABnAOr/kABoACQAAABo + AC0AAABoAD3/3ABoAGIAAABoAK0AAABoAK4AAABoAMcAAABoAMkAAABoAOX/3ABwAFv/3ABx + AFv/3AByAFv/3ABzAFv/3AB4ABAAAAB4ABEAAAB4AB0AAAB4AKkAAAB4AKoAAAB4ALT/awB4 + ALX/kAB4AMX/pAB5ABAAJgB5ABH/3AB5AB0AAAB5AFv/wQB5AKkAAAB5AKoAAAB5ALT/awB5 + ALX/twB5AMX/fQB6ABAAJgB6ABH/3AB6AB0AAAB6AFv/wQB6AKkAAAB6AKoAAAB6ALT/awB6 + ALX/twB6AMX/fQB7ABAAJgB7ABH/3AB7AB0AAAB7AFv/wQB7AKkAAAB7AKoAAAB7ALT/awB7 + ALX/twB7AMX/fQB8ABAAJgB8ABH/3AB8AB0AAAB8AFv/wQB8AKkAAAB8AKoAAAB8ALT/awB8 + ALX/twB8AMX/fQB9ABAAJgB9ABH/3AB9AB0AAAB9AFv/wQB9AKkAAAB9AKoAAAB9ALT/awB9 + ALX/twB9AMX/fQCJABAAJgCJAKkAAACJAKoAAACJALT/kACJALX/kACJAMX/rQCQABAAAACQ + AKkAAACQAKoAAACQALT/rQCQALX/pACQAMX/kACpACQAAACpACX/3ACpACb/3ACpACf/3ACp + ACkAAACpACr/3ACpACsAAACpAC3/3ACpAC4AAACpAC8AAACpADIAAACpADMAAACpADQAAACp + ADUAAACpADf/kACpADn/kACpADr/3ACpADsAAACpADz/awCpAD0AAACpAEkAAACpAFEAAACp + AFIAAACpAFUAAACpAFn/3ACpAFr/3ACpAFz/3ACpAGIAAACpAGT/3ACpAGcAAACpAHgAAACp + AHkAAACpAHoAAACpAHsAAACpAHwAAACpAH0AAACpAIkAAACpAJAAlwCpAK0AAACpAK4AAACp + AK8AAACpALr/3ACpALv/awCpAMcAAACpAMkAAACpANAAAACpANEAAACpANIAAACpAOUAAACp + AOkAAACpAOr/awCpAOv/3ACpAOwAAACpAPb/3ACpAPv/3ACpAP3/3ACqACT/twCqACX/twCq + ACb/3ACqACf/3ACqACkAAACqACoAAACqACsAAACqAC3/3ACqAC4AAACqAC8AAACqADL/3ACq + ADMAAACqADQAAACqADUAAACqADf/RACqADn/TgCqADr/kACqADv/kACqADz/HwCqAD0AAACq + AEkAAACqAFEAAACqAFIAAACqAFUAAACqAFn/3ACqAFr/3ACqAFz/3ACqAGL/twCqAGT/3ACq + AGf/3ACqAHgAAACqAHkAAACqAHoAAACqAHsAAACqAHwAAACqAH0AAACqAIkAAACqAJAAAACq + AK3/twCqAK7/twCqAK//3ACqALr/3ACqALv/HwCqAMf/twCqAMn/twCqAND/3ACqANH/3ACq + ANL/3ACqAOUAAACqAOkAAACqAOr/HwCqAOv/3ACqAOwAAACqAPYAAACqAPv/3ACqAP3/3ACt + ABD/0wCtABH/3ACtAB3/3ACtACQAOQCtACb/3ACtACr/3ACtADL/3ACtADT/3ACtADYAAACt + ADf/YQCtADgAAACtADn/fQCtADr/kACtADsAAACtADz/YQCtAEb/3ACtAEf/3ACtAEj/3ACt + AEn/twCtAFL/3ACtAFT/3ACtAFf/3ACtAFgAAACtAFn/iACtAFr/rQCtAFz/dQCtAGIAOQCt + AGT/3ACtAGf/3ACtAGgAAACtAG//3ACtAHD/3ACtAHH/3ACtAHL/3ACtAHP/3ACtAHn/3ACt + AHr/3ACtAHv/3ACtAHz/3ACtAH3/3ACtAH4AAACtAH8AAACtAIAAAACtAIEAAACtAKn/twCt + AKoAAACtAK0AOQCtAK4AOQCtAK//3ACtALT++ACtALX/AwCtALr/dQCtALv/YQCtAMUALwCt + AMcAOQCtAMkAOQCtAND/3ACtANH/3ACtANL/3ACtANMAAACtANQAAACtANUAAACtAOMAAACt + AOr/YQCtAOv/dQCtAPb/3ACtAPkAAACtAPv/3ACtAPz/3ACtAP3/3ACtAP7/3ACuABD/0wCu + ABH/3ACuAB3/3ACuACQAOQCuACb/3ACuACr/3ACuADL/3ACuADT/3ACuADYAAACuADf/YQCu + ADgAAACuADn/fQCuADr/kACuADsAAACuADz/YQCuAEb/3ACuAEf/3ACuAEj/3ACuAEn/twCu + AFL/3ACuAFT/3ACuAFf/3ACuAFgAAACuAFn/iACuAFr/rQCuAFz/dQCuAGIAOQCuAGT/3ACu + AGf/3ACuAGgAAACuAG//3ACuAHD/3ACuAHH/3ACuAHL/3ACuAHP/3ACuAHn/3ACuAHr/3ACu + AHv/3ACuAHz/3ACuAH3/3ACuAH4AAACuAH8AAACuAIAAAACuAIEAAACuAKn/twCuAKoAAACu + AK0AOQCuAK4AOQCuAK//3ACuALT++ACuALX/AwCuALr/dQCuALv/YQCuAMUALwCuAMcAOQCu + AMkAOQCuAND/3ACuANH/3ACuANL/3ACuANMAAACuANQAAACuANUAAACuAOMAAACuAOr/YQCu + AOv/dQCuAPb/3ACuAPkAAACuAPv/3ACuAPz/3ACuAP3/3ACuAP7/3ACvABAAOQCvABH/rQCv + AB3/3ACvACT/3ACvADn/3ACvADv/fQCvADz/kACvAGL/3ACvAKn/3ACvAKoAAACvAK3/3ACv + AK7/3ACvALT/0wCvALX/3ACvALv/kACvAMX/RACvAMf/3ACvAMn/3ACvAOr/kAC0ACT++AC0 + ACX/wQC0ACb/twC0ACf/wQC0ACn/wQC0ACr/twC0ACv/wQC0AC3/wQC0AC7/wQC0AC//wQC0 + ADL/twC0ADP/wQC0ADT/twC0ADX/wQC0ADcAAAC0ADkAAAC0ADoAAAC0ADv/iAC0ADwAAAC0 + AD3/3AC0AEn/twC0AFH/kAC0AFL/awC0AFX/kAC0AFn/twC0AFr/twC0AFz/twC0AGL++AC0 + AGT/twC0AGf/twC0AHj/kAC0AHn/awC0AHr/awC0AHv/awC0AHz/awC0AH3/awC0AIn/wQC0 + AJD+fQC0AK3++AC0AK7++AC0AK//twC0ALr/twC0ALsAAAC0AMf++AC0AMn++AC0AND/twC0 + ANH/twC0ANL/twC0AOX/3AC0AOn/twC0AOoAAAC0AOv/twC0AOz/wQC0APb/twC0APv/twC0 + AP3/twC6ABD/3AC6ABH+3AC6AB3/awC6AKn/3AC6AKr/3AC6ALQAAAC6ALUAAAC6AMX+0wC7 + ABD/DQC7ABH+YQC7AB3+8AC7ACT/YQC7ACb/kAC7ADL/kAC7AET+5gC7AEj+8AC7AEz/twC7 + AFL+8AC7AFj/FQC7AGL/YQC7AGT/kAC7AGf/kAC7AGn+5gC7AGr+5gC7AGv+5gC7AGz+5gC7 + AG3+5gC7AG7+5gC7AHD+8AC7AHH+8AC7AHL+8AC7AHP+8AC7AHn+8AC7AHr+8AC7AHv+8AC7 + AHz+8AC7AH3+8AC7AH7/FQC7AH//FQC7AID/FQC7AIH/FQC7AKn/HwC7AKr/awC7AK3/YQC7 + AK7/YQC7AK//kAC7ALT/kAC7ALX/3AC7AMX++AC7AMf/YQC7AMn/YQC7AND/kAC7ANH/kAC7 + ANL/kAC7APv/kAC7AP3/kADFACQAJgDFACX/twDFACb/kADFACf/twDFACn/twDFACr/twDF + ACv/twDFAC0ALwDFAC7/twDFAC//twDFADL/kADFADP/twDFADT/kADFADX/twDFADf+5gDF + ADn+iADFADr/AwDFADv/twDFADz+iADFAD0AAADFAEn/3ADFAFH/twDFAFL/twDFAFX/twDF + AFn/FQDFAFr/PADFAFz/kADFAGIAJgDFAGT/kADFAGf/kADFAHj/twDFAHn/twDFAHr/twDF + AHv/twDFAHz/twDFAH3/twDFAIn/twDFAJAAJgDFAK0AJgDFAK4AJgDFAK//kADFALr/kADF + ALv+iADFAMcAJgDFAMkAJgDFAND/kADFANH/kADFANL/kADFAOUAAADFAOn/twDFAOr+iADF + AOv/kADFAOz/twDFAPb/twDFAPv/kADFAP3/kADHABD/0wDHABH/3ADHAB3/3ADHACQAOQDH + ACb/3ADHACr/3ADHADL/3ADHADT/3ADHADYAAADHADf/YQDHADgAAADHADn/fQDHADr/kADH + ADsAAADHADz/YQDHAEb/3ADHAEf/3ADHAEj/3ADHAEn/twDHAFL/3ADHAFT/3ADHAFf/3ADH + AFgAAADHAFn/iADHAFr/rQDHAFz/dQDHAGIAOQDHAGT/3ADHAGf/3ADHAGgAAADHAG//3ADH + AHD/3ADHAHH/3ADHAHL/3ADHAHP/3ADHAHn/3ADHAHr/3ADHAHv/3ADHAHz/3ADHAH3/3ADH + AH4AAADHAH8AAADHAIAAAADHAIEAAADHAKn/twDHAKoAAADHAK0AOQDHAK4AOQDHAK//3ADH + ALT++ADHALX/AwDHALr/dQDHALv/YQDHAMUALwDHAMcAOQDHAMkAOQDHAND/3ADHANH/3ADH + ANL/3ADHANMAAADHANQAAADHANUAAADHAOMAAADHAOr/YQDHAOv/dQDHAPb/3ADHAPkAAADH + APv/3ADHAPz/3ADHAP3/3ADHAP7/3ADJABD/0wDJABH/3ADJAB3/3ADJACQAOQDJACb/3ADJ + ACr/3ADJADL/3ADJADT/3ADJADYAAADJADf/YQDJADgAAADJADn/fQDJADr/kADJADsAAADJ + ADz/YQDJAEb/3ADJAEf/3ADJAEj/3ADJAEn/twDJAFL/3ADJAFT/3ADJAFf/3ADJAFgAAADJ + AFn/iADJAFr/rQDJAFz/dQDJAGIAOQDJAGT/3ADJAGf/3ADJAGgAAADJAG//3ADJAHD/3ADJ + AHH/3ADJAHL/3ADJAHP/3ADJAHn/3ADJAHr/3ADJAHv/3ADJAHz/3ADJAH3/3ADJAH4AAADJ + AH8AAADJAIAAAADJAIEAAADJAKn/twDJAKoAAADJAK0AOQDJAK4AOQDJAK//3ADJALT++ADJ + ALX/AwDJALr/dQDJALv/YQDJAMUALwDJAMcAOQDJAMkAOQDJAND/3ADJANH/3ADJANL/3ADJ + ANMAAADJANQAAADJANUAAADJAOMAAADJAOr/YQDJAOv/dQDJAPb/3ADJAPkAAADJAPv/3ADJ + APz/3ADJAP3/3ADJAP7/3ADQABAAOQDQABH/rQDQAB3/3ADQACT/3ADQADn/3ADQADv/fQDQ + ADz/kADQAGL/3ADQAKn/3ADQAKoAAADQAK3/3ADQAK7/3ADQALT/0wDQALX/3ADQALv/kADQ + AMX/RADQAMf/3ADQAMn/3ADQAOr/kADRABAAOQDRABH/rQDRAB3/3ADRACT/3ADRADn/3ADR + ADv/fQDRADz/kADRAGL/3ADRAKn/3ADRAKoAAADRAK3/3ADRAK7/3ADRALT/0wDRALX/3ADR + ALv/kADRAMX/RADRAMf/3ADRAMn/3ADRAOr/kADSABAAOQDSABH/rQDSAB3/3ADSACT/3ADS + ADn/3ADSADv/fQDSADz/kADSAGL/3ADSAKn/3ADSAKoAAADSAK3/3ADSAK7/3ADSALT/0wDS + ALX/3ADSALv/kADSAMX/RADSAMf/3ADSAMn/3ADSAOr/kADTACQAAADTAC0AAADTAD3/3ADT + AGIAAADTAK0AAADTAK4AAADTAMcAAADTAMkAAADTAOX/3ADUACQAAADUAC0AAADUAD3/3ADU + AGIAAADUAK0AAADUAK4AAADUAMcAAADUAMkAAADUAOX/3ADVACQAAADVAC0AAADVAD3/3ADV + AGIAAADVAK0AAADVAK4AAADVAMcAAADVAMkAAADVAOX/3ADjACQAJgDjACYAAADjACoAAADj + ADIAAADjADQAAADjADYAAADjAGIAJgDjAGQAAADjAGcAAADjAK0AJgDjAK4AJgDjAK8AAADj + AMcAJgDjAMkAJgDjANAAAADjANEAAADjANIAAADjAOMAAADjAPYAAADjAPkAAADjAPsAAADj + AP0AAADlABD/3ADlAKkAAADlAKoAAADlALT/3ADlALX/3ADlAMX/3ADpABAAAADpAKkAAADp + AKoAAADpALT/pADpALX/kADpAMX/twDqABD/DQDqABH+YQDqAB3+8ADqACT/YQDqACb/kADq + ADL/kADqAET+5gDqAEj+8ADqAEz/twDqAFL+8ADqAFj/FQDqAGL/YQDqAGT/kADqAGf/kADq + AGn+5gDqAGr+5gDqAGv+5gDqAGz+5gDqAG3+5gDqAG7+5gDqAHD+8ADqAHH+8ADqAHL+8ADq + AHP+8ADqAHn+8ADqAHr+8ADqAHv+8ADqAHz+8ADqAH3+8ADqAH7/FQDqAH//FQDqAID/FQDq + AIH/FQDqAKn/HwDqAKr/awDqAK3/YQDqAK7/YQDqAK//kADqALT/kADqALX/3ADqAMX++ADq + AMf/YQDqAMn/YQDqAND/kADqANH/kADqANL/kADqAPv/kADqAP3/kADrABD/3ADrABH+3ADr + AB3/awDrAKn/3ADrAKr/3ADrALQAAADrALUAAADrAMX+0wDsABAAAADsABH/awDsAB3/twDs + AKkAAADsAKoAAADsALT/3ADsALUAAADsAMX/RAD2ABAAAAD2ACQAAAD2ADf/twD2ADoAAAD2 + ADz/mgD2AGIAAAD2AKn/3AD2AKr/3AD2AK0AAAD2AK4AAAD2ALT/0wD2ALX/0wD2ALv/mgD2 + AMX/yQD2AMcAAAD2AMkAAAD2AOr/mgD5ACQAJgD5ACYAAAD5ACoAAAD5ADIAAAD5ADQAAAD5 + ADYAAAD5AGIAJgD5AGQAAAD5AGcAAAD5AK0AJgD5AK4AJgD5AK8AAAD5AMcAJgD5AMkAJgD5 + ANAAAAD5ANEAAAD5ANIAAAD5AOMAAAD5APYAAAD5APkAAAD5APsAAAD5AP0AAAD7ABAAAAD7 + ACQAAAD7ADYAAAD7ADz/3AD7AGIAAAD7AKn/3AD7AKr/3AD7AK0AAAD7AK4AAAD7ALQAAAD7 + ALUAJgD7ALv/3AD7AMUAAAD7AMcAAAD7AMkAAAD7AOMAAAD7AOr/3AD7APkAAAD9ABAAAAD9 + ACQAAAD9ADYAAAD9ADz/3AD9AGIAAAD9AKn/3AD9AKr/3AD9AK0AAAD9AK4AAAD9ALQAAAD9 + ALUAJgD9ALv/3AD9AMUAAAD9AMcAAAD9AMkAAAD9AOMAAAD9AOr/3AD9APkAAAAAAAEAAAEM + AE0ABwBCAAQAAgAQAEAABwAABBUFaAADAAEAAQAAB23+HQAACrz+if6JCkwAAQAAAAAAAAAA + AAAAAAAAAQwAAQQOAZAABQAEBUcEzAAA/kIFRwTMAAACUwCPAmYIAgILBgMDCAQCAgSAAACv + EAAgSgAAAAAAAAAAQml0cwBAACD7AgYU/hQBmgdtAeMAAAABAAAAAAAAAAEAAEIAHbECiwRg + AAAjYwXVAABWZXJhU2FucwAAAAAAAAAA/////zb///42MjhSMDAAAEAAAAAAAAAUAAABEAkM + BQADAwMECAYJCAIEBAUIAwMDAwYGBgYGBgYGBgYDAwgICAUKBgcHBwYGBwcDAwYFCAcHBgcG + BwUHBgcGBQUEAwQIBQUGBgYGBgMGBgMDBQMJBgYGBgQFBAYFBwUFBgUDBQgGBgcGBwcHBgYG + BgYGBgYGBgYDAwMDBgYGBgYGBgYGBgUFBgYFBQYGCQkJBQUICQcICAgIBgYFBgcFBQQEBwkG + BQMIBgYIBgYGCQYGBgcKCQUJBQUDAwgEBQUCBgQEBgYFAwMFDAYGBgYGAwMDAwcHBwcHBwMF + BQUFBQUFBQUFBQMHBQUGAwcGBQUGBggIBAQECQkJBwYDBwUHBgcGBgMDBgUFBQUFBQQFBQAA + Cg0GAAMDBAUIBgoJAwQEBQgDBAMDBgYGBgYGBgYGBgMDCAgIBQsHBwgIBwYICAMDBwYJCAgH + CAcHBQgHCQYHBgQDBAgFBQYGBQYGBAYGAgIFAgoGBgYGBAUEBgYIBgYFBgMGCAcHCAcICAgG + BgYGBgYFBgYGBgICAgIGBgYGBgYGBgYGBQUGBgUGBgYKCgoFBQgKCAgICAgGBwUHCAYFBQUI + CgYFBAgGBggHBgYKBgcHCAsKBQoFBQMDCAUGBwIGBAQGBgUDAwUNBwcHBwcDAwMDCAgICAgI + AgUFBQUFBQUFBQUGAgcFBgUDCAYHBgcGCAgEBAQKCgoIBgMHBQgFCAUGBAMGBQUFBQUFBAUF + AAALDwcAAwMDBQkHCgoDBAQGCQQEBAQHBwcHBwcHBwcHBAQJCQkGDAcICAgHBgkIAwMHBgkI + CQcJBwgHCAcJBwcJBAQECQYGBwcGBwcEBwcDAwYDCwcHBwcFBwQHBgkGBgUHBAcJBwcIBwgJ + CAcHBwcHBwYHBwcHAwMDAwcHBwcHBwcHBwcGBgcHBgYHBwsLCwYGCQsJCQkJCQcHBgcIBgYF + BQgLBwYDCQcHCQcHBwsHBwcJDAsGCwYGBAQJBQYHAgcEBAcHBgQEBg8HBwcHBwMDAwMJCQkI + CAgDBgYGBgYGBgYGBgYDCAcJBQQIBwcGBwcJCQQEBAsLCwkHAwgHCAYIBgcEBAcGBgYGBgYE + BgYAAAwQBwAEBAUFCggLCgMFBQYKBAQEBAgICAgICAgICAgEBAoKCgYNCAgICQgHCQkDAwcG + CgkJCAkICAcJCAsJBwkFBAUKBgYICAcICAQICAMDBwMLCAgICAUHBQgGCQYGBQgECAoICAgI + CQkJCAgICAgIBwgICAgDAwMDCAgICAgICAgICAYGCAgGBwgIDAwMBgYKDAkKCgoKCAgGCAkH + BgYGCQwIBgUKCAgKCAcHDAgICAkNDQYMBgYEBAoGBgcCCAUFBwcGBAQGEAgICAgIAwMDAwkJ + CQkJCQMGBgYGBgYGBgYGBgMIBwkFBAkIBwYICAoKBQUFDAwMCQgDCAcIBwgHCAQECAYGBgYG + BgUGBgAADREIAAQEBQULCAwLAwUFBwsEBQQECAgICAgICAgICAQECwsLBw0JCQkKCAcKCgMD + CAcLCgoICggJBwoJCwoHCgUEBQsHBwgIBwgIBAgIAwMHAw0ICAgIBQcFCAcJBwcHCAQICwkJ + CQgKCgoICAgICAgHCAgICAMDAwMICAgICAgICAgIBwcICAcICAgNDQ0HBwsNCgsLCwsICAcJ + CggHBgYKDQgHBQsICAsJCAgNCAkJCg4NBw0HBwQECwYHBwIIBQUICAcEBAcRCQgJCAgDAwMD + CgoKCgoKAwcHBwcHBwcHBwcHAwkHCgcECggHBwgICwsFBQUNDQ0KCAMJBwkHCQcIBQQIBwcH + BwcHBQcHAAAOEwgABAQFBQwJDQwDBQUHDAQFBAUJCQkJCQkJCQkJBQUMDAwHDgkKCgsJCAsK + AwMJBwwKCwkLCgkJCgkNCwkKBQUFDAcHCAkICQkECQkDAwgDDQkJCQkFCAUJBwsHBwgJBQkM + CQkKCQoLCggICAgICAgJCQkJAwMDAwkJCQkJCQkJCQkHBwkJBwgJCQ4ODgcHDA4LDAwMDAkJ + BwkLCAcHBwsOCQcFDAkJDAkJCQ4JCQkLDw8HDgcHBAQMBwcJAgkGBggIBwQEBxMJCQkJCQMD + AwMLCwsKCgoDBwcHBwcHBwcHBwcDCQgKCAULCQkHCQkMDAYGBg4ODgsJAwkICggKCAkFBAkH + BwcHBwcGBwcAAA8UCQAFBQYGDQoOCwMGBggNBQUFBQoKCgoKCgoKCgoFBQ0NDQgPCgoKCwkJ + DAsDAwoIDQsMCQwKCgkLCg8KCQsGBQYNCAgJCQgJCQUJCQMDCAMPCQkJCQYIBgkIDQoICAoF + Cg0KCgoJCwwLCQkJCQkJCAkJCQkDAwMDCQkJCQkJCQkJCQgICgoICQoJDw8PCAgNDwwNDQ0N + CgkICgsJCAcHCw8JCAYNCgoNCgkJDwoKCgwQDwgPCAgFBQ0HCAkDCgYGCQkIBQUIFAoJCgkJ + AwMDAwwMDAsLCwMICAgICAgICAgICAMKCAsIBQwJCQgJCQ0NBgYGDw8PDAkDCggKCAoICQUF + CggICAgICAYICAAAEBUKAAUFBgYNCg8MAwYGCA0FBgUFCgoKCgoKCgoKCgUFDQ0NCRALCwsM + CgkMDAUFCgkNDA0KDQsKCQwLEQsJDAYFBg0ICAkKCQoJBgoKAwMJAw8KCgoKBwkGCgkNCgkJ + CgUKDQsLCwoMDQwJCQkJCQkJCQkJCQMDAwMKCgoKCgoKCgoKCAgKCggJCgoQEBAICA0QDQ0N + DQ0KCggLDAkICAgMEAoJBg0KCg0LCgoQCgsLDREPCBAICAUFDQgJCQMKBgYKCggFBQgVCwoL + CgoFBQUFDQ0NDAwMAwgICAgICAgICAgJBAoJDAkFDQoJCQoKDQ0GBgYQEBAMCgUKCQsJCwkK + BgUKCAgICAgIBggIAAARFwoABQUHCA4LEA0FBwcJDgUGBQYLCwsLCwsLCwsLBgYODg4JEQsM + DA0LCg0NBgYMCQ8NDQoNDAsKDQsSDQoMBwYHDgkJCgoICgoGCgsFBQoFEQsKCgoHCAcLCg8K + CggLBgsOCwsMCw0NDQoKCgoKCggKCgoKBQUFBQsKCgoKCgsLCwsJCQsLCQoLCxEREQkJDhAN + Dg4ODgsLCQsNCgkICA0QCgkHDgsLDgsKChELCwsNEhEJEQkJBQUOCAoKAwsHBwoKCQUFCRcL + CwsLCwYGBgYNDQ0NDQ0FCQkJCQkJCQkJCQoFCwgMCAYNCgoKCgoODgcHBxAQEA0KBgsIDAgM + CAoGBQsJCQkJCQkHCQkAABIYCwAGBgcIDwsRDQQHBwkPBgcGBgsLCwsLCwsLCwsGBg8PDwoS + DAwNDgsKDg4GBgwKEA4OCw4NCwwODBMNDA0HBgcPCQkKCwkLCwYLCwUFCgURCwsLCwgIBwsL + EAsLCQsGCw8MDA0LDg4OCgoKCgoKCQsLCwsFBQUFCwsLCwsLCwsLCwkJCwsJCwsLEhISCQkP + EQ4PDw8PCwsJDA4LCQgIDhELCgcPCwsPDAsLEgsMDA4TEwkSCQkGBg8JCwwDCwcHCwsJBgYJ + GAwLDAsLBgYGBg4ODg4ODgUJCQkJCQkJCQkJCgULCA0JBg4LDAsLCw8PBwcHERERDgsGCwgN + CQ0JCwcGCwkJCQkJCQcJCQAAExoLAAYGCAgQDBIOBAcHChAGBwYGDAwMDAwMDAwMDAYGEBAQ + ChMNDQ0PDAsPDgYGDAsQDg8MDw0MDA4NFA4MDQcGBxAKCgsLCQsLBgsMBQULBREMCwsLCAkI + DAsRCwsLDAYMEA0NDQwODw4LCwsLCwsJCwsLCwUFBQUMCwsLCwsMDAwMCgoMDAoLDAwTExMK + ChASDxAQEBAMDAoNDgsKCQkPEgsKCBAMDBANDAwTDA0NDxQTChMKCgYGEAkLDAMMCAgLCwoG + BgoaDQwNDAwGBgYGDw8PDg4OBQoKCgoKCgoKCgoLBQwJDQsGDwsMCwwLEBAICAgSEhIPCwYM + CQ0JDQkLBwYMCgoKCgoKCAoKAAAUGwwABgYIChENEw8GCAgKEQYHBgcNDQ0NDQ0NDQ0NBwcR + ERELFA4ODg8NDBAPBgYNCxEPEAwQDg0MDw4UDgwOCAcIEQoKDA0LDQwHDQ0GBgwGFA0MDQ0I + CggNCxELCwsNBw0RDg4ODQ8QDwwMDAwMDAsMDAwMBgYGBg0MDAwMDA0NDQ0KCg0NCgwNDRQU + FAoKERQQEREREQ0NCg0PDAoJCQ8TDAsIEQ0NEQ0MDBQNDg4QFRQKFAoKBgYRCgsMAw0ICA0N + CgYGChsODQ4NDQYGBgYQEBAPDw8GCgoKCgoKCgoKCgsGDQoOCwcPDAwLDA0REQgICBMTExAN + Bg0KDgsOCw0HBg0KCgoKCgoICgoAABUcDQAHBwgKEg0UEAYICAsSBwgHBw0NDQ0NDQ0NDQ0H + BxISEgsVDg4PEA0MEBAGBg4MEhARDREPDQ0PDhUODQ4IBwgSCwsNDQwNDQcNDQYGDAYUDg0N + DQkLCA4LEQ0NCw0HDRIODg8NEBEPDQ0NDQ0NDA0NDQ0GBgYGDg0NDQ0NDg4ODgsLDQ0LDA0N + FRUVCwsSFBESEhISDQ4LDhAMCwoKEBQNCwgSDQ0SDg0NFQ0ODhEWFgsVCwsHBxIKDQ0EDQgI + DQ0LBwcLHA4NDg0NBgYGBhEREQ8PDwYLCwsLCwsLCwsLDAYNCw4LBxANDQ0NDRISCAgIFBQU + EA0GDQsPDA8MDQgHDQsLCwsLCwgLCwAAFh4NAAcHCQoSDhURBgkJCxIHCAcHDg4ODg4ODg4O + DgcHEhISDBYPDw8RDg0REQYGDgwTEBENEQ8ODRAPFg8NDwkHCRILCw0ODA4NCA4OBgYNBhYO + DQ4OCQsJDg4SDg4MDgcOEg8PDw4QERANDQ0NDQ0MDQ0NDQYGBgYODQ0NDQ0ODg4OCwsODgsN + Dg4WFhYLCxIVERISEhIODgsPEQ0LCgoRFQ0MCRIODhIPDQ0WDg8PERgWCxYLCwcHEgsODQQO + CQkNDQsHBwseDw4PDg4GBgYGEREREBAQBgsLCwsLCwsLCwsMBg4LDwwHEQ0NDg0OEhIJCQkV + FRURDgYOCw8MDwwOCAcOCwsLCwsLCQsLAAAXHw4ABwcJCxMPFhIGCQkMEwcIBwgPDw8PDw8P + Dw8PCAgTExMMFxAQEBIPDRIRBwcPDRQREg4SEA8OERAXEA4QCQgJEwwMDg8NDw4IDw8GBg0G + Fg8ODg4JDAkPDhMODgwPCA8TEBAQDxESEQ4ODg4ODg0ODg4OBgYGBg8ODg4ODg8PDw8MDA8P + DA4PDhcXFwwMExYSExMTEw8PDBARDgwLCxIVDgwJEw8PEw8ODhcPEBASGRgMFwwMBwcTCw4O + BA8JCQ8PDAcHDB8QDxAPDwcHBwcSEhIREREGDAwMDAwMDAwMDA0GDwwQDAgSDg4ODg4TEwkJ + CRYWFhIPBw8MEA0QDQ8IBw8MDAwMDAwJDAwAABggDgAICAoLFA8XEwcJCQwUCAkICA8PDw8P + Dw8PDw8ICBQUFA0YEBAREg8OExIHBxANFRITDhMRDw8SEBgQDxAJCAkUDAwODw0PDggPDwcH + DgYYDw4PDwoMCQ8PFA8PDQ8IDxQQEBEPEhMSDg4ODg4ODQ4ODg4HBwcHDw4ODg4ODw8PDwwM + Dw8MDg8PGBgYDAwUFxMUFBQUDw8MEBIODQsLEhcODQoUDw8UEA8PGA8QEBMaGAwYDAwICBQM + Dw8EDwoKDw8MCAgMIBAPEA8PBwcHBxMTExISEgcMDAwMDAwMDAwMDQYPDBANCBMODw8PDxQU + CgoKFxcXEw8HDwwRDRENDwkIDwwMDAwMDAoMDAAAGSIPAAgICgwVEBgUBwoKDRUICQgIEBAQ + EBAQEBAQEAgIFRUVDRkRERETEA4TEwcHEA4WExQPFBEQDxIRGREPEQoIChUNDQ8QDhAPCRAQ + BwcOBxgQDxAQCg0KEA8UDw8NEAgQFRERERATFBIPDw8PDw8ODw8PDwcHBwcQDw8PDw8QEBAQ + DQ0QEA0PEBAZGRkNDRUYFBUVFRUQEA0REw8NDAwTGQ8NChUQEBURDw8ZEBERFBsaDRkNDQgI + FQwPDwQQCgoQEA0ICA0iERAREBAHBwcHFBQUEhISBw0NDQ0NDQ0NDQ0OBxANEQ0IEw8PDw8Q + FRUKCgoYGBgTEAcQDREOEQ4QCQgQDQ0NDQ0NCg0NAAAaIxAACAgKDBYRGRQHCgoNFggJCAkR + ERERERERERERCQkWFhYOGhISEhQQDxQUCAgRDhYTFBAUEhEQExIaEhASCgkKFg0NEBEOERAJ + ERAHBw8HGRAQERELDgoQDxUPDw4RCREWEhISEBMUExAQEBAQEA4QEBAQBwcHBxAQEBAQEBAQ + EBANDRERDQ8REBoaGg0NFhkUFhYWFhERDRIUDw4MDBQaEA4KFhERFhEQEBoREhIUHBsNGg0N + CAgWDQ8QBBEKChAQDQgIDSMSEBIQEAgICAgUFBQTExMHDQ0NDQ0NDQ0NDQ8HEQ4SDgkUEBAP + EBEWFgoKChkZGRQRCBEOEg4SDhEJCBENDQ0NDQ0KDQ0AABskEAAJCQsMFxEaFQcLCw4XCQoJ + CREREREREREREREJCRcXFw4bEhMTFREQFRQICBIPFxQVEBUTEREUEhsTERMLCQsXDg4REQ8R + EQoREQgIEAgaEREREQsOCxEQFhAQDhEJERcSEhMRFBUUERERERERDxEREREICAgIERERERER + EREREQ4OEREOEBERGxsbDg4XGhUWFxcXEREOEhQQDg0NFRsRDgsXEREXEhERGxESEhUdHA4b + Dg4JCRcNEBEFEQsLEREOCQkOJBIREhERCAgICBUVFRQUFAgODg4ODg4ODg4ODwgRDhMOCRUR + ERAQERcXCwsLGhoaFREIEQ4TDxMPEQoJEQ4ODg4ODgsODgAAHCYRAAkJCw0XEhsWCAsLDhcJ + CgkJEhISEhISEhISEgkJFxcXDxwTExQWEhAWFQgIEhAYFRYRFhMSERUTHBMREwsJCxcODhES + DxIRChISCAgQCBsSERISDA8LEhEXEREPEgkSFxMTFBIVFhUREREREREPEREREQgICAgSERER + ERESEhISDg4SEg4REhIcHBwODhcbFhcXFxcSEg4TFRAPDQ0VHBEPCxcSEhcTEREcEhMTFh4d + DhwPDwkJFw4REQUSCwsSEg4JCQ8mExITEhIICAgIFhYWFRUVCA4ODg4ODg4ODg4QCBIPEw8J + FhERERESFxcLCwsbGxsWEggSDxQPFA8SCgkSDg4ODg4OCw4OAAAAAAACAAgAAv//AAMAAQAA + AAIAAAxQCuxfDzz1AB8IAAAAAAC6ufC4AAAAALrCZ5H+if4dCkwHbQAAAAgAAQAAAAAAAA== + ]], "Vera.ttf", "base64") + + local table_concat = table.concat + local type = type + + local _newFont = love.graphics.newFont + love.graphics.newFont = function(font, size) + if type(font) == "number" or not font then + size = font + font = vera_ttf + end + return _newFont(font, size or 12) + end + + love.graphics.setNewFont = function(...) + local font = love.graphics.newFont(...) + love.graphics.setFont(font) + return font + end + + local _getFont = love.graphics.getFont + love.graphics.getFont = function(...) + local font = _getFont() + if not font then + font = love.graphics.setNewFont(12) + end + love.graphics.getFont = _getFont + return font + end + + local _print = love.graphics.print + love.graphics.print = function (...) + love.graphics.getFont() -- make sure we have a font + love.graphics.print = _print + love.graphics.print(...) + end + + local _printf = love.graphics.printf + love.graphics.printf = function (...) + love.graphics.getFont() -- make sure we have a font + love.graphics.printf = _printf + love.graphics.printf(...) + end + + + -- SHADERS + + local GLSL = {} + local GLSLES = {} + + GLSL.VERSION = "#version 120" + GLSLES.VERSION = "#version 100" + + GLSL.SYNTAX = [[ +#define number float +#define Image sampler2D +#define extern uniform +#define Texel texture2D +#define love_Canvases gl_FragData]] + + GLSLES.SYNTAX = GLSL.SYNTAX + + GLSL.UNIFORMS = [[ +#define TransformMatrix gl_ModelViewMatrix +#define ProjectionMatrix gl_ProjectionMatrix +#define TransformProjectionMatrix gl_ModelViewProjectionMatrix +#define NormalMatrix gl_NormalMatrix +uniform sampler2D _tex0_;]] + + GLSLES.UNIFORMS = [[ +uniform mat4 TransformMatrix; +uniform mat4 ProjectionMatrix; +uniform mat4 TransformProjectionMatrix; +// uniform mat4 NormalMatrix; +uniform float love_PointSize; +uniform sampler2D _tex0_;]] + + GLSL.VERTEX = { + HEADER = [[ +#define VERTEX + +#define VertexPosition gl_Vertex +#define VertexTexCoord gl_MultiTexCoord0 +#define VertexColor gl_Color + +#define VaryingTexCoord gl_TexCoord[0] +#define VaryingColor gl_FrontColor]], + + FOOTER = [[ +void main() { + VaryingTexCoord = VertexTexCoord; + VaryingColor = VertexColor; + gl_Position = position(TransformProjectionMatrix, VertexPosition); +}]], + } + + GLSLES.VERTEX = { + HEADER = [[ +#define VERTEX + +attribute vec4 VertexPosition; +attribute vec4 VertexTexCoord; +attribute vec4 VertexColor; + +varying vec4 VaryingTexCoord; +varying lowp vec4 VaryingColor;]], + + FOOTER = [[ +void main() { + VaryingTexCoord = VertexTexCoord; + VaryingColor = VertexColor; + gl_PointSize = love_PointSize; + gl_Position = position(TransformProjectionMatrix, VertexPosition); +}]], + } + + GLSL.PIXEL = { + HEADER = [[ +#define PIXEL + +#define VaryingTexCoord gl_TexCoord[0] +#define VaryingColor gl_Color]], + + FOOTER = [[ +void main() { + // fix crashing issue in OSX when _tex0_ is unused within effect() + float dummy = texture2D(_tex0_, vec2(.5)).r; + gl_FragColor = effect(VaryingColor, _tex0_, VaryingTexCoord.st, gl_FragCoord.xy); +}]], + + FOOTER_MULTI_CANVAS = [[ +void main() { + // fix crashing issue in OSX when _tex0_ is unused within effect() + float dummy = texture2D(_tex0_, vec2(.5)).r; + effects(VaryingColor, _tex0_, VaryingTexCoord.st, gl_FragCoord.xy); +}]], + } + + GLSLES.PIXEL = { + HEADER = [[ +#define PIXEL + +precision mediump float; + +varying vec4 VaryingTexCoord; +varying lowp vec4 VaryingColor;]], + + FOOTER = GLSL.PIXEL.FOOTER, + FOOTER_MULTI_CANVAS = GLSL.PIXEL.FOOTER_MULTI_CANVAS, + } + + local function createVertexCode(vertexcode, lang) + local vertexcodes = { + lang.VERSION, + lang.SYNTAX, lang.VERTEX.HEADER, lang.UNIFORMS, + "#line 0", + vertexcode, + lang.VERTEX.FOOTER, + } + return table_concat(vertexcodes, "\n") + end + + local function createPixelCode(pixelcode, lang, is_multicanvas) + local pixelcodes = { + lang.VERSION, + lang.SYNTAX, lang.PIXEL.HEADER, lang.UNIFORMS, + "#line 0", + pixelcode, + is_multicanvas and lang.PIXEL.FOOTER_MULTI_CANVAS or lang.PIXEL.FOOTER, + } + return table_concat(pixelcodes, "\n") + end + + local function isVertexCode(code) + return code:match("vec4%s*position%(") ~= nil + end + + local function isPixelCode(code) + if code:match("vec4%s*effect%(") then + return true, false + elseif code:match("void%s*effects%(") then -- render to multiple canvases simultaniously + return true, true + else + return false, false + end + end + + function love.graphics._shaderCodeToGLSL(arg1, arg2) + local vertexcode, pixelcode + local is_multicanvas = false -- whether pixel code has "effects" function instead of "effect" + + local lang = GLSL + if (love.graphics.getRendererInfo()) == "OpenGL ES" then + lang = GLSLES + end + + if arg1 then + local s = arg1:gsub("\r\n\t", " ") -- convert whitespace to spaces for parsing + s = s:gsub("(%w+)(%s+)%(", "%1(") -- convert "func ()" to "func()" + + if isVertexCode(s) then + vertexcode = arg1 -- first arg contains vertex shader code + end + + local ispixel, isMultiCanvas = isPixelCode(s) + if ispixel then + pixelcode = arg1 -- first arg contains pixel shader code + is_multicanvas = isMultiCanvas + end + end + + if arg2 then + local s = arg2:gsub("\r\n\t", " ") -- convert whitespace to spaces for parsing + s = s:gsub("(%w+)(%s+)%(", "%1(") -- convert "func ()" to "func()" + + if isVertexCode(s) then + vertexcode = arg2 -- second arg contains vertex shader code + end + + local ispixel, isMultiCanvas = isPixelCode(s) + if ispixel then + pixelcode = arg2 -- second arg contains pixel shader code + is_multicanvas = isMultiCanvas + end + end + + if vertexcode then + vertexcode = createVertexCode(vertexcode, lang) + end + if pixelcode then + pixelcode = createPixelCode(pixelcode, lang, is_multicanvas) + end + + return vertexcode, pixelcode + end + + function love.graphics._transformGLSLErrorMessages(message) + local shadertype = message:match("Cannot compile (%a+) shader code") + if not shadertype then return message end + local lines = {"Cannot compile "..shadertype.." shader code:"} + for l in message:gmatch("[^\n]+") do + -- nvidia compiler message: + -- 0() : error/warning [NUMBER]: + local linenumber, what, message = l:match("^0%((%d+)%)%s*:%s*(%w+)[^:]+:%s*(.+)$") + if not linenumber then + -- ati compiler message: + -- ERROR 0:: error/warning(#[NUMBER]) [ERRORNAME]: + linenumber, what, message = l:match("^%w+: 0:(%d+):%s*(%w+)%([^%)]+%)%s*(.+)$") + if not linenumber then + -- OSX compiler message (?): + -- ERROR: 0:: + what, linenumber, message = l:match("^(%w+): %d+:(%d+): (.+)$") + end + end + if linenumber and what and message then + lines[#lines+1] = ("Line %d: %s: %s"):format(linenumber, what, message) + end + end + -- did not match any known error messages + if #lines == 1 then return message end + return table_concat(lines, "\n") + end + + local defaultcode = { + vertex = [[ +vec4 position(mat4 transform_proj, vec4 vertpos) { + return transform_proj * vertpos; +}]], + pixel = [[ +vec4 effect(vec4 vcolor, Image texture, vec2 texcoord, vec2 pixcoord) { + return Texel(texture, texcoord) * vcolor; +}]] + } + + local defaults = {} + defaults["opengl"] = { + createVertexCode(defaultcode.vertex, GLSL), + createPixelCode(defaultcode.pixel, GLSL, false) + } + defaults["opengles"] = { + createVertexCode(defaultcode.vertex, GLSLES), + createPixelCode(defaultcode.pixel, GLSLES, false) + } + + love.graphics._setDefaultShaderCode(defaults) +end diff --git a/jni/love/src/scripts/graphics.lua.h b/jni/love/src/scripts/graphics.lua.h new file mode 100644 index 00000000..aac5ff8c --- /dev/null +++ b/jni/love/src/scripts/graphics.lua.h @@ -0,0 +1,6706 @@ +/** + * Copyright (c) 2006-2013 LOVE Development Team + * + * 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. + **/ + +namespace love +{ + +// [graphics.lua] +const unsigned char graphics_lua[] = +{ + + 0x2d, 0x2d, 0x5b, 0x5b, 0x0a, + 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, + 0x2d, 0x32, 0x30, 0x31, 0x33, 0x20, 0x4c, 0x4f, 0x56, 0x45, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x54, 0x65, 0x61, 0x6d, 0x0a, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x27, 0x61, 0x73, 0x2d, 0x69, 0x73, 0x27, 0x2c, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x0a, + 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x2e, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x6e, 0x6f, 0x20, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x73, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x6c, 0x64, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x0a, + 0x61, 0x72, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x2e, 0x0a, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x67, 0x72, 0x61, 0x6e, + 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x2c, 0x0a, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69, + 0x61, 0x6c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x74, 0x0a, + 0x66, 0x72, 0x65, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, + 0x31, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, + 0x74, 0x65, 0x64, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x0a, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x72, 0x6f, + 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x73, 0x65, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, + 0x69, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x0a, + 0x61, 0x70, 0x70, 0x72, 0x65, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x0a, + 0x32, 0x2e, 0x20, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x73, + 0x75, 0x63, 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x62, 0x65, 0x0a, + 0x6d, 0x69, 0x73, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, + 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, + 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x0a, + 0x33, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x79, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x79, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x0a, + 0x2d, 0x2d, 0x5d, 0x5d, 0x0a, + 0x64, 0x6f, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x61, 0x5f, 0x74, 0x74, 0x66, 0x20, 0x3d, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x6e, 0x65, + 0x77, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x28, 0x5b, 0x5b, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x41, 0x52, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x41, 0x51, 0x54, + 0x31, 0x4d, 0x76, 0x4d, 0x72, 0x52, 0x66, 0x39, 0x47, 0x4d, 0x41, 0x41, 0x4f, 0x74, 0x77, 0x41, 0x41, 0x41, + 0x41, 0x56, 0x6c, 0x42, 0x44, 0x54, 0x46, 0x54, 0x52, 0x69, 0x6c, 0x36, 0x58, 0x41, 0x41, 0x44, 0x72, 0x79, + 0x41, 0x41, 0x41, 0x41, 0x44, 0x5a, 0x6a, 0x62, 0x57, 0x46, 0x77, 0x70, 0x4d, 0x50, 0x6f, 0x6f, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x73, 0x57, 0x77, 0x41, 0x41, 0x41, 0x4e, 0x59, 0x59, 0x33, 0x5a, 0x30, 0x49, 0x50, 0x2f, 0x54, 0x48, + 0x54, 0x6b, 0x41, 0x41, 0x42, 0x37, 0x38, 0x41, 0x41, 0x41, 0x42, 0x2f, 0x47, 0x5a, 0x77, 0x5a, 0x32, 0x33, + 0x6e, 0x74, 0x50, 0x48, 0x45, 0x41, 0x41, 0x41, 0x6d, 0x59, 0x41, 0x41, 0x41, 0x41, 0x49, 0x74, 0x6e, 0x59, + 0x58, 0x4e, 0x77, 0x41, 0x41, 0x63, 0x41, 0x42, 0x77, 0x41, 0x42, 0x41, 0x55, 0x67, 0x41, 0x41, 0x41, 0x41, + 0x4d, 0x0a, + 0x09, 0x5a, 0x32, 0x78, 0x35, 0x5a, 0x67, 0x78, 0x30, 0x51, 0x63, 0x38, 0x41, 0x41, 0x43, 0x62, 0x73, 0x41, + 0x41, 0x43, 0x4b, 0x66, 0x6d, 0x68, 0x6b, 0x62, 0x58, 0x67, 0x30, 0x38, 0x43, 0x45, 0x4f, 0x41, 0x41, 0x44, + 0x73, 0x41, 0x41, 0x41, 0x41, 0x46, 0x55, 0x68, 0x6f, 0x5a, 0x57, 0x46, 0x6b, 0x33, 0x59, 0x53, 0x69, 0x30, + 0x41, 0x41, 0x42, 0x41, 0x56, 0x51, 0x41, 0x41, 0x41, 0x41, 0x32, 0x61, 0x47, 0x68, 0x6c, 0x59, 0x52, 0x42, + 0x46, 0x0a, + 0x09, 0x43, 0x47, 0x38, 0x41, 0x41, 0x4f, 0x74, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x4a, 0x47, 0x68, 0x74, 0x64, + 0x48, 0x67, 0x4a, 0x78, 0x6f, 0x36, 0x79, 0x41, 0x41, 0x43, 0x30, 0x78, 0x41, 0x41, 0x41, 0x42, 0x44, 0x42, + 0x72, 0x5a, 0x58, 0x4a, 0x75, 0x33, 0x46, 0x4c, 0x56, 0x6d, 0x51, 0x41, 0x41, 0x76, 0x61, 0x41, 0x41, 0x41, + 0x43, 0x32, 0x4b, 0x62, 0x47, 0x39, 0x6a, 0x59, 0x66, 0x50, 0x4c, 0x30, 0x6a, 0x30, 0x41, 0x41, 0x4c, 0x75, + 0x45, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x43, 0x47, 0x6d, 0x31, 0x68, 0x65, 0x48, 0x41, 0x46, 0x52, 0x77, 0x59, 0x36, 0x41, + 0x41, 0x44, 0x72, 0x4c, 0x41, 0x41, 0x41, 0x41, 0x43, 0x42, 0x75, 0x59, 0x57, 0x31, 0x6c, 0x32, 0x62, 0x7a, + 0x49, 0x74, 0x51, 0x41, 0x41, 0x41, 0x52, 0x77, 0x41, 0x41, 0x42, 0x33, 0x66, 0x63, 0x47, 0x39, 0x7a, 0x64, + 0x4c, 0x52, 0x61, 0x4c, 0x37, 0x73, 0x41, 0x41, 0x4c, 0x6a, 0x30, 0x41, 0x41, 0x41, 0x43, 0x6a, 0x6e, 0x42, + 0x79, 0x0a, + 0x09, 0x5a, 0x58, 0x41, 0x37, 0x42, 0x2f, 0x45, 0x41, 0x41, 0x41, 0x41, 0x67, 0x2b, 0x41, 0x41, 0x41, 0x42, + 0x57, 0x67, 0x41, 0x41, 0x41, 0x41, 0x57, 0x41, 0x51, 0x34, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x36, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x51, 0x41, 0x54, 0x41, 0x44, 0x6f, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, 0x41, + 0x46, 0x0a, + 0x09, 0x41, 0x46, 0x38, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x77, 0x41, 0x54, 0x41, + 0x44, 0x6f, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x54, 0x41, 0x44, 0x6f, + 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x51, 0x41, 0x4d, 0x41, 0x47, 0x51, 0x41, 0x41, + 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x67, 0x41, 0x58, 0x41, 0x45, 0x30, 0x41, 0x41, 0x51, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x41, 0x77, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x43, 0x41, 0x41, 0x4f, 0x43, 0x47, 0x77, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x43, 0x77, 0x41, 0x59, 0x43, 0x59, 0x4d, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, + 0x51, 0x6b, 0x54, 0x41, 0x48, 0x41, 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, 0x41, 0x41, 0x41, 0x42, + 0x30, 0x0a, + 0x09, 0x43, 0x5a, 0x73, 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, 0x41, 0x41, 0x51, 0x41, 0x6d, 0x43, + 0x67, 0x38, 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, 0x41, 0x41, 0x67, 0x41, 0x4b, 0x43, 0x6c, 0x6b, + 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, 0x41, 0x41, 0x77, 0x41, 0x6d, 0x43, 0x67, 0x38, 0x41, 0x41, + 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, 0x41, 0x42, 0x41, 0x41, 0x6d, 0x43, 0x67, 0x38, 0x41, 0x41, 0x77, 0x41, + 0x42, 0x0a, + 0x09, 0x42, 0x41, 0x6b, 0x41, 0x42, 0x51, 0x41, 0x59, 0x43, 0x6d, 0x4d, 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, + 0x41, 0x6b, 0x41, 0x42, 0x67, 0x41, 0x75, 0x43, 0x6a, 0x55, 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, + 0x41, 0x42, 0x77, 0x42, 0x67, 0x43, 0x76, 0x55, 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, 0x41, 0x43, + 0x41, 0x41, 0x63, 0x47, 0x6e, 0x4d, 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, 0x41, 0x43, 0x77, 0x41, + 0x77, 0x0a, + 0x09, 0x48, 0x4b, 0x45, 0x41, 0x41, 0x77, 0x41, 0x42, 0x42, 0x41, 0x6b, 0x41, 0x44, 0x52, 0x49, 0x6d, 0x43, + 0x6e, 0x74, 0x44, 0x62, 0x33, 0x42, 0x35, 0x63, 0x6d, 0x6c, 0x6e, 0x61, 0x48, 0x51, 0x67, 0x4b, 0x47, 0x4d, + 0x70, 0x49, 0x44, 0x49, 0x77, 0x4d, 0x44, 0x4d, 0x67, 0x59, 0x6e, 0x6b, 0x67, 0x51, 0x6d, 0x6c, 0x30, 0x63, + 0x33, 0x52, 0x79, 0x5a, 0x57, 0x46, 0x74, 0x4c, 0x43, 0x42, 0x4a, 0x62, 0x6d, 0x4d, 0x75, 0x49, 0x45, 0x46, + 0x73, 0x0a, + 0x09, 0x62, 0x43, 0x42, 0x53, 0x61, 0x57, 0x64, 0x6f, 0x64, 0x48, 0x4d, 0x67, 0x55, 0x6d, 0x56, 0x7a, 0x5a, + 0x58, 0x4a, 0x32, 0x5a, 0x57, 0x51, 0x75, 0x51, 0x6d, 0x6c, 0x30, 0x63, 0x33, 0x52, 0x79, 0x5a, 0x57, 0x46, + 0x74, 0x49, 0x46, 0x5a, 0x6c, 0x63, 0x6d, 0x45, 0x67, 0x55, 0x32, 0x46, 0x75, 0x63, 0x30, 0x4a, 0x70, 0x64, + 0x48, 0x4e, 0x30, 0x63, 0x6d, 0x56, 0x68, 0x62, 0x56, 0x5a, 0x6c, 0x63, 0x6d, 0x46, 0x54, 0x59, 0x57, 0x35, + 0x7a, 0x0a, + 0x09, 0x4c, 0x56, 0x4a, 0x76, 0x62, 0x57, 0x46, 0x75, 0x55, 0x6d, 0x56, 0x73, 0x5a, 0x57, 0x46, 0x7a, 0x5a, + 0x53, 0x41, 0x78, 0x4c, 0x6a, 0x45, 0x77, 0x51, 0x32, 0x39, 0x77, 0x65, 0x58, 0x4a, 0x70, 0x5a, 0x32, 0x68, + 0x30, 0x49, 0x43, 0x68, 0x6a, 0x4b, 0x53, 0x41, 0x79, 0x4d, 0x44, 0x41, 0x7a, 0x49, 0x47, 0x4a, 0x35, 0x49, + 0x45, 0x4a, 0x70, 0x64, 0x48, 0x4e, 0x30, 0x63, 0x6d, 0x56, 0x68, 0x62, 0x53, 0x77, 0x67, 0x53, 0x57, 0x35, + 0x6a, 0x0a, + 0x09, 0x4c, 0x67, 0x30, 0x4b, 0x51, 0x57, 0x78, 0x73, 0x49, 0x46, 0x4a, 0x70, 0x5a, 0x32, 0x68, 0x30, 0x63, + 0x79, 0x42, 0x53, 0x5a, 0x58, 0x4e, 0x6c, 0x63, 0x6e, 0x5a, 0x6c, 0x5a, 0x43, 0x34, 0x4e, 0x43, 0x6b, 0x4a, + 0x70, 0x64, 0x48, 0x4e, 0x30, 0x63, 0x6d, 0x56, 0x68, 0x62, 0x53, 0x42, 0x57, 0x5a, 0x58, 0x4a, 0x68, 0x49, + 0x47, 0x6c, 0x7a, 0x49, 0x47, 0x45, 0x67, 0x64, 0x48, 0x4a, 0x68, 0x5a, 0x47, 0x56, 0x74, 0x59, 0x58, 0x4a, + 0x72, 0x0a, + 0x09, 0x49, 0x47, 0x39, 0x6d, 0x49, 0x45, 0x4a, 0x70, 0x64, 0x48, 0x4e, 0x30, 0x63, 0x6d, 0x56, 0x68, 0x62, + 0x53, 0x77, 0x67, 0x53, 0x57, 0x35, 0x6a, 0x4c, 0x67, 0x30, 0x4b, 0x44, 0x51, 0x70, 0x51, 0x5a, 0x58, 0x4a, + 0x74, 0x61, 0x58, 0x4e, 0x7a, 0x61, 0x57, 0x39, 0x75, 0x49, 0x47, 0x6c, 0x7a, 0x49, 0x47, 0x68, 0x6c, 0x63, + 0x6d, 0x56, 0x69, 0x65, 0x53, 0x42, 0x6e, 0x63, 0x6d, 0x46, 0x75, 0x64, 0x47, 0x56, 0x6b, 0x4c, 0x43, 0x42, + 0x6d, 0x0a, + 0x09, 0x63, 0x6d, 0x56, 0x6c, 0x49, 0x47, 0x39, 0x6d, 0x49, 0x47, 0x4e, 0x6f, 0x59, 0x58, 0x4a, 0x6e, 0x5a, + 0x53, 0x77, 0x67, 0x64, 0x47, 0x38, 0x67, 0x59, 0x57, 0x35, 0x35, 0x49, 0x48, 0x42, 0x6c, 0x63, 0x6e, 0x4e, + 0x76, 0x62, 0x69, 0x42, 0x76, 0x59, 0x6e, 0x52, 0x68, 0x61, 0x57, 0x35, 0x70, 0x62, 0x6d, 0x63, 0x67, 0x59, + 0x53, 0x42, 0x6a, 0x62, 0x33, 0x42, 0x35, 0x49, 0x47, 0x39, 0x6d, 0x49, 0x48, 0x52, 0x6f, 0x5a, 0x53, 0x42, + 0x6d, 0x0a, + 0x09, 0x62, 0x32, 0x35, 0x30, 0x63, 0x79, 0x42, 0x68, 0x59, 0x32, 0x4e, 0x76, 0x62, 0x58, 0x42, 0x68, 0x62, + 0x6e, 0x6c, 0x70, 0x62, 0x6d, 0x63, 0x67, 0x64, 0x47, 0x68, 0x70, 0x63, 0x79, 0x42, 0x73, 0x61, 0x57, 0x4e, + 0x6c, 0x62, 0x6e, 0x4e, 0x6c, 0x49, 0x43, 0x67, 0x69, 0x52, 0x6d, 0x39, 0x75, 0x64, 0x48, 0x4d, 0x69, 0x4b, + 0x53, 0x42, 0x68, 0x62, 0x6d, 0x51, 0x67, 0x59, 0x58, 0x4e, 0x7a, 0x62, 0x32, 0x4e, 0x70, 0x59, 0x58, 0x52, + 0x6c, 0x0a, + 0x09, 0x5a, 0x43, 0x42, 0x6b, 0x62, 0x32, 0x4e, 0x31, 0x62, 0x57, 0x56, 0x75, 0x64, 0x47, 0x46, 0x30, 0x61, + 0x57, 0x39, 0x75, 0x49, 0x47, 0x5a, 0x70, 0x62, 0x47, 0x56, 0x7a, 0x49, 0x43, 0x68, 0x30, 0x61, 0x47, 0x55, + 0x67, 0x49, 0x6b, 0x5a, 0x76, 0x62, 0x6e, 0x51, 0x67, 0x55, 0x32, 0x39, 0x6d, 0x64, 0x48, 0x64, 0x68, 0x63, + 0x6d, 0x55, 0x69, 0x4b, 0x53, 0x77, 0x67, 0x64, 0x47, 0x38, 0x67, 0x63, 0x6d, 0x56, 0x77, 0x63, 0x6d, 0x39, + 0x6b, 0x0a, + 0x09, 0x64, 0x57, 0x4e, 0x6c, 0x49, 0x47, 0x46, 0x75, 0x5a, 0x43, 0x42, 0x6b, 0x61, 0x58, 0x4e, 0x30, 0x63, + 0x6d, 0x6c, 0x69, 0x64, 0x58, 0x52, 0x6c, 0x49, 0x48, 0x52, 0x6f, 0x5a, 0x53, 0x42, 0x47, 0x62, 0x32, 0x35, + 0x30, 0x49, 0x46, 0x4e, 0x76, 0x5a, 0x6e, 0x52, 0x33, 0x59, 0x58, 0x4a, 0x6c, 0x4c, 0x43, 0x42, 0x70, 0x62, + 0x6d, 0x4e, 0x73, 0x64, 0x57, 0x52, 0x70, 0x62, 0x6d, 0x63, 0x67, 0x64, 0x32, 0x6c, 0x30, 0x61, 0x47, 0x39, + 0x31, 0x0a, + 0x09, 0x64, 0x43, 0x42, 0x73, 0x61, 0x57, 0x31, 0x70, 0x64, 0x47, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, + 0x48, 0x52, 0x6f, 0x5a, 0x53, 0x42, 0x79, 0x61, 0x57, 0x64, 0x6f, 0x64, 0x48, 0x4d, 0x67, 0x64, 0x47, 0x38, + 0x67, 0x64, 0x58, 0x4e, 0x6c, 0x4c, 0x43, 0x42, 0x6a, 0x62, 0x33, 0x42, 0x35, 0x4c, 0x43, 0x42, 0x74, 0x5a, + 0x58, 0x4a, 0x6e, 0x5a, 0x53, 0x77, 0x67, 0x63, 0x48, 0x56, 0x69, 0x62, 0x47, 0x6c, 0x7a, 0x61, 0x43, 0x77, + 0x67, 0x0a, + 0x09, 0x5a, 0x47, 0x6c, 0x7a, 0x64, 0x48, 0x4a, 0x70, 0x59, 0x6e, 0x56, 0x30, 0x5a, 0x53, 0x77, 0x67, 0x59, + 0x57, 0x35, 0x6b, 0x4c, 0x32, 0x39, 0x79, 0x49, 0x48, 0x4e, 0x6c, 0x62, 0x47, 0x77, 0x67, 0x59, 0x32, 0x39, + 0x77, 0x61, 0x57, 0x56, 0x7a, 0x49, 0x47, 0x39, 0x6d, 0x49, 0x48, 0x52, 0x6f, 0x5a, 0x53, 0x42, 0x47, 0x62, + 0x32, 0x35, 0x30, 0x49, 0x46, 0x4e, 0x76, 0x5a, 0x6e, 0x52, 0x33, 0x59, 0x58, 0x4a, 0x6c, 0x4c, 0x43, 0x42, + 0x68, 0x0a, + 0x09, 0x62, 0x6d, 0x51, 0x67, 0x64, 0x47, 0x38, 0x67, 0x63, 0x47, 0x56, 0x79, 0x62, 0x57, 0x6c, 0x30, 0x49, + 0x48, 0x42, 0x6c, 0x63, 0x6e, 0x4e, 0x76, 0x62, 0x6e, 0x4d, 0x67, 0x64, 0x47, 0x38, 0x67, 0x64, 0x32, 0x68, + 0x76, 0x62, 0x53, 0x42, 0x30, 0x61, 0x47, 0x55, 0x67, 0x52, 0x6d, 0x39, 0x75, 0x64, 0x43, 0x42, 0x54, 0x62, + 0x32, 0x5a, 0x30, 0x64, 0x32, 0x46, 0x79, 0x5a, 0x53, 0x42, 0x70, 0x63, 0x79, 0x42, 0x6d, 0x64, 0x58, 0x4a, + 0x75, 0x0a, + 0x09, 0x61, 0x58, 0x4e, 0x6f, 0x5a, 0x57, 0x51, 0x67, 0x64, 0x47, 0x38, 0x67, 0x5a, 0x47, 0x38, 0x67, 0x63, + 0x32, 0x38, 0x73, 0x49, 0x48, 0x4e, 0x31, 0x59, 0x6d, 0x70, 0x6c, 0x59, 0x33, 0x51, 0x67, 0x64, 0x47, 0x38, + 0x67, 0x64, 0x47, 0x68, 0x6c, 0x49, 0x47, 0x5a, 0x76, 0x62, 0x47, 0x78, 0x76, 0x64, 0x32, 0x6c, 0x75, 0x5a, + 0x79, 0x42, 0x6a, 0x62, 0x32, 0x35, 0x6b, 0x61, 0x58, 0x52, 0x70, 0x62, 0x32, 0x35, 0x7a, 0x4f, 0x67, 0x30, + 0x4b, 0x0a, + 0x09, 0x44, 0x51, 0x70, 0x55, 0x61, 0x47, 0x55, 0x67, 0x59, 0x57, 0x4a, 0x76, 0x64, 0x6d, 0x55, 0x67, 0x59, + 0x32, 0x39, 0x77, 0x65, 0x58, 0x4a, 0x70, 0x5a, 0x32, 0x68, 0x30, 0x49, 0x47, 0x46, 0x75, 0x5a, 0x43, 0x42, + 0x30, 0x63, 0x6d, 0x46, 0x6b, 0x5a, 0x57, 0x31, 0x68, 0x63, 0x6d, 0x73, 0x67, 0x62, 0x6d, 0x39, 0x30, 0x61, + 0x57, 0x4e, 0x6c, 0x63, 0x79, 0x42, 0x68, 0x62, 0x6d, 0x51, 0x67, 0x64, 0x47, 0x68, 0x70, 0x63, 0x79, 0x42, + 0x77, 0x0a, + 0x09, 0x5a, 0x58, 0x4a, 0x74, 0x61, 0x58, 0x4e, 0x7a, 0x61, 0x57, 0x39, 0x75, 0x49, 0x47, 0x35, 0x76, 0x64, + 0x47, 0x6c, 0x6a, 0x5a, 0x53, 0x42, 0x7a, 0x61, 0x47, 0x46, 0x73, 0x62, 0x43, 0x42, 0x69, 0x5a, 0x53, 0x42, + 0x70, 0x62, 0x6d, 0x4e, 0x73, 0x64, 0x57, 0x52, 0x6c, 0x5a, 0x43, 0x42, 0x70, 0x62, 0x69, 0x42, 0x68, 0x62, + 0x47, 0x77, 0x67, 0x59, 0x32, 0x39, 0x77, 0x61, 0x57, 0x56, 0x7a, 0x49, 0x47, 0x39, 0x6d, 0x49, 0x47, 0x39, + 0x75, 0x0a, + 0x09, 0x5a, 0x53, 0x42, 0x76, 0x63, 0x69, 0x42, 0x74, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x47, 0x39, 0x6d, 0x49, + 0x48, 0x52, 0x6f, 0x5a, 0x53, 0x42, 0x47, 0x62, 0x32, 0x35, 0x30, 0x49, 0x46, 0x4e, 0x76, 0x5a, 0x6e, 0x52, + 0x33, 0x59, 0x58, 0x4a, 0x6c, 0x49, 0x48, 0x52, 0x35, 0x63, 0x47, 0x56, 0x6d, 0x59, 0x57, 0x4e, 0x6c, 0x63, + 0x79, 0x34, 0x4e, 0x43, 0x67, 0x30, 0x4b, 0x56, 0x47, 0x68, 0x6c, 0x49, 0x45, 0x5a, 0x76, 0x62, 0x6e, 0x51, + 0x67, 0x0a, + 0x09, 0x55, 0x32, 0x39, 0x6d, 0x64, 0x48, 0x64, 0x68, 0x63, 0x6d, 0x55, 0x67, 0x62, 0x57, 0x46, 0x35, 0x49, + 0x47, 0x4a, 0x6c, 0x49, 0x47, 0x31, 0x76, 0x5a, 0x47, 0x6c, 0x6d, 0x61, 0x57, 0x56, 0x6b, 0x4c, 0x43, 0x42, + 0x68, 0x62, 0x48, 0x52, 0x6c, 0x63, 0x6d, 0x56, 0x6b, 0x4c, 0x43, 0x42, 0x76, 0x63, 0x69, 0x42, 0x68, 0x5a, + 0x47, 0x52, 0x6c, 0x5a, 0x43, 0x42, 0x30, 0x62, 0x79, 0x77, 0x67, 0x59, 0x57, 0x35, 0x6b, 0x49, 0x47, 0x6c, + 0x75, 0x0a, + 0x09, 0x49, 0x48, 0x42, 0x68, 0x63, 0x6e, 0x52, 0x70, 0x59, 0x33, 0x56, 0x73, 0x59, 0x58, 0x49, 0x67, 0x64, + 0x47, 0x68, 0x6c, 0x49, 0x47, 0x52, 0x6c, 0x63, 0x32, 0x6c, 0x6e, 0x62, 0x6e, 0x4d, 0x67, 0x62, 0x32, 0x59, + 0x67, 0x5a, 0x32, 0x78, 0x35, 0x63, 0x47, 0x68, 0x7a, 0x49, 0x47, 0x39, 0x79, 0x49, 0x47, 0x4e, 0x6f, 0x59, + 0x58, 0x4a, 0x68, 0x59, 0x33, 0x52, 0x6c, 0x63, 0x6e, 0x4d, 0x67, 0x61, 0x57, 0x34, 0x67, 0x64, 0x47, 0x68, + 0x6c, 0x0a, + 0x09, 0x49, 0x45, 0x5a, 0x76, 0x62, 0x6e, 0x52, 0x7a, 0x49, 0x47, 0x31, 0x68, 0x65, 0x53, 0x42, 0x69, 0x5a, + 0x53, 0x42, 0x74, 0x62, 0x32, 0x52, 0x70, 0x5a, 0x6d, 0x6c, 0x6c, 0x5a, 0x43, 0x42, 0x68, 0x62, 0x6d, 0x51, + 0x67, 0x59, 0x57, 0x52, 0x6b, 0x61, 0x58, 0x52, 0x70, 0x62, 0x32, 0x35, 0x68, 0x62, 0x43, 0x42, 0x6e, 0x62, + 0x48, 0x6c, 0x77, 0x61, 0x48, 0x4d, 0x67, 0x62, 0x33, 0x49, 0x67, 0x59, 0x32, 0x68, 0x68, 0x63, 0x6d, 0x46, + 0x6a, 0x0a, + 0x09, 0x64, 0x47, 0x56, 0x79, 0x63, 0x79, 0x42, 0x74, 0x59, 0x58, 0x6b, 0x67, 0x59, 0x6d, 0x55, 0x67, 0x59, + 0x57, 0x52, 0x6b, 0x5a, 0x57, 0x51, 0x67, 0x64, 0x47, 0x38, 0x67, 0x64, 0x47, 0x68, 0x6c, 0x49, 0x45, 0x5a, + 0x76, 0x62, 0x6e, 0x52, 0x7a, 0x4c, 0x43, 0x42, 0x76, 0x62, 0x6d, 0x78, 0x35, 0x49, 0x47, 0x6c, 0x6d, 0x49, + 0x48, 0x52, 0x6f, 0x5a, 0x53, 0x42, 0x6d, 0x62, 0x32, 0x35, 0x30, 0x63, 0x79, 0x42, 0x68, 0x63, 0x6d, 0x55, + 0x67, 0x0a, + 0x09, 0x63, 0x6d, 0x56, 0x75, 0x59, 0x57, 0x31, 0x6c, 0x5a, 0x43, 0x42, 0x30, 0x62, 0x79, 0x42, 0x75, 0x59, + 0x57, 0x31, 0x6c, 0x63, 0x79, 0x42, 0x75, 0x62, 0x33, 0x51, 0x67, 0x59, 0x32, 0x39, 0x75, 0x64, 0x47, 0x46, + 0x70, 0x62, 0x6d, 0x6c, 0x75, 0x5a, 0x79, 0x42, 0x6c, 0x61, 0x58, 0x52, 0x6f, 0x5a, 0x58, 0x49, 0x67, 0x64, + 0x47, 0x68, 0x6c, 0x49, 0x48, 0x64, 0x76, 0x63, 0x6d, 0x52, 0x7a, 0x49, 0x43, 0x4a, 0x43, 0x61, 0x58, 0x52, + 0x7a, 0x0a, + 0x09, 0x64, 0x48, 0x4a, 0x6c, 0x59, 0x57, 0x30, 0x69, 0x49, 0x47, 0x39, 0x79, 0x49, 0x48, 0x52, 0x6f, 0x5a, + 0x53, 0x42, 0x33, 0x62, 0x33, 0x4a, 0x6b, 0x49, 0x43, 0x4a, 0x57, 0x5a, 0x58, 0x4a, 0x68, 0x49, 0x69, 0x34, + 0x4e, 0x43, 0x67, 0x30, 0x4b, 0x56, 0x47, 0x68, 0x70, 0x63, 0x79, 0x42, 0x4d, 0x61, 0x57, 0x4e, 0x6c, 0x62, + 0x6e, 0x4e, 0x6c, 0x49, 0x47, 0x4a, 0x6c, 0x59, 0x32, 0x39, 0x74, 0x5a, 0x58, 0x4d, 0x67, 0x62, 0x6e, 0x56, + 0x73, 0x0a, + 0x09, 0x62, 0x43, 0x42, 0x68, 0x62, 0x6d, 0x51, 0x67, 0x64, 0x6d, 0x39, 0x70, 0x5a, 0x43, 0x42, 0x30, 0x62, + 0x79, 0x42, 0x30, 0x61, 0x47, 0x55, 0x67, 0x5a, 0x58, 0x68, 0x30, 0x5a, 0x57, 0x35, 0x30, 0x49, 0x47, 0x46, + 0x77, 0x63, 0x47, 0x78, 0x70, 0x59, 0x32, 0x46, 0x69, 0x62, 0x47, 0x55, 0x67, 0x64, 0x47, 0x38, 0x67, 0x52, + 0x6d, 0x39, 0x75, 0x64, 0x48, 0x4d, 0x67, 0x62, 0x33, 0x49, 0x67, 0x52, 0x6d, 0x39, 0x75, 0x64, 0x43, 0x42, + 0x54, 0x0a, + 0x09, 0x62, 0x32, 0x5a, 0x30, 0x64, 0x32, 0x46, 0x79, 0x5a, 0x53, 0x42, 0x30, 0x61, 0x47, 0x46, 0x30, 0x49, + 0x47, 0x68, 0x68, 0x63, 0x79, 0x42, 0x69, 0x5a, 0x57, 0x56, 0x75, 0x49, 0x47, 0x31, 0x76, 0x5a, 0x47, 0x6c, + 0x6d, 0x61, 0x57, 0x56, 0x6b, 0x49, 0x47, 0x46, 0x75, 0x5a, 0x43, 0x42, 0x70, 0x63, 0x79, 0x42, 0x6b, 0x61, + 0x58, 0x4e, 0x30, 0x63, 0x6d, 0x6c, 0x69, 0x64, 0x58, 0x52, 0x6c, 0x5a, 0x43, 0x42, 0x31, 0x62, 0x6d, 0x52, + 0x6c, 0x0a, + 0x09, 0x63, 0x69, 0x42, 0x30, 0x61, 0x47, 0x55, 0x67, 0x49, 0x6b, 0x4a, 0x70, 0x64, 0x48, 0x4e, 0x30, 0x63, + 0x6d, 0x56, 0x68, 0x62, 0x53, 0x42, 0x57, 0x5a, 0x58, 0x4a, 0x68, 0x49, 0x69, 0x42, 0x75, 0x59, 0x57, 0x31, + 0x6c, 0x63, 0x79, 0x34, 0x4e, 0x43, 0x67, 0x30, 0x4b, 0x56, 0x47, 0x68, 0x6c, 0x49, 0x45, 0x5a, 0x76, 0x62, + 0x6e, 0x51, 0x67, 0x55, 0x32, 0x39, 0x6d, 0x64, 0x48, 0x64, 0x68, 0x63, 0x6d, 0x55, 0x67, 0x62, 0x57, 0x46, + 0x35, 0x0a, + 0x09, 0x49, 0x47, 0x4a, 0x6c, 0x49, 0x48, 0x4e, 0x76, 0x62, 0x47, 0x51, 0x67, 0x59, 0x58, 0x4d, 0x67, 0x63, + 0x47, 0x46, 0x79, 0x64, 0x43, 0x42, 0x76, 0x5a, 0x69, 0x42, 0x68, 0x49, 0x47, 0x78, 0x68, 0x63, 0x6d, 0x64, + 0x6c, 0x63, 0x69, 0x42, 0x7a, 0x62, 0x32, 0x5a, 0x30, 0x64, 0x32, 0x46, 0x79, 0x5a, 0x53, 0x42, 0x77, 0x59, + 0x57, 0x4e, 0x72, 0x59, 0x57, 0x64, 0x6c, 0x49, 0x47, 0x4a, 0x31, 0x64, 0x43, 0x42, 0x75, 0x62, 0x79, 0x42, + 0x6a, 0x0a, + 0x09, 0x62, 0x33, 0x42, 0x35, 0x49, 0x47, 0x39, 0x6d, 0x49, 0x47, 0x39, 0x75, 0x5a, 0x53, 0x42, 0x76, 0x63, + 0x69, 0x42, 0x74, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x47, 0x39, 0x6d, 0x49, 0x48, 0x52, 0x6f, 0x5a, 0x53, 0x42, + 0x47, 0x62, 0x32, 0x35, 0x30, 0x49, 0x46, 0x4e, 0x76, 0x5a, 0x6e, 0x52, 0x33, 0x59, 0x58, 0x4a, 0x6c, 0x49, + 0x48, 0x52, 0x35, 0x63, 0x47, 0x56, 0x6d, 0x59, 0x57, 0x4e, 0x6c, 0x63, 0x79, 0x42, 0x74, 0x59, 0x58, 0x6b, + 0x67, 0x0a, + 0x09, 0x59, 0x6d, 0x55, 0x67, 0x63, 0x32, 0x39, 0x73, 0x5a, 0x43, 0x42, 0x69, 0x65, 0x53, 0x42, 0x70, 0x64, + 0x48, 0x4e, 0x6c, 0x62, 0x47, 0x59, 0x75, 0x44, 0x51, 0x6f, 0x4e, 0x43, 0x6c, 0x52, 0x49, 0x52, 0x53, 0x42, + 0x47, 0x54, 0x30, 0x35, 0x55, 0x49, 0x46, 0x4e, 0x50, 0x52, 0x6c, 0x52, 0x58, 0x51, 0x56, 0x4a, 0x46, 0x49, + 0x45, 0x6c, 0x54, 0x49, 0x46, 0x42, 0x53, 0x54, 0x31, 0x5a, 0x4a, 0x52, 0x45, 0x56, 0x45, 0x49, 0x43, 0x4a, + 0x42, 0x0a, + 0x09, 0x55, 0x79, 0x42, 0x4a, 0x55, 0x79, 0x49, 0x73, 0x49, 0x46, 0x64, 0x4a, 0x56, 0x45, 0x68, 0x50, 0x56, + 0x56, 0x51, 0x67, 0x56, 0x30, 0x46, 0x53, 0x55, 0x6b, 0x46, 0x4f, 0x56, 0x46, 0x6b, 0x67, 0x54, 0x30, 0x59, + 0x67, 0x51, 0x55, 0x35, 0x5a, 0x49, 0x45, 0x74, 0x4a, 0x54, 0x6b, 0x51, 0x73, 0x49, 0x45, 0x56, 0x59, 0x55, + 0x46, 0x4a, 0x46, 0x55, 0x31, 0x4d, 0x67, 0x54, 0x31, 0x49, 0x67, 0x53, 0x55, 0x31, 0x51, 0x54, 0x45, 0x6c, + 0x46, 0x0a, + 0x09, 0x52, 0x43, 0x77, 0x67, 0x53, 0x55, 0x35, 0x44, 0x54, 0x46, 0x56, 0x45, 0x53, 0x55, 0x35, 0x48, 0x49, + 0x45, 0x4a, 0x56, 0x56, 0x43, 0x42, 0x4f, 0x54, 0x31, 0x51, 0x67, 0x54, 0x45, 0x6c, 0x4e, 0x53, 0x56, 0x52, + 0x46, 0x52, 0x43, 0x42, 0x55, 0x54, 0x79, 0x42, 0x42, 0x54, 0x6c, 0x6b, 0x67, 0x56, 0x30, 0x46, 0x53, 0x55, + 0x6b, 0x46, 0x4f, 0x56, 0x45, 0x6c, 0x46, 0x55, 0x79, 0x42, 0x50, 0x52, 0x69, 0x42, 0x4e, 0x52, 0x56, 0x4a, + 0x44, 0x0a, + 0x09, 0x53, 0x45, 0x46, 0x4f, 0x56, 0x45, 0x46, 0x43, 0x53, 0x55, 0x78, 0x4a, 0x56, 0x46, 0x6b, 0x73, 0x49, + 0x45, 0x5a, 0x4a, 0x56, 0x45, 0x35, 0x46, 0x55, 0x31, 0x4d, 0x67, 0x52, 0x6b, 0x39, 0x53, 0x49, 0x45, 0x45, + 0x67, 0x55, 0x45, 0x46, 0x53, 0x56, 0x45, 0x6c, 0x44, 0x56, 0x55, 0x78, 0x42, 0x55, 0x69, 0x42, 0x51, 0x56, + 0x56, 0x4a, 0x51, 0x54, 0x31, 0x4e, 0x46, 0x49, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x42, 0x4f, 0x54, 0x30, 0x35, + 0x4a, 0x0a, + 0x09, 0x54, 0x6b, 0x5a, 0x53, 0x53, 0x55, 0x35, 0x48, 0x52, 0x55, 0x31, 0x46, 0x54, 0x6c, 0x51, 0x67, 0x54, + 0x30, 0x59, 0x67, 0x51, 0x30, 0x39, 0x51, 0x57, 0x56, 0x4a, 0x4a, 0x52, 0x30, 0x68, 0x55, 0x4c, 0x43, 0x42, + 0x51, 0x51, 0x56, 0x52, 0x46, 0x54, 0x6c, 0x51, 0x73, 0x49, 0x46, 0x52, 0x53, 0x51, 0x55, 0x52, 0x46, 0x54, + 0x55, 0x46, 0x53, 0x53, 0x79, 0x77, 0x67, 0x54, 0x31, 0x49, 0x67, 0x54, 0x31, 0x52, 0x49, 0x52, 0x56, 0x49, + 0x67, 0x0a, + 0x09, 0x55, 0x6b, 0x6c, 0x48, 0x53, 0x46, 0x51, 0x75, 0x49, 0x45, 0x6c, 0x4f, 0x49, 0x45, 0x35, 0x50, 0x49, + 0x45, 0x56, 0x57, 0x52, 0x55, 0x35, 0x55, 0x49, 0x46, 0x4e, 0x49, 0x51, 0x55, 0x78, 0x4d, 0x49, 0x45, 0x4a, + 0x4a, 0x56, 0x46, 0x4e, 0x55, 0x55, 0x6b, 0x56, 0x42, 0x54, 0x53, 0x42, 0x50, 0x55, 0x69, 0x42, 0x55, 0x53, + 0x45, 0x55, 0x67, 0x52, 0x30, 0x35, 0x50, 0x54, 0x55, 0x55, 0x67, 0x52, 0x6b, 0x39, 0x56, 0x54, 0x6b, 0x52, + 0x42, 0x0a, + 0x09, 0x56, 0x45, 0x6c, 0x50, 0x54, 0x69, 0x42, 0x43, 0x52, 0x53, 0x42, 0x4d, 0x53, 0x55, 0x46, 0x43, 0x54, + 0x45, 0x55, 0x67, 0x52, 0x6b, 0x39, 0x53, 0x49, 0x45, 0x46, 0x4f, 0x57, 0x53, 0x42, 0x44, 0x54, 0x45, 0x46, + 0x4a, 0x54, 0x53, 0x77, 0x67, 0x52, 0x45, 0x46, 0x4e, 0x51, 0x55, 0x64, 0x46, 0x55, 0x79, 0x42, 0x50, 0x55, + 0x69, 0x42, 0x50, 0x56, 0x45, 0x68, 0x46, 0x55, 0x69, 0x42, 0x4d, 0x53, 0x55, 0x46, 0x43, 0x53, 0x55, 0x78, + 0x4a, 0x0a, + 0x09, 0x56, 0x46, 0x6b, 0x73, 0x49, 0x45, 0x6c, 0x4f, 0x51, 0x30, 0x78, 0x56, 0x52, 0x45, 0x6c, 0x4f, 0x52, + 0x79, 0x42, 0x42, 0x54, 0x6c, 0x6b, 0x67, 0x52, 0x30, 0x56, 0x4f, 0x52, 0x56, 0x4a, 0x42, 0x54, 0x43, 0x77, + 0x67, 0x55, 0x31, 0x42, 0x46, 0x51, 0x30, 0x6c, 0x42, 0x54, 0x43, 0x77, 0x67, 0x53, 0x55, 0x35, 0x45, 0x53, + 0x56, 0x4a, 0x46, 0x51, 0x31, 0x51, 0x73, 0x49, 0x45, 0x6c, 0x4f, 0x51, 0x30, 0x6c, 0x45, 0x52, 0x55, 0x35, + 0x55, 0x0a, + 0x09, 0x51, 0x55, 0x77, 0x73, 0x49, 0x45, 0x39, 0x53, 0x49, 0x45, 0x4e, 0x50, 0x54, 0x6c, 0x4e, 0x46, 0x55, + 0x56, 0x56, 0x46, 0x54, 0x6c, 0x52, 0x4a, 0x51, 0x55, 0x77, 0x67, 0x52, 0x45, 0x46, 0x4e, 0x51, 0x55, 0x64, + 0x46, 0x55, 0x79, 0x77, 0x67, 0x56, 0x30, 0x68, 0x46, 0x56, 0x45, 0x68, 0x46, 0x55, 0x69, 0x42, 0x4a, 0x54, + 0x69, 0x42, 0x42, 0x54, 0x69, 0x42, 0x42, 0x51, 0x31, 0x52, 0x4a, 0x54, 0x30, 0x34, 0x67, 0x54, 0x30, 0x59, + 0x67, 0x0a, + 0x09, 0x51, 0x30, 0x39, 0x4f, 0x56, 0x46, 0x4a, 0x42, 0x51, 0x31, 0x51, 0x73, 0x49, 0x46, 0x52, 0x50, 0x55, + 0x6c, 0x51, 0x67, 0x54, 0x31, 0x49, 0x67, 0x54, 0x31, 0x52, 0x49, 0x52, 0x56, 0x4a, 0x58, 0x53, 0x56, 0x4e, + 0x46, 0x4c, 0x43, 0x42, 0x42, 0x55, 0x6b, 0x6c, 0x54, 0x53, 0x55, 0x35, 0x48, 0x49, 0x45, 0x5a, 0x53, 0x54, + 0x30, 0x30, 0x73, 0x49, 0x45, 0x39, 0x56, 0x56, 0x43, 0x42, 0x50, 0x52, 0x69, 0x42, 0x55, 0x53, 0x45, 0x55, + 0x67, 0x0a, + 0x09, 0x56, 0x56, 0x4e, 0x46, 0x49, 0x45, 0x39, 0x53, 0x49, 0x45, 0x6c, 0x4f, 0x51, 0x55, 0x4a, 0x4a, 0x54, + 0x45, 0x6c, 0x55, 0x57, 0x53, 0x42, 0x55, 0x54, 0x79, 0x42, 0x56, 0x55, 0x30, 0x55, 0x67, 0x56, 0x45, 0x68, + 0x46, 0x49, 0x45, 0x5a, 0x50, 0x54, 0x6c, 0x51, 0x67, 0x55, 0x30, 0x39, 0x47, 0x56, 0x46, 0x64, 0x42, 0x55, + 0x6b, 0x55, 0x67, 0x54, 0x31, 0x49, 0x67, 0x52, 0x6c, 0x4a, 0x50, 0x54, 0x53, 0x42, 0x50, 0x56, 0x45, 0x68, + 0x46, 0x0a, + 0x09, 0x55, 0x69, 0x42, 0x45, 0x52, 0x55, 0x46, 0x4d, 0x53, 0x55, 0x35, 0x48, 0x55, 0x79, 0x42, 0x4a, 0x54, + 0x69, 0x42, 0x55, 0x53, 0x45, 0x55, 0x67, 0x52, 0x6b, 0x39, 0x4f, 0x56, 0x43, 0x42, 0x54, 0x54, 0x30, 0x5a, + 0x55, 0x56, 0x30, 0x46, 0x53, 0x52, 0x53, 0x34, 0x4e, 0x43, 0x67, 0x30, 0x4b, 0x52, 0x58, 0x68, 0x6a, 0x5a, + 0x58, 0x42, 0x30, 0x49, 0x47, 0x46, 0x7a, 0x49, 0x47, 0x4e, 0x76, 0x62, 0x6e, 0x52, 0x68, 0x61, 0x57, 0x35, + 0x6c, 0x0a, + 0x09, 0x5a, 0x43, 0x42, 0x70, 0x62, 0x69, 0x42, 0x30, 0x61, 0x47, 0x6c, 0x7a, 0x49, 0x47, 0x35, 0x76, 0x64, + 0x47, 0x6c, 0x6a, 0x5a, 0x53, 0x77, 0x67, 0x64, 0x47, 0x68, 0x6c, 0x49, 0x47, 0x35, 0x68, 0x62, 0x57, 0x56, + 0x7a, 0x49, 0x47, 0x39, 0x6d, 0x49, 0x45, 0x64, 0x75, 0x62, 0x32, 0x31, 0x6c, 0x4c, 0x43, 0x42, 0x30, 0x61, + 0x47, 0x55, 0x67, 0x52, 0x32, 0x35, 0x76, 0x62, 0x57, 0x55, 0x67, 0x52, 0x6d, 0x39, 0x31, 0x62, 0x6d, 0x52, + 0x68, 0x0a, + 0x09, 0x64, 0x47, 0x6c, 0x76, 0x62, 0x69, 0x77, 0x67, 0x59, 0x57, 0x35, 0x6b, 0x49, 0x45, 0x4a, 0x70, 0x64, + 0x48, 0x4e, 0x30, 0x63, 0x6d, 0x56, 0x68, 0x62, 0x53, 0x42, 0x4a, 0x62, 0x6d, 0x4d, 0x75, 0x4c, 0x43, 0x42, + 0x7a, 0x61, 0x47, 0x46, 0x73, 0x62, 0x43, 0x42, 0x75, 0x62, 0x33, 0x51, 0x67, 0x59, 0x6d, 0x55, 0x67, 0x64, + 0x58, 0x4e, 0x6c, 0x5a, 0x43, 0x42, 0x70, 0x62, 0x69, 0x42, 0x68, 0x5a, 0x48, 0x5a, 0x6c, 0x63, 0x6e, 0x52, + 0x70, 0x0a, + 0x09, 0x63, 0x32, 0x6c, 0x75, 0x5a, 0x79, 0x42, 0x76, 0x63, 0x69, 0x42, 0x76, 0x64, 0x47, 0x68, 0x6c, 0x63, + 0x6e, 0x64, 0x70, 0x63, 0x32, 0x55, 0x67, 0x64, 0x47, 0x38, 0x67, 0x63, 0x48, 0x4a, 0x76, 0x62, 0x57, 0x39, + 0x30, 0x5a, 0x53, 0x42, 0x30, 0x61, 0x47, 0x55, 0x67, 0x63, 0x32, 0x46, 0x73, 0x5a, 0x53, 0x77, 0x67, 0x64, + 0x58, 0x4e, 0x6c, 0x49, 0x47, 0x39, 0x79, 0x49, 0x47, 0x39, 0x30, 0x61, 0x47, 0x56, 0x79, 0x49, 0x47, 0x52, + 0x6c, 0x0a, + 0x09, 0x59, 0x57, 0x78, 0x70, 0x62, 0x6d, 0x64, 0x7a, 0x49, 0x47, 0x6c, 0x75, 0x49, 0x48, 0x52, 0x6f, 0x61, + 0x58, 0x4d, 0x67, 0x52, 0x6d, 0x39, 0x75, 0x64, 0x43, 0x42, 0x54, 0x62, 0x32, 0x5a, 0x30, 0x64, 0x32, 0x46, + 0x79, 0x5a, 0x53, 0x42, 0x33, 0x61, 0x58, 0x52, 0x6f, 0x62, 0x33, 0x56, 0x30, 0x49, 0x48, 0x42, 0x79, 0x61, + 0x57, 0x39, 0x79, 0x49, 0x48, 0x64, 0x79, 0x61, 0x58, 0x52, 0x30, 0x5a, 0x57, 0x34, 0x67, 0x59, 0x58, 0x56, + 0x30, 0x0a, + 0x09, 0x61, 0x47, 0x39, 0x79, 0x61, 0x58, 0x70, 0x68, 0x64, 0x47, 0x6c, 0x76, 0x62, 0x69, 0x42, 0x6d, 0x63, + 0x6d, 0x39, 0x74, 0x49, 0x48, 0x52, 0x6f, 0x5a, 0x53, 0x42, 0x48, 0x62, 0x6d, 0x39, 0x74, 0x5a, 0x53, 0x42, + 0x47, 0x62, 0x33, 0x56, 0x75, 0x5a, 0x47, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x49, 0x47, 0x39, 0x79, 0x49, + 0x45, 0x4a, 0x70, 0x64, 0x48, 0x4e, 0x30, 0x63, 0x6d, 0x56, 0x68, 0x62, 0x53, 0x42, 0x4a, 0x62, 0x6d, 0x4d, + 0x75, 0x0a, + 0x09, 0x4c, 0x43, 0x42, 0x79, 0x5a, 0x58, 0x4e, 0x77, 0x5a, 0x57, 0x4e, 0x30, 0x61, 0x58, 0x5a, 0x6c, 0x62, + 0x48, 0x6b, 0x75, 0x49, 0x45, 0x5a, 0x76, 0x63, 0x69, 0x42, 0x6d, 0x64, 0x58, 0x4a, 0x30, 0x61, 0x47, 0x56, + 0x79, 0x49, 0x47, 0x6c, 0x75, 0x5a, 0x6d, 0x39, 0x79, 0x62, 0x57, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4c, + 0x43, 0x42, 0x6a, 0x62, 0x32, 0x35, 0x30, 0x59, 0x57, 0x4e, 0x30, 0x4f, 0x69, 0x42, 0x6d, 0x62, 0x32, 0x35, + 0x30, 0x0a, + 0x09, 0x63, 0x79, 0x42, 0x68, 0x64, 0x43, 0x42, 0x6e, 0x62, 0x6d, 0x39, 0x74, 0x5a, 0x53, 0x42, 0x6b, 0x62, + 0x33, 0x51, 0x67, 0x62, 0x33, 0x4a, 0x6e, 0x4c, 0x6d, 0x68, 0x30, 0x64, 0x48, 0x41, 0x36, 0x4c, 0x79, 0x39, + 0x33, 0x64, 0x33, 0x63, 0x75, 0x59, 0x6d, 0x6c, 0x30, 0x63, 0x33, 0x52, 0x79, 0x5a, 0x57, 0x46, 0x74, 0x4c, + 0x6d, 0x4e, 0x76, 0x62, 0x51, 0x42, 0x44, 0x41, 0x47, 0x38, 0x41, 0x63, 0x41, 0x42, 0x35, 0x41, 0x48, 0x49, + 0x41, 0x0a, + 0x09, 0x61, 0x51, 0x42, 0x6e, 0x41, 0x47, 0x67, 0x41, 0x64, 0x41, 0x41, 0x67, 0x41, 0x43, 0x67, 0x41, 0x59, + 0x77, 0x41, 0x70, 0x41, 0x43, 0x41, 0x41, 0x4d, 0x67, 0x41, 0x77, 0x41, 0x44, 0x41, 0x41, 0x4d, 0x77, 0x41, + 0x67, 0x41, 0x47, 0x49, 0x41, 0x65, 0x51, 0x41, 0x67, 0x41, 0x45, 0x49, 0x41, 0x61, 0x51, 0x42, 0x30, 0x41, + 0x48, 0x4d, 0x41, 0x64, 0x41, 0x42, 0x79, 0x41, 0x47, 0x55, 0x41, 0x59, 0x51, 0x42, 0x74, 0x41, 0x43, 0x77, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x4a, 0x41, 0x47, 0x34, 0x41, 0x59, 0x77, 0x41, 0x75, 0x41, 0x43, 0x41, 0x41, 0x51, + 0x51, 0x42, 0x73, 0x41, 0x47, 0x77, 0x41, 0x49, 0x41, 0x42, 0x53, 0x41, 0x47, 0x6b, 0x41, 0x5a, 0x77, 0x42, + 0x6f, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x41, 0x67, 0x41, 0x46, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x7a, 0x41, + 0x47, 0x55, 0x41, 0x63, 0x67, 0x42, 0x32, 0x41, 0x47, 0x55, 0x41, 0x5a, 0x41, 0x41, 0x75, 0x41, 0x45, 0x49, + 0x41, 0x0a, + 0x09, 0x61, 0x51, 0x42, 0x30, 0x41, 0x48, 0x4d, 0x41, 0x64, 0x41, 0x42, 0x79, 0x41, 0x47, 0x55, 0x41, 0x59, + 0x51, 0x42, 0x74, 0x41, 0x43, 0x41, 0x41, 0x56, 0x67, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, 0x59, 0x51, 0x41, + 0x67, 0x41, 0x46, 0x4d, 0x41, 0x59, 0x51, 0x42, 0x75, 0x41, 0x48, 0x4d, 0x41, 0x51, 0x67, 0x42, 0x70, 0x41, + 0x48, 0x51, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x68, 0x41, 0x47, 0x30, + 0x41, 0x0a, + 0x09, 0x56, 0x67, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, 0x59, 0x51, 0x42, 0x54, 0x41, 0x47, 0x45, 0x41, 0x62, + 0x67, 0x42, 0x7a, 0x41, 0x43, 0x30, 0x41, 0x55, 0x67, 0x42, 0x76, 0x41, 0x47, 0x30, 0x41, 0x59, 0x51, 0x42, + 0x75, 0x41, 0x46, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x73, 0x41, 0x47, 0x55, 0x41, 0x59, 0x51, 0x42, 0x7a, 0x41, + 0x47, 0x55, 0x41, 0x49, 0x41, 0x41, 0x78, 0x41, 0x43, 0x34, 0x41, 0x4d, 0x51, 0x41, 0x77, 0x41, 0x45, 0x4d, + 0x41, 0x0a, + 0x09, 0x62, 0x77, 0x42, 0x77, 0x41, 0x48, 0x6b, 0x41, 0x63, 0x67, 0x42, 0x70, 0x41, 0x47, 0x63, 0x41, 0x61, + 0x41, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x4b, 0x41, 0x42, 0x6a, 0x41, 0x43, 0x6b, 0x41, 0x49, 0x41, 0x41, + 0x79, 0x41, 0x44, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x59, 0x67, 0x42, 0x35, 0x41, + 0x43, 0x41, 0x41, 0x51, 0x67, 0x42, 0x70, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, 0x48, 0x49, + 0x41, 0x0a, + 0x09, 0x5a, 0x51, 0x42, 0x68, 0x41, 0x47, 0x30, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6b, 0x41, 0x62, + 0x67, 0x42, 0x6a, 0x41, 0x43, 0x34, 0x41, 0x44, 0x51, 0x41, 0x4b, 0x41, 0x45, 0x45, 0x41, 0x62, 0x41, 0x42, + 0x73, 0x41, 0x43, 0x41, 0x41, 0x55, 0x67, 0x42, 0x70, 0x41, 0x47, 0x63, 0x41, 0x61, 0x41, 0x42, 0x30, 0x41, + 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x53, 0x41, 0x47, 0x55, 0x41, 0x63, 0x77, 0x42, 0x6c, 0x41, 0x48, 0x49, + 0x41, 0x0a, + 0x09, 0x64, 0x67, 0x42, 0x6c, 0x41, 0x47, 0x51, 0x41, 0x4c, 0x67, 0x41, 0x4e, 0x41, 0x41, 0x6f, 0x41, 0x51, + 0x67, 0x42, 0x70, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, + 0x68, 0x41, 0x47, 0x30, 0x41, 0x49, 0x41, 0x42, 0x57, 0x41, 0x47, 0x55, 0x41, 0x63, 0x67, 0x42, 0x68, 0x41, + 0x43, 0x41, 0x41, 0x61, 0x51, 0x42, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x59, 0x51, 0x41, 0x67, 0x41, 0x48, 0x51, + 0x41, 0x0a, + 0x09, 0x63, 0x67, 0x42, 0x68, 0x41, 0x47, 0x51, 0x41, 0x5a, 0x51, 0x42, 0x74, 0x41, 0x47, 0x45, 0x41, 0x63, + 0x67, 0x42, 0x72, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x6d, 0x41, 0x43, 0x41, 0x41, 0x51, 0x67, 0x42, + 0x70, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x68, 0x41, + 0x47, 0x30, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6b, 0x41, 0x62, 0x67, 0x42, 0x6a, 0x41, 0x43, 0x34, + 0x41, 0x0a, + 0x09, 0x44, 0x51, 0x41, 0x4b, 0x41, 0x41, 0x30, 0x41, 0x43, 0x67, 0x42, 0x51, 0x41, 0x47, 0x55, 0x41, 0x63, + 0x67, 0x42, 0x74, 0x41, 0x47, 0x6b, 0x41, 0x63, 0x77, 0x42, 0x7a, 0x41, 0x47, 0x6b, 0x41, 0x62, 0x77, 0x42, + 0x75, 0x41, 0x43, 0x41, 0x41, 0x61, 0x51, 0x42, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x61, 0x41, 0x42, 0x6c, 0x41, + 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x69, 0x41, 0x48, 0x6b, 0x41, 0x49, 0x41, 0x42, 0x6e, 0x41, 0x48, 0x49, + 0x41, 0x0a, + 0x09, 0x59, 0x51, 0x42, 0x75, 0x41, 0x48, 0x51, 0x41, 0x5a, 0x51, 0x42, 0x6b, 0x41, 0x43, 0x77, 0x41, 0x49, + 0x41, 0x42, 0x6d, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, + 0x6d, 0x41, 0x43, 0x41, 0x41, 0x59, 0x77, 0x42, 0x6f, 0x41, 0x47, 0x45, 0x41, 0x63, 0x67, 0x42, 0x6e, 0x41, + 0x47, 0x55, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x62, 0x77, 0x41, 0x67, 0x41, 0x47, 0x45, + 0x41, 0x0a, + 0x09, 0x62, 0x67, 0x42, 0x35, 0x41, 0x43, 0x41, 0x41, 0x63, 0x41, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, 0x63, + 0x77, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x49, 0x41, 0x42, 0x76, 0x41, 0x47, 0x49, 0x41, 0x64, 0x41, 0x42, + 0x68, 0x41, 0x47, 0x6b, 0x41, 0x62, 0x67, 0x42, 0x70, 0x41, 0x47, 0x34, 0x41, 0x5a, 0x77, 0x41, 0x67, 0x41, + 0x47, 0x45, 0x41, 0x49, 0x41, 0x42, 0x6a, 0x41, 0x47, 0x38, 0x41, 0x63, 0x41, 0x42, 0x35, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x62, 0x77, 0x42, 0x6d, 0x41, 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x49, + 0x41, 0x42, 0x6d, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x42, 0x30, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, + 0x68, 0x41, 0x47, 0x4d, 0x41, 0x59, 0x77, 0x42, 0x76, 0x41, 0x47, 0x30, 0x41, 0x63, 0x41, 0x42, 0x68, 0x41, + 0x47, 0x34, 0x41, 0x65, 0x51, 0x42, 0x70, 0x41, 0x47, 0x34, 0x41, 0x5a, 0x77, 0x41, 0x67, 0x41, 0x48, 0x51, + 0x41, 0x0a, + 0x09, 0x61, 0x41, 0x42, 0x70, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x73, 0x41, 0x47, 0x6b, 0x41, 0x59, + 0x77, 0x42, 0x6c, 0x41, 0x47, 0x34, 0x41, 0x63, 0x77, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x4b, 0x41, 0x41, + 0x69, 0x41, 0x45, 0x59, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x41, 0x69, 0x41, + 0x43, 0x6b, 0x41, 0x49, 0x41, 0x42, 0x68, 0x41, 0x47, 0x34, 0x41, 0x5a, 0x41, 0x41, 0x67, 0x41, 0x47, 0x45, + 0x41, 0x0a, + 0x09, 0x63, 0x77, 0x42, 0x7a, 0x41, 0x47, 0x38, 0x41, 0x59, 0x77, 0x42, 0x70, 0x41, 0x47, 0x45, 0x41, 0x64, + 0x41, 0x42, 0x6c, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x6b, 0x41, 0x47, 0x38, 0x41, 0x59, 0x77, 0x42, + 0x31, 0x41, 0x47, 0x30, 0x41, 0x5a, 0x51, 0x42, 0x75, 0x41, 0x48, 0x51, 0x41, 0x59, 0x51, 0x42, 0x30, 0x41, + 0x47, 0x6b, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x43, 0x41, 0x41, 0x5a, 0x67, 0x42, 0x70, 0x41, 0x47, 0x77, + 0x41, 0x0a, + 0x09, 0x5a, 0x51, 0x42, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x4b, 0x41, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x5a, + 0x51, 0x41, 0x67, 0x41, 0x43, 0x49, 0x41, 0x52, 0x67, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x64, 0x41, 0x41, + 0x67, 0x41, 0x46, 0x4d, 0x41, 0x62, 0x77, 0x42, 0x6d, 0x41, 0x48, 0x51, 0x41, 0x64, 0x77, 0x42, 0x68, 0x41, + 0x48, 0x49, 0x41, 0x5a, 0x51, 0x41, 0x69, 0x41, 0x43, 0x6b, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x48, 0x51, + 0x41, 0x0a, + 0x09, 0x62, 0x77, 0x41, 0x67, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x77, 0x41, 0x48, 0x49, 0x41, 0x62, + 0x77, 0x42, 0x6b, 0x41, 0x48, 0x55, 0x41, 0x59, 0x77, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x59, 0x51, 0x42, + 0x75, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x6b, 0x41, 0x47, 0x6b, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, + 0x48, 0x49, 0x41, 0x61, 0x51, 0x42, 0x69, 0x41, 0x48, 0x55, 0x41, 0x64, 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x47, 0x41, 0x47, 0x38, 0x41, 0x62, + 0x67, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x55, 0x77, 0x42, 0x76, 0x41, 0x47, 0x59, 0x41, 0x64, 0x41, 0x42, + 0x33, 0x41, 0x47, 0x45, 0x41, 0x63, 0x67, 0x42, 0x6c, 0x41, 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, 0x70, 0x41, + 0x47, 0x34, 0x41, 0x59, 0x77, 0x42, 0x73, 0x41, 0x48, 0x55, 0x41, 0x5a, 0x41, 0x42, 0x70, 0x41, 0x47, 0x34, + 0x41, 0x0a, + 0x09, 0x5a, 0x77, 0x41, 0x67, 0x41, 0x48, 0x63, 0x41, 0x61, 0x51, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x62, + 0x77, 0x42, 0x31, 0x41, 0x48, 0x51, 0x41, 0x49, 0x41, 0x42, 0x73, 0x41, 0x47, 0x6b, 0x41, 0x62, 0x51, 0x42, + 0x70, 0x41, 0x48, 0x51, 0x41, 0x59, 0x51, 0x42, 0x30, 0x41, 0x47, 0x6b, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, + 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x79, 0x41, 0x47, 0x6b, + 0x41, 0x0a, + 0x09, 0x5a, 0x77, 0x42, 0x6f, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x62, + 0x77, 0x41, 0x67, 0x41, 0x48, 0x55, 0x41, 0x63, 0x77, 0x42, 0x6c, 0x41, 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, + 0x6a, 0x41, 0x47, 0x38, 0x41, 0x63, 0x41, 0x42, 0x35, 0x41, 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, 0x74, 0x41, + 0x47, 0x55, 0x41, 0x63, 0x67, 0x42, 0x6e, 0x41, 0x47, 0x55, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x48, 0x41, + 0x41, 0x0a, + 0x09, 0x64, 0x51, 0x42, 0x69, 0x41, 0x47, 0x77, 0x41, 0x61, 0x51, 0x42, 0x7a, 0x41, 0x47, 0x67, 0x41, 0x4c, + 0x41, 0x41, 0x67, 0x41, 0x47, 0x51, 0x41, 0x61, 0x51, 0x42, 0x7a, 0x41, 0x48, 0x51, 0x41, 0x63, 0x67, 0x42, + 0x70, 0x41, 0x47, 0x49, 0x41, 0x64, 0x51, 0x42, 0x30, 0x41, 0x47, 0x55, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, + 0x47, 0x45, 0x41, 0x62, 0x67, 0x42, 0x6b, 0x41, 0x43, 0x38, 0x41, 0x62, 0x77, 0x42, 0x79, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x63, 0x77, 0x42, 0x6c, 0x41, 0x47, 0x77, 0x41, 0x62, 0x41, 0x41, 0x67, 0x41, 0x47, 0x4d, 0x41, 0x62, + 0x77, 0x42, 0x77, 0x41, 0x47, 0x6b, 0x41, 0x5a, 0x51, 0x42, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, + 0x6d, 0x41, 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x47, 0x41, + 0x47, 0x38, 0x41, 0x62, 0x67, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x55, 0x77, 0x42, 0x76, 0x41, 0x47, 0x59, + 0x41, 0x0a, + 0x09, 0x64, 0x41, 0x42, 0x33, 0x41, 0x47, 0x45, 0x41, 0x63, 0x67, 0x42, 0x6c, 0x41, 0x43, 0x77, 0x41, 0x49, + 0x41, 0x42, 0x68, 0x41, 0x47, 0x34, 0x41, 0x5a, 0x41, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x62, 0x77, 0x41, + 0x67, 0x41, 0x48, 0x41, 0x41, 0x5a, 0x51, 0x42, 0x79, 0x41, 0x47, 0x30, 0x41, 0x61, 0x51, 0x42, 0x30, 0x41, + 0x43, 0x41, 0x41, 0x63, 0x41, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, 0x63, 0x77, 0x42, 0x76, 0x41, 0x47, 0x34, + 0x41, 0x0a, + 0x09, 0x63, 0x77, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x62, 0x77, 0x41, 0x67, 0x41, 0x48, 0x63, 0x41, 0x61, + 0x41, 0x42, 0x76, 0x41, 0x47, 0x30, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x5a, 0x51, 0x41, + 0x67, 0x41, 0x45, 0x59, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x48, 0x51, 0x41, 0x49, 0x41, 0x42, 0x54, 0x41, + 0x47, 0x38, 0x41, 0x5a, 0x67, 0x42, 0x30, 0x41, 0x48, 0x63, 0x41, 0x59, 0x51, 0x42, 0x79, 0x41, 0x47, 0x55, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x70, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x6d, 0x41, 0x48, 0x55, 0x41, 0x63, + 0x67, 0x42, 0x75, 0x41, 0x47, 0x6b, 0x41, 0x63, 0x77, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x5a, 0x41, 0x41, + 0x67, 0x41, 0x48, 0x51, 0x41, 0x62, 0x77, 0x41, 0x67, 0x41, 0x47, 0x51, 0x41, 0x62, 0x77, 0x41, 0x67, 0x41, + 0x48, 0x4d, 0x41, 0x62, 0x77, 0x41, 0x73, 0x41, 0x43, 0x41, 0x41, 0x63, 0x77, 0x42, 0x31, 0x41, 0x47, 0x49, + 0x41, 0x0a, + 0x09, 0x61, 0x67, 0x42, 0x6c, 0x41, 0x47, 0x4d, 0x41, 0x64, 0x41, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x62, + 0x77, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x61, 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x5a, 0x67, 0x42, + 0x76, 0x41, 0x47, 0x77, 0x41, 0x62, 0x41, 0x42, 0x76, 0x41, 0x48, 0x63, 0x41, 0x61, 0x51, 0x42, 0x75, 0x41, + 0x47, 0x63, 0x41, 0x49, 0x41, 0x42, 0x6a, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x42, 0x6b, 0x41, 0x47, 0x6b, + 0x41, 0x0a, + 0x09, 0x64, 0x41, 0x42, 0x70, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x42, 0x7a, 0x41, 0x44, 0x6f, 0x41, 0x44, + 0x51, 0x41, 0x4b, 0x41, 0x41, 0x30, 0x41, 0x43, 0x67, 0x42, 0x55, 0x41, 0x47, 0x67, 0x41, 0x5a, 0x51, 0x41, + 0x67, 0x41, 0x47, 0x45, 0x41, 0x59, 0x67, 0x42, 0x76, 0x41, 0x48, 0x59, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, + 0x47, 0x4d, 0x41, 0x62, 0x77, 0x42, 0x77, 0x41, 0x48, 0x6b, 0x41, 0x63, 0x67, 0x42, 0x70, 0x41, 0x47, 0x63, + 0x41, 0x0a, + 0x09, 0x61, 0x41, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x59, 0x51, 0x42, 0x75, 0x41, 0x47, 0x51, 0x41, 0x49, + 0x41, 0x42, 0x30, 0x41, 0x48, 0x49, 0x41, 0x59, 0x51, 0x42, 0x6b, 0x41, 0x47, 0x55, 0x41, 0x62, 0x51, 0x42, + 0x68, 0x41, 0x48, 0x49, 0x41, 0x61, 0x77, 0x41, 0x67, 0x41, 0x47, 0x34, 0x41, 0x62, 0x77, 0x42, 0x30, 0x41, + 0x47, 0x6b, 0x41, 0x59, 0x77, 0x42, 0x6c, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x68, 0x41, 0x47, 0x34, + 0x41, 0x0a, + 0x09, 0x5a, 0x41, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x61, 0x41, 0x42, 0x70, 0x41, 0x48, 0x4d, 0x41, 0x49, + 0x41, 0x42, 0x77, 0x41, 0x47, 0x55, 0x41, 0x63, 0x67, 0x42, 0x74, 0x41, 0x47, 0x6b, 0x41, 0x63, 0x77, 0x42, + 0x7a, 0x41, 0x47, 0x6b, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x43, 0x41, 0x41, 0x62, 0x67, 0x42, 0x76, 0x41, + 0x48, 0x51, 0x41, 0x61, 0x51, 0x42, 0x6a, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x7a, 0x41, 0x47, 0x67, + 0x41, 0x0a, + 0x09, 0x59, 0x51, 0x42, 0x73, 0x41, 0x47, 0x77, 0x41, 0x49, 0x41, 0x42, 0x69, 0x41, 0x47, 0x55, 0x41, 0x49, + 0x41, 0x42, 0x70, 0x41, 0x47, 0x34, 0x41, 0x59, 0x77, 0x42, 0x73, 0x41, 0x48, 0x55, 0x41, 0x5a, 0x41, 0x42, + 0x6c, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x70, 0x41, 0x47, 0x34, 0x41, 0x49, 0x41, 0x42, 0x68, 0x41, + 0x47, 0x77, 0x41, 0x62, 0x41, 0x41, 0x67, 0x41, 0x47, 0x4d, 0x41, 0x62, 0x77, 0x42, 0x77, 0x41, 0x47, 0x6b, + 0x41, 0x0a, + 0x09, 0x5a, 0x51, 0x42, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x6d, 0x41, 0x43, 0x41, 0x41, 0x62, + 0x77, 0x42, 0x75, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x76, 0x41, 0x48, 0x49, 0x41, 0x49, 0x41, 0x42, + 0x74, 0x41, 0x47, 0x38, 0x41, 0x63, 0x67, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x6d, 0x41, + 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x47, 0x41, 0x47, 0x38, + 0x41, 0x0a, + 0x09, 0x62, 0x67, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x55, 0x77, 0x42, 0x76, 0x41, 0x47, 0x59, 0x41, 0x64, + 0x41, 0x42, 0x33, 0x41, 0x47, 0x45, 0x41, 0x63, 0x67, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, + 0x35, 0x41, 0x48, 0x41, 0x41, 0x5a, 0x51, 0x42, 0x6d, 0x41, 0x47, 0x45, 0x41, 0x59, 0x77, 0x42, 0x6c, 0x41, + 0x48, 0x4d, 0x41, 0x4c, 0x67, 0x41, 0x4e, 0x41, 0x41, 0x6f, 0x41, 0x44, 0x51, 0x41, 0x4b, 0x41, 0x46, 0x51, + 0x41, 0x0a, + 0x09, 0x61, 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x52, 0x67, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x64, + 0x41, 0x41, 0x67, 0x41, 0x46, 0x4d, 0x41, 0x62, 0x77, 0x42, 0x6d, 0x41, 0x48, 0x51, 0x41, 0x64, 0x77, 0x42, + 0x68, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, 0x47, 0x30, 0x41, 0x59, 0x51, 0x42, 0x35, 0x41, + 0x43, 0x41, 0x41, 0x59, 0x67, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x62, 0x51, 0x42, 0x76, 0x41, 0x47, 0x51, + 0x41, 0x0a, + 0x09, 0x61, 0x51, 0x42, 0x6d, 0x41, 0x47, 0x6b, 0x41, 0x5a, 0x51, 0x42, 0x6b, 0x41, 0x43, 0x77, 0x41, 0x49, + 0x41, 0x42, 0x68, 0x41, 0x47, 0x77, 0x41, 0x64, 0x41, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, + 0x6b, 0x41, 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, 0x76, 0x41, 0x48, 0x49, 0x41, 0x49, 0x41, 0x42, 0x68, 0x41, + 0x47, 0x51, 0x41, 0x5a, 0x41, 0x42, 0x6c, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, 0x47, 0x38, + 0x41, 0x0a, + 0x09, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x47, 0x45, 0x41, 0x62, 0x67, 0x42, 0x6b, 0x41, 0x43, 0x41, 0x41, 0x61, + 0x51, 0x42, 0x75, 0x41, 0x43, 0x41, 0x41, 0x63, 0x41, 0x42, 0x68, 0x41, 0x48, 0x49, 0x41, 0x64, 0x41, 0x42, + 0x70, 0x41, 0x47, 0x4d, 0x41, 0x64, 0x51, 0x42, 0x73, 0x41, 0x47, 0x45, 0x41, 0x63, 0x67, 0x41, 0x67, 0x41, + 0x48, 0x51, 0x41, 0x61, 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x5a, 0x41, 0x42, 0x6c, 0x41, 0x48, 0x4d, + 0x41, 0x0a, + 0x09, 0x61, 0x51, 0x42, 0x6e, 0x41, 0x47, 0x34, 0x41, 0x63, 0x77, 0x41, 0x67, 0x41, 0x47, 0x38, 0x41, 0x5a, + 0x67, 0x41, 0x67, 0x41, 0x47, 0x63, 0x41, 0x62, 0x41, 0x42, 0x35, 0x41, 0x48, 0x41, 0x41, 0x61, 0x41, 0x42, + 0x7a, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x79, 0x41, 0x43, 0x41, 0x41, 0x59, 0x77, 0x42, 0x6f, 0x41, + 0x47, 0x45, 0x41, 0x63, 0x67, 0x42, 0x68, 0x41, 0x47, 0x4d, 0x41, 0x64, 0x41, 0x42, 0x6c, 0x41, 0x48, 0x49, + 0x41, 0x0a, + 0x09, 0x63, 0x77, 0x41, 0x67, 0x41, 0x47, 0x6b, 0x41, 0x62, 0x67, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x61, + 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x52, 0x67, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x64, 0x41, 0x42, + 0x7a, 0x41, 0x43, 0x41, 0x41, 0x62, 0x51, 0x42, 0x68, 0x41, 0x48, 0x6b, 0x41, 0x49, 0x41, 0x42, 0x69, 0x41, + 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x74, 0x41, 0x47, 0x38, 0x41, 0x5a, 0x41, 0x42, 0x70, 0x41, 0x47, 0x59, + 0x41, 0x0a, + 0x09, 0x61, 0x51, 0x42, 0x6c, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x68, 0x41, 0x47, 0x34, 0x41, 0x5a, + 0x41, 0x41, 0x67, 0x41, 0x47, 0x45, 0x41, 0x5a, 0x41, 0x42, 0x6b, 0x41, 0x47, 0x6b, 0x41, 0x64, 0x41, 0x42, + 0x70, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x42, 0x68, 0x41, 0x47, 0x77, 0x41, 0x49, 0x41, 0x42, 0x6e, 0x41, + 0x47, 0x77, 0x41, 0x65, 0x51, 0x42, 0x77, 0x41, 0x47, 0x67, 0x41, 0x63, 0x77, 0x41, 0x67, 0x41, 0x47, 0x38, + 0x41, 0x0a, + 0x09, 0x63, 0x67, 0x41, 0x67, 0x41, 0x47, 0x4d, 0x41, 0x61, 0x41, 0x42, 0x68, 0x41, 0x48, 0x49, 0x41, 0x59, + 0x51, 0x42, 0x6a, 0x41, 0x48, 0x51, 0x41, 0x5a, 0x51, 0x42, 0x79, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, + 0x74, 0x41, 0x47, 0x45, 0x41, 0x65, 0x51, 0x41, 0x67, 0x41, 0x47, 0x49, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, + 0x47, 0x45, 0x41, 0x5a, 0x41, 0x42, 0x6b, 0x41, 0x47, 0x55, 0x41, 0x5a, 0x41, 0x41, 0x67, 0x41, 0x48, 0x51, + 0x41, 0x0a, + 0x09, 0x62, 0x77, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x61, 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x52, + 0x67, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x64, 0x41, 0x42, 0x7a, 0x41, 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, + 0x76, 0x41, 0x47, 0x34, 0x41, 0x62, 0x41, 0x42, 0x35, 0x41, 0x43, 0x41, 0x41, 0x61, 0x51, 0x42, 0x6d, 0x41, + 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x6d, 0x41, 0x47, 0x38, + 0x41, 0x0a, + 0x09, 0x62, 0x67, 0x42, 0x30, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x68, 0x41, 0x48, 0x49, 0x41, 0x5a, + 0x51, 0x41, 0x67, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x75, 0x41, 0x47, 0x45, 0x41, 0x62, 0x51, 0x42, + 0x6c, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, 0x47, 0x38, 0x41, 0x49, 0x41, 0x42, 0x75, 0x41, + 0x47, 0x45, 0x41, 0x62, 0x51, 0x42, 0x6c, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x75, 0x41, 0x47, 0x38, + 0x41, 0x0a, + 0x09, 0x64, 0x41, 0x41, 0x67, 0x41, 0x47, 0x4d, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x48, 0x51, 0x41, 0x59, + 0x51, 0x42, 0x70, 0x41, 0x47, 0x34, 0x41, 0x61, 0x51, 0x42, 0x75, 0x41, 0x47, 0x63, 0x41, 0x49, 0x41, 0x42, + 0x6c, 0x41, 0x47, 0x6b, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x63, 0x67, 0x41, 0x67, 0x41, + 0x48, 0x51, 0x41, 0x61, 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x64, 0x77, 0x42, 0x76, 0x41, 0x48, 0x49, + 0x41, 0x0a, + 0x09, 0x5a, 0x41, 0x42, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x49, 0x67, 0x42, 0x43, 0x41, 0x47, 0x6b, 0x41, 0x64, + 0x41, 0x42, 0x7a, 0x41, 0x48, 0x51, 0x41, 0x63, 0x67, 0x42, 0x6c, 0x41, 0x47, 0x45, 0x41, 0x62, 0x51, 0x41, + 0x69, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x79, 0x41, 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, + 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x33, 0x41, 0x47, 0x38, 0x41, 0x63, 0x67, 0x42, 0x6b, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x49, 0x67, 0x42, 0x57, 0x41, 0x47, 0x55, 0x41, 0x63, 0x67, 0x42, 0x68, 0x41, 0x43, 0x49, 0x41, 0x4c, + 0x67, 0x41, 0x4e, 0x41, 0x41, 0x6f, 0x41, 0x44, 0x51, 0x41, 0x4b, 0x41, 0x46, 0x51, 0x41, 0x61, 0x41, 0x42, + 0x70, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x4d, 0x41, 0x47, 0x6b, 0x41, 0x59, 0x77, 0x42, 0x6c, 0x41, + 0x47, 0x34, 0x41, 0x63, 0x77, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x59, 0x67, 0x42, 0x6c, 0x41, 0x47, 0x4d, + 0x41, 0x0a, + 0x09, 0x62, 0x77, 0x42, 0x74, 0x41, 0x47, 0x55, 0x41, 0x63, 0x77, 0x41, 0x67, 0x41, 0x47, 0x34, 0x41, 0x64, + 0x51, 0x42, 0x73, 0x41, 0x47, 0x77, 0x41, 0x49, 0x41, 0x42, 0x68, 0x41, 0x47, 0x34, 0x41, 0x5a, 0x41, 0x41, + 0x67, 0x41, 0x48, 0x59, 0x41, 0x62, 0x77, 0x42, 0x70, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, + 0x47, 0x38, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, 0x47, 0x55, + 0x41, 0x0a, + 0x09, 0x65, 0x41, 0x42, 0x30, 0x41, 0x47, 0x55, 0x41, 0x62, 0x67, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x59, + 0x51, 0x42, 0x77, 0x41, 0x48, 0x41, 0x41, 0x62, 0x41, 0x42, 0x70, 0x41, 0x47, 0x4d, 0x41, 0x59, 0x51, 0x42, + 0x69, 0x41, 0x47, 0x77, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, 0x48, 0x51, 0x41, 0x62, 0x77, 0x41, 0x67, 0x41, + 0x45, 0x59, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x41, 0x67, 0x41, 0x47, 0x38, + 0x41, 0x0a, + 0x09, 0x63, 0x67, 0x41, 0x67, 0x41, 0x45, 0x59, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x48, 0x51, 0x41, 0x49, + 0x41, 0x42, 0x54, 0x41, 0x47, 0x38, 0x41, 0x5a, 0x67, 0x42, 0x30, 0x41, 0x48, 0x63, 0x41, 0x59, 0x51, 0x42, + 0x79, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x59, 0x51, 0x42, 0x30, 0x41, + 0x43, 0x41, 0x41, 0x61, 0x41, 0x42, 0x68, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x69, 0x41, 0x47, 0x55, + 0x41, 0x0a, + 0x09, 0x5a, 0x51, 0x42, 0x75, 0x41, 0x43, 0x41, 0x41, 0x62, 0x51, 0x42, 0x76, 0x41, 0x47, 0x51, 0x41, 0x61, + 0x51, 0x42, 0x6d, 0x41, 0x47, 0x6b, 0x41, 0x5a, 0x51, 0x42, 0x6b, 0x41, 0x43, 0x41, 0x41, 0x59, 0x51, 0x42, + 0x75, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x70, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x6b, 0x41, + 0x47, 0x6b, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, 0x48, 0x49, 0x41, 0x61, 0x51, 0x42, 0x69, 0x41, 0x48, 0x55, + 0x41, 0x0a, + 0x09, 0x64, 0x41, 0x42, 0x6c, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x31, 0x41, 0x47, 0x34, 0x41, 0x5a, + 0x41, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x5a, 0x51, 0x41, + 0x67, 0x41, 0x43, 0x49, 0x41, 0x51, 0x67, 0x42, 0x70, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, + 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x68, 0x41, 0x47, 0x30, 0x41, 0x49, 0x41, 0x42, 0x57, 0x41, 0x47, 0x55, + 0x41, 0x0a, + 0x09, 0x63, 0x67, 0x42, 0x68, 0x41, 0x43, 0x49, 0x41, 0x49, 0x41, 0x42, 0x75, 0x41, 0x47, 0x45, 0x41, 0x62, + 0x51, 0x42, 0x6c, 0x41, 0x48, 0x4d, 0x41, 0x4c, 0x67, 0x41, 0x4e, 0x41, 0x41, 0x6f, 0x41, 0x44, 0x51, 0x41, + 0x4b, 0x41, 0x46, 0x51, 0x41, 0x61, 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x52, 0x67, 0x42, 0x76, 0x41, + 0x47, 0x34, 0x41, 0x64, 0x41, 0x41, 0x67, 0x41, 0x46, 0x4d, 0x41, 0x62, 0x77, 0x42, 0x6d, 0x41, 0x48, 0x51, + 0x41, 0x0a, + 0x09, 0x64, 0x77, 0x42, 0x68, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, 0x47, 0x30, 0x41, 0x59, + 0x51, 0x42, 0x35, 0x41, 0x43, 0x41, 0x41, 0x59, 0x67, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x63, 0x77, 0x42, + 0x76, 0x41, 0x47, 0x77, 0x41, 0x5a, 0x41, 0x41, 0x67, 0x41, 0x47, 0x45, 0x41, 0x63, 0x77, 0x41, 0x67, 0x41, + 0x48, 0x41, 0x41, 0x59, 0x51, 0x42, 0x79, 0x41, 0x48, 0x51, 0x41, 0x49, 0x41, 0x42, 0x76, 0x41, 0x47, 0x59, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x68, 0x41, 0x43, 0x41, 0x41, 0x62, 0x41, 0x42, 0x68, 0x41, 0x48, 0x49, 0x41, 0x5a, + 0x77, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, 0x49, 0x41, 0x42, 0x7a, 0x41, 0x47, 0x38, 0x41, 0x5a, 0x67, 0x42, + 0x30, 0x41, 0x48, 0x63, 0x41, 0x59, 0x51, 0x42, 0x79, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x77, 0x41, + 0x47, 0x45, 0x41, 0x59, 0x77, 0x42, 0x72, 0x41, 0x47, 0x45, 0x41, 0x5a, 0x77, 0x42, 0x6c, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x59, 0x67, 0x42, 0x31, 0x41, 0x48, 0x51, 0x41, 0x49, 0x41, 0x42, 0x75, 0x41, 0x47, 0x38, 0x41, 0x49, + 0x41, 0x42, 0x6a, 0x41, 0x47, 0x38, 0x41, 0x63, 0x41, 0x42, 0x35, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, + 0x6d, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x76, 0x41, + 0x48, 0x49, 0x41, 0x49, 0x41, 0x42, 0x74, 0x41, 0x47, 0x38, 0x41, 0x63, 0x67, 0x42, 0x6c, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x62, 0x77, 0x42, 0x6d, 0x41, 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, 0x41, 0x49, + 0x41, 0x42, 0x47, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x55, 0x77, 0x42, + 0x76, 0x41, 0x47, 0x59, 0x41, 0x64, 0x41, 0x42, 0x33, 0x41, 0x47, 0x45, 0x41, 0x63, 0x67, 0x42, 0x6c, 0x41, + 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x35, 0x41, 0x48, 0x41, 0x41, 0x5a, 0x51, 0x42, 0x6d, 0x41, 0x47, 0x45, + 0x41, 0x0a, + 0x09, 0x59, 0x77, 0x42, 0x6c, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x74, 0x41, 0x47, 0x45, 0x41, 0x65, + 0x51, 0x41, 0x67, 0x41, 0x47, 0x49, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, 0x48, 0x4d, 0x41, 0x62, 0x77, 0x42, + 0x73, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x69, 0x41, 0x48, 0x6b, 0x41, 0x49, 0x41, 0x42, 0x70, 0x41, + 0x48, 0x51, 0x41, 0x63, 0x77, 0x42, 0x6c, 0x41, 0x47, 0x77, 0x41, 0x5a, 0x67, 0x41, 0x75, 0x41, 0x41, 0x30, + 0x41, 0x0a, + 0x09, 0x43, 0x67, 0x41, 0x4e, 0x41, 0x41, 0x6f, 0x41, 0x56, 0x41, 0x42, 0x49, 0x41, 0x45, 0x55, 0x41, 0x49, + 0x41, 0x42, 0x47, 0x41, 0x45, 0x38, 0x41, 0x54, 0x67, 0x42, 0x55, 0x41, 0x43, 0x41, 0x41, 0x55, 0x77, 0x42, + 0x50, 0x41, 0x45, 0x59, 0x41, 0x56, 0x41, 0x42, 0x58, 0x41, 0x45, 0x45, 0x41, 0x55, 0x67, 0x42, 0x46, 0x41, + 0x43, 0x41, 0x41, 0x53, 0x51, 0x42, 0x54, 0x41, 0x43, 0x41, 0x41, 0x55, 0x41, 0x42, 0x53, 0x41, 0x45, 0x38, + 0x41, 0x0a, + 0x09, 0x56, 0x67, 0x42, 0x4a, 0x41, 0x45, 0x51, 0x41, 0x52, 0x51, 0x42, 0x45, 0x41, 0x43, 0x41, 0x41, 0x49, + 0x67, 0x42, 0x42, 0x41, 0x46, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x4a, 0x41, 0x46, 0x4d, 0x41, 0x49, 0x67, 0x41, + 0x73, 0x41, 0x43, 0x41, 0x41, 0x56, 0x77, 0x42, 0x4a, 0x41, 0x46, 0x51, 0x41, 0x53, 0x41, 0x42, 0x50, 0x41, + 0x46, 0x55, 0x41, 0x56, 0x41, 0x41, 0x67, 0x41, 0x46, 0x63, 0x41, 0x51, 0x51, 0x42, 0x53, 0x41, 0x46, 0x49, + 0x41, 0x0a, + 0x09, 0x51, 0x51, 0x42, 0x4f, 0x41, 0x46, 0x51, 0x41, 0x57, 0x51, 0x41, 0x67, 0x41, 0x45, 0x38, 0x41, 0x52, + 0x67, 0x41, 0x67, 0x41, 0x45, 0x45, 0x41, 0x54, 0x67, 0x42, 0x5a, 0x41, 0x43, 0x41, 0x41, 0x53, 0x77, 0x42, + 0x4a, 0x41, 0x45, 0x34, 0x41, 0x52, 0x41, 0x41, 0x73, 0x41, 0x43, 0x41, 0x41, 0x52, 0x51, 0x42, 0x59, 0x41, + 0x46, 0x41, 0x41, 0x55, 0x67, 0x42, 0x46, 0x41, 0x46, 0x4d, 0x41, 0x55, 0x77, 0x41, 0x67, 0x41, 0x45, 0x38, + 0x41, 0x0a, + 0x09, 0x55, 0x67, 0x41, 0x67, 0x41, 0x45, 0x6b, 0x41, 0x54, 0x51, 0x42, 0x51, 0x41, 0x45, 0x77, 0x41, 0x53, + 0x51, 0x42, 0x46, 0x41, 0x45, 0x51, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6b, 0x41, 0x54, 0x67, 0x42, + 0x44, 0x41, 0x45, 0x77, 0x41, 0x56, 0x51, 0x42, 0x45, 0x41, 0x45, 0x6b, 0x41, 0x54, 0x67, 0x42, 0x48, 0x41, + 0x43, 0x41, 0x41, 0x51, 0x67, 0x42, 0x56, 0x41, 0x46, 0x51, 0x41, 0x49, 0x41, 0x42, 0x4f, 0x41, 0x45, 0x38, + 0x41, 0x0a, + 0x09, 0x56, 0x41, 0x41, 0x67, 0x41, 0x45, 0x77, 0x41, 0x53, 0x51, 0x42, 0x4e, 0x41, 0x45, 0x6b, 0x41, 0x56, + 0x41, 0x42, 0x46, 0x41, 0x45, 0x51, 0x41, 0x49, 0x41, 0x42, 0x55, 0x41, 0x45, 0x38, 0x41, 0x49, 0x41, 0x42, + 0x42, 0x41, 0x45, 0x34, 0x41, 0x57, 0x51, 0x41, 0x67, 0x41, 0x46, 0x63, 0x41, 0x51, 0x51, 0x42, 0x53, 0x41, + 0x46, 0x49, 0x41, 0x51, 0x51, 0x42, 0x4f, 0x41, 0x46, 0x51, 0x41, 0x53, 0x51, 0x42, 0x46, 0x41, 0x46, 0x4d, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x50, 0x41, 0x45, 0x59, 0x41, 0x49, 0x41, 0x42, 0x4e, 0x41, 0x45, 0x55, 0x41, 0x55, + 0x67, 0x42, 0x44, 0x41, 0x45, 0x67, 0x41, 0x51, 0x51, 0x42, 0x4f, 0x41, 0x46, 0x51, 0x41, 0x51, 0x51, 0x42, + 0x43, 0x41, 0x45, 0x6b, 0x41, 0x54, 0x41, 0x42, 0x4a, 0x41, 0x46, 0x51, 0x41, 0x57, 0x51, 0x41, 0x73, 0x41, + 0x43, 0x41, 0x41, 0x52, 0x67, 0x42, 0x4a, 0x41, 0x46, 0x51, 0x41, 0x54, 0x67, 0x42, 0x46, 0x41, 0x46, 0x4d, + 0x41, 0x0a, + 0x09, 0x55, 0x77, 0x41, 0x67, 0x41, 0x45, 0x59, 0x41, 0x54, 0x77, 0x42, 0x53, 0x41, 0x43, 0x41, 0x41, 0x51, + 0x51, 0x41, 0x67, 0x41, 0x46, 0x41, 0x41, 0x51, 0x51, 0x42, 0x53, 0x41, 0x46, 0x51, 0x41, 0x53, 0x51, 0x42, + 0x44, 0x41, 0x46, 0x55, 0x41, 0x54, 0x41, 0x42, 0x42, 0x41, 0x46, 0x49, 0x41, 0x49, 0x41, 0x42, 0x51, 0x41, + 0x46, 0x55, 0x41, 0x55, 0x67, 0x42, 0x51, 0x41, 0x45, 0x38, 0x41, 0x55, 0x77, 0x42, 0x46, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x51, 0x51, 0x42, 0x4f, 0x41, 0x45, 0x51, 0x41, 0x49, 0x41, 0x42, 0x4f, 0x41, 0x45, 0x38, 0x41, 0x54, + 0x67, 0x42, 0x4a, 0x41, 0x45, 0x34, 0x41, 0x52, 0x67, 0x42, 0x53, 0x41, 0x45, 0x6b, 0x41, 0x54, 0x67, 0x42, + 0x48, 0x41, 0x45, 0x55, 0x41, 0x54, 0x51, 0x42, 0x46, 0x41, 0x45, 0x34, 0x41, 0x56, 0x41, 0x41, 0x67, 0x41, + 0x45, 0x38, 0x41, 0x52, 0x67, 0x41, 0x67, 0x41, 0x45, 0x4d, 0x41, 0x54, 0x77, 0x42, 0x51, 0x41, 0x46, 0x6b, + 0x41, 0x0a, + 0x09, 0x55, 0x67, 0x42, 0x4a, 0x41, 0x45, 0x63, 0x41, 0x53, 0x41, 0x42, 0x55, 0x41, 0x43, 0x77, 0x41, 0x49, + 0x41, 0x42, 0x51, 0x41, 0x45, 0x45, 0x41, 0x56, 0x41, 0x42, 0x46, 0x41, 0x45, 0x34, 0x41, 0x56, 0x41, 0x41, + 0x73, 0x41, 0x43, 0x41, 0x41, 0x56, 0x41, 0x42, 0x53, 0x41, 0x45, 0x45, 0x41, 0x52, 0x41, 0x42, 0x46, 0x41, + 0x45, 0x30, 0x41, 0x51, 0x51, 0x42, 0x53, 0x41, 0x45, 0x73, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x45, 0x38, + 0x41, 0x0a, + 0x09, 0x55, 0x67, 0x41, 0x67, 0x41, 0x45, 0x38, 0x41, 0x56, 0x41, 0x42, 0x49, 0x41, 0x45, 0x55, 0x41, 0x55, + 0x67, 0x41, 0x67, 0x41, 0x46, 0x49, 0x41, 0x53, 0x51, 0x42, 0x48, 0x41, 0x45, 0x67, 0x41, 0x56, 0x41, 0x41, + 0x75, 0x41, 0x43, 0x41, 0x41, 0x53, 0x51, 0x42, 0x4f, 0x41, 0x43, 0x41, 0x41, 0x54, 0x67, 0x42, 0x50, 0x41, + 0x43, 0x41, 0x41, 0x52, 0x51, 0x42, 0x57, 0x41, 0x45, 0x55, 0x41, 0x54, 0x67, 0x42, 0x55, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x55, 0x77, 0x42, 0x49, 0x41, 0x45, 0x45, 0x41, 0x54, 0x41, 0x42, 0x4d, 0x41, 0x43, 0x41, 0x41, 0x51, + 0x67, 0x42, 0x4a, 0x41, 0x46, 0x51, 0x41, 0x55, 0x77, 0x42, 0x55, 0x41, 0x46, 0x49, 0x41, 0x52, 0x51, 0x42, + 0x42, 0x41, 0x45, 0x30, 0x41, 0x49, 0x41, 0x42, 0x50, 0x41, 0x46, 0x49, 0x41, 0x49, 0x41, 0x42, 0x55, 0x41, + 0x45, 0x67, 0x41, 0x52, 0x51, 0x41, 0x67, 0x41, 0x45, 0x63, 0x41, 0x54, 0x67, 0x42, 0x50, 0x41, 0x45, 0x30, + 0x41, 0x0a, + 0x09, 0x52, 0x51, 0x41, 0x67, 0x41, 0x45, 0x59, 0x41, 0x54, 0x77, 0x42, 0x56, 0x41, 0x45, 0x34, 0x41, 0x52, + 0x41, 0x42, 0x42, 0x41, 0x46, 0x51, 0x41, 0x53, 0x51, 0x42, 0x50, 0x41, 0x45, 0x34, 0x41, 0x49, 0x41, 0x42, + 0x43, 0x41, 0x45, 0x55, 0x41, 0x49, 0x41, 0x42, 0x4d, 0x41, 0x45, 0x6b, 0x41, 0x51, 0x51, 0x42, 0x43, 0x41, + 0x45, 0x77, 0x41, 0x52, 0x51, 0x41, 0x67, 0x41, 0x45, 0x59, 0x41, 0x54, 0x77, 0x42, 0x53, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x51, 0x51, 0x42, 0x4f, 0x41, 0x46, 0x6b, 0x41, 0x49, 0x41, 0x42, 0x44, 0x41, 0x45, 0x77, 0x41, 0x51, + 0x51, 0x42, 0x4a, 0x41, 0x45, 0x30, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x45, 0x51, 0x41, 0x51, 0x51, 0x42, + 0x4e, 0x41, 0x45, 0x45, 0x41, 0x52, 0x77, 0x42, 0x46, 0x41, 0x46, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x50, 0x41, + 0x46, 0x49, 0x41, 0x49, 0x41, 0x42, 0x50, 0x41, 0x46, 0x51, 0x41, 0x53, 0x41, 0x42, 0x46, 0x41, 0x46, 0x49, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x4d, 0x41, 0x45, 0x6b, 0x41, 0x51, 0x51, 0x42, 0x43, 0x41, 0x45, 0x6b, 0x41, 0x54, + 0x41, 0x42, 0x4a, 0x41, 0x46, 0x51, 0x41, 0x57, 0x51, 0x41, 0x73, 0x41, 0x43, 0x41, 0x41, 0x53, 0x51, 0x42, + 0x4f, 0x41, 0x45, 0x4d, 0x41, 0x54, 0x41, 0x42, 0x56, 0x41, 0x45, 0x51, 0x41, 0x53, 0x51, 0x42, 0x4f, 0x41, + 0x45, 0x63, 0x41, 0x49, 0x41, 0x42, 0x42, 0x41, 0x45, 0x34, 0x41, 0x57, 0x51, 0x41, 0x67, 0x41, 0x45, 0x63, + 0x41, 0x0a, + 0x09, 0x52, 0x51, 0x42, 0x4f, 0x41, 0x45, 0x55, 0x41, 0x55, 0x67, 0x42, 0x42, 0x41, 0x45, 0x77, 0x41, 0x4c, + 0x41, 0x41, 0x67, 0x41, 0x46, 0x4d, 0x41, 0x55, 0x41, 0x42, 0x46, 0x41, 0x45, 0x4d, 0x41, 0x53, 0x51, 0x42, + 0x42, 0x41, 0x45, 0x77, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x45, 0x6b, 0x41, 0x54, 0x67, 0x42, 0x45, 0x41, + 0x45, 0x6b, 0x41, 0x55, 0x67, 0x42, 0x46, 0x41, 0x45, 0x4d, 0x41, 0x56, 0x41, 0x41, 0x73, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x53, 0x51, 0x42, 0x4f, 0x41, 0x45, 0x4d, 0x41, 0x53, 0x51, 0x42, 0x45, 0x41, 0x45, 0x55, 0x41, 0x54, + 0x67, 0x42, 0x55, 0x41, 0x45, 0x45, 0x41, 0x54, 0x41, 0x41, 0x73, 0x41, 0x43, 0x41, 0x41, 0x54, 0x77, 0x42, + 0x53, 0x41, 0x43, 0x41, 0x41, 0x51, 0x77, 0x42, 0x50, 0x41, 0x45, 0x34, 0x41, 0x55, 0x77, 0x42, 0x46, 0x41, + 0x46, 0x45, 0x41, 0x56, 0x51, 0x42, 0x46, 0x41, 0x45, 0x34, 0x41, 0x56, 0x41, 0x42, 0x4a, 0x41, 0x45, 0x45, + 0x41, 0x0a, + 0x09, 0x54, 0x41, 0x41, 0x67, 0x41, 0x45, 0x51, 0x41, 0x51, 0x51, 0x42, 0x4e, 0x41, 0x45, 0x45, 0x41, 0x52, + 0x77, 0x42, 0x46, 0x41, 0x46, 0x4d, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x46, 0x63, 0x41, 0x53, 0x41, 0x42, + 0x46, 0x41, 0x46, 0x51, 0x41, 0x53, 0x41, 0x42, 0x46, 0x41, 0x46, 0x49, 0x41, 0x49, 0x41, 0x42, 0x4a, 0x41, + 0x45, 0x34, 0x41, 0x49, 0x41, 0x42, 0x42, 0x41, 0x45, 0x34, 0x41, 0x49, 0x41, 0x42, 0x42, 0x41, 0x45, 0x4d, + 0x41, 0x0a, + 0x09, 0x56, 0x41, 0x42, 0x4a, 0x41, 0x45, 0x38, 0x41, 0x54, 0x67, 0x41, 0x67, 0x41, 0x45, 0x38, 0x41, 0x52, + 0x67, 0x41, 0x67, 0x41, 0x45, 0x4d, 0x41, 0x54, 0x77, 0x42, 0x4f, 0x41, 0x46, 0x51, 0x41, 0x55, 0x67, 0x42, + 0x42, 0x41, 0x45, 0x4d, 0x41, 0x56, 0x41, 0x41, 0x73, 0x41, 0x43, 0x41, 0x41, 0x56, 0x41, 0x42, 0x50, 0x41, + 0x46, 0x49, 0x41, 0x56, 0x41, 0x41, 0x67, 0x41, 0x45, 0x38, 0x41, 0x55, 0x67, 0x41, 0x67, 0x41, 0x45, 0x38, + 0x41, 0x0a, + 0x09, 0x56, 0x41, 0x42, 0x49, 0x41, 0x45, 0x55, 0x41, 0x55, 0x67, 0x42, 0x58, 0x41, 0x45, 0x6b, 0x41, 0x55, + 0x77, 0x42, 0x46, 0x41, 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, 0x42, 0x41, 0x46, 0x49, 0x41, 0x53, 0x51, 0x42, + 0x54, 0x41, 0x45, 0x6b, 0x41, 0x54, 0x67, 0x42, 0x48, 0x41, 0x43, 0x41, 0x41, 0x52, 0x67, 0x42, 0x53, 0x41, + 0x45, 0x38, 0x41, 0x54, 0x51, 0x41, 0x73, 0x41, 0x43, 0x41, 0x41, 0x54, 0x77, 0x42, 0x56, 0x41, 0x46, 0x51, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x50, 0x41, 0x45, 0x59, 0x41, 0x49, 0x41, 0x42, 0x55, 0x41, 0x45, 0x67, 0x41, 0x52, + 0x51, 0x41, 0x67, 0x41, 0x46, 0x55, 0x41, 0x55, 0x77, 0x42, 0x46, 0x41, 0x43, 0x41, 0x41, 0x54, 0x77, 0x42, + 0x53, 0x41, 0x43, 0x41, 0x41, 0x53, 0x51, 0x42, 0x4f, 0x41, 0x45, 0x45, 0x41, 0x51, 0x67, 0x42, 0x4a, 0x41, + 0x45, 0x77, 0x41, 0x53, 0x51, 0x42, 0x55, 0x41, 0x46, 0x6b, 0x41, 0x49, 0x41, 0x42, 0x55, 0x41, 0x45, 0x38, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x56, 0x41, 0x46, 0x4d, 0x41, 0x52, 0x51, 0x41, 0x67, 0x41, 0x46, 0x51, 0x41, 0x53, + 0x41, 0x42, 0x46, 0x41, 0x43, 0x41, 0x41, 0x52, 0x67, 0x42, 0x50, 0x41, 0x45, 0x34, 0x41, 0x56, 0x41, 0x41, + 0x67, 0x41, 0x46, 0x4d, 0x41, 0x54, 0x77, 0x42, 0x47, 0x41, 0x46, 0x51, 0x41, 0x56, 0x77, 0x42, 0x42, 0x41, + 0x46, 0x49, 0x41, 0x52, 0x51, 0x41, 0x67, 0x41, 0x45, 0x38, 0x41, 0x55, 0x67, 0x41, 0x67, 0x41, 0x45, 0x59, + 0x41, 0x0a, + 0x09, 0x55, 0x67, 0x42, 0x50, 0x41, 0x45, 0x30, 0x41, 0x49, 0x41, 0x42, 0x50, 0x41, 0x46, 0x51, 0x41, 0x53, + 0x41, 0x42, 0x46, 0x41, 0x46, 0x49, 0x41, 0x49, 0x41, 0x42, 0x45, 0x41, 0x45, 0x55, 0x41, 0x51, 0x51, 0x42, + 0x4d, 0x41, 0x45, 0x6b, 0x41, 0x54, 0x67, 0x42, 0x48, 0x41, 0x46, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x4a, 0x41, + 0x45, 0x34, 0x41, 0x49, 0x41, 0x42, 0x55, 0x41, 0x45, 0x67, 0x41, 0x52, 0x51, 0x41, 0x67, 0x41, 0x45, 0x59, + 0x41, 0x0a, + 0x09, 0x54, 0x77, 0x42, 0x4f, 0x41, 0x46, 0x51, 0x41, 0x49, 0x41, 0x42, 0x54, 0x41, 0x45, 0x38, 0x41, 0x52, + 0x67, 0x42, 0x55, 0x41, 0x46, 0x63, 0x41, 0x51, 0x51, 0x42, 0x53, 0x41, 0x45, 0x55, 0x41, 0x4c, 0x67, 0x41, + 0x4e, 0x41, 0x41, 0x6f, 0x41, 0x44, 0x51, 0x41, 0x4b, 0x41, 0x45, 0x55, 0x41, 0x65, 0x41, 0x42, 0x6a, 0x41, + 0x47, 0x55, 0x41, 0x63, 0x41, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x59, 0x51, 0x42, 0x7a, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x59, 0x77, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x64, 0x41, 0x42, 0x68, 0x41, 0x47, 0x6b, 0x41, 0x62, + 0x67, 0x42, 0x6c, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x70, 0x41, 0x47, 0x34, 0x41, 0x49, 0x41, 0x42, + 0x30, 0x41, 0x47, 0x67, 0x41, 0x61, 0x51, 0x42, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x62, 0x67, 0x42, 0x76, 0x41, + 0x48, 0x51, 0x41, 0x61, 0x51, 0x42, 0x6a, 0x41, 0x47, 0x55, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, 0x48, 0x51, + 0x41, 0x0a, + 0x09, 0x61, 0x41, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x62, 0x67, 0x42, 0x68, 0x41, 0x47, 0x30, 0x41, 0x5a, + 0x51, 0x42, 0x7a, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x6d, 0x41, 0x43, 0x41, 0x41, 0x52, 0x77, 0x42, + 0x75, 0x41, 0x47, 0x38, 0x41, 0x62, 0x51, 0x42, 0x6c, 0x41, 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, + 0x47, 0x67, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, 0x45, 0x63, 0x41, 0x62, 0x67, 0x42, 0x76, 0x41, 0x47, 0x30, + 0x41, 0x0a, + 0x09, 0x5a, 0x51, 0x41, 0x67, 0x41, 0x45, 0x59, 0x41, 0x62, 0x77, 0x42, 0x31, 0x41, 0x47, 0x34, 0x41, 0x5a, + 0x41, 0x42, 0x68, 0x41, 0x48, 0x51, 0x41, 0x61, 0x51, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x4c, 0x41, 0x41, + 0x67, 0x41, 0x47, 0x45, 0x41, 0x62, 0x67, 0x42, 0x6b, 0x41, 0x43, 0x41, 0x41, 0x51, 0x67, 0x42, 0x70, 0x41, + 0x48, 0x51, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, 0x48, 0x49, 0x41, 0x5a, 0x51, 0x42, 0x68, 0x41, 0x47, 0x30, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x4a, 0x41, 0x47, 0x34, 0x41, 0x59, 0x77, 0x41, 0x75, 0x41, 0x43, 0x77, 0x41, 0x49, + 0x41, 0x42, 0x7a, 0x41, 0x47, 0x67, 0x41, 0x59, 0x51, 0x42, 0x73, 0x41, 0x47, 0x77, 0x41, 0x49, 0x41, 0x42, + 0x75, 0x41, 0x47, 0x38, 0x41, 0x64, 0x41, 0x41, 0x67, 0x41, 0x47, 0x49, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, + 0x48, 0x55, 0x41, 0x63, 0x77, 0x42, 0x6c, 0x41, 0x47, 0x51, 0x41, 0x49, 0x41, 0x42, 0x70, 0x41, 0x47, 0x34, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x68, 0x41, 0x47, 0x51, 0x41, 0x64, 0x67, 0x42, 0x6c, 0x41, 0x48, 0x49, 0x41, 0x64, + 0x41, 0x42, 0x70, 0x41, 0x48, 0x4d, 0x41, 0x61, 0x51, 0x42, 0x75, 0x41, 0x47, 0x63, 0x41, 0x49, 0x41, 0x42, + 0x76, 0x41, 0x48, 0x49, 0x41, 0x49, 0x41, 0x42, 0x76, 0x41, 0x48, 0x51, 0x41, 0x61, 0x41, 0x42, 0x6c, 0x41, + 0x48, 0x49, 0x41, 0x64, 0x77, 0x42, 0x70, 0x41, 0x48, 0x4d, 0x41, 0x5a, 0x51, 0x41, 0x67, 0x41, 0x48, 0x51, + 0x41, 0x0a, + 0x09, 0x62, 0x77, 0x41, 0x67, 0x41, 0x48, 0x41, 0x41, 0x63, 0x67, 0x42, 0x76, 0x41, 0x47, 0x30, 0x41, 0x62, + 0x77, 0x42, 0x30, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x5a, 0x51, 0x41, + 0x67, 0x41, 0x48, 0x4d, 0x41, 0x59, 0x51, 0x42, 0x73, 0x41, 0x47, 0x55, 0x41, 0x4c, 0x41, 0x41, 0x67, 0x41, + 0x48, 0x55, 0x41, 0x63, 0x77, 0x42, 0x6c, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x79, 0x41, 0x43, 0x41, + 0x41, 0x0a, + 0x09, 0x62, 0x77, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x5a, 0x51, 0x42, 0x79, 0x41, 0x43, 0x41, 0x41, 0x5a, + 0x41, 0x42, 0x6c, 0x41, 0x47, 0x45, 0x41, 0x62, 0x41, 0x42, 0x70, 0x41, 0x47, 0x34, 0x41, 0x5a, 0x77, 0x42, + 0x7a, 0x41, 0x43, 0x41, 0x41, 0x61, 0x51, 0x42, 0x75, 0x41, 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, + 0x47, 0x6b, 0x41, 0x63, 0x77, 0x41, 0x67, 0x41, 0x45, 0x59, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x48, 0x51, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x54, 0x41, 0x47, 0x38, 0x41, 0x5a, 0x67, 0x42, 0x30, 0x41, 0x48, 0x63, 0x41, 0x59, + 0x51, 0x42, 0x79, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x33, 0x41, 0x47, 0x6b, 0x41, 0x64, 0x41, 0x42, + 0x6f, 0x41, 0x47, 0x38, 0x41, 0x64, 0x51, 0x42, 0x30, 0x41, 0x43, 0x41, 0x41, 0x63, 0x41, 0x42, 0x79, 0x41, + 0x47, 0x6b, 0x41, 0x62, 0x77, 0x42, 0x79, 0x41, 0x43, 0x41, 0x41, 0x64, 0x77, 0x42, 0x79, 0x41, 0x47, 0x6b, + 0x41, 0x0a, + 0x09, 0x64, 0x41, 0x42, 0x30, 0x41, 0x47, 0x55, 0x41, 0x62, 0x67, 0x41, 0x67, 0x41, 0x47, 0x45, 0x41, 0x64, + 0x51, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x62, 0x77, 0x42, 0x79, 0x41, 0x47, 0x6b, 0x41, 0x65, 0x67, 0x42, + 0x68, 0x41, 0x48, 0x51, 0x41, 0x61, 0x51, 0x42, 0x76, 0x41, 0x47, 0x34, 0x41, 0x49, 0x41, 0x42, 0x6d, 0x41, + 0x48, 0x49, 0x41, 0x62, 0x77, 0x42, 0x74, 0x41, 0x43, 0x41, 0x41, 0x64, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x55, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x48, 0x41, 0x47, 0x34, 0x41, 0x62, 0x77, 0x42, 0x74, 0x41, 0x47, 0x55, 0x41, 0x49, + 0x41, 0x42, 0x47, 0x41, 0x47, 0x38, 0x41, 0x64, 0x51, 0x42, 0x75, 0x41, 0x47, 0x51, 0x41, 0x59, 0x51, 0x42, + 0x30, 0x41, 0x47, 0x6b, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, 0x43, 0x41, 0x41, 0x62, 0x77, 0x42, 0x79, 0x41, + 0x43, 0x41, 0x41, 0x51, 0x67, 0x42, 0x70, 0x41, 0x48, 0x51, 0x41, 0x63, 0x77, 0x42, 0x30, 0x41, 0x48, 0x49, + 0x41, 0x0a, + 0x09, 0x5a, 0x51, 0x42, 0x68, 0x41, 0x47, 0x30, 0x41, 0x49, 0x41, 0x42, 0x4a, 0x41, 0x47, 0x34, 0x41, 0x59, + 0x77, 0x41, 0x75, 0x41, 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, 0x79, 0x41, 0x47, 0x55, 0x41, 0x63, 0x77, 0x42, + 0x77, 0x41, 0x47, 0x55, 0x41, 0x59, 0x77, 0x42, 0x30, 0x41, 0x47, 0x6b, 0x41, 0x64, 0x67, 0x42, 0x6c, 0x41, + 0x47, 0x77, 0x41, 0x65, 0x51, 0x41, 0x75, 0x41, 0x43, 0x41, 0x41, 0x52, 0x67, 0x42, 0x76, 0x41, 0x48, 0x49, + 0x41, 0x0a, + 0x09, 0x49, 0x41, 0x42, 0x6d, 0x41, 0x48, 0x55, 0x41, 0x63, 0x67, 0x42, 0x30, 0x41, 0x47, 0x67, 0x41, 0x5a, + 0x51, 0x42, 0x79, 0x41, 0x43, 0x41, 0x41, 0x61, 0x51, 0x42, 0x75, 0x41, 0x47, 0x59, 0x41, 0x62, 0x77, 0x42, + 0x79, 0x41, 0x47, 0x30, 0x41, 0x59, 0x51, 0x42, 0x30, 0x41, 0x47, 0x6b, 0x41, 0x62, 0x77, 0x42, 0x75, 0x41, + 0x43, 0x77, 0x41, 0x49, 0x41, 0x42, 0x6a, 0x41, 0x47, 0x38, 0x41, 0x62, 0x67, 0x42, 0x30, 0x41, 0x47, 0x45, + 0x41, 0x0a, + 0x09, 0x59, 0x77, 0x42, 0x30, 0x41, 0x44, 0x6f, 0x41, 0x49, 0x41, 0x42, 0x6d, 0x41, 0x47, 0x38, 0x41, 0x62, + 0x67, 0x42, 0x30, 0x41, 0x48, 0x4d, 0x41, 0x49, 0x41, 0x42, 0x68, 0x41, 0x48, 0x51, 0x41, 0x49, 0x41, 0x42, + 0x6e, 0x41, 0x47, 0x34, 0x41, 0x62, 0x77, 0x42, 0x74, 0x41, 0x47, 0x55, 0x41, 0x49, 0x41, 0x42, 0x6b, 0x41, + 0x47, 0x38, 0x41, 0x64, 0x41, 0x41, 0x67, 0x41, 0x47, 0x38, 0x41, 0x63, 0x67, 0x42, 0x6e, 0x41, 0x43, 0x34, + 0x41, 0x0a, + 0x09, 0x61, 0x41, 0x42, 0x30, 0x41, 0x48, 0x51, 0x41, 0x63, 0x41, 0x41, 0x36, 0x41, 0x43, 0x38, 0x41, 0x4c, + 0x77, 0x42, 0x33, 0x41, 0x48, 0x63, 0x41, 0x64, 0x77, 0x41, 0x75, 0x41, 0x47, 0x49, 0x41, 0x61, 0x51, 0x42, + 0x30, 0x41, 0x48, 0x4d, 0x41, 0x64, 0x41, 0x42, 0x79, 0x41, 0x47, 0x55, 0x41, 0x59, 0x51, 0x42, 0x74, 0x41, + 0x43, 0x34, 0x41, 0x59, 0x77, 0x42, 0x76, 0x41, 0x47, 0x30, 0x41, 0x41, 0x54, 0x55, 0x41, 0x75, 0x41, 0x44, + 0x4c, 0x0a, + 0x09, 0x41, 0x4d, 0x73, 0x41, 0x77, 0x51, 0x43, 0x71, 0x41, 0x4a, 0x77, 0x42, 0x70, 0x67, 0x43, 0x34, 0x41, + 0x47, 0x59, 0x41, 0x41, 0x41, 0x42, 0x78, 0x41, 0x4d, 0x73, 0x41, 0x6f, 0x41, 0x4b, 0x79, 0x41, 0x49, 0x55, + 0x41, 0x64, 0x51, 0x43, 0x34, 0x41, 0x4d, 0x4d, 0x42, 0x79, 0x77, 0x47, 0x4a, 0x41, 0x69, 0x30, 0x41, 0x79, + 0x77, 0x43, 0x6d, 0x41, 0x50, 0x41, 0x41, 0x30, 0x77, 0x43, 0x71, 0x41, 0x49, 0x63, 0x41, 0x79, 0x77, 0x4f, + 0x71, 0x0a, + 0x09, 0x42, 0x41, 0x41, 0x42, 0x53, 0x67, 0x41, 0x7a, 0x41, 0x4d, 0x73, 0x41, 0x41, 0x41, 0x44, 0x5a, 0x42, + 0x51, 0x49, 0x41, 0x39, 0x41, 0x46, 0x55, 0x41, 0x4c, 0x51, 0x41, 0x6e, 0x41, 0x45, 0x35, 0x41, 0x52, 0x51, + 0x42, 0x4f, 0x51, 0x63, 0x47, 0x42, 0x41, 0x41, 0x45, 0x54, 0x67, 0x53, 0x30, 0x42, 0x46, 0x49, 0x45, 0x75, + 0x41, 0x54, 0x6e, 0x42, 0x4d, 0x30, 0x41, 0x4e, 0x77, 0x52, 0x7a, 0x42, 0x4d, 0x30, 0x45, 0x59, 0x41, 0x52, + 0x7a, 0x0a, + 0x09, 0x41, 0x54, 0x4d, 0x44, 0x6f, 0x67, 0x56, 0x57, 0x42, 0x61, 0x59, 0x46, 0x56, 0x67, 0x55, 0x35, 0x41, + 0x38, 0x55, 0x43, 0x45, 0x67, 0x44, 0x4a, 0x41, 0x42, 0x38, 0x41, 0x75, 0x41, 0x48, 0x66, 0x41, 0x48, 0x4d, + 0x41, 0x75, 0x67, 0x50, 0x70, 0x41, 0x7a, 0x4d, 0x44, 0x76, 0x41, 0x52, 0x45, 0x42, 0x41, 0x34, 0x41, 0x33, + 0x77, 0x50, 0x4e, 0x41, 0x36, 0x6f, 0x41, 0x35, 0x51, 0x4f, 0x71, 0x42, 0x41, 0x51, 0x41, 0x41, 0x41, 0x44, + 0x4c, 0x0a, + 0x09, 0x41, 0x49, 0x38, 0x41, 0x70, 0x41, 0x42, 0x37, 0x41, 0x4c, 0x67, 0x41, 0x46, 0x41, 0x46, 0x76, 0x41, + 0x48, 0x38, 0x43, 0x65, 0x77, 0x4a, 0x53, 0x41, 0x49, 0x38, 0x41, 0x78, 0x77, 0x58, 0x4e, 0x41, 0x4a, 0x6f, + 0x41, 0x6d, 0x67, 0x42, 0x76, 0x41, 0x4d, 0x73, 0x41, 0x7a, 0x51, 0x47, 0x65, 0x41, 0x64, 0x4d, 0x41, 0x38, + 0x41, 0x43, 0x36, 0x41, 0x59, 0x4d, 0x41, 0x31, 0x51, 0x43, 0x59, 0x41, 0x77, 0x51, 0x43, 0x53, 0x41, 0x43, + 0x65, 0x0a, + 0x09, 0x41, 0x64, 0x55, 0x41, 0x77, 0x51, 0x44, 0x4c, 0x41, 0x50, 0x59, 0x41, 0x67, 0x77, 0x4e, 0x55, 0x41, + 0x6e, 0x38, 0x41, 0x41, 0x41, 0x4d, 0x7a, 0x41, 0x6d, 0x59, 0x41, 0x30, 0x77, 0x44, 0x48, 0x41, 0x4b, 0x51, + 0x41, 0x7a, 0x51, 0x43, 0x50, 0x41, 0x4a, 0x6f, 0x41, 0x63, 0x77, 0x51, 0x41, 0x42, 0x64, 0x55, 0x42, 0x43, + 0x67, 0x44, 0x2b, 0x41, 0x69, 0x73, 0x41, 0x70, 0x41, 0x43, 0x30, 0x41, 0x4a, 0x77, 0x41, 0x41, 0x41, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x4a, 0x77, 0x41, 0x41, 0x41, 0x41, 0x64, 0x41, 0x79, 0x30, 0x46, 0x31, 0x51, 0x58, 0x56, 0x42, + 0x64, 0x55, 0x46, 0x38, 0x41, 0x42, 0x2f, 0x41, 0x48, 0x73, 0x41, 0x56, 0x41, 0x43, 0x6b, 0x42, 0x72, 0x67, + 0x47, 0x46, 0x41, 0x63, 0x6a, 0x41, 0x64, 0x4d, 0x41, 0x75, 0x41, 0x44, 0x4c, 0x41, 0x4b, 0x59, 0x42, 0x77, + 0x77, 0x48, 0x73, 0x42, 0x70, 0x4d, 0x41, 0x6f, 0x41, 0x44, 0x54, 0x41, 0x31, 0x77, 0x44, 0x63, 0x51, 0x50, + 0x62, 0x0a, + 0x09, 0x41, 0x59, 0x55, 0x45, 0x49, 0x77, 0x53, 0x6f, 0x42, 0x45, 0x67, 0x41, 0x6a, 0x77, 0x45, 0x35, 0x41, + 0x52, 0x51, 0x42, 0x4f, 0x51, 0x4e, 0x67, 0x41, 0x49, 0x38, 0x46, 0x31, 0x51, 0x47, 0x61, 0x42, 0x68, 0x51, + 0x48, 0x49, 0x77, 0x5a, 0x6d, 0x41, 0x58, 0x6b, 0x45, 0x59, 0x41, 0x52, 0x67, 0x42, 0x47, 0x41, 0x45, 0x65, + 0x77, 0x43, 0x63, 0x41, 0x41, 0x41, 0x43, 0x64, 0x77, 0x52, 0x67, 0x41, 0x61, 0x6f, 0x41, 0x36, 0x51, 0x52, + 0x67, 0x0a, + 0x09, 0x42, 0x32, 0x49, 0x41, 0x65, 0x77, 0x44, 0x46, 0x41, 0x48, 0x38, 0x43, 0x65, 0x77, 0x41, 0x41, 0x41, + 0x4c, 0x51, 0x43, 0x55, 0x67, 0x58, 0x4e, 0x41, 0x47, 0x59, 0x41, 0x76, 0x41, 0x42, 0x6d, 0x41, 0x48, 0x63, + 0x47, 0x45, 0x41, 0x44, 0x4e, 0x41, 0x54, 0x73, 0x42, 0x68, 0x51, 0x4f, 0x4a, 0x41, 0x49, 0x38, 0x41, 0x65, + 0x77, 0x41, 0x41, 0x41, 0x42, 0x30, 0x41, 0x7a, 0x51, 0x64, 0x4b, 0x42, 0x43, 0x38, 0x41, 0x6e, 0x41, 0x43, + 0x63, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x48, 0x66, 0x51, 0x42, 0x76, 0x41, 0x41, 0x41, 0x41, 0x62, 0x77, 0x4d, 0x31, 0x41, + 0x47, 0x6f, 0x41, 0x62, 0x77, 0x42, 0x37, 0x41, 0x4b, 0x34, 0x41, 0x73, 0x67, 0x41, 0x74, 0x41, 0x35, 0x59, + 0x41, 0x6a, 0x77, 0x4a, 0x37, 0x41, 0x50, 0x59, 0x41, 0x67, 0x77, 0x4e, 0x55, 0x42, 0x6a, 0x63, 0x46, 0x39, + 0x67, 0x43, 0x50, 0x41, 0x4a, 0x77, 0x45, 0x34, 0x51, 0x4a, 0x6d, 0x41, 0x49, 0x38, 0x42, 0x6a, 0x51, 0x4c, + 0x32, 0x0a, + 0x09, 0x41, 0x4d, 0x30, 0x44, 0x52, 0x41, 0x41, 0x70, 0x41, 0x47, 0x59, 0x45, 0x37, 0x67, 0x42, 0x7a, 0x41, + 0x41, 0x41, 0x55, 0x41, 0x4c, 0x67, 0x43, 0x67, 0x45, 0x44, 0x2f, 0x2b, 0x2f, 0x34, 0x44, 0x2b, 0x68, 0x51, + 0x44, 0x2b, 0x53, 0x55, 0x44, 0x2b, 0x44, 0x49, 0x44, 0x39, 0x35, 0x59, 0x44, 0x39, 0x67, 0x34, 0x44, 0x39, + 0x66, 0x34, 0x44, 0x39, 0x50, 0x34, 0x44, 0x38, 0x79, 0x55, 0x44, 0x38, 0x67, 0x34, 0x44, 0x38, 0x5a, 0x59, + 0x44, 0x0a, + 0x09, 0x38, 0x43, 0x55, 0x44, 0x37, 0x34, 0x70, 0x42, 0x42, 0x65, 0x2f, 0x2b, 0x41, 0x2b, 0x36, 0x57, 0x41, + 0x2b, 0x32, 0x57, 0x41, 0x2b, 0x7a, 0x36, 0x41, 0x2b, 0x76, 0x36, 0x41, 0x2b, 0x72, 0x2b, 0x41, 0x2b, 0x6b, + 0x36, 0x41, 0x2b, 0x68, 0x43, 0x41, 0x2b, 0x66, 0x2b, 0x41, 0x2b, 0x59, 0x79, 0x41, 0x2b, 0x58, 0x6b, 0x55, + 0x77, 0x58, 0x6c, 0x6c, 0x67, 0x50, 0x6b, 0x69, 0x6b, 0x45, 0x46, 0x35, 0x46, 0x4d, 0x44, 0x34, 0x2b, 0x49, + 0x76, 0x0a, + 0x09, 0x42, 0x65, 0x50, 0x36, 0x41, 0x2b, 0x49, 0x76, 0x41, 0x2b, 0x48, 0x2b, 0x41, 0x2b, 0x44, 0x2b, 0x41, + 0x39, 0x38, 0x79, 0x41, 0x39, 0x34, 0x55, 0x41, 0x39, 0x32, 0x57, 0x41, 0x39, 0x7a, 0x2b, 0x41, 0x39, 0x73, + 0x53, 0x41, 0x39, 0x70, 0x39, 0x41, 0x39, 0x6d, 0x37, 0x41, 0x39, 0x6a, 0x2b, 0x41, 0x39, 0x61, 0x4b, 0x51, + 0x51, 0x58, 0x57, 0x66, 0x51, 0x50, 0x56, 0x31, 0x45, 0x63, 0x46, 0x31, 0x58, 0x30, 0x44, 0x31, 0x45, 0x63, + 0x44, 0x0a, + 0x09, 0x30, 0x39, 0x49, 0x62, 0x42, 0x64, 0x50, 0x2b, 0x41, 0x39, 0x49, 0x62, 0x41, 0x39, 0x48, 0x2b, 0x41, + 0x39, 0x44, 0x2b, 0x41, 0x38, 0x2f, 0x2b, 0x41, 0x38, 0x37, 0x2b, 0x41, 0x38, 0x32, 0x57, 0x41, 0x38, 0x7a, + 0x4c, 0x48, 0x67, 0x58, 0x4d, 0x2f, 0x67, 0x50, 0x4c, 0x48, 0x67, 0x50, 0x4b, 0x4d, 0x67, 0x50, 0x4a, 0x2f, + 0x67, 0x50, 0x47, 0x68, 0x52, 0x45, 0x46, 0x78, 0x68, 0x77, 0x44, 0x78, 0x52, 0x59, 0x44, 0x78, 0x50, 0x34, + 0x44, 0x0a, + 0x09, 0x77, 0x2f, 0x34, 0x44, 0x77, 0x76, 0x34, 0x44, 0x77, 0x66, 0x34, 0x44, 0x77, 0x50, 0x34, 0x44, 0x76, + 0x2f, 0x34, 0x44, 0x76, 0x76, 0x34, 0x44, 0x76, 0x66, 0x34, 0x44, 0x76, 0x50, 0x34, 0x44, 0x75, 0x2f, 0x34, + 0x44, 0x75, 0x68, 0x45, 0x44, 0x75, 0x59, 0x59, 0x6c, 0x42, 0x62, 0x6e, 0x2b, 0x41, 0x37, 0x69, 0x33, 0x75, + 0x77, 0x57, 0x34, 0x2f, 0x67, 0x4f, 0x33, 0x74, 0x6c, 0x30, 0x46, 0x74, 0x37, 0x73, 0x44, 0x74, 0x34, 0x41, + 0x45, 0x0a, + 0x09, 0x74, 0x72, 0x55, 0x6c, 0x42, 0x62, 0x5a, 0x64, 0x51, 0x50, 0x38, 0x44, 0x74, 0x6b, 0x41, 0x45, 0x74, + 0x53, 0x55, 0x44, 0x74, 0x50, 0x34, 0x44, 0x73, 0x35, 0x59, 0x44, 0x73, 0x76, 0x34, 0x44, 0x73, 0x66, 0x34, + 0x44, 0x73, 0x50, 0x34, 0x44, 0x72, 0x2f, 0x34, 0x44, 0x72, 0x6d, 0x51, 0x44, 0x72, 0x51, 0x34, 0x44, 0x72, + 0x4b, 0x73, 0x6c, 0x42, 0x61, 0x78, 0x6b, 0x41, 0x36, 0x75, 0x71, 0x45, 0x67, 0x57, 0x72, 0x4a, 0x51, 0x4f, + 0x71, 0x0a, + 0x09, 0x45, 0x67, 0x4f, 0x70, 0x69, 0x6b, 0x45, 0x46, 0x71, 0x66, 0x6f, 0x44, 0x71, 0x50, 0x34, 0x44, 0x70, + 0x2f, 0x34, 0x44, 0x70, 0x76, 0x34, 0x44, 0x70, 0x52, 0x49, 0x44, 0x70, 0x50, 0x34, 0x44, 0x6f, 0x36, 0x49, + 0x4f, 0x42, 0x61, 0x4d, 0x79, 0x41, 0x36, 0x49, 0x4f, 0x41, 0x36, 0x46, 0x6b, 0x41, 0x36, 0x43, 0x4b, 0x51, + 0x51, 0x57, 0x67, 0x6c, 0x67, 0x4f, 0x66, 0x2f, 0x67, 0x4f, 0x65, 0x6e, 0x51, 0x77, 0x46, 0x6e, 0x76, 0x34, + 0x44, 0x0a, + 0x09, 0x6e, 0x51, 0x77, 0x44, 0x6e, 0x4a, 0x73, 0x5a, 0x42, 0x5a, 0x78, 0x6b, 0x41, 0x35, 0x75, 0x61, 0x45, + 0x41, 0x57, 0x62, 0x47, 0x51, 0x4f, 0x61, 0x45, 0x41, 0x4f, 0x5a, 0x43, 0x67, 0x4f, 0x59, 0x2f, 0x67, 0x4f, + 0x58, 0x6c, 0x67, 0x30, 0x46, 0x6c, 0x2f, 0x34, 0x44, 0x6c, 0x67, 0x30, 0x44, 0x6c, 0x59, 0x70, 0x42, 0x42, + 0x5a, 0x57, 0x57, 0x41, 0x35, 0x53, 0x54, 0x44, 0x67, 0x57, 0x55, 0x4b, 0x41, 0x4f, 0x54, 0x44, 0x67, 0x4f, + 0x53, 0x0a, + 0x09, 0x2b, 0x67, 0x4f, 0x52, 0x6b, 0x4c, 0x73, 0x46, 0x6b, 0x66, 0x34, 0x44, 0x6b, 0x49, 0x39, 0x64, 0x42, + 0x5a, 0x43, 0x37, 0x41, 0x35, 0x43, 0x41, 0x42, 0x49, 0x2b, 0x4f, 0x4a, 0x51, 0x57, 0x50, 0x58, 0x51, 0x4f, + 0x50, 0x51, 0x41, 0x53, 0x4f, 0x4a, 0x51, 0x4f, 0x4e, 0x2f, 0x67, 0x4f, 0x4d, 0x69, 0x79, 0x34, 0x46, 0x6a, + 0x50, 0x34, 0x44, 0x69, 0x79, 0x34, 0x44, 0x69, 0x6f, 0x59, 0x6c, 0x42, 0x59, 0x70, 0x42, 0x41, 0x34, 0x6d, + 0x49, 0x0a, + 0x09, 0x43, 0x77, 0x57, 0x4a, 0x46, 0x41, 0x4f, 0x49, 0x43, 0x77, 0x4f, 0x48, 0x68, 0x69, 0x55, 0x46, 0x68, + 0x32, 0x51, 0x44, 0x68, 0x6f, 0x55, 0x52, 0x42, 0x59, 0x59, 0x6c, 0x41, 0x34, 0x55, 0x52, 0x41, 0x34, 0x54, + 0x2b, 0x41, 0x34, 0x4f, 0x43, 0x45, 0x51, 0x57, 0x44, 0x2f, 0x67, 0x4f, 0x43, 0x45, 0x51, 0x4f, 0x42, 0x2f, + 0x67, 0x4f, 0x41, 0x2f, 0x67, 0x4e, 0x2f, 0x2f, 0x67, 0x4e, 0x41, 0x2f, 0x33, 0x35, 0x39, 0x66, 0x51, 0x56, + 0x2b, 0x0a, + 0x09, 0x2f, 0x67, 0x4e, 0x39, 0x66, 0x51, 0x4e, 0x38, 0x5a, 0x41, 0x4e, 0x37, 0x56, 0x42, 0x55, 0x46, 0x65, + 0x79, 0x55, 0x44, 0x65, 0x76, 0x34, 0x44, 0x65, 0x66, 0x34, 0x44, 0x65, 0x41, 0x34, 0x44, 0x64, 0x77, 0x77, + 0x44, 0x64, 0x67, 0x6f, 0x44, 0x64, 0x66, 0x34, 0x44, 0x64, 0x50, 0x6f, 0x44, 0x63, 0x2f, 0x6f, 0x44, 0x63, + 0x76, 0x6f, 0x44, 0x63, 0x66, 0x6f, 0x44, 0x63, 0x50, 0x34, 0x44, 0x62, 0x2f, 0x34, 0x44, 0x62, 0x76, 0x34, + 0x44, 0x0a, + 0x09, 0x62, 0x43, 0x45, 0x44, 0x61, 0x2f, 0x34, 0x44, 0x61, 0x68, 0x46, 0x43, 0x42, 0x57, 0x70, 0x54, 0x41, + 0x32, 0x6e, 0x2b, 0x41, 0x32, 0x68, 0x39, 0x41, 0x32, 0x63, 0x52, 0x51, 0x67, 0x56, 0x6d, 0x2f, 0x67, 0x4e, + 0x6c, 0x2f, 0x67, 0x4e, 0x6b, 0x2f, 0x67, 0x4e, 0x6a, 0x2f, 0x67, 0x4e, 0x69, 0x2f, 0x67, 0x4e, 0x68, 0x4f, + 0x67, 0x4e, 0x67, 0x2b, 0x67, 0x4e, 0x65, 0x44, 0x41, 0x4e, 0x64, 0x2f, 0x67, 0x4e, 0x62, 0x2f, 0x67, 0x4e, + 0x61, 0x0a, + 0x09, 0x2f, 0x67, 0x4e, 0x5a, 0x57, 0x41, 0x6f, 0x46, 0x57, 0x66, 0x6f, 0x44, 0x57, 0x41, 0x6f, 0x44, 0x56, + 0x78, 0x59, 0x5a, 0x42, 0x56, 0x63, 0x79, 0x41, 0x31, 0x62, 0x2b, 0x41, 0x31, 0x56, 0x55, 0x46, 0x51, 0x56, + 0x56, 0x51, 0x67, 0x4e, 0x55, 0x46, 0x51, 0x4e, 0x54, 0x41, 0x52, 0x41, 0x46, 0x55, 0x78, 0x67, 0x44, 0x55, + 0x68, 0x51, 0x44, 0x55, 0x55, 0x6f, 0x54, 0x42, 0x56, 0x48, 0x2b, 0x41, 0x31, 0x41, 0x4c, 0x41, 0x30, 0x2f, + 0x2b, 0x0a, + 0x09, 0x41, 0x30, 0x35, 0x4e, 0x45, 0x41, 0x56, 0x4f, 0x2f, 0x67, 0x4e, 0x4e, 0x45, 0x41, 0x4e, 0x4d, 0x2f, + 0x67, 0x4e, 0x4c, 0x53, 0x68, 0x4d, 0x46, 0x53, 0x2f, 0x34, 0x44, 0x53, 0x6b, 0x6b, 0x51, 0x42, 0x55, 0x6f, + 0x54, 0x41, 0x30, 0x6b, 0x64, 0x44, 0x51, 0x56, 0x4a, 0x45, 0x41, 0x4e, 0x49, 0x44, 0x51, 0x4e, 0x48, 0x2f, + 0x67, 0x4e, 0x47, 0x6c, 0x67, 0x4e, 0x46, 0x6c, 0x67, 0x4e, 0x45, 0x2f, 0x67, 0x4e, 0x44, 0x41, 0x69, 0x30, + 0x46, 0x0a, + 0x09, 0x51, 0x2f, 0x6f, 0x44, 0x51, 0x72, 0x73, 0x44, 0x51, 0x55, 0x73, 0x44, 0x51, 0x50, 0x34, 0x44, 0x50, + 0x2f, 0x34, 0x44, 0x50, 0x6a, 0x30, 0x53, 0x42, 0x54, 0x34, 0x55, 0x41, 0x7a, 0x30, 0x38, 0x44, 0x77, 0x55, + 0x39, 0x45, 0x67, 0x4d, 0x38, 0x4f, 0x77, 0x30, 0x46, 0x50, 0x45, 0x44, 0x2f, 0x44, 0x77, 0x4d, 0x37, 0x44, + 0x51, 0x4d, 0x36, 0x2f, 0x67, 0x4d, 0x35, 0x2f, 0x67, 0x4d, 0x34, 0x4e, 0x78, 0x51, 0x46, 0x4f, 0x50, 0x6f, + 0x44, 0x0a, + 0x09, 0x4e, 0x7a, 0x59, 0x51, 0x42, 0x54, 0x63, 0x55, 0x41, 0x7a, 0x59, 0x31, 0x43, 0x77, 0x55, 0x32, 0x45, + 0x41, 0x4d, 0x31, 0x43, 0x77, 0x4d, 0x30, 0x48, 0x67, 0x4d, 0x7a, 0x44, 0x51, 0x4d, 0x79, 0x4d, 0x51, 0x73, + 0x46, 0x4d, 0x76, 0x34, 0x44, 0x4d, 0x51, 0x73, 0x44, 0x4d, 0x43, 0x38, 0x4c, 0x42, 0x54, 0x41, 0x4e, 0x41, + 0x79, 0x38, 0x4c, 0x41, 0x79, 0x34, 0x74, 0x43, 0x51, 0x55, 0x75, 0x45, 0x41, 0x4d, 0x74, 0x43, 0x51, 0x4d, + 0x73, 0x0a, + 0x09, 0x4d, 0x67, 0x4d, 0x72, 0x4b, 0x69, 0x55, 0x46, 0x4b, 0x32, 0x51, 0x44, 0x4b, 0x69, 0x6b, 0x53, 0x42, + 0x53, 0x6f, 0x6c, 0x41, 0x79, 0x6b, 0x53, 0x41, 0x79, 0x67, 0x6e, 0x4a, 0x51, 0x55, 0x6f, 0x51, 0x51, 0x4d, + 0x6e, 0x4a, 0x51, 0x4d, 0x6d, 0x4a, 0x51, 0x73, 0x46, 0x4a, 0x67, 0x38, 0x44, 0x4a, 0x51, 0x73, 0x44, 0x4a, + 0x50, 0x34, 0x44, 0x49, 0x2f, 0x34, 0x44, 0x49, 0x67, 0x38, 0x44, 0x49, 0x51, 0x45, 0x51, 0x42, 0x53, 0x45, + 0x53, 0x0a, + 0x09, 0x41, 0x79, 0x42, 0x6b, 0x41, 0x78, 0x2f, 0x36, 0x41, 0x78, 0x34, 0x64, 0x44, 0x51, 0x55, 0x65, 0x5a, + 0x41, 0x4d, 0x64, 0x44, 0x51, 0x4d, 0x63, 0x45, 0x55, 0x49, 0x46, 0x48, 0x50, 0x34, 0x44, 0x47, 0x2f, 0x6f, + 0x44, 0x47, 0x6b, 0x49, 0x44, 0x47, 0x52, 0x46, 0x43, 0x42, 0x52, 0x6e, 0x2b, 0x41, 0x78, 0x68, 0x6b, 0x41, + 0x78, 0x63, 0x57, 0x47, 0x51, 0x55, 0x58, 0x2f, 0x67, 0x4d, 0x57, 0x41, 0x52, 0x41, 0x46, 0x46, 0x68, 0x6b, + 0x44, 0x0a, + 0x09, 0x46, 0x66, 0x34, 0x44, 0x46, 0x50, 0x34, 0x44, 0x45, 0x2f, 0x34, 0x44, 0x45, 0x68, 0x46, 0x43, 0x42, + 0x52, 0x4c, 0x2b, 0x41, 0x78, 0x45, 0x43, 0x4c, 0x51, 0x55, 0x52, 0x51, 0x67, 0x4d, 0x51, 0x66, 0x51, 0x4d, + 0x50, 0x5a, 0x41, 0x4d, 0x4f, 0x2f, 0x67, 0x4d, 0x4e, 0x44, 0x42, 0x59, 0x46, 0x44, 0x66, 0x34, 0x44, 0x44, + 0x41, 0x45, 0x51, 0x42, 0x51, 0x77, 0x57, 0x41, 0x77, 0x76, 0x2b, 0x41, 0x77, 0x6f, 0x51, 0x41, 0x77, 0x6e, + 0x2b, 0x0a, + 0x09, 0x41, 0x77, 0x67, 0x43, 0x4c, 0x51, 0x55, 0x49, 0x2f, 0x67, 0x4d, 0x48, 0x46, 0x41, 0x4d, 0x47, 0x5a, + 0x41, 0x4d, 0x45, 0x41, 0x52, 0x41, 0x46, 0x42, 0x50, 0x34, 0x44, 0x51, 0x42, 0x55, 0x44, 0x41, 0x69, 0x30, + 0x46, 0x41, 0x2f, 0x34, 0x44, 0x41, 0x67, 0x45, 0x51, 0x42, 0x51, 0x49, 0x74, 0x41, 0x77, 0x45, 0x51, 0x41, + 0x77, 0x44, 0x2b, 0x41, 0x77, 0x47, 0x34, 0x41, 0x57, 0x53, 0x46, 0x6a, 0x51, 0x45, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x0a, + 0x09, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x0a, + 0x09, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x0a, + 0x09, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x41, 0x0a, + 0x09, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x0a, + 0x09, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x0a, + 0x09, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, + 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, + 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x79, 0x73, 0x72, 0x4b, 0x78, 0x32, 0x32, 0x42, 0x67, 0x55, + 0x45, 0x0a, + 0x09, 0x41, 0x77, 0x49, 0x42, 0x41, 0x43, 0x77, 0x67, 0x45, 0x4c, 0x41, 0x43, 0x4a, 0x55, 0x6c, 0x6b, 0x73, + 0x45, 0x42, 0x52, 0x57, 0x43, 0x44, 0x49, 0x57, 0x53, 0x45, 0x74, 0x4c, 0x4c, 0x41, 0x43, 0x4a, 0x55, 0x6c, + 0x6b, 0x73, 0x45, 0x42, 0x52, 0x57, 0x43, 0x44, 0x49, 0x57, 0x53, 0x45, 0x74, 0x4c, 0x43, 0x41, 0x51, 0x42, + 0x79, 0x43, 0x77, 0x41, 0x46, 0x43, 0x77, 0x44, 0x58, 0x6b, 0x67, 0x75, 0x50, 0x2f, 0x2f, 0x55, 0x46, 0x67, + 0x45, 0x0a, + 0x09, 0x47, 0x77, 0x56, 0x5a, 0x73, 0x41, 0x55, 0x63, 0x73, 0x41, 0x4d, 0x6c, 0x43, 0x4c, 0x41, 0x45, 0x4a, + 0x53, 0x50, 0x68, 0x49, 0x4c, 0x41, 0x41, 0x55, 0x4c, 0x41, 0x4e, 0x65, 0x53, 0x43, 0x34, 0x2f, 0x2f, 0x39, + 0x51, 0x57, 0x41, 0x51, 0x62, 0x42, 0x56, 0x6d, 0x77, 0x42, 0x52, 0x79, 0x77, 0x41, 0x79, 0x55, 0x49, 0x34, + 0x53, 0x30, 0x73, 0x53, 0x31, 0x42, 0x59, 0x49, 0x4c, 0x44, 0x39, 0x52, 0x55, 0x52, 0x5a, 0x49, 0x53, 0x30, + 0x73, 0x0a, + 0x09, 0x73, 0x41, 0x49, 0x6c, 0x52, 0x57, 0x42, 0x45, 0x4c, 0x53, 0x78, 0x4c, 0x55, 0x31, 0x69, 0x77, 0x41, + 0x69, 0x57, 0x77, 0x41, 0x69, 0x56, 0x46, 0x52, 0x46, 0x6b, 0x68, 0x49, 0x53, 0x30, 0x73, 0x52, 0x55, 0x51, + 0x74, 0x41, 0x41, 0x41, 0x43, 0x41, 0x47, 0x62, 0x2b, 0x6c, 0x67, 0x52, 0x6d, 0x42, 0x61, 0x51, 0x41, 0x41, + 0x77, 0x41, 0x48, 0x41, 0x42, 0x70, 0x41, 0x44, 0x41, 0x54, 0x37, 0x41, 0x41, 0x62, 0x37, 0x41, 0x51, 0x67, + 0x46, 0x0a, + 0x09, 0x66, 0x77, 0x49, 0x45, 0x41, 0x43, 0x2f, 0x45, 0x31, 0x4f, 0x77, 0x78, 0x41, 0x42, 0x44, 0x55, 0x37, + 0x4e, 0x54, 0x73, 0x4d, 0x42, 0x4d, 0x52, 0x49, 0x52, 0x45, 0x6c, 0x49, 0x52, 0x45, 0x68, 0x5a, 0x67, 0x51, + 0x41, 0x2f, 0x48, 0x4d, 0x44, 0x47, 0x2f, 0x7a, 0x6c, 0x2f, 0x70, 0x59, 0x48, 0x44, 0x76, 0x6a, 0x79, 0x63, + 0x67, 0x59, 0x70, 0x41, 0x41, 0x49, 0x42, 0x4e, 0x51, 0x41, 0x41, 0x41, 0x67, 0x41, 0x46, 0x31, 0x51, 0x41, + 0x44, 0x0a, + 0x09, 0x41, 0x41, 0x6b, 0x41, 0x51, 0x45, 0x41, 0x50, 0x42, 0x77, 0x43, 0x44, 0x42, 0x49, 0x45, 0x43, 0x43, + 0x41, 0x63, 0x46, 0x41, 0x51, 0x4d, 0x45, 0x41, 0x41, 0x41, 0x4b, 0x45, 0x50, 0x77, 0x38, 0x37, 0x44, 0x49, + 0x35, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x2b, 0x54, 0x38, 0x7a, 0x44, 0x41, 0x42, 0x53, 0x37, 0x41, 0x4c, 0x56, + 0x46, 0x69, 0x39, 0x41, 0x41, 0x6f, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x41, 0x6f, 0x41, 0x43, 0x76, 0x2f, + 0x41, 0x0a, + 0x09, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6d, 0x32, 0x41, 0x41, 0x73, 0x67, 0x43, 0x31, 0x41, 0x4c, 0x41, + 0x31, 0x30, 0x6c, 0x4d, 0x78, 0x55, 0x6a, 0x45, 0x54, 0x4d, 0x52, 0x41, 0x79, 0x4d, 0x44, 0x41, 0x54, 0x58, + 0x4c, 0x79, 0x38, 0x73, 0x55, 0x6f, 0x68, 0x58, 0x2b, 0x2f, 0x67, 0x58, 0x56, 0x2f, 0x58, 0x48, 0x2b, 0x6d, + 0x77, 0x46, 0x6c, 0x41, 0x41, 0x49, 0x41, 0x78, 0x51, 0x4f, 0x71, 0x41, 0x75, 0x6b, 0x46, 0x31, 0x51, 0x41, + 0x44, 0x0a, + 0x09, 0x41, 0x41, 0x63, 0x41, 0x54, 0x55, 0x41, 0x50, 0x42, 0x51, 0x47, 0x45, 0x42, 0x41, 0x43, 0x42, 0x43, + 0x41, 0x51, 0x46, 0x42, 0x67, 0x41, 0x46, 0x41, 0x67, 0x51, 0x49, 0x45, 0x50, 0x7a, 0x38, 0x33, 0x4f, 0x77, + 0x78, 0x41, 0x42, 0x44, 0x30, 0x50, 0x4f, 0x77, 0x79, 0x4d, 0x41, 0x46, 0x4c, 0x73, 0x42, 0x4a, 0x55, 0x53, + 0x37, 0x41, 0x54, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x49, 0x41, 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x49, 0x0a, + 0x09, 0x41, 0x41, 0x6a, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x51, 0x41, 0x38, 0x77, 0x43, + 0x55, 0x41, 0x4a, 0x55, 0x41, 0x6c, 0x67, 0x43, 0x58, 0x41, 0x4a, 0x6f, 0x41, 0x6d, 0x2f, 0x43, 0x51, 0x64, + 0x64, 0x41, 0x52, 0x45, 0x6a, 0x45, 0x53, 0x45, 0x52, 0x49, 0x78, 0x45, 0x42, 0x62, 0x36, 0x6f, 0x43, 0x4a, + 0x4b, 0x6f, 0x46, 0x31, 0x66, 0x33, 0x56, 0x41, 0x69, 0x76, 0x39, 0x31, 0x51, 0x49, 0x72, 0x41, 0x41, 0x41, + 0x43, 0x0a, + 0x09, 0x41, 0x4a, 0x34, 0x41, 0x41, 0x41, 0x59, 0x58, 0x42, 0x62, 0x34, 0x41, 0x41, 0x77, 0x41, 0x66, 0x41, + 0x47, 0x42, 0x41, 0x4d, 0x52, 0x73, 0x4c, 0x41, 0x49, 0x63, 0x48, 0x42, 0x42, 0x30, 0x4a, 0x42, 0x52, 0x6b, + 0x4e, 0x41, 0x6f, 0x63, 0x58, 0x45, 0x77, 0x38, 0x56, 0x45, 0x52, 0x38, 0x65, 0x48, 0x42, 0x73, 0x61, 0x46, + 0x78, 0x59, 0x56, 0x46, 0x42, 0x4d, 0x53, 0x45, 0x52, 0x41, 0x4f, 0x44, 0x51, 0x77, 0x4a, 0x43, 0x41, 0x63, + 0x47, 0x0a, + 0x09, 0x42, 0x51, 0x51, 0x44, 0x41, 0x67, 0x45, 0x41, 0x47, 0x67, 0x6f, 0x59, 0x42, 0x69, 0x41, 0x51, 0x2f, + 0x4d, 0x77, 0x58, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x7a, 0x7a, 0x55, 0x50, 0x44, 0x7a, 0x38, 0x50, 0x44, 0x7a, + 0x55, 0x50, 0x44, 0x7a, 0x45, 0x4d, 0x75, 0x77, 0x79, 0x4d, 0x6a, 0x42, 0x41, 0x45, 0x51, 0x73, 0x42, 0x43, + 0x77, 0x49, 0x4c, 0x44, 0x41, 0x73, 0x4e, 0x46, 0x41, 0x51, 0x61, 0x45, 0x52, 0x6f, 0x53, 0x46, 0x42, 0x38, + 0x49, 0x0a, + 0x09, 0x41, 0x56, 0x30, 0x42, 0x49, 0x51, 0x4d, 0x68, 0x43, 0x77, 0x45, 0x68, 0x45, 0x7a, 0x4d, 0x44, 0x49, + 0x52, 0x55, 0x68, 0x41, 0x79, 0x45, 0x56, 0x49, 0x51, 0x4d, 0x6a, 0x45, 0x79, 0x45, 0x44, 0x49, 0x78, 0x4d, + 0x68, 0x4e, 0x53, 0x45, 0x54, 0x49, 0x54, 0x55, 0x68, 0x45, 0x77, 0x51, 0x58, 0x2f, 0x74, 0x31, 0x55, 0x41, + 0x53, 0x56, 0x45, 0x61, 0x41, 0x45, 0x6b, 0x61, 0x61, 0x42, 0x6e, 0x41, 0x54, 0x6a, 0x2b, 0x6f, 0x56, 0x49, + 0x42, 0x0a, + 0x09, 0x50, 0x76, 0x36, 0x62, 0x61, 0x4b, 0x42, 0x6e, 0x2f, 0x74, 0x74, 0x6e, 0x6f, 0x57, 0x6a, 0x2b, 0x78, + 0x51, 0x46, 0x67, 0x56, 0x50, 0x36, 0x2b, 0x41, 0x57, 0x6c, 0x6d, 0x41, 0x34, 0x58, 0x2b, 0x73, 0x67, 0x4f, + 0x48, 0x2f, 0x6d, 0x45, 0x42, 0x6e, 0x2f, 0x35, 0x68, 0x6d, 0x76, 0x36, 0x79, 0x6d, 0x66, 0x35, 0x69, 0x41, + 0x5a, 0x37, 0x2b, 0x59, 0x67, 0x47, 0x65, 0x6d, 0x51, 0x46, 0x4f, 0x6d, 0x67, 0x47, 0x66, 0x41, 0x41, 0x41, + 0x44, 0x0a, + 0x09, 0x41, 0x4b, 0x72, 0x2b, 0x30, 0x77, 0x52, 0x74, 0x42, 0x68, 0x51, 0x41, 0x49, 0x51, 0x41, 0x6f, 0x41, + 0x43, 0x38, 0x41, 0x31, 0x55, 0x42, 0x56, 0x49, 0x67, 0x49, 0x4b, 0x43, 0x77, 0x6f, 0x6e, 0x41, 0x53, 0x59, + 0x6f, 0x41, 0x67, 0x73, 0x4c, 0x43, 0x68, 0x30, 0x42, 0x48, 0x68, 0x77, 0x43, 0x4c, 0x79, 0x6b, 0x76, 0x47, + 0x77, 0x49, 0x70, 0x4b, 0x53, 0x39, 0x43, 0x45, 0x78, 0x45, 0x51, 0x49, 0x67, 0x6f, 0x62, 0x4b, 0x51, 0x51, + 0x58, 0x0a, + 0x09, 0x42, 0x67, 0x6b, 0x71, 0x49, 0x51, 0x55, 0x43, 0x46, 0x34, 0x59, 0x57, 0x42, 0x6f, 0x59, 0x46, 0x45, + 0x53, 0x4d, 0x61, 0x69, 0x68, 0x61, 0x4a, 0x45, 0x41, 0x41, 0x71, 0x69, 0x67, 0x57, 0x4a, 0x41, 0x69, 0x30, + 0x49, 0x46, 0x67, 0x6f, 0x65, 0x42, 0x79, 0x6b, 0x61, 0x45, 0x67, 0x4d, 0x41, 0x43, 0x53, 0x49, 0x51, 0x43, + 0x51, 0x4d, 0x42, 0x42, 0x79, 0x59, 0x49, 0x44, 0x51, 0x55, 0x47, 0x4d, 0x42, 0x44, 0x38, 0x50, 0x4f, 0x7a, + 0x30, 0x0a, + 0x09, 0x46, 0x7a, 0x7a, 0x38, 0x46, 0x7a, 0x7a, 0x30, 0x35, 0x4f, 0x77, 0x78, 0x41, 0x43, 0x2f, 0x6b, 0x37, + 0x4d, 0x54, 0x55, 0x35, 0x4f, 0x77, 0x79, 0x78, 0x42, 0x44, 0x75, 0x45, 0x4f, 0x34, 0x52, 0x45, 0x6a, 0x6b, + 0x52, 0x4f, 0x52, 0x45, 0x53, 0x46, 0x7a, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, + 0x78, 0x41, 0x45, 0x37, 0x51, 0x63, 0x51, 0x44, 0x75, 0x30, 0x52, 0x46, 0x7a, 0x6b, 0x48, 0x45, 0x41, 0x37, + 0x74, 0x0a, + 0x09, 0x45, 0x52, 0x63, 0x35, 0x42, 0x78, 0x41, 0x45, 0x37, 0x56, 0x6b, 0x69, 0x41, 0x55, 0x75, 0x77, 0x43, + 0x56, 0x52, 0x59, 0x76, 0x51, 0x41, 0x77, 0x41, 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x77, 0x41, 0x44, 0x44, + 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x55, 0x75, 0x77, 0x44, 0x46, 0x52, 0x4c, 0x73, + 0x42, 0x42, 0x55, 0x57, 0x30, 0x75, 0x77, 0x44, 0x31, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x4d, 0x50, 0x2f, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x4d, 0x41, 0x41, 0x77, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, + 0x51, 0x45, 0x6a, 0x41, 0x79, 0x34, 0x42, 0x4a, 0x7a, 0x55, 0x65, 0x41, 0x52, 0x63, 0x52, 0x4c, 0x67, 0x45, + 0x31, 0x4e, 0x44, 0x59, 0x33, 0x4e, 0x54, 0x4d, 0x56, 0x48, 0x67, 0x45, 0x58, 0x46, 0x53, 0x34, 0x42, 0x4a, + 0x78, 0x45, 0x65, 0x41, 0x52, 0x55, 0x55, 0x42, 0x67, 0x63, 0x44, 0x45, 0x51, 0x34, 0x42, 0x46, 0x52, 0x51, + 0x57, 0x0a, + 0x09, 0x46, 0x78, 0x45, 0x2b, 0x41, 0x54, 0x55, 0x30, 0x4a, 0x67, 0x4b, 0x30, 0x5a, 0x41, 0x46, 0x70, 0x30, + 0x6d, 0x70, 0x6d, 0x30, 0x57, 0x2f, 0x64, 0x79, 0x64, 0x72, 0x4d, 0x5a, 0x46, 0x32, 0x75, 0x55, 0x31, 0x4f, + 0x76, 0x58, 0x4f, 0x50, 0x57, 0x34, 0x39, 0x5a, 0x6b, 0x64, 0x48, 0x70, 0x78, 0x34, 0x58, 0x2b, 0x42, 0x65, + 0x2f, 0x37, 0x54, 0x41, 0x53, 0x30, 0x43, 0x4c, 0x53, 0x32, 0x30, 0x51, 0x45, 0x45, 0x42, 0x41, 0x63, 0x67, + 0x6b, 0x0a, + 0x09, 0x72, 0x4a, 0x61, 0x6a, 0x76, 0x41, 0x37, 0x72, 0x36, 0x41, 0x51, 0x66, 0x47, 0x36, 0x38, 0x71, 0x4c, + 0x67, 0x54, 0x2b, 0x56, 0x53, 0x4f, 0x30, 0x6e, 0x4b, 0x6e, 0x44, 0x44, 0x77, 0x4d, 0x41, 0x41, 0x5a, 0x6f, + 0x4e, 0x61, 0x6c, 0x68, 0x57, 0x59, 0x4e, 0x58, 0x2b, 0x54, 0x78, 0x46, 0x75, 0x57, 0x6c, 0x68, 0x6f, 0x41, + 0x41, 0x41, 0x46, 0x41, 0x48, 0x48, 0x2f, 0x34, 0x77, 0x63, 0x70, 0x42, 0x66, 0x41, 0x41, 0x43, 0x77, 0x41, + 0x58, 0x0a, + 0x09, 0x41, 0x43, 0x4d, 0x41, 0x4a, 0x77, 0x41, 0x7a, 0x41, 0x4a, 0x56, 0x41, 0x4e, 0x69, 0x51, 0x50, 0x4a, + 0x53, 0x59, 0x6c, 0x4a, 0x67, 0x38, 0x6e, 0x4a, 0x43, 0x64, 0x43, 0x41, 0x4a, 0x49, 0x4d, 0x48, 0x70, 0x49, + 0x75, 0x6a, 0x52, 0x69, 0x53, 0x4a, 0x41, 0x61, 0x53, 0x44, 0x49, 0x30, 0x6d, 0x45, 0x6f, 0x77, 0x6f, 0x4a, + 0x4a, 0x45, 0x30, 0x4a, 0x79, 0x45, 0x62, 0x4a, 0x51, 0x6b, 0x44, 0x44, 0x52, 0x55, 0x4f, 0x43, 0x51, 0x30, + 0x50, 0x0a, + 0x09, 0x49, 0x51, 0x30, 0x72, 0x44, 0x68, 0x73, 0x4e, 0x44, 0x7a, 0x45, 0x4c, 0x4e, 0x42, 0x44, 0x38, 0x78, + 0x4f, 0x7a, 0x30, 0x37, 0x42, 0x44, 0x75, 0x39, 0x75, 0x34, 0x52, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x45, + 0x41, 0x45, 0x4f, 0x51, 0x79, 0x39, 0x44, 0x7a, 0x6b, 0x37, 0x42, 0x44, 0x75, 0x39, 0x75, 0x34, 0x51, 0x37, + 0x6a, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x56, 0x6b, + 0x69, 0x0a, + 0x09, 0x41, 0x55, 0x75, 0x77, 0x43, 0x56, 0x52, 0x4c, 0x73, 0x41, 0x74, 0x55, 0x57, 0x30, 0x75, 0x77, 0x44, + 0x46, 0x52, 0x62, 0x53, 0x37, 0x41, 0x55, 0x56, 0x46, 0x74, 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, 0x30, 0x75, + 0x77, 0x44, 0x56, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x4e, 0x41, 0x42, 0x41, 0x41, 0x41, 0x45, 0x41, 0x4e, + 0x41, 0x41, 0x30, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x45, 0x69, 0x42, 0x68, 0x55, + 0x55, 0x0a, + 0x09, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x63, 0x79, 0x46, 0x68, 0x55, 0x55, 0x42, + 0x69, 0x4d, 0x69, 0x4a, 0x6a, 0x55, 0x30, 0x4e, 0x67, 0x45, 0x69, 0x42, 0x68, 0x55, 0x55, 0x46, 0x6a, 0x4d, + 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x55, 0x7a, 0x41, 0x53, 0x4d, 0x54, 0x4d, 0x68, 0x59, 0x56, 0x46, + 0x41, 0x59, 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x46, 0x30, 0x56, 0x64, 0x6a, 0x59, 0x31, 0x64, + 0x56, 0x0a, + 0x09, 0x59, 0x32, 0x4e, 0x56, 0x6e, 0x72, 0x71, 0x37, 0x6e, 0x61, 0x43, 0x36, 0x75, 0x2f, 0x79, 0x58, 0x56, + 0x6d, 0x4e, 0x69, 0x56, 0x31, 0x64, 0x6a, 0x5a, 0x41, 0x4d, 0x78, 0x6f, 0x50, 0x78, 0x61, 0x6f, 0x42, 0x2b, + 0x65, 0x76, 0x4c, 0x75, 0x66, 0x6e, 0x37, 0x6d, 0x36, 0x41, 0x70, 0x47, 0x55, 0x68, 0x49, 0x4b, 0x56, 0x6c, + 0x59, 0x4b, 0x44, 0x6c, 0x58, 0x2f, 0x63, 0x75, 0x37, 0x76, 0x62, 0x32, 0x37, 0x75, 0x38, 0x32, 0x77, 0x4a, + 0x68, 0x0a, + 0x09, 0x6c, 0x59, 0x4b, 0x45, 0x6c, 0x4a, 0x53, 0x45, 0x67, 0x5a, 0x5a, 0x2f, 0x2b, 0x66, 0x4d, 0x47, 0x44, + 0x64, 0x75, 0x37, 0x76, 0x64, 0x72, 0x62, 0x76, 0x4c, 0x72, 0x63, 0x41, 0x41, 0x41, 0x43, 0x41, 0x49, 0x48, + 0x2f, 0x34, 0x77, 0x58, 0x2b, 0x42, 0x66, 0x41, 0x41, 0x43, 0x51, 0x41, 0x77, 0x41, 0x63, 0x31, 0x41, 0x6c, + 0x67, 0x30, 0x42, 0x44, 0x67, 0x79, 0x47, 0x45, 0x52, 0x49, 0x52, 0x43, 0x34, 0x59, 0x4b, 0x43, 0x78, 0x49, + 0x53, 0x0a, + 0x09, 0x45, 0x51, 0x6d, 0x47, 0x41, 0x41, 0x6b, 0x56, 0x46, 0x68, 0x55, 0x48, 0x41, 0x51, 0x59, 0x49, 0x68, + 0x68, 0x59, 0x57, 0x46, 0x51, 0x49, 0x42, 0x41, 0x77, 0x47, 0x47, 0x48, 0x52, 0x34, 0x64, 0x41, 0x49, 0x59, + 0x4a, 0x41, 0x42, 0x34, 0x65, 0x48, 0x53, 0x41, 0x66, 0x41, 0x69, 0x45, 0x65, 0x45, 0x51, 0x6f, 0x54, 0x43, + 0x68, 0x63, 0x57, 0x46, 0x51, 0x4d, 0x59, 0x46, 0x42, 0x45, 0x54, 0x43, 0x67, 0x63, 0x49, 0x41, 0x67, 0x59, + 0x4a, 0x0a, + 0x09, 0x45, 0x52, 0x4d, 0x54, 0x43, 0x67, 0x49, 0x42, 0x41, 0x67, 0x4d, 0x41, 0x45, 0x51, 0x6f, 0x54, 0x43, + 0x68, 0x63, 0x57, 0x41, 0x68, 0x67, 0x56, 0x45, 0x52, 0x4d, 0x4b, 0x46, 0x42, 0x45, 0x54, 0x45, 0x77, 0x70, + 0x43, 0x45, 0x67, 0x73, 0x4a, 0x41, 0x77, 0x59, 0x41, 0x43, 0x68, 0x34, 0x44, 0x4b, 0x42, 0x55, 0x4f, 0x42, + 0x69, 0x67, 0x6e, 0x42, 0x70, 0x55, 0x59, 0x4b, 0x35, 0x55, 0x6e, 0x6c, 0x43, 0x53, 0x52, 0x47, 0x49, 0x77, + 0x4f, 0x0a, + 0x09, 0x45, 0x77, 0x6f, 0x75, 0x43, 0x77, 0x34, 0x4a, 0x41, 0x43, 0x34, 0x53, 0x46, 0x53, 0x63, 0x4f, 0x48, + 0x67, 0x4d, 0x75, 0x45, 0x69, 0x63, 0x68, 0x44, 0x68, 0x45, 0x50, 0x45, 0x79, 0x45, 0x44, 0x45, 0x68, 0x73, + 0x51, 0x4d, 0x52, 0x44, 0x38, 0x37, 0x4d, 0x54, 0x55, 0x31, 0x4f, 0x77, 0x51, 0x78, 0x75, 0x34, 0x52, 0x4f, + 0x52, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x52, 0x4f, 0x54, 0x6b, 0x52, 0x4f, 0x52, 0x45, 0x35, 0x4d, 0x51, 0x41, + 0x76, 0x0a, + 0x09, 0x78, 0x75, 0x54, 0x32, 0x35, 0x75, 0x34, 0x51, 0x37, 0x68, 0x44, 0x47, 0x45, 0x52, 0x49, 0x35, 0x45, + 0x52, 0x63, 0x35, 0x45, 0x52, 0x63, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, 0x65, 0x30, + 0x48, 0x42, 0x65, 0x30, 0x52, 0x46, 0x7a, 0x6b, 0x48, 0x45, 0x41, 0x58, 0x74, 0x45, 0x52, 0x63, 0x35, 0x42, + 0x78, 0x41, 0x46, 0x37, 0x52, 0x45, 0x58, 0x4f, 0x51, 0x63, 0x46, 0x37, 0x52, 0x45, 0x58, 0x4f, 0x51, 0x63, + 0x51, 0x0a, + 0x09, 0x42, 0x65, 0x30, 0x52, 0x46, 0x7a, 0x6b, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x4f, 0x37, + 0x52, 0x45, 0x58, 0x4f, 0x51, 0x63, 0x51, 0x44, 0x75, 0x30, 0x52, 0x46, 0x7a, 0x6b, 0x48, 0x45, 0x41, 0x6a, + 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x44, 0x75, 0x30, 0x52, 0x46, 0x7a, 0x6c, 0x5a, 0x49, + 0x72, 0x49, 0x50, 0x4d, 0x67, 0x45, 0x42, 0x58, 0x55, 0x43, 0x79, 0x42, 0x77, 0x73, 0x46, 0x49, 0x67, 0x6b, + 0x70, 0x0a, + 0x09, 0x48, 0x41, 0x41, 0x63, 0x41, 0x52, 0x38, 0x43, 0x46, 0x77, 0x73, 0x71, 0x41, 0x43, 0x6f, 0x42, 0x4a, + 0x68, 0x49, 0x36, 0x41, 0x44, 0x51, 0x53, 0x52, 0x41, 0x74, 0x65, 0x41, 0x46, 0x6b, 0x42, 0x57, 0x67, 0x70, + 0x56, 0x45, 0x6c, 0x6f, 0x61, 0x57, 0x68, 0x39, 0x5a, 0x4d, 0x47, 0x63, 0x65, 0x65, 0x77, 0x43, 0x62, 0x41, + 0x4a, 0x6f, 0x42, 0x6d, 0x51, 0x4b, 0x58, 0x43, 0x4a, 0x55, 0x4c, 0x6b, 0x78, 0x57, 0x56, 0x46, 0x70, 0x55, + 0x69, 0x0a, + 0x09, 0x6d, 0x53, 0x30, 0x66, 0x43, 0x51, 0x73, 0x4a, 0x44, 0x41, 0x67, 0x52, 0x44, 0x43, 0x63, 0x4d, 0x4b, + 0x42, 0x67, 0x43, 0x47, 0x77, 0x6b, 0x5a, 0x43, 0x78, 0x6b, 0x4d, 0x47, 0x52, 0x45, 0x63, 0x46, 0x42, 0x77, + 0x56, 0x46, 0x68, 0x30, 0x66, 0x4d, 0x69, 0x63, 0x41, 0x4a, 0x77, 0x45, 0x70, 0x43, 0x53, 0x4d, 0x53, 0x4b, + 0x68, 0x4d, 0x71, 0x46, 0x43, 0x67, 0x56, 0x4c, 0x7a, 0x49, 0x37, 0x43, 0x54, 0x51, 0x53, 0x4f, 0x52, 0x4d, + 0x2f, 0x0a, + 0x09, 0x4d, 0x6b, 0x6f, 0x4a, 0x54, 0x42, 0x52, 0x4c, 0x46, 0x55, 0x59, 0x5a, 0x54, 0x7a, 0x4a, 0x57, 0x41, + 0x56, 0x6f, 0x4a, 0x57, 0x51, 0x78, 0x56, 0x45, 0x6c, 0x6b, 0x54, 0x58, 0x42, 0x39, 0x66, 0x4d, 0x6d, 0x6f, + 0x4d, 0x61, 0x52, 0x46, 0x67, 0x4d, 0x6e, 0x55, 0x42, 0x65, 0x51, 0x78, 0x36, 0x45, 0x5a, 0x4d, 0x41, 0x6b, + 0x77, 0x47, 0x58, 0x41, 0x70, 0x55, 0x46, 0x6e, 0x41, 0x65, 0x63, 0x43, 0x4a, 0x38, 0x49, 0x6d, 0x67, 0x6d, + 0x62, 0x0a, + 0x09, 0x43, 0x35, 0x6f, 0x4d, 0x6b, 0x44, 0x4b, 0x67, 0x4d, 0x72, 0x41, 0x79, 0x4f, 0x56, 0x30, 0x41, 0x58, + 0x51, 0x45, 0x4f, 0x41, 0x52, 0x55, 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x63, 0x4a, 0x41, 0x54, 0x34, + 0x42, 0x4e, 0x7a, 0x4d, 0x47, 0x41, 0x67, 0x63, 0x42, 0x49, 0x79, 0x63, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x41, + 0x44, 0x55, 0x30, 0x4e, 0x6a, 0x63, 0x75, 0x41, 0x54, 0x55, 0x30, 0x4e, 0x6a, 0x4d, 0x79, 0x46, 0x68, 0x63, + 0x56, 0x0a, + 0x09, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, 0x42, 0x59, 0x42, 0x38, 0x6c, 0x74, 0x56, 0x31, + 0x4b, 0x42, 0x66, 0x70, 0x6b, 0x6e, 0x2b, 0x65, 0x77, 0x48, 0x38, 0x4f, 0x30, 0x49, 0x47, 0x75, 0x67, 0x78, + 0x6f, 0x58, 0x51, 0x45, 0x58, 0x2f, 0x49, 0x39, 0x6f, 0x35, 0x49, 0x50, 0x78, 0x2f, 0x73, 0x36, 0x47, 0x68, + 0x6a, 0x41, 0x79, 0x33, 0x72, 0x68, 0x54, 0x70, 0x56, 0x56, 0x58, 0x6e, 0x6b, 0x52, 0x70, 0x67, 0x7a, 0x73, + 0x44, 0x0a, + 0x09, 0x49, 0x31, 0x47, 0x68, 0x57, 0x4a, 0x4c, 0x43, 0x50, 0x30, 0x41, 0x43, 0x6a, 0x2f, 0x33, 0x34, 0x57, + 0x63, 0x74, 0x79, 0x68, 0x50, 0x37, 0x2b, 0x66, 0x76, 0x37, 0x6a, 0x6b, 0x31, 0x6c, 0x58, 0x41, 0x52, 0x50, + 0x58, 0x67, 0x4f, 0x46, 0x6a, 0x50, 0x33, 0x30, 0x38, 0x6f, 0x73, 0x55, 0x6b, 0x4a, 0x4c, 0x59, 0x76, 0x4d, + 0x57, 0x39, 0x59, 0x4d, 0x32, 0x63, 0x41, 0x41, 0x51, 0x44, 0x46, 0x41, 0x36, 0x6f, 0x42, 0x62, 0x77, 0x58, + 0x56, 0x0a, + 0x09, 0x41, 0x41, 0x4d, 0x41, 0x51, 0x6b, 0x41, 0x4b, 0x41, 0x59, 0x51, 0x41, 0x67, 0x51, 0x51, 0x41, 0x42, + 0x51, 0x49, 0x45, 0x42, 0x42, 0x44, 0x38, 0x37, 0x44, 0x45, 0x41, 0x45, 0x50, 0x54, 0x73, 0x4d, 0x41, 0x46, + 0x4c, 0x73, 0x42, 0x4a, 0x55, 0x53, 0x37, 0x41, 0x54, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x45, 0x41, + 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x45, 0x41, 0x41, 0x54, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, + 0x5a, 0x0a, + 0x09, 0x51, 0x41, 0x31, 0x41, 0x42, 0x56, 0x41, 0x46, 0x59, 0x41, 0x56, 0x77, 0x42, 0x5a, 0x41, 0x46, 0x6f, + 0x41, 0x55, 0x47, 0x58, 0x51, 0x45, 0x52, 0x49, 0x78, 0x45, 0x42, 0x62, 0x36, 0x6f, 0x46, 0x31, 0x66, 0x33, + 0x56, 0x41, 0x69, 0x73, 0x41, 0x41, 0x41, 0x45, 0x41, 0x73, 0x50, 0x37, 0x79, 0x41, 0x6e, 0x73, 0x47, 0x45, + 0x67, 0x41, 0x4e, 0x41, 0x45, 0x39, 0x41, 0x44, 0x77, 0x61, 0x59, 0x41, 0x4a, 0x63, 0x4f, 0x44, 0x51, 0x63, + 0x41, 0x0a, + 0x09, 0x41, 0x78, 0x49, 0x47, 0x41, 0x42, 0x4d, 0x4b, 0x44, 0x68, 0x44, 0x63, 0x35, 0x44, 0x4c, 0x73, 0x45, + 0x54, 0x6b, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x2f, 0x4f, 0x77, 0x77, 0x41, 0x55, 0x75, 0x77, 0x45, 0x31, 0x52, + 0x59, 0x76, 0x51, 0x41, 0x4f, 0x41, 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4f, 0x41, 0x41, 0x37, 0x2f, 0x77, + 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x55, 0x75, 0x77, 0x44, 0x31, 0x52, 0x59, 0x76, 0x51, 0x41, + 0x4f, 0x0a, + 0x09, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4f, 0x41, 0x41, 0x34, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, + 0x7a, 0x68, 0x5a, 0x41, 0x51, 0x59, 0x43, 0x46, 0x52, 0x51, 0x53, 0x46, 0x79, 0x4d, 0x6d, 0x41, 0x6a, 0x55, + 0x30, 0x45, 0x6a, 0x63, 0x43, 0x65, 0x34, 0x61, 0x43, 0x67, 0x34, 0x57, 0x67, 0x6c, 0x70, 0x57, 0x55, 0x6c, + 0x77, 0x59, 0x53, 0x35, 0x76, 0x34, 0x2b, 0x35, 0x2b, 0x66, 0x2b, 0x4f, 0x2b, 0x58, 0x72, 0x41, 0x63, 0x62, + 0x67, 0x0a, + 0x09, 0x33, 0x77, 0x48, 0x45, 0x37, 0x41, 0x41, 0x42, 0x41, 0x4b, 0x54, 0x2b, 0x38, 0x67, 0x4a, 0x76, 0x42, + 0x68, 0x49, 0x41, 0x44, 0x51, 0x41, 0x66, 0x51, 0x41, 0x38, 0x48, 0x6d, 0x41, 0x43, 0x58, 0x44, 0x67, 0x63, + 0x42, 0x41, 0x41, 0x73, 0x53, 0x42, 0x42, 0x4d, 0x49, 0x41, 0x41, 0x34, 0x51, 0x33, 0x44, 0x7a, 0x30, 0x37, + 0x42, 0x45, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x50, 0x7a, 0x73, 0x4d, 0x42, 0x4d, 0x7a, 0x46, 0x68, 0x49, + 0x56, 0x0a, + 0x09, 0x46, 0x41, 0x49, 0x48, 0x49, 0x7a, 0x59, 0x53, 0x4e, 0x54, 0x51, 0x43, 0x70, 0x4b, 0x43, 0x57, 0x6c, + 0x5a, 0x57, 0x57, 0x6f, 0x49, 0x57, 0x44, 0x67, 0x77, 0x59, 0x53, 0x37, 0x50, 0x34, 0x38, 0x33, 0x2b, 0x44, + 0x2b, 0x4f, 0x75, 0x76, 0x6c, 0x41, 0x63, 0x58, 0x6e, 0x35, 0x77, 0x48, 0x43, 0x41, 0x41, 0x45, 0x41, 0x50, + 0x51, 0x4a, 0x4b, 0x41, 0x38, 0x4d, 0x46, 0x38, 0x41, 0x41, 0x52, 0x41, 0x45, 0x35, 0x41, 0x4c, 0x42, 0x41, + 0x4e, 0x0a, + 0x09, 0x43, 0x77, 0x41, 0x45, 0x44, 0x41, 0x6b, 0x48, 0x42, 0x41, 0x49, 0x45, 0x43, 0x41, 0x4f, 0x5a, 0x42, + 0x52, 0x45, 0x4d, 0x6d, 0x51, 0x6f, 0x42, 0x44, 0x70, 0x45, 0x53, 0x43, 0x41, 0x77, 0x4b, 0x41, 0x77, 0x6b, + 0x47, 0x45, 0x51, 0x4d, 0x42, 0x41, 0x77, 0x49, 0x41, 0x46, 0x41, 0x38, 0x45, 0x43, 0x77, 0x6b, 0x55, 0x44, + 0x51, 0x59, 0x53, 0x45, 0x4e, 0x51, 0x38, 0x35, 0x44, 0x4c, 0x63, 0x50, 0x4f, 0x51, 0x79, 0x46, 0x7a, 0x6b, + 0x52, 0x0a, + 0x09, 0x45, 0x68, 0x63, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x39, 0x4e, 0x51, 0x38, 0x37, 0x44, 0x4c, 0x45, 0x37, + 0x44, 0x49, 0x58, 0x4f, 0x52, 0x49, 0x58, 0x4f, 0x54, 0x41, 0x42, 0x42, 0x51, 0x55, 0x48, 0x4a, 0x52, 0x45, + 0x6a, 0x45, 0x51, 0x55, 0x6e, 0x4a, 0x53, 0x55, 0x33, 0x42, 0x52, 0x45, 0x7a, 0x45, 0x53, 0x55, 0x44, 0x77, + 0x2f, 0x36, 0x5a, 0x41, 0x57, 0x63, 0x36, 0x2f, 0x72, 0x42, 0x79, 0x2f, 0x72, 0x41, 0x36, 0x41, 0x57, 0x66, + 0x2b, 0x0a, + 0x09, 0x6d, 0x54, 0x6f, 0x42, 0x55, 0x48, 0x49, 0x42, 0x55, 0x41, 0x54, 0x66, 0x77, 0x73, 0x4e, 0x69, 0x79, + 0x2f, 0x36, 0x48, 0x41, 0x58, 0x6e, 0x4c, 0x59, 0x73, 0x50, 0x43, 0x59, 0x38, 0x73, 0x42, 0x65, 0x66, 0x36, + 0x48, 0x79, 0x77, 0x41, 0x42, 0x41, 0x4e, 0x6b, 0x41, 0x41, 0x41, 0x58, 0x62, 0x42, 0x51, 0x51, 0x41, 0x43, + 0x77, 0x41, 0x6a, 0x51, 0x42, 0x45, 0x41, 0x43, 0x51, 0x47, 0x63, 0x42, 0x77, 0x4d, 0x46, 0x41, 0x68, 0x55, + 0x45, 0x0a, + 0x09, 0x41, 0x42, 0x63, 0x4b, 0x42, 0x68, 0x55, 0x49, 0x44, 0x42, 0x44, 0x63, 0x2f, 0x44, 0x7a, 0x38, 0x50, + 0x4f, 0x77, 0x78, 0x41, 0x43, 0x2f, 0x55, 0x50, 0x50, 0x77, 0x38, 0x78, 0x44, 0x41, 0x42, 0x45, 0x53, 0x45, + 0x56, 0x49, 0x52, 0x45, 0x6a, 0x45, 0x53, 0x45, 0x31, 0x49, 0x52, 0x45, 0x44, 0x72, 0x67, 0x49, 0x74, 0x2f, + 0x64, 0x4f, 0x6f, 0x2f, 0x64, 0x4d, 0x43, 0x4c, 0x51, 0x55, 0x45, 0x2f, 0x64, 0x4f, 0x71, 0x2f, 0x64, 0x4d, + 0x43, 0x0a, + 0x09, 0x4c, 0x61, 0x6f, 0x43, 0x4c, 0x51, 0x41, 0x42, 0x41, 0x4a, 0x37, 0x2f, 0x45, 0x67, 0x48, 0x44, 0x41, + 0x50, 0x34, 0x41, 0x42, 0x51, 0x41, 0x5a, 0x51, 0x41, 0x77, 0x44, 0x6e, 0x67, 0x43, 0x44, 0x42, 0x67, 0x4d, + 0x45, 0x41, 0x52, 0x6b, 0x41, 0x47, 0x41, 0x59, 0x51, 0x2f, 0x4f, 0x7a, 0x55, 0x7a, 0x44, 0x45, 0x41, 0x45, + 0x50, 0x7a, 0x73, 0x4d, 0x44, 0x63, 0x7a, 0x46, 0x51, 0x4d, 0x6a, 0x45, 0x2f, 0x44, 0x54, 0x70, 0x49, 0x46, + 0x53, 0x0a, + 0x09, 0x2f, 0x71, 0x7a, 0x2b, 0x77, 0x41, 0x46, 0x41, 0x41, 0x41, 0x45, 0x41, 0x5a, 0x41, 0x48, 0x66, 0x41, + 0x6e, 0x38, 0x43, 0x67, 0x77, 0x41, 0x44, 0x41, 0x42, 0x47, 0x32, 0x41, 0x4a, 0x77, 0x43, 0x42, 0x41, 0x45, + 0x41, 0x42, 0x42, 0x44, 0x63, 0x7a, 0x44, 0x45, 0x41, 0x45, 0x4e, 0x54, 0x73, 0x4d, 0x42, 0x4d, 0x68, 0x46, + 0x53, 0x46, 0x6b, 0x41, 0x68, 0x76, 0x39, 0x35, 0x51, 0x4b, 0x44, 0x70, 0x41, 0x41, 0x41, 0x41, 0x51, 0x44, + 0x62, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x42, 0x72, 0x67, 0x44, 0x2b, 0x41, 0x41, 0x4d, 0x41, 0x45, 0x62, 0x63, 0x41, 0x67, + 0x77, 0x49, 0x42, 0x47, 0x51, 0x41, 0x59, 0x42, 0x42, 0x44, 0x38, 0x37, 0x44, 0x45, 0x41, 0x4c, 0x2b, 0x77, + 0x77, 0x4e, 0x7a, 0x4d, 0x56, 0x49, 0x39, 0x76, 0x54, 0x30, 0x2f, 0x37, 0x2b, 0x41, 0x41, 0x45, 0x41, 0x41, + 0x50, 0x39, 0x43, 0x41, 0x72, 0x49, 0x46, 0x31, 0x51, 0x41, 0x44, 0x41, 0x43, 0x31, 0x41, 0x46, 0x41, 0x41, + 0x61, 0x0a, + 0x09, 0x41, 0x51, 0x49, 0x42, 0x41, 0x68, 0x6f, 0x44, 0x41, 0x41, 0x4e, 0x43, 0x41, 0x70, 0x38, 0x41, 0x67, + 0x51, 0x51, 0x43, 0x41, 0x41, 0x45, 0x44, 0x4c, 0x38, 0x51, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x50, 0x54, + 0x73, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x58, 0x74, 0x57, + 0x53, 0x49, 0x42, 0x4d, 0x77, 0x45, 0x6a, 0x41, 0x67, 0x69, 0x71, 0x2f, 0x66, 0x69, 0x71, 0x42, 0x64, 0x58, + 0x35, 0x0a, + 0x09, 0x62, 0x51, 0x41, 0x41, 0x41, 0x67, 0x43, 0x48, 0x2f, 0x2b, 0x4d, 0x45, 0x6a, 0x77, 0x58, 0x77, 0x41, + 0x41, 0x73, 0x41, 0x46, 0x77, 0x41, 0x6a, 0x51, 0x42, 0x4d, 0x47, 0x6f, 0x42, 0x49, 0x41, 0x6f, 0x41, 0x79, + 0x52, 0x45, 0x6f, 0x77, 0x59, 0x43, 0x52, 0x77, 0x50, 0x48, 0x67, 0x4d, 0x63, 0x46, 0x52, 0x73, 0x59, 0x45, + 0x50, 0x7a, 0x73, 0x39, 0x4f, 0x77, 0x78, 0x41, 0x42, 0x44, 0x6b, 0x39, 0x4f, 0x77, 0x51, 0x37, 0x6a, 0x41, + 0x42, 0x0a, + 0x09, 0x49, 0x67, 0x49, 0x52, 0x45, 0x42, 0x49, 0x7a, 0x4d, 0x68, 0x49, 0x52, 0x45, 0x41, 0x49, 0x6e, 0x4d, + 0x67, 0x41, 0x52, 0x45, 0x41, 0x41, 0x6a, 0x49, 0x67, 0x41, 0x52, 0x45, 0x41, 0x41, 0x43, 0x69, 0x35, 0x79, + 0x64, 0x6e, 0x5a, 0x79, 0x64, 0x6e, 0x5a, 0x32, 0x64, 0x2b, 0x77, 0x45, 0x4a, 0x2f, 0x76, 0x66, 0x37, 0x2b, + 0x2f, 0x37, 0x33, 0x41, 0x51, 0x6b, 0x46, 0x55, 0x50, 0x37, 0x4e, 0x2f, 0x73, 0x7a, 0x2b, 0x7a, 0x66, 0x37, + 0x4e, 0x0a, + 0x09, 0x41, 0x54, 0x4d, 0x42, 0x4d, 0x77, 0x45, 0x30, 0x41, 0x54, 0x4f, 0x67, 0x2f, 0x6e, 0x50, 0x2b, 0x68, + 0x76, 0x36, 0x48, 0x2f, 0x6e, 0x4d, 0x42, 0x6a, 0x51, 0x46, 0x35, 0x41, 0x58, 0x6f, 0x42, 0x6a, 0x51, 0x41, + 0x41, 0x41, 0x51, 0x44, 0x68, 0x41, 0x41, 0x41, 0x45, 0x57, 0x67, 0x58, 0x56, 0x41, 0x41, 0x6f, 0x41, 0x53, + 0x30, 0x41, 0x56, 0x51, 0x67, 0x4f, 0x67, 0x42, 0x41, 0x4b, 0x67, 0x42, 0x59, 0x45, 0x48, 0x41, 0x4b, 0x41, + 0x4a, 0x0a, + 0x09, 0x43, 0x42, 0x38, 0x47, 0x48, 0x41, 0x4d, 0x41, 0x48, 0x77, 0x45, 0x4c, 0x45, 0x4e, 0x54, 0x73, 0x78, + 0x50, 0x7a, 0x73, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x44, 0x4c, 0x30, 0x37, 0x4e, 0x54, 0x73, 0x4d, 0x45, 0x74, + 0x54, 0x57, 0x46, 0x6b, 0x69, 0x41, 0x55, 0x75, 0x77, 0x44, 0x31, 0x52, 0x59, 0x76, 0x51, 0x41, 0x4c, 0x2f, + 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4c, 0x41, 0x41, 0x73, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, + 0x5a, 0x0a, + 0x09, 0x74, 0x41, 0x38, 0x44, 0x44, 0x77, 0x51, 0x43, 0x58, 0x54, 0x63, 0x68, 0x45, 0x51, 0x55, 0x31, 0x4a, + 0x54, 0x4d, 0x52, 0x49, 0x52, 0x55, 0x68, 0x2f, 0x67, 0x46, 0x4b, 0x2f, 0x70, 0x6b, 0x42, 0x5a, 0x63, 0x6f, + 0x42, 0x53, 0x76, 0x79, 0x6b, 0x71, 0x67, 0x52, 0x7a, 0x53, 0x4c, 0x68, 0x49, 0x2b, 0x74, 0x57, 0x71, 0x41, + 0x41, 0x41, 0x42, 0x41, 0x4a, 0x59, 0x41, 0x41, 0x41, 0x52, 0x4b, 0x42, 0x66, 0x41, 0x41, 0x48, 0x41, 0x43, + 0x6c, 0x0a, + 0x09, 0x51, 0x43, 0x63, 0x5a, 0x47, 0x68, 0x73, 0x44, 0x47, 0x42, 0x77, 0x52, 0x42, 0x51, 0x51, 0x41, 0x45, + 0x51, 0x55, 0x46, 0x42, 0x45, 0x49, 0x51, 0x6f, 0x52, 0x47, 0x55, 0x44, 0x61, 0x41, 0x55, 0x6b, 0x51, 0x51, + 0x41, 0x6f, 0x41, 0x49, 0x41, 0x45, 0x41, 0x6f, 0x43, 0x41, 0x51, 0x6f, 0x63, 0x46, 0x78, 0x41, 0x44, 0x42, + 0x68, 0x30, 0x51, 0x2f, 0x4d, 0x54, 0x55, 0x37, 0x4d, 0x44, 0x41, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x51, 0x41, + 0x76, 0x0a, + 0x09, 0x37, 0x44, 0x4c, 0x30, 0x37, 0x50, 0x54, 0x73, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, + 0x65, 0x30, 0x48, 0x42, 0x65, 0x30, 0x52, 0x46, 0x7a, 0x6c, 0x5a, 0x49, 0x67, 0x46, 0x4c, 0x73, 0x42, 0x56, + 0x55, 0x53, 0x37, 0x41, 0x57, 0x56, 0x46, 0x74, 0x4c, 0x73, 0x42, 0x52, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, + 0x42, 0x30, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x42, 0x30, 0x41, 0x48, 0x66, 0x2f, 0x41, 0x4f, 0x42, 0x45, + 0x33, 0x0a, + 0x09, 0x4f, 0x46, 0x6c, 0x41, 0x4d, 0x6c, 0x55, 0x45, 0x56, 0x67, 0x56, 0x57, 0x42, 0x33, 0x6f, 0x45, 0x65, + 0x67, 0x56, 0x32, 0x47, 0x34, 0x63, 0x5a, 0x42, 0x77, 0x51, 0x41, 0x42, 0x42, 0x6b, 0x45, 0x47, 0x67, 0x51, + 0x62, 0x42, 0x52, 0x78, 0x30, 0x41, 0x48, 0x59, 0x47, 0x64, 0x52, 0x70, 0x7a, 0x47, 0x33, 0x51, 0x63, 0x67, + 0x67, 0x43, 0x47, 0x47, 0x59, 0x49, 0x61, 0x67, 0x68, 0x75, 0x43, 0x48, 0x4b, 0x67, 0x41, 0x71, 0x42, 0x73, + 0x52, 0x0a, + 0x09, 0x58, 0x51, 0x42, 0x64, 0x4a, 0x53, 0x45, 0x56, 0x49, 0x54, 0x55, 0x32, 0x41, 0x44, 0x63, 0x2b, 0x41, + 0x54, 0x55, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x67, 0x63, 0x31, 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x67, 0x51, + 0x56, 0x46, 0x41, 0x59, 0x48, 0x42, 0x67, 0x41, 0x42, 0x69, 0x51, 0x4c, 0x42, 0x2f, 0x45, 0x78, 0x7a, 0x41, + 0x59, 0x30, 0x7a, 0x59, 0x55, 0x32, 0x6e, 0x68, 0x6c, 0x2f, 0x54, 0x65, 0x48, 0x72, 0x55, 0x57, 0x4f, 0x67, + 0x42, 0x0a, + 0x09, 0x46, 0x45, 0x56, 0x62, 0x47, 0x66, 0x37, 0x30, 0x71, 0x71, 0x71, 0x71, 0x64, 0x77, 0x47, 0x52, 0x4f, + 0x6d, 0x32, 0x58, 0x53, 0x58, 0x65, 0x57, 0x51, 0x6b, 0x50, 0x4d, 0x4d, 0x54, 0x4c, 0x6f, 0x77, 0x6c, 0x79, + 0x6c, 0x63, 0x42, 0x33, 0x2b, 0x36, 0x77, 0x41, 0x41, 0x41, 0x51, 0x43, 0x63, 0x2f, 0x2b, 0x4d, 0x45, 0x63, + 0x77, 0x58, 0x77, 0x41, 0x43, 0x67, 0x41, 0x65, 0x30, 0x41, 0x75, 0x41, 0x42, 0x55, 0x54, 0x43, 0x6f, 0x59, + 0x4a, 0x0a, + 0x09, 0x48, 0x34, 0x59, 0x67, 0x45, 0x36, 0x41, 0x56, 0x44, 0x61, 0x41, 0x4a, 0x6b, 0x77, 0x59, 0x63, 0x6f, + 0x43, 0x43, 0x54, 0x49, 0x35, 0x45, 0x47, 0x6a, 0x42, 0x57, 0x6a, 0x4b, 0x52, 0x59, 0x63, 0x45, 0x77, 0x41, + 0x44, 0x46, 0x42, 0x6b, 0x63, 0x4a, 0x69, 0x41, 0x51, 0x48, 0x41, 0x4d, 0x55, 0x48, 0x77, 0x6b, 0x47, 0x4b, + 0x52, 0x44, 0x38, 0x78, 0x4d, 0x54, 0x55, 0x37, 0x50, 0x54, 0x73, 0x45, 0x52, 0x63, 0x35, 0x4f, 0x54, 0x45, + 0x41, 0x0a, + 0x09, 0x45, 0x4f, 0x7a, 0x6b, 0x39, 0x4f, 0x54, 0x73, 0x45, 0x4f, 0x62, 0x75, 0x45, 0x4f, 0x34, 0x51, 0x37, + 0x68, 0x44, 0x75, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x41, 0x46, 0x4c, 0x73, 0x42, 0x5a, 0x55, 0x53, 0x37, 0x41, + 0x55, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x70, 0x41, 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x70, 0x41, + 0x43, 0x6e, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x51, 0x41, 0x6c, 0x6b, 0x48, 0x6d, 0x45, + 0x66, 0x0a, + 0x09, 0x59, 0x53, 0x42, 0x6b, 0x49, 0x51, 0x51, 0x41, 0x58, 0x51, 0x45, 0x65, 0x41, 0x52, 0x55, 0x55, 0x42, + 0x43, 0x45, 0x69, 0x4a, 0x69, 0x63, 0x31, 0x48, 0x67, 0x45, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, + 0x72, 0x41, 0x54, 0x55, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x48, 0x4e, + 0x54, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x45, 0x46, 0x52, 0x51, 0x47, 0x41, 0x7a, 0x2b, 0x52, 0x6f, 0x2f, 0x37, + 0x51, 0x0a, + 0x09, 0x2f, 0x75, 0x68, 0x65, 0x78, 0x32, 0x70, 0x55, 0x79, 0x47, 0x32, 0x2b, 0x78, 0x37, 0x6d, 0x6c, 0x72, + 0x72, 0x61, 0x56, 0x6e, 0x71, 0x4f, 0x59, 0x55, 0x37, 0x35, 0x79, 0x63, 0x38, 0x6c, 0x5a, 0x35, 0x67, 0x45, + 0x4d, 0x6a, 0x67, 0x4d, 0x6c, 0x48, 0x38, 0x53, 0x51, 0x33, 0x66, 0x49, 0x6c, 0x4a, 0x63, 0x4d, 0x78, 0x4d, + 0x70, 0x61, 0x50, 0x68, 0x4a, 0x57, 0x6d, 0x64, 0x33, 0x42, 0x7a, 0x65, 0x79, 0x51, 0x6d, 0x74, 0x43, 0x41, + 0x67, 0x0a, + 0x09, 0x30, 0x62, 0x4a, 0x38, 0x71, 0x77, 0x41, 0x43, 0x41, 0x47, 0x51, 0x41, 0x41, 0x41, 0x53, 0x6b, 0x42, + 0x64, 0x55, 0x41, 0x41, 0x67, 0x41, 0x4e, 0x41, 0x49, 0x78, 0x41, 0x48, 0x51, 0x45, 0x4e, 0x41, 0x77, 0x30, + 0x41, 0x41, 0x77, 0x4d, 0x4e, 0x51, 0x67, 0x41, 0x44, 0x43, 0x77, 0x65, 0x67, 0x42, 0x51, 0x45, 0x44, 0x67, + 0x51, 0x6b, 0x42, 0x44, 0x41, 0x6f, 0x41, 0x48, 0x41, 0x59, 0x49, 0x42, 0x41, 0x77, 0x4f, 0x45, 0x4e, 0x7a, + 0x55, 0x0a, + 0x09, 0x50, 0x4d, 0x54, 0x73, 0x4d, 0x68, 0x45, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x35, 0x4e, 0x51, 0x38, 0x37, + 0x44, 0x49, 0x53, 0x4f, 0x54, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, 0x41, 0x54, 0x4a, 0x42, 0x78, 0x41, + 0x46, 0x79, 0x56, 0x6b, 0x69, 0x41, 0x55, 0x75, 0x77, 0x43, 0x31, 0x52, 0x4c, 0x73, 0x41, 0x31, 0x55, 0x57, + 0x31, 0x69, 0x39, 0x41, 0x41, 0x34, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x41, 0x34, 0x41, 0x44, 0x76, 0x2f, + 0x41, 0x0a, + 0x09, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x4b, 0x67, 0x73, 0x41, 0x4b, 0x67, 0x42, 0x49, 0x41, + 0x46, 0x6b, 0x41, 0x61, 0x51, 0x42, 0x33, 0x41, 0x49, 0x6f, 0x41, 0x42, 0x78, 0x59, 0x42, 0x4b, 0x77, 0x41, + 0x6d, 0x41, 0x53, 0x73, 0x44, 0x4e, 0x67, 0x46, 0x4f, 0x41, 0x55, 0x38, 0x4d, 0x54, 0x77, 0x31, 0x57, 0x41, + 0x57, 0x59, 0x42, 0x64, 0x51, 0x46, 0x36, 0x41, 0x34, 0x55, 0x42, 0x44, 0x56, 0x30, 0x41, 0x58, 0x51, 0x6b, + 0x42, 0x0a, + 0x09, 0x49, 0x51, 0x4d, 0x7a, 0x45, 0x54, 0x4d, 0x56, 0x49, 0x78, 0x45, 0x6a, 0x45, 0x53, 0x45, 0x31, 0x41, + 0x77, 0x62, 0x2b, 0x41, 0x67, 0x48, 0x2b, 0x4e, 0x66, 0x37, 0x56, 0x31, 0x63, 0x6e, 0x39, 0x58, 0x67, 0x55, + 0x6c, 0x2f, 0x4f, 0x4d, 0x44, 0x7a, 0x66, 0x77, 0x7a, 0x71, 0x50, 0x36, 0x67, 0x41, 0x57, 0x44, 0x44, 0x41, + 0x41, 0x41, 0x42, 0x41, 0x4a, 0x37, 0x2f, 0x34, 0x77, 0x52, 0x6b, 0x42, 0x64, 0x55, 0x41, 0x48, 0x51, 0x42, + 0x31, 0x0a, + 0x09, 0x51, 0x43, 0x4d, 0x45, 0x47, 0x67, 0x63, 0x52, 0x68, 0x68, 0x41, 0x64, 0x47, 0x71, 0x41, 0x48, 0x46, + 0x4b, 0x41, 0x51, 0x69, 0x51, 0x30, 0x43, 0x6f, 0x41, 0x43, 0x42, 0x44, 0x59, 0x77, 0x48, 0x70, 0x42, 0x34, + 0x58, 0x48, 0x41, 0x45, 0x4b, 0x41, 0x78, 0x77, 0x41, 0x43, 0x68, 0x41, 0x47, 0x48, 0x68, 0x44, 0x38, 0x78, + 0x4e, 0x54, 0x73, 0x45, 0x4d, 0x54, 0x75, 0x4d, 0x51, 0x41, 0x51, 0x35, 0x4f, 0x54, 0x30, 0x37, 0x42, 0x44, + 0x6d, 0x0a, + 0x09, 0x37, 0x68, 0x44, 0x2b, 0x78, 0x42, 0x44, 0x75, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x41, 0x46, 0x4c, 0x73, + 0x42, 0x5a, 0x55, 0x53, 0x37, 0x41, 0x55, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x65, 0x41, 0x45, 0x41, + 0x41, 0x41, 0x51, 0x41, 0x65, 0x41, 0x42, 0x37, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, + 0x55, 0x75, 0x77, 0x44, 0x31, 0x52, 0x59, 0x76, 0x51, 0x41, 0x65, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x65, 0x0a, + 0x09, 0x41, 0x42, 0x34, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x45, 0x79, 0x45, 0x56, 0x49, + 0x52, 0x45, 0x2b, 0x41, 0x54, 0x4d, 0x79, 0x41, 0x42, 0x55, 0x55, 0x41, 0x43, 0x45, 0x69, 0x4a, 0x69, 0x63, + 0x31, 0x48, 0x67, 0x45, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x48, 0x33, + 0x51, 0x4d, 0x5a, 0x2f, 0x61, 0x41, 0x73, 0x57, 0x43, 0x7a, 0x36, 0x41, 0x53, 0x54, 0x2b, 0x31, 0x50, 0x37, + 0x76, 0x0a, + 0x09, 0x58, 0x73, 0x4e, 0x6f, 0x57, 0x73, 0x42, 0x72, 0x72, 0x63, 0x72, 0x4b, 0x72, 0x56, 0x47, 0x68, 0x56, + 0x41, 0x58, 0x56, 0x71, 0x76, 0x36, 0x53, 0x44, 0x77, 0x2f, 0x2b, 0x37, 0x75, 0x72, 0x78, 0x2f, 0x76, 0x55, + 0x67, 0x49, 0x4d, 0x73, 0x78, 0x4d, 0x4c, 0x61, 0x63, 0x6e, 0x4c, 0x59, 0x6b, 0x4a, 0x67, 0x41, 0x41, 0x41, + 0x67, 0x43, 0x50, 0x2f, 0x2b, 0x4d, 0x45, 0x6c, 0x67, 0x58, 0x77, 0x41, 0x41, 0x73, 0x41, 0x4a, 0x41, 0x42, + 0x59, 0x0a, + 0x09, 0x51, 0x43, 0x51, 0x54, 0x42, 0x67, 0x41, 0x4e, 0x68, 0x67, 0x77, 0x41, 0x6f, 0x42, 0x59, 0x47, 0x6f, + 0x42, 0x77, 0x57, 0x70, 0x52, 0x43, 0x67, 0x44, 0x49, 0x6b, 0x69, 0x6b, 0x52, 0x79, 0x4d, 0x4a, 0x51, 0x77, + 0x69, 0x43, 0x52, 0x77, 0x5a, 0x48, 0x68, 0x4d, 0x63, 0x41, 0x79, 0x45, 0x66, 0x47, 0x79, 0x55, 0x51, 0x2f, + 0x4f, 0x7a, 0x73, 0x39, 0x4f, 0x7a, 0x6b, 0x4d, 0x51, 0x41, 0x51, 0x35, 0x50, 0x54, 0x6b, 0x2f, 0x4f, 0x51, + 0x51, 0x0a, + 0x09, 0x37, 0x68, 0x44, 0x75, 0x45, 0x4f, 0x34, 0x52, 0x45, 0x6a, 0x6b, 0x77, 0x51, 0x42, 0x54, 0x4c, 0x41, + 0x4d, 0x73, 0x42, 0x7a, 0x51, 0x4c, 0x4e, 0x41, 0x38, 0x30, 0x45, 0x79, 0x77, 0x58, 0x4c, 0x42, 0x67, 0x65, + 0x6b, 0x48, 0x72, 0x49, 0x65, 0x41, 0x6c, 0x30, 0x42, 0x58, 0x51, 0x45, 0x69, 0x42, 0x68, 0x55, 0x55, 0x46, + 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x67, 0x45, 0x56, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x49, + 0x44, 0x0a, + 0x09, 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x67, 0x41, 0x56, 0x46, 0x41, 0x41, 0x6a, 0x49, 0x41, 0x41, 0x52, 0x45, + 0x41, 0x41, 0x68, 0x4d, 0x68, 0x59, 0x43, 0x70, 0x49, 0x69, 0x66, 0x6e, 0x34, 0x69, 0x49, 0x6e, 0x35, 0x38, + 0x42, 0x43, 0x55, 0x79, 0x62, 0x54, 0x4d, 0x6a, 0x54, 0x44, 0x7a, 0x75, 0x79, 0x61, 0x2b, 0x45, 0x42, 0x42, + 0x66, 0x37, 0x77, 0x34, 0x76, 0x37, 0x39, 0x2f, 0x75, 0x34, 0x42, 0x55, 0x41, 0x45, 0x62, 0x54, 0x4a, 0x73, + 0x44, 0x0a, + 0x09, 0x4f, 0x37, 0x71, 0x69, 0x6f, 0x62, 0x75, 0x37, 0x6f, 0x61, 0x4b, 0x36, 0x41, 0x6e, 0x6d, 0x34, 0x4a, + 0x43, 0x62, 0x2b, 0x38, 0x76, 0x37, 0x76, 0x56, 0x31, 0x33, 0x2b, 0x37, 0x2b, 0x76, 0x6d, 0x2f, 0x75, 0x6f, + 0x42, 0x6a, 0x51, 0x46, 0x35, 0x41, 0x57, 0x49, 0x42, 0x70, 0x52, 0x34, 0x41, 0x41, 0x41, 0x45, 0x41, 0x71, + 0x41, 0x41, 0x41, 0x42, 0x47, 0x67, 0x46, 0x31, 0x51, 0x41, 0x47, 0x41, 0x47, 0x4e, 0x41, 0x47, 0x41, 0x55, + 0x52, 0x0a, + 0x09, 0x41, 0x67, 0x4d, 0x43, 0x41, 0x78, 0x45, 0x45, 0x42, 0x51, 0x52, 0x43, 0x42, 0x61, 0x41, 0x41, 0x67, + 0x51, 0x4d, 0x46, 0x41, 0x77, 0x45, 0x45, 0x41, 0x51, 0x41, 0x47, 0x42, 0x78, 0x44, 0x38, 0x7a, 0x4d, 0x51, + 0x52, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x43, 0x2f, 0x30, 0x37, 0x44, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, + 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x56, 0x6b, 0x69, 0x41, 0x55, 0x75, 0x77, 0x46, 0x6c, 0x52, + 0x59, 0x0a, + 0x09, 0x76, 0x51, 0x41, 0x48, 0x41, 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x48, 0x41, 0x41, 0x66, 0x2f, 0x77, + 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x51, 0x42, 0x4a, 0x59, 0x41, 0x67, 0x45, 0x47, 0x41, 0x78, 0x6f, + 0x46, 0x4f, 0x51, 0x56, 0x49, 0x42, 0x57, 0x63, 0x44, 0x73, 0x41, 0x43, 0x77, 0x42, 0x67, 0x64, 0x64, 0x41, + 0x46, 0x30, 0x54, 0x49, 0x52, 0x55, 0x42, 0x49, 0x77, 0x45, 0x68, 0x71, 0x41, 0x50, 0x41, 0x2f, 0x65, 0x4c, + 0x54, 0x0a, + 0x09, 0x41, 0x66, 0x37, 0x39, 0x4d, 0x77, 0x58, 0x56, 0x56, 0x76, 0x71, 0x42, 0x42, 0x53, 0x73, 0x41, 0x41, + 0x41, 0x4d, 0x41, 0x69, 0x2f, 0x2f, 0x6a, 0x42, 0x49, 0x73, 0x46, 0x38, 0x41, 0x41, 0x4c, 0x41, 0x43, 0x4d, + 0x41, 0x4c, 0x77, 0x42, 0x44, 0x51, 0x43, 0x55, 0x59, 0x44, 0x41, 0x43, 0x67, 0x4a, 0x77, 0x61, 0x67, 0x48, + 0x69, 0x32, 0x67, 0x45, 0x70, 0x45, 0x65, 0x6a, 0x43, 0x65, 0x6a, 0x4d, 0x42, 0x67, 0x4d, 0x4a, 0x43, 0x6f, + 0x63, 0x0a, + 0x09, 0x46, 0x53, 0x51, 0x63, 0x44, 0x77, 0x6b, 0x63, 0x46, 0x52, 0x73, 0x65, 0x41, 0x78, 0x77, 0x50, 0x49, + 0x52, 0x73, 0x77, 0x45, 0x50, 0x7a, 0x45, 0x37, 0x50, 0x54, 0x45, 0x37, 0x42, 0x44, 0x75, 0x45, 0x4f, 0x34, + 0x52, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x73, 0x35, 0x50, 0x54, 0x73, 0x45, 0x4f, 0x34, 0x51, 0x37, + 0x6a, 0x6b, 0x35, 0x4d, 0x41, 0x45, 0x69, 0x42, 0x68, 0x55, 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x55, + 0x30, 0x0a, + 0x09, 0x4a, 0x69, 0x55, 0x6d, 0x4a, 0x6a, 0x55, 0x30, 0x4e, 0x6a, 0x4d, 0x79, 0x46, 0x68, 0x55, 0x55, 0x42, + 0x67, 0x63, 0x57, 0x46, 0x68, 0x55, 0x55, 0x42, 0x43, 0x4d, 0x69, 0x4a, 0x44, 0x55, 0x30, 0x4e, 0x68, 0x4d, + 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x67, 0x4b, 0x4c, 0x6b, + 0x4b, 0x57, 0x6c, 0x6b, 0x4a, 0x43, 0x6d, 0x70, 0x66, 0x36, 0x6c, 0x67, 0x70, 0x48, 0x2f, 0x33, 0x74, 0x2f, + 0x2b, 0x0a, + 0x09, 0x6b, 0x59, 0x47, 0x53, 0x6f, 0x2f, 0x37, 0x33, 0x39, 0x2f, 0x66, 0x2b, 0x39, 0x36, 0x52, 0x49, 0x6b, + 0x59, 0x4f, 0x43, 0x6b, 0x35, 0x4f, 0x43, 0x67, 0x35, 0x45, 0x43, 0x78, 0x5a, 0x71, 0x48, 0x68, 0x35, 0x71, + 0x62, 0x68, 0x6f, 0x65, 0x61, 0x56, 0x69, 0x43, 0x79, 0x67, 0x4c, 0x50, 0x51, 0x30, 0x4c, 0x4f, 0x41, 0x73, + 0x69, 0x41, 0x69, 0x78, 0x6f, 0x2f, 0x5a, 0x36, 0x4f, 0x6a, 0x5a, 0x6a, 0x38, 0x59, 0x42, 0x59, 0x58, 0x53, + 0x43, 0x0a, + 0x09, 0x67, 0x6e, 0x52, 0x30, 0x67, 0x6f, 0x49, 0x41, 0x41, 0x41, 0x49, 0x41, 0x67, 0x66, 0x2f, 0x6a, 0x42, + 0x49, 0x63, 0x46, 0x38, 0x41, 0x41, 0x59, 0x41, 0x43, 0x51, 0x41, 0x57, 0x45, 0x41, 0x6a, 0x42, 0x78, 0x38, + 0x5a, 0x41, 0x59, 0x59, 0x41, 0x47, 0x61, 0x41, 0x4b, 0x70, 0x51, 0x53, 0x67, 0x41, 0x49, 0x6b, 0x57, 0x48, + 0x36, 0x41, 0x51, 0x6b, 0x52, 0x61, 0x4d, 0x4a, 0x51, 0x63, 0x63, 0x48, 0x43, 0x45, 0x54, 0x48, 0x67, 0x41, + 0x69, 0x0a, + 0x09, 0x49, 0x68, 0x77, 0x4e, 0x47, 0x79, 0x55, 0x51, 0x2f, 0x4f, 0x7a, 0x6b, 0x39, 0x4f, 0x7a, 0x73, 0x4d, + 0x51, 0x41, 0x51, 0x35, 0x50, 0x54, 0x73, 0x45, 0x4f, 0x62, 0x2b, 0x39, 0x65, 0x34, 0x51, 0x37, 0x68, 0x45, + 0x53, 0x4f, 0x54, 0x42, 0x41, 0x46, 0x73, 0x51, 0x5a, 0x77, 0x68, 0x72, 0x41, 0x47, 0x38, 0x41, 0x63, 0x77, + 0x42, 0x33, 0x43, 0x48, 0x73, 0x51, 0x66, 0x42, 0x36, 0x6f, 0x53, 0x76, 0x42, 0x4c, 0x70, 0x45, 0x67, 0x4e, + 0x64, 0x0a, + 0x09, 0x41, 0x56, 0x30, 0x33, 0x4e, 0x52, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x53, 0x45, 0x77, 0x34, 0x42, 0x49, + 0x79, 0x49, 0x41, 0x4e, 0x54, 0x51, 0x41, 0x4d, 0x79, 0x41, 0x41, 0x45, 0x52, 0x41, 0x41, 0x49, 0x53, 0x49, + 0x6d, 0x41, 0x54, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x34, + 0x55, 0x79, 0x63, 0x53, 0x38, 0x6a, 0x54, 0x44, 0x7a, 0x71, 0x79, 0x62, 0x4f, 0x44, 0x2b, 0x2b, 0x77, 0x45, + 0x51, 0x0a, + 0x09, 0x34, 0x67, 0x45, 0x44, 0x41, 0x52, 0x48, 0x2b, 0x73, 0x66, 0x37, 0x6c, 0x54, 0x4a, 0x77, 0x42, 0x50, + 0x6f, 0x69, 0x66, 0x6e, 0x34, 0x69, 0x49, 0x6e, 0x35, 0x38, 0x66, 0x75, 0x43, 0x51, 0x6d, 0x41, 0x51, 0x30, + 0x42, 0x45, 0x6c, 0x5a, 0x63, 0x41, 0x51, 0x2f, 0x72, 0x35, 0x67, 0x45, 0x57, 0x2f, 0x6e, 0x50, 0x2b, 0x68, + 0x76, 0x36, 0x66, 0x2f, 0x6c, 0x73, 0x65, 0x41, 0x70, 0x65, 0x36, 0x6f, 0x71, 0x47, 0x37, 0x75, 0x36, 0x47, + 0x69, 0x0a, + 0x09, 0x75, 0x67, 0x41, 0x41, 0x41, 0x67, 0x44, 0x77, 0x41, 0x41, 0x41, 0x42, 0x77, 0x77, 0x51, 0x6a, 0x41, + 0x41, 0x4d, 0x41, 0x42, 0x77, 0x41, 0x63, 0x51, 0x41, 0x34, 0x47, 0x67, 0x77, 0x53, 0x6d, 0x41, 0x49, 0x4d, + 0x43, 0x42, 0x51, 0x45, 0x44, 0x42, 0x41, 0x41, 0x59, 0x43, 0x42, 0x44, 0x38, 0x50, 0x4f, 0x77, 0x79, 0x4d, + 0x51, 0x41, 0x76, 0x37, 0x50, 0x54, 0x73, 0x4d, 0x44, 0x63, 0x7a, 0x46, 0x53, 0x4d, 0x52, 0x4d, 0x78, 0x55, + 0x6a, 0x0a, + 0x09, 0x38, 0x4e, 0x50, 0x54, 0x30, 0x39, 0x50, 0x2b, 0x2f, 0x67, 0x51, 0x6a, 0x2f, 0x67, 0x41, 0x43, 0x41, + 0x4a, 0x37, 0x2f, 0x45, 0x67, 0x48, 0x44, 0x42, 0x43, 0x4d, 0x41, 0x41, 0x77, 0x41, 0x4a, 0x41, 0x43, 0x56, + 0x41, 0x45, 0x77, 0x4b, 0x44, 0x41, 0x41, 0x65, 0x65, 0x42, 0x49, 0x4d, 0x41, 0x70, 0x67, 0x6f, 0x48, 0x43, + 0x41, 0x55, 0x42, 0x47, 0x51, 0x51, 0x41, 0x47, 0x41, 0x6f, 0x51, 0x2f, 0x44, 0x7a, 0x73, 0x4d, 0x74, 0x54, + 0x4d, 0x0a, + 0x09, 0x4d, 0x51, 0x41, 0x51, 0x35, 0x50, 0x7a, 0x73, 0x45, 0x4f, 0x34, 0x77, 0x45, 0x7a, 0x4d, 0x56, 0x49, + 0x78, 0x45, 0x7a, 0x46, 0x51, 0x4d, 0x6a, 0x45, 0x2f, 0x44, 0x54, 0x30, 0x39, 0x4f, 0x6b, 0x67, 0x56, 0x49, + 0x45, 0x49, 0x2f, 0x37, 0x39, 0x32, 0x61, 0x7a, 0x2b, 0x77, 0x41, 0x46, 0x41, 0x41, 0x41, 0x45, 0x41, 0x32, + 0x51, 0x42, 0x65, 0x42, 0x64, 0x73, 0x45, 0x70, 0x67, 0x41, 0x47, 0x41, 0x45, 0x31, 0x41, 0x4b, 0x67, 0x4b, + 0x63, 0x0a, + 0x09, 0x41, 0x77, 0x51, 0x44, 0x41, 0x5a, 0x77, 0x41, 0x41, 0x51, 0x51, 0x45, 0x41, 0x77, 0x47, 0x63, 0x41, + 0x67, 0x45, 0x46, 0x42, 0x67, 0x55, 0x41, 0x6e, 0x41, 0x59, 0x46, 0x51, 0x67, 0x55, 0x45, 0x41, 0x67, 0x45, + 0x41, 0x42, 0x51, 0x4f, 0x6f, 0x42, 0x71, 0x63, 0x48, 0x41, 0x51, 0x49, 0x41, 0x4a, 0x41, 0x51, 0x6a, 0x42, + 0x78, 0x44, 0x38, 0x37, 0x44, 0x49, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x39, 0x4f, 0x77, 0x58, 0x4f, 0x54, 0x42, + 0x4c, 0x0a, + 0x09, 0x55, 0x31, 0x67, 0x48, 0x42, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, + 0x51, 0x63, 0x51, 0x42, 0x4f, 0x31, 0x5a, 0x49, 0x67, 0x6b, 0x43, 0x46, 0x51, 0x45, 0x31, 0x41, 0x51, 0x58, + 0x62, 0x2b, 0x2f, 0x67, 0x45, 0x43, 0x50, 0x72, 0x2b, 0x42, 0x51, 0x49, 0x44, 0x38, 0x50, 0x36, 0x52, 0x2f, + 0x70, 0x4f, 0x32, 0x41, 0x64, 0x47, 0x6d, 0x41, 0x64, 0x45, 0x41, 0x41, 0x41, 0x49, 0x41, 0x32, 0x51, 0x46, + 0x67, 0x0a, + 0x09, 0x42, 0x64, 0x73, 0x44, 0x6f, 0x67, 0x41, 0x44, 0x41, 0x41, 0x63, 0x41, 0x48, 0x45, 0x41, 0x4e, 0x41, + 0x4a, 0x77, 0x43, 0x42, 0x70, 0x77, 0x45, 0x43, 0x41, 0x55, 0x42, 0x42, 0x41, 0x41, 0x6a, 0x43, 0x42, 0x44, + 0x38, 0x50, 0x4d, 0x51, 0x79, 0x4d, 0x51, 0x41, 0x51, 0x31, 0x4f, 0x7a, 0x55, 0x37, 0x44, 0x41, 0x54, 0x49, + 0x52, 0x55, 0x68, 0x46, 0x53, 0x45, 0x56, 0x49, 0x64, 0x6b, 0x46, 0x41, 0x76, 0x72, 0x2b, 0x42, 0x51, 0x4c, + 0x36, 0x0a, + 0x09, 0x2f, 0x67, 0x4f, 0x69, 0x71, 0x50, 0x43, 0x71, 0x41, 0x41, 0x45, 0x41, 0x32, 0x51, 0x42, 0x65, 0x42, + 0x64, 0x73, 0x45, 0x70, 0x67, 0x41, 0x47, 0x41, 0x45, 0x39, 0x41, 0x4b, 0x77, 0x61, 0x63, 0x41, 0x41, 0x59, + 0x44, 0x42, 0x41, 0x4d, 0x46, 0x6e, 0x41, 0x51, 0x45, 0x41, 0x77, 0x43, 0x63, 0x41, 0x51, 0x49, 0x42, 0x42, + 0x70, 0x77, 0x46, 0x42, 0x67, 0x49, 0x43, 0x41, 0x55, 0x49, 0x47, 0x42, 0x51, 0x4d, 0x43, 0x41, 0x41, 0x55, + 0x45, 0x0a, + 0x09, 0x71, 0x41, 0x47, 0x6e, 0x42, 0x77, 0x59, 0x43, 0x4a, 0x41, 0x51, 0x41, 0x49, 0x77, 0x63, 0x51, 0x2f, + 0x44, 0x7a, 0x73, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x50, 0x54, 0x73, 0x46, 0x7a, 0x6b, 0x77, 0x53, 0x31, 0x4e, + 0x59, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x54, 0x74, 0x42, + 0x78, 0x41, 0x49, 0x37, 0x56, 0x6b, 0x69, 0x45, 0x7a, 0x55, 0x42, 0x46, 0x51, 0x45, 0x31, 0x41, 0x64, 0x6b, + 0x46, 0x0a, + 0x09, 0x41, 0x76, 0x72, 0x2b, 0x42, 0x41, 0x59, 0x44, 0x38, 0x4c, 0x62, 0x2b, 0x4c, 0x36, 0x62, 0x2b, 0x4c, + 0x37, 0x59, 0x42, 0x62, 0x51, 0x41, 0x43, 0x41, 0x4a, 0x4d, 0x41, 0x41, 0x41, 0x4f, 0x77, 0x42, 0x66, 0x41, + 0x41, 0x41, 0x77, 0x41, 0x6b, 0x41, 0x48, 0x42, 0x41, 0x4b, 0x79, 0x51, 0x65, 0x43, 0x51, 0x59, 0x45, 0x43, + 0x68, 0x30, 0x54, 0x42, 0x41, 0x41, 0x55, 0x68, 0x68, 0x4f, 0x49, 0x45, 0x4a, 0x55, 0x58, 0x6b, 0x51, 0x43, + 0x44, 0x0a, + 0x09, 0x41, 0x68, 0x30, 0x61, 0x44, 0x51, 0x6b, 0x46, 0x42, 0x41, 0x6f, 0x65, 0x41, 0x51, 0x30, 0x63, 0x47, + 0x67, 0x51, 0x63, 0x42, 0x51, 0x45, 0x44, 0x41, 0x43, 0x59, 0x61, 0x45, 0x79, 0x55, 0x51, 0x33, 0x4d, 0x54, + 0x38, 0x37, 0x4e, 0x54, 0x73, 0x45, 0x4f, 0x34, 0x52, 0x4f, 0x54, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x52, 0x45, + 0x6a, 0x6b, 0x78, 0x41, 0x43, 0x2f, 0x75, 0x39, 0x76, 0x37, 0x30, 0x37, 0x68, 0x44, 0x4e, 0x45, 0x54, 0x6b, + 0x35, 0x0a, + 0x09, 0x46, 0x7a, 0x6b, 0x77, 0x41, 0x55, 0x75, 0x77, 0x44, 0x46, 0x52, 0x59, 0x76, 0x51, 0x41, 0x6c, 0x41, + 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x6c, 0x41, 0x43, 0x58, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, + 0x5a, 0x74, 0x6e, 0x6b, 0x4a, 0x65, 0x67, 0x70, 0x36, 0x49, 0x41, 0x4e, 0x64, 0x4a, 0x54, 0x4d, 0x56, 0x49, + 0x78, 0x4d, 0x6a, 0x4e, 0x54, 0x51, 0x32, 0x50, 0x77, 0x45, 0x2b, 0x41, 0x54, 0x55, 0x30, 0x4a, 0x69, 0x4d, + 0x69, 0x0a, + 0x09, 0x42, 0x67, 0x63, 0x31, 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, 0x56, 0x46, 0x41, 0x59, 0x50, 0x41, + 0x51, 0x34, 0x42, 0x42, 0x77, 0x34, 0x42, 0x46, 0x51, 0x47, 0x48, 0x79, 0x38, 0x76, 0x46, 0x76, 0x7a, 0x68, + 0x61, 0x57, 0x6a, 0x6b, 0x7a, 0x67, 0x32, 0x78, 0x50, 0x73, 0x32, 0x46, 0x65, 0x77, 0x57, 0x65, 0x34, 0x33, + 0x30, 0x68, 0x61, 0x57, 0x43, 0x38, 0x6e, 0x43, 0x41, 0x59, 0x47, 0x2f, 0x76, 0x34, 0x42, 0x6b, 0x5a, 0x70, + 0x6c, 0x0a, + 0x09, 0x67, 0x6c, 0x5a, 0x5a, 0x4e, 0x56, 0x34, 0x78, 0x57, 0x57, 0x35, 0x47, 0x51, 0x37, 0x77, 0x35, 0x4f, + 0x4d, 0x4b, 0x66, 0x54, 0x49, 0x6c, 0x57, 0x56, 0x69, 0x38, 0x31, 0x47, 0x52, 0x55, 0x38, 0x4e, 0x41, 0x41, + 0x41, 0x41, 0x67, 0x43, 0x48, 0x2f, 0x70, 0x77, 0x48, 0x63, 0x51, 0x57, 0x69, 0x41, 0x41, 0x73, 0x41, 0x54, + 0x41, 0x43, 0x56, 0x51, 0x44, 0x49, 0x59, 0x44, 0x41, 0x4d, 0x4a, 0x71, 0x52, 0x6b, 0x56, 0x47, 0x77, 0x4f, + 0x70, 0x0a, + 0x09, 0x54, 0x41, 0x38, 0x30, 0x4d, 0x77, 0x2b, 0x73, 0x4d, 0x4b, 0x6b, 0x33, 0x46, 0x61, 0x77, 0x6b, 0x71, + 0x54, 0x64, 0x44, 0x54, 0x54, 0x4d, 0x30, 0x48, 0x68, 0x6f, 0x41, 0x4b, 0x42, 0x49, 0x47, 0x47, 0x41, 0x77, + 0x6f, 0x47, 0x69, 0x73, 0x65, 0x4b, 0x45, 0x6b, 0x53, 0x4b, 0x79, 0x6f, 0x6f, 0x53, 0x53, 0x77, 0x39, 0x54, + 0x52, 0x44, 0x63, 0x37, 0x50, 0x7a, 0x73, 0x45, 0x50, 0x37, 0x39, 0x2f, 0x6a, 0x7a, 0x47, 0x45, 0x4f, 0x34, + 0x52, 0x0a, + 0x09, 0x45, 0x6a, 0x6b, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x31, 0x4d, 0x54, 0x38, 0x37, 0x42, 0x44, 0x2b, 0x37, + 0x64, 0x54, 0x47, 0x45, 0x4d, 0x58, 0x75, 0x4d, 0x68, 0x44, 0x45, 0x37, 0x68, 0x45, 0x35, 0x4f, 0x54, 0x41, + 0x41, 0x53, 0x37, 0x41, 0x4a, 0x56, 0x45, 0x75, 0x77, 0x44, 0x46, 0x52, 0x62, 0x53, 0x37, 0x41, 0x51, 0x56, + 0x46, 0x74, 0x4c, 0x73, 0x42, 0x4e, 0x55, 0x57, 0x30, 0x75, 0x77, 0x46, 0x46, 0x52, 0x62, 0x57, 0x4c, 0x30, + 0x41, 0x0a, + 0x09, 0x54, 0x66, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x54, 0x51, 0x42, 0x4e, 0x41, 0x45, 0x41, 0x34, 0x45, + 0x54, 0x63, 0x34, 0x57, 0x55, 0x41, 0x4a, 0x44, 0x30, 0x34, 0x66, 0x54, 0x69, 0x39, 0x4f, 0x50, 0x30, 0x34, + 0x45, 0x41, 0x56, 0x30, 0x42, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x6a, 0x49, + 0x67, 0x59, 0x42, 0x44, 0x67, 0x45, 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x7a, 0x4d, 0x68, 0x59, + 0x58, 0x0a, + 0x09, 0x4e, 0x54, 0x4d, 0x52, 0x50, 0x67, 0x45, 0x31, 0x4e, 0x43, 0x59, 0x6e, 0x4a, 0x69, 0x51, 0x6a, 0x49, + 0x67, 0x59, 0x48, 0x42, 0x67, 0x49, 0x56, 0x46, 0x42, 0x49, 0x58, 0x46, 0x67, 0x51, 0x7a, 0x4d, 0x6a, 0x59, + 0x33, 0x46, 0x77, 0x59, 0x45, 0x49, 0x79, 0x49, 0x6b, 0x4a, 0x79, 0x59, 0x43, 0x4e, 0x54, 0x51, 0x53, 0x4e, + 0x7a, 0x59, 0x6b, 0x4d, 0x7a, 0x49, 0x45, 0x46, 0x78, 0x34, 0x42, 0x46, 0x52, 0x41, 0x41, 0x42, 0x51, 0x4c, + 0x36, 0x0a, + 0x09, 0x6a, 0x6e, 0x78, 0x37, 0x6a, 0x5a, 0x42, 0x36, 0x65, 0x59, 0x38, 0x43, 0x49, 0x54, 0x79, 0x62, 0x5a, + 0x36, 0x7a, 0x58, 0x32, 0x4b, 0x74, 0x6e, 0x6e, 0x44, 0x75, 0x50, 0x6b, 0x71, 0x55, 0x2f, 0x51, 0x47, 0x6a, + 0x2b, 0x31, 0x62, 0x42, 0x37, 0x34, 0x6d, 0x43, 0x64, 0x73, 0x58, 0x4e, 0x74, 0x61, 0x51, 0x45, 0x55, 0x6e, + 0x59, 0x48, 0x35, 0x61, 0x46, 0x70, 0x39, 0x2f, 0x74, 0x6d, 0x59, 0x75, 0x66, 0x36, 0x34, 0x67, 0x49, 0x43, + 0x47, 0x0a, + 0x09, 0x69, 0x48, 0x36, 0x42, 0x41, 0x56, 0x4b, 0x39, 0x31, 0x41, 0x46, 0x72, 0x65, 0x30, 0x74, 0x50, 0x2f, + 0x73, 0x4c, 0x2b, 0x36, 0x41, 0x49, 0x5a, 0x6a, 0x36, 0x4f, 0x6b, 0x6a, 0x6f, 0x79, 0x6c, 0x70, 0x50, 0x35, + 0x49, 0x54, 0x55, 0x6e, 0x35, 0x79, 0x4d, 0x6a, 0x36, 0x53, 0x30, 0x79, 0x44, 0x2f, 0x53, 0x41, 0x57, 0x33, + 0x37, 0x46, 0x72, 0x76, 0x46, 0x43, 0x44, 0x69, 0x30, 0x46, 0x41, 0x5a, 0x76, 0x36, 0x31, 0x77, 0x5a, 0x2f, + 0x2b, 0x0a, + 0x09, 0x36, 0x6d, 0x70, 0x6f, 0x62, 0x56, 0x64, 0x52, 0x62, 0x32, 0x46, 0x6e, 0x67, 0x33, 0x31, 0x39, 0x41, + 0x55, 0x6d, 0x39, 0x74, 0x67, 0x46, 0x4b, 0x66, 0x58, 0x2b, 0x48, 0x72, 0x71, 0x42, 0x69, 0x35, 0x6e, 0x76, + 0x2b, 0x2b, 0x66, 0x37, 0x51, 0x42, 0x67, 0x41, 0x41, 0x41, 0x67, 0x41, 0x51, 0x41, 0x41, 0x41, 0x46, 0x61, + 0x41, 0x58, 0x56, 0x41, 0x41, 0x49, 0x41, 0x43, 0x67, 0x43, 0x36, 0x51, 0x45, 0x45, 0x41, 0x45, 0x51, 0x45, + 0x41, 0x0a, + 0x09, 0x42, 0x41, 0x55, 0x45, 0x41, 0x68, 0x45, 0x46, 0x42, 0x51, 0x51, 0x42, 0x45, 0x51, 0x6f, 0x44, 0x43, + 0x67, 0x41, 0x52, 0x41, 0x67, 0x41, 0x44, 0x41, 0x77, 0x6f, 0x48, 0x45, 0x51, 0x55, 0x45, 0x42, 0x68, 0x45, + 0x46, 0x42, 0x51, 0x51, 0x4a, 0x45, 0x51, 0x4d, 0x4b, 0x43, 0x42, 0x45, 0x4b, 0x41, 0x77, 0x70, 0x43, 0x41, + 0x41, 0x4d, 0x48, 0x6c, 0x51, 0x45, 0x44, 0x67, 0x51, 0x6b, 0x46, 0x43, 0x51, 0x67, 0x48, 0x42, 0x67, 0x51, + 0x44, 0x0a, + 0x09, 0x41, 0x67, 0x45, 0x41, 0x43, 0x51, 0x55, 0x4b, 0x43, 0x78, 0x44, 0x55, 0x78, 0x42, 0x63, 0x35, 0x4d, + 0x51, 0x41, 0x76, 0x50, 0x4f, 0x54, 0x55, 0x37, 0x42, 0x49, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, + 0x51, 0x42, 0x65, 0x30, 0x48, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x58, 0x74, 0x42, 0x77, 0x58, 0x74, 0x42, + 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, + 0x49, 0x0a, + 0x09, 0x37, 0x56, 0x6b, 0x69, 0x73, 0x69, 0x41, 0x4d, 0x41, 0x51, 0x46, 0x64, 0x51, 0x44, 0x6f, 0x50, 0x41, + 0x46, 0x67, 0x41, 0x64, 0x67, 0x42, 0x77, 0x41, 0x49, 0x77, 0x41, 0x42, 0x51, 0x63, 0x42, 0x43, 0x41, 0x49, + 0x47, 0x41, 0x77, 0x6b, 0x45, 0x46, 0x67, 0x45, 0x5a, 0x41, 0x6c, 0x59, 0x42, 0x57, 0x41, 0x4a, 0x51, 0x44, + 0x47, 0x63, 0x42, 0x61, 0x41, 0x4a, 0x34, 0x41, 0x58, 0x59, 0x43, 0x66, 0x41, 0x4e, 0x79, 0x42, 0x48, 0x63, + 0x48, 0x0a, + 0x09, 0x65, 0x41, 0x69, 0x48, 0x41, 0x59, 0x67, 0x43, 0x67, 0x41, 0x79, 0x59, 0x41, 0x70, 0x6b, 0x44, 0x6c, + 0x67, 0x51, 0x58, 0x58, 0x51, 0x42, 0x64, 0x43, 0x51, 0x45, 0x68, 0x41, 0x54, 0x4d, 0x42, 0x49, 0x77, 0x4d, + 0x68, 0x41, 0x79, 0x4d, 0x43, 0x76, 0x50, 0x37, 0x75, 0x41, 0x69, 0x58, 0x2b, 0x65, 0x2b, 0x55, 0x43, 0x4f, + 0x64, 0x4b, 0x49, 0x2f, 0x56, 0x2b, 0x49, 0x31, 0x51, 0x55, 0x4f, 0x2f, 0x52, 0x6b, 0x44, 0x72, 0x76, 0x6f, + 0x72, 0x0a, + 0x09, 0x41, 0x58, 0x2f, 0x2b, 0x67, 0x51, 0x41, 0x44, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x54, 0x73, 0x42, + 0x64, 0x55, 0x41, 0x43, 0x41, 0x41, 0x52, 0x41, 0x43, 0x41, 0x41, 0x51, 0x30, 0x41, 0x6a, 0x47, 0x51, 0x43, + 0x56, 0x43, 0x67, 0x6d, 0x56, 0x45, 0x6f, 0x45, 0x42, 0x6c, 0x51, 0x71, 0x74, 0x48, 0x78, 0x45, 0x4c, 0x43, + 0x41, 0x49, 0x54, 0x47, 0x52, 0x38, 0x46, 0x41, 0x41, 0x34, 0x63, 0x46, 0x67, 0x55, 0x5a, 0x48, 0x43, 0x34, + 0x4a, 0x0a, + 0x09, 0x41, 0x42, 0x77, 0x53, 0x42, 0x43, 0x45, 0x51, 0x2f, 0x4f, 0x77, 0x79, 0x2f, 0x4f, 0x7a, 0x55, 0x37, + 0x42, 0x45, 0x58, 0x4f, 0x54, 0x6b, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x4f, 0x7a, 0x30, 0x37, 0x42, 0x44, + 0x75, 0x4f, 0x54, 0x43, 0x79, 0x44, 0x79, 0x49, 0x42, 0x41, 0x56, 0x30, 0x42, 0x45, 0x53, 0x45, 0x79, 0x4e, + 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x4d, 0x42, 0x45, 0x53, 0x45, 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x4d, + 0x6c, 0x0a, + 0x09, 0x49, 0x54, 0x49, 0x57, 0x46, 0x52, 0x51, 0x47, 0x42, 0x78, 0x34, 0x42, 0x46, 0x52, 0x51, 0x45, 0x49, + 0x79, 0x45, 0x42, 0x6b, 0x77, 0x46, 0x45, 0x6f, 0x35, 0x32, 0x64, 0x6f, 0x2f, 0x36, 0x38, 0x41, 0x53, 0x75, + 0x55, 0x6b, 0x5a, 0x47, 0x55, 0x2f, 0x67, 0x73, 0x43, 0x42, 0x4f, 0x66, 0x36, 0x67, 0x48, 0x79, 0x56, 0x70, + 0x66, 0x37, 0x77, 0x2b, 0x2f, 0x33, 0x6f, 0x41, 0x73, 0x6e, 0x39, 0x33, 0x59, 0x65, 0x4c, 0x6a, 0x49, 0x55, + 0x43, 0x0a, + 0x09, 0x5a, 0x76, 0x34, 0x2b, 0x62, 0x33, 0x4a, 0x78, 0x63, 0x4b, 0x62, 0x41, 0x73, 0x59, 0x6d, 0x69, 0x46, + 0x43, 0x44, 0x4c, 0x6d, 0x4d, 0x6a, 0x61, 0x41, 0x41, 0x45, 0x41, 0x63, 0x2f, 0x2f, 0x6a, 0x42, 0x53, 0x63, + 0x46, 0x38, 0x41, 0x41, 0x5a, 0x41, 0x44, 0x5a, 0x41, 0x47, 0x67, 0x32, 0x68, 0x44, 0x71, 0x34, 0x4b, 0x6c, + 0x52, 0x45, 0x42, 0x6f, 0x51, 0x43, 0x75, 0x42, 0x4a, 0x55, 0x58, 0x6b, 0x52, 0x47, 0x4d, 0x47, 0x67, 0x63, + 0x5a, 0x0a, + 0x09, 0x44, 0x51, 0x41, 0x77, 0x46, 0x42, 0x41, 0x61, 0x45, 0x50, 0x7a, 0x73, 0x4d, 0x75, 0x77, 0x78, 0x41, + 0x42, 0x44, 0x6b, 0x39, 0x4f, 0x7a, 0x30, 0x37, 0x42, 0x44, 0x75, 0x39, 0x75, 0x34, 0x77, 0x74, 0x41, 0x38, + 0x62, 0x48, 0x78, 0x73, 0x43, 0x41, 0x56, 0x30, 0x42, 0x46, 0x53, 0x34, 0x42, 0x49, 0x79, 0x41, 0x41, 0x45, + 0x52, 0x41, 0x41, 0x49, 0x54, 0x49, 0x32, 0x4e, 0x78, 0x55, 0x4f, 0x41, 0x53, 0x4d, 0x67, 0x41, 0x42, 0x45, + 0x51, 0x0a, + 0x09, 0x41, 0x43, 0x45, 0x79, 0x46, 0x67, 0x55, 0x6e, 0x5a, 0x75, 0x65, 0x43, 0x2f, 0x77, 0x44, 0x2b, 0x38, + 0x41, 0x45, 0x51, 0x41, 0x51, 0x43, 0x43, 0x35, 0x32, 0x5a, 0x71, 0x37, 0x59, 0x54, 0x2b, 0x72, 0x66, 0x35, + 0x36, 0x41, 0x59, 0x59, 0x42, 0x55, 0x34, 0x62, 0x74, 0x42, 0x57, 0x4c, 0x56, 0x58, 0x31, 0x37, 0x2b, 0x78, + 0x2f, 0x37, 0x59, 0x2f, 0x74, 0x6e, 0x2b, 0x78, 0x31, 0x35, 0x66, 0x30, 0x30, 0x68, 0x49, 0x41, 0x5a, 0x38, + 0x42, 0x0a, + 0x09, 0x5a, 0x77, 0x46, 0x6f, 0x41, 0x5a, 0x39, 0x48, 0x41, 0x41, 0x49, 0x41, 0x79, 0x51, 0x41, 0x41, 0x42, + 0x62, 0x41, 0x46, 0x31, 0x51, 0x41, 0x49, 0x41, 0x42, 0x45, 0x41, 0x4c, 0x6b, 0x41, 0x56, 0x41, 0x4a, 0x55, + 0x4a, 0x67, 0x51, 0x47, 0x56, 0x45, 0x41, 0x67, 0x43, 0x45, 0x41, 0x6f, 0x41, 0x42, 0x52, 0x6b, 0x4e, 0x4d, + 0x67, 0x41, 0x63, 0x43, 0x51, 0x51, 0x53, 0x45, 0x50, 0x7a, 0x73, 0x39, 0x4f, 0x77, 0x52, 0x4f, 0x54, 0x6b, + 0x35, 0x0a, + 0x09, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x2b, 0x7a, 0x30, 0x37, 0x44, 0x43, 0x79, 0x59, 0x42, 0x4d, 0x42, 0x41, + 0x56, 0x30, 0x42, 0x45, 0x54, 0x4d, 0x67, 0x41, 0x42, 0x45, 0x51, 0x41, 0x43, 0x45, 0x6c, 0x49, 0x53, 0x41, + 0x41, 0x45, 0x52, 0x41, 0x41, 0x4b, 0x51, 0x45, 0x42, 0x6b, 0x2f, 0x51, 0x42, 0x4e, 0x51, 0x45, 0x66, 0x2f, + 0x75, 0x48, 0x2b, 0x79, 0x2f, 0x35, 0x43, 0x41, 0x5a, 0x38, 0x42, 0x73, 0x67, 0x47, 0x57, 0x2f, 0x6d, 0x6a, + 0x2b, 0x0a, + 0x09, 0x55, 0x50, 0x35, 0x68, 0x42, 0x53, 0x2f, 0x37, 0x64, 0x77, 0x45, 0x59, 0x41, 0x53, 0x34, 0x42, 0x4c, + 0x41, 0x45, 0x58, 0x70, 0x76, 0x36, 0x58, 0x2f, 0x6f, 0x44, 0x2b, 0x66, 0x76, 0x36, 0x57, 0x41, 0x41, 0x45, + 0x41, 0x79, 0x51, 0x41, 0x41, 0x42, 0x49, 0x73, 0x46, 0x31, 0x51, 0x41, 0x4c, 0x41, 0x43, 0x35, 0x41, 0x46, + 0x51, 0x61, 0x56, 0x42, 0x41, 0x4b, 0x56, 0x41, 0x49, 0x45, 0x49, 0x6c, 0x51, 0x53, 0x74, 0x43, 0x67, 0x55, + 0x42, 0x0a, + 0x09, 0x43, 0x51, 0x63, 0x44, 0x48, 0x41, 0x41, 0x45, 0x44, 0x42, 0x44, 0x38, 0x37, 0x44, 0x4c, 0x55, 0x78, + 0x4d, 0x51, 0x78, 0x41, 0x43, 0x2f, 0x73, 0x37, 0x50, 0x54, 0x73, 0x45, 0x4f, 0x34, 0x77, 0x73, 0x68, 0x38, + 0x4e, 0x41, 0x51, 0x46, 0x64, 0x45, 0x79, 0x45, 0x56, 0x49, 0x52, 0x45, 0x68, 0x46, 0x53, 0x45, 0x52, 0x49, + 0x52, 0x55, 0x68, 0x79, 0x51, 0x4f, 0x77, 0x2f, 0x52, 0x6f, 0x43, 0x78, 0x2f, 0x30, 0x35, 0x41, 0x76, 0x6a, + 0x38, 0x0a, + 0x09, 0x50, 0x67, 0x58, 0x56, 0x71, 0x76, 0x35, 0x47, 0x71, 0x76, 0x33, 0x6a, 0x71, 0x67, 0x41, 0x42, 0x41, + 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x51, 0x6a, 0x42, 0x64, 0x55, 0x41, 0x43, 0x51, 0x41, 0x70, 0x51, 0x42, 0x49, + 0x47, 0x6c, 0x51, 0x51, 0x43, 0x6c, 0x51, 0x43, 0x42, 0x42, 0x4b, 0x30, 0x49, 0x42, 0x51, 0x45, 0x48, 0x41, + 0x78, 0x77, 0x41, 0x42, 0x41, 0x6f, 0x51, 0x2f, 0x4f, 0x77, 0x79, 0x31, 0x4d, 0x51, 0x78, 0x41, 0x43, 0x2f, + 0x73, 0x0a, + 0x09, 0x39, 0x4f, 0x77, 0x51, 0x37, 0x6a, 0x43, 0x79, 0x44, 0x77, 0x73, 0x42, 0x41, 0x56, 0x30, 0x54, 0x49, + 0x52, 0x55, 0x68, 0x45, 0x53, 0x45, 0x56, 0x49, 0x52, 0x45, 0x6a, 0x79, 0x51, 0x4e, 0x61, 0x2f, 0x58, 0x41, + 0x43, 0x55, 0x50, 0x32, 0x77, 0x79, 0x67, 0x58, 0x56, 0x71, 0x76, 0x35, 0x49, 0x71, 0x76, 0x30, 0x33, 0x41, + 0x41, 0x41, 0x42, 0x41, 0x48, 0x50, 0x2f, 0x34, 0x77, 0x57, 0x4c, 0x42, 0x66, 0x41, 0x41, 0x48, 0x51, 0x41, + 0x35, 0x0a, + 0x09, 0x51, 0x43, 0x41, 0x41, 0x42, 0x52, 0x73, 0x42, 0x6c, 0x51, 0x4d, 0x62, 0x6c, 0x51, 0x67, 0x53, 0x6f, + 0x52, 0x47, 0x75, 0x46, 0x5a, 0x55, 0x4f, 0x6b, 0x51, 0x69, 0x4d, 0x48, 0x67, 0x49, 0x41, 0x48, 0x42, 0x45, + 0x30, 0x42, 0x44, 0x4d, 0x59, 0x47, 0x51, 0x73, 0x51, 0x48, 0x68, 0x44, 0x38, 0x37, 0x50, 0x7a, 0x6b, 0x2f, + 0x4d, 0x51, 0x78, 0x41, 0x42, 0x44, 0x6b, 0x39, 0x4f, 0x7a, 0x30, 0x37, 0x42, 0x44, 0x2b, 0x31, 0x4f, 0x34, + 0x52, 0x0a, + 0x09, 0x4f, 0x54, 0x6b, 0x77, 0x4a, 0x52, 0x45, 0x68, 0x4e, 0x53, 0x45, 0x52, 0x42, 0x67, 0x51, 0x6a, 0x49, + 0x41, 0x41, 0x52, 0x45, 0x41, 0x41, 0x68, 0x4d, 0x67, 0x51, 0x58, 0x46, 0x53, 0x59, 0x6d, 0x49, 0x79, 0x41, + 0x41, 0x45, 0x52, 0x41, 0x41, 0x49, 0x54, 0x49, 0x32, 0x42, 0x4d, 0x50, 0x2b, 0x74, 0x67, 0x49, 0x53, 0x64, + 0x66, 0x37, 0x6d, 0x6f, 0x50, 0x36, 0x69, 0x2f, 0x6e, 0x55, 0x42, 0x69, 0x77, 0x46, 0x65, 0x6b, 0x67, 0x45, + 0x48, 0x0a, + 0x09, 0x62, 0x33, 0x44, 0x38, 0x69, 0x2f, 0x37, 0x75, 0x2f, 0x75, 0x30, 0x42, 0x45, 0x77, 0x45, 0x53, 0x61, + 0x36, 0x6a, 0x56, 0x41, 0x5a, 0x47, 0x6d, 0x2f, 0x58, 0x39, 0x54, 0x56, 0x51, 0x47, 0x5a, 0x41, 0x57, 0x30, + 0x42, 0x62, 0x67, 0x47, 0x5a, 0x53, 0x45, 0x62, 0x58, 0x58, 0x32, 0x44, 0x2b, 0x7a, 0x76, 0x37, 0x52, 0x2f, + 0x74, 0x4c, 0x2b, 0x7a, 0x69, 0x55, 0x41, 0x41, 0x51, 0x44, 0x4a, 0x41, 0x41, 0x41, 0x46, 0x4f, 0x77, 0x58, + 0x56, 0x0a, + 0x09, 0x41, 0x41, 0x73, 0x41, 0x4c, 0x45, 0x41, 0x55, 0x43, 0x4a, 0x55, 0x43, 0x72, 0x51, 0x51, 0x41, 0x67, + 0x51, 0x6f, 0x47, 0x42, 0x77, 0x4d, 0x63, 0x42, 0x54, 0x67, 0x4a, 0x41, 0x52, 0x77, 0x41, 0x42, 0x41, 0x77, + 0x51, 0x2f, 0x4f, 0x77, 0x79, 0x2f, 0x4f, 0x77, 0x79, 0x4d, 0x51, 0x41, 0x76, 0x50, 0x4f, 0x51, 0x79, 0x2f, + 0x4f, 0x77, 0x77, 0x73, 0x6c, 0x41, 0x4e, 0x41, 0x51, 0x46, 0x64, 0x45, 0x7a, 0x4d, 0x52, 0x49, 0x52, 0x45, + 0x7a, 0x0a, + 0x09, 0x45, 0x53, 0x4d, 0x52, 0x49, 0x52, 0x45, 0x6a, 0x79, 0x63, 0x6f, 0x43, 0x33, 0x73, 0x72, 0x4b, 0x2f, + 0x53, 0x4c, 0x4b, 0x42, 0x64, 0x58, 0x39, 0x6e, 0x41, 0x4a, 0x6b, 0x2b, 0x69, 0x73, 0x43, 0x78, 0x2f, 0x30, + 0x35, 0x41, 0x41, 0x41, 0x42, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x47, 0x54, 0x42, 0x64, 0x55, 0x41, 0x41, + 0x77, 0x41, 0x35, 0x74, 0x77, 0x43, 0x76, 0x41, 0x67, 0x45, 0x63, 0x41, 0x41, 0x51, 0x45, 0x45, 0x50, 0x7a, + 0x73, 0x0a, + 0x09, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x44, 0x41, 0x42, 0x53, 0x37, 0x41, 0x51, 0x56, 0x46, 0x69, 0x39, 0x41, + 0x41, 0x54, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x41, 0x51, 0x41, 0x42, 0x41, 0x42, 0x41, 0x4f, 0x42, 0x45, + 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x44, 0x54, 0x41, 0x46, 0x51, 0x41, 0x56, 0x51, 0x42, 0x57, 0x41, 0x46, 0x6a, + 0x77, 0x57, 0x66, 0x42, 0x51, 0x5a, 0x64, 0x45, 0x7a, 0x4d, 0x52, 0x49, 0x38, 0x6e, 0x4b, 0x79, 0x67, 0x58, + 0x56, 0x0a, + 0x09, 0x2b, 0x69, 0x73, 0x41, 0x41, 0x66, 0x2b, 0x57, 0x2f, 0x6d, 0x59, 0x42, 0x6b, 0x77, 0x58, 0x56, 0x41, + 0x41, 0x73, 0x41, 0x54, 0x55, 0x41, 0x54, 0x43, 0x77, 0x49, 0x41, 0x42, 0x35, 0x55, 0x46, 0x73, 0x41, 0x43, + 0x42, 0x44, 0x41, 0x55, 0x49, 0x42, 0x6a, 0x6b, 0x42, 0x48, 0x41, 0x41, 0x45, 0x44, 0x42, 0x44, 0x38, 0x37, + 0x4f, 0x51, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x4f, 0x54, 0x38, 0x37, 0x42, 0x45, 0x35, 0x4f, 0x54, 0x41, + 0x42, 0x0a, + 0x09, 0x53, 0x37, 0x41, 0x51, 0x56, 0x46, 0x69, 0x39, 0x41, 0x41, 0x7a, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, + 0x41, 0x77, 0x41, 0x44, 0x41, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x44, 0x54, 0x41, + 0x4e, 0x51, 0x41, 0x31, 0x51, 0x44, 0x57, 0x41, 0x4e, 0x6a, 0x77, 0x32, 0x66, 0x44, 0x51, 0x5a, 0x64, 0x45, + 0x7a, 0x4d, 0x52, 0x45, 0x41, 0x59, 0x72, 0x41, 0x54, 0x55, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x79, 0x63, 0x72, + 0x4e, 0x0a, + 0x09, 0x34, 0x30, 0x30, 0x2f, 0x68, 0x6d, 0x34, 0x46, 0x31, 0x66, 0x71, 0x54, 0x2f, 0x76, 0x4c, 0x30, 0x71, + 0x70, 0x62, 0x43, 0x41, 0x41, 0x41, 0x42, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x56, 0x71, 0x42, 0x64, 0x55, + 0x41, 0x43, 0x67, 0x44, 0x76, 0x51, 0x43, 0x67, 0x49, 0x45, 0x51, 0x55, 0x47, 0x42, 0x51, 0x63, 0x52, 0x42, + 0x67, 0x59, 0x46, 0x41, 0x78, 0x45, 0x45, 0x42, 0x51, 0x51, 0x43, 0x45, 0x51, 0x55, 0x46, 0x42, 0x45, 0x49, + 0x49, 0x0a, + 0x09, 0x42, 0x51, 0x49, 0x44, 0x41, 0x77, 0x43, 0x76, 0x43, 0x51, 0x59, 0x46, 0x41, 0x51, 0x51, 0x47, 0x43, + 0x41, 0x45, 0x63, 0x41, 0x41, 0x51, 0x4c, 0x45, 0x50, 0x7a, 0x73, 0x4d, 0x74, 0x54, 0x45, 0x45, 0x54, 0x6b, + 0x78, 0x41, 0x43, 0x38, 0x38, 0x37, 0x44, 0x49, 0x58, 0x4f, 0x54, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, + 0x41, 0x54, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x54, + 0x74, 0x0a, + 0x09, 0x57, 0x53, 0x4b, 0x79, 0x43, 0x41, 0x4d, 0x42, 0x41, 0x56, 0x31, 0x41, 0x6b, 0x68, 0x51, 0x43, 0x41, + 0x51, 0x51, 0x43, 0x43, 0x51, 0x67, 0x57, 0x41, 0x69, 0x67, 0x46, 0x4b, 0x41, 0x67, 0x33, 0x41, 0x6a, 0x59, + 0x46, 0x4e, 0x41, 0x68, 0x48, 0x41, 0x6b, 0x59, 0x46, 0x51, 0x77, 0x68, 0x56, 0x41, 0x6d, 0x63, 0x43, 0x64, + 0x67, 0x4a, 0x33, 0x42, 0x59, 0x4d, 0x43, 0x69, 0x41, 0x57, 0x50, 0x43, 0x4a, 0x51, 0x43, 0x6d, 0x77, 0x6a, + 0x6e, 0x0a, + 0x09, 0x41, 0x68, 0x55, 0x47, 0x41, 0x77, 0x6b, 0x46, 0x43, 0x51, 0x59, 0x62, 0x41, 0x78, 0x6b, 0x48, 0x42, + 0x51, 0x6f, 0x44, 0x43, 0x67, 0x63, 0x59, 0x41, 0x79, 0x67, 0x46, 0x4b, 0x77, 0x59, 0x71, 0x42, 0x7a, 0x59, + 0x45, 0x4e, 0x67, 0x55, 0x32, 0x42, 0x6a, 0x55, 0x48, 0x4d, 0x41, 0x78, 0x42, 0x41, 0x30, 0x41, 0x45, 0x52, + 0x51, 0x56, 0x41, 0x42, 0x6b, 0x41, 0x48, 0x51, 0x41, 0x78, 0x69, 0x41, 0x32, 0x41, 0x45, 0x61, 0x41, 0x56, + 0x6e, 0x0a, + 0x09, 0x42, 0x33, 0x63, 0x46, 0x63, 0x41, 0x79, 0x4c, 0x41, 0x34, 0x73, 0x46, 0x6a, 0x67, 0x61, 0x50, 0x42, + 0x34, 0x38, 0x4d, 0x6d, 0x67, 0x4f, 0x64, 0x42, 0x70, 0x30, 0x48, 0x74, 0x67, 0x4f, 0x31, 0x42, 0x38, 0x55, + 0x44, 0x78, 0x51, 0x66, 0x58, 0x41, 0x39, 0x59, 0x48, 0x36, 0x41, 0x50, 0x70, 0x42, 0x4f, 0x67, 0x46, 0x36, + 0x67, 0x62, 0x33, 0x41, 0x2f, 0x67, 0x46, 0x2b, 0x51, 0x59, 0x73, 0x58, 0x58, 0x45, 0x41, 0x58, 0x58, 0x45, + 0x54, 0x0a, + 0x09, 0x4d, 0x78, 0x45, 0x42, 0x49, 0x51, 0x6b, 0x42, 0x49, 0x51, 0x45, 0x52, 0x49, 0x38, 0x6e, 0x4b, 0x41, + 0x70, 0x34, 0x42, 0x42, 0x50, 0x30, 0x62, 0x41, 0x78, 0x72, 0x2b, 0x39, 0x76, 0x30, 0x7a, 0x79, 0x67, 0x58, + 0x56, 0x2f, 0x59, 0x6b, 0x43, 0x64, 0x2f, 0x31, 0x49, 0x2f, 0x4f, 0x4d, 0x43, 0x7a, 0x2f, 0x30, 0x78, 0x41, + 0x41, 0x41, 0x42, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x52, 0x71, 0x42, 0x64, 0x55, 0x41, 0x42, 0x51, 0x41, + 0x6c, 0x0a, + 0x09, 0x51, 0x41, 0x77, 0x43, 0x6c, 0x51, 0x43, 0x42, 0x42, 0x41, 0x45, 0x63, 0x41, 0x7a, 0x6f, 0x41, 0x42, + 0x41, 0x59, 0x51, 0x2f, 0x4f, 0x7a, 0x73, 0x4d, 0x51, 0x41, 0x76, 0x35, 0x4f, 0x77, 0x77, 0x51, 0x41, 0x6b, + 0x77, 0x42, 0x31, 0x41, 0x48, 0x67, 0x41, 0x4f, 0x41, 0x42, 0x41, 0x51, 0x42, 0x58, 0x52, 0x4d, 0x7a, 0x45, + 0x53, 0x45, 0x56, 0x49, 0x63, 0x6e, 0x4b, 0x41, 0x74, 0x66, 0x38, 0x58, 0x77, 0x58, 0x56, 0x2b, 0x74, 0x57, + 0x71, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x79, 0x51, 0x41, 0x41, 0x42, 0x68, 0x38, 0x46, 0x31, 0x51, 0x41, 0x4d, 0x41, + 0x4c, 0x39, 0x41, 0x4e, 0x41, 0x4d, 0x52, 0x42, 0x77, 0x67, 0x48, 0x41, 0x68, 0x45, 0x42, 0x41, 0x67, 0x67, + 0x49, 0x42, 0x77, 0x49, 0x52, 0x41, 0x77, 0x49, 0x4a, 0x43, 0x67, 0x6b, 0x42, 0x45, 0x51, 0x6f, 0x4b, 0x43, + 0x55, 0x49, 0x4b, 0x42, 0x77, 0x49, 0x44, 0x43, 0x41, 0x4d, 0x41, 0x72, 0x77, 0x67, 0x4c, 0x42, 0x51, 0x6b, + 0x49, 0x0a, + 0x09, 0x41, 0x77, 0x49, 0x42, 0x42, 0x51, 0x6f, 0x47, 0x48, 0x41, 0x51, 0x2b, 0x43, 0x68, 0x77, 0x41, 0x42, + 0x41, 0x30, 0x51, 0x2f, 0x4f, 0x7a, 0x38, 0x37, 0x42, 0x45, 0x58, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x7a, 0x7a, + 0x45, 0x37, 0x44, 0x49, 0x52, 0x46, 0x7a, 0x6b, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, 0x46, 0x37, + 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x56, 0x6b, + 0x69, 0x0a, + 0x09, 0x73, 0x6e, 0x41, 0x4f, 0x41, 0x51, 0x46, 0x64, 0x51, 0x46, 0x59, 0x44, 0x42, 0x77, 0x38, 0x49, 0x44, + 0x77, 0x6b, 0x43, 0x43, 0x68, 0x55, 0x43, 0x46, 0x41, 0x63, 0x54, 0x43, 0x69, 0x59, 0x43, 0x4a, 0x67, 0x63, + 0x67, 0x42, 0x79, 0x59, 0x4b, 0x49, 0x41, 0x6f, 0x30, 0x42, 0x7a, 0x55, 0x4b, 0x61, 0x51, 0x4a, 0x38, 0x41, + 0x6e, 0x73, 0x48, 0x65, 0x51, 0x71, 0x41, 0x41, 0x6f, 0x49, 0x48, 0x67, 0x67, 0x71, 0x51, 0x41, 0x68, 0x59, + 0x45, 0x0a, + 0x09, 0x41, 0x51, 0x73, 0x44, 0x45, 0x77, 0x45, 0x62, 0x41, 0x79, 0x4d, 0x42, 0x4c, 0x41, 0x4d, 0x6e, 0x43, + 0x43, 0x67, 0x4a, 0x4e, 0x41, 0x45, 0x38, 0x41, 0x31, 0x59, 0x49, 0x57, 0x51, 0x6c, 0x6c, 0x43, 0x47, 0x6f, + 0x4a, 0x64, 0x67, 0x68, 0x35, 0x43, 0x59, 0x45, 0x42, 0x6a, 0x51, 0x4f, 0x56, 0x41, 0x5a, 0x73, 0x44, 0x46, + 0x46, 0x30, 0x41, 0x58, 0x52, 0x4d, 0x68, 0x43, 0x51, 0x45, 0x68, 0x45, 0x53, 0x4d, 0x52, 0x41, 0x53, 0x4d, + 0x42, 0x0a, + 0x09, 0x45, 0x53, 0x50, 0x4a, 0x41, 0x53, 0x30, 0x42, 0x66, 0x51, 0x46, 0x2f, 0x41, 0x53, 0x33, 0x46, 0x2f, + 0x6e, 0x2f, 0x4c, 0x2f, 0x6e, 0x2f, 0x45, 0x42, 0x64, 0x58, 0x38, 0x43, 0x41, 0x50, 0x34, 0x2b, 0x69, 0x73, + 0x46, 0x48, 0x2f, 0x77, 0x41, 0x42, 0x41, 0x44, 0x36, 0x34, 0x51, 0x41, 0x42, 0x41, 0x4d, 0x6b, 0x41, 0x41, + 0x41, 0x55, 0x7a, 0x42, 0x64, 0x55, 0x41, 0x43, 0x51, 0x42, 0x35, 0x51, 0x42, 0x34, 0x48, 0x45, 0x51, 0x45, + 0x43, 0x0a, + 0x09, 0x41, 0x51, 0x49, 0x52, 0x42, 0x67, 0x63, 0x47, 0x51, 0x67, 0x63, 0x43, 0x41, 0x77, 0x43, 0x76, 0x43, + 0x41, 0x55, 0x47, 0x41, 0x51, 0x63, 0x43, 0x48, 0x41, 0x51, 0x32, 0x42, 0x78, 0x77, 0x41, 0x42, 0x41, 0x6f, + 0x51, 0x2f, 0x4f, 0x7a, 0x38, 0x37, 0x42, 0x45, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x7a, 0x7a, 0x73, 0x4d, + 0x6a, 0x6b, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x54, + 0x74, 0x0a, + 0x09, 0x57, 0x53, 0x4b, 0x79, 0x48, 0x77, 0x73, 0x42, 0x41, 0x56, 0x31, 0x41, 0x4d, 0x44, 0x59, 0x43, 0x4f, + 0x41, 0x64, 0x49, 0x41, 0x6b, 0x63, 0x48, 0x61, 0x51, 0x4a, 0x6d, 0x42, 0x34, 0x41, 0x43, 0x42, 0x77, 0x59, + 0x42, 0x43, 0x51, 0x59, 0x56, 0x41, 0x52, 0x6f, 0x47, 0x52, 0x67, 0x46, 0x4a, 0x42, 0x6c, 0x63, 0x42, 0x57, + 0x41, 0x5a, 0x6c, 0x41, 0x57, 0x6b, 0x47, 0x65, 0x51, 0x61, 0x46, 0x41, 0x59, 0x6f, 0x47, 0x6c, 0x51, 0x47, + 0x61, 0x0a, + 0x09, 0x42, 0x70, 0x38, 0x4c, 0x45, 0x46, 0x30, 0x41, 0x58, 0x52, 0x4d, 0x68, 0x41, 0x52, 0x45, 0x7a, 0x45, + 0x53, 0x45, 0x42, 0x45, 0x53, 0x50, 0x4a, 0x41, 0x52, 0x41, 0x43, 0x6c, 0x73, 0x54, 0x2b, 0x38, 0x50, 0x31, + 0x71, 0x78, 0x41, 0x58, 0x56, 0x2b, 0x78, 0x38, 0x45, 0x34, 0x66, 0x6f, 0x72, 0x42, 0x4f, 0x48, 0x37, 0x48, + 0x77, 0x41, 0x43, 0x41, 0x48, 0x50, 0x2f, 0x34, 0x77, 0x58, 0x5a, 0x42, 0x66, 0x41, 0x41, 0x43, 0x77, 0x41, + 0x58, 0x0a, + 0x09, 0x41, 0x43, 0x4e, 0x41, 0x45, 0x77, 0x61, 0x56, 0x45, 0x67, 0x43, 0x56, 0x44, 0x4a, 0x45, 0x53, 0x6a, + 0x42, 0x67, 0x4a, 0x47, 0x51, 0x38, 0x7a, 0x41, 0x78, 0x6b, 0x56, 0x45, 0x42, 0x67, 0x51, 0x2f, 0x4f, 0x7a, + 0x38, 0x37, 0x44, 0x45, 0x41, 0x45, 0x4f, 0x54, 0x30, 0x37, 0x42, 0x44, 0x75, 0x4d, 0x41, 0x45, 0x69, 0x41, + 0x42, 0x45, 0x51, 0x41, 0x44, 0x4d, 0x79, 0x41, 0x42, 0x45, 0x51, 0x41, 0x43, 0x63, 0x67, 0x41, 0x42, 0x45, + 0x51, 0x0a, + 0x09, 0x41, 0x43, 0x45, 0x67, 0x41, 0x42, 0x45, 0x51, 0x41, 0x41, 0x4d, 0x6e, 0x33, 0x50, 0x37, 0x39, 0x41, + 0x51, 0x50, 0x63, 0x33, 0x41, 0x45, 0x42, 0x2f, 0x76, 0x2f, 0x63, 0x41, 0x54, 0x6f, 0x42, 0x65, 0x50, 0x36, + 0x49, 0x2f, 0x73, 0x62, 0x2b, 0x78, 0x66, 0x36, 0x48, 0x41, 0x58, 0x6b, 0x46, 0x54, 0x50, 0x36, 0x34, 0x2f, + 0x75, 0x58, 0x2b, 0x35, 0x76, 0x36, 0x34, 0x41, 0x55, 0x67, 0x42, 0x47, 0x67, 0x45, 0x62, 0x41, 0x55, 0x69, + 0x6b, 0x0a, + 0x09, 0x2f, 0x6c, 0x76, 0x2b, 0x6e, 0x76, 0x36, 0x66, 0x2f, 0x6c, 0x73, 0x42, 0x70, 0x41, 0x46, 0x69, 0x41, + 0x57, 0x49, 0x42, 0x70, 0x51, 0x41, 0x43, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x53, 0x4e, 0x42, 0x64, 0x55, + 0x41, 0x43, 0x41, 0x41, 0x54, 0x41, 0x44, 0x70, 0x41, 0x47, 0x41, 0x47, 0x56, 0x45, 0x41, 0x43, 0x56, 0x43, + 0x59, 0x45, 0x53, 0x45, 0x41, 0x6f, 0x49, 0x41, 0x67, 0x51, 0x41, 0x42, 0x52, 0x6b, 0x4e, 0x50, 0x78, 0x45, + 0x41, 0x0a, + 0x09, 0x48, 0x41, 0x6b, 0x45, 0x46, 0x42, 0x44, 0x38, 0x37, 0x44, 0x4c, 0x38, 0x37, 0x42, 0x45, 0x58, 0x4f, + 0x54, 0x45, 0x41, 0x4c, 0x2f, 0x54, 0x73, 0x31, 0x4f, 0x77, 0x77, 0x51, 0x41, 0x73, 0x50, 0x46, 0x52, 0x38, + 0x56, 0x50, 0x78, 0x56, 0x66, 0x46, 0x61, 0x38, 0x56, 0x42, 0x51, 0x46, 0x64, 0x41, 0x52, 0x45, 0x7a, 0x4d, + 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x6a, 0x4a, 0x53, 0x45, 0x79, 0x42, 0x42, 0x55, 0x55, 0x42, 0x43, 0x73, + 0x42, 0x0a, + 0x09, 0x45, 0x53, 0x4d, 0x42, 0x6b, 0x2f, 0x36, 0x4e, 0x6d, 0x70, 0x71, 0x4e, 0x2f, 0x6a, 0x67, 0x42, 0x79, + 0x50, 0x73, 0x42, 0x41, 0x66, 0x37, 0x2f, 0x2b, 0x2f, 0x37, 0x4b, 0x42, 0x53, 0x2f, 0x39, 0x7a, 0x35, 0x4b, + 0x48, 0x68, 0x70, 0x4b, 0x6d, 0x34, 0x39, 0x76, 0x64, 0x34, 0x76, 0x32, 0x6f, 0x41, 0x41, 0x49, 0x41, 0x63, + 0x2f, 0x37, 0x34, 0x42, 0x64, 0x6b, 0x46, 0x38, 0x41, 0x41, 0x4c, 0x41, 0x42, 0x30, 0x41, 0x55, 0x6b, 0x41, + 0x71, 0x0a, + 0x09, 0x45, 0x52, 0x41, 0x43, 0x44, 0x77, 0x45, 0x4d, 0x44, 0x51, 0x77, 0x4f, 0x41, 0x51, 0x30, 0x4e, 0x44, + 0x45, 0x49, 0x50, 0x48, 0x67, 0x77, 0x47, 0x6c, 0x52, 0x49, 0x41, 0x6c, 0x52, 0x69, 0x52, 0x45, 0x6f, 0x77, + 0x4e, 0x48, 0x67, 0x30, 0x62, 0x44, 0x77, 0x77, 0x44, 0x43, 0x52, 0x6b, 0x62, 0x4d, 0x77, 0x4d, 0x5a, 0x46, + 0x52, 0x41, 0x65, 0x45, 0x50, 0x7a, 0x73, 0x2f, 0x4f, 0x77, 0x52, 0x4f, 0x54, 0x6b, 0x52, 0x4f, 0x54, 0x45, + 0x41, 0x0a, + 0x09, 0x45, 0x4d, 0x54, 0x6b, 0x39, 0x4f, 0x77, 0x51, 0x37, 0x6a, 0x6b, 0x53, 0x4f, 0x54, 0x42, 0x4c, 0x55, + 0x31, 0x67, 0x48, 0x45, 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x52, 0x63, 0x35, 0x57, 0x53, 0x49, + 0x42, 0x49, 0x67, 0x41, 0x52, 0x45, 0x41, 0x41, 0x7a, 0x4d, 0x67, 0x41, 0x52, 0x45, 0x41, 0x41, 0x54, 0x41, + 0x53, 0x4d, 0x6e, 0x42, 0x67, 0x59, 0x6a, 0x49, 0x41, 0x41, 0x52, 0x45, 0x41, 0x41, 0x68, 0x49, 0x41, 0x41, + 0x52, 0x0a, + 0x09, 0x45, 0x41, 0x49, 0x44, 0x4a, 0x39, 0x7a, 0x2b, 0x2f, 0x51, 0x45, 0x44, 0x33, 0x4e, 0x77, 0x42, 0x41, + 0x66, 0x37, 0x2f, 0x50, 0x77, 0x45, 0x4b, 0x39, 0x4e, 0x30, 0x68, 0x49, 0x78, 0x44, 0x2b, 0x78, 0x66, 0x36, + 0x48, 0x41, 0x58, 0x6b, 0x42, 0x4f, 0x77, 0x45, 0x36, 0x41, 0x58, 0x6a, 0x52, 0x42, 0x55, 0x7a, 0x2b, 0x75, + 0x50, 0x37, 0x6c, 0x2f, 0x75, 0x62, 0x2b, 0x75, 0x41, 0x46, 0x49, 0x41, 0x52, 0x6f, 0x42, 0x47, 0x77, 0x46, + 0x49, 0x0a, + 0x09, 0x2b, 0x73, 0x2f, 0x2b, 0x33, 0x65, 0x38, 0x43, 0x41, 0x67, 0x47, 0x6c, 0x41, 0x57, 0x45, 0x42, 0x59, + 0x67, 0x47, 0x6c, 0x2f, 0x6c, 0x76, 0x2b, 0x6e, 0x76, 0x37, 0x38, 0x2f, 0x6f, 0x34, 0x41, 0x41, 0x41, 0x49, + 0x41, 0x79, 0x51, 0x41, 0x41, 0x42, 0x56, 0x51, 0x46, 0x31, 0x51, 0x41, 0x54, 0x41, 0x42, 0x77, 0x41, 0x73, + 0x55, 0x41, 0x31, 0x43, 0x51, 0x67, 0x48, 0x41, 0x77, 0x6f, 0x47, 0x45, 0x51, 0x4d, 0x45, 0x41, 0x77, 0x55, + 0x52, 0x0a, + 0x09, 0x42, 0x41, 0x51, 0x44, 0x51, 0x67, 0x59, 0x45, 0x41, 0x42, 0x55, 0x44, 0x42, 0x42, 0x57, 0x56, 0x43, + 0x52, 0x53, 0x56, 0x44, 0x59, 0x45, 0x4c, 0x42, 0x41, 0x55, 0x47, 0x41, 0x78, 0x45, 0x4a, 0x41, 0x42, 0x77, + 0x57, 0x44, 0x67, 0x55, 0x4b, 0x47, 0x52, 0x6b, 0x45, 0x45, 0x54, 0x38, 0x55, 0x43, 0x68, 0x77, 0x4d, 0x42, + 0x42, 0x30, 0x51, 0x2f, 0x4f, 0x77, 0x79, 0x2f, 0x4d, 0x54, 0x73, 0x45, 0x52, 0x63, 0x35, 0x45, 0x54, 0x6b, + 0x35, 0x0a, + 0x09, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x7a, 0x7a, 0x30, 0x37, 0x4e, 0x54, 0x73, 0x45, 0x6a, 0x6b, 0x53, 0x4f, + 0x52, 0x49, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x58, + 0x74, 0x45, 0x52, 0x63, 0x35, 0x57, 0x53, 0x4b, 0x79, 0x51, 0x42, 0x34, 0x42, 0x41, 0x56, 0x31, 0x41, 0x51, + 0x6e, 0x6f, 0x54, 0x41, 0x51, 0x55, 0x41, 0x42, 0x51, 0x45, 0x46, 0x41, 0x67, 0x59, 0x44, 0x42, 0x77, 0x51, + 0x56, 0x0a, + 0x09, 0x41, 0x42, 0x55, 0x42, 0x46, 0x41, 0x49, 0x57, 0x41, 0x78, 0x63, 0x45, 0x4a, 0x51, 0x41, 0x6c, 0x41, + 0x53, 0x55, 0x43, 0x4a, 0x67, 0x4d, 0x6e, 0x42, 0x69, 0x59, 0x48, 0x4a, 0x67, 0x67, 0x6d, 0x43, 0x53, 0x41, + 0x65, 0x4e, 0x67, 0x45, 0x32, 0x41, 0x6b, 0x59, 0x42, 0x52, 0x67, 0x4a, 0x6f, 0x42, 0x58, 0x55, 0x45, 0x64, + 0x51, 0x56, 0x33, 0x45, 0x34, 0x67, 0x47, 0x69, 0x41, 0x65, 0x59, 0x42, 0x70, 0x67, 0x48, 0x48, 0x31, 0x30, + 0x41, 0x0a, + 0x09, 0x58, 0x51, 0x45, 0x65, 0x41, 0x52, 0x63, 0x54, 0x49, 0x77, 0x4d, 0x75, 0x41, 0x53, 0x73, 0x42, 0x45, + 0x53, 0x4d, 0x52, 0x49, 0x53, 0x41, 0x57, 0x46, 0x52, 0x51, 0x47, 0x41, 0x52, 0x45, 0x7a, 0x4d, 0x6a, 0x59, + 0x31, 0x4e, 0x43, 0x59, 0x6a, 0x41, 0x34, 0x31, 0x42, 0x65, 0x7a, 0x37, 0x4e, 0x32, 0x62, 0x39, 0x4b, 0x69, + 0x33, 0x6a, 0x63, 0x79, 0x67, 0x48, 0x49, 0x41, 0x51, 0x44, 0x38, 0x67, 0x2f, 0x32, 0x4a, 0x2f, 0x70, 0x4b, + 0x56, 0x0a, + 0x09, 0x6c, 0x5a, 0x49, 0x43, 0x76, 0x42, 0x61, 0x51, 0x66, 0x76, 0x35, 0x6f, 0x41, 0x58, 0x2b, 0x57, 0x59, + 0x76, 0x32, 0x4a, 0x42, 0x64, 0x58, 0x57, 0x32, 0x49, 0x32, 0x36, 0x41, 0x6b, 0x2f, 0x39, 0x37, 0x6f, 0x65, + 0x44, 0x67, 0x34, 0x55, 0x41, 0x41, 0x41, 0x45, 0x41, 0x68, 0x2f, 0x2f, 0x6a, 0x42, 0x4b, 0x49, 0x46, 0x38, + 0x41, 0x41, 0x6e, 0x41, 0x48, 0x35, 0x41, 0x50, 0x41, 0x30, 0x4d, 0x41, 0x67, 0x34, 0x4c, 0x41, 0x68, 0x34, + 0x66, 0x0a, + 0x09, 0x48, 0x67, 0x67, 0x4a, 0x41, 0x67, 0x63, 0x4b, 0x41, 0x68, 0x38, 0x66, 0x48, 0x6b, 0x49, 0x4b, 0x43, + 0x78, 0x34, 0x66, 0x42, 0x42, 0x55, 0x42, 0x41, 0x42, 0x57, 0x68, 0x46, 0x4a, 0x51, 0x59, 0x6c, 0x52, 0x45, + 0x45, 0x6c, 0x51, 0x43, 0x55, 0x4a, 0x5a, 0x45, 0x52, 0x6a, 0x43, 0x67, 0x65, 0x43, 0x67, 0x73, 0x66, 0x47, + 0x77, 0x63, 0x41, 0x49, 0x68, 0x73, 0x5a, 0x44, 0x69, 0x30, 0x48, 0x47, 0x52, 0x51, 0x69, 0x4b, 0x42, 0x44, + 0x63, 0x0a, + 0x09, 0x78, 0x4f, 0x7a, 0x38, 0x37, 0x4f, 0x51, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x4f, 0x54, 0x6b, 0x78, 0x41, + 0x42, 0x44, 0x6b, 0x39, 0x4f, 0x54, 0x73, 0x45, 0x4f, 0x37, 0x32, 0x37, 0x68, 0x44, 0x47, 0x45, 0x52, 0x63, + 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x44, 0x75, 0x30, 0x52, 0x46, 0x7a, 0x6b, 0x48, 0x45, + 0x41, 0x37, 0x74, 0x45, 0x52, 0x63, 0x35, 0x57, 0x53, 0x4b, 0x79, 0x44, 0x79, 0x6b, 0x42, 0x41, 0x56, 0x32, + 0x32, 0x0a, + 0x09, 0x48, 0x79, 0x6b, 0x76, 0x4b, 0x55, 0x38, 0x70, 0x41, 0x31, 0x30, 0x42, 0x46, 0x53, 0x34, 0x42, 0x49, + 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x48, 0x77, 0x45, 0x65, 0x41, 0x52, 0x55, 0x55, 0x42, 0x43, 0x45, + 0x69, 0x4a, 0x69, 0x63, 0x31, 0x48, 0x67, 0x45, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x76, 0x41, + 0x53, 0x34, 0x42, 0x4e, 0x54, 0x51, 0x6b, 0x4d, 0x7a, 0x49, 0x57, 0x42, 0x45, 0x68, 0x7a, 0x7a, 0x46, 0x2b, + 0x6c, 0x0a, + 0x09, 0x73, 0x33, 0x65, 0x6d, 0x65, 0x75, 0x4c, 0x58, 0x2f, 0x74, 0x33, 0x2b, 0x35, 0x32, 0x72, 0x76, 0x67, + 0x48, 0x76, 0x73, 0x63, 0x71, 0x32, 0x38, 0x68, 0x35, 0x70, 0x37, 0x34, 0x73, 0x6f, 0x42, 0x46, 0x2f, 0x56, + 0x70, 0x32, 0x67, 0x57, 0x6b, 0x78, 0x54, 0x63, 0x32, 0x67, 0x48, 0x5a, 0x6a, 0x5a, 0x52, 0x38, 0x5a, 0x4b, + 0x39, 0x6d, 0x32, 0x32, 0x65, 0x41, 0x77, 0x4c, 0x39, 0x42, 0x46, 0x52, 0x6f, 0x68, 0x2b, 0x62, 0x6e, 0x77, + 0x66, 0x0a, + 0x09, 0x47, 0x43, 0x33, 0x41, 0x71, 0x38, 0x62, 0x6b, 0x4a, 0x67, 0x41, 0x41, 0x41, 0x66, 0x2f, 0x36, 0x41, + 0x41, 0x41, 0x45, 0x36, 0x51, 0x58, 0x56, 0x41, 0x41, 0x63, 0x41, 0x53, 0x6b, 0x41, 0x4f, 0x42, 0x67, 0x4b, + 0x56, 0x41, 0x49, 0x45, 0x45, 0x41, 0x55, 0x41, 0x44, 0x48, 0x41, 0x42, 0x41, 0x42, 0x51, 0x67, 0x51, 0x31, + 0x4f, 0x54, 0x38, 0x35, 0x44, 0x45, 0x41, 0x4c, 0x2f, 0x54, 0x73, 0x4d, 0x6a, 0x41, 0x42, 0x53, 0x37, 0x41, + 0x4b, 0x0a, + 0x09, 0x56, 0x46, 0x69, 0x39, 0x41, 0x41, 0x67, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x41, 0x67, 0x41, 0x43, + 0x50, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x45, 0x77, 0x41, 0x4a, 0x48, 0x77, 0x41, + 0x51, 0x41, 0x52, 0x41, 0x43, 0x48, 0x77, 0x63, 0x51, 0x43, 0x55, 0x41, 0x4a, 0x63, 0x41, 0x6d, 0x66, 0x43, + 0x51, 0x6c, 0x64, 0x41, 0x79, 0x45, 0x56, 0x49, 0x52, 0x45, 0x6a, 0x45, 0x53, 0x45, 0x47, 0x42, 0x4f, 0x2f, + 0x39, 0x0a, + 0x09, 0x37, 0x73, 0x76, 0x39, 0x37, 0x67, 0x58, 0x56, 0x71, 0x76, 0x72, 0x56, 0x42, 0x53, 0x73, 0x41, 0x41, + 0x41, 0x45, 0x41, 0x73, 0x76, 0x2f, 0x6a, 0x42, 0x53, 0x6b, 0x46, 0x31, 0x51, 0x41, 0x52, 0x41, 0x45, 0x74, + 0x41, 0x46, 0x67, 0x67, 0x43, 0x45, 0x51, 0x73, 0x41, 0x42, 0x5a, 0x55, 0x4f, 0x6a, 0x41, 0x6b, 0x41, 0x67, + 0x52, 0x49, 0x49, 0x48, 0x41, 0x6f, 0x34, 0x41, 0x52, 0x77, 0x41, 0x51, 0x52, 0x49, 0x51, 0x2f, 0x4f, 0x7a, + 0x38, 0x0a, + 0x09, 0x37, 0x44, 0x45, 0x41, 0x45, 0x4f, 0x51, 0x79, 0x39, 0x4f, 0x77, 0x52, 0x4f, 0x54, 0x6b, 0x35, 0x4f, + 0x54, 0x41, 0x42, 0x53, 0x37, 0x41, 0x51, 0x56, 0x46, 0x69, 0x39, 0x41, 0x42, 0x49, 0x41, 0x51, 0x41, 0x41, + 0x42, 0x41, 0x42, 0x49, 0x41, 0x45, 0x76, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6d, 0x32, 0x48, + 0x78, 0x4f, 0x50, 0x45, 0x35, 0x38, 0x54, 0x41, 0x31, 0x30, 0x54, 0x4d, 0x78, 0x45, 0x55, 0x46, 0x6a, 0x4d, + 0x79, 0x0a, + 0x09, 0x4e, 0x6a, 0x55, 0x52, 0x4d, 0x78, 0x45, 0x51, 0x41, 0x43, 0x45, 0x67, 0x41, 0x42, 0x47, 0x79, 0x79, + 0x36, 0x37, 0x44, 0x77, 0x71, 0x37, 0x4c, 0x2f, 0x74, 0x2f, 0x2b, 0x35, 0x76, 0x37, 0x6c, 0x2f, 0x74, 0x38, + 0x46, 0x31, 0x66, 0x78, 0x31, 0x38, 0x4e, 0x50, 0x54, 0x38, 0x41, 0x4f, 0x4c, 0x2f, 0x46, 0x7a, 0x2b, 0x33, + 0x50, 0x37, 0x57, 0x41, 0x53, 0x6f, 0x42, 0x4a, 0x41, 0x41, 0x42, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x56, + 0x6f, 0x0a, + 0x09, 0x42, 0x64, 0x55, 0x41, 0x42, 0x67, 0x43, 0x33, 0x51, 0x43, 0x63, 0x45, 0x45, 0x51, 0x55, 0x47, 0x42, + 0x51, 0x4d, 0x52, 0x41, 0x67, 0x4d, 0x47, 0x42, 0x67, 0x55, 0x44, 0x45, 0x51, 0x51, 0x44, 0x41, 0x41, 0x45, + 0x41, 0x41, 0x68, 0x45, 0x42, 0x41, 0x51, 0x42, 0x43, 0x41, 0x77, 0x51, 0x42, 0x72, 0x77, 0x41, 0x47, 0x42, + 0x41, 0x4d, 0x43, 0x41, 0x41, 0x55, 0x46, 0x41, 0x51, 0x63, 0x51, 0x31, 0x4d, 0x51, 0x58, 0x4f, 0x54, 0x45, + 0x41, 0x0a, + 0x09, 0x4c, 0x2b, 0x77, 0x79, 0x4f, 0x54, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, 0x41, 0x58, 0x74, 0x42, + 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x58, 0x74, 0x57, 0x53, 0x4b, + 0x79, 0x55, 0x41, 0x67, 0x42, 0x41, 0x56, 0x31, 0x41, 0x59, 0x67, 0x41, 0x44, 0x4b, 0x67, 0x4e, 0x48, 0x42, + 0x45, 0x63, 0x46, 0x57, 0x67, 0x4e, 0x39, 0x41, 0x34, 0x4d, 0x44, 0x42, 0x77, 0x59, 0x41, 0x42, 0x77, 0x49, + 0x49, 0x0a, + 0x09, 0x42, 0x41, 0x6b, 0x47, 0x46, 0x51, 0x45, 0x55, 0x41, 0x68, 0x6f, 0x45, 0x47, 0x67, 0x55, 0x71, 0x41, + 0x43, 0x59, 0x42, 0x4a, 0x67, 0x49, 0x70, 0x42, 0x43, 0x6b, 0x46, 0x4a, 0x51, 0x59, 0x67, 0x43, 0x44, 0x67, + 0x41, 0x4d, 0x77, 0x45, 0x7a, 0x41, 0x6a, 0x77, 0x45, 0x50, 0x41, 0x55, 0x33, 0x42, 0x6b, 0x67, 0x41, 0x52, + 0x51, 0x46, 0x46, 0x41, 0x6b, 0x6b, 0x45, 0x53, 0x51, 0x56, 0x48, 0x42, 0x6c, 0x6b, 0x41, 0x56, 0x67, 0x5a, + 0x6d, 0x0a, + 0x09, 0x41, 0x6d, 0x6b, 0x45, 0x61, 0x51, 0x56, 0x36, 0x41, 0x48, 0x59, 0x42, 0x64, 0x67, 0x4a, 0x35, 0x42, + 0x48, 0x6b, 0x46, 0x64, 0x51, 0x61, 0x41, 0x43, 0x4a, 0x67, 0x41, 0x6c, 0x77, 0x59, 0x70, 0x58, 0x51, 0x42, + 0x64, 0x49, 0x51, 0x45, 0x7a, 0x43, 0x51, 0x45, 0x7a, 0x41, 0x51, 0x4a, 0x4b, 0x2f, 0x63, 0x62, 0x54, 0x41, + 0x64, 0x6b, 0x42, 0x32, 0x74, 0x4c, 0x39, 0x78, 0x77, 0x58, 0x56, 0x2b, 0x78, 0x63, 0x45, 0x36, 0x66, 0x6f, + 0x72, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x52, 0x41, 0x41, 0x41, 0x42, 0x36, 0x59, 0x46, 0x31, 0x51, 0x41, 0x4d, 0x41, + 0x58, 0x74, 0x41, 0x53, 0x51, 0x55, 0x61, 0x42, 0x67, 0x55, 0x4a, 0x43, 0x67, 0x6b, 0x45, 0x47, 0x67, 0x6f, + 0x4a, 0x41, 0x78, 0x6f, 0x4b, 0x43, 0x77, 0x6f, 0x43, 0x47, 0x67, 0x45, 0x43, 0x43, 0x77, 0x73, 0x4b, 0x42, + 0x68, 0x45, 0x48, 0x43, 0x41, 0x63, 0x46, 0x45, 0x51, 0x51, 0x46, 0x43, 0x41, 0x67, 0x48, 0x41, 0x68, 0x45, + 0x44, 0x0a, + 0x09, 0x41, 0x67, 0x77, 0x41, 0x44, 0x41, 0x45, 0x52, 0x41, 0x41, 0x41, 0x4d, 0x51, 0x67, 0x6f, 0x46, 0x41, + 0x67, 0x4d, 0x47, 0x41, 0x77, 0x43, 0x76, 0x43, 0x77, 0x67, 0x4d, 0x43, 0x77, 0x6f, 0x4a, 0x43, 0x41, 0x59, + 0x46, 0x42, 0x41, 0x4d, 0x43, 0x41, 0x51, 0x73, 0x48, 0x41, 0x41, 0x30, 0x51, 0x31, 0x4d, 0x77, 0x58, 0x4f, + 0x54, 0x45, 0x41, 0x4c, 0x7a, 0x7a, 0x73, 0x4d, 0x6a, 0x49, 0x58, 0x4f, 0x54, 0x42, 0x4c, 0x55, 0x31, 0x67, + 0x48, 0x0a, + 0x09, 0x45, 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, + 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x42, 0x65, 0x30, + 0x48, 0x45, 0x41, 0x6a, 0x74, 0x57, 0x53, 0x4b, 0x79, 0x41, 0x41, 0x34, 0x42, 0x41, 0x56, 0x31, 0x41, 0x38, + 0x67, 0x59, 0x43, 0x42, 0x67, 0x55, 0x43, 0x43, 0x67, 0x41, 0x4b, 0x41, 0x41, 0x6f, 0x53, 0x43, 0x69, 0x67, + 0x46, 0x0a, + 0x09, 0x4a, 0x41, 0x6f, 0x67, 0x43, 0x6a, 0x34, 0x43, 0x50, 0x67, 0x55, 0x30, 0x43, 0x6a, 0x41, 0x4b, 0x54, + 0x41, 0x4a, 0x4e, 0x42, 0x55, 0x49, 0x4b, 0x51, 0x41, 0x70, 0x5a, 0x41, 0x6d, 0x6f, 0x43, 0x61, 0x77, 0x56, + 0x6e, 0x43, 0x6d, 0x41, 0x4b, 0x65, 0x77, 0x4a, 0x2f, 0x41, 0x6e, 0x77, 0x46, 0x66, 0x77, 0x57, 0x41, 0x43, + 0x70, 0x59, 0x43, 0x6c, 0x51, 0x55, 0x64, 0x42, 0x77, 0x41, 0x4a, 0x41, 0x67, 0x67, 0x44, 0x41, 0x41, 0x51, + 0x47, 0x0a, + 0x09, 0x42, 0x51, 0x41, 0x46, 0x41, 0x41, 0x59, 0x42, 0x42, 0x77, 0x51, 0x49, 0x41, 0x41, 0x67, 0x48, 0x43, + 0x51, 0x41, 0x4a, 0x42, 0x41, 0x6f, 0x4b, 0x44, 0x41, 0x41, 0x4f, 0x47, 0x67, 0x4d, 0x56, 0x42, 0x42, 0x55, + 0x49, 0x47, 0x51, 0x77, 0x51, 0x44, 0x69, 0x41, 0x45, 0x49, 0x51, 0x55, 0x67, 0x42, 0x69, 0x41, 0x48, 0x49, + 0x41, 0x67, 0x6a, 0x43, 0x53, 0x51, 0x4b, 0x4a, 0x51, 0x73, 0x67, 0x44, 0x69, 0x41, 0x4f, 0x50, 0x41, 0x49, + 0x36, 0x0a, + 0x09, 0x41, 0x7a, 0x55, 0x45, 0x4d, 0x77, 0x55, 0x77, 0x43, 0x44, 0x59, 0x4a, 0x4f, 0x51, 0x73, 0x2f, 0x44, + 0x44, 0x41, 0x4f, 0x52, 0x67, 0x42, 0x47, 0x41, 0x55, 0x6f, 0x43, 0x51, 0x41, 0x52, 0x46, 0x42, 0x55, 0x41, + 0x46, 0x51, 0x67, 0x5a, 0x43, 0x42, 0x30, 0x49, 0x49, 0x51, 0x41, 0x68, 0x41, 0x43, 0x55, 0x51, 0x4b, 0x54, + 0x51, 0x78, 0x41, 0x44, 0x6b, 0x41, 0x4f, 0x57, 0x41, 0x4a, 0x57, 0x43, 0x46, 0x6b, 0x4d, 0x55, 0x41, 0x35, + 0x6d, 0x0a, + 0x09, 0x41, 0x6d, 0x63, 0x44, 0x59, 0x51, 0x52, 0x69, 0x42, 0x57, 0x41, 0x47, 0x59, 0x41, 0x64, 0x67, 0x43, + 0x47, 0x51, 0x4a, 0x5a, 0x41, 0x70, 0x6b, 0x43, 0x33, 0x63, 0x41, 0x64, 0x67, 0x46, 0x37, 0x41, 0x6e, 0x67, + 0x44, 0x64, 0x77, 0x52, 0x30, 0x42, 0x58, 0x6b, 0x47, 0x65, 0x51, 0x64, 0x33, 0x43, 0x48, 0x41, 0x49, 0x65, + 0x41, 0x78, 0x2f, 0x44, 0x48, 0x38, 0x4f, 0x68, 0x67, 0x4b, 0x48, 0x41, 0x34, 0x67, 0x45, 0x69, 0x51, 0x57, + 0x46, 0x0a, + 0x09, 0x43, 0x59, 0x6f, 0x4c, 0x6a, 0x77, 0x36, 0x58, 0x42, 0x4a, 0x38, 0x4f, 0x72, 0x77, 0x35, 0x62, 0x58, + 0x51, 0x42, 0x64, 0x45, 0x7a, 0x4d, 0x4a, 0x41, 0x54, 0x4d, 0x4a, 0x41, 0x54, 0x4d, 0x42, 0x49, 0x77, 0x6b, + 0x42, 0x49, 0x30, 0x54, 0x4d, 0x41, 0x54, 0x6f, 0x42, 0x4f, 0x65, 0x4d, 0x42, 0x4f, 0x67, 0x45, 0x35, 0x7a, + 0x66, 0x36, 0x4a, 0x2f, 0x76, 0x37, 0x46, 0x2f, 0x73, 0x4c, 0x2b, 0x42, 0x64, 0x58, 0x37, 0x45, 0x67, 0x54, + 0x75, 0x0a, + 0x09, 0x2b, 0x78, 0x49, 0x45, 0x37, 0x76, 0x6f, 0x72, 0x42, 0x52, 0x44, 0x36, 0x38, 0x41, 0x41, 0x42, 0x41, + 0x44, 0x30, 0x41, 0x41, 0x41, 0x55, 0x37, 0x42, 0x64, 0x55, 0x41, 0x43, 0x77, 0x46, 0x64, 0x51, 0x45, 0x59, + 0x4a, 0x45, 0x51, 0x6f, 0x4c, 0x43, 0x67, 0x67, 0x52, 0x42, 0x77, 0x67, 0x4c, 0x43, 0x77, 0x6f, 0x49, 0x45, + 0x51, 0x6b, 0x49, 0x42, 0x51, 0x59, 0x46, 0x42, 0x78, 0x45, 0x47, 0x42, 0x67, 0x55, 0x44, 0x45, 0x51, 0x51, + 0x46, 0x0a, + 0x09, 0x42, 0x41, 0x49, 0x52, 0x41, 0x51, 0x49, 0x46, 0x42, 0x51, 0x51, 0x43, 0x45, 0x51, 0x4d, 0x43, 0x43, + 0x77, 0x41, 0x4c, 0x41, 0x52, 0x45, 0x41, 0x41, 0x41, 0x74, 0x43, 0x43, 0x77, 0x67, 0x46, 0x41, 0x67, 0x51, + 0x44, 0x41, 0x4b, 0x38, 0x4a, 0x42, 0x67, 0x73, 0x49, 0x42, 0x51, 0x49, 0x45, 0x41, 0x41, 0x51, 0x47, 0x41, + 0x41, 0x6f, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x33, 0x4d, 0x51, 0x52, 0x46, 0x7a, 0x6b, 0x78, 0x41, 0x43, 0x38, + 0x38, 0x0a, + 0x09, 0x37, 0x44, 0x49, 0x58, 0x4f, 0x54, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, 0x41, 0x58, 0x74, 0x42, + 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, + 0x46, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, + 0x56, 0x6b, 0x69, 0x41, 0x55, 0x75, 0x77, 0x44, 0x46, 0x52, 0x4c, 0x73, 0x41, 0x31, 0x55, 0x57, 0x30, 0x75, + 0x77, 0x0a, + 0x09, 0x44, 0x6c, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x44, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x44, + 0x41, 0x41, 0x4d, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x55, 0x43, 0x34, 0x42, 0x77, 0x49, + 0x49, 0x43, 0x42, 0x59, 0x43, 0x47, 0x51, 0x67, 0x58, 0x43, 0x79, 0x63, 0x49, 0x4a, 0x77, 0x73, 0x30, 0x41, + 0x6a, 0x67, 0x49, 0x4e, 0x67, 0x74, 0x4c, 0x43, 0x46, 0x67, 0x46, 0x57, 0x77, 0x68, 0x6d, 0x41, 0x6d, 0x73, + 0x49, 0x0a, + 0x09, 0x64, 0x77, 0x4a, 0x33, 0x43, 0x34, 0x59, 0x43, 0x67, 0x41, 0x4b, 0x48, 0x42, 0x59, 0x73, 0x49, 0x68, + 0x51, 0x75, 0x55, 0x41, 0x70, 0x41, 0x43, 0x6c, 0x77, 0x57, 0x64, 0x43, 0x4a, 0x59, 0x4c, 0x47, 0x77, 0x59, + 0x42, 0x43, 0x51, 0x4d, 0x49, 0x42, 0x77, 0x63, 0x4a, 0x46, 0x67, 0x45, 0x5a, 0x41, 0x78, 0x6b, 0x48, 0x46, + 0x77, 0x6b, 0x51, 0x44, 0x53, 0x59, 0x42, 0x4b, 0x41, 0x49, 0x70, 0x41, 0x79, 0x59, 0x46, 0x4b, 0x41, 0x63, + 0x6e, 0x0a, + 0x09, 0x43, 0x53, 0x6b, 0x4c, 0x49, 0x41, 0x30, 0x31, 0x41, 0x44, 0x51, 0x42, 0x50, 0x41, 0x4d, 0x37, 0x42, + 0x44, 0x6f, 0x47, 0x4f, 0x77, 0x63, 0x30, 0x43, 0x54, 0x51, 0x4b, 0x4f, 0x41, 0x73, 0x2f, 0x44, 0x55, 0x67, + 0x4a, 0x54, 0x77, 0x31, 0x59, 0x43, 0x31, 0x38, 0x4e, 0x5a, 0x51, 0x42, 0x6c, 0x41, 0x57, 0x6f, 0x44, 0x61, + 0x67, 0x52, 0x6f, 0x42, 0x57, 0x6b, 0x47, 0x61, 0x51, 0x64, 0x73, 0x43, 0x57, 0x77, 0x4b, 0x65, 0x41, 0x4e, + 0x35, 0x0a, + 0x09, 0x42, 0x6e, 0x6b, 0x48, 0x65, 0x41, 0x68, 0x39, 0x43, 0x58, 0x38, 0x4b, 0x65, 0x41, 0x75, 0x41, 0x41, + 0x49, 0x41, 0x42, 0x67, 0x77, 0x4b, 0x49, 0x41, 0x34, 0x55, 0x46, 0x68, 0x41, 0x69, 0x44, 0x43, 0x34, 0x38, + 0x4e, 0x6b, 0x41, 0x43, 0x51, 0x41, 0x5a, 0x51, 0x43, 0x6c, 0x77, 0x57, 0x58, 0x42, 0x70, 0x55, 0x49, 0x6b, + 0x77, 0x75, 0x66, 0x44, 0x61, 0x38, 0x4e, 0x51, 0x46, 0x30, 0x41, 0x58, 0x52, 0x4d, 0x7a, 0x43, 0x51, 0x45, + 0x7a, 0x0a, + 0x09, 0x43, 0x51, 0x45, 0x6a, 0x43, 0x51, 0x45, 0x6a, 0x41, 0x59, 0x48, 0x5a, 0x41, 0x58, 0x4d, 0x42, 0x64, + 0x64, 0x6e, 0x2b, 0x49, 0x41, 0x49, 0x41, 0x32, 0x66, 0x35, 0x63, 0x2f, 0x6c, 0x6e, 0x61, 0x41, 0x68, 0x55, + 0x46, 0x31, 0x66, 0x33, 0x56, 0x41, 0x69, 0x76, 0x39, 0x4d, 0x2f, 0x7a, 0x34, 0x41, 0x6e, 0x76, 0x39, 0x68, + 0x51, 0x4d, 0x64, 0x41, 0x41, 0x48, 0x2f, 0x2f, 0x41, 0x41, 0x41, 0x42, 0x4f, 0x63, 0x46, 0x31, 0x51, 0x41, + 0x49, 0x0a, + 0x09, 0x41, 0x4a, 0x52, 0x41, 0x4b, 0x41, 0x4d, 0x52, 0x42, 0x41, 0x55, 0x45, 0x41, 0x68, 0x45, 0x42, 0x41, + 0x67, 0x55, 0x46, 0x42, 0x41, 0x49, 0x52, 0x41, 0x77, 0x49, 0x49, 0x41, 0x41, 0x67, 0x42, 0x45, 0x51, 0x41, + 0x41, 0x43, 0x45, 0x49, 0x43, 0x41, 0x77, 0x43, 0x76, 0x42, 0x67, 0x49, 0x48, 0x42, 0x45, 0x41, 0x46, 0x48, + 0x41, 0x42, 0x41, 0x42, 0x77, 0x6b, 0x51, 0x31, 0x4f, 0x54, 0x38, 0x35, 0x42, 0x49, 0x35, 0x4d, 0x51, 0x41, + 0x76, 0x0a, + 0x09, 0x37, 0x44, 0x49, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, + 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x31, 0x5a, 0x49, 0x72, 0x49, + 0x41, 0x43, 0x67, 0x45, 0x42, 0x58, 0x55, 0x41, 0x38, 0x42, 0x51, 0x49, 0x55, 0x41, 0x6a, 0x55, 0x43, 0x4d, + 0x41, 0x49, 0x77, 0x42, 0x54, 0x41, 0x49, 0x52, 0x67, 0x4a, 0x41, 0x41, 0x6b, 0x41, 0x46, 0x51, 0x41, 0x68, + 0x52, 0x0a, + 0x09, 0x41, 0x6c, 0x45, 0x46, 0x55, 0x51, 0x68, 0x6c, 0x41, 0x6f, 0x51, 0x43, 0x6b, 0x77, 0x49, 0x51, 0x46, + 0x67, 0x45, 0x61, 0x41, 0x78, 0x38, 0x4b, 0x4a, 0x67, 0x45, 0x70, 0x41, 0x7a, 0x63, 0x42, 0x4f, 0x41, 0x4e, + 0x41, 0x43, 0x6d, 0x63, 0x42, 0x61, 0x41, 0x4e, 0x34, 0x41, 0x33, 0x41, 0x4b, 0x6e, 0x77, 0x6f, 0x4e, 0x58, + 0x51, 0x42, 0x64, 0x41, 0x7a, 0x4d, 0x4a, 0x41, 0x54, 0x4d, 0x42, 0x45, 0x53, 0x4d, 0x52, 0x42, 0x4e, 0x6b, + 0x42, 0x0a, + 0x09, 0x6e, 0x67, 0x47, 0x62, 0x32, 0x66, 0x33, 0x77, 0x79, 0x77, 0x58, 0x56, 0x2f, 0x5a, 0x6f, 0x43, 0x5a, + 0x76, 0x7a, 0x79, 0x2f, 0x54, 0x6b, 0x43, 0x78, 0x77, 0x41, 0x41, 0x41, 0x51, 0x42, 0x63, 0x41, 0x41, 0x41, + 0x46, 0x48, 0x77, 0x58, 0x56, 0x41, 0x41, 0x6b, 0x41, 0x6d, 0x30, 0x41, 0x62, 0x41, 0x78, 0x45, 0x48, 0x43, + 0x41, 0x63, 0x49, 0x45, 0x51, 0x49, 0x44, 0x41, 0x6b, 0x49, 0x49, 0x6c, 0x51, 0x43, 0x42, 0x41, 0x35, 0x55, + 0x46, 0x0a, + 0x09, 0x43, 0x41, 0x4d, 0x41, 0x41, 0x55, 0x49, 0x45, 0x41, 0x41, 0x59, 0x4b, 0x45, 0x4e, 0x7a, 0x45, 0x31, + 0x4f, 0x51, 0x52, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x43, 0x2f, 0x73, 0x39, 0x4f, 0x77, 0x77, 0x53, 0x31, 0x4e, + 0x59, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x31, 0x5a, 0x49, 0x67, 0x46, 0x4c, 0x73, + 0x41, 0x6c, 0x55, 0x53, 0x37, 0x41, 0x4b, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x4b, 0x41, 0x45, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x51, 0x41, 0x4b, 0x41, 0x41, 0x72, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x51, + 0x45, 0x41, 0x46, 0x41, 0x67, 0x6f, 0x48, 0x47, 0x41, 0x63, 0x70, 0x41, 0x69, 0x59, 0x48, 0x4f, 0x41, 0x64, + 0x49, 0x41, 0x6b, 0x63, 0x48, 0x53, 0x41, 0x67, 0x4a, 0x42, 0x51, 0x4d, 0x4c, 0x43, 0x41, 0x41, 0x4c, 0x46, + 0x67, 0x4d, 0x61, 0x43, 0x42, 0x41, 0x4c, 0x4c, 0x77, 0x73, 0x31, 0x41, 0x7a, 0x6b, 0x49, 0x50, 0x77, 0x74, + 0x48, 0x0a, + 0x09, 0x41, 0x30, 0x6f, 0x49, 0x54, 0x77, 0x74, 0x56, 0x41, 0x31, 0x6b, 0x49, 0x5a, 0x67, 0x4e, 0x70, 0x43, + 0x47, 0x38, 0x4c, 0x64, 0x77, 0x4e, 0x34, 0x43, 0x48, 0x38, 0x4c, 0x6e, 0x77, 0x73, 0x57, 0x58, 0x51, 0x42, + 0x64, 0x45, 0x79, 0x45, 0x56, 0x41, 0x53, 0x45, 0x56, 0x49, 0x54, 0x55, 0x42, 0x49, 0x58, 0x4d, 0x45, 0x6c, + 0x66, 0x78, 0x51, 0x41, 0x38, 0x66, 0x37, 0x50, 0x51, 0x4f, 0x77, 0x2f, 0x47, 0x63, 0x46, 0x31, 0x5a, 0x72, + 0x37, 0x0a, + 0x09, 0x62, 0x36, 0x71, 0x61, 0x42, 0x4a, 0x45, 0x41, 0x41, 0x41, 0x45, 0x41, 0x73, 0x50, 0x37, 0x79, 0x41, + 0x6c, 0x67, 0x47, 0x46, 0x41, 0x41, 0x48, 0x41, 0x46, 0x4e, 0x41, 0x44, 0x77, 0x53, 0x70, 0x42, 0x72, 0x49, + 0x43, 0x71, 0x51, 0x43, 0x78, 0x43, 0x41, 0x55, 0x42, 0x41, 0x30, 0x4d, 0x41, 0x43, 0x42, 0x44, 0x63, 0x2f, + 0x4d, 0x77, 0x79, 0x4d, 0x51, 0x41, 0x51, 0x2f, 0x4f, 0x7a, 0x30, 0x37, 0x44, 0x41, 0x42, 0x53, 0x37, 0x41, + 0x4d, 0x0a, + 0x09, 0x56, 0x46, 0x69, 0x39, 0x41, 0x41, 0x6a, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x41, 0x67, 0x41, 0x43, + 0x41, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x53, 0x37, 0x41, 0x53, 0x56, 0x45, 0x75, + 0x77, 0x45, 0x31, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x43, 0x41, 0x42, 0x41, 0x41, 0x41, 0x45, 0x41, 0x43, + 0x41, 0x41, 0x49, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x52, 0x4d, 0x68, 0x46, 0x53, 0x4d, + 0x52, 0x0a, + 0x09, 0x4d, 0x78, 0x55, 0x68, 0x73, 0x41, 0x47, 0x6f, 0x38, 0x50, 0x44, 0x2b, 0x57, 0x41, 0x59, 0x55, 0x6a, + 0x2f, 0x6e, 0x38, 0x6a, 0x77, 0x41, 0x42, 0x41, 0x41, 0x44, 0x2f, 0x51, 0x67, 0x4b, 0x79, 0x42, 0x64, 0x55, + 0x41, 0x41, 0x77, 0x41, 0x74, 0x51, 0x42, 0x51, 0x43, 0x47, 0x67, 0x45, 0x42, 0x41, 0x41, 0x41, 0x61, 0x41, + 0x77, 0x4d, 0x43, 0x51, 0x67, 0x47, 0x66, 0x41, 0x49, 0x45, 0x45, 0x41, 0x67, 0x41, 0x42, 0x41, 0x79, 0x2f, + 0x45, 0x0a, + 0x09, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x30, 0x37, 0x44, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, + 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x56, 0x6b, 0x69, 0x45, 0x77, 0x45, 0x6a, 0x41, 0x61, 0x6f, + 0x43, 0x43, 0x4b, 0x72, 0x39, 0x2b, 0x41, 0x58, 0x56, 0x2b, 0x57, 0x30, 0x47, 0x6b, 0x77, 0x41, 0x41, 0x41, + 0x51, 0x44, 0x48, 0x2f, 0x76, 0x49, 0x43, 0x62, 0x77, 0x59, 0x55, 0x41, 0x41, 0x63, 0x41, 0x50, 0x45, 0x41, + 0x51, 0x0a, + 0x09, 0x41, 0x36, 0x6b, 0x42, 0x73, 0x67, 0x57, 0x70, 0x41, 0x4c, 0x45, 0x49, 0x41, 0x45, 0x4d, 0x45, 0x42, + 0x67, 0x49, 0x45, 0x43, 0x42, 0x44, 0x38, 0x50, 0x4e, 0x7a, 0x73, 0x4d, 0x51, 0x41, 0x51, 0x2f, 0x4f, 0x7a, + 0x30, 0x37, 0x44, 0x41, 0x42, 0x53, 0x37, 0x41, 0x50, 0x56, 0x45, 0x75, 0x77, 0x45, 0x46, 0x52, 0x62, 0x57, + 0x4c, 0x30, 0x41, 0x43, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x43, 0x41, 0x41, 0x49, 0x41, 0x45, 0x41, + 0x34, 0x0a, + 0x09, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x45, 0x52, 0x49, 0x54, 0x55, 0x7a, 0x45, 0x53, 0x4d, 0x31, 0x41, + 0x6d, 0x2f, 0x2b, 0x57, 0x4f, 0x2f, 0x76, 0x42, 0x68, 0x54, 0x34, 0x33, 0x6f, 0x38, 0x47, 0x42, 0x49, 0x38, + 0x41, 0x41, 0x51, 0x44, 0x5a, 0x41, 0x36, 0x67, 0x46, 0x32, 0x77, 0x58, 0x56, 0x41, 0x41, 0x59, 0x41, 0x47, + 0x45, 0x41, 0x4b, 0x41, 0x77, 0x51, 0x42, 0x41, 0x49, 0x45, 0x48, 0x41, 0x77, 0x45, 0x46, 0x42, 0x78, 0x44, + 0x63, 0x0a, + 0x09, 0x7a, 0x44, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x30, 0x7a, 0x44, 0x49, 0x35, 0x4d, 0x41, 0x45, 0x42, 0x49, + 0x77, 0x45, 0x42, 0x49, 0x77, 0x45, 0x44, 0x76, 0x41, 0x49, 0x66, 0x79, 0x66, 0x35, 0x49, 0x2f, 0x6b, 0x6a, + 0x4a, 0x41, 0x68, 0x38, 0x46, 0x31, 0x66, 0x33, 0x54, 0x41, 0x59, 0x76, 0x2b, 0x64, 0x51, 0x49, 0x74, 0x41, + 0x41, 0x41, 0x42, 0x2f, 0x2b, 0x7a, 0x2b, 0x48, 0x51, 0x51, 0x55, 0x2f, 0x71, 0x77, 0x41, 0x41, 0x77, 0x41, + 0x50, 0x0a, + 0x09, 0x74, 0x51, 0x43, 0x70, 0x41, 0x51, 0x41, 0x43, 0x42, 0x42, 0x44, 0x45, 0x78, 0x44, 0x45, 0x41, 0x31, + 0x4f, 0x77, 0x77, 0x41, 0x52, 0x55, 0x68, 0x4e, 0x51, 0x51, 0x55, 0x2b, 0x39, 0x6a, 0x2b, 0x72, 0x49, 0x2b, + 0x50, 0x41, 0x41, 0x41, 0x42, 0x41, 0x4b, 0x6f, 0x45, 0x38, 0x41, 0x4b, 0x4a, 0x42, 0x6d, 0x59, 0x41, 0x41, + 0x77, 0x41, 0x78, 0x51, 0x41, 0x6b, 0x42, 0x74, 0x41, 0x43, 0x7a, 0x42, 0x41, 0x4e, 0x45, 0x41, 0x51, 0x51, + 0x51, 0x0a, + 0x09, 0x33, 0x4f, 0x77, 0x78, 0x41, 0x42, 0x44, 0x30, 0x37, 0x44, 0x41, 0x41, 0x53, 0x37, 0x41, 0x4a, 0x56, + 0x45, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x42, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x45, + 0x41, 0x42, 0x41, 0x41, 0x45, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x6b, 0x42, 0x49, + 0x77, 0x45, 0x42, 0x62, 0x77, 0x45, 0x61, 0x6d, 0x66, 0x36, 0x36, 0x42, 0x6d, 0x62, 0x2b, 0x69, 0x67, 0x46, + 0x32, 0x0a, + 0x09, 0x41, 0x41, 0x49, 0x41, 0x65, 0x2f, 0x2f, 0x6a, 0x42, 0x43, 0x30, 0x45, 0x65, 0x77, 0x41, 0x4b, 0x41, + 0x43, 0x55, 0x41, 0x76, 0x45, 0x41, 0x6e, 0x47, 0x52, 0x38, 0x4c, 0x46, 0x77, 0x6b, 0x4f, 0x41, 0x4b, 0x6b, + 0x58, 0x42, 0x72, 0x6b, 0x4f, 0x45, 0x53, 0x43, 0x47, 0x48, 0x37, 0x6f, 0x63, 0x75, 0x53, 0x4f, 0x34, 0x45, + 0x59, 0x77, 0x58, 0x44, 0x41, 0x41, 0x58, 0x41, 0x78, 0x67, 0x4e, 0x43, 0x51, 0x67, 0x4c, 0x48, 0x77, 0x4d, + 0x49, 0x0a, + 0x09, 0x46, 0x45, 0x55, 0x6d, 0x45, 0x50, 0x7a, 0x73, 0x7a, 0x4e, 0x54, 0x73, 0x4d, 0x6a, 0x49, 0x52, 0x4f, + 0x54, 0x6b, 0x78, 0x41, 0x43, 0x2f, 0x45, 0x35, 0x50, 0x54, 0x38, 0x39, 0x4f, 0x77, 0x51, 0x78, 0x75, 0x34, + 0x51, 0x37, 0x68, 0x45, 0x35, 0x45, 0x54, 0x6b, 0x53, 0x4f, 0x54, 0x42, 0x41, 0x62, 0x6a, 0x41, 0x64, 0x4d, + 0x42, 0x34, 0x77, 0x48, 0x7a, 0x41, 0x67, 0x4d, 0x43, 0x45, 0x77, 0x49, 0x6a, 0x38, 0x6e, 0x51, 0x42, 0x31, + 0x41, 0x0a, + 0x09, 0x48, 0x6b, 0x41, 0x66, 0x51, 0x43, 0x42, 0x41, 0x49, 0x55, 0x41, 0x69, 0x55, 0x42, 0x31, 0x51, 0x48, + 0x6c, 0x41, 0x66, 0x55, 0x43, 0x42, 0x51, 0x49, 0x56, 0x41, 0x69, 0x55, 0x43, 0x64, 0x77, 0x4a, 0x34, 0x55, + 0x64, 0x68, 0x78, 0x36, 0x48, 0x48, 0x34, 0x63, 0x67, 0x68, 0x79, 0x47, 0x46, 0x49, 0x70, 0x41, 0x6e, 0x6f, + 0x43, 0x66, 0x77, 0x4a, 0x78, 0x34, 0x77, 0x48, 0x6a, 0x41, 0x66, 0x4d, 0x43, 0x41, 0x77, 0x49, 0x55, 0x41, + 0x65, 0x0a, + 0x09, 0x51, 0x42, 0x39, 0x41, 0x49, 0x45, 0x41, 0x68, 0x55, 0x42, 0x35, 0x51, 0x48, 0x31, 0x41, 0x67, 0x55, + 0x43, 0x46, 0x67, 0x48, 0x6d, 0x41, 0x66, 0x59, 0x43, 0x42, 0x67, 0x49, 0x58, 0x41, 0x65, 0x63, 0x42, 0x39, + 0x77, 0x49, 0x48, 0x41, 0x68, 0x67, 0x42, 0x36, 0x41, 0x48, 0x34, 0x41, 0x67, 0x67, 0x43, 0x45, 0x59, 0x58, + 0x51, 0x46, 0x64, 0x41, 0x53, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x50, 0x51, 0x45, + 0x33, 0x0a, + 0x09, 0x45, 0x53, 0x4d, 0x31, 0x44, 0x67, 0x45, 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x7a, 0x49, + 0x54, 0x55, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x67, 0x63, 0x31, 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, + 0x43, 0x76, 0x74, 0x2b, 0x73, 0x67, 0x57, 0x2b, 0x5a, 0x75, 0x62, 0x69, 0x34, 0x50, 0x37, 0x79, 0x49, 0x72, + 0x4d, 0x76, 0x39, 0x2b, 0x77, 0x45, 0x43, 0x70, 0x35, 0x64, 0x67, 0x74, 0x6c, 0x52, 0x6c, 0x76, 0x6c, 0x72, + 0x7a, 0x0a, + 0x09, 0x38, 0x41, 0x49, 0x7a, 0x5a, 0x6e, 0x74, 0x69, 0x63, 0x39, 0x6d, 0x30, 0x4b, 0x55, 0x7a, 0x39, 0x67, + 0x61, 0x70, 0x6d, 0x59, 0x63, 0x47, 0x69, 0x76, 0x63, 0x41, 0x53, 0x66, 0x34, 0x73, 0x75, 0x4c, 0x71, 0x6f, + 0x6e, 0x4a, 0x2f, 0x77, 0x41, 0x41, 0x41, 0x49, 0x41, 0x75, 0x76, 0x2f, 0x6a, 0x42, 0x4b, 0x51, 0x47, 0x46, + 0x41, 0x41, 0x4c, 0x41, 0x42, 0x77, 0x41, 0x4f, 0x45, 0x41, 0x5a, 0x41, 0x37, 0x6b, 0x4d, 0x44, 0x77, 0x6d, + 0x35, 0x0a, + 0x09, 0x47, 0x42, 0x57, 0x4d, 0x44, 0x37, 0x67, 0x62, 0x6c, 0x78, 0x6b, 0x41, 0x45, 0x68, 0x4a, 0x48, 0x47, + 0x41, 0x77, 0x47, 0x43, 0x42, 0x70, 0x47, 0x48, 0x52, 0x44, 0x38, 0x37, 0x44, 0x49, 0x79, 0x39, 0x4f, 0x77, + 0x78, 0x41, 0x43, 0x2f, 0x73, 0x35, 0x50, 0x54, 0x45, 0x37, 0x42, 0x44, 0x47, 0x37, 0x6a, 0x43, 0x32, 0x59, + 0x42, 0x36, 0x41, 0x48, 0x71, 0x41, 0x65, 0x41, 0x77, 0x46, 0x64, 0x41, 0x54, 0x51, 0x6d, 0x49, 0x79, 0x49, + 0x47, 0x0a, + 0x09, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x41, 0x54, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x53, 0x45, + 0x52, 0x41, 0x43, 0x49, 0x79, 0x49, 0x6d, 0x4a, 0x78, 0x55, 0x6a, 0x45, 0x54, 0x4d, 0x44, 0x35, 0x61, 0x65, + 0x53, 0x6b, 0x71, 0x65, 0x6e, 0x6b, 0x70, 0x4b, 0x6e, 0x2f, 0x59, 0x34, 0x36, 0x73, 0x58, 0x76, 0x4d, 0x2f, + 0x2f, 0x2f, 0x4d, 0x65, 0x37, 0x45, 0x36, 0x75, 0x62, 0x6b, 0x43, 0x4c, 0x38, 0x76, 0x6e, 0x35, 0x38, 0x76, + 0x4c, 0x0a, + 0x09, 0x35, 0x2b, 0x63, 0x43, 0x55, 0x6d, 0x52, 0x68, 0x2f, 0x72, 0x7a, 0x2b, 0x2b, 0x50, 0x37, 0x34, 0x2f, + 0x72, 0x78, 0x68, 0x5a, 0x4b, 0x67, 0x47, 0x46, 0x41, 0x41, 0x41, 0x41, 0x51, 0x42, 0x78, 0x2f, 0x2b, 0x4d, + 0x44, 0x35, 0x77, 0x52, 0x37, 0x41, 0x42, 0x6b, 0x41, 0x50, 0x30, 0x41, 0x62, 0x41, 0x49, 0x59, 0x42, 0x69, + 0x41, 0x51, 0x4f, 0x68, 0x67, 0x32, 0x49, 0x43, 0x72, 0x6b, 0x52, 0x42, 0x4c, 0x6b, 0x58, 0x75, 0x42, 0x47, + 0x4d, 0x0a, + 0x09, 0x47, 0x67, 0x63, 0x53, 0x44, 0x51, 0x42, 0x49, 0x46, 0x45, 0x55, 0x61, 0x45, 0x50, 0x7a, 0x6b, 0x4d, + 0x75, 0x77, 0x78, 0x41, 0x42, 0x44, 0x6b, 0x39, 0x4f, 0x77, 0x51, 0x2f, 0x76, 0x54, 0x75, 0x45, 0x50, 0x58, + 0x75, 0x4d, 0x45, 0x41, 0x4c, 0x44, 0x78, 0x73, 0x51, 0x47, 0x34, 0x41, 0x62, 0x6b, 0x42, 0x75, 0x67, 0x47, + 0x77, 0x55, 0x42, 0x58, 0x51, 0x45, 0x56, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, 0x42, 0x59, + 0x7a, 0x0a, + 0x09, 0x4d, 0x6a, 0x59, 0x33, 0x46, 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x41, 0x45, 0x52, 0x41, 0x41, 0x49, + 0x54, 0x49, 0x57, 0x41, 0x2b, 0x64, 0x4f, 0x6e, 0x56, 0x43, 0x7a, 0x78, 0x73, 0x61, 0x7a, 0x55, 0x4a, 0x31, + 0x4f, 0x54, 0x61, 0x56, 0x64, 0x2f, 0x66, 0x37, 0x57, 0x41, 0x53, 0x30, 0x42, 0x42, 0x6c, 0x57, 0x69, 0x42, + 0x44, 0x57, 0x73, 0x4b, 0x79, 0x76, 0x6a, 0x7a, 0x63, 0x33, 0x6a, 0x4b, 0x79, 0x75, 0x71, 0x4a, 0x43, 0x51, + 0x42, 0x0a, + 0x09, 0x50, 0x67, 0x45, 0x4f, 0x41, 0x52, 0x49, 0x42, 0x4f, 0x69, 0x4d, 0x41, 0x41, 0x67, 0x42, 0x78, 0x2f, + 0x2b, 0x4d, 0x45, 0x57, 0x67, 0x59, 0x55, 0x41, 0x42, 0x41, 0x41, 0x48, 0x41, 0x41, 0x34, 0x51, 0x42, 0x6b, + 0x61, 0x75, 0x51, 0x41, 0x4f, 0x46, 0x4c, 0x6b, 0x46, 0x43, 0x49, 0x77, 0x4f, 0x75, 0x41, 0x47, 0x58, 0x41, + 0x78, 0x63, 0x45, 0x41, 0x41, 0x67, 0x43, 0x52, 0x78, 0x45, 0x53, 0x43, 0x30, 0x55, 0x64, 0x45, 0x50, 0x7a, + 0x73, 0x0a, + 0x09, 0x39, 0x4f, 0x77, 0x79, 0x4d, 0x6a, 0x45, 0x41, 0x4c, 0x2b, 0x7a, 0x6b, 0x39, 0x4d, 0x54, 0x73, 0x45, + 0x4d, 0x54, 0x75, 0x4d, 0x4c, 0x5a, 0x67, 0x48, 0x6f, 0x41, 0x65, 0x6f, 0x42, 0x34, 0x44, 0x41, 0x56, 0x30, + 0x42, 0x45, 0x54, 0x4d, 0x52, 0x49, 0x7a, 0x55, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x41, 0x68, 0x45, 0x51, 0x45, + 0x6a, 0x4d, 0x79, 0x46, 0x67, 0x45, 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x4d, + 0x69, 0x0a, + 0x09, 0x42, 0x67, 0x4f, 0x69, 0x75, 0x4c, 0x67, 0x36, 0x73, 0x58, 0x7a, 0x4c, 0x2f, 0x2f, 0x2f, 0x4c, 0x66, + 0x4c, 0x48, 0x39, 0x78, 0x36, 0x65, 0x53, 0x6b, 0x71, 0x69, 0x6f, 0x6b, 0x70, 0x4b, 0x6e, 0x41, 0x37, 0x59, + 0x43, 0x58, 0x76, 0x6e, 0x73, 0x71, 0x47, 0x52, 0x68, 0x41, 0x55, 0x51, 0x42, 0x43, 0x41, 0x45, 0x49, 0x41, + 0x55, 0x52, 0x68, 0x2f, 0x68, 0x58, 0x4c, 0x35, 0x2b, 0x66, 0x4c, 0x79, 0x2b, 0x66, 0x6e, 0x41, 0x41, 0x41, + 0x43, 0x0a, + 0x09, 0x41, 0x48, 0x48, 0x2f, 0x34, 0x77, 0x52, 0x2f, 0x42, 0x48, 0x73, 0x41, 0x46, 0x41, 0x41, 0x62, 0x41, + 0x48, 0x42, 0x41, 0x4a, 0x41, 0x41, 0x56, 0x41, 0x51, 0x6d, 0x47, 0x43, 0x49, 0x67, 0x46, 0x46, 0x61, 0x6b, + 0x42, 0x42, 0x62, 0x6b, 0x4d, 0x41, 0x62, 0x73, 0x59, 0x75, 0x52, 0x4b, 0x34, 0x44, 0x49, 0x77, 0x63, 0x47, + 0x78, 0x55, 0x43, 0x43, 0x42, 0x55, 0x49, 0x41, 0x45, 0x73, 0x43, 0x45, 0x67, 0x39, 0x46, 0x48, 0x42, 0x44, + 0x38, 0x0a, + 0x09, 0x37, 0x50, 0x54, 0x73, 0x78, 0x42, 0x45, 0x53, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x4f, 0x54, 0x30, 0x37, + 0x4f, 0x51, 0x51, 0x37, 0x68, 0x44, 0x75, 0x45, 0x50, 0x54, 0x75, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x45, 0x41, + 0x70, 0x50, 0x78, 0x31, 0x77, 0x48, 0x61, 0x41, 0x64, 0x30, 0x42, 0x33, 0x77, 0x48, 0x51, 0x55, 0x2f, 0x41, + 0x44, 0x38, 0x42, 0x50, 0x77, 0x49, 0x2f, 0x46, 0x54, 0x38, 0x62, 0x42, 0x53, 0x77, 0x48, 0x4c, 0x77, 0x67, + 0x76, 0x0a, + 0x09, 0x43, 0x53, 0x77, 0x4b, 0x62, 0x77, 0x42, 0x76, 0x41, 0x57, 0x38, 0x43, 0x62, 0x78, 0x56, 0x76, 0x47, + 0x77, 0x6c, 0x64, 0x63, 0x51, 0x46, 0x64, 0x41, 0x52, 0x55, 0x68, 0x48, 0x67, 0x45, 0x7a, 0x4d, 0x6a, 0x59, + 0x33, 0x46, 0x51, 0x34, 0x42, 0x49, 0x79, 0x41, 0x41, 0x45, 0x52, 0x41, 0x41, 0x4d, 0x7a, 0x49, 0x41, 0x42, + 0x79, 0x34, 0x42, 0x49, 0x79, 0x49, 0x47, 0x42, 0x77, 0x52, 0x2f, 0x2f, 0x4c, 0x49, 0x4d, 0x7a, 0x62, 0x64, + 0x71, 0x0a, + 0x09, 0x78, 0x32, 0x4a, 0x6a, 0x30, 0x47, 0x76, 0x2b, 0x39, 0x50, 0x37, 0x48, 0x41, 0x53, 0x6e, 0x38, 0x34, + 0x67, 0x45, 0x48, 0x75, 0x41, 0x4b, 0x6c, 0x69, 0x4a, 0x71, 0x35, 0x44, 0x67, 0x4a, 0x65, 0x57, 0x72, 0x37, + 0x48, 0x4e, 0x44, 0x53, 0x75, 0x4b, 0x69, 0x77, 0x42, 0x4f, 0x41, 0x45, 0x4b, 0x41, 0x52, 0x4d, 0x42, 0x51, + 0x2f, 0x37, 0x64, 0x78, 0x4a, 0x65, 0x30, 0x72, 0x70, 0x34, 0x41, 0x41, 0x41, 0x45, 0x41, 0x4c, 0x77, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x76, 0x67, 0x47, 0x46, 0x41, 0x41, 0x54, 0x41, 0x48, 0x42, 0x41, 0x48, 0x41, 0x55, 0x51, 0x41, + 0x51, 0x77, 0x49, 0x71, 0x51, 0x59, 0x42, 0x68, 0x77, 0x43, 0x58, 0x44, 0x67, 0x61, 0x38, 0x43, 0x67, 0x49, + 0x54, 0x42, 0x77, 0x41, 0x48, 0x43, 0x51, 0x55, 0x49, 0x44, 0x51, 0x38, 0x4c, 0x54, 0x42, 0x51, 0x51, 0x2f, + 0x44, 0x7a, 0x45, 0x2f, 0x44, 0x7a, 0x45, 0x78, 0x42, 0x49, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x2b, 0x51, + 0x79, 0x0a, + 0x09, 0x2f, 0x4f, 0x77, 0x51, 0x37, 0x6a, 0x49, 0x53, 0x4f, 0x54, 0x6b, 0x77, 0x41, 0x55, 0x75, 0x77, 0x43, + 0x6c, 0x52, 0x59, 0x76, 0x51, 0x41, 0x55, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x55, 0x41, 0x42, 0x51, + 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x55, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x59, 0x76, + 0x51, 0x41, 0x55, 0x41, 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x55, 0x41, 0x42, 0x54, 0x2f, 0x77, 0x44, 0x67, + 0x52, 0x0a, + 0x09, 0x4e, 0x7a, 0x68, 0x5a, 0x74, 0x6b, 0x41, 0x56, 0x55, 0x42, 0x57, 0x67, 0x46, 0x51, 0x4e, 0x64, 0x41, + 0x52, 0x55, 0x6a, 0x49, 0x67, 0x59, 0x64, 0x41, 0x53, 0x45, 0x56, 0x49, 0x52, 0x45, 0x6a, 0x45, 0x53, 0x4d, + 0x31, 0x4d, 0x7a, 0x55, 0x30, 0x4e, 0x6a, 0x4d, 0x43, 0x2b, 0x4c, 0x42, 0x6a, 0x54, 0x51, 0x45, 0x76, 0x2f, + 0x74, 0x47, 0x35, 0x73, 0x4c, 0x43, 0x75, 0x76, 0x51, 0x59, 0x55, 0x6d, 0x56, 0x42, 0x6f, 0x59, 0x34, 0x2f, + 0x38, 0x0a, + 0x09, 0x4c, 0x77, 0x50, 0x52, 0x6a, 0x30, 0x36, 0x37, 0x71, 0x77, 0x41, 0x41, 0x41, 0x67, 0x42, 0x78, 0x2f, + 0x6c, 0x59, 0x45, 0x57, 0x67, 0x52, 0x37, 0x41, 0x41, 0x73, 0x41, 0x4b, 0x41, 0x42, 0x4b, 0x51, 0x43, 0x4d, + 0x5a, 0x44, 0x42, 0x30, 0x4a, 0x45, 0x6f, 0x59, 0x54, 0x46, 0x72, 0x6b, 0x50, 0x41, 0x37, 0x6b, 0x6d, 0x49, + 0x37, 0x67, 0x6e, 0x76, 0x41, 0x6d, 0x35, 0x44, 0x37, 0x30, 0x61, 0x48, 0x53, 0x59, 0x5a, 0x41, 0x41, 0x67, + 0x4d, 0x0a, + 0x09, 0x52, 0x77, 0x59, 0x53, 0x45, 0x69, 0x42, 0x46, 0x4b, 0x52, 0x44, 0x38, 0x78, 0x4f, 0x7a, 0x30, 0x37, + 0x44, 0x49, 0x79, 0x4d, 0x51, 0x41, 0x76, 0x78, 0x4f, 0x54, 0x73, 0x35, 0x50, 0x54, 0x45, 0x37, 0x42, 0x44, + 0x2b, 0x31, 0x65, 0x34, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x4d, 0x4c, 0x5a, 0x67, 0x4b, 0x6f, 0x41, 0x71, 0x6f, + 0x43, 0x6f, 0x44, 0x41, 0x56, 0x30, 0x42, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, 0x42, 0x59, + 0x7a, 0x0a, + 0x09, 0x4d, 0x6a, 0x59, 0x58, 0x45, 0x41, 0x49, 0x68, 0x49, 0x69, 0x59, 0x6e, 0x4e, 0x52, 0x34, 0x42, 0x4d, + 0x7a, 0x49, 0x32, 0x50, 0x51, 0x45, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x41, 0x68, 0x45, 0x51, 0x45, 0x6a, 0x4d, + 0x79, 0x46, 0x68, 0x63, 0x31, 0x4d, 0x77, 0x4f, 0x69, 0x70, 0x5a, 0x57, 0x55, 0x70, 0x61, 0x57, 0x55, 0x6c, + 0x61, 0x57, 0x34, 0x2f, 0x76, 0x37, 0x36, 0x59, 0x61, 0x78, 0x52, 0x55, 0x5a, 0x35, 0x53, 0x74, 0x62, 0x51, + 0x35, 0x0a, + 0x09, 0x73, 0x6e, 0x7a, 0x4f, 0x2f, 0x50, 0x7a, 0x4f, 0x66, 0x4c, 0x49, 0x35, 0x75, 0x41, 0x49, 0x39, 0x79, + 0x4e, 0x7a, 0x63, 0x79, 0x4d, 0x66, 0x63, 0x33, 0x4f, 0x76, 0x2b, 0x34, 0x76, 0x37, 0x70, 0x48, 0x52, 0x36, + 0x7a, 0x4c, 0x43, 0x71, 0x39, 0x76, 0x31, 0x74, 0x6a, 0x59, 0x67, 0x45, 0x36, 0x41, 0x51, 0x4d, 0x42, 0x42, + 0x41, 0x45, 0x36, 0x59, 0x6d, 0x4f, 0x71, 0x41, 0x41, 0x41, 0x42, 0x41, 0x4c, 0x6f, 0x41, 0x41, 0x41, 0x52, + 0x6b, 0x0a, + 0x09, 0x42, 0x68, 0x51, 0x41, 0x45, 0x77, 0x41, 0x30, 0x51, 0x42, 0x6b, 0x44, 0x43, 0x51, 0x41, 0x44, 0x44, + 0x67, 0x45, 0x47, 0x68, 0x77, 0x34, 0x52, 0x75, 0x41, 0x79, 0x58, 0x43, 0x67, 0x45, 0x43, 0x43, 0x41, 0x42, + 0x4f, 0x44, 0x51, 0x6b, 0x49, 0x43, 0x30, 0x59, 0x55, 0x45, 0x50, 0x7a, 0x73, 0x4d, 0x76, 0x54, 0x73, 0x4d, + 0x51, 0x41, 0x76, 0x50, 0x4f, 0x7a, 0x30, 0x78, 0x4f, 0x77, 0x52, 0x45, 0x68, 0x63, 0x35, 0x4d, 0x4c, 0x4a, + 0x67, 0x0a, + 0x09, 0x46, 0x51, 0x45, 0x42, 0x58, 0x51, 0x45, 0x52, 0x49, 0x78, 0x45, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, + 0x68, 0x55, 0x52, 0x49, 0x78, 0x45, 0x7a, 0x45, 0x54, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x57, 0x42, 0x47, 0x53, + 0x34, 0x66, 0x48, 0x79, 0x56, 0x72, 0x4c, 0x6d, 0x35, 0x51, 0x72, 0x4e, 0x31, 0x77, 0x63, 0x59, 0x43, 0x70, + 0x50, 0x31, 0x63, 0x41, 0x70, 0x36, 0x66, 0x6e, 0x72, 0x36, 0x6b, 0x2f, 0x59, 0x63, 0x47, 0x46, 0x50, 0x32, + 0x65, 0x0a, + 0x09, 0x5a, 0x57, 0x54, 0x76, 0x41, 0x41, 0x41, 0x43, 0x41, 0x4d, 0x45, 0x41, 0x41, 0x41, 0x46, 0x35, 0x42, + 0x68, 0x51, 0x41, 0x41, 0x77, 0x41, 0x48, 0x41, 0x43, 0x74, 0x41, 0x44, 0x67, 0x61, 0x2b, 0x42, 0x4c, 0x45, + 0x41, 0x76, 0x41, 0x49, 0x46, 0x41, 0x51, 0x67, 0x45, 0x41, 0x45, 0x59, 0x49, 0x45, 0x50, 0x77, 0x38, 0x37, + 0x44, 0x49, 0x78, 0x41, 0x43, 0x2f, 0x6b, 0x2f, 0x4f, 0x77, 0x77, 0x51, 0x41, 0x73, 0x51, 0x43, 0x55, 0x41, + 0x4a, 0x0a, + 0x09, 0x55, 0x41, 0x6c, 0x67, 0x43, 0x58, 0x41, 0x4a, 0x42, 0x51, 0x46, 0x64, 0x45, 0x7a, 0x4d, 0x52, 0x49, + 0x78, 0x45, 0x7a, 0x46, 0x53, 0x50, 0x42, 0x75, 0x4c, 0x69, 0x34, 0x75, 0x41, 0x52, 0x67, 0x2b, 0x36, 0x41, + 0x47, 0x46, 0x4f, 0x6b, 0x41, 0x41, 0x41, 0x4c, 0x2f, 0x32, 0x2f, 0x35, 0x57, 0x41, 0x58, 0x6b, 0x47, 0x46, + 0x41, 0x41, 0x4c, 0x41, 0x41, 0x38, 0x41, 0x52, 0x45, 0x41, 0x63, 0x43, 0x77, 0x49, 0x48, 0x41, 0x41, 0x36, + 0x2b, 0x0a, + 0x09, 0x44, 0x41, 0x65, 0x48, 0x42, 0x62, 0x30, 0x41, 0x76, 0x41, 0x79, 0x78, 0x45, 0x41, 0x67, 0x51, 0x42, + 0x51, 0x5a, 0x50, 0x44, 0x51, 0x45, 0x49, 0x44, 0x41, 0x42, 0x47, 0x45, 0x42, 0x44, 0x38, 0x50, 0x4f, 0x77, + 0x79, 0x35, 0x44, 0x6b, 0x53, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x4f, 0x7a, 0x6b, 0x39, 0x4f, 0x77, 0x51, 0x37, + 0x68, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x77, 0x51, 0x41, 0x73, 0x51, 0x45, 0x55, 0x41, 0x52, 0x55, 0x42, 0x46, + 0x67, 0x0a, + 0x09, 0x45, 0x58, 0x41, 0x52, 0x42, 0x51, 0x46, 0x64, 0x45, 0x7a, 0x4d, 0x52, 0x46, 0x41, 0x59, 0x72, 0x41, + 0x54, 0x55, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x45, 0x54, 0x4d, 0x56, 0x49, 0x38, 0x47, 0x34, 0x6f, 0x37, 0x56, + 0x47, 0x4d, 0x57, 0x6c, 0x4d, 0x75, 0x4c, 0x67, 0x45, 0x59, 0x50, 0x75, 0x4d, 0x31, 0x73, 0x43, 0x63, 0x59, + 0x5a, 0x6b, 0x47, 0x4b, 0x4f, 0x6b, 0x41, 0x41, 0x51, 0x43, 0x36, 0x41, 0x41, 0x41, 0x45, 0x6e, 0x41, 0x59, + 0x55, 0x0a, + 0x09, 0x41, 0x41, 0x6f, 0x41, 0x76, 0x45, 0x41, 0x70, 0x43, 0x42, 0x45, 0x46, 0x42, 0x67, 0x55, 0x48, 0x45, + 0x51, 0x59, 0x47, 0x42, 0x51, 0x4d, 0x52, 0x42, 0x41, 0x55, 0x45, 0x41, 0x68, 0x45, 0x46, 0x42, 0x51, 0x52, + 0x43, 0x43, 0x41, 0x55, 0x43, 0x41, 0x77, 0x4f, 0x38, 0x41, 0x4a, 0x63, 0x4a, 0x42, 0x67, 0x55, 0x42, 0x42, + 0x41, 0x59, 0x49, 0x41, 0x51, 0x67, 0x41, 0x52, 0x67, 0x73, 0x51, 0x2f, 0x4f, 0x77, 0x79, 0x31, 0x4d, 0x51, + 0x52, 0x0a, + 0x09, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x7a, 0x7a, 0x73, 0x35, 0x42, 0x63, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, + 0x41, 0x63, 0x51, 0x42, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, + 0x51, 0x42, 0x4f, 0x31, 0x5a, 0x49, 0x72, 0x49, 0x51, 0x44, 0x41, 0x45, 0x42, 0x58, 0x55, 0x42, 0x66, 0x42, + 0x41, 0x49, 0x4b, 0x43, 0x42, 0x59, 0x43, 0x4a, 0x77, 0x49, 0x70, 0x42, 0x53, 0x73, 0x49, 0x56, 0x67, 0x4a, + 0x6d, 0x0a, + 0x09, 0x41, 0x6d, 0x63, 0x49, 0x63, 0x77, 0x4a, 0x33, 0x42, 0x59, 0x49, 0x43, 0x69, 0x51, 0x57, 0x4f, 0x43, + 0x4a, 0x4d, 0x43, 0x6c, 0x67, 0x57, 0x58, 0x43, 0x4b, 0x4d, 0x43, 0x45, 0x67, 0x6b, 0x46, 0x43, 0x51, 0x59, + 0x43, 0x43, 0x77, 0x4d, 0x4b, 0x42, 0x79, 0x67, 0x44, 0x4a, 0x77, 0x51, 0x6f, 0x42, 0x53, 0x73, 0x47, 0x4b, + 0x77, 0x64, 0x41, 0x44, 0x47, 0x67, 0x44, 0x59, 0x41, 0x79, 0x4a, 0x41, 0x34, 0x55, 0x45, 0x69, 0x51, 0x57, + 0x4e, 0x0a, + 0x09, 0x42, 0x6f, 0x38, 0x48, 0x6d, 0x67, 0x4f, 0x58, 0x42, 0x36, 0x6f, 0x44, 0x70, 0x77, 0x57, 0x32, 0x42, + 0x38, 0x55, 0x48, 0x31, 0x67, 0x66, 0x33, 0x41, 0x2f, 0x41, 0x44, 0x39, 0x77, 0x54, 0x77, 0x42, 0x42, 0x70, + 0x64, 0x63, 0x51, 0x42, 0x64, 0x45, 0x7a, 0x4d, 0x52, 0x41, 0x54, 0x4d, 0x4a, 0x41, 0x53, 0x4d, 0x42, 0x45, + 0x53, 0x4f, 0x36, 0x75, 0x51, 0x49, 0x6c, 0x36, 0x2f, 0x32, 0x75, 0x41, 0x6d, 0x76, 0x77, 0x2f, 0x63, 0x65, + 0x35, 0x0a, + 0x09, 0x42, 0x68, 0x54, 0x38, 0x61, 0x51, 0x48, 0x6a, 0x2f, 0x66, 0x54, 0x39, 0x72, 0x41, 0x49, 0x6a, 0x2f, + 0x64, 0x30, 0x41, 0x41, 0x51, 0x44, 0x42, 0x41, 0x41, 0x41, 0x42, 0x65, 0x51, 0x59, 0x55, 0x41, 0x41, 0x4d, + 0x41, 0x49, 0x72, 0x63, 0x41, 0x6c, 0x77, 0x49, 0x42, 0x43, 0x41, 0x42, 0x47, 0x42, 0x42, 0x44, 0x38, 0x37, + 0x44, 0x45, 0x41, 0x4c, 0x2b, 0x77, 0x77, 0x51, 0x41, 0x30, 0x51, 0x42, 0x55, 0x41, 0x46, 0x55, 0x41, 0x56, + 0x67, 0x0a, + 0x09, 0x42, 0x58, 0x41, 0x46, 0x38, 0x41, 0x55, 0x47, 0x41, 0x56, 0x30, 0x54, 0x4d, 0x78, 0x45, 0x6a, 0x77, + 0x62, 0x69, 0x34, 0x42, 0x68, 0x54, 0x35, 0x37, 0x41, 0x41, 0x41, 0x41, 0x51, 0x43, 0x36, 0x41, 0x41, 0x41, + 0x48, 0x48, 0x51, 0x52, 0x37, 0x41, 0x43, 0x49, 0x41, 0x57, 0x6b, 0x41, 0x6d, 0x42, 0x68, 0x49, 0x4a, 0x47, + 0x41, 0x38, 0x41, 0x42, 0x68, 0x30, 0x48, 0x46, 0x51, 0x79, 0x48, 0x48, 0x53, 0x41, 0x44, 0x75, 0x42, 0x75, + 0x38, 0x0a, + 0x09, 0x47, 0x52, 0x41, 0x48, 0x41, 0x42, 0x45, 0x50, 0x43, 0x41, 0x67, 0x47, 0x55, 0x42, 0x45, 0x49, 0x44, + 0x31, 0x41, 0x63, 0x47, 0x41, 0x67, 0x61, 0x52, 0x69, 0x4d, 0x51, 0x2f, 0x4f, 0x77, 0x79, 0x2f, 0x50, 0x7a, + 0x38, 0x37, 0x42, 0x45, 0x53, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x7a, 0x77, 0x38, 0x35, 0x50, 0x51, 0x38, 0x78, + 0x4f, 0x77, 0x79, 0x45, 0x52, 0x49, 0x58, 0x4f, 0x54, 0x42, 0x41, 0x45, 0x7a, 0x41, 0x6b, 0x55, 0x43, 0x52, + 0x77, 0x0a, + 0x09, 0x4a, 0x4a, 0x41, 0x6b, 0x6f, 0x43, 0x53, 0x67, 0x4a, 0x4c, 0x38, 0x6b, 0x33, 0x79, 0x54, 0x2f, 0x4a, + 0x41, 0x6b, 0x42, 0x58, 0x51, 0x45, 0x2b, 0x41, 0x54, 0x4d, 0x79, 0x46, 0x68, 0x55, 0x52, 0x49, 0x78, 0x45, + 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x68, 0x55, 0x52, 0x49, 0x78, 0x45, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, + 0x68, 0x55, 0x52, 0x49, 0x78, 0x45, 0x7a, 0x46, 0x54, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x57, 0x42, 0x43, 0x6c, + 0x46, 0x0a, + 0x09, 0x77, 0x49, 0x4b, 0x76, 0x76, 0x72, 0x6c, 0x79, 0x64, 0x59, 0x2b, 0x6d, 0x75, 0x58, 0x4a, 0x33, 0x6a, + 0x61, 0x61, 0x35, 0x75, 0x54, 0x2b, 0x77, 0x65, 0x58, 0x71, 0x72, 0x41, 0x34, 0x6c, 0x38, 0x64, 0x76, 0x58, + 0x69, 0x2f, 0x56, 0x77, 0x43, 0x6e, 0x71, 0x47, 0x63, 0x76, 0x71, 0x54, 0x39, 0x68, 0x77, 0x4b, 0x65, 0x6f, + 0x70, 0x75, 0x2f, 0x6f, 0x2f, 0x32, 0x48, 0x42, 0x47, 0x43, 0x75, 0x5a, 0x32, 0x4a, 0x38, 0x41, 0x41, 0x41, + 0x42, 0x0a, + 0x09, 0x41, 0x4c, 0x6f, 0x41, 0x41, 0x41, 0x52, 0x6b, 0x42, 0x48, 0x73, 0x41, 0x45, 0x77, 0x41, 0x32, 0x51, + 0x42, 0x6b, 0x44, 0x43, 0x51, 0x41, 0x44, 0x44, 0x67, 0x45, 0x47, 0x68, 0x77, 0x34, 0x52, 0x75, 0x41, 0x79, + 0x38, 0x43, 0x67, 0x45, 0x43, 0x43, 0x41, 0x42, 0x4f, 0x44, 0x51, 0x6b, 0x49, 0x43, 0x30, 0x59, 0x55, 0x45, + 0x50, 0x7a, 0x73, 0x4d, 0x76, 0x54, 0x73, 0x4d, 0x51, 0x41, 0x76, 0x50, 0x4f, 0x54, 0x30, 0x78, 0x4f, 0x77, + 0x52, 0x0a, + 0x09, 0x45, 0x68, 0x63, 0x35, 0x4d, 0x4c, 0x52, 0x67, 0x46, 0x63, 0x38, 0x56, 0x41, 0x67, 0x46, 0x64, 0x41, + 0x52, 0x45, 0x6a, 0x45, 0x54, 0x51, 0x6d, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x45, 0x6a, 0x45, 0x54, 0x4d, + 0x56, 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x59, 0x45, 0x5a, 0x4c, 0x68, 0x38, 0x66, 0x4a, 0x57, 0x73, 0x75, + 0x62, 0x6c, 0x43, 0x73, 0x33, 0x58, 0x42, 0x78, 0x67, 0x4b, 0x6b, 0x2f, 0x56, 0x77, 0x43, 0x6e, 0x70, 0x2b, + 0x65, 0x0a, + 0x09, 0x76, 0x71, 0x54, 0x39, 0x68, 0x77, 0x52, 0x67, 0x72, 0x6d, 0x56, 0x6b, 0x37, 0x77, 0x41, 0x43, 0x41, + 0x48, 0x48, 0x2f, 0x34, 0x77, 0x52, 0x31, 0x42, 0x48, 0x73, 0x41, 0x43, 0x77, 0x41, 0x58, 0x41, 0x45, 0x70, + 0x41, 0x45, 0x77, 0x61, 0x35, 0x45, 0x67, 0x43, 0x35, 0x44, 0x4c, 0x67, 0x53, 0x6a, 0x42, 0x67, 0x4a, 0x45, + 0x67, 0x39, 0x52, 0x41, 0x78, 0x49, 0x56, 0x52, 0x52, 0x67, 0x51, 0x2f, 0x4f, 0x7a, 0x30, 0x37, 0x44, 0x45, + 0x41, 0x0a, + 0x09, 0x45, 0x4f, 0x54, 0x30, 0x37, 0x42, 0x44, 0x75, 0x4d, 0x45, 0x41, 0x6a, 0x50, 0x78, 0x6c, 0x37, 0x41, + 0x48, 0x73, 0x47, 0x66, 0x77, 0x64, 0x2f, 0x43, 0x48, 0x38, 0x4a, 0x66, 0x77, 0x70, 0x2f, 0x43, 0x33, 0x73, + 0x4d, 0x66, 0x77, 0x31, 0x2f, 0x44, 0x6e, 0x38, 0x50, 0x66, 0x78, 0x42, 0x2f, 0x45, 0x58, 0x73, 0x53, 0x6f, + 0x42, 0x6e, 0x77, 0x47, 0x52, 0x45, 0x42, 0x58, 0x51, 0x45, 0x69, 0x42, 0x68, 0x55, 0x55, 0x46, 0x6a, 0x4d, + 0x79, 0x0a, + 0x09, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x63, 0x79, 0x41, 0x42, 0x45, 0x51, 0x41, 0x43, 0x4d, 0x69, 0x41, + 0x42, 0x45, 0x51, 0x41, 0x41, 0x4a, 0x7a, 0x6c, 0x4b, 0x79, 0x72, 0x6c, 0x5a, 0x4f, 0x73, 0x72, 0x4a, 0x50, + 0x77, 0x41, 0x52, 0x4c, 0x2b, 0x37, 0x76, 0x44, 0x78, 0x2f, 0x75, 0x38, 0x42, 0x45, 0x51, 0x50, 0x66, 0x35, + 0x38, 0x6e, 0x4a, 0x35, 0x2b, 0x6a, 0x49, 0x78, 0x2b, 0x6d, 0x63, 0x2f, 0x73, 0x6a, 0x2b, 0x37, 0x50, 0x37, + 0x74, 0x0a, + 0x09, 0x2f, 0x73, 0x63, 0x42, 0x4f, 0x51, 0x45, 0x54, 0x41, 0x52, 0x51, 0x42, 0x4f, 0x41, 0x41, 0x43, 0x41, + 0x4c, 0x72, 0x2b, 0x56, 0x67, 0x53, 0x6b, 0x42, 0x48, 0x73, 0x41, 0x45, 0x41, 0x41, 0x63, 0x41, 0x44, 0x35, + 0x41, 0x47, 0x78, 0x71, 0x35, 0x41, 0x41, 0x34, 0x55, 0x75, 0x51, 0x55, 0x49, 0x75, 0x41, 0x36, 0x4d, 0x41, + 0x62, 0x30, 0x44, 0x76, 0x42, 0x30, 0x52, 0x45, 0x67, 0x74, 0x48, 0x46, 0x77, 0x51, 0x41, 0x43, 0x41, 0x4a, + 0x47, 0x0a, + 0x09, 0x48, 0x52, 0x44, 0x38, 0x37, 0x44, 0x49, 0x79, 0x39, 0x4f, 0x77, 0x78, 0x41, 0x42, 0x44, 0x6b, 0x35, + 0x4f, 0x54, 0x30, 0x78, 0x4f, 0x77, 0x51, 0x78, 0x4f, 0x34, 0x77, 0x51, 0x41, 0x6c, 0x67, 0x48, 0x6f, 0x41, + 0x65, 0x6f, 0x42, 0x37, 0x67, 0x48, 0x67, 0x51, 0x42, 0x58, 0x53, 0x55, 0x52, 0x49, 0x78, 0x45, 0x7a, 0x46, + 0x54, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x53, 0x45, 0x52, 0x41, 0x43, 0x49, 0x79, 0x49, 0x6d, 0x41, 0x54, 0x51, + 0x6d, 0x0a, + 0x09, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x41, 0x58, 0x4f, 0x35, 0x75, + 0x54, 0x71, 0x78, 0x65, 0x38, 0x7a, 0x2f, 0x2f, 0x38, 0x78, 0x37, 0x73, 0x51, 0x49, 0x34, 0x70, 0x35, 0x4b, + 0x53, 0x70, 0x36, 0x65, 0x53, 0x6b, 0x71, 0x65, 0x6f, 0x2f, 0x61, 0x34, 0x47, 0x43, 0x71, 0x70, 0x6b, 0x59, + 0x66, 0x36, 0x38, 0x2f, 0x76, 0x6a, 0x2b, 0x2b, 0x50, 0x36, 0x38, 0x59, 0x51, 0x48, 0x72, 0x79, 0x2b, 0x66, + 0x6e, 0x0a, + 0x09, 0x79, 0x38, 0x76, 0x6e, 0x35, 0x77, 0x41, 0x43, 0x41, 0x48, 0x48, 0x2b, 0x56, 0x67, 0x52, 0x61, 0x42, + 0x48, 0x73, 0x41, 0x43, 0x77, 0x41, 0x63, 0x41, 0x44, 0x35, 0x41, 0x47, 0x77, 0x4f, 0x35, 0x44, 0x41, 0x38, + 0x4a, 0x75, 0x52, 0x67, 0x56, 0x75, 0x41, 0x2b, 0x4d, 0x47, 0x37, 0x30, 0x5a, 0x76, 0x42, 0x30, 0x59, 0x44, + 0x41, 0x59, 0x49, 0x47, 0x6b, 0x63, 0x41, 0x45, 0x68, 0x4a, 0x46, 0x48, 0x52, 0x44, 0x38, 0x37, 0x50, 0x54, + 0x73, 0x0a, + 0x09, 0x4d, 0x6a, 0x49, 0x78, 0x41, 0x42, 0x44, 0x6b, 0x35, 0x4f, 0x54, 0x30, 0x78, 0x4f, 0x77, 0x51, 0x78, + 0x75, 0x34, 0x77, 0x51, 0x41, 0x6c, 0x67, 0x48, 0x6f, 0x41, 0x65, 0x6f, 0x42, 0x37, 0x67, 0x48, 0x67, 0x51, + 0x42, 0x58, 0x51, 0x45, 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, + 0x67, 0x45, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x41, 0x68, 0x45, 0x51, 0x45, 0x6a, 0x4d, 0x79, 0x46, 0x68, 0x63, + 0x31, 0x0a, + 0x09, 0x4d, 0x78, 0x45, 0x6a, 0x41, 0x53, 0x2b, 0x6e, 0x6b, 0x70, 0x4b, 0x6f, 0x71, 0x4a, 0x4b, 0x53, 0x70, + 0x77, 0x4a, 0x7a, 0x4f, 0x72, 0x46, 0x38, 0x79, 0x2f, 0x2f, 0x2f, 0x79, 0x33, 0x79, 0x78, 0x4f, 0x72, 0x69, + 0x34, 0x41, 0x69, 0x2f, 0x4c, 0x35, 0x2b, 0x66, 0x4c, 0x79, 0x2b, 0x66, 0x6e, 0x2f, 0x61, 0x35, 0x6b, 0x59, + 0x51, 0x46, 0x45, 0x41, 0x51, 0x67, 0x42, 0x43, 0x41, 0x46, 0x45, 0x59, 0x57, 0x53, 0x71, 0x2b, 0x66, 0x59, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x75, 0x67, 0x41, 0x41, 0x41, 0x30, 0x6f, 0x45, 0x65, 0x77, 0x41, 0x52, 0x41, + 0x44, 0x42, 0x41, 0x46, 0x41, 0x59, 0x4c, 0x42, 0x77, 0x41, 0x52, 0x43, 0x77, 0x4f, 0x48, 0x44, 0x72, 0x67, + 0x4a, 0x76, 0x41, 0x63, 0x4b, 0x42, 0x67, 0x67, 0x41, 0x43, 0x45, 0x59, 0x53, 0x45, 0x50, 0x7a, 0x45, 0x37, + 0x44, 0x49, 0x78, 0x41, 0x43, 0x2f, 0x6b, 0x39, 0x4f, 0x7a, 0x45, 0x31, 0x4d, 0x77, 0x52, 0x45, 0x6a, 0x6b, + 0x77, 0x0a, + 0x09, 0x74, 0x46, 0x41, 0x54, 0x6e, 0x78, 0x4d, 0x43, 0x41, 0x56, 0x30, 0x42, 0x4c, 0x67, 0x45, 0x6a, 0x49, + 0x67, 0x59, 0x56, 0x45, 0x53, 0x4d, 0x52, 0x4d, 0x78, 0x55, 0x2b, 0x41, 0x54, 0x4d, 0x79, 0x46, 0x68, 0x63, + 0x44, 0x53, 0x68, 0x39, 0x4a, 0x4c, 0x4a, 0x79, 0x6e, 0x75, 0x62, 0x6b, 0x36, 0x75, 0x6f, 0x55, 0x54, 0x4c, + 0x68, 0x77, 0x44, 0x74, 0x42, 0x49, 0x52, 0x79, 0x37, 0x37, 0x39, 0x73, 0x67, 0x52, 0x67, 0x72, 0x6d, 0x5a, + 0x6a, 0x0a, + 0x09, 0x42, 0x51, 0x55, 0x41, 0x41, 0x51, 0x42, 0x76, 0x2f, 0x2b, 0x4d, 0x44, 0x78, 0x77, 0x52, 0x37, 0x41, + 0x43, 0x63, 0x41, 0x35, 0x30, 0x41, 0x38, 0x44, 0x51, 0x77, 0x43, 0x44, 0x67, 0x74, 0x54, 0x48, 0x78, 0x34, + 0x49, 0x43, 0x51, 0x49, 0x48, 0x43, 0x6c, 0x4d, 0x65, 0x48, 0x78, 0x35, 0x43, 0x43, 0x67, 0x73, 0x65, 0x48, + 0x77, 0x51, 0x56, 0x41, 0x49, 0x59, 0x42, 0x69, 0x51, 0x51, 0x55, 0x68, 0x68, 0x57, 0x4a, 0x47, 0x4c, 0x6b, + 0x52, 0x0a, + 0x09, 0x42, 0x4c, 0x6b, 0x6c, 0x75, 0x42, 0x47, 0x4d, 0x4b, 0x42, 0x34, 0x4b, 0x43, 0x78, 0x38, 0x62, 0x42, + 0x77, 0x42, 0x53, 0x47, 0x77, 0x67, 0x4f, 0x42, 0x77, 0x67, 0x55, 0x49, 0x6b, 0x55, 0x6f, 0x45, 0x50, 0x7a, + 0x45, 0x37, 0x4e, 0x54, 0x73, 0x35, 0x42, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x45, + 0x4f, 0x54, 0x30, 0x37, 0x42, 0x44, 0x2b, 0x39, 0x65, 0x34, 0x51, 0x39, 0x65, 0x34, 0x53, 0x46, 0x7a, 0x6b, + 0x77, 0x0a, + 0x09, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, 0x4f, 0x37, 0x52, 0x45, 0x58, 0x4f, 0x51, 0x63, 0x4f, 0x37, + 0x52, 0x45, 0x58, 0x4f, 0x56, 0x6b, 0x69, 0x73, 0x67, 0x41, 0x6e, 0x41, 0x51, 0x46, 0x64, 0x51, 0x47, 0x30, + 0x63, 0x43, 0x68, 0x77, 0x4c, 0x48, 0x41, 0x77, 0x75, 0x43, 0x53, 0x77, 0x4b, 0x4c, 0x41, 0x73, 0x73, 0x44, + 0x44, 0x73, 0x4a, 0x4f, 0x77, 0x6f, 0x37, 0x43, 0x7a, 0x73, 0x4d, 0x43, 0x79, 0x41, 0x41, 0x49, 0x41, 0x45, + 0x6b, 0x0a, + 0x09, 0x41, 0x69, 0x67, 0x4b, 0x4b, 0x41, 0x73, 0x71, 0x45, 0x79, 0x38, 0x55, 0x4c, 0x78, 0x55, 0x71, 0x46, + 0x69, 0x67, 0x65, 0x4b, 0x42, 0x38, 0x70, 0x49, 0x43, 0x6b, 0x68, 0x4a, 0x43, 0x65, 0x47, 0x43, 0x6f, 0x59, + 0x4c, 0x68, 0x67, 0x79, 0x47, 0x44, 0x52, 0x49, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x67, 0x49, 0x47, 0x43, + 0x67, 0x59, 0x4c, 0x41, 0x77, 0x77, 0x44, 0x44, 0x51, 0x4d, 0x4f, 0x41, 0x77, 0x38, 0x44, 0x45, 0x41, 0x4d, + 0x5a, 0x0a, + 0x09, 0x41, 0x78, 0x6f, 0x44, 0x47, 0x77, 0x4d, 0x63, 0x42, 0x42, 0x30, 0x4a, 0x4a, 0x79, 0x38, 0x70, 0x50, + 0x79, 0x6c, 0x66, 0x4b, 0x58, 0x38, 0x70, 0x67, 0x43, 0x6d, 0x51, 0x4b, 0x61, 0x41, 0x70, 0x38, 0x43, 0x6b, + 0x59, 0x58, 0x51, 0x42, 0x64, 0x63, 0x51, 0x45, 0x56, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, + 0x42, 0x59, 0x66, 0x41, 0x52, 0x34, 0x42, 0x46, 0x52, 0x51, 0x47, 0x49, 0x79, 0x49, 0x6d, 0x4a, 0x7a, 0x55, + 0x65, 0x0a, + 0x09, 0x41, 0x54, 0x4d, 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x38, 0x42, 0x4c, 0x67, 0x45, 0x31, 0x4e, + 0x44, 0x59, 0x7a, 0x4d, 0x68, 0x59, 0x44, 0x69, 0x30, 0x36, 0x6f, 0x57, 0x6f, 0x6d, 0x4a, 0x59, 0x70, 0x51, + 0x2f, 0x78, 0x4b, 0x58, 0x33, 0x32, 0x46, 0x72, 0x44, 0x62, 0x47, 0x62, 0x47, 0x59, 0x59, 0x4b, 0x4d, 0x5a, + 0x61, 0x74, 0x41, 0x71, 0x35, 0x6a, 0x67, 0x7a, 0x6d, 0x61, 0x30, 0x42, 0x44, 0x2b, 0x75, 0x4b, 0x43, 0x68, + 0x55, 0x0a, + 0x09, 0x56, 0x45, 0x42, 0x4a, 0x49, 0x51, 0x34, 0x71, 0x6d, 0x59, 0x6d, 0x63, 0x74, 0x69, 0x4d, 0x6a, 0x76, + 0x6a, 0x55, 0x31, 0x57, 0x56, 0x46, 0x4c, 0x55, 0x43, 0x55, 0x50, 0x4a, 0x4a, 0x57, 0x43, 0x6e, 0x71, 0x77, + 0x65, 0x41, 0x41, 0x41, 0x42, 0x41, 0x44, 0x63, 0x41, 0x41, 0x41, 0x4c, 0x79, 0x42, 0x5a, 0x34, 0x41, 0x45, + 0x77, 0x41, 0x34, 0x51, 0x42, 0x6b, 0x4f, 0x42, 0x51, 0x67, 0x50, 0x41, 0x36, 0x6b, 0x41, 0x45, 0x51, 0x47, + 0x38, 0x0a, + 0x09, 0x43, 0x49, 0x63, 0x4b, 0x43, 0x77, 0x67, 0x4a, 0x41, 0x67, 0x51, 0x41, 0x43, 0x42, 0x41, 0x53, 0x44, + 0x6b, 0x59, 0x55, 0x45, 0x50, 0x77, 0x38, 0x78, 0x50, 0x77, 0x38, 0x78, 0x44, 0x49, 0x35, 0x4f, 0x54, 0x45, + 0x41, 0x4c, 0x2b, 0x7a, 0x30, 0x50, 0x4d, 0x54, 0x73, 0x4d, 0x68, 0x45, 0x35, 0x4f, 0x54, 0x43, 0x79, 0x72, + 0x78, 0x55, 0x42, 0x41, 0x56, 0x30, 0x42, 0x45, 0x53, 0x45, 0x56, 0x49, 0x52, 0x45, 0x55, 0x46, 0x6a, 0x73, + 0x42, 0x0a, + 0x09, 0x46, 0x53, 0x4d, 0x69, 0x4a, 0x6a, 0x55, 0x52, 0x49, 0x7a, 0x55, 0x7a, 0x45, 0x51, 0x46, 0x33, 0x41, + 0x58, 0x76, 0x2b, 0x68, 0x55, 0x74, 0x7a, 0x76, 0x62, 0x33, 0x56, 0x6f, 0x6f, 0x65, 0x48, 0x42, 0x5a, 0x37, + 0x2b, 0x77, 0x6f, 0x2f, 0x39, 0x6f, 0x49, 0x6c, 0x4f, 0x6d, 0x70, 0x2f, 0x53, 0x41, 0x6d, 0x43, 0x50, 0x41, + 0x54, 0x34, 0x41, 0x41, 0x41, 0x45, 0x41, 0x72, 0x76, 0x2f, 0x6a, 0x42, 0x46, 0x67, 0x45, 0x59, 0x41, 0x41, + 0x54, 0x0a, + 0x09, 0x41, 0x44, 0x5a, 0x41, 0x47, 0x51, 0x4d, 0x4a, 0x41, 0x41, 0x4d, 0x4f, 0x41, 0x51, 0x61, 0x48, 0x44, + 0x68, 0x47, 0x4d, 0x43, 0x67, 0x47, 0x38, 0x44, 0x41, 0x30, 0x4a, 0x43, 0x41, 0x74, 0x4f, 0x41, 0x67, 0x67, + 0x41, 0x52, 0x68, 0x51, 0x51, 0x2f, 0x4f, 0x7a, 0x30, 0x37, 0x44, 0x49, 0x78, 0x41, 0x43, 0x2f, 0x6b, 0x4d, + 0x76, 0x54, 0x45, 0x37, 0x42, 0x45, 0x53, 0x46, 0x7a, 0x6b, 0x77, 0x74, 0x47, 0x41, 0x56, 0x7a, 0x78, 0x55, + 0x43, 0x0a, + 0x09, 0x41, 0x56, 0x30, 0x54, 0x45, 0x54, 0x4d, 0x52, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x45, + 0x54, 0x4d, 0x52, 0x49, 0x7a, 0x55, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x71, 0x36, 0x34, 0x66, 0x48, 0x79, + 0x56, 0x72, 0x62, 0x69, 0x34, 0x51, 0x37, 0x46, 0x31, 0x77, 0x63, 0x67, 0x42, 0x75, 0x67, 0x4b, 0x6d, 0x2f, + 0x57, 0x47, 0x66, 0x6e, 0x37, 0x36, 0x6b, 0x41, 0x6e, 0x76, 0x37, 0x6f, 0x4b, 0x78, 0x6d, 0x59, 0x2f, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x50, 0x51, 0x41, 0x41, 0x42, 0x48, 0x38, 0x45, 0x59, 0x41, 0x41, 0x47, 0x41, + 0x52, 0x4a, 0x41, 0x4a, 0x77, 0x4d, 0x52, 0x42, 0x41, 0x55, 0x45, 0x41, 0x68, 0x45, 0x42, 0x41, 0x67, 0x55, + 0x46, 0x42, 0x41, 0x49, 0x52, 0x41, 0x77, 0x49, 0x47, 0x41, 0x41, 0x59, 0x42, 0x45, 0x51, 0x41, 0x41, 0x42, + 0x6b, 0x49, 0x43, 0x41, 0x77, 0x43, 0x2f, 0x42, 0x51, 0x59, 0x46, 0x41, 0x77, 0x49, 0x42, 0x42, 0x51, 0x51, + 0x41, 0x0a, + 0x09, 0x42, 0x78, 0x44, 0x55, 0x78, 0x42, 0x63, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x44, 0x49, 0x35, 0x4d, + 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, + 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x31, 0x5a, 0x49, 0x67, 0x46, 0x4c, 0x73, 0x41, 0x70, 0x55, 0x57, + 0x4c, 0x30, 0x41, 0x42, 0x2f, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x42, 0x77, 0x41, 0x48, 0x41, 0x45, 0x41, + 0x34, 0x0a, + 0x09, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x46, 0x4c, 0x73, 0x42, 0x52, 0x55, 0x53, 0x37, 0x41, 0x56, 0x56, + 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x48, 0x41, 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x48, 0x41, 0x41, 0x66, + 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x51, 0x49, 0x35, 0x49, 0x41, 0x6d, 0x6f, 0x43, 0x65, + 0x77, 0x4a, 0x2f, 0x41, 0x6f, 0x59, 0x43, 0x67, 0x41, 0x4b, 0x52, 0x41, 0x71, 0x51, 0x43, 0x43, 0x41, 0x59, + 0x41, 0x0a, + 0x09, 0x42, 0x67, 0x45, 0x4a, 0x41, 0x77, 0x6b, 0x45, 0x46, 0x51, 0x41, 0x56, 0x41, 0x52, 0x6f, 0x44, 0x47, + 0x67, 0x51, 0x6d, 0x41, 0x43, 0x59, 0x42, 0x4b, 0x51, 0x4d, 0x70, 0x42, 0x43, 0x41, 0x49, 0x4e, 0x51, 0x41, + 0x31, 0x41, 0x54, 0x6f, 0x44, 0x4f, 0x67, 0x51, 0x77, 0x43, 0x45, 0x59, 0x41, 0x52, 0x67, 0x46, 0x4a, 0x41, + 0x30, 0x6b, 0x45, 0x52, 0x67, 0x56, 0x49, 0x42, 0x6b, 0x41, 0x49, 0x56, 0x67, 0x42, 0x57, 0x41, 0x56, 0x6b, + 0x44, 0x0a, + 0x09, 0x57, 0x51, 0x52, 0x51, 0x43, 0x47, 0x59, 0x41, 0x5a, 0x67, 0x46, 0x70, 0x41, 0x32, 0x6b, 0x45, 0x5a, + 0x77, 0x56, 0x6f, 0x42, 0x6d, 0x41, 0x49, 0x64, 0x51, 0x42, 0x30, 0x41, 0x58, 0x73, 0x44, 0x65, 0x77, 0x52, + 0x31, 0x42, 0x58, 0x6f, 0x47, 0x68, 0x51, 0x43, 0x46, 0x41, 0x59, 0x6b, 0x44, 0x69, 0x51, 0x53, 0x4a, 0x42, + 0x59, 0x59, 0x47, 0x6c, 0x67, 0x43, 0x57, 0x41, 0x5a, 0x63, 0x43, 0x6d, 0x67, 0x4f, 0x59, 0x42, 0x4a, 0x67, + 0x46, 0x0a, + 0x09, 0x6c, 0x77, 0x61, 0x6f, 0x42, 0x61, 0x63, 0x47, 0x73, 0x41, 0x6a, 0x41, 0x43, 0x4e, 0x38, 0x49, 0x2f, + 0x77, 0x67, 0x2b, 0x58, 0x51, 0x42, 0x64, 0x45, 0x7a, 0x4d, 0x4a, 0x41, 0x54, 0x4d, 0x42, 0x49, 0x7a, 0x33, + 0x44, 0x41, 0x56, 0x34, 0x42, 0x58, 0x73, 0x50, 0x2b, 0x58, 0x50, 0x6f, 0x45, 0x59, 0x50, 0x78, 0x55, 0x41, + 0x36, 0x7a, 0x37, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x51, 0x42, 0x57, 0x41, 0x41, 0x41, 0x47, 0x4e, 0x51, 0x52, + 0x67, 0x0a, + 0x09, 0x41, 0x41, 0x77, 0x43, 0x41, 0x55, 0x42, 0x4a, 0x42, 0x56, 0x55, 0x47, 0x42, 0x51, 0x6b, 0x4b, 0x43, + 0x51, 0x52, 0x56, 0x43, 0x67, 0x6b, 0x44, 0x56, 0x51, 0x6f, 0x4c, 0x43, 0x67, 0x4a, 0x56, 0x41, 0x51, 0x49, + 0x4c, 0x43, 0x77, 0x6f, 0x47, 0x45, 0x51, 0x63, 0x49, 0x42, 0x77, 0x55, 0x52, 0x42, 0x41, 0x55, 0x49, 0x43, + 0x41, 0x63, 0x43, 0x45, 0x51, 0x4d, 0x43, 0x44, 0x41, 0x41, 0x4d, 0x41, 0x52, 0x45, 0x41, 0x41, 0x41, 0x78, + 0x43, 0x0a, + 0x09, 0x43, 0x67, 0x55, 0x43, 0x41, 0x77, 0x59, 0x44, 0x41, 0x4c, 0x38, 0x4c, 0x43, 0x41, 0x77, 0x4c, 0x43, + 0x67, 0x6b, 0x49, 0x42, 0x67, 0x55, 0x45, 0x41, 0x77, 0x49, 0x42, 0x43, 0x77, 0x63, 0x41, 0x44, 0x52, 0x44, + 0x55, 0x7a, 0x42, 0x63, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x50, 0x4f, 0x77, 0x79, 0x4d, 0x68, 0x63, 0x35, 0x4d, + 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, + 0x49, 0x0a, + 0x09, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, + 0x51, 0x63, 0x46, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x31, 0x5a, 0x49, 0x67, 0x46, 0x4c, 0x73, 0x41, 0x70, + 0x55, 0x53, 0x37, 0x41, 0x52, 0x56, 0x46, 0x74, 0x4c, 0x73, 0x42, 0x4a, 0x55, 0x57, 0x30, 0x75, 0x77, 0x45, + 0x31, 0x52, 0x62, 0x53, 0x37, 0x41, 0x4c, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x4e, 0x2f, 0x38, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x51, 0x41, 0x4e, 0x41, 0x41, 0x30, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, + 0x55, 0x75, 0x77, 0x44, 0x46, 0x52, 0x4c, 0x73, 0x41, 0x31, 0x55, 0x57, 0x30, 0x75, 0x77, 0x45, 0x46, 0x52, + 0x62, 0x57, 0x4c, 0x30, 0x41, 0x44, 0x51, 0x42, 0x41, 0x41, 0x41, 0x45, 0x41, 0x44, 0x51, 0x41, 0x4e, 0x2f, + 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x55, 0x44, 0x2f, 0x42, 0x51, 0x49, 0x57, 0x41, 0x68, 0x59, + 0x46, 0x0a, + 0x09, 0x49, 0x67, 0x6f, 0x31, 0x43, 0x6b, 0x6b, 0x43, 0x53, 0x51, 0x56, 0x47, 0x43, 0x6b, 0x41, 0x4b, 0x57, + 0x77, 0x4a, 0x62, 0x42, 0x56, 0x55, 0x4b, 0x55, 0x41, 0x70, 0x75, 0x41, 0x6d, 0x34, 0x46, 0x5a, 0x67, 0x70, + 0x35, 0x41, 0x6e, 0x38, 0x43, 0x65, 0x51, 0x56, 0x2f, 0x42, 0x59, 0x63, 0x43, 0x6d, 0x51, 0x4b, 0x59, 0x42, + 0x5a, 0x51, 0x4b, 0x76, 0x41, 0x4b, 0x38, 0x42, 0x63, 0x34, 0x43, 0x78, 0x77, 0x50, 0x50, 0x42, 0x52, 0x30, + 0x46, 0x0a, + 0x09, 0x41, 0x67, 0x6b, 0x44, 0x42, 0x67, 0x51, 0x4c, 0x42, 0x51, 0x6f, 0x49, 0x43, 0x77, 0x6b, 0x45, 0x43, + 0x77, 0x55, 0x4d, 0x46, 0x51, 0x49, 0x5a, 0x41, 0x78, 0x59, 0x45, 0x47, 0x67, 0x55, 0x62, 0x43, 0x42, 0x73, + 0x4a, 0x46, 0x41, 0x73, 0x56, 0x44, 0x43, 0x55, 0x41, 0x4a, 0x51, 0x45, 0x6a, 0x41, 0x69, 0x63, 0x44, 0x49, + 0x51, 0x51, 0x6c, 0x42, 0x53, 0x49, 0x47, 0x49, 0x67, 0x63, 0x6c, 0x43, 0x43, 0x63, 0x4a, 0x4a, 0x41, 0x6f, + 0x68, 0x0a, + 0x09, 0x43, 0x79, 0x4d, 0x4d, 0x4f, 0x51, 0x4d, 0x32, 0x42, 0x44, 0x59, 0x49, 0x4f, 0x51, 0x77, 0x77, 0x44, + 0x6b, 0x59, 0x43, 0x53, 0x41, 0x4e, 0x47, 0x42, 0x45, 0x41, 0x45, 0x51, 0x67, 0x56, 0x41, 0x42, 0x6b, 0x41, + 0x48, 0x51, 0x41, 0x68, 0x45, 0x43, 0x55, 0x51, 0x4b, 0x52, 0x41, 0x74, 0x41, 0x44, 0x6b, 0x41, 0x4f, 0x56, + 0x67, 0x42, 0x57, 0x41, 0x56, 0x59, 0x43, 0x55, 0x41, 0x52, 0x52, 0x42, 0x56, 0x49, 0x47, 0x55, 0x67, 0x64, + 0x51, 0x0a, + 0x09, 0x43, 0x46, 0x4d, 0x4a, 0x56, 0x41, 0x70, 0x56, 0x43, 0x32, 0x4d, 0x41, 0x5a, 0x41, 0x46, 0x6c, 0x41, + 0x6d, 0x6f, 0x44, 0x5a, 0x51, 0x52, 0x71, 0x42, 0x57, 0x6f, 0x47, 0x61, 0x67, 0x64, 0x75, 0x43, 0x57, 0x45, + 0x4c, 0x5a, 0x77, 0x78, 0x76, 0x44, 0x6e, 0x55, 0x41, 0x64, 0x51, 0x46, 0x35, 0x41, 0x6e, 0x30, 0x44, 0x65, + 0x41, 0x52, 0x39, 0x42, 0x58, 0x6f, 0x47, 0x66, 0x77, 0x5a, 0x36, 0x42, 0x33, 0x38, 0x48, 0x65, 0x41, 0x68, + 0x35, 0x0a, + 0x09, 0x43, 0x58, 0x38, 0x4a, 0x65, 0x77, 0x70, 0x32, 0x43, 0x33, 0x30, 0x4d, 0x68, 0x77, 0x4b, 0x49, 0x42, + 0x59, 0x38, 0x4f, 0x6c, 0x77, 0x43, 0x58, 0x41, 0x5a, 0x51, 0x43, 0x6b, 0x77, 0x4f, 0x63, 0x42, 0x4a, 0x73, + 0x46, 0x6d, 0x41, 0x61, 0x59, 0x42, 0x35, 0x6b, 0x49, 0x51, 0x43, 0x2b, 0x57, 0x44, 0x4a, 0x38, 0x4f, 0x70, + 0x67, 0x43, 0x6d, 0x41, 0x61, 0x51, 0x43, 0x70, 0x41, 0x4f, 0x72, 0x42, 0x4b, 0x73, 0x46, 0x71, 0x51, 0x61, + 0x70, 0x0a, + 0x09, 0x42, 0x36, 0x73, 0x49, 0x70, 0x41, 0x79, 0x76, 0x44, 0x72, 0x55, 0x43, 0x73, 0x51, 0x4f, 0x39, 0x42, + 0x4c, 0x73, 0x46, 0x75, 0x41, 0x6d, 0x2f, 0x44, 0x73, 0x51, 0x43, 0x77, 0x77, 0x50, 0x4d, 0x42, 0x4d, 0x6f, + 0x46, 0x65, 0x56, 0x30, 0x41, 0x58, 0x52, 0x4d, 0x7a, 0x47, 0x77, 0x45, 0x7a, 0x47, 0x77, 0x45, 0x7a, 0x41, + 0x53, 0x4d, 0x4c, 0x41, 0x53, 0x4e, 0x57, 0x75, 0x4f, 0x62, 0x6c, 0x32, 0x65, 0x62, 0x6c, 0x75, 0x50, 0x37, + 0x62, 0x0a, + 0x09, 0x32, 0x66, 0x48, 0x79, 0x32, 0x51, 0x52, 0x67, 0x2f, 0x4a, 0x59, 0x44, 0x61, 0x76, 0x79, 0x57, 0x41, + 0x32, 0x72, 0x37, 0x6f, 0x41, 0x4f, 0x57, 0x2f, 0x47, 0x6f, 0x41, 0x41, 0x51, 0x41, 0x37, 0x41, 0x41, 0x41, + 0x45, 0x65, 0x51, 0x52, 0x67, 0x41, 0x41, 0x73, 0x42, 0x57, 0x6b, 0x42, 0x47, 0x42, 0x52, 0x45, 0x47, 0x42, + 0x77, 0x59, 0x45, 0x45, 0x51, 0x4d, 0x45, 0x42, 0x77, 0x63, 0x47, 0x42, 0x42, 0x45, 0x46, 0x42, 0x41, 0x45, + 0x43, 0x0a, + 0x09, 0x41, 0x51, 0x4d, 0x52, 0x41, 0x67, 0x49, 0x42, 0x43, 0x78, 0x45, 0x41, 0x41, 0x51, 0x41, 0x4b, 0x45, + 0x51, 0x6b, 0x4b, 0x41, 0x51, 0x45, 0x41, 0x43, 0x68, 0x45, 0x4c, 0x43, 0x67, 0x63, 0x49, 0x42, 0x77, 0x6b, + 0x52, 0x43, 0x41, 0x67, 0x48, 0x51, 0x67, 0x6f, 0x48, 0x42, 0x41, 0x45, 0x45, 0x43, 0x41, 0x43, 0x2f, 0x42, + 0x51, 0x49, 0x4b, 0x42, 0x77, 0x51, 0x42, 0x42, 0x41, 0x67, 0x41, 0x41, 0x67, 0x67, 0x47, 0x44, 0x42, 0x44, + 0x55, 0x0a, + 0x09, 0x78, 0x4e, 0x54, 0x45, 0x45, 0x52, 0x63, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x50, 0x4f, 0x77, 0x79, 0x46, + 0x7a, 0x6b, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, + 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, + 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x31, 0x5a, 0x49, 0x67, 0x46, + 0x4c, 0x0a, + 0x09, 0x73, 0x41, 0x70, 0x55, 0x53, 0x37, 0x41, 0x50, 0x56, 0x46, 0x74, 0x4c, 0x73, 0x42, 0x42, 0x55, 0x57, + 0x30, 0x75, 0x77, 0x45, 0x56, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x44, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x45, + 0x41, 0x44, 0x41, 0x41, 0x4d, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x46, 0x4c, 0x73, + 0x42, 0x52, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x44, 0x41, 0x42, 0x41, 0x41, 0x41, 0x45, 0x41, 0x44, 0x41, 0x41, + 0x4d, 0x0a, + 0x09, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x55, 0x43, 0x59, 0x43, 0x67, 0x51, 0x45, 0x43, + 0x68, 0x6f, 0x45, 0x46, 0x51, 0x6f, 0x6d, 0x43, 0x6a, 0x30, 0x45, 0x4d, 0x51, 0x70, 0x56, 0x42, 0x46, 0x63, + 0x48, 0x57, 0x41, 0x70, 0x6d, 0x43, 0x6e, 0x59, 0x42, 0x65, 0x67, 0x52, 0x32, 0x42, 0x33, 0x51, 0x4b, 0x6a, + 0x51, 0x53, 0x43, 0x43, 0x70, 0x6b, 0x45, 0x6e, 0x77, 0x53, 0x58, 0x42, 0x35, 0x49, 0x4b, 0x6b, 0x41, 0x71, + 0x6d, 0x0a, + 0x09, 0x41, 0x61, 0x6b, 0x45, 0x72, 0x77, 0x53, 0x6c, 0x42, 0x36, 0x4d, 0x4b, 0x6f, 0x41, 0x6f, 0x63, 0x43, + 0x67, 0x4d, 0x45, 0x42, 0x51, 0x55, 0x4a, 0x43, 0x67, 0x73, 0x61, 0x41, 0x78, 0x55, 0x46, 0x46, 0x51, 0x6b, + 0x61, 0x43, 0x79, 0x6b, 0x44, 0x4a, 0x67, 0x55, 0x6c, 0x43, 0x53, 0x6f, 0x4c, 0x49, 0x41, 0x30, 0x36, 0x41, + 0x54, 0x6b, 0x44, 0x4e, 0x77, 0x55, 0x30, 0x42, 0x7a, 0x59, 0x4a, 0x4f, 0x51, 0x73, 0x77, 0x44, 0x55, 0x6b, + 0x44, 0x0a, + 0x09, 0x52, 0x67, 0x56, 0x46, 0x43, 0x55, 0x6f, 0x4c, 0x51, 0x41, 0x31, 0x5a, 0x41, 0x46, 0x59, 0x42, 0x57, + 0x51, 0x4a, 0x5a, 0x41, 0x31, 0x63, 0x46, 0x56, 0x67, 0x5a, 0x5a, 0x42, 0x31, 0x59, 0x49, 0x56, 0x67, 0x6c, + 0x5a, 0x43, 0x31, 0x41, 0x4e, 0x62, 0x77, 0x31, 0x34, 0x41, 0x58, 0x38, 0x4e, 0x6d, 0x77, 0x47, 0x55, 0x42, + 0x36, 0x73, 0x42, 0x70, 0x41, 0x65, 0x77, 0x44, 0x63, 0x38, 0x4e, 0x33, 0x77, 0x33, 0x2f, 0x44, 0x53, 0x39, + 0x64, 0x0a, + 0x09, 0x41, 0x46, 0x30, 0x4a, 0x41, 0x69, 0x4d, 0x4a, 0x41, 0x53, 0x4d, 0x4a, 0x41, 0x54, 0x4d, 0x4a, 0x41, + 0x51, 0x52, 0x6b, 0x2f, 0x6d, 0x73, 0x42, 0x71, 0x74, 0x6e, 0x2b, 0x75, 0x76, 0x36, 0x36, 0x32, 0x51, 0x47, + 0x7a, 0x2f, 0x6e, 0x4c, 0x5a, 0x41, 0x53, 0x6b, 0x42, 0x4b, 0x51, 0x52, 0x67, 0x2f, 0x64, 0x2f, 0x39, 0x77, + 0x51, 0x47, 0x34, 0x2f, 0x6b, 0x67, 0x43, 0x53, 0x67, 0x49, 0x57, 0x2f, 0x6e, 0x45, 0x42, 0x6a, 0x77, 0x41, + 0x42, 0x0a, + 0x09, 0x41, 0x44, 0x33, 0x2b, 0x56, 0x67, 0x52, 0x2f, 0x42, 0x47, 0x41, 0x41, 0x44, 0x77, 0x47, 0x69, 0x51, + 0x45, 0x4d, 0x48, 0x43, 0x41, 0x49, 0x4a, 0x45, 0x51, 0x41, 0x50, 0x43, 0x68, 0x45, 0x4c, 0x43, 0x67, 0x41, + 0x41, 0x44, 0x77, 0x34, 0x52, 0x44, 0x77, 0x41, 0x50, 0x44, 0x52, 0x45, 0x4d, 0x44, 0x51, 0x41, 0x41, 0x44, + 0x77, 0x30, 0x52, 0x44, 0x67, 0x30, 0x4b, 0x43, 0x77, 0x6f, 0x4d, 0x45, 0x51, 0x73, 0x4c, 0x43, 0x6b, 0x49, + 0x4e, 0x0a, + 0x09, 0x43, 0x77, 0x6b, 0x51, 0x41, 0x41, 0x73, 0x46, 0x68, 0x77, 0x4f, 0x39, 0x44, 0x67, 0x75, 0x38, 0x45, + 0x41, 0x34, 0x4e, 0x44, 0x41, 0x6f, 0x4a, 0x42, 0x67, 0x4d, 0x41, 0x43, 0x41, 0x38, 0x45, 0x44, 0x77, 0x73, + 0x51, 0x45, 0x4e, 0x54, 0x45, 0x78, 0x42, 0x45, 0x58, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x4f, 0x51, 0x79, 0x39, + 0x4f, 0x77, 0x52, 0x4f, 0x52, 0x45, 0x35, 0x45, 0x6a, 0x6b, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, + 0x46, 0x0a, + 0x09, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, + 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x42, 0x65, 0x30, 0x58, 0x4d, 0x6c, 0x6b, 0x69, 0x41, 0x55, 0x75, + 0x77, 0x43, 0x6c, 0x52, 0x4c, 0x73, 0x41, 0x68, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x42, 0x44, 0x2f, 0x77, + 0x41, 0x41, 0x42, 0x41, 0x42, 0x41, 0x41, 0x45, 0x41, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, + 0x42, 0x0a, + 0x09, 0x53, 0x37, 0x41, 0x55, 0x56, 0x46, 0x69, 0x39, 0x41, 0x42, 0x41, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, + 0x42, 0x41, 0x41, 0x45, 0x50, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x38, 0x41, 0x59, + 0x41, 0x42, 0x51, 0x67, 0x47, 0x43, 0x51, 0x4d, 0x4e, 0x46, 0x67, 0x6f, 0x58, 0x44, 0x52, 0x41, 0x4e, 0x49, + 0x77, 0x30, 0x31, 0x44, 0x55, 0x6b, 0x4b, 0x54, 0x77, 0x70, 0x4f, 0x44, 0x56, 0x6f, 0x4a, 0x57, 0x67, 0x70, + 0x71, 0x0a, + 0x09, 0x43, 0x6f, 0x63, 0x4e, 0x67, 0x41, 0x32, 0x54, 0x44, 0x52, 0x49, 0x4b, 0x41, 0x41, 0x6f, 0x4a, 0x42, + 0x67, 0x73, 0x46, 0x44, 0x41, 0x73, 0x4f, 0x43, 0x77, 0x38, 0x58, 0x41, 0x52, 0x55, 0x43, 0x45, 0x41, 0x51, + 0x51, 0x42, 0x52, 0x63, 0x4b, 0x46, 0x41, 0x73, 0x55, 0x44, 0x42, 0x6f, 0x4f, 0x47, 0x67, 0x38, 0x6e, 0x41, + 0x43, 0x51, 0x42, 0x4a, 0x41, 0x49, 0x67, 0x42, 0x43, 0x41, 0x46, 0x4b, 0x51, 0x67, 0x6f, 0x43, 0x53, 0x55, + 0x4b, 0x0a, + 0x09, 0x4a, 0x41, 0x73, 0x6b, 0x44, 0x43, 0x63, 0x4e, 0x4b, 0x67, 0x34, 0x71, 0x44, 0x79, 0x41, 0x52, 0x4e, + 0x77, 0x41, 0x31, 0x41, 0x54, 0x55, 0x43, 0x4d, 0x41, 0x51, 0x77, 0x42, 0x54, 0x67, 0x4b, 0x4e, 0x67, 0x73, + 0x32, 0x44, 0x44, 0x67, 0x4e, 0x4f, 0x51, 0x34, 0x35, 0x44, 0x7a, 0x41, 0x52, 0x51, 0x51, 0x42, 0x41, 0x41, + 0x55, 0x41, 0x43, 0x51, 0x41, 0x4e, 0x41, 0x42, 0x45, 0x41, 0x46, 0x51, 0x41, 0x5a, 0x41, 0x42, 0x30, 0x41, + 0x49, 0x0a, + 0x09, 0x51, 0x67, 0x6c, 0x46, 0x43, 0x6b, 0x63, 0x4e, 0x53, 0x51, 0x35, 0x4a, 0x44, 0x30, 0x41, 0x52, 0x56, + 0x41, 0x42, 0x52, 0x41, 0x56, 0x45, 0x43, 0x56, 0x51, 0x4e, 0x51, 0x42, 0x46, 0x41, 0x46, 0x56, 0x67, 0x5a, + 0x56, 0x42, 0x31, 0x59, 0x49, 0x56, 0x77, 0x6c, 0x58, 0x43, 0x6c, 0x55, 0x4c, 0x56, 0x51, 0x78, 0x5a, 0x44, + 0x6c, 0x6b, 0x50, 0x55, 0x42, 0x46, 0x6d, 0x41, 0x57, 0x59, 0x43, 0x61, 0x41, 0x70, 0x70, 0x44, 0x6d, 0x6b, + 0x50, 0x0a, + 0x09, 0x59, 0x42, 0x46, 0x37, 0x43, 0x48, 0x67, 0x4f, 0x65, 0x41, 0x2b, 0x4a, 0x41, 0x49, 0x6f, 0x4a, 0x68, + 0x51, 0x75, 0x46, 0x44, 0x49, 0x6b, 0x4e, 0x69, 0x51, 0x36, 0x4a, 0x44, 0x35, 0x6b, 0x4a, 0x6c, 0x51, 0x75, + 0x56, 0x44, 0x4a, 0x6f, 0x4f, 0x6d, 0x67, 0x2b, 0x6b, 0x43, 0x36, 0x51, 0x4d, 0x71, 0x77, 0x36, 0x72, 0x44, + 0x37, 0x41, 0x52, 0x7a, 0x78, 0x48, 0x66, 0x45, 0x66, 0x38, 0x52, 0x5a, 0x56, 0x30, 0x41, 0x58, 0x51, 0x55, + 0x4f, 0x0a, + 0x09, 0x41, 0x53, 0x73, 0x42, 0x4e, 0x54, 0x4d, 0x79, 0x4e, 0x6a, 0x38, 0x42, 0x41, 0x54, 0x4d, 0x4a, 0x41, + 0x54, 0x4d, 0x43, 0x6b, 0x30, 0x36, 0x55, 0x66, 0x4a, 0x4e, 0x73, 0x54, 0x46, 0x51, 0x7a, 0x49, 0x66, 0x34, + 0x37, 0x77, 0x77, 0x46, 0x65, 0x41, 0x56, 0x37, 0x44, 0x61, 0x4d, 0x68, 0x36, 0x6d, 0x6b, 0x69, 0x47, 0x56, + 0x41, 0x52, 0x4f, 0x2f, 0x4a, 0x51, 0x44, 0x62, 0x41, 0x41, 0x42, 0x41, 0x46, 0x67, 0x41, 0x41, 0x41, 0x50, + 0x62, 0x0a, + 0x09, 0x42, 0x47, 0x41, 0x41, 0x43, 0x51, 0x43, 0x30, 0x51, 0x42, 0x6f, 0x49, 0x45, 0x51, 0x49, 0x44, 0x41, + 0x67, 0x4d, 0x52, 0x42, 0x77, 0x67, 0x48, 0x51, 0x67, 0x69, 0x70, 0x41, 0x4c, 0x77, 0x44, 0x71, 0x51, 0x55, + 0x49, 0x41, 0x77, 0x45, 0x41, 0x42, 0x41, 0x45, 0x47, 0x43, 0x68, 0x44, 0x63, 0x78, 0x44, 0x4c, 0x45, 0x45, + 0x54, 0x6b, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x50, 0x54, 0x73, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, + 0x51, 0x0a, + 0x09, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x58, 0x74, 0x57, 0x53, 0x49, 0x42, 0x53, 0x37, 0x41, 0x4c, 0x56, + 0x45, 0x75, 0x77, 0x44, 0x46, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x43, 0x67, 0x42, 0x41, 0x41, 0x41, 0x45, + 0x41, 0x43, 0x67, 0x41, 0x4b, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x46, 0x4c, 0x73, + 0x42, 0x4e, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x43, 0x76, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x43, 0x67, 0x41, + 0x4b, 0x0a, + 0x09, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x55, 0x42, 0x43, 0x42, 0x51, 0x49, 0x57, 0x41, + 0x69, 0x59, 0x43, 0x52, 0x77, 0x4a, 0x4a, 0x42, 0x77, 0x55, 0x4c, 0x43, 0x41, 0x38, 0x4c, 0x47, 0x41, 0x4d, + 0x62, 0x43, 0x43, 0x73, 0x49, 0x49, 0x41, 0x73, 0x32, 0x41, 0x7a, 0x6b, 0x49, 0x4d, 0x41, 0x74, 0x41, 0x41, + 0x55, 0x41, 0x43, 0x52, 0x51, 0x4e, 0x41, 0x42, 0x45, 0x41, 0x46, 0x51, 0x77, 0x68, 0x58, 0x41, 0x31, 0x6b, + 0x49, 0x0a, + 0x09, 0x58, 0x77, 0x74, 0x67, 0x41, 0x57, 0x41, 0x43, 0x5a, 0x67, 0x4e, 0x67, 0x42, 0x47, 0x41, 0x46, 0x59, + 0x67, 0x68, 0x2f, 0x43, 0x34, 0x41, 0x4c, 0x72, 0x77, 0x73, 0x62, 0x58, 0x51, 0x42, 0x64, 0x45, 0x79, 0x45, + 0x56, 0x41, 0x53, 0x45, 0x56, 0x49, 0x54, 0x55, 0x42, 0x49, 0x58, 0x45, 0x44, 0x61, 0x76, 0x31, 0x4d, 0x41, + 0x72, 0x54, 0x38, 0x66, 0x51, 0x4b, 0x30, 0x2f, 0x57, 0x55, 0x45, 0x59, 0x4b, 0x6a, 0x38, 0x32, 0x35, 0x4f, + 0x6f, 0x0a, + 0x09, 0x41, 0x79, 0x55, 0x41, 0x41, 0x51, 0x45, 0x41, 0x2f, 0x72, 0x49, 0x45, 0x46, 0x77, 0x59, 0x55, 0x41, + 0x43, 0x51, 0x41, 0x67, 0x6b, 0x41, 0x30, 0x47, 0x51, 0x38, 0x56, 0x43, 0x77, 0x59, 0x6c, 0x43, 0x52, 0x6f, + 0x51, 0x46, 0x52, 0x30, 0x4c, 0x42, 0x53, 0x41, 0x68, 0x41, 0x77, 0x41, 0x4c, 0x71, 0x51, 0x6b, 0x41, 0x71, + 0x51, 0x48, 0x41, 0x43, 0x52, 0x57, 0x70, 0x45, 0x37, 0x45, 0x6c, 0x44, 0x41, 0x6b, 0x4b, 0x42, 0x53, 0x51, + 0x57, 0x0a, + 0x09, 0x47, 0x51, 0x41, 0x64, 0x43, 0x67, 0x55, 0x54, 0x41, 0x68, 0x51, 0x41, 0x49, 0x42, 0x6c, 0x44, 0x43, + 0x67, 0x38, 0x46, 0x4a, 0x52, 0x44, 0x55, 0x50, 0x4d, 0x54, 0x38, 0x50, 0x4d, 0x51, 0x79, 0x4f, 0x54, 0x6b, + 0x52, 0x45, 0x6a, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x45, 0x52, 0x49, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x45, + 0x50, 0x7a, 0x73, 0x78, 0x50, 0x54, 0x73, 0x45, 0x4f, 0x34, 0x53, 0x46, 0x7a, 0x6b, 0x53, 0x4f, 0x52, 0x45, + 0x35, 0x0a, + 0x09, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x77, 0x41, 0x55, 0x75, 0x77, 0x44, + 0x46, 0x52, 0x59, 0x76, 0x51, 0x41, 0x6c, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x6c, 0x41, 0x43, 0x55, + 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x73, 0x67, 0x41, 0x6d, 0x41, 0x56, 0x30, 0x46, 0x46, + 0x53, 0x4d, 0x69, 0x4a, 0x6a, 0x30, 0x42, 0x4e, 0x43, 0x59, 0x72, 0x41, 0x54, 0x55, 0x7a, 0x4d, 0x6a, 0x59, + 0x39, 0x0a, + 0x09, 0x41, 0x54, 0x51, 0x32, 0x4f, 0x77, 0x45, 0x56, 0x49, 0x79, 0x49, 0x47, 0x48, 0x51, 0x45, 0x55, 0x42, + 0x67, 0x63, 0x65, 0x41, 0x52, 0x30, 0x42, 0x46, 0x42, 0x59, 0x7a, 0x42, 0x42, 0x63, 0x2b, 0x2b, 0x61, 0x6c, + 0x73, 0x6a, 0x6a, 0x30, 0x39, 0x6a, 0x32, 0x75, 0x70, 0x2b, 0x54, 0x35, 0x45, 0x6a, 0x56, 0x5a, 0x62, 0x62, + 0x6d, 0x39, 0x61, 0x56, 0x6f, 0x32, 0x2b, 0x6b, 0x4a, 0x54, 0x64, 0x37, 0x35, 0x64, 0x30, 0x6a, 0x33, 0x4f, + 0x56, 0x0a, + 0x09, 0x38, 0x4e, 0x32, 0x54, 0x6a, 0x31, 0x69, 0x4e, 0x2b, 0x4a, 0x32, 0x4f, 0x47, 0x52, 0x75, 0x4f, 0x6e, + 0x50, 0x69, 0x4e, 0x57, 0x41, 0x41, 0x42, 0x41, 0x51, 0x54, 0x2b, 0x48, 0x51, 0x47, 0x75, 0x42, 0x68, 0x30, + 0x41, 0x41, 0x77, 0x41, 0x53, 0x74, 0x77, 0x45, 0x41, 0x73, 0x51, 0x51, 0x41, 0x42, 0x51, 0x49, 0x45, 0x45, + 0x4e, 0x54, 0x73, 0x4d, 0x51, 0x41, 0x51, 0x2f, 0x4d, 0x77, 0x77, 0x41, 0x52, 0x45, 0x6a, 0x45, 0x51, 0x47, + 0x75, 0x0a, + 0x09, 0x71, 0x67, 0x59, 0x64, 0x2b, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x45, 0x41, 0x2f, + 0x72, 0x49, 0x45, 0x46, 0x77, 0x59, 0x55, 0x41, 0x43, 0x51, 0x41, 0x6e, 0x6b, 0x41, 0x32, 0x48, 0x79, 0x55, + 0x62, 0x46, 0x67, 0x77, 0x50, 0x43, 0x42, 0x73, 0x4c, 0x46, 0x52, 0x6b, 0x50, 0x42, 0x41, 0x55, 0x67, 0x41, + 0x77, 0x41, 0x5a, 0x71, 0x52, 0x73, 0x41, 0x71, 0x53, 0x50, 0x41, 0x47, 0x77, 0x2b, 0x70, 0x45, 0x62, 0x45, + 0x6c, 0x0a, + 0x09, 0x48, 0x42, 0x6b, 0x61, 0x46, 0x51, 0x38, 0x42, 0x42, 0x41, 0x41, 0x49, 0x47, 0x68, 0x55, 0x6a, 0x45, + 0x67, 0x51, 0x41, 0x47, 0x68, 0x38, 0x56, 0x51, 0x78, 0x41, 0x41, 0x43, 0x77, 0x51, 0x6c, 0x45, 0x4e, 0x51, + 0x38, 0x78, 0x44, 0x4c, 0x38, 0x50, 0x4d, 0x51, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x45, 0x52, 0x49, 0x35, 0x45, + 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x38, 0x37, 0x4d, 0x54, + 0x30, 0x0a, + 0x09, 0x37, 0x42, 0x44, 0x75, 0x45, 0x68, 0x63, 0x35, 0x45, 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x35, 0x45, + 0x54, 0x6b, 0x35, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x41, 0x46, 0x4c, 0x73, 0x41, 0x70, 0x55, 0x57, 0x4c, 0x30, + 0x41, 0x4a, 0x51, 0x42, 0x41, 0x41, 0x41, 0x45, 0x41, 0x4a, 0x51, 0x41, 0x6c, 0x2f, 0x38, 0x41, 0x34, 0x45, + 0x54, 0x63, 0x34, 0x57, 0x51, 0x46, 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x4a, 0x66, 0x2f, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x4a, 0x51, 0x41, 0x6c, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, + 0x62, 0x49, 0x41, 0x4a, 0x67, 0x46, 0x64, 0x42, 0x54, 0x4d, 0x79, 0x4e, 0x6a, 0x30, 0x42, 0x4e, 0x44, 0x59, + 0x33, 0x4c, 0x67, 0x45, 0x39, 0x41, 0x54, 0x51, 0x6d, 0x4b, 0x77, 0x45, 0x31, 0x4d, 0x7a, 0x49, 0x57, 0x48, + 0x51, 0x45, 0x55, 0x46, 0x6a, 0x73, 0x42, 0x46, 0x53, 0x4d, 0x69, 0x42, 0x68, 0x30, 0x42, 0x46, 0x41, 0x59, + 0x72, 0x0a, + 0x09, 0x41, 0x51, 0x45, 0x41, 0x52, 0x6f, 0x78, 0x56, 0x57, 0x6d, 0x39, 0x76, 0x57, 0x6c, 0x57, 0x4d, 0x52, + 0x6a, 0x2f, 0x35, 0x70, 0x32, 0x79, 0x4f, 0x50, 0x6a, 0x36, 0x4f, 0x62, 0x4b, 0x66, 0x35, 0x50, 0x37, 0x35, + 0x57, 0x6a, 0x2f, 0x69, 0x63, 0x6a, 0x68, 0x73, 0x5a, 0x6a, 0x70, 0x33, 0x34, 0x6a, 0x6c, 0x65, 0x50, 0x6b, + 0x39, 0x33, 0x77, 0x6c, 0x58, 0x4f, 0x50, 0x64, 0x4a, 0x66, 0x76, 0x33, 0x5a, 0x51, 0x41, 0x41, 0x51, 0x44, + 0x5a, 0x0a, + 0x09, 0x41, 0x64, 0x4d, 0x46, 0x32, 0x77, 0x4d, 0x78, 0x41, 0x42, 0x30, 0x41, 0x49, 0x30, 0x41, 0x51, 0x41, + 0x52, 0x41, 0x62, 0x44, 0x41, 0x41, 0x54, 0x42, 0x4a, 0x77, 0x62, 0x45, 0x35, 0x77, 0x4d, 0x48, 0x67, 0x41, + 0x50, 0x48, 0x68, 0x44, 0x55, 0x78, 0x44, 0x45, 0x41, 0x45, 0x4e, 0x54, 0x38, 0x31, 0x4f, 0x77, 0x51, 0x77, + 0x42, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x77, 0x41, 0x52, 0x55, 0x47, 0x42, 0x69, 0x4d, 0x69, 0x4a, 0x79, 0x59, + 0x6e, 0x0a, + 0x09, 0x4a, 0x69, 0x63, 0x6d, 0x49, 0x79, 0x49, 0x47, 0x42, 0x7a, 0x55, 0x32, 0x4e, 0x6a, 0x4d, 0x79, 0x46, + 0x78, 0x59, 0x58, 0x46, 0x68, 0x63, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x42, 0x64, 0x74, 0x70, 0x73, 0x32, 0x46, + 0x75, 0x6b, 0x67, 0x73, 0x46, 0x42, 0x77, 0x2b, 0x62, 0x58, 0x6c, 0x69, 0x73, 0x59, 0x6d, 0x6d, 0x7a, 0x59, + 0x57, 0x36, 0x54, 0x43, 0x67, 0x55, 0x49, 0x44, 0x70, 0x74, 0x65, 0x56, 0x71, 0x6b, 0x44, 0x4d, 0x62, 0x4a, + 0x50, 0x0a, + 0x09, 0x52, 0x44, 0x73, 0x45, 0x41, 0x67, 0x4d, 0x46, 0x50, 0x6b, 0x31, 0x54, 0x73, 0x6b, 0x39, 0x46, 0x50, + 0x41, 0x51, 0x43, 0x41, 0x77, 0x55, 0x2b, 0x54, 0x41, 0x44, 0x2f, 0x2f, 0x77, 0x41, 0x51, 0x41, 0x41, 0x41, + 0x46, 0x61, 0x41, 0x64, 0x4f, 0x41, 0x69, 0x63, 0x41, 0x4a, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, + 0x77, 0x45, 0x44, 0x41, 0x4c, 0x77, 0x42, 0x64, 0x51, 0x41, 0x44, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x56, + 0x6f, 0x0a, + 0x09, 0x42, 0x32, 0x30, 0x41, 0x43, 0x77, 0x41, 0x4f, 0x41, 0x43, 0x45, 0x41, 0x79, 0x30, 0x42, 0x55, 0x44, + 0x42, 0x45, 0x4e, 0x44, 0x42, 0x73, 0x63, 0x47, 0x77, 0x34, 0x52, 0x48, 0x42, 0x73, 0x65, 0x45, 0x52, 0x77, + 0x62, 0x48, 0x52, 0x45, 0x63, 0x48, 0x42, 0x73, 0x4e, 0x45, 0x53, 0x45, 0x50, 0x49, 0x51, 0x77, 0x52, 0x44, + 0x67, 0x77, 0x50, 0x44, 0x79, 0x45, 0x67, 0x45, 0x51, 0x38, 0x68, 0x48, 0x78, 0x45, 0x68, 0x44, 0x79, 0x46, + 0x43, 0x0a, + 0x09, 0x44, 0x42, 0x73, 0x50, 0x44, 0x51, 0x6b, 0x44, 0x77, 0x52, 0x55, 0x4a, 0x48, 0x70, 0x55, 0x4e, 0x43, + 0x59, 0x34, 0x67, 0x48, 0x42, 0x34, 0x64, 0x48, 0x42, 0x67, 0x67, 0x48, 0x79, 0x45, 0x4e, 0x45, 0x67, 0x59, + 0x4f, 0x47, 0x41, 0x77, 0x47, 0x47, 0x77, 0x42, 0x57, 0x47, 0x42, 0x77, 0x50, 0x42, 0x6c, 0x59, 0x53, 0x48, + 0x43, 0x45, 0x69, 0x45, 0x4e, 0x54, 0x45, 0x31, 0x4f, 0x77, 0x79, 0x45, 0x4e, 0x54, 0x75, 0x4d, 0x68, 0x45, + 0x35, 0x0a, + 0x09, 0x45, 0x54, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x52, 0x4f, 0x54, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x4d, + 0x51, 0x41, 0x76, 0x50, 0x4f, 0x62, 0x57, 0x37, 0x68, 0x44, 0x55, 0x37, 0x68, 0x45, 0x53, 0x4f, 0x54, 0x6b, + 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x42, 0x65, 0x30, 0x48, 0x45, + 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x42, 0x65, 0x30, + 0x48, 0x0a, + 0x09, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x57, 0x53, 0x4b, 0x79, 0x49, 0x43, 0x4d, 0x42, 0x41, + 0x56, 0x31, 0x41, 0x49, 0x42, 0x6f, 0x4d, 0x63, 0x77, 0x79, 0x62, 0x44, 0x41, 0x4d, 0x48, 0x44, 0x77, 0x67, + 0x62, 0x55, 0x43, 0x4e, 0x6d, 0x44, 0x57, 0x6b, 0x4f, 0x64, 0x51, 0x31, 0x37, 0x44, 0x6e, 0x6b, 0x63, 0x65, + 0x52, 0x31, 0x32, 0x49, 0x48, 0x59, 0x68, 0x67, 0x43, 0x4d, 0x4d, 0x58, 0x51, 0x42, 0x64, 0x41, 0x54, 0x51, + 0x6d, 0x0a, + 0x09, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x41, 0x77, 0x45, 0x68, 0x41, + 0x53, 0x34, 0x42, 0x4e, 0x54, 0x51, 0x32, 0x4d, 0x7a, 0x49, 0x57, 0x46, 0x52, 0x51, 0x47, 0x42, 0x77, 0x45, + 0x6a, 0x41, 0x79, 0x45, 0x44, 0x49, 0x77, 0x4e, 0x55, 0x57, 0x54, 0x39, 0x41, 0x56, 0x31, 0x67, 0x2f, 0x50, + 0x31, 0x6d, 0x59, 0x2f, 0x76, 0x41, 0x43, 0x49, 0x66, 0x35, 0x59, 0x50, 0x54, 0x36, 0x66, 0x63, 0x33, 0x4b, + 0x68, 0x0a, + 0x09, 0x50, 0x7a, 0x77, 0x43, 0x46, 0x4e, 0x4b, 0x49, 0x2f, 0x56, 0x2b, 0x49, 0x31, 0x51, 0x5a, 0x61, 0x50, + 0x31, 0x6c, 0x58, 0x51, 0x54, 0x39, 0x59, 0x57, 0x50, 0x37, 0x7a, 0x2f, 0x52, 0x6b, 0x44, 0x54, 0x69, 0x6c, + 0x7a, 0x53, 0x58, 0x4f, 0x67, 0x6f, 0x58, 0x4a, 0x47, 0x64, 0x69, 0x6e, 0x36, 0x69, 0x77, 0x46, 0x2f, 0x2f, + 0x6f, 0x45, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x63, 0x2f, 0x35, 0x31, 0x42, 0x53, 0x63, 0x46, 0x38, 0x41, 0x49, + 0x6e, 0x0a, + 0x09, 0x41, 0x43, 0x59, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x41, 0x33, 0x51, 0x45, 0x74, 0x41, + 0x41, 0x44, 0x2f, 0x2f, 0x77, 0x44, 0x4a, 0x41, 0x41, 0x41, 0x45, 0x69, 0x77, 0x64, 0x72, 0x41, 0x69, 0x63, + 0x41, 0x4b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x45, 0x45, 0x41, 0x4a, 0x34, 0x42, 0x64, + 0x66, 0x2f, 0x2f, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x55, 0x7a, 0x42, 0x31, 0x34, 0x43, 0x4a, 0x77, 0x41, + 0x78, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x51, 0x55, 0x41, 0x2f, 0x67, 0x46, 0x31, 0x2f, + 0x2f, 0x38, 0x41, 0x63, 0x2f, 0x2f, 0x6a, 0x42, 0x64, 0x6b, 0x48, 0x54, 0x67, 0x49, 0x6e, 0x41, 0x44, 0x49, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x41, 0x77, 0x45, 0x6e, 0x41, 0x58, 0x58, 0x2f, 0x2f, + 0x77, 0x43, 0x79, 0x2f, 0x2b, 0x4d, 0x46, 0x4b, 0x51, 0x64, 0x4f, 0x41, 0x69, 0x63, 0x41, 0x4f, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x45, 0x44, 0x41, 0x4f, 0x34, 0x42, 0x64, 0x66, 0x2f, 0x2f, 0x41, + 0x48, 0x76, 0x2f, 0x34, 0x77, 0x51, 0x74, 0x42, 0x6d, 0x59, 0x43, 0x4a, 0x77, 0x42, 0x45, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x49, 0x30, 0x41, 0x55, 0x67, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x65, + 0x2f, 0x2f, 0x6a, 0x42, 0x43, 0x30, 0x47, 0x5a, 0x67, 0x49, 0x6e, 0x41, 0x45, 0x51, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x63, 0x41, 0x51, 0x77, 0x42, 0x53, 0x41, 0x41, 0x44, 0x2f, 0x2f, 0x77, 0x42, 0x37, 0x2f, + 0x2b, 0x4d, 0x45, 0x4c, 0x51, 0x5a, 0x6d, 0x41, 0x69, 0x63, 0x41, 0x52, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x42, 0x77, 0x44, 0x58, 0x41, 0x46, 0x49, 0x41, 0x41, 0x50, 0x2f, 0x2f, 0x41, 0x48, 0x76, 0x2f, 0x34, + 0x77, 0x51, 0x74, 0x42, 0x68, 0x41, 0x43, 0x4a, 0x77, 0x42, 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x48, 0x0a, + 0x09, 0x41, 0x49, 0x34, 0x41, 0x55, 0x67, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x65, 0x2f, 0x2f, 0x6a, 0x42, + 0x43, 0x30, 0x47, 0x4e, 0x77, 0x49, 0x6e, 0x41, 0x45, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, + 0x41, 0x32, 0x41, 0x42, 0x53, 0x41, 0x41, 0x44, 0x2f, 0x2f, 0x77, 0x42, 0x37, 0x2f, 0x2b, 0x4d, 0x45, 0x4c, + 0x51, 0x63, 0x47, 0x41, 0x69, 0x63, 0x41, 0x52, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x44, + 0x63, 0x0a, + 0x09, 0x41, 0x46, 0x49, 0x41, 0x41, 0x50, 0x2f, 0x2f, 0x41, 0x48, 0x48, 0x2b, 0x64, 0x51, 0x50, 0x6e, 0x42, + 0x48, 0x73, 0x43, 0x4a, 0x77, 0x42, 0x47, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x4e, 0x30, + 0x41, 0x6a, 0x77, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x63, 0x66, 0x2f, 0x6a, 0x42, 0x48, 0x38, 0x47, 0x5a, + 0x67, 0x49, 0x6e, 0x41, 0x45, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x41, 0x6a, 0x51, 0x43, + 0x4c, 0x0a, + 0x09, 0x41, 0x41, 0x44, 0x2f, 0x2f, 0x77, 0x42, 0x78, 0x2f, 0x2b, 0x4d, 0x45, 0x66, 0x77, 0x5a, 0x6d, 0x41, + 0x69, 0x63, 0x41, 0x53, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x42, 0x44, 0x41, 0x49, 0x73, + 0x41, 0x41, 0x50, 0x2f, 0x2f, 0x41, 0x48, 0x48, 0x2f, 0x34, 0x77, 0x52, 0x2f, 0x42, 0x6d, 0x59, 0x43, 0x4a, + 0x77, 0x42, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x4e, 0x63, 0x41, 0x69, 0x77, 0x41, + 0x41, 0x0a, + 0x09, 0x2f, 0x2f, 0x38, 0x41, 0x63, 0x66, 0x2f, 0x6a, 0x42, 0x48, 0x38, 0x47, 0x45, 0x41, 0x49, 0x6e, 0x41, + 0x45, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x41, 0x6a, 0x67, 0x43, 0x4c, 0x41, 0x41, 0x44, + 0x2f, 0x2f, 0x77, 0x43, 0x51, 0x41, 0x41, 0x41, 0x43, 0x62, 0x77, 0x5a, 0x6d, 0x41, 0x69, 0x63, 0x41, 0x31, + 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x43, 0x4e, 0x2f, 0x78, 0x30, 0x41, 0x41, 0x50, 0x2f, + 0x2f, 0x0a, + 0x09, 0x2f, 0x38, 0x63, 0x41, 0x41, 0x41, 0x47, 0x6d, 0x42, 0x6d, 0x59, 0x43, 0x4a, 0x77, 0x44, 0x57, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x45, 0x50, 0x2f, 0x48, 0x51, 0x41, 0x41, 0x2f, 0x2f, 0x2f, + 0x2f, 0x33, 0x67, 0x41, 0x41, 0x41, 0x6c, 0x77, 0x47, 0x5a, 0x67, 0x49, 0x6e, 0x41, 0x4e, 0x59, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x41, 0x31, 0x2f, 0x38, 0x64, 0x41, 0x41, 0x44, 0x2f, 0x2f, 0x2f, 0x2f, + 0x30, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x43, 0x52, 0x67, 0x59, 0x51, 0x41, 0x69, 0x63, 0x41, 0x31, 0x67, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x42, 0x77, 0x43, 0x4f, 0x2f, 0x78, 0x30, 0x41, 0x41, 0x50, 0x2f, 0x2f, 0x41, 0x4c, 0x6f, + 0x41, 0x41, 0x41, 0x52, 0x6b, 0x42, 0x6a, 0x63, 0x43, 0x4a, 0x77, 0x42, 0x52, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x48, 0x41, 0x4e, 0x67, 0x41, 0x6d, 0x41, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x63, 0x66, 0x2f, + 0x6a, 0x0a, + 0x09, 0x42, 0x48, 0x55, 0x47, 0x5a, 0x67, 0x49, 0x6e, 0x41, 0x46, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x63, 0x41, 0x6a, 0x51, 0x42, 0x7a, 0x41, 0x41, 0x44, 0x2f, 0x2f, 0x77, 0x42, 0x78, 0x2f, 0x2b, 0x4d, + 0x45, 0x64, 0x51, 0x5a, 0x6d, 0x41, 0x69, 0x63, 0x41, 0x55, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, + 0x77, 0x42, 0x44, 0x41, 0x48, 0x4d, 0x41, 0x41, 0x50, 0x2f, 0x2f, 0x41, 0x48, 0x48, 0x2f, 0x34, 0x77, 0x52, + 0x31, 0x0a, + 0x09, 0x42, 0x6d, 0x59, 0x43, 0x4a, 0x77, 0x42, 0x53, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, + 0x4e, 0x63, 0x41, 0x63, 0x77, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x63, 0x66, 0x2f, 0x6a, 0x42, 0x48, 0x55, + 0x47, 0x45, 0x41, 0x49, 0x6e, 0x41, 0x46, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x41, 0x6a, + 0x67, 0x42, 0x7a, 0x41, 0x41, 0x44, 0x2f, 0x2f, 0x77, 0x42, 0x78, 0x2f, 0x2b, 0x4d, 0x45, 0x64, 0x51, 0x59, + 0x33, 0x0a, + 0x09, 0x41, 0x69, 0x63, 0x41, 0x55, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x44, 0x59, 0x41, + 0x48, 0x4d, 0x41, 0x41, 0x50, 0x2f, 0x2f, 0x41, 0x4b, 0x37, 0x2f, 0x34, 0x77, 0x52, 0x59, 0x42, 0x6d, 0x59, + 0x43, 0x4a, 0x77, 0x42, 0x59, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x49, 0x30, 0x41, 0x65, + 0x77, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x72, 0x76, 0x2f, 0x6a, 0x42, 0x46, 0x67, 0x47, 0x5a, 0x67, 0x49, + 0x6e, 0x0a, + 0x09, 0x41, 0x46, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x41, 0x51, 0x77, 0x42, 0x37, 0x41, + 0x41, 0x44, 0x2f, 0x2f, 0x77, 0x43, 0x75, 0x2f, 0x2b, 0x4d, 0x45, 0x57, 0x41, 0x5a, 0x6d, 0x41, 0x69, 0x63, + 0x41, 0x57, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x44, 0x58, 0x41, 0x48, 0x73, 0x41, 0x41, + 0x50, 0x2f, 0x2f, 0x41, 0x4b, 0x37, 0x2f, 0x34, 0x77, 0x52, 0x59, 0x42, 0x68, 0x41, 0x43, 0x4a, 0x77, 0x42, + 0x59, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x49, 0x34, 0x41, 0x65, 0x77, 0x41, 0x41, 0x41, + 0x41, 0x45, 0x41, 0x4f, 0x66, 0x38, 0x37, 0x41, 0x38, 0x63, 0x46, 0x31, 0x51, 0x41, 0x4c, 0x41, 0x43, 0x64, + 0x41, 0x46, 0x41, 0x67, 0x45, 0x75, 0x51, 0x6f, 0x43, 0x41, 0x49, 0x45, 0x47, 0x77, 0x67, 0x77, 0x44, 0x57, + 0x51, 0x55, 0x42, 0x56, 0x77, 0x6c, 0x5a, 0x42, 0x77, 0x41, 0x4d, 0x45, 0x4e, 0x51, 0x38, 0x37, 0x50, 0x77, + 0x38, 0x0a, + 0x09, 0x37, 0x44, 0x45, 0x41, 0x45, 0x4f, 0x54, 0x30, 0x31, 0x44, 0x7a, 0x73, 0x4d, 0x6a, 0x41, 0x42, 0x4d, + 0x78, 0x45, 0x68, 0x46, 0x53, 0x45, 0x52, 0x49, 0x78, 0x45, 0x68, 0x4e, 0x53, 0x45, 0x42, 0x71, 0x4c, 0x41, + 0x42, 0x62, 0x2f, 0x36, 0x52, 0x73, 0x50, 0x36, 0x52, 0x41, 0x57, 0x38, 0x46, 0x31, 0x66, 0x35, 0x63, 0x6d, + 0x66, 0x75, 0x6a, 0x42, 0x46, 0x32, 0x5a, 0x41, 0x41, 0x41, 0x43, 0x41, 0x4d, 0x4d, 0x44, 0x64, 0x51, 0x4d, + 0x39, 0x0a, + 0x09, 0x42, 0x66, 0x41, 0x41, 0x43, 0x77, 0x41, 0x61, 0x41, 0x43, 0x42, 0x41, 0x45, 0x51, 0x62, 0x44, 0x46, + 0x63, 0x51, 0x41, 0x77, 0x77, 0x79, 0x52, 0x47, 0x77, 0x6c, 0x61, 0x45, 0x6c, 0x73, 0x44, 0x57, 0x68, 0x67, + 0x62, 0x45, 0x4e, 0x7a, 0x73, 0x2f, 0x4f, 0x77, 0x78, 0x41, 0x42, 0x44, 0x30, 0x37, 0x50, 0x7a, 0x73, 0x4d, + 0x41, 0x45, 0x69, 0x42, 0x68, 0x55, 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x55, 0x30, 0x4a, 0x69, 0x63, + 0x79, 0x0a, + 0x09, 0x46, 0x68, 0x63, 0x57, 0x46, 0x68, 0x55, 0x55, 0x42, 0x69, 0x4d, 0x69, 0x4a, 0x6a, 0x55, 0x30, 0x4e, + 0x67, 0x49, 0x41, 0x55, 0x47, 0x35, 0x75, 0x55, 0x46, 0x42, 0x75, 0x62, 0x30, 0x39, 0x41, 0x64, 0x69, 0x73, + 0x75, 0x4c, 0x72, 0x6d, 0x47, 0x68, 0x37, 0x53, 0x34, 0x42, 0x57, 0x39, 0x76, 0x55, 0x45, 0x39, 0x74, 0x62, + 0x55, 0x39, 0x50, 0x63, 0x49, 0x45, 0x78, 0x4c, 0x69, 0x31, 0x79, 0x51, 0x6f, 0x53, 0x33, 0x74, 0x49, 0x65, + 0x47, 0x0a, + 0x09, 0x75, 0x67, 0x41, 0x41, 0x41, 0x67, 0x43, 0x73, 0x2f, 0x73, 0x63, 0x45, 0x49, 0x77, 0x57, 0x59, 0x41, + 0x41, 0x59, 0x41, 0x49, 0x51, 0x42, 0x52, 0x51, 0x43, 0x73, 0x54, 0x46, 0x68, 0x51, 0x41, 0x44, 0x77, 0x77, + 0x42, 0x43, 0x77, 0x65, 0x47, 0x43, 0x49, 0x67, 0x4c, 0x45, 0x49, 0x59, 0x50, 0x69, 0x41, 0x79, 0x35, 0x46, + 0x42, 0x59, 0x4c, 0x75, 0x52, 0x30, 0x66, 0x48, 0x4c, 0x67, 0x57, 0x6a, 0x43, 0x49, 0x63, 0x46, 0x51, 0x41, + 0x4a, 0x0a, + 0x09, 0x48, 0x68, 0x4d, 0x4c, 0x44, 0x77, 0x63, 0x45, 0x45, 0x68, 0x6b, 0x69, 0x45, 0x4e, 0x7a, 0x73, 0x31, + 0x44, 0x7a, 0x55, 0x50, 0x44, 0x7a, 0x73, 0x4d, 0x6a, 0x49, 0x78, 0x41, 0x42, 0x44, 0x6b, 0x39, 0x44, 0x7a, + 0x45, 0x37, 0x42, 0x44, 0x45, 0x2f, 0x76, 0x54, 0x75, 0x45, 0x50, 0x58, 0x75, 0x45, 0x6a, 0x6b, 0x52, 0x45, + 0x6a, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x77, 0x4a, 0x52, 0x45, 0x47, 0x42, 0x68, 0x55, 0x55, 0x46, 0x67, 0x45, + 0x56, 0x0a, + 0x09, 0x4a, 0x69, 0x59, 0x6e, 0x41, 0x7a, 0x59, 0x32, 0x4e, 0x78, 0x55, 0x47, 0x42, 0x67, 0x63, 0x52, 0x49, + 0x78, 0x45, 0x6d, 0x41, 0x42, 0x45, 0x51, 0x41, 0x44, 0x63, 0x52, 0x4d, 0x78, 0x4d, 0x57, 0x46, 0x67, 0x4b, + 0x6d, 0x6b, 0x36, 0x53, 0x6b, 0x41, 0x68, 0x42, 0x4b, 0x69, 0x45, 0x51, 0x42, 0x52, 0x6f, 0x6c, 0x49, 0x51, + 0x59, 0x6c, 0x4e, 0x5a, 0x76, 0x48, 0x2b, 0x39, 0x77, 0x45, 0x4a, 0x38, 0x57, 0x59, 0x42, 0x53, 0x59, 0x6d, + 0x44, 0x0a, + 0x09, 0x41, 0x31, 0x67, 0x53, 0x34, 0x72, 0x69, 0x35, 0x34, 0x67, 0x4f, 0x68, 0x72, 0x43, 0x6b, 0x71, 0x41, + 0x2f, 0x79, 0x67, 0x42, 0x53, 0x6f, 0x6e, 0x71, 0x68, 0x34, 0x6a, 0x42, 0x2f, 0x37, 0x6b, 0x41, 0x53, 0x41, + 0x55, 0x41, 0x54, 0x4d, 0x42, 0x41, 0x51, 0x45, 0x43, 0x41, 0x54, 0x49, 0x57, 0x41, 0x52, 0x2f, 0x2b, 0x34, + 0x51, 0x51, 0x68, 0x41, 0x41, 0x45, 0x41, 0x67, 0x51, 0x41, 0x41, 0x42, 0x47, 0x49, 0x46, 0x38, 0x41, 0x41, + 0x62, 0x0a, + 0x09, 0x41, 0x47, 0x42, 0x41, 0x49, 0x51, 0x63, 0x57, 0x43, 0x41, 0x47, 0x47, 0x41, 0x42, 0x49, 0x4b, 0x71, + 0x52, 0x51, 0x49, 0x44, 0x41, 0x53, 0x67, 0x41, 0x4a, 0x51, 0x5a, 0x6b, 0x52, 0x41, 0x4d, 0x6f, 0x41, 0x34, + 0x41, 0x44, 0x51, 0x6b, 0x4c, 0x42, 0x78, 0x77, 0x54, 0x44, 0x78, 0x55, 0x52, 0x48, 0x42, 0x44, 0x63, 0x50, + 0x4d, 0x7a, 0x4d, 0x2f, 0x44, 0x7a, 0x45, 0x31, 0x4d, 0x51, 0x78, 0x41, 0x43, 0x2f, 0x73, 0x4d, 0x76, 0x54, + 0x6b, 0x0a, + 0x09, 0x37, 0x42, 0x44, 0x55, 0x50, 0x4f, 0x34, 0x79, 0x45, 0x4f, 0x34, 0x52, 0x4f, 0x54, 0x6b, 0x77, 0x41, + 0x55, 0x75, 0x77, 0x44, 0x46, 0x52, 0x59, 0x76, 0x51, 0x41, 0x63, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x63, 0x41, 0x42, 0x77, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x74, 0x44, 0x59, 0x42, 0x4e, + 0x67, 0x49, 0x43, 0x41, 0x46, 0x30, 0x42, 0x46, 0x53, 0x34, 0x42, 0x49, 0x79, 0x49, 0x47, 0x48, 0x51, 0x45, + 0x68, 0x0a, + 0x09, 0x46, 0x53, 0x45, 0x52, 0x49, 0x52, 0x55, 0x68, 0x4e, 0x54, 0x4d, 0x52, 0x49, 0x7a, 0x55, 0x7a, 0x4e, + 0x52, 0x41, 0x32, 0x4d, 0x7a, 0x49, 0x57, 0x42, 0x45, 0x35, 0x4d, 0x69, 0x44, 0x32, 0x55, 0x64, 0x41, 0x47, + 0x48, 0x2f, 0x6e, 0x6b, 0x43, 0x4c, 0x66, 0x77, 0x66, 0x37, 0x4d, 0x66, 0x48, 0x31, 0x75, 0x67, 0x39, 0x6c, + 0x77, 0x57, 0x30, 0x74, 0x69, 0x6b, 0x70, 0x6d, 0x39, 0x54, 0x58, 0x6a, 0x2f, 0x34, 0x76, 0x71, 0x71, 0x6f, + 0x42, 0x0a, + 0x09, 0x30, 0x59, 0x2f, 0x75, 0x41, 0x51, 0x58, 0x7a, 0x48, 0x77, 0x41, 0x41, 0x41, 0x67, 0x42, 0x63, 0x2f, + 0x7a, 0x30, 0x44, 0x6f, 0x67, 0x58, 0x77, 0x41, 0x41, 0x73, 0x41, 0x50, 0x67, 0x43, 0x52, 0x51, 0x44, 0x77, + 0x76, 0x4d, 0x43, 0x6f, 0x47, 0x41, 0x42, 0x63, 0x64, 0x4d, 0x44, 0x59, 0x45, 0x44, 0x53, 0x65, 0x4b, 0x4a, + 0x67, 0x32, 0x4b, 0x44, 0x43, 0x72, 0x47, 0x4a, 0x73, 0x55, 0x6a, 0x45, 0x4d, 0x59, 0x4d, 0x78, 0x54, 0x79, + 0x52, 0x0a, + 0x09, 0x49, 0x7a, 0x38, 0x76, 0x42, 0x67, 0x41, 0x58, 0x4d, 0x41, 0x51, 0x54, 0x48, 0x53, 0x30, 0x4a, 0x4e, + 0x67, 0x4d, 0x54, 0x56, 0x7a, 0x6b, 0x74, 0x56, 0x79, 0x41, 0x4a, 0x56, 0x77, 0x77, 0x69, 0x47, 0x6a, 0x6b, + 0x6d, 0x49, 0x67, 0x4e, 0x58, 0x4d, 0x7a, 0x38, 0x51, 0x33, 0x4f, 0x7a, 0x6b, 0x78, 0x4e, 0x54, 0x6b, 0x37, + 0x4e, 0x54, 0x73, 0x45, 0x4f, 0x34, 0x52, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x52, 0x45, 0x58, 0x4f, 0x54, 0x6b, + 0x78, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x45, 0x39, 0x4f, 0x54, 0x73, 0x45, 0x4f, 0x62, 0x75, 0x45, 0x4f, 0x34, 0x51, 0x37, + 0x68, 0x45, 0x58, 0x4f, 0x54, 0x6b, 0x35, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x41, 0x46, 0x4c, 0x73, 0x41, 0x70, + 0x55, 0x53, 0x37, 0x41, 0x4c, 0x56, 0x46, 0x74, 0x4c, 0x73, 0x41, 0x78, 0x55, 0x57, 0x30, 0x75, 0x77, 0x44, + 0x6c, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x50, 0x77, 0x42, 0x41, 0x41, 0x41, 0x45, 0x41, 0x50, 0x77, 0x41, + 0x2f, 0x0a, + 0x09, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x45, 0x4f, 0x41, 0x52, 0x55, 0x55, 0x46, + 0x68, 0x63, 0x2b, 0x41, 0x54, 0x55, 0x30, 0x4a, 0x68, 0x4d, 0x56, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, + 0x56, 0x46, 0x42, 0x63, 0x57, 0x46, 0x78, 0x34, 0x42, 0x46, 0x52, 0x51, 0x47, 0x42, 0x78, 0x34, 0x42, 0x46, + 0x52, 0x51, 0x47, 0x49, 0x79, 0x49, 0x6d, 0x4a, 0x7a, 0x55, 0x65, 0x41, 0x54, 0x4d, 0x79, 0x4e, 0x6a, 0x55, + 0x30, 0x0a, + 0x09, 0x4c, 0x77, 0x45, 0x75, 0x41, 0x54, 0x55, 0x30, 0x4e, 0x6a, 0x63, 0x75, 0x41, 0x54, 0x55, 0x30, 0x4e, + 0x6a, 0x4d, 0x79, 0x46, 0x67, 0x46, 0x37, 0x50, 0x7a, 0x36, 0x4c, 0x2b, 0x6a, 0x38, 0x2b, 0x6a, 0x38, 0x78, + 0x54, 0x6a, 0x7a, 0x68, 0x68, 0x62, 0x4d, 0x34, 0x61, 0x44, 0x74, 0x4f, 0x44, 0x58, 0x46, 0x30, 0x2b, 0x4f, + 0x63, 0x79, 0x74, 0x53, 0x5a, 0x70, 0x59, 0x56, 0x35, 0x51, 0x36, 0x5a, 0x6e, 0x48, 0x64, 0x47, 0x64, 0x61, + 0x41, 0x0a, + 0x09, 0x58, 0x56, 0x73, 0x37, 0x4f, 0x38, 0x69, 0x6d, 0x53, 0x5a, 0x6b, 0x44, 0x71, 0x43, 0x35, 0x61, 0x4c, + 0x6b, 0x79, 0x46, 0x68, 0x79, 0x31, 0x62, 0x4c, 0x6b, 0x75, 0x49, 0x41, 0x70, 0x4f, 0x6b, 0x4a, 0x79, 0x64, + 0x51, 0x52, 0x31, 0x70, 0x7a, 0x44, 0x77, 0x68, 0x33, 0x6d, 0x6d, 0x56, 0x61, 0x6a, 0x44, 0x55, 0x30, 0x62, + 0x55, 0x43, 0x4f, 0x71, 0x42, 0x30, 0x64, 0x70, 0x43, 0x63, 0x6e, 0x56, 0x45, 0x78, 0x6d, 0x65, 0x77, 0x35, + 0x34, 0x0a, + 0x09, 0x6d, 0x57, 0x5a, 0x62, 0x6a, 0x7a, 0x45, 0x73, 0x63, 0x45, 0x57, 0x43, 0x6e, 0x78, 0x30, 0x41, 0x41, + 0x41, 0x45, 0x42, 0x4d, 0x77, 0x48, 0x52, 0x41, 0x34, 0x55, 0x45, 0x49, 0x51, 0x41, 0x4c, 0x41, 0x42, 0x4b, + 0x33, 0x43, 0x63, 0x63, 0x44, 0x44, 0x41, 0x5a, 0x63, 0x41, 0x41, 0x77, 0x51, 0x31, 0x4f, 0x77, 0x78, 0x41, + 0x42, 0x44, 0x55, 0x37, 0x44, 0x41, 0x42, 0x4e, 0x44, 0x59, 0x7a, 0x4d, 0x68, 0x59, 0x56, 0x46, 0x41, 0x59, + 0x6a, 0x0a, + 0x09, 0x49, 0x69, 0x59, 0x42, 0x4d, 0x36, 0x31, 0x2b, 0x66, 0x4b, 0x75, 0x73, 0x66, 0x58, 0x32, 0x73, 0x41, + 0x76, 0x70, 0x38, 0x71, 0x36, 0x74, 0x38, 0x66, 0x61, 0x79, 0x73, 0x41, 0x41, 0x41, 0x42, 0x41, 0x4a, 0x37, + 0x2f, 0x4f, 0x77, 0x51, 0x35, 0x42, 0x64, 0x55, 0x41, 0x44, 0x51, 0x41, 0x6c, 0x51, 0x42, 0x49, 0x49, 0x41, + 0x67, 0x54, 0x42, 0x41, 0x49, 0x45, 0x47, 0x41, 0x67, 0x34, 0x41, 0x42, 0x31, 0x30, 0x46, 0x41, 0x31, 0x30, + 0x42, 0x0a, + 0x09, 0x43, 0x77, 0x34, 0x51, 0x31, 0x4e, 0x54, 0x38, 0x33, 0x4f, 0x77, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x78, + 0x44, 0x4c, 0x30, 0x37, 0x42, 0x45, 0x35, 0x4d, 0x41, 0x45, 0x68, 0x45, 0x53, 0x4d, 0x52, 0x49, 0x78, 0x45, + 0x6a, 0x45, 0x53, 0x59, 0x6d, 0x4e, 0x54, 0x51, 0x6b, 0x41, 0x6e, 0x6b, 0x42, 0x77, 0x49, 0x32, 0x2b, 0x6a, + 0x74, 0x66, 0x72, 0x41, 0x51, 0x51, 0x46, 0x31, 0x66, 0x6c, 0x6d, 0x42, 0x68, 0x2f, 0x35, 0x34, 0x51, 0x4e, + 0x4f, 0x0a, + 0x09, 0x45, 0x64, 0x32, 0x34, 0x76, 0x75, 0x67, 0x41, 0x41, 0x41, 0x45, 0x41, 0x75, 0x76, 0x2f, 0x6a, 0x42, + 0x4b, 0x77, 0x47, 0x46, 0x41, 0x41, 0x76, 0x41, 0x4a, 0x70, 0x41, 0x4d, 0x43, 0x30, 0x6e, 0x49, 0x51, 0x77, + 0x45, 0x42, 0x67, 0x30, 0x67, 0x41, 0x41, 0x51, 0x71, 0x46, 0x6f, 0x59, 0x58, 0x47, 0x72, 0x6b, 0x54, 0x4b, + 0x72, 0x6b, 0x44, 0x6c, 0x78, 0x4f, 0x4d, 0x4c, 0x67, 0x77, 0x4a, 0x44, 0x52, 0x30, 0x67, 0x49, 0x53, 0x63, + 0x4a, 0x0a, + 0x09, 0x43, 0x43, 0x51, 0x6e, 0x43, 0x41, 0x59, 0x64, 0x43, 0x43, 0x51, 0x51, 0x46, 0x69, 0x30, 0x49, 0x45, + 0x41, 0x42, 0x47, 0x4d, 0x42, 0x44, 0x38, 0x78, 0x50, 0x7a, 0x4d, 0x45, 0x4d, 0x62, 0x75, 0x31, 0x4f, 0x34, + 0x51, 0x37, 0x68, 0x45, 0x35, 0x4f, 0x52, 0x49, 0x35, 0x45, 0x6a, 0x6b, 0x78, 0x41, 0x43, 0x2f, 0x6b, 0x2f, + 0x75, 0x34, 0x51, 0x2f, 0x74, 0x58, 0x75, 0x45, 0x68, 0x63, 0x35, 0x46, 0x7a, 0x6b, 0x77, 0x51, 0x45, 0x41, + 0x50, 0x0a, + 0x09, 0x42, 0x51, 0x38, 0x47, 0x44, 0x77, 0x63, 0x50, 0x4a, 0x77, 0x38, 0x6f, 0x69, 0x67, 0x79, 0x4b, 0x44, + 0x51, 0x63, 0x4b, 0x42, 0x67, 0x6f, 0x48, 0x43, 0x67, 0x73, 0x4b, 0x44, 0x41, 0x6f, 0x4e, 0x43, 0x68, 0x38, + 0x4e, 0x49, 0x41, 0x6f, 0x68, 0x44, 0x43, 0x49, 0x45, 0x4a, 0x68, 0x6b, 0x4e, 0x47, 0x52, 0x38, 0x5a, 0x49, + 0x44, 0x6f, 0x67, 0x4f, 0x69, 0x46, 0x4e, 0x48, 0x30, 0x30, 0x67, 0x53, 0x53, 0x46, 0x4a, 0x49, 0x6d, 0x6f, + 0x66, 0x0a, + 0x09, 0x61, 0x69, 0x43, 0x6c, 0x42, 0x71, 0x55, 0x48, 0x70, 0x69, 0x41, 0x59, 0x58, 0x51, 0x46, 0x64, 0x45, + 0x7a, 0x51, 0x32, 0x4d, 0x7a, 0x49, 0x57, 0x46, 0x77, 0x34, 0x42, 0x46, 0x52, 0x51, 0x57, 0x48, 0x77, 0x45, + 0x65, 0x41, 0x52, 0x55, 0x55, 0x42, 0x69, 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x31, 0x48, 0x67, 0x45, 0x7a, 0x4d, + 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x76, 0x41, 0x53, 0x34, 0x42, 0x4e, 0x54, 0x51, 0x32, 0x4e, 0x79, 0x34, + 0x42, 0x0a, + 0x09, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x45, 0x6a, 0x75, 0x75, 0x2f, 0x61, 0x30, 0x4e, 0x73, 0x44, 0x6c, + 0x36, 0x67, 0x36, 0x51, 0x54, 0x6d, 0x6d, 0x59, 0x4f, 0x48, 0x54, 0x51, 0x49, 0x68, 0x4a, 0x55, 0x49, 0x78, + 0x42, 0x64, 0x48, 0x67, 0x37, 0x5a, 0x56, 0x78, 0x67, 0x56, 0x36, 0x65, 0x58, 0x43, 0x49, 0x4e, 0x78, 0x67, + 0x6f, 0x69, 0x37, 0x42, 0x48, 0x48, 0x49, 0x32, 0x2b, 0x6a, 0x67, 0x43, 0x48, 0x4e, 0x67, 0x4c, 0x31, 0x45, + 0x71, 0x0a, + 0x09, 0x4a, 0x57, 0x71, 0x4f, 0x5a, 0x4b, 0x79, 0x33, 0x47, 0x52, 0x69, 0x6b, 0x48, 0x68, 0x31, 0x66, 0x57, + 0x7a, 0x39, 0x55, 0x50, 0x6a, 0x63, 0x37, 0x68, 0x31, 0x74, 0x2f, 0x72, 0x42, 0x31, 0x6e, 0x63, 0x49, 0x75, + 0x44, 0x2b, 0x35, 0x4d, 0x41, 0x41, 0x41, 0x51, 0x42, 0x47, 0x77, 0x41, 0x41, 0x42, 0x75, 0x55, 0x46, 0x7a, + 0x51, 0x41, 0x58, 0x41, 0x43, 0x38, 0x41, 0x4f, 0x41, 0x42, 0x4d, 0x41, 0x47, 0x42, 0x41, 0x4e, 0x6b, 0x56, + 0x43, 0x0a, + 0x09, 0x51, 0x7a, 0x38, 0x79, 0x79, 0x55, 0x67, 0x77, 0x79, 0x54, 0x6c, 0x4b, 0x51, 0x38, 0x6f, 0x4d, 0x4f, + 0x63, 0x6f, 0x41, 0x79, 0x52, 0x6a, 0x49, 0x44, 0x4d, 0x6b, 0x6b, 0x53, 0x45, 0x55, 0x7a, 0x4d, 0x41, 0x51, + 0x78, 0x51, 0x6a, 0x77, 0x2f, 0x4f, 0x54, 0x5a, 0x4a, 0x4d, 0x57, 0x42, 0x4c, 0x4e, 0x6d, 0x42, 0x44, 0x50, + 0x46, 0x34, 0x53, 0x43, 0x52, 0x35, 0x4c, 0x58, 0x67, 0x59, 0x4a, 0x48, 0x6c, 0x38, 0x71, 0x54, 0x52, 0x44, + 0x63, 0x0a, + 0x09, 0x35, 0x50, 0x7a, 0x73, 0x45, 0x50, 0x37, 0x39, 0x78, 0x4f, 0x34, 0x51, 0x37, 0x6a, 0x49, 0x52, 0x4f, + 0x54, 0x6b, 0x53, 0x4f, 0x52, 0x49, 0x58, 0x4f, 0x54, 0x45, 0x41, 0x4c, 0x2b, 0x37, 0x32, 0x2f, 0x75, 0x30, + 0x51, 0x37, 0x54, 0x49, 0x51, 0x37, 0x74, 0x62, 0x75, 0x4f, 0x52, 0x49, 0x35, 0x4f, 0x54, 0x41, 0x42, 0x49, + 0x67, 0x59, 0x48, 0x42, 0x67, 0x59, 0x56, 0x46, 0x42, 0x59, 0x58, 0x46, 0x68, 0x59, 0x7a, 0x4d, 0x6a, 0x59, + 0x33, 0x0a, + 0x09, 0x4e, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x6e, 0x4a, 0x69, 0x59, 0x6e, 0x4d, 0x67, 0x51, 0x58, 0x46, + 0x68, 0x49, 0x56, 0x46, 0x41, 0x49, 0x48, 0x42, 0x67, 0x51, 0x6a, 0x49, 0x69, 0x51, 0x6e, 0x4a, 0x67, 0x49, + 0x31, 0x4e, 0x42, 0x49, 0x33, 0x4e, 0x69, 0x51, 0x54, 0x49, 0x78, 0x45, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, + 0x43, 0x59, 0x6e, 0x4d, 0x68, 0x59, 0x56, 0x46, 0x41, 0x59, 0x48, 0x46, 0x68, 0x59, 0x58, 0x46, 0x79, 0x4d, + 0x6e, 0x0a, + 0x09, 0x4a, 0x69, 0x59, 0x6a, 0x49, 0x78, 0x45, 0x6a, 0x45, 0x51, 0x51, 0x41, 0x67, 0x2b, 0x4a, 0x65, 0x58, + 0x6d, 0x42, 0x67, 0x58, 0x6c, 0x37, 0x69, 0x67, 0x34, 0x54, 0x6a, 0x58, 0x6c, 0x31, 0x64, 0x58, 0x6c, 0x78, + 0x65, 0x34, 0x34, 0x53, 0x59, 0x41, 0x51, 0x64, 0x74, 0x62, 0x57, 0x78, 0x73, 0x62, 0x57, 0x33, 0x2b, 0x2b, + 0x5a, 0x69, 0x59, 0x2f, 0x76, 0x6c, 0x74, 0x62, 0x57, 0x78, 0x73, 0x62, 0x57, 0x30, 0x42, 0x42, 0x33, 0x31, + 0x37, 0x0a, + 0x09, 0x65, 0x32, 0x35, 0x58, 0x57, 0x47, 0x61, 0x77, 0x72, 0x6d, 0x6c, 0x67, 0x47, 0x45, 0x4d, 0x75, 0x69, + 0x61, 0x79, 0x42, 0x4f, 0x30, 0x6b, 0x32, 0x51, 0x70, 0x73, 0x46, 0x5a, 0x6c, 0x35, 0x65, 0x58, 0x75, 0x57, + 0x43, 0x67, 0x65, 0x4e, 0x65, 0x58, 0x6c, 0x39, 0x66, 0x58, 0x6c, 0x33, 0x69, 0x67, 0x34, 0x58, 0x6a, 0x58, + 0x56, 0x35, 0x65, 0x5a, 0x32, 0x35, 0x74, 0x62, 0x66, 0x37, 0x36, 0x6d, 0x70, 0x6a, 0x2b, 0x2b, 0x32, 0x31, + 0x74, 0x0a, + 0x09, 0x62, 0x6d, 0x35, 0x74, 0x62, 0x51, 0x45, 0x46, 0x6d, 0x4a, 0x6f, 0x42, 0x42, 0x6d, 0x31, 0x74, 0x62, + 0x76, 0x35, 0x69, 0x2f, 0x75, 0x77, 0x2b, 0x53, 0x30, 0x77, 0x2f, 0x5a, 0x33, 0x64, 0x35, 0x56, 0x6e, 0x41, + 0x52, 0x43, 0x45, 0x31, 0x4a, 0x33, 0x39, 0x46, 0x67, 0x4d, 0x2f, 0x36, 0x63, 0x41, 0x30, 0x51, 0x41, 0x41, + 0x77, 0x45, 0x62, 0x41, 0x41, 0x41, 0x47, 0x35, 0x51, 0x58, 0x4e, 0x41, 0x42, 0x63, 0x41, 0x4c, 0x77, 0x42, + 0x4a, 0x0a, + 0x09, 0x41, 0x45, 0x4e, 0x41, 0x4a, 0x6a, 0x33, 0x4c, 0x50, 0x6a, 0x72, 0x4d, 0x51, 0x63, 0x6f, 0x6b, 0x4d, + 0x63, 0x73, 0x77, 0x4e, 0x4d, 0x78, 0x48, 0x79, 0x68, 0x6a, 0x4a, 0x41, 0x4d, 0x67, 0x6b, 0x79, 0x51, 0x77, + 0x33, 0x59, 0x55, 0x51, 0x39, 0x4d, 0x46, 0x34, 0x71, 0x43, 0x51, 0x5a, 0x45, 0x58, 0x68, 0x34, 0x4a, 0x42, + 0x68, 0x4a, 0x4b, 0x45, 0x4e, 0x7a, 0x4d, 0x2f, 0x4f, 0x77, 0x51, 0x2f, 0x75, 0x30, 0x79, 0x45, 0x4f, 0x34, + 0x78, 0x0a, + 0x09, 0x41, 0x43, 0x2f, 0x75, 0x39, 0x76, 0x37, 0x39, 0x37, 0x74, 0x62, 0x75, 0x45, 0x50, 0x33, 0x75, 0x31, + 0x75, 0x34, 0x77, 0x41, 0x54, 0x49, 0x45, 0x46, 0x78, 0x59, 0x53, 0x46, 0x52, 0x51, 0x43, 0x42, 0x77, 0x59, + 0x45, 0x49, 0x79, 0x49, 0x6b, 0x4a, 0x79, 0x59, 0x43, 0x4e, 0x54, 0x51, 0x53, 0x4e, 0x7a, 0x59, 0x6b, 0x46, + 0x79, 0x49, 0x47, 0x42, 0x77, 0x59, 0x47, 0x46, 0x52, 0x51, 0x57, 0x46, 0x78, 0x59, 0x57, 0x4d, 0x7a, 0x49, + 0x32, 0x0a, + 0x09, 0x4e, 0x7a, 0x59, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x4a, 0x79, 0x59, 0x6d, 0x46, 0x78, 0x55, 0x6d, 0x4a, + 0x69, 0x4d, 0x69, 0x42, 0x68, 0x55, 0x55, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x6a, 0x63, 0x56, 0x42, 0x67, 0x59, + 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x7a, 0x4d, 0x68, 0x59, 0x45, 0x41, 0x4a, 0x67, 0x42, 0x42, + 0x32, 0x31, 0x74, 0x62, 0x47, 0x78, 0x74, 0x62, 0x66, 0x37, 0x35, 0x6d, 0x4a, 0x6a, 0x2b, 0x2b, 0x57, 0x31, + 0x74, 0x0a, + 0x09, 0x62, 0x47, 0x78, 0x74, 0x62, 0x51, 0x45, 0x48, 0x6d, 0x49, 0x50, 0x69, 0x58, 0x6c, 0x35, 0x67, 0x59, + 0x46, 0x35, 0x65, 0x34, 0x6f, 0x4f, 0x45, 0x34, 0x31, 0x35, 0x64, 0x58, 0x56, 0x35, 0x63, 0x58, 0x75, 0x4f, + 0x6e, 0x51, 0x6f, 0x4a, 0x43, 0x6c, 0x61, 0x65, 0x72, 0x6d, 0x30, 0x42, 0x36, 0x51, 0x6b, 0x4f, 0x4a, 0x52, + 0x74, 0x6a, 0x37, 0x2b, 0x39, 0x68, 0x4a, 0x69, 0x41, 0x58, 0x4e, 0x62, 0x6d, 0x31, 0x74, 0x2f, 0x76, 0x71, + 0x61, 0x0a, + 0x09, 0x6d, 0x50, 0x37, 0x37, 0x62, 0x57, 0x31, 0x75, 0x62, 0x6d, 0x31, 0x74, 0x41, 0x51, 0x57, 0x59, 0x6d, + 0x67, 0x45, 0x47, 0x62, 0x57, 0x31, 0x75, 0x5a, 0x31, 0x35, 0x65, 0x58, 0x75, 0x57, 0x43, 0x67, 0x65, 0x4e, + 0x65, 0x58, 0x6c, 0x39, 0x66, 0x58, 0x6c, 0x33, 0x69, 0x67, 0x34, 0x58, 0x6a, 0x58, 0x56, 0x35, 0x65, 0x39, + 0x59, 0x45, 0x68, 0x49, 0x4b, 0x2b, 0x64, 0x6e, 0x36, 0x34, 0x66, 0x49, 0x6e, 0x38, 0x64, 0x48, 0x50, 0x54, + 0x51, 0x0a, + 0x09, 0x30, 0x66, 0x49, 0x63, 0x41, 0x41, 0x41, 0x43, 0x41, 0x53, 0x63, 0x44, 0x6b, 0x77, 0x5a, 0x47, 0x42, + 0x64, 0x55, 0x41, 0x44, 0x41, 0x41, 0x55, 0x41, 0x44, 0x35, 0x41, 0x49, 0x51, 0x45, 0x47, 0x42, 0x78, 0x41, + 0x4b, 0x42, 0x42, 0x49, 0x4f, 0x43, 0x51, 0x4d, 0x47, 0x79, 0x51, 0x30, 0x43, 0x41, 0x49, 0x45, 0x56, 0x41, + 0x51, 0x6b, 0x46, 0x59, 0x67, 0x4d, 0x4a, 0x59, 0x67, 0x73, 0x4e, 0x59, 0x77, 0x39, 0x69, 0x45, 0x32, 0x4d, + 0x52, 0x0a, + 0x09, 0x46, 0x52, 0x44, 0x55, 0x35, 0x50, 0x7a, 0x6b, 0x31, 0x4f, 0x7a, 0x55, 0x37, 0x42, 0x45, 0x35, 0x4d, + 0x51, 0x41, 0x51, 0x39, 0x44, 0x77, 0x38, 0x37, 0x42, 0x63, 0x79, 0x31, 0x44, 0x77, 0x38, 0x78, 0x42, 0x45, + 0x35, 0x4d, 0x41, 0x45, 0x54, 0x45, 0x7a, 0x4d, 0x52, 0x49, 0x78, 0x45, 0x44, 0x49, 0x77, 0x4d, 0x52, 0x49, + 0x78, 0x45, 0x6a, 0x46, 0x53, 0x4d, 0x52, 0x49, 0x78, 0x45, 0x6a, 0x4e, 0x51, 0x52, 0x4b, 0x72, 0x71, 0x53, + 0x71, 0x0a, + 0x09, 0x63, 0x63, 0x4d, 0x33, 0x79, 0x33, 0x4a, 0x78, 0x79, 0x33, 0x4c, 0x4a, 0x42, 0x64, 0x58, 0x2f, 0x41, + 0x41, 0x45, 0x41, 0x2f, 0x62, 0x34, 0x42, 0x35, 0x50, 0x37, 0x52, 0x41, 0x53, 0x2f, 0x2b, 0x48, 0x41, 0x4a, + 0x43, 0x58, 0x76, 0x34, 0x63, 0x41, 0x65, 0x52, 0x65, 0x41, 0x41, 0x41, 0x42, 0x41, 0x58, 0x4d, 0x45, 0x37, + 0x67, 0x4e, 0x53, 0x42, 0x6d, 0x59, 0x41, 0x41, 0x77, 0x41, 0x78, 0x51, 0x41, 0x6b, 0x43, 0x74, 0x41, 0x43, + 0x7a, 0x0a, + 0x09, 0x42, 0x41, 0x4e, 0x45, 0x41, 0x51, 0x51, 0x51, 0x31, 0x4f, 0x77, 0x78, 0x41, 0x42, 0x44, 0x30, 0x37, + 0x44, 0x41, 0x41, 0x53, 0x37, 0x41, 0x4a, 0x56, 0x45, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x62, 0x57, 0x4c, 0x30, + 0x41, 0x42, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x42, 0x41, 0x41, 0x45, 0x41, 0x45, 0x41, 0x34, 0x45, + 0x54, 0x63, 0x34, 0x57, 0x51, 0x45, 0x7a, 0x41, 0x53, 0x4d, 0x43, 0x69, 0x38, 0x66, 0x2b, 0x75, 0x70, 0x6b, + 0x47, 0x0a, + 0x09, 0x5a, 0x76, 0x36, 0x49, 0x41, 0x41, 0x41, 0x43, 0x41, 0x4e, 0x63, 0x46, 0x52, 0x67, 0x4d, 0x70, 0x42, + 0x68, 0x41, 0x41, 0x41, 0x77, 0x41, 0x48, 0x41, 0x4a, 0x4a, 0x41, 0x44, 0x67, 0x59, 0x43, 0x7a, 0x67, 0x51, + 0x41, 0x7a, 0x51, 0x67, 0x42, 0x5a, 0x41, 0x41, 0x46, 0x5a, 0x41, 0x51, 0x49, 0x45, 0x4e, 0x7a, 0x38, 0x31, + 0x4f, 0x77, 0x78, 0x41, 0x42, 0x44, 0x38, 0x50, 0x4f, 0x77, 0x79, 0x4d, 0x41, 0x42, 0x4c, 0x73, 0x41, 0x70, + 0x55, 0x0a, + 0x09, 0x53, 0x37, 0x41, 0x4e, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x49, 0x41, 0x45, 0x41, 0x41, 0x41, + 0x51, 0x41, 0x49, 0x41, 0x41, 0x6a, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x55, 0x75, + 0x77, 0x44, 0x46, 0x52, 0x4c, 0x73, 0x41, 0x31, 0x55, 0x57, 0x30, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x62, 0x53, + 0x37, 0x41, 0x58, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x49, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x49, 0x0a, + 0x09, 0x41, 0x41, 0x67, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x55, 0x75, 0x77, 0x44, + 0x31, 0x52, 0x4c, 0x73, 0x42, 0x6c, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x41, 0x67, 0x41, 0x51, 0x41, 0x41, + 0x42, 0x41, 0x41, 0x67, 0x41, 0x43, 0x50, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x45, + 0x57, 0x41, 0x42, 0x59, 0x41, 0x4a, 0x67, 0x42, 0x57, 0x41, 0x47, 0x63, 0x41, 0x46, 0x77, 0x41, 0x6e, 0x41, + 0x46, 0x0a, + 0x09, 0x63, 0x41, 0x59, 0x49, 0x58, 0x51, 0x45, 0x7a, 0x46, 0x53, 0x4d, 0x6c, 0x4d, 0x78, 0x55, 0x6a, 0x41, + 0x6c, 0x37, 0x4c, 0x79, 0x2f, 0x35, 0x35, 0x79, 0x38, 0x73, 0x47, 0x45, 0x4d, 0x72, 0x4b, 0x79, 0x67, 0x41, + 0x41, 0x41, 0x51, 0x44, 0x5a, 0x41, 0x43, 0x63, 0x46, 0x32, 0x77, 0x54, 0x64, 0x41, 0x42, 0x4d, 0x41, 0x50, + 0x6b, 0x41, 0x69, 0x44, 0x51, 0x77, 0x4b, 0x41, 0x77, 0x4c, 0x50, 0x42, 0x41, 0x43, 0x63, 0x42, 0x67, 0x7a, + 0x50, 0x0a, + 0x09, 0x44, 0x67, 0x71, 0x63, 0x45, 0x67, 0x59, 0x51, 0x43, 0x42, 0x51, 0x53, 0x44, 0x67, 0x30, 0x4d, 0x43, + 0x41, 0x51, 0x44, 0x41, 0x67, 0x67, 0x4a, 0x42, 0x51, 0x38, 0x41, 0x46, 0x42, 0x44, 0x63, 0x50, 0x4d, 0x51, + 0x79, 0x46, 0x7a, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x55, 0x50, 0x4d, 0x77, 0x79, 0x2f, 0x44, 0x7a, 0x73, 0x45, + 0x50, 0x34, 0x38, 0x37, 0x44, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x77, 0x45, 0x79, 0x45, 0x42, 0x46, 0x77, 0x63, + 0x68, 0x0a, + 0x09, 0x46, 0x53, 0x45, 0x48, 0x49, 0x52, 0x55, 0x68, 0x41, 0x53, 0x63, 0x33, 0x49, 0x54, 0x55, 0x68, 0x4e, + 0x79, 0x48, 0x5a, 0x41, 0x77, 0x51, 0x42, 0x41, 0x48, 0x32, 0x75, 0x41, 0x53, 0x2f, 0x2b, 0x53, 0x4d, 0x4d, + 0x43, 0x65, 0x2f, 0x7a, 0x36, 0x2f, 0x76, 0x35, 0x39, 0x72, 0x76, 0x37, 0x56, 0x41, 0x62, 0x62, 0x44, 0x2f, + 0x59, 0x63, 0x44, 0x6f, 0x67, 0x45, 0x37, 0x5a, 0x74, 0x57, 0x6f, 0x38, 0x4b, 0x72, 0x2b, 0x78, 0x32, 0x62, + 0x54, 0x0a, + 0x09, 0x71, 0x76, 0x41, 0x41, 0x41, 0x67, 0x41, 0x49, 0x41, 0x41, 0x41, 0x48, 0x53, 0x41, 0x58, 0x56, 0x41, + 0x41, 0x38, 0x41, 0x45, 0x77, 0x43, 0x48, 0x51, 0x44, 0x6b, 0x52, 0x45, 0x51, 0x34, 0x50, 0x44, 0x68, 0x41, + 0x52, 0x44, 0x77, 0x38, 0x4f, 0x44, 0x52, 0x45, 0x50, 0x44, 0x67, 0x77, 0x52, 0x44, 0x67, 0x38, 0x4f, 0x51, + 0x67, 0x57, 0x56, 0x41, 0x77, 0x75, 0x56, 0x45, 0x51, 0x47, 0x56, 0x45, 0x4a, 0x55, 0x41, 0x67, 0x52, 0x45, + 0x48, 0x0a, + 0x09, 0x6c, 0x51, 0x4f, 0x74, 0x44, 0x51, 0x6b, 0x52, 0x45, 0x41, 0x38, 0x4e, 0x44, 0x41, 0x55, 0x4f, 0x43, + 0x67, 0x41, 0x45, 0x43, 0x41, 0x59, 0x43, 0x48, 0x42, 0x49, 0x4b, 0x44, 0x68, 0x51, 0x51, 0x31, 0x4e, 0x51, + 0x38, 0x37, 0x44, 0x4c, 0x55, 0x78, 0x4d, 0x51, 0x52, 0x45, 0x68, 0x63, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x50, + 0x4f, 0x7a, 0x73, 0x78, 0x50, 0x54, 0x73, 0x37, 0x42, 0x44, 0x75, 0x45, 0x4f, 0x34, 0x77, 0x53, 0x31, 0x4e, + 0x59, 0x0a, + 0x09, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, 0x46, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, + 0x41, 0x58, 0x74, 0x57, 0x53, 0x4b, 0x79, 0x67, 0x42, 0x55, 0x42, 0x41, 0x56, 0x31, 0x41, 0x45, 0x32, 0x63, + 0x52, 0x64, 0x78, 0x42, 0x33, 0x45, 0x59, 0x59, 0x4d, 0x68, 0x52, 0x43, 0x57, 0x45, 0x5a, 0x41, 0x56, 0x6f, + 0x42, 0x57, 0x2f, 0x46, 0x51, 0x6c, 0x64, 0x41, 0x52, 0x55, 0x68, 0x45, 0x53, 0x45, 0x56, 0x49, 0x52, 0x45, + 0x68, 0x0a, + 0x09, 0x46, 0x53, 0x45, 0x52, 0x49, 0x51, 0x4d, 0x6a, 0x41, 0x52, 0x63, 0x42, 0x49, 0x52, 0x45, 0x48, 0x4e, + 0x66, 0x30, 0x62, 0x41, 0x73, 0x66, 0x39, 0x4f, 0x51, 0x4c, 0x34, 0x2f, 0x44, 0x33, 0x39, 0x38, 0x4b, 0x44, + 0x4e, 0x41, 0x6e, 0x47, 0x4c, 0x2f, 0x72, 0x59, 0x42, 0x79, 0x77, 0x58, 0x56, 0x71, 0x76, 0x35, 0x47, 0x71, + 0x76, 0x33, 0x6a, 0x71, 0x67, 0x46, 0x2f, 0x2f, 0x6f, 0x45, 0x46, 0x31, 0x5a, 0x37, 0x38, 0x38, 0x41, 0x4d, + 0x51, 0x0a, + 0x09, 0x41, 0x41, 0x4d, 0x41, 0x5a, 0x76, 0x2b, 0x36, 0x42, 0x65, 0x55, 0x47, 0x46, 0x77, 0x41, 0x4a, 0x41, + 0x42, 0x4d, 0x41, 0x4b, 0x77, 0x43, 0x65, 0x51, 0x44, 0x77, 0x64, 0x48, 0x78, 0x6f, 0x4e, 0x4b, 0x79, 0x77, + 0x54, 0x43, 0x67, 0x45, 0x41, 0x42, 0x41, 0x30, 0x70, 0x4a, 0x69, 0x41, 0x55, 0x44, 0x51, 0x51, 0x71, 0x4a, + 0x68, 0x34, 0x61, 0x42, 0x4a, 0x55, 0x6d, 0x44, 0x5a, 0x55, 0x61, 0x6b, 0x53, 0x61, 0x4d, 0x4c, 0x43, 0x73, + 0x73, 0x0a, + 0x09, 0x4b, 0x68, 0x51, 0x58, 0x45, 0x43, 0x41, 0x65, 0x49, 0x78, 0x4d, 0x4b, 0x41, 0x51, 0x41, 0x45, 0x48, + 0x53, 0x6b, 0x51, 0x42, 0x78, 0x38, 0x48, 0x47, 0x53, 0x4d, 0x7a, 0x45, 0x42, 0x6b, 0x58, 0x45, 0x43, 0x77, + 0x51, 0x2f, 0x4f, 0x7a, 0x38, 0x37, 0x4d, 0x41, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x46, 0x7a, 0x6b, 0x53, 0x4f, + 0x54, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x45, 0x54, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x6b, 0x39, 0x4f, 0x77, + 0x51, 0x0a, + 0x09, 0x37, 0x68, 0x44, 0x41, 0x45, 0x4d, 0x41, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x45, 0x6a, 0x6b, 0x53, 0x46, + 0x7a, 0x6b, 0x53, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x77, 0x51, 0x43, 0x70, 0x58, 0x41, 0x46, 0x6f, + 0x56, 0x56, 0x78, 0x6c, 0x56, 0x49, 0x57, 0x6f, 0x56, 0x5a, 0x53, 0x46, 0x37, 0x46, 0x58, 0x59, 0x63, 0x64, + 0x53, 0x45, 0x4a, 0x52, 0x68, 0x4e, 0x5a, 0x41, 0x46, 0x59, 0x54, 0x61, 0x67, 0x42, 0x6b, 0x45, 0x32, 0x51, + 0x63, 0x0a, + 0x09, 0x61, 0x69, 0x68, 0x38, 0x41, 0x48, 0x4d, 0x54, 0x64, 0x68, 0x78, 0x36, 0x4b, 0x41, 0x74, 0x64, 0x41, + 0x56, 0x30, 0x4a, 0x41, 0x52, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x41, 0x45, 0x54, 0x51, 0x6d, 0x4a, 0x79, 0x34, + 0x42, 0x49, 0x79, 0x49, 0x41, 0x45, 0x52, 0x51, 0x57, 0x46, 0x77, 0x63, 0x6d, 0x41, 0x6a, 0x55, 0x51, 0x41, + 0x43, 0x45, 0x79, 0x46, 0x68, 0x63, 0x33, 0x46, 0x77, 0x63, 0x57, 0x45, 0x68, 0x55, 0x51, 0x41, 0x43, 0x45, + 0x69, 0x0a, + 0x09, 0x4a, 0x69, 0x63, 0x48, 0x4a, 0x77, 0x53, 0x32, 0x2f, 0x54, 0x4d, 0x2b, 0x6f, 0x56, 0x2f, 0x63, 0x41, + 0x51, 0x45, 0x6e, 0x65, 0x54, 0x32, 0x68, 0x58, 0x39, 0x7a, 0x2b, 0x2f, 0x53, 0x63, 0x6e, 0x68, 0x6b, 0x35, + 0x50, 0x41, 0x58, 0x6b, 0x42, 0x4f, 0x34, 0x4c, 0x64, 0x56, 0x36, 0x4a, 0x6d, 0x71, 0x6b, 0x35, 0x51, 0x2f, + 0x6f, 0x6a, 0x2b, 0x78, 0x6f, 0x44, 0x64, 0x57, 0x36, 0x4a, 0x6e, 0x42, 0x46, 0x6a, 0x38, 0x73, 0x6b, 0x42, + 0x44, 0x0a, + 0x09, 0x41, 0x55, 0x67, 0x42, 0x47, 0x6e, 0x43, 0x34, 0x75, 0x45, 0x42, 0x44, 0x2f, 0x72, 0x6a, 0x2b, 0x35, + 0x58, 0x43, 0x38, 0x52, 0x4a, 0x35, 0x6d, 0x41, 0x51, 0x69, 0x67, 0x41, 0x57, 0x49, 0x42, 0x70, 0x55, 0x31, + 0x4c, 0x76, 0x31, 0x6e, 0x47, 0x5a, 0x2f, 0x37, 0x32, 0x6e, 0x76, 0x36, 0x66, 0x2f, 0x6c, 0x74, 0x4c, 0x53, + 0x37, 0x39, 0x59, 0x41, 0x41, 0x4d, 0x41, 0x33, 0x51, 0x44, 0x64, 0x42, 0x63, 0x38, 0x44, 0x37, 0x67, 0x41, + 0x4c, 0x0a, + 0x09, 0x41, 0x42, 0x63, 0x41, 0x4c, 0x77, 0x44, 0x2f, 0x51, 0x42, 0x30, 0x74, 0x47, 0x78, 0x55, 0x4a, 0x49, + 0x51, 0x4d, 0x41, 0x4a, 0x42, 0x67, 0x45, 0x46, 0x51, 0x38, 0x6e, 0x49, 0x52, 0x55, 0x62, 0x44, 0x79, 0x45, + 0x77, 0x44, 0x41, 0x41, 0x6b, 0x47, 0x42, 0x49, 0x47, 0x4b, 0x68, 0x49, 0x65, 0x4d, 0x42, 0x44, 0x55, 0x78, + 0x4e, 0x54, 0x45, 0x45, 0x54, 0x6b, 0x35, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x55, 0x78, 0x4e, 0x54, + 0x45, 0x0a, + 0x09, 0x45, 0x4d, 0x41, 0x52, 0x45, 0x68, 0x63, 0x35, 0x45, 0x6a, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x77, 0x51, + 0x4c, 0x34, 0x46, 0x41, 0x67, 0x55, 0x44, 0x42, 0x51, 0x51, 0x41, 0x42, 0x51, 0x41, 0x47, 0x41, 0x41, 0x63, + 0x46, 0x43, 0x41, 0x55, 0x4a, 0x42, 0x51, 0x6f, 0x4b, 0x45, 0x41, 0x38, 0x52, 0x44, 0x78, 0x49, 0x50, 0x45, + 0x77, 0x6f, 0x55, 0x46, 0x51, 0x49, 0x56, 0x41, 0x78, 0x55, 0x45, 0x45, 0x41, 0x55, 0x51, 0x42, 0x68, 0x41, + 0x48, 0x0a, + 0x09, 0x46, 0x51, 0x67, 0x56, 0x43, 0x52, 0x55, 0x4b, 0x47, 0x67, 0x34, 0x61, 0x44, 0x78, 0x6f, 0x51, 0x48, + 0x78, 0x45, 0x66, 0x45, 0x68, 0x38, 0x54, 0x47, 0x68, 0x51, 0x61, 0x46, 0x52, 0x6f, 0x57, 0x4a, 0x41, 0x49, + 0x6b, 0x41, 0x79, 0x51, 0x45, 0x49, 0x41, 0x55, 0x67, 0x42, 0x69, 0x41, 0x48, 0x4a, 0x41, 0x67, 0x6b, 0x43, + 0x53, 0x51, 0x4b, 0x4b, 0x67, 0x34, 0x71, 0x44, 0x79, 0x6f, 0x51, 0x4c, 0x78, 0x45, 0x76, 0x45, 0x69, 0x38, + 0x54, 0x0a, + 0x09, 0x4b, 0x68, 0x51, 0x71, 0x46, 0x53, 0x6f, 0x57, 0x4e, 0x51, 0x49, 0x31, 0x41, 0x7a, 0x55, 0x45, 0x4d, + 0x41, 0x55, 0x77, 0x42, 0x6a, 0x41, 0x48, 0x4e, 0x51, 0x67, 0x31, 0x43, 0x54, 0x55, 0x4b, 0x4f, 0x67, 0x34, + 0x36, 0x44, 0x7a, 0x6f, 0x51, 0x50, 0x78, 0x45, 0x2f, 0x45, 0x6a, 0x38, 0x54, 0x4f, 0x68, 0x51, 0x36, 0x46, + 0x54, 0x6f, 0x57, 0x52, 0x51, 0x4a, 0x46, 0x41, 0x30, 0x55, 0x45, 0x51, 0x41, 0x56, 0x41, 0x42, 0x6b, 0x41, + 0x48, 0x0a, + 0x09, 0x52, 0x51, 0x68, 0x46, 0x43, 0x55, 0x55, 0x4b, 0x53, 0x67, 0x35, 0x4b, 0x44, 0x30, 0x6f, 0x51, 0x54, + 0x78, 0x46, 0x50, 0x45, 0x6b, 0x38, 0x54, 0x53, 0x68, 0x52, 0x4b, 0x46, 0x55, 0x6f, 0x57, 0x56, 0x72, 0x51, + 0x66, 0x73, 0x43, 0x43, 0x77, 0x49, 0x62, 0x41, 0x69, 0x73, 0x43, 0x61, 0x77, 0x4a, 0x37, 0x41, 0x6f, 0x74, + 0x43, 0x6b, 0x49, 0x58, 0x51, 0x46, 0x64, 0x41, 0x52, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, + 0x6d, 0x0a, + 0x09, 0x49, 0x79, 0x49, 0x47, 0x42, 0x79, 0x34, 0x42, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, + 0x7a, 0x49, 0x32, 0x46, 0x77, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x54, 0x51, 0x32, 0x4d, 0x7a, 0x49, + 0x57, 0x46, 0x7a, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x57, 0x46, 0x52, 0x51, 0x47, 0x49, 0x79, 0x49, 0x6d, 0x41, + 0x35, 0x4d, 0x78, 0x68, 0x6c, 0x52, 0x6c, 0x67, 0x48, 0x5a, 0x5a, 0x55, 0x6f, 0x58, 0x45, 0x4d, 0x59, 0x56, + 0x56, 0x0a, + 0x09, 0x5a, 0x6e, 0x39, 0x32, 0x57, 0x56, 0x4b, 0x47, 0x6b, 0x45, 0x61, 0x64, 0x58, 0x6f, 0x69, 0x36, 0x70, + 0x34, 0x5a, 0x66, 0x6d, 0x55, 0x68, 0x45, 0x6e, 0x6d, 0x47, 0x47, 0x76, 0x4b, 0x65, 0x47, 0x58, 0x70, 0x55, + 0x43, 0x4c, 0x31, 0x68, 0x61, 0x68, 0x32, 0x6c, 0x6c, 0x68, 0x6f, 0x63, 0x33, 0x57, 0x46, 0x69, 0x45, 0x61, + 0x6d, 0x57, 0x47, 0x69, 0x42, 0x61, 0x48, 0x66, 0x39, 0x2b, 0x6d, 0x72, 0x39, 0x68, 0x2b, 0x69, 0x6f, 0x71, + 0x44, 0x0a, + 0x09, 0x34, 0x61, 0x65, 0x76, 0x31, 0x6e, 0x63, 0x41, 0x41, 0x41, 0x49, 0x41, 0x32, 0x51, 0x41, 0x41, 0x42, + 0x64, 0x73, 0x46, 0x42, 0x41, 0x41, 0x4c, 0x41, 0x41, 0x38, 0x41, 0x4c, 0x6b, 0x41, 0x59, 0x42, 0x64, 0x41, + 0x48, 0x41, 0x35, 0x77, 0x41, 0x30, 0x41, 0x6b, 0x42, 0x44, 0x4a, 0x77, 0x4f, 0x44, 0x51, 0x49, 0x56, 0x42, + 0x41, 0x41, 0x58, 0x44, 0x41, 0x67, 0x56, 0x43, 0x67, 0x59, 0x51, 0x45, 0x4e, 0x51, 0x38, 0x37, 0x44, 0x4c, + 0x38, 0x0a, + 0x09, 0x50, 0x4f, 0x77, 0x79, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x4e, 0x51, 0x38, 0x37, 0x50, 0x77, 0x38, 0x37, + 0x44, 0x41, 0x42, 0x45, 0x53, 0x45, 0x56, 0x49, 0x52, 0x45, 0x6a, 0x45, 0x53, 0x45, 0x31, 0x49, 0x52, 0x45, + 0x42, 0x49, 0x52, 0x55, 0x68, 0x41, 0x36, 0x34, 0x43, 0x4c, 0x66, 0x33, 0x54, 0x71, 0x50, 0x33, 0x54, 0x41, + 0x69, 0x33, 0x39, 0x30, 0x77, 0x55, 0x43, 0x2b, 0x76, 0x34, 0x46, 0x42, 0x50, 0x35, 0x39, 0x71, 0x76, 0x35, + 0x39, 0x0a, + 0x09, 0x41, 0x59, 0x4f, 0x71, 0x41, 0x59, 0x50, 0x37, 0x70, 0x71, 0x6f, 0x41, 0x41, 0x67, 0x44, 0x5a, 0x41, + 0x41, 0x41, 0x46, 0x32, 0x77, 0x53, 0x6f, 0x41, 0x41, 0x59, 0x41, 0x43, 0x67, 0x42, 0x55, 0x51, 0x43, 0x34, + 0x43, 0x6e, 0x41, 0x4d, 0x45, 0x41, 0x77, 0x47, 0x63, 0x41, 0x41, 0x45, 0x45, 0x42, 0x41, 0x4d, 0x42, 0x6e, + 0x41, 0x49, 0x42, 0x42, 0x51, 0x59, 0x46, 0x41, 0x4a, 0x77, 0x47, 0x42, 0x55, 0x49, 0x46, 0x42, 0x41, 0x49, + 0x42, 0x0a, + 0x09, 0x41, 0x41, 0x55, 0x44, 0x30, 0x51, 0x61, 0x6e, 0x42, 0x35, 0x77, 0x4a, 0x41, 0x51, 0x67, 0x43, 0x41, + 0x43, 0x51, 0x48, 0x42, 0x43, 0x4d, 0x4c, 0x45, 0x50, 0x77, 0x38, 0x37, 0x44, 0x49, 0x79, 0x4f, 0x54, 0x45, + 0x41, 0x4c, 0x2b, 0x7a, 0x30, 0x37, 0x42, 0x63, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x45, 0x37, + 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x45, 0x37, 0x56, 0x6b, + 0x69, 0x0a, + 0x09, 0x43, 0x51, 0x49, 0x56, 0x41, 0x54, 0x55, 0x42, 0x41, 0x53, 0x45, 0x56, 0x49, 0x51, 0x58, 0x62, 0x2f, + 0x45, 0x41, 0x44, 0x77, 0x50, 0x72, 0x2b, 0x42, 0x51, 0x4c, 0x36, 0x2f, 0x67, 0x55, 0x43, 0x2b, 0x76, 0x34, + 0x44, 0x2b, 0x50, 0x37, 0x72, 0x2f, 0x75, 0x36, 0x79, 0x41, 0x58, 0x43, 0x71, 0x41, 0x57, 0x2f, 0x38, 0x41, + 0x71, 0x6f, 0x41, 0x41, 0x41, 0x49, 0x41, 0x32, 0x51, 0x41, 0x41, 0x42, 0x64, 0x73, 0x45, 0x71, 0x41, 0x41, + 0x47, 0x0a, + 0x09, 0x41, 0x41, 0x6f, 0x41, 0x56, 0x6b, 0x41, 0x76, 0x42, 0x70, 0x77, 0x41, 0x42, 0x67, 0x4d, 0x45, 0x41, + 0x77, 0x57, 0x63, 0x42, 0x41, 0x51, 0x44, 0x41, 0x4a, 0x77, 0x42, 0x41, 0x67, 0x45, 0x47, 0x6e, 0x41, 0x55, + 0x47, 0x41, 0x67, 0x49, 0x42, 0x51, 0x67, 0x59, 0x46, 0x41, 0x77, 0x49, 0x41, 0x42, 0x51, 0x54, 0x52, 0x41, + 0x61, 0x63, 0x48, 0x6e, 0x41, 0x67, 0x47, 0x42, 0x77, 0x49, 0x6b, 0x43, 0x51, 0x51, 0x41, 0x49, 0x77, 0x73, + 0x51, 0x0a, + 0x09, 0x2f, 0x44, 0x77, 0x38, 0x37, 0x44, 0x49, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x50, 0x54, 0x73, 0x46, + 0x7a, 0x6b, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x4f, 0x30, + 0x48, 0x45, 0x41, 0x54, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x56, 0x6b, 0x69, 0x45, 0x7a, 0x55, 0x42, 0x46, + 0x51, 0x45, 0x31, 0x41, 0x51, 0x45, 0x56, 0x49, 0x54, 0x58, 0x5a, 0x42, 0x51, 0x4c, 0x36, 0x2f, 0x67, 0x50, + 0x42, 0x0a, + 0x09, 0x41, 0x55, 0x48, 0x36, 0x2f, 0x67, 0x50, 0x34, 0x73, 0x50, 0x36, 0x52, 0x71, 0x76, 0x36, 0x51, 0x73, + 0x67, 0x45, 0x53, 0x2f, 0x63, 0x65, 0x71, 0x71, 0x67, 0x41, 0x41, 0x41, 0x51, 0x42, 0x53, 0x41, 0x41, 0x41, + 0x45, 0x77, 0x77, 0x58, 0x56, 0x41, 0x42, 0x67, 0x41, 0x78, 0x6b, 0x42, 0x47, 0x45, 0x41, 0x49, 0x52, 0x46, + 0x68, 0x45, 0x50, 0x41, 0x67, 0x34, 0x50, 0x46, 0x68, 0x59, 0x52, 0x44, 0x77, 0x49, 0x51, 0x44, 0x77, 0x67, + 0x4e, 0x0a, + 0x09, 0x43, 0x41, 0x34, 0x43, 0x44, 0x51, 0x30, 0x49, 0x51, 0x67, 0x38, 0x4c, 0x43, 0x51, 0x51, 0x41, 0x30, + 0x78, 0x63, 0x47, 0x45, 0x67, 0x76, 0x54, 0x46, 0x41, 0x6b, 0x51, 0x44, 0x59, 0x45, 0x43, 0x44, 0x41, 0x6b, + 0x4f, 0x41, 0x77, 0x55, 0x57, 0x44, 0x77, 0x4d, 0x56, 0x45, 0x68, 0x41, 0x44, 0x41, 0x42, 0x46, 0x6d, 0x45, + 0x77, 0x42, 0x6c, 0x41, 0x52, 0x77, 0x4e, 0x5a, 0x67, 0x6f, 0x46, 0x5a, 0x51, 0x63, 0x44, 0x47, 0x52, 0x44, + 0x55, 0x0a, + 0x09, 0x50, 0x4f, 0x77, 0x79, 0x37, 0x50, 0x7a, 0x73, 0x4d, 0x75, 0x77, 0x53, 0x46, 0x7a, 0x6b, 0x53, 0x4f, + 0x54, 0x6b, 0x52, 0x46, 0x7a, 0x6b, 0x78, 0x41, 0x43, 0x2f, 0x6b, 0x4d, 0x74, 0x51, 0x38, 0x37, 0x44, 0x4c, + 0x55, 0x50, 0x4f, 0x77, 0x79, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, 0x41, 0x63, 0x51, 0x42, + 0x65, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x31, + 0x5a, 0x0a, + 0x09, 0x49, 0x67, 0x46, 0x4c, 0x73, 0x41, 0x78, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x47, 0x66, 0x2f, 0x41, 0x41, + 0x41, 0x45, 0x41, 0x47, 0x51, 0x41, 0x5a, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x55, 0x41, + 0x6f, 0x68, 0x67, 0x2b, 0x51, 0x44, 0x36, 0x59, 0x50, 0x6f, 0x41, 0x2b, 0x31, 0x44, 0x77, 0x55, 0x6e, 0x44, + 0x43, 0x63, 0x4e, 0x4a, 0x77, 0x34, 0x70, 0x45, 0x43, 0x67, 0x52, 0x4b, 0x42, 0x49, 0x33, 0x44, 0x6a, 0x6b, + 0x51, 0x0a, + 0x09, 0x68, 0x77, 0x79, 0x49, 0x45, 0x71, 0x59, 0x4e, 0x70, 0x51, 0x36, 0x71, 0x45, 0x4b, 0x6b, 0x52, 0x44, + 0x6c, 0x30, 0x41, 0x58, 0x51, 0x45, 0x68, 0x45, 0x53, 0x4d, 0x52, 0x49, 0x54, 0x55, 0x68, 0x4e, 0x53, 0x63, + 0x68, 0x4e, 0x53, 0x45, 0x42, 0x4d, 0x77, 0x6b, 0x42, 0x4d, 0x77, 0x45, 0x68, 0x46, 0x53, 0x45, 0x48, 0x46, + 0x53, 0x45, 0x45, 0x6a, 0x66, 0x35, 0x6a, 0x79, 0x66, 0x35, 0x67, 0x41, 0x61, 0x42, 0x55, 0x2f, 0x72, 0x51, + 0x42, 0x0a, + 0x09, 0x43, 0x50, 0x37, 0x44, 0x76, 0x67, 0x46, 0x37, 0x41, 0x58, 0x6d, 0x2f, 0x2f, 0x73, 0x49, 0x42, 0x43, + 0x50, 0x36, 0x31, 0x56, 0x41, 0x47, 0x66, 0x41, 0x63, 0x66, 0x2b, 0x4f, 0x51, 0x48, 0x48, 0x65, 0x7a, 0x4f, + 0x62, 0x65, 0x77, 0x4a, 0x4b, 0x2f, 0x55, 0x51, 0x43, 0x76, 0x50, 0x32, 0x32, 0x65, 0x35, 0x73, 0x7a, 0x41, + 0x41, 0x41, 0x42, 0x41, 0x4b, 0x37, 0x2b, 0x56, 0x67, 0x54, 0x6c, 0x42, 0x47, 0x41, 0x41, 0x49, 0x41, 0x42, + 0x4e, 0x0a, + 0x09, 0x51, 0x43, 0x55, 0x54, 0x47, 0x52, 0x38, 0x44, 0x46, 0x67, 0x59, 0x44, 0x43, 0x51, 0x77, 0x44, 0x41, + 0x52, 0x49, 0x50, 0x42, 0x6f, 0x63, 0x63, 0x46, 0x6f, 0x77, 0x4b, 0x41, 0x62, 0x77, 0x41, 0x76, 0x53, 0x45, + 0x5a, 0x43, 0x52, 0x49, 0x4a, 0x43, 0x41, 0x74, 0x4f, 0x48, 0x77, 0x49, 0x49, 0x41, 0x45, 0x59, 0x68, 0x45, + 0x50, 0x7a, 0x73, 0x4d, 0x76, 0x54, 0x73, 0x78, 0x42, 0x49, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x35, 0x4f, 0x51, + 0x79, 0x0a, + 0x09, 0x39, 0x44, 0x7a, 0x73, 0x33, 0x4d, 0x51, 0x52, 0x46, 0x7a, 0x6b, 0x52, 0x45, 0x68, 0x63, 0x35, 0x4d, + 0x4c, 0x59, 0x66, 0x49, 0x6d, 0x41, 0x69, 0x7a, 0x79, 0x49, 0x44, 0x41, 0x56, 0x30, 0x54, 0x45, 0x54, 0x4d, + 0x52, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x45, 0x54, 0x4d, 0x52, 0x46, 0x42, 0x59, 0x7a, 0x4d, + 0x6a, 0x59, 0x33, 0x46, 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4a, 0x77, 0x34, 0x42, 0x49, 0x79, 0x49, + 0x6d, 0x0a, + 0x09, 0x4a, 0x78, 0x47, 0x75, 0x75, 0x49, 0x71, 0x48, 0x6c, 0x4a, 0x57, 0x34, 0x49, 0x79, 0x55, 0x4a, 0x49, + 0x42, 0x77, 0x70, 0x53, 0x53, 0x4e, 0x46, 0x55, 0x67, 0x38, 0x79, 0x6b, 0x57, 0x4a, 0x6d, 0x6a, 0x79, 0x72, + 0x2b, 0x56, 0x67, 0x59, 0x4b, 0x2f, 0x55, 0x69, 0x52, 0x6c, 0x4b, 0x69, 0x6f, 0x41, 0x6f, 0x33, 0x38, 0x6f, + 0x6a, 0x77, 0x35, 0x43, 0x77, 0x79, 0x55, 0x46, 0x78, 0x5a, 0x4f, 0x55, 0x45, 0x39, 0x50, 0x54, 0x6b, 0x37, + 0x39, 0x0a, + 0x09, 0x31, 0x77, 0x41, 0x41, 0x41, 0x67, 0x42, 0x6f, 0x2f, 0x2b, 0x63, 0x44, 0x77, 0x51, 0x55, 0x74, 0x41, + 0x42, 0x30, 0x41, 0x4b, 0x51, 0x42, 0x69, 0x51, 0x42, 0x6b, 0x41, 0x4a, 0x79, 0x45, 0x4a, 0x47, 0x77, 0x59, + 0x6e, 0x46, 0x51, 0x59, 0x50, 0x49, 0x52, 0x73, 0x50, 0x46, 0x64, 0x55, 0x71, 0x44, 0x43, 0x51, 0x44, 0x41, + 0x42, 0x34, 0x53, 0x4a, 0x42, 0x67, 0x71, 0x45, 0x4e, 0x54, 0x4d, 0x33, 0x4d, 0x77, 0x35, 0x4f, 0x52, 0x45, + 0x35, 0x0a, + 0x09, 0x4d, 0x51, 0x41, 0x51, 0x35, 0x4d, 0x7a, 0x63, 0x7a, 0x42, 0x44, 0x4f, 0x45, 0x4d, 0x34, 0x52, 0x45, + 0x6a, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x77, 0x41, 0x55, 0x75, 0x77, 0x44, 0x46, 0x52, 0x4c, 0x73, 0x41, 0x74, + 0x55, 0x57, 0x30, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x62, 0x53, 0x37, 0x41, 0x51, 0x56, 0x46, 0x74, 0x4c, 0x73, + 0x42, 0x52, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x43, 0x6f, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x43, 0x6f, + 0x41, 0x0a, + 0x09, 0x4b, 0x76, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x50, 0x67, 0x45, 0x31, 0x4e, + 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x7a, 0x4d, 0x68, 0x49, + 0x52, 0x45, 0x41, 0x41, 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x42, 0x49, 0x7a, 0x4d, 0x68, 0x59, 0x48, 0x4e, + 0x43, 0x59, 0x6a, 0x49, 0x67, 0x49, 0x56, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x68, 0x49, 0x43, 0x39, 0x41, 0x38, + 0x50, 0x0a, + 0x09, 0x53, 0x55, 0x67, 0x33, 0x6b, 0x43, 0x51, 0x6b, 0x4d, 0x4a, 0x42, 0x6c, 0x74, 0x4e, 0x62, 0x2b, 0x33, + 0x39, 0x57, 0x59, 0x79, 0x39, 0x32, 0x69, 0x5a, 0x59, 0x49, 0x4c, 0x56, 0x30, 0x39, 0x74, 0x6a, 0x56, 0x5a, + 0x51, 0x62, 0x59, 0x30, 0x43, 0x62, 0x56, 0x65, 0x6a, 0x53, 0x34, 0x47, 0x44, 0x64, 0x43, 0x77, 0x66, 0x50, + 0x6d, 0x4c, 0x2b, 0x79, 0x76, 0x37, 0x35, 0x2f, 0x72, 0x48, 0x2b, 0x52, 0x74, 0x69, 0x6a, 0x78, 0x67, 0x45, + 0x42, 0x0a, + 0x09, 0x57, 0x2b, 0x42, 0x30, 0x66, 0x66, 0x37, 0x2b, 0x7a, 0x33, 0x52, 0x37, 0x41, 0x51, 0x51, 0x41, 0x41, + 0x41, 0x45, 0x41, 0x47, 0x66, 0x35, 0x33, 0x42, 0x54, 0x73, 0x46, 0x77, 0x51, 0x41, 0x4c, 0x41, 0x46, 0x31, + 0x41, 0x46, 0x41, 0x6f, 0x45, 0x44, 0x41, 0x49, 0x46, 0x42, 0x77, 0x49, 0x41, 0x42, 0x77, 0x77, 0x4b, 0x42, + 0x51, 0x51, 0x44, 0x41, 0x51, 0x41, 0x47, 0x42, 0x67, 0x67, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x46, 0x7a, 0x6b, + 0x78, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x45, 0x31, 0x4d, 0x77, 0x51, 0x7a, 0x68, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x77, 0x51, + 0x44, 0x42, 0x52, 0x41, 0x31, 0x59, 0x46, 0x55, 0x41, 0x56, 0x61, 0x43, 0x6e, 0x4d, 0x44, 0x63, 0x41, 0x4e, + 0x32, 0x42, 0x48, 0x55, 0x46, 0x63, 0x41, 0x56, 0x36, 0x43, 0x6f, 0x41, 0x44, 0x67, 0x41, 0x55, 0x4d, 0x57, + 0x67, 0x6c, 0x2f, 0x41, 0x6e, 0x38, 0x44, 0x63, 0x41, 0x56, 0x77, 0x42, 0x6e, 0x73, 0x4a, 0x64, 0x41, 0x75, + 0x50, 0x0a, + 0x09, 0x41, 0x6f, 0x38, 0x44, 0x67, 0x41, 0x57, 0x41, 0x42, 0x67, 0x74, 0x64, 0x41, 0x56, 0x30, 0x54, 0x49, + 0x52, 0x55, 0x68, 0x43, 0x51, 0x45, 0x68, 0x46, 0x53, 0x45, 0x31, 0x43, 0x51, 0x45, 0x33, 0x42, 0x4f, 0x72, + 0x38, 0x51, 0x51, 0x4b, 0x67, 0x2f, 0x55, 0x6f, 0x44, 0x37, 0x2f, 0x72, 0x65, 0x41, 0x74, 0x58, 0x39, 0x53, + 0x51, 0x58, 0x42, 0x77, 0x66, 0x30, 0x7a, 0x2f, 0x51, 0x54, 0x41, 0x6c, 0x51, 0x4d, 0x68, 0x41, 0x75, 0x4d, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x6e, 0x50, 0x35, 0x33, 0x42, 0x58, 0x45, 0x46, 0x77, 0x51, 0x41, 0x48, 0x41, + 0x42, 0x35, 0x41, 0x44, 0x77, 0x59, 0x43, 0x31, 0x77, 0x54, 0x57, 0x41, 0x4b, 0x38, 0x49, 0x41, 0x32, 0x63, + 0x42, 0x42, 0x57, 0x63, 0x41, 0x43, 0x42, 0x44, 0x55, 0x37, 0x4e, 0x54, 0x73, 0x4d, 0x51, 0x41, 0x51, 0x2f, + 0x4f, 0x7a, 0x73, 0x4d, 0x6a, 0x41, 0x54, 0x49, 0x52, 0x45, 0x6a, 0x45, 0x53, 0x45, 0x52, 0x49, 0x35, 0x77, + 0x45, 0x0a, + 0x09, 0x31, 0x66, 0x44, 0x39, 0x43, 0x75, 0x38, 0x46, 0x77, 0x66, 0x69, 0x32, 0x42, 0x6e, 0x33, 0x35, 0x67, + 0x77, 0x41, 0x41, 0x41, 0x66, 0x2f, 0x68, 0x2f, 0x2f, 0x41, 0x45, 0x71, 0x67, 0x51, 0x76, 0x41, 0x43, 0x4d, + 0x41, 0x79, 0x30, 0x41, 0x78, 0x43, 0x77, 0x49, 0x56, 0x48, 0x78, 0x34, 0x44, 0x41, 0x41, 0x6a, 0x61, 0x44, + 0x78, 0x6f, 0x57, 0x41, 0x4e, 0x6b, 0x69, 0x32, 0x41, 0x2f, 0x56, 0x47, 0x41, 0x77, 0x65, 0x47, 0x78, 0x6f, + 0x5a, 0x0a, + 0x09, 0x47, 0x42, 0x63, 0x47, 0x4a, 0x42, 0x49, 0x42, 0x41, 0x41, 0x73, 0x43, 0x42, 0x43, 0x4d, 0x57, 0x46, + 0x51, 0x55, 0x69, 0x48, 0x78, 0x49, 0x4d, 0x49, 0x78, 0x4a, 0x6f, 0x42, 0x53, 0x4d, 0x66, 0x4a, 0x42, 0x44, + 0x55, 0x31, 0x4e, 0x54, 0x73, 0x45, 0x6a, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x53, 0x4f, 0x54, 0x6b, 0x52, 0x46, + 0x7a, 0x6b, 0x52, 0x45, 0x68, 0x63, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x50, 0x4f, 0x54, 0x30, 0x37, 0x44, 0x49, + 0x79, 0x0a, + 0x09, 0x45, 0x4f, 0x34, 0x52, 0x46, 0x7a, 0x6b, 0x35, 0x4f, 0x54, 0x41, 0x42, 0x53, 0x37, 0x41, 0x4b, 0x56, + 0x46, 0x69, 0x39, 0x41, 0x43, 0x54, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x43, 0x51, 0x41, 0x4a, 0x41, 0x42, + 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x56, 0x68, 0x67, 0x65, 0x47, 0x42, 0x38, 0x43, 0x43, + 0x51, 0x41, 0x4a, 0x41, 0x51, 0x30, 0x43, 0x44, 0x51, 0x4d, 0x50, 0x42, 0x41, 0x38, 0x46, 0x44, 0x77, 0x59, + 0x50, 0x0a, + 0x09, 0x42, 0x77, 0x38, 0x49, 0x44, 0x77, 0x6b, 0x50, 0x43, 0x67, 0x38, 0x4c, 0x44, 0x77, 0x77, 0x50, 0x44, + 0x51, 0x38, 0x4f, 0x44, 0x77, 0x38, 0x50, 0x45, 0x41, 0x38, 0x52, 0x44, 0x78, 0x49, 0x50, 0x45, 0x77, 0x34, + 0x55, 0x44, 0x52, 0x55, 0x4a, 0x46, 0x67, 0x73, 0x58, 0x43, 0x42, 0x67, 0x50, 0x47, 0x41, 0x30, 0x5a, 0x43, + 0x42, 0x6f, 0x4a, 0x49, 0x78, 0x45, 0x41, 0x45, 0x51, 0x45, 0x57, 0x41, 0x68, 0x59, 0x44, 0x46, 0x78, 0x51, + 0x57, 0x0a, + 0x09, 0x46, 0x52, 0x45, 0x57, 0x46, 0x78, 0x63, 0x63, 0x47, 0x42, 0x77, 0x5a, 0x45, 0x53, 0x4d, 0x6f, 0x58, + 0x51, 0x42, 0x64, 0x41, 0x53, 0x4d, 0x44, 0x44, 0x67, 0x45, 0x56, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, + 0x33, 0x42, 0x77, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x54, 0x51, 0x32, 0x4e, 0x78, 0x4d, 0x68, 0x41, + 0x79, 0x4d, 0x54, 0x49, 0x79, 0x49, 0x47, 0x42, 0x79, 0x4d, 0x2b, 0x41, 0x54, 0x4d, 0x68, 0x42, 0x49, 0x65, + 0x32, 0x0a, + 0x09, 0x61, 0x51, 0x38, 0x50, 0x4c, 0x7a, 0x63, 0x52, 0x4c, 0x69, 0x55, 0x65, 0x48, 0x6a, 0x63, 0x61, 0x64, + 0x6e, 0x6b, 0x56, 0x49, 0x6c, 0x44, 0x2b, 0x75, 0x73, 0x4b, 0x31, 0x77, 0x79, 0x6b, 0x32, 0x50, 0x41, 0x6d, + 0x67, 0x48, 0x49, 0x2b, 0x6c, 0x41, 0x33, 0x6b, 0x44, 0x6b, 0x66, 0x34, 0x5a, 0x53, 0x6c, 0x77, 0x57, 0x4f, + 0x6a, 0x45, 0x46, 0x42, 0x59, 0x30, 0x49, 0x43, 0x47, 0x5a, 0x6b, 0x4c, 0x70, 0x43, 0x68, 0x41, 0x58, 0x6a, + 0x38, 0x0a, + 0x09, 0x62, 0x77, 0x4f, 0x52, 0x51, 0x45, 0x57, 0x6d, 0x66, 0x51, 0x41, 0x41, 0x41, 0x51, 0x41, 0x76, 0x2f, + 0x6f, 0x30, 0x44, 0x2b, 0x67, 0x59, 0x4f, 0x41, 0x43, 0x55, 0x41, 0x4a, 0x6b, 0x41, 0x55, 0x49, 0x4e, 0x73, + 0x41, 0x47, 0x67, 0x33, 0x62, 0x45, 0x78, 0x72, 0x63, 0x42, 0x37, 0x45, 0x6d, 0x43, 0x6d, 0x6b, 0x58, 0x61, + 0x68, 0x31, 0x70, 0x42, 0x43, 0x59, 0x51, 0x33, 0x4f, 0x7a, 0x38, 0x37, 0x44, 0x45, 0x41, 0x45, 0x50, 0x7a, + 0x73, 0x0a, + 0x09, 0x33, 0x4f, 0x51, 0x51, 0x33, 0x75, 0x51, 0x77, 0x41, 0x54, 0x49, 0x54, 0x4e, 0x6a, 0x63, 0x53, 0x45, + 0x6a, 0x4d, 0x79, 0x46, 0x68, 0x55, 0x55, 0x42, 0x69, 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x6d, 0x4a, 0x69, 0x4d, + 0x69, 0x41, 0x77, 0x59, 0x48, 0x41, 0x67, 0x49, 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x7a, 0x4d, + 0x68, 0x59, 0x58, 0x46, 0x68, 0x59, 0x42, 0x4e, 0x32, 0x6f, 0x4f, 0x41, 0x67, 0x45, 0x4d, 0x76, 0x73, 0x70, + 0x51, 0x0a, + 0x09, 0x5a, 0x45, 0x41, 0x33, 0x4b, 0x6a, 0x67, 0x4d, 0x42, 0x67, 0x6b, 0x51, 0x61, 0x77, 0x34, 0x45, 0x42, + 0x42, 0x47, 0x39, 0x78, 0x45, 0x39, 0x6c, 0x52, 0x44, 0x30, 0x68, 0x4d, 0x41, 0x38, 0x4b, 0x43, 0x76, 0x37, + 0x36, 0x41, 0x72, 0x42, 0x73, 0x4f, 0x51, 0x49, 0x44, 0x41, 0x62, 0x78, 0x55, 0x51, 0x54, 0x59, 0x2f, 0x4a, + 0x69, 0x4d, 0x50, 0x53, 0x50, 0x32, 0x56, 0x77, 0x57, 0x37, 0x2b, 0x49, 0x66, 0x35, 0x69, 0x55, 0x30, 0x45, + 0x34, 0x0a, + 0x09, 0x50, 0x78, 0x30, 0x63, 0x45, 0x6c, 0x4d, 0x41, 0x41, 0x41, 0x4d, 0x41, 0x63, 0x77, 0x48, 0x56, 0x41, + 0x7a, 0x73, 0x46, 0x38, 0x41, 0x41, 0x44, 0x41, 0x42, 0x34, 0x41, 0x4b, 0x51, 0x42, 0x66, 0x51, 0x44, 0x4d, + 0x6f, 0x42, 0x79, 0x55, 0x45, 0x48, 0x78, 0x49, 0x59, 0x45, 0x41, 0x4c, 0x6a, 0x41, 0x42, 0x2f, 0x64, 0x45, + 0x41, 0x44, 0x68, 0x4a, 0x64, 0x30, 0x46, 0x43, 0x68, 0x6e, 0x66, 0x47, 0x4e, 0x34, 0x56, 0x33, 0x51, 0x72, + 0x67, 0x0a, + 0x09, 0x48, 0x4a, 0x45, 0x71, 0x41, 0x42, 0x67, 0x4e, 0x48, 0x78, 0x41, 0x69, 0x42, 0x67, 0x49, 0x42, 0x4b, + 0x42, 0x45, 0x47, 0x61, 0x77, 0x52, 0x73, 0x47, 0x43, 0x4a, 0x72, 0x44, 0x53, 0x6f, 0x51, 0x33, 0x4f, 0x7a, + 0x4d, 0x2f, 0x4f, 0x77, 0x79, 0x4d, 0x73, 0x44, 0x41, 0x45, 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x53, 0x4f, + 0x54, 0x45, 0x41, 0x45, 0x50, 0x54, 0x6b, 0x2f, 0x50, 0x54, 0x73, 0x45, 0x4d, 0x54, 0x75, 0x37, 0x64, 0x62, + 0x75, 0x0a, + 0x09, 0x45, 0x4f, 0x34, 0x52, 0x45, 0x6a, 0x6b, 0x53, 0x4f, 0x52, 0x45, 0x35, 0x4f, 0x54, 0x41, 0x54, 0x49, + 0x52, 0x55, 0x68, 0x41, 0x52, 0x45, 0x6a, 0x4e, 0x51, 0x59, 0x47, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x54, 0x51, + 0x32, 0x4d, 0x7a, 0x4d, 0x31, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x48, 0x4e, 0x54, 0x59, 0x32, 0x4d, + 0x7a, 0x49, 0x57, 0x42, 0x53, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x57, + 0x4c, 0x0a, + 0x09, 0x41, 0x72, 0x44, 0x39, 0x55, 0x41, 0x4b, 0x75, 0x6c, 0x53, 0x79, 0x51, 0x58, 0x59, 0x43, 0x59, 0x76, + 0x37, 0x79, 0x32, 0x64, 0x58, 0x55, 0x2b, 0x69, 0x45, 0x52, 0x4a, 0x6b, 0x55, 0x57, 0x33, 0x73, 0x2f, 0x37, + 0x73, 0x6f, 0x58, 0x35, 0x69, 0x55, 0x6d, 0x69, 0x43, 0x41, 0x6c, 0x42, 0x37, 0x41, 0x72, 0x6a, 0x2b, 0x51, + 0x48, 0x41, 0x2f, 0x52, 0x49, 0x64, 0x78, 0x68, 0x34, 0x6f, 0x45, 0x57, 0x31, 0x73, 0x69, 0x49, 0x6e, 0x38, + 0x63, 0x0a, + 0x09, 0x48, 0x4c, 0x44, 0x77, 0x51, 0x30, 0x39, 0x41, 0x54, 0x5a, 0x42, 0x79, 0x48, 0x51, 0x41, 0x44, 0x41, + 0x47, 0x41, 0x42, 0x31, 0x51, 0x4e, 0x6b, 0x42, 0x66, 0x41, 0x41, 0x41, 0x77, 0x41, 0x50, 0x41, 0x42, 0x73, + 0x41, 0x4c, 0x6b, 0x41, 0x5a, 0x41, 0x75, 0x4d, 0x41, 0x34, 0x52, 0x62, 0x64, 0x43, 0x75, 0x41, 0x51, 0x33, + 0x51, 0x53, 0x52, 0x48, 0x41, 0x41, 0x54, 0x44, 0x51, 0x45, 0x5a, 0x61, 0x77, 0x64, 0x73, 0x45, 0x32, 0x73, + 0x4e, 0x0a, + 0x09, 0x48, 0x42, 0x44, 0x63, 0x37, 0x50, 0x7a, 0x73, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x45, 0x41, 0x45, + 0x50, 0x54, 0x73, 0x39, 0x4f, 0x7a, 0x38, 0x37, 0x44, 0x41, 0x54, 0x49, 0x52, 0x55, 0x68, 0x41, 0x54, 0x49, + 0x57, 0x46, 0x52, 0x51, 0x47, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x54, 0x51, 0x32, 0x46, 0x79, 0x49, 0x47, 0x46, + 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x69, 0x77, 0x4b, 0x77, 0x2f, 0x56, 0x41, + 0x42, 0x0a, + 0x09, 0x57, 0x4c, 0x50, 0x4f, 0x7a, 0x72, 0x4f, 0x7a, 0x30, 0x4e, 0x43, 0x7a, 0x61, 0x58, 0x35, 0x2f, 0x61, + 0x47, 0x6c, 0x39, 0x66, 0x41, 0x4a, 0x51, 0x65, 0x77, 0x51, 0x62, 0x33, 0x62, 0x2b, 0x2f, 0x32, 0x39, 0x79, + 0x2b, 0x76, 0x39, 0x31, 0x7a, 0x6f, 0x59, 0x69, 0x46, 0x6f, 0x4b, 0x43, 0x46, 0x69, 0x61, 0x41, 0x41, 0x41, + 0x51, 0x42, 0x4f, 0x41, 0x41, 0x41, 0x46, 0x7a, 0x77, 0x58, 0x6e, 0x41, 0x42, 0x38, 0x41, 0x51, 0x45, 0x41, + 0x69, 0x0a, + 0x09, 0x43, 0x65, 0x55, 0x5a, 0x6b, 0x52, 0x49, 0x50, 0x41, 0x77, 0x4d, 0x41, 0x35, 0x52, 0x41, 0x42, 0x45, + 0x53, 0x41, 0x57, 0x45, 0x77, 0x38, 0x4d, 0x48, 0x77, 0x59, 0x43, 0x41, 0x51, 0x41, 0x43, 0x62, 0x51, 0x59, + 0x63, 0x48, 0x41, 0x39, 0x74, 0x44, 0x42, 0x77, 0x57, 0x49, 0x42, 0x44, 0x55, 0x37, 0x4f, 0x7a, 0x55, 0x37, + 0x4f, 0x7a, 0x41, 0x77, 0x42, 0x45, 0x53, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x45, + 0x41, 0x0a, + 0x09, 0x4c, 0x7a, 0x7a, 0x73, 0x46, 0x7a, 0x4c, 0x30, 0x37, 0x44, 0x41, 0x6c, 0x46, 0x53, 0x45, 0x31, 0x4e, + 0x68, 0x49, 0x31, 0x4e, 0x41, 0x41, 0x6a, 0x49, 0x67, 0x41, 0x56, 0x46, 0x42, 0x49, 0x58, 0x46, 0x53, 0x45, + 0x31, 0x49, 0x53, 0x59, 0x43, 0x4e, 0x52, 0x41, 0x41, 0x49, 0x53, 0x41, 0x41, 0x45, 0x52, 0x51, 0x43, 0x42, + 0x77, 0x58, 0x50, 0x2f, 0x61, 0x69, 0x78, 0x78, 0x76, 0x37, 0x34, 0x32, 0x4e, 0x6a, 0x2b, 0x39, 0x38, 0x65, + 0x79, 0x0a, + 0x09, 0x2f, 0x61, 0x67, 0x42, 0x50, 0x35, 0x36, 0x52, 0x41, 0x58, 0x38, 0x42, 0x4d, 0x51, 0x45, 0x76, 0x41, + 0x59, 0x47, 0x4f, 0x6f, 0x62, 0x4b, 0x79, 0x73, 0x6d, 0x45, 0x42, 0x54, 0x4d, 0x72, 0x77, 0x41, 0x53, 0x4c, + 0x2b, 0x33, 0x65, 0x2f, 0x4b, 0x2f, 0x72, 0x52, 0x68, 0x73, 0x72, 0x4b, 0x4c, 0x41, 0x53, 0x71, 0x34, 0x41, + 0x54, 0x34, 0x42, 0x69, 0x76, 0x35, 0x33, 0x2f, 0x73, 0x76, 0x43, 0x2f, 0x74, 0x69, 0x4e, 0x41, 0x41, 0x41, + 0x44, 0x0a, + 0x09, 0x41, 0x48, 0x76, 0x2f, 0x34, 0x77, 0x64, 0x76, 0x42, 0x48, 0x73, 0x41, 0x42, 0x67, 0x41, 0x7a, 0x41, + 0x44, 0x34, 0x42, 0x41, 0x30, 0x42, 0x44, 0x4a, 0x79, 0x30, 0x6c, 0x50, 0x51, 0x34, 0x4e, 0x41, 0x44, 0x53, + 0x70, 0x4a, 0x52, 0x61, 0x47, 0x46, 0x59, 0x67, 0x53, 0x41, 0x4b, 0x6b, 0x4f, 0x4f, 0x68, 0x4b, 0x35, 0x48, + 0x42, 0x6b, 0x75, 0x68, 0x69, 0x32, 0x36, 0x4b, 0x67, 0x4f, 0x35, 0x44, 0x72, 0x73, 0x48, 0x4d, 0x51, 0x71, + 0x34, 0x0a, + 0x09, 0x48, 0x78, 0x6d, 0x4d, 0x4a, 0x54, 0x38, 0x30, 0x4e, 0x79, 0x59, 0x47, 0x44, 0x77, 0x41, 0x6c, 0x4e, + 0x78, 0x77, 0x48, 0x4a, 0x67, 0x38, 0x56, 0x41, 0x41, 0x67, 0x4e, 0x50, 0x53, 0x59, 0x49, 0x44, 0x79, 0x30, + 0x33, 0x43, 0x43, 0x4a, 0x46, 0x50, 0x78, 0x44, 0x38, 0x37, 0x4d, 0x7a, 0x55, 0x2f, 0x44, 0x7a, 0x55, 0x37, + 0x4d, 0x51, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x45, 0x54, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x52, 0x45, 0x6a, 0x6b, + 0x78, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x45, 0x35, 0x44, 0x4c, 0x30, 0x50, 0x4d, 0x54, 0x6b, 0x2f, 0x44, 0x7a, 0x30, 0x37, + 0x42, 0x44, 0x45, 0x37, 0x6a, 0x49, 0x51, 0x37, 0x68, 0x44, 0x30, 0x37, 0x68, 0x44, 0x75, 0x45, 0x54, 0x6b, + 0x52, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x42, 0x41, 0x67, 0x54, 0x41, 0x72, 0x4d, 0x43, 0x77, 0x77, 0x4c, + 0x54, 0x41, 0x75, 0x4d, 0x43, 0x38, 0x77, 0x4d, 0x45, 0x41, 0x72, 0x51, 0x43, 0x78, 0x41, 0x4c, 0x55, 0x41, + 0x75, 0x0a, + 0x09, 0x51, 0x43, 0x39, 0x41, 0x4d, 0x46, 0x41, 0x72, 0x55, 0x43, 0x78, 0x51, 0x4c, 0x56, 0x41, 0x75, 0x55, + 0x43, 0x39, 0x51, 0x4d, 0x49, 0x55, 0x72, 0x68, 0x54, 0x43, 0x41, 0x51, 0x4a, 0x42, 0x41, 0x6f, 0x45, 0x43, + 0x77, 0x51, 0x4d, 0x42, 0x41, 0x30, 0x45, 0x44, 0x67, 0x51, 0x4f, 0x42, 0x41, 0x38, 0x45, 0x41, 0x64, 0x50, + 0x77, 0x41, 0x2f, 0x42, 0x6a, 0x38, 0x4e, 0x50, 0x77, 0x34, 0x2f, 0x44, 0x77, 0x55, 0x77, 0x4c, 0x44, 0x41, + 0x74, 0x0a, + 0x09, 0x4d, 0x43, 0x34, 0x77, 0x4c, 0x30, 0x41, 0x73, 0x51, 0x43, 0x31, 0x41, 0x4c, 0x6b, 0x41, 0x76, 0x55, + 0x43, 0x78, 0x51, 0x4c, 0x56, 0x41, 0x75, 0x55, 0x43, 0x39, 0x76, 0x41, 0x47, 0x38, 0x47, 0x62, 0x77, 0x31, + 0x76, 0x44, 0x6d, 0x38, 0x50, 0x59, 0x43, 0x78, 0x67, 0x4c, 0x57, 0x41, 0x75, 0x59, 0x43, 0x39, 0x77, 0x4c, + 0x48, 0x41, 0x74, 0x63, 0x43, 0x35, 0x77, 0x4c, 0x34, 0x41, 0x73, 0x67, 0x43, 0x32, 0x41, 0x4c, 0x6f, 0x41, + 0x76, 0x0a, + 0x09, 0x48, 0x56, 0x31, 0x78, 0x41, 0x56, 0x30, 0x42, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, 0x48, 0x41, + 0x7a, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x41, 0x48, 0x51, 0x45, 0x68, 0x48, 0x67, 0x45, 0x7a, 0x4d, 0x6a, 0x59, + 0x33, 0x46, 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4a, 0x77, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4e, + 0x54, 0x51, 0x32, 0x4d, 0x79, 0x45, 0x31, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x48, 0x4e, 0x54, 0x34, + 0x42, 0x0a, + 0x09, 0x4d, 0x7a, 0x49, 0x57, 0x41, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x50, + 0x51, 0x45, 0x47, 0x74, 0x67, 0x47, 0x6c, 0x69, 0x5a, 0x6d, 0x35, 0x44, 0x6b, 0x52, 0x4b, 0x31, 0x49, 0x54, + 0x69, 0x41, 0x51, 0x6a, 0x38, 0x73, 0x67, 0x7a, 0x4d, 0x74, 0x32, 0x6a, 0x49, 0x5a, 0x47, 0x54, 0x51, 0x61, + 0x71, 0x66, 0x34, 0x54, 0x55, 0x6e, 0x59, 0x6a, 0x37, 0x33, 0x53, 0x2f, 0x66, 0x73, 0x42, 0x41, 0x71, 0x65, + 0x58, 0x0a, + 0x09, 0x59, 0x4c, 0x5a, 0x55, 0x5a, 0x62, 0x35, 0x61, 0x6a, 0x74, 0x58, 0x76, 0x33, 0x36, 0x79, 0x42, 0x62, + 0x35, 0x6d, 0x35, 0x41, 0x70, 0x53, 0x58, 0x74, 0x4b, 0x36, 0x65, 0x41, 0x54, 0x42, 0x61, 0x58, 0x76, 0x37, + 0x64, 0x2b, 0x6c, 0x71, 0x2f, 0x79, 0x44, 0x55, 0x31, 0x72, 0x69, 0x6f, 0x73, 0x65, 0x58, 0x64, 0x34, 0x65, + 0x4c, 0x75, 0x6f, 0x76, 0x63, 0x41, 0x53, 0x66, 0x34, 0x73, 0x75, 0x4c, 0x71, 0x6f, 0x6e, 0x4a, 0x32, 0x44, + 0x2b, 0x0a, + 0x09, 0x47, 0x47, 0x5a, 0x37, 0x59, 0x6e, 0x50, 0x5a, 0x74, 0x43, 0x6b, 0x41, 0x41, 0x77, 0x42, 0x49, 0x2f, + 0x36, 0x49, 0x45, 0x6e, 0x41, 0x53, 0x38, 0x41, 0x41, 0x6b, 0x41, 0x45, 0x77, 0x41, 0x72, 0x41, 0x4f, 0x52, + 0x41, 0x50, 0x43, 0x73, 0x73, 0x4a, 0x68, 0x38, 0x64, 0x47, 0x68, 0x4d, 0x4b, 0x41, 0x51, 0x41, 0x45, 0x44, + 0x53, 0x6b, 0x6d, 0x49, 0x42, 0x51, 0x4e, 0x42, 0x43, 0x6f, 0x6d, 0x48, 0x68, 0x6f, 0x45, 0x75, 0x53, 0x59, + 0x4e, 0x0a, + 0x09, 0x75, 0x52, 0x71, 0x34, 0x4a, 0x6f, 0x77, 0x73, 0x4b, 0x79, 0x77, 0x71, 0x46, 0x42, 0x63, 0x51, 0x49, + 0x42, 0x34, 0x6a, 0x45, 0x77, 0x6f, 0x42, 0x41, 0x41, 0x51, 0x51, 0x42, 0x78, 0x38, 0x64, 0x42, 0x78, 0x49, + 0x6a, 0x55, 0x53, 0x6b, 0x51, 0x45, 0x68, 0x64, 0x46, 0x4c, 0x42, 0x44, 0x38, 0x37, 0x44, 0x4c, 0x30, 0x37, + 0x44, 0x4c, 0x41, 0x45, 0x52, 0x49, 0x58, 0x4f, 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x6b, + 0x52, 0x0a, + 0x09, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x4f, 0x54, 0x30, 0x37, 0x42, 0x44, 0x75, 0x45, 0x4d, 0x41, 0x51, 0x77, + 0x42, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x53, 0x4f, 0x52, 0x49, 0x58, 0x4f, 0x52, 0x45, 0x35, 0x4f, 0x52, 0x45, + 0x53, 0x4f, 0x54, 0x42, 0x41, 0x63, 0x43, 0x67, 0x42, 0x50, 0x79, 0x31, 0x5a, 0x46, 0x46, 0x59, 0x63, 0x56, + 0x52, 0x31, 0x57, 0x49, 0x47, 0x6f, 0x56, 0x5a, 0x69, 0x46, 0x2f, 0x41, 0x48, 0x73, 0x45, 0x66, 0x77, 0x56, + 0x2f, 0x0a, + 0x09, 0x42, 0x6e, 0x38, 0x48, 0x66, 0x77, 0x68, 0x2f, 0x43, 0x58, 0x38, 0x4b, 0x66, 0x77, 0x74, 0x2f, 0x44, + 0x48, 0x73, 0x4e, 0x65, 0x68, 0x56, 0x37, 0x47, 0x6e, 0x38, 0x62, 0x66, 0x78, 0x78, 0x2f, 0x48, 0x58, 0x38, + 0x65, 0x66, 0x78, 0x39, 0x2f, 0x49, 0x48, 0x73, 0x68, 0x66, 0x79, 0x4a, 0x2f, 0x49, 0x33, 0x38, 0x6b, 0x66, + 0x79, 0x56, 0x37, 0x4a, 0x70, 0x73, 0x5a, 0x6c, 0x53, 0x57, 0x6f, 0x47, 0x61, 0x41, 0x74, 0x38, 0x43, 0x30, + 0x6d, 0x0a, + 0x09, 0x57, 0x51, 0x42, 0x57, 0x45, 0x31, 0x55, 0x64, 0x57, 0x69, 0x68, 0x70, 0x41, 0x47, 0x59, 0x54, 0x5a, + 0x52, 0x78, 0x71, 0x4b, 0x48, 0x6f, 0x41, 0x64, 0x42, 0x4e, 0x32, 0x48, 0x48, 0x6f, 0x6f, 0x69, 0x52, 0x36, + 0x56, 0x47, 0x4a, 0x6f, 0x6b, 0x6f, 0x68, 0x69, 0x74, 0x4a, 0x42, 0x46, 0x64, 0x41, 0x56, 0x30, 0x4a, 0x41, + 0x52, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x4a, 0x79, 0x34, 0x42, 0x49, 0x79, 0x49, + 0x47, 0x0a, + 0x09, 0x46, 0x52, 0x51, 0x57, 0x46, 0x77, 0x63, 0x75, 0x41, 0x54, 0x55, 0x51, 0x41, 0x44, 0x4d, 0x79, 0x46, + 0x68, 0x63, 0x33, 0x46, 0x77, 0x63, 0x65, 0x41, 0x52, 0x55, 0x51, 0x41, 0x43, 0x4d, 0x69, 0x4a, 0x69, 0x63, + 0x48, 0x4a, 0x77, 0x4f, 0x4a, 0x2f, 0x68, 0x6b, 0x70, 0x5a, 0x30, 0x47, 0x54, 0x72, 0x42, 0x52, 0x63, 0x4b, + 0x6d, 0x63, 0x2b, 0x6c, 0x36, 0x6b, 0x54, 0x46, 0x48, 0x30, 0x32, 0x4e, 0x67, 0x45, 0x52, 0x38, 0x56, 0x32, + 0x66, 0x0a, + 0x09, 0x51, 0x34, 0x74, 0x66, 0x6b, 0x6a, 0x55, 0x32, 0x2f, 0x75, 0x37, 0x77, 0x59, 0x4b, 0x45, 0x2f, 0x69, + 0x32, 0x41, 0x44, 0x49, 0x66, 0x32, 0x77, 0x4b, 0x69, 0x6a, 0x6f, 0x79, 0x45, 0x39, 0x31, 0x6d, 0x69, 0x6b, + 0x70, 0x36, 0x39, 0x4e, 0x49, 0x62, 0x69, 0x36, 0x58, 0x54, 0x63, 0x56, 0x33, 0x41, 0x52, 0x51, 0x42, 0x4f, + 0x44, 0x4d, 0x30, 0x71, 0x45, 0x2b, 0x7a, 0x54, 0x63, 0x5a, 0x34, 0x2f, 0x75, 0x33, 0x2b, 0x78, 0x7a, 0x51, + 0x7a, 0x0a, + 0x09, 0x71, 0x45, 0x34, 0x41, 0x41, 0x67, 0x43, 0x50, 0x2f, 0x2b, 0x4d, 0x44, 0x72, 0x41, 0x58, 0x56, 0x41, + 0x43, 0x41, 0x41, 0x4a, 0x41, 0x43, 0x47, 0x51, 0x43, 0x38, 0x67, 0x47, 0x67, 0x55, 0x43, 0x42, 0x41, 0x59, + 0x5a, 0x41, 0x42, 0x43, 0x47, 0x44, 0x34, 0x67, 0x4d, 0x41, 0x43, 0x47, 0x44, 0x49, 0x77, 0x79, 0x56, 0x45, + 0x34, 0x77, 0x6a, 0x67, 0x53, 0x55, 0x47, 0x49, 0x68, 0x6b, 0x57, 0x43, 0x51, 0x55, 0x42, 0x41, 0x42, 0x6f, + 0x69, 0x0a, + 0x09, 0x43, 0x51, 0x41, 0x63, 0x41, 0x53, 0x49, 0x63, 0x49, 0x53, 0x59, 0x50, 0x43, 0x52, 0x77, 0x57, 0x4a, + 0x52, 0x44, 0x63, 0x37, 0x4e, 0x54, 0x38, 0x37, 0x4e, 0x54, 0x73, 0x45, 0x52, 0x49, 0x35, 0x45, 0x52, 0x49, + 0x35, 0x45, 0x52, 0x49, 0x35, 0x45, 0x6a, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x6b, 0x39, 0x4f, 0x77, 0x51, 0x2f, + 0x73, 0x30, 0x51, 0x39, 0x4f, 0x34, 0x53, 0x4f, 0x54, 0x6b, 0x58, 0x4f, 0x54, 0x41, 0x42, 0x53, 0x37, 0x41, + 0x51, 0x0a, + 0x09, 0x56, 0x45, 0x75, 0x77, 0x45, 0x6c, 0x52, 0x62, 0x53, 0x37, 0x41, 0x54, 0x56, 0x46, 0x74, 0x59, 0x76, + 0x51, 0x41, 0x6c, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x6c, 0x41, 0x43, 0x55, 0x41, 0x51, 0x44, 0x67, + 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x51, 0x41, 0x74, 0x30, 0x42, 0x48, 0x51, 0x46, 0x64, 0x41, 0x5a, 0x30, 0x42, + 0x33, 0x59, 0x63, 0x42, 0x56, 0x30, 0x42, 0x4d, 0x78, 0x55, 0x55, 0x42, 0x67, 0x38, 0x42, 0x44, 0x67, 0x45, + 0x56, 0x0a, + 0x09, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, 0x33, 0x46, 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x6d, 0x4e, + 0x54, 0x51, 0x32, 0x50, 0x77, 0x45, 0x2b, 0x41, 0x54, 0x63, 0x2b, 0x41, 0x54, 0x55, 0x54, 0x49, 0x7a, 0x55, + 0x7a, 0x41, 0x66, 0x53, 0x2b, 0x4e, 0x31, 0x70, 0x61, 0x4f, 0x6a, 0x4f, 0x44, 0x62, 0x55, 0x36, 0x30, 0x59, + 0x46, 0x37, 0x41, 0x5a, 0x37, 0x6a, 0x67, 0x53, 0x56, 0x6c, 0x59, 0x4d, 0x43, 0x59, 0x49, 0x42, 0x77, 0x62, + 0x45, 0x0a, + 0x09, 0x79, 0x73, 0x6f, 0x45, 0x52, 0x4a, 0x78, 0x6c, 0x67, 0x6c, 0x64, 0x59, 0x4e, 0x56, 0x34, 0x78, 0x57, + 0x57, 0x35, 0x47, 0x51, 0x37, 0x77, 0x35, 0x4f, 0x4d, 0x4b, 0x66, 0x54, 0x49, 0x6c, 0x57, 0x56, 0x69, 0x38, + 0x31, 0x47, 0x52, 0x55, 0x38, 0x4e, 0x67, 0x45, 0x4f, 0x2f, 0x67, 0x41, 0x43, 0x41, 0x54, 0x55, 0x41, 0x41, + 0x41, 0x49, 0x41, 0x42, 0x64, 0x55, 0x41, 0x41, 0x77, 0x41, 0x4a, 0x41, 0x47, 0x4a, 0x41, 0x44, 0x77, 0x63, + 0x41, 0x0a, + 0x09, 0x67, 0x77, 0x4b, 0x42, 0x42, 0x41, 0x67, 0x48, 0x42, 0x41, 0x41, 0x44, 0x42, 0x51, 0x45, 0x41, 0x43, + 0x68, 0x44, 0x38, 0x50, 0x4f, 0x77, 0x79, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x43, 0x2f, 0x30, 0x2f, 0x4d, 0x77, + 0x77, 0x41, 0x55, 0x75, 0x77, 0x43, 0x31, 0x52, 0x59, 0x76, 0x51, 0x41, 0x4b, 0x41, 0x45, 0x41, 0x41, 0x41, + 0x51, 0x41, 0x4b, 0x41, 0x41, 0x72, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x55, 0x75, + 0x77, 0x0a, + 0x09, 0x44, 0x31, 0x52, 0x4c, 0x73, 0x42, 0x42, 0x55, 0x57, 0x30, 0x75, 0x77, 0x45, 0x31, 0x52, 0x62, 0x57, + 0x4c, 0x30, 0x41, 0x43, 0x76, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x43, 0x67, 0x41, 0x4b, 0x41, 0x45, 0x41, + 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x62, 0x59, 0x41, 0x43, 0x79, 0x41, 0x4c, 0x55, 0x41, 0x73, 0x44, 0x58, + 0x51, 0x45, 0x6a, 0x4e, 0x54, 0x4d, 0x52, 0x49, 0x78, 0x45, 0x54, 0x4d, 0x78, 0x4d, 0x43, 0x41, 0x4d, 0x76, + 0x4c, 0x0a, + 0x09, 0x79, 0x78, 0x57, 0x69, 0x46, 0x41, 0x54, 0x58, 0x2f, 0x76, 0x6f, 0x72, 0x41, 0x6f, 0x38, 0x42, 0x5a, + 0x66, 0x36, 0x62, 0x41, 0x41, 0x41, 0x42, 0x41, 0x4e, 0x6b, 0x42, 0x48, 0x77, 0x58, 0x62, 0x41, 0x31, 0x34, + 0x41, 0x42, 0x51, 0x41, 0x58, 0x51, 0x41, 0x6f, 0x45, 0x6e, 0x41, 0x49, 0x41, 0x42, 0x67, 0x4d, 0x58, 0x41, + 0x51, 0x41, 0x47, 0x45, 0x4e, 0x7a, 0x55, 0x37, 0x44, 0x45, 0x41, 0x45, 0x4e, 0x54, 0x45, 0x37, 0x44, 0x41, + 0x54, 0x0a, + 0x09, 0x49, 0x52, 0x45, 0x6a, 0x45, 0x53, 0x48, 0x5a, 0x42, 0x51, 0x4b, 0x6f, 0x2b, 0x36, 0x59, 0x44, 0x58, + 0x76, 0x33, 0x42, 0x41, 0x5a, 0x55, 0x41, 0x41, 0x41, 0x45, 0x41, 0x50, 0x66, 0x2f, 0x58, 0x42, 0x52, 0x6b, + 0x47, 0x66, 0x51, 0x41, 0x4b, 0x41, 0x43, 0x70, 0x41, 0x47, 0x41, 0x6f, 0x4a, 0x43, 0x41, 0x63, 0x47, 0x42, + 0x51, 0x73, 0x43, 0x42, 0x41, 0x49, 0x41, 0x43, 0x77, 0x6f, 0x4a, 0x42, 0x77, 0x59, 0x46, 0x42, 0x41, 0x4d, + 0x41, 0x0a, + 0x09, 0x43, 0x41, 0x45, 0x49, 0x43, 0x78, 0x44, 0x55, 0x7a, 0x42, 0x63, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x31, + 0x4d, 0x7a, 0x45, 0x45, 0x52, 0x49, 0x58, 0x4f, 0x54, 0x41, 0x42, 0x4d, 0x78, 0x55, 0x6a, 0x41, 0x53, 0x4d, + 0x42, 0x42, 0x79, 0x63, 0x6c, 0x41, 0x51, 0x52, 0x63, 0x76, 0x58, 0x50, 0x39, 0x72, 0x6b, 0x4c, 0x2b, 0x77, + 0x58, 0x30, 0x5a, 0x41, 0x52, 0x73, 0x42, 0x41, 0x41, 0x5a, 0x39, 0x59, 0x50, 0x6d, 0x36, 0x41, 0x33, 0x4d, + 0x74, 0x0a, + 0x09, 0x55, 0x47, 0x4c, 0x39, 0x4f, 0x77, 0x41, 0x42, 0x41, 0x42, 0x2f, 0x2b, 0x56, 0x67, 0x55, 0x43, 0x42, + 0x68, 0x51, 0x41, 0x49, 0x77, 0x43, 0x4b, 0x51, 0x45, 0x41, 0x4f, 0x44, 0x51, 0x49, 0x50, 0x44, 0x42, 0x45, + 0x5a, 0x48, 0x68, 0x6b, 0x4c, 0x43, 0x67, 0x6b, 0x49, 0x42, 0x41, 0x63, 0x52, 0x48, 0x68, 0x34, 0x5a, 0x51, + 0x68, 0x6b, 0x4d, 0x45, 0x77, 0x6f, 0x48, 0x48, 0x67, 0x45, 0x61, 0x43, 0x71, 0x6b, 0x49, 0x45, 0x34, 0x6f, + 0x53, 0x0a, + 0x09, 0x35, 0x68, 0x61, 0x70, 0x44, 0x77, 0x47, 0x4b, 0x41, 0x4f, 0x59, 0x45, 0x71, 0x53, 0x47, 0x58, 0x44, + 0x78, 0x77, 0x49, 0x4a, 0x42, 0x34, 0x64, 0x47, 0x78, 0x6f, 0x5a, 0x44, 0x41, 0x73, 0x4a, 0x43, 0x41, 0x63, + 0x4b, 0x41, 0x42, 0x49, 0x6b, 0x45, 0x4e, 0x54, 0x4d, 0x46, 0x7a, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x45, 0x4d, + 0x73, 0x54, 0x38, 0x37, 0x50, 0x54, 0x73, 0x45, 0x4f, 0x37, 0x32, 0x37, 0x68, 0x44, 0x75, 0x4d, 0x68, 0x49, + 0x35, 0x0a, + 0x09, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, 0x46, 0x37, + 0x52, 0x63, 0x79, 0x42, 0x78, 0x41, 0x46, 0x37, 0x52, 0x45, 0x58, 0x4f, 0x56, 0x6b, 0x69, 0x41, 0x55, 0x75, + 0x77, 0x44, 0x46, 0x52, 0x59, 0x76, 0x51, 0x41, 0x6b, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x6b, 0x41, + 0x43, 0x51, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x52, 0x55, 0x75, 0x41, 0x53, 0x4d, + 0x69, 0x0a, + 0x09, 0x42, 0x67, 0x63, 0x44, 0x49, 0x52, 0x55, 0x68, 0x41, 0x77, 0x49, 0x47, 0x49, 0x79, 0x49, 0x6d, 0x4a, + 0x7a, 0x55, 0x65, 0x41, 0x54, 0x4d, 0x79, 0x4e, 0x6a, 0x63, 0x54, 0x49, 0x7a, 0x55, 0x68, 0x45, 0x7a, 0x34, + 0x42, 0x4d, 0x7a, 0x49, 0x57, 0x42, 0x51, 0x49, 0x6d, 0x55, 0x43, 0x78, 0x67, 0x63, 0x68, 0x6b, 0x38, 0x41, + 0x52, 0x2f, 0x2b, 0x77, 0x33, 0x38, 0x36, 0x76, 0x4c, 0x6f, 0x36, 0x5a, 0x43, 0x38, 0x30, 0x59, 0x53, 0x39, + 0x68, 0x0a, + 0x09, 0x62, 0x53, 0x4b, 0x4a, 0x2b, 0x41, 0x45, 0x58, 0x50, 0x79, 0x54, 0x47, 0x6c, 0x7a, 0x56, 0x6b, 0x42, + 0x66, 0x43, 0x6b, 0x48, 0x52, 0x78, 0x36, 0x68, 0x50, 0x37, 0x4a, 0x6a, 0x2f, 0x32, 0x46, 0x2f, 0x75, 0x50, + 0x54, 0x46, 0x52, 0x61, 0x6d, 0x49, 0x53, 0x47, 0x4a, 0x70, 0x67, 0x4b, 0x74, 0x6a, 0x77, 0x46, 0x4b, 0x74, + 0x38, 0x4d, 0x53, 0x41, 0x41, 0x49, 0x41, 0x32, 0x51, 0x45, 0x51, 0x42, 0x64, 0x73, 0x44, 0x39, 0x41, 0x41, + 0x64, 0x0a, + 0x09, 0x41, 0x44, 0x73, 0x41, 0x50, 0x30, 0x41, 0x66, 0x4c, 0x68, 0x38, 0x35, 0x4b, 0x67, 0x41, 0x74, 0x49, + 0x68, 0x4d, 0x42, 0x45, 0x42, 0x73, 0x4d, 0x48, 0x69, 0x71, 0x63, 0x4d, 0x54, 0x6d, 0x63, 0x49, 0x67, 0x53, + 0x63, 0x47, 0x77, 0x79, 0x63, 0x45, 0x7a, 0x77, 0x65, 0x41, 0x43, 0x30, 0x50, 0x50, 0x42, 0x44, 0x55, 0x50, + 0x4d, 0x51, 0x79, 0x4d, 0x51, 0x41, 0x51, 0x31, 0x4f, 0x7a, 0x55, 0x37, 0x4e, 0x7a, 0x38, 0x31, 0x4f, 0x7a, + 0x41, 0x0a, + 0x09, 0x45, 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x4d, + 0x41, 0x45, 0x56, 0x42, 0x67, 0x59, 0x6a, 0x49, 0x69, 0x63, 0x6d, 0x4a, 0x79, 0x59, 0x6e, 0x4a, 0x69, 0x4d, + 0x69, 0x42, 0x67, 0x63, 0x31, 0x4e, 0x6a, 0x59, 0x7a, 0x4d, 0x68, 0x63, 0x57, 0x46, 0x78, 0x59, 0x58, 0x46, + 0x6a, 0x4d, 0x79, 0x4e, 0x68, 0x4d, 0x56, 0x42, 0x67, 0x59, 0x6a, 0x49, 0x69, 0x63, 0x6d, 0x4a, 0x79, 0x59, + 0x6e, 0x0a, + 0x09, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x67, 0x63, 0x31, 0x4e, 0x6a, 0x59, 0x7a, 0x4d, 0x68, 0x63, 0x57, 0x46, + 0x78, 0x59, 0x58, 0x46, 0x6a, 0x4d, 0x79, 0x4e, 0x67, 0x58, 0x62, 0x61, 0x62, 0x4e, 0x68, 0x62, 0x70, 0x49, + 0x4b, 0x42, 0x77, 0x59, 0x50, 0x6d, 0x31, 0x35, 0x59, 0x72, 0x47, 0x4a, 0x70, 0x73, 0x32, 0x46, 0x75, 0x6b, + 0x77, 0x73, 0x46, 0x42, 0x67, 0x2b, 0x62, 0x58, 0x6c, 0x61, 0x70, 0x5a, 0x32, 0x6d, 0x7a, 0x59, 0x57, 0x36, + 0x53, 0x0a, + 0x09, 0x43, 0x67, 0x63, 0x47, 0x44, 0x35, 0x74, 0x65, 0x57, 0x4b, 0x78, 0x69, 0x61, 0x62, 0x4e, 0x68, 0x62, + 0x70, 0x4d, 0x4b, 0x42, 0x51, 0x63, 0x50, 0x6d, 0x31, 0x35, 0x57, 0x71, 0x51, 0x4a, 0x76, 0x73, 0x30, 0x35, + 0x46, 0x4f, 0x77, 0x51, 0x44, 0x41, 0x67, 0x59, 0x39, 0x54, 0x46, 0x53, 0x7a, 0x54, 0x6b, 0x55, 0x37, 0x42, + 0x51, 0x49, 0x43, 0x42, 0x6a, 0x31, 0x4c, 0x41, 0x64, 0x71, 0x79, 0x54, 0x30, 0x55, 0x37, 0x42, 0x41, 0x4d, + 0x43, 0x0a, + 0x09, 0x42, 0x6a, 0x31, 0x4d, 0x55, 0x37, 0x4a, 0x4f, 0x52, 0x54, 0x73, 0x45, 0x41, 0x67, 0x4d, 0x47, 0x50, + 0x55, 0x73, 0x41, 0x41, 0x76, 0x2f, 0x36, 0x41, 0x41, 0x41, 0x46, 0x59, 0x41, 0x58, 0x42, 0x41, 0x41, 0x49, + 0x41, 0x42, 0x67, 0x41, 0x34, 0x51, 0x41, 0x38, 0x41, 0x41, 0x77, 0x45, 0x44, 0x42, 0x51, 0x51, 0x44, 0x41, + 0x67, 0x45, 0x41, 0x42, 0x51, 0x63, 0x46, 0x42, 0x67, 0x63, 0x51, 0x31, 0x4d, 0x77, 0x52, 0x46, 0x7a, 0x6b, + 0x78, 0x0a, + 0x09, 0x41, 0x43, 0x2f, 0x45, 0x7a, 0x42, 0x45, 0x35, 0x4d, 0x45, 0x41, 0x55, 0x59, 0x77, 0x46, 0x74, 0x41, + 0x6e, 0x41, 0x42, 0x65, 0x41, 0x4a, 0x2f, 0x41, 0x6e, 0x6b, 0x46, 0x64, 0x67, 0x59, 0x48, 0x62, 0x67, 0x42, + 0x2f, 0x41, 0x41, 0x4a, 0x64, 0x41, 0x56, 0x30, 0x4a, 0x41, 0x53, 0x45, 0x42, 0x4d, 0x77, 0x45, 0x68, 0x41, + 0x71, 0x7a, 0x2b, 0x58, 0x67, 0x4e, 0x45, 0x2f, 0x65, 0x2f, 0x67, 0x41, 0x6b, 0x50, 0x36, 0x6d, 0x67, 0x54, + 0x75, 0x0a, + 0x09, 0x2b, 0x38, 0x51, 0x46, 0x44, 0x2f, 0x6f, 0x2f, 0x41, 0x41, 0x49, 0x41, 0x6e, 0x67, 0x43, 0x4e, 0x42, + 0x43, 0x55, 0x45, 0x49, 0x77, 0x41, 0x47, 0x41, 0x41, 0x30, 0x41, 0x68, 0x6b, 0x42, 0x4a, 0x41, 0x2b, 0x67, + 0x45, 0x42, 0x51, 0x51, 0x43, 0x36, 0x41, 0x45, 0x43, 0x42, 0x51, 0x55, 0x45, 0x41, 0x75, 0x67, 0x44, 0x41, + 0x67, 0x59, 0x41, 0x42, 0x67, 0x48, 0x6f, 0x41, 0x41, 0x41, 0x47, 0x43, 0x75, 0x67, 0x4c, 0x44, 0x41, 0x73, + 0x4a, 0x0a, + 0x09, 0x36, 0x41, 0x67, 0x4a, 0x44, 0x41, 0x77, 0x4c, 0x43, 0x65, 0x67, 0x4b, 0x43, 0x51, 0x30, 0x48, 0x44, + 0x51, 0x6a, 0x6f, 0x42, 0x77, 0x63, 0x4e, 0x51, 0x67, 0x6b, 0x43, 0x43, 0x77, 0x54, 0x6e, 0x42, 0x77, 0x43, + 0x6d, 0x44, 0x67, 0x6b, 0x4d, 0x42, 0x51, 0x49, 0x48, 0x41, 0x77, 0x42, 0x76, 0x42, 0x51, 0x6f, 0x48, 0x62, + 0x77, 0x78, 0x75, 0x44, 0x68, 0x44, 0x38, 0x2f, 0x44, 0x7a, 0x55, 0x37, 0x44, 0x49, 0x52, 0x4f, 0x52, 0x45, + 0x53, 0x0a, + 0x09, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x50, 0x51, 0x38, 0x37, 0x44, 0x49, 0x35, 0x4f, 0x54, 0x42, 0x4c, 0x55, + 0x31, 0x67, 0x48, 0x45, 0x41, 0x54, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, + 0x48, 0x45, 0x41, 0x54, 0x74, 0x42, 0x78, 0x41, 0x45, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, + 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x45, 0x37, 0x56, 0x6b, 0x69, 0x41, 0x52, 0x55, 0x42, 0x41, 0x52, 0x55, + 0x42, 0x0a, + 0x09, 0x4e, 0x52, 0x4d, 0x56, 0x41, 0x51, 0x45, 0x56, 0x41, 0x54, 0x55, 0x45, 0x4a, 0x66, 0x37, 0x54, 0x41, + 0x53, 0x33, 0x2b, 0x4b, 0x79, 0x50, 0x2b, 0x30, 0x77, 0x45, 0x74, 0x2f, 0x69, 0x73, 0x45, 0x49, 0x37, 0x2f, + 0x2b, 0x39, 0x50, 0x37, 0x30, 0x76, 0x77, 0x47, 0x69, 0x55, 0x67, 0x47, 0x69, 0x76, 0x2f, 0x37, 0x30, 0x2f, + 0x76, 0x53, 0x2f, 0x41, 0x61, 0x4a, 0x53, 0x41, 0x41, 0x41, 0x43, 0x41, 0x4d, 0x45, 0x41, 0x6a, 0x51, 0x52, + 0x49, 0x0a, + 0x09, 0x42, 0x43, 0x4d, 0x41, 0x42, 0x67, 0x41, 0x4e, 0x41, 0x49, 0x5a, 0x41, 0x53, 0x51, 0x7a, 0x6f, 0x44, + 0x51, 0x77, 0x4a, 0x43, 0x67, 0x6b, 0x4c, 0x36, 0x41, 0x6f, 0x4b, 0x43, 0x51, 0x33, 0x6f, 0x42, 0x77, 0x67, + 0x48, 0x44, 0x4f, 0x67, 0x4c, 0x44, 0x41, 0x67, 0x49, 0x42, 0x77, 0x58, 0x6f, 0x42, 0x67, 0x55, 0x43, 0x41, + 0x77, 0x49, 0x45, 0x36, 0x41, 0x4d, 0x44, 0x41, 0x67, 0x62, 0x6f, 0x41, 0x41, 0x45, 0x41, 0x42, 0x65, 0x67, + 0x45, 0x0a, + 0x09, 0x42, 0x51, 0x45, 0x42, 0x41, 0x45, 0x49, 0x4d, 0x42, 0x51, 0x6f, 0x44, 0x35, 0x77, 0x63, 0x41, 0x70, + 0x67, 0x34, 0x4d, 0x43, 0x41, 0x45, 0x46, 0x41, 0x41, 0x68, 0x76, 0x43, 0x67, 0x63, 0x42, 0x62, 0x77, 0x4d, + 0x41, 0x63, 0x41, 0x34, 0x51, 0x2f, 0x44, 0x7a, 0x38, 0x31, 0x44, 0x7a, 0x73, 0x45, 0x6a, 0x6b, 0x52, 0x45, + 0x6a, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x30, 0x50, 0x4f, 0x77, 0x79, 0x4f, 0x54, 0x6b, 0x77, 0x53, 0x31, 0x4e, + 0x59, 0x0a, + 0x09, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x54, 0x74, 0x42, + 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x54, 0x74, 0x42, 0x78, 0x41, + 0x45, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x31, 0x5a, 0x49, 0x68, 0x4d, 0x42, 0x46, 0x51, 0x45, 0x31, 0x41, + 0x51, 0x45, 0x6c, 0x41, 0x52, 0x55, 0x42, 0x4e, 0x51, 0x45, 0x42, 0x77, 0x51, 0x48, 0x56, 0x2f, 0x69, 0x73, + 0x42, 0x0a, + 0x09, 0x4c, 0x66, 0x37, 0x54, 0x41, 0x62, 0x49, 0x42, 0x31, 0x66, 0x34, 0x72, 0x41, 0x53, 0x33, 0x2b, 0x30, + 0x77, 0x51, 0x6a, 0x2f, 0x6c, 0x35, 0x53, 0x2f, 0x6c, 0x36, 0x2f, 0x41, 0x51, 0x77, 0x42, 0x44, 0x4c, 0x2f, + 0x2b, 0x58, 0x6c, 0x4c, 0x2b, 0x58, 0x72, 0x38, 0x42, 0x44, 0x41, 0x45, 0x4d, 0x41, 0x41, 0x4d, 0x41, 0x37, + 0x41, 0x41, 0x41, 0x42, 0x78, 0x51, 0x41, 0x2f, 0x67, 0x41, 0x44, 0x41, 0x41, 0x63, 0x41, 0x43, 0x77, 0x41, + 0x6a, 0x0a, + 0x09, 0x51, 0x42, 0x45, 0x49, 0x42, 0x41, 0x43, 0x44, 0x43, 0x67, 0x59, 0x43, 0x42, 0x42, 0x6b, 0x46, 0x41, + 0x42, 0x6b, 0x42, 0x43, 0x52, 0x6b, 0x49, 0x44, 0x42, 0x44, 0x55, 0x2f, 0x4e, 0x54, 0x73, 0x31, 0x4f, 0x77, + 0x78, 0x41, 0x43, 0x38, 0x38, 0x50, 0x4f, 0x77, 0x79, 0x4d, 0x6a, 0x41, 0x6c, 0x4d, 0x78, 0x55, 0x6a, 0x4a, + 0x54, 0x4d, 0x56, 0x49, 0x79, 0x55, 0x7a, 0x46, 0x53, 0x4d, 0x44, 0x6c, 0x74, 0x54, 0x55, 0x41, 0x71, 0x6e, + 0x56, 0x0a, + 0x09, 0x31, 0x66, 0x71, 0x74, 0x31, 0x64, 0x58, 0x2b, 0x2f, 0x76, 0x37, 0x2b, 0x2f, 0x76, 0x34, 0x41, 0x2f, + 0x2f, 0x38, 0x41, 0x45, 0x41, 0x41, 0x41, 0x42, 0x57, 0x67, 0x48, 0x61, 0x77, 0x49, 0x6e, 0x41, 0x43, 0x51, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x42, 0x67, 0x43, 0x38, 0x41, 0x58, 0x58, 0x2f, 0x2f, + 0x77, 0x41, 0x51, 0x41, 0x41, 0x41, 0x46, 0x61, 0x41, 0x64, 0x65, 0x41, 0x69, 0x63, 0x41, 0x4a, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x45, 0x46, 0x41, 0x4c, 0x77, 0x42, 0x64, 0x66, 0x2f, 0x2f, 0x41, + 0x48, 0x50, 0x2f, 0x34, 0x77, 0x58, 0x5a, 0x42, 0x31, 0x34, 0x43, 0x4a, 0x77, 0x41, 0x79, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x51, 0x55, 0x42, 0x4a, 0x77, 0x46, 0x31, 0x41, 0x41, 0x49, 0x41, 0x63, + 0x77, 0x41, 0x41, 0x43, 0x41, 0x77, 0x46, 0x31, 0x51, 0x41, 0x51, 0x41, 0x42, 0x6b, 0x41, 0x4f, 0x30, 0x41, + 0x66, 0x0a, + 0x09, 0x42, 0x5a, 0x55, 0x44, 0x45, 0x51, 0x47, 0x56, 0x41, 0x49, 0x45, 0x59, 0x42, 0x35, 0x55, 0x44, 0x72, + 0x51, 0x6b, 0x59, 0x45, 0x68, 0x41, 0x4b, 0x46, 0x51, 0x59, 0x43, 0x48, 0x42, 0x45, 0x41, 0x42, 0x41, 0x67, + 0x56, 0x47, 0x51, 0x30, 0x51, 0x47, 0x68, 0x44, 0x38, 0x37, 0x4e, 0x54, 0x45, 0x78, 0x4e, 0x54, 0x73, 0x4d, + 0x68, 0x49, 0x35, 0x4f, 0x54, 0x6b, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x4f, 0x77, 0x79, 0x39, 0x4f, 0x77, + 0x79, 0x0a, + 0x09, 0x45, 0x4f, 0x34, 0x77, 0x41, 0x52, 0x55, 0x68, 0x45, 0x53, 0x45, 0x56, 0x49, 0x52, 0x45, 0x68, 0x46, + 0x53, 0x45, 0x67, 0x41, 0x42, 0x45, 0x51, 0x41, 0x43, 0x45, 0x58, 0x49, 0x79, 0x41, 0x41, 0x45, 0x52, 0x41, + 0x41, 0x49, 0x54, 0x4d, 0x48, 0x2b, 0x76, 0x30, 0x61, 0x41, 0x73, 0x66, 0x39, 0x4f, 0x51, 0x4c, 0x34, 0x2b, + 0x39, 0x66, 0x2b, 0x54, 0x2f, 0x35, 0x42, 0x41, 0x62, 0x38, 0x42, 0x73, 0x57, 0x65, 0x42, 0x2f, 0x72, 0x2f, + 0x2b, 0x0a, + 0x09, 0x77, 0x41, 0x46, 0x41, 0x41, 0x55, 0x47, 0x42, 0x42, 0x64, 0x57, 0x71, 0x2f, 0x6b, 0x61, 0x71, 0x2f, + 0x65, 0x4f, 0x71, 0x41, 0x58, 0x77, 0x42, 0x63, 0x41, 0x46, 0x74, 0x41, 0x58, 0x79, 0x71, 0x2f, 0x75, 0x48, + 0x2b, 0x34, 0x50, 0x37, 0x66, 0x2f, 0x74, 0x38, 0x41, 0x41, 0x77, 0x42, 0x78, 0x2f, 0x2b, 0x4d, 0x48, 0x77, + 0x77, 0x52, 0x37, 0x41, 0x41, 0x59, 0x41, 0x4a, 0x77, 0x41, 0x7a, 0x41, 0x49, 0x52, 0x41, 0x4d, 0x51, 0x63, + 0x49, 0x0a, + 0x09, 0x41, 0x42, 0x43, 0x47, 0x44, 0x34, 0x67, 0x4d, 0x41, 0x4b, 0x6b, 0x49, 0x4c, 0x67, 0x79, 0x35, 0x46, + 0x68, 0x4d, 0x6f, 0x41, 0x37, 0x6b, 0x49, 0x75, 0x79, 0x49, 0x6c, 0x48, 0x37, 0x67, 0x5a, 0x45, 0x34, 0x77, + 0x30, 0x42, 0x67, 0x41, 0x57, 0x49, 0x6a, 0x45, 0x4a, 0x44, 0x77, 0x41, 0x49, 0x42, 0x30, 0x73, 0x78, 0x45, + 0x67, 0x6c, 0x52, 0x4b, 0x78, 0x49, 0x63, 0x52, 0x54, 0x51, 0x51, 0x2f, 0x4f, 0x7a, 0x30, 0x2f, 0x50, 0x54, + 0x73, 0x0a, + 0x09, 0x78, 0x42, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x53, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x4f, 0x51, 0x79, 0x39, + 0x44, 0x7a, 0x45, 0x35, 0x4f, 0x77, 0x79, 0x45, 0x4d, 0x54, 0x75, 0x4d, 0x68, 0x44, 0x75, 0x45, 0x50, 0x54, + 0x75, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x45, 0x41, 0x6c, 0x50, 0x7a, 0x56, 0x66, 0x4e, 0x58, 0x41, 0x31, 0x6e, + 0x7a, 0x58, 0x50, 0x4e, 0x64, 0x41, 0x31, 0x38, 0x44, 0x55, 0x48, 0x50, 0x77, 0x41, 0x2f, 0x42, 0x6a, 0x38, + 0x48, 0x0a, + 0x09, 0x50, 0x77, 0x67, 0x2f, 0x43, 0x51, 0x56, 0x76, 0x41, 0x47, 0x38, 0x47, 0x62, 0x77, 0x64, 0x76, 0x43, + 0x47, 0x38, 0x4a, 0x42, 0x56, 0x31, 0x78, 0x41, 0x56, 0x30, 0x42, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, + 0x48, 0x42, 0x52, 0x55, 0x68, 0x48, 0x67, 0x45, 0x7a, 0x4d, 0x6a, 0x59, 0x33, 0x46, 0x51, 0x34, 0x42, 0x49, + 0x79, 0x49, 0x6d, 0x4a, 0x77, 0x34, 0x42, 0x49, 0x79, 0x49, 0x41, 0x45, 0x52, 0x41, 0x41, 0x4d, 0x7a, 0x49, + 0x57, 0x0a, + 0x09, 0x46, 0x7a, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x41, 0x4a, 0x53, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, + 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x42, 0x77, 0x6f, 0x43, 0x70, 0x49, 0x6d, 0x5a, 0x75, 0x51, 0x34, + 0x44, 0x53, 0x50, 0x79, 0x79, 0x44, 0x4d, 0x79, 0x33, 0x61, 0x73, 0x68, 0x69, 0x5a, 0x4e, 0x42, 0x71, 0x6f, + 0x50, 0x4a, 0x52, 0x52, 0x39, 0x47, 0x4d, 0x38, 0x66, 0x37, 0x76, 0x41, 0x52, 0x48, 0x78, 0x6a, 0x4e, 0x4e, + 0x43, 0x0a, + 0x09, 0x54, 0x75, 0x69, 0x50, 0x34, 0x67, 0x45, 0x49, 0x2b, 0x72, 0x43, 0x55, 0x72, 0x4b, 0x75, 0x56, 0x6b, + 0x36, 0x79, 0x73, 0x41, 0x70, 0x53, 0x59, 0x73, 0x36, 0x36, 0x65, 0x4e, 0x56, 0x71, 0x2b, 0x78, 0x7a, 0x51, + 0x30, 0x72, 0x69, 0x6f, 0x73, 0x62, 0x6d, 0x31, 0x75, 0x62, 0x51, 0x45, 0x35, 0x41, 0x52, 0x4d, 0x42, 0x46, + 0x41, 0x45, 0x34, 0x62, 0x32, 0x78, 0x72, 0x63, 0x50, 0x37, 0x64, 0x68, 0x2b, 0x66, 0x4a, 0x79, 0x65, 0x66, + 0x6f, 0x0a, + 0x09, 0x79, 0x4d, 0x66, 0x70, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x42, 0x36, 0x51, 0x51, 0x41, 0x41, + 0x6e, 0x6b, 0x41, 0x41, 0x77, 0x41, 0x51, 0x74, 0x67, 0x4b, 0x70, 0x41, 0x4f, 0x6b, 0x45, 0x41, 0x51, 0x41, + 0x76, 0x78, 0x6a, 0x45, 0x41, 0x45, 0x50, 0x7a, 0x73, 0x4d, 0x42, 0x45, 0x68, 0x46, 0x53, 0x45, 0x45, 0x41, + 0x50, 0x77, 0x41, 0x41, 0x6e, 0x6d, 0x51, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x42, 0x36, 0x51, 0x67, + 0x41, 0x0a, + 0x09, 0x41, 0x6e, 0x6b, 0x41, 0x41, 0x77, 0x41, 0x50, 0x74, 0x51, 0x4b, 0x70, 0x41, 0x41, 0x51, 0x42, 0x41, + 0x43, 0x2f, 0x4d, 0x4d, 0x51, 0x41, 0x51, 0x31, 0x4f, 0x77, 0x77, 0x45, 0x53, 0x45, 0x56, 0x49, 0x51, 0x67, + 0x41, 0x2b, 0x41, 0x41, 0x43, 0x65, 0x5a, 0x41, 0x41, 0x41, 0x67, 0x43, 0x75, 0x41, 0x2b, 0x6b, 0x44, 0x62, + 0x51, 0x58, 0x56, 0x41, 0x41, 0x55, 0x41, 0x43, 0x77, 0x41, 0x6e, 0x51, 0x42, 0x4d, 0x47, 0x41, 0x4a, 0x34, + 0x4a, 0x0a, + 0x09, 0x41, 0x34, 0x45, 0x4d, 0x43, 0x51, 0x6f, 0x47, 0x47, 0x51, 0x63, 0x44, 0x42, 0x41, 0x63, 0x41, 0x47, + 0x51, 0x45, 0x4d, 0x45, 0x4e, 0x7a, 0x38, 0x7a, 0x4e, 0x54, 0x4d, 0x45, 0x50, 0x37, 0x55, 0x7a, 0x6a, 0x45, + 0x41, 0x45, 0x50, 0x51, 0x38, 0x37, 0x44, 0x49, 0x77, 0x41, 0x53, 0x4d, 0x31, 0x45, 0x7a, 0x4d, 0x44, 0x42, + 0x53, 0x4d, 0x31, 0x45, 0x7a, 0x4d, 0x44, 0x41, 0x59, 0x48, 0x54, 0x70, 0x49, 0x46, 0x53, 0x41, 0x5a, 0x72, + 0x54, 0x0a, + 0x09, 0x70, 0x49, 0x46, 0x53, 0x41, 0x2b, 0x6d, 0x74, 0x41, 0x54, 0x2f, 0x2b, 0x77, 0x61, 0x32, 0x74, 0x41, + 0x54, 0x2f, 0x2b, 0x77, 0x51, 0x41, 0x43, 0x41, 0x4b, 0x34, 0x44, 0x36, 0x51, 0x4e, 0x74, 0x42, 0x64, 0x55, + 0x41, 0x42, 0x51, 0x41, 0x4c, 0x41, 0x43, 0x64, 0x41, 0x45, 0x77, 0x6b, 0x44, 0x6e, 0x67, 0x59, 0x41, 0x67, + 0x51, 0x77, 0x4a, 0x43, 0x67, 0x63, 0x5a, 0x42, 0x67, 0x45, 0x44, 0x42, 0x41, 0x45, 0x5a, 0x41, 0x41, 0x77, + 0x51, 0x0a, + 0x09, 0x33, 0x4f, 0x7a, 0x55, 0x7a, 0x42, 0x44, 0x63, 0x37, 0x74, 0x54, 0x4f, 0x4d, 0x51, 0x41, 0x51, 0x39, + 0x44, 0x7a, 0x73, 0x4d, 0x6a, 0x41, 0x42, 0x4d, 0x78, 0x55, 0x44, 0x49, 0x78, 0x4d, 0x6c, 0x4d, 0x78, 0x55, + 0x44, 0x49, 0x78, 0x4d, 0x42, 0x41, 0x4e, 0x4f, 0x6b, 0x67, 0x56, 0x49, 0x42, 0x6d, 0x74, 0x4f, 0x6b, 0x67, + 0x56, 0x49, 0x46, 0x31, 0x61, 0x7a, 0x2b, 0x77, 0x41, 0x46, 0x41, 0x72, 0x4b, 0x7a, 0x2b, 0x77, 0x41, 0x46, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x72, 0x67, 0x50, 0x70, 0x41, 0x64, 0x4d, 0x46, 0x31, 0x51, 0x41, 0x46, 0x41, + 0x42, 0x68, 0x41, 0x43, 0x77, 0x43, 0x65, 0x41, 0x34, 0x45, 0x47, 0x41, 0x77, 0x51, 0x41, 0x47, 0x51, 0x45, + 0x47, 0x45, 0x4e, 0x7a, 0x38, 0x31, 0x4d, 0x77, 0x78, 0x41, 0x42, 0x44, 0x30, 0x37, 0x44, 0x41, 0x42, 0x49, + 0x7a, 0x55, 0x54, 0x4d, 0x77, 0x4d, 0x42, 0x67, 0x64, 0x4f, 0x6b, 0x67, 0x56, 0x49, 0x44, 0x36, 0x61, 0x30, + 0x42, 0x0a, + 0x09, 0x50, 0x2f, 0x37, 0x42, 0x41, 0x41, 0x41, 0x42, 0x41, 0x4c, 0x49, 0x44, 0x2f, 0x67, 0x48, 0x58, 0x42, + 0x64, 0x55, 0x41, 0x42, 0x51, 0x41, 0x59, 0x51, 0x41, 0x73, 0x44, 0x6e, 0x67, 0x43, 0x42, 0x42, 0x67, 0x4d, + 0x45, 0x41, 0x58, 0x45, 0x41, 0x42, 0x68, 0x44, 0x63, 0x37, 0x4e, 0x54, 0x4d, 0x4d, 0x51, 0x41, 0x51, 0x39, + 0x4f, 0x77, 0x77, 0x41, 0x54, 0x4d, 0x56, 0x41, 0x79, 0x4d, 0x54, 0x41, 0x51, 0x54, 0x54, 0x70, 0x49, 0x46, + 0x53, 0x0a, + 0x09, 0x42, 0x64, 0x57, 0x59, 0x2f, 0x73, 0x45, 0x42, 0x50, 0x77, 0x41, 0x41, 0x41, 0x77, 0x44, 0x5a, 0x41, + 0x4a, 0x59, 0x46, 0x32, 0x77, 0x52, 0x76, 0x41, 0x41, 0x4d, 0x41, 0x42, 0x77, 0x41, 0x4c, 0x41, 0x43, 0x6c, + 0x41, 0x46, 0x41, 0x44, 0x71, 0x41, 0x67, 0x62, 0x71, 0x42, 0x41, 0x49, 0x49, 0x6e, 0x41, 0x51, 0x4b, 0x44, + 0x41, 0x6b, 0x46, 0x41, 0x58, 0x49, 0x45, 0x41, 0x41, 0x67, 0x4d, 0x45, 0x4e, 0x7a, 0x55, 0x50, 0x50, 0x77, + 0x38, 0x0a, + 0x09, 0x78, 0x44, 0x45, 0x41, 0x45, 0x4e, 0x54, 0x45, 0x2f, 0x4d, 0x51, 0x51, 0x37, 0x68, 0x44, 0x75, 0x4d, + 0x41, 0x45, 0x7a, 0x46, 0x53, 0x4d, 0x52, 0x4d, 0x78, 0x55, 0x6a, 0x41, 0x53, 0x45, 0x56, 0x49, 0x51, 0x4c, + 0x66, 0x39, 0x76, 0x62, 0x32, 0x39, 0x76, 0x33, 0x36, 0x42, 0x51, 0x4c, 0x36, 0x2f, 0x67, 0x52, 0x76, 0x39, + 0x76, 0x34, 0x53, 0x39, 0x51, 0x4a, 0x42, 0x71, 0x67, 0x41, 0x43, 0x41, 0x41, 0x62, 0x2b, 0x49, 0x77, 0x50, + 0x75, 0x0a, + 0x09, 0x42, 0x6e, 0x55, 0x41, 0x41, 0x77, 0x41, 0x48, 0x41, 0x43, 0x4a, 0x41, 0x45, 0x51, 0x49, 0x47, 0x41, + 0x41, 0x67, 0x45, 0x42, 0x67, 0x67, 0x47, 0x42, 0x41, 0x4d, 0x43, 0x41, 0x51, 0x41, 0x47, 0x42, 0x51, 0x63, + 0x49, 0x45, 0x4e, 0x54, 0x4d, 0x46, 0x7a, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x55, 0x7a, 0x42, 0x45, 0x35, 0x45, + 0x6a, 0x6b, 0x77, 0x43, 0x51, 0x63, 0x42, 0x2b, 0x76, 0x35, 0x2f, 0x41, 0x59, 0x45, 0x42, 0x67, 0x66, 0x35, + 0x2f, 0x0a, + 0x09, 0x41, 0x66, 0x54, 0x2b, 0x44, 0x50, 0x34, 0x4d, 0x42, 0x59, 0x48, 0x38, 0x7a, 0x2f, 0x7a, 0x48, 0x41, + 0x7a, 0x6b, 0x45, 0x4a, 0x66, 0x76, 0x62, 0x2b, 0x39, 0x4d, 0x45, 0x4c, 0x66, 0x2f, 0x2f, 0x41, 0x44, 0x33, + 0x2b, 0x56, 0x67, 0x52, 0x2f, 0x42, 0x68, 0x41, 0x43, 0x4a, 0x77, 0x42, 0x63, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x48, 0x41, 0x49, 0x34, 0x41, 0x58, 0x67, 0x41, 0x41, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x42, 0x4f, 0x63, 0x48, 0x54, 0x67, 0x49, 0x6e, 0x41, 0x44, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x63, 0x42, 0x41, 0x77, 0x42, 0x7a, 0x41, 0x58, 0x55, 0x41, 0x41, 0x66, 0x36, 0x4a, 0x2f, 0x2b, 0x4d, + 0x43, 0x7a, 0x51, 0x58, 0x77, 0x41, 0x41, 0x4d, 0x41, 0x4b, 0x30, 0x41, 0x54, 0x41, 0x41, 0x38, 0x42, 0x41, + 0x67, 0x45, 0x43, 0x44, 0x77, 0x4d, 0x41, 0x41, 0x30, 0x49, 0x43, 0x6a, 0x41, 0x43, 0x52, 0x42, 0x41, 0x45, + 0x44, 0x0a, + 0x09, 0x42, 0x42, 0x44, 0x55, 0x7a, 0x44, 0x45, 0x41, 0x45, 0x4f, 0x54, 0x6b, 0x4d, 0x45, 0x74, 0x54, 0x57, + 0x41, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x58, 0x74, 0x57, 0x53, 0x49, 0x42, 0x4d, 0x77, 0x45, + 0x6a, 0x41, 0x69, 0x32, 0x67, 0x2f, 0x46, 0x79, 0x67, 0x42, 0x66, 0x44, 0x35, 0x38, 0x77, 0x41, 0x41, 0x41, + 0x67, 0x42, 0x65, 0x41, 0x46, 0x49, 0x45, 0x76, 0x41, 0x53, 0x79, 0x41, 0x43, 0x4d, 0x41, 0x4c, 0x77, 0x43, + 0x44, 0x0a, + 0x09, 0x51, 0x45, 0x6b, 0x44, 0x43, 0x52, 0x73, 0x56, 0x42, 0x43, 0x30, 0x65, 0x41, 0x43, 0x63, 0x63, 0x41, + 0x69, 0x45, 0x64, 0x44, 0x42, 0x49, 0x74, 0x46, 0x41, 0x73, 0x4b, 0x41, 0x78, 0x4d, 0x50, 0x41, 0x52, 0x30, + 0x74, 0x75, 0x52, 0x50, 0x72, 0x44, 0x2b, 0x77, 0x6e, 0x75, 0x52, 0x33, 0x72, 0x49, 0x54, 0x41, 0x65, 0x44, + 0x41, 0x41, 0x53, 0x42, 0x43, 0x6f, 0x6b, 0x46, 0x44, 0x41, 0x63, 0x46, 0x52, 0x73, 0x71, 0x48, 0x52, 0x4d, + 0x63, 0x0a, + 0x09, 0x47, 0x41, 0x6b, 0x44, 0x4a, 0x41, 0x73, 0x4b, 0x41, 0x51, 0x4d, 0x43, 0x4a, 0x43, 0x67, 0x43, 0x63, + 0x77, 0x5a, 0x30, 0x4b, 0x69, 0x67, 0x63, 0x63, 0x78, 0x67, 0x77, 0x45, 0x4e, 0x7a, 0x6b, 0x37, 0x50, 0x54, + 0x6b, 0x37, 0x42, 0x49, 0x58, 0x4f, 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x53, 0x4f, + 0x54, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x52, 0x45, 0x68, 0x63, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x31, 0x4f, 0x54, + 0x73, 0x0a, + 0x09, 0x39, 0x4f, 0x54, 0x73, 0x45, 0x4d, 0x41, 0x52, 0x45, 0x68, 0x63, 0x35, 0x45, 0x6a, 0x6b, 0x35, 0x45, + 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x35, 0x4f, 0x52, 0x49, 0x58, 0x4f, 0x54, 0x41, 0x42, 0x4e, 0x78, 0x63, + 0x48, 0x46, 0x68, 0x59, 0x56, 0x46, 0x41, 0x59, 0x48, 0x46, 0x77, 0x63, 0x6e, 0x42, 0x67, 0x59, 0x6a, 0x49, + 0x69, 0x59, 0x6e, 0x42, 0x79, 0x63, 0x33, 0x4a, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x33, 0x4a, 0x7a, 0x63, + 0x58, 0x0a, + 0x09, 0x4e, 0x6a, 0x59, 0x7a, 0x4d, 0x68, 0x59, 0x54, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, + 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, 0x44, 0x65, 0x38, 0x39, 0x79, 0x7a, 0x69, 0x55, 0x6b, 0x4a, 0x69, 0x6a, + 0x52, 0x63, 0x73, 0x38, 0x37, 0x64, 0x44, 0x30, 0x36, 0x65, 0x44, 0x33, 0x50, 0x63, 0x63, 0x38, 0x6c, 0x4a, + 0x53, 0x59, 0x6d, 0x7a, 0x33, 0x50, 0x50, 0x4e, 0x33, 0x52, 0x41, 0x50, 0x48, 0x56, 0x63, 0x6d, 0x33, 0x4a, + 0x77, 0x0a, + 0x09, 0x6e, 0x70, 0x31, 0x78, 0x63, 0x5a, 0x77, 0x44, 0x34, 0x64, 0x46, 0x7a, 0x7a, 0x6a, 0x74, 0x33, 0x50, + 0x6a, 0x39, 0x7a, 0x4f, 0x63, 0x39, 0x78, 0x7a, 0x79, 0x67, 0x6d, 0x4a, 0x53, 0x58, 0x50, 0x63, 0x38, 0x34, + 0x2b, 0x64, 0x6a, 0x70, 0x41, 0x64, 0x44, 0x6a, 0x4f, 0x63, 0x38, 0x38, 0x6e, 0x4a, 0x53, 0x54, 0x2b, 0x66, + 0x48, 0x43, 0x61, 0x6d, 0x6e, 0x42, 0x79, 0x6e, 0x4a, 0x30, 0x41, 0x41, 0x41, 0x45, 0x41, 0x6e, 0x67, 0x43, + 0x4e, 0x0a, + 0x09, 0x41, 0x6e, 0x4d, 0x45, 0x49, 0x77, 0x41, 0x47, 0x41, 0x45, 0x64, 0x41, 0x4a, 0x51, 0x50, 0x6f, 0x42, + 0x41, 0x55, 0x45, 0x41, 0x75, 0x67, 0x42, 0x41, 0x67, 0x55, 0x46, 0x42, 0x41, 0x4c, 0x6f, 0x41, 0x77, 0x49, + 0x47, 0x41, 0x41, 0x59, 0x42, 0x36, 0x41, 0x41, 0x47, 0x51, 0x67, 0x49, 0x45, 0x35, 0x77, 0x43, 0x6d, 0x42, + 0x77, 0x49, 0x44, 0x41, 0x47, 0x38, 0x46, 0x62, 0x67, 0x63, 0x51, 0x2f, 0x4f, 0x77, 0x79, 0x4f, 0x54, 0x45, + 0x41, 0x0a, + 0x09, 0x45, 0x50, 0x54, 0x73, 0x4f, 0x54, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x42, 0x4f, 0x30, 0x48, 0x45, + 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x4f, 0x31, 0x5a, 0x49, 0x67, 0x45, + 0x56, 0x41, 0x51, 0x45, 0x56, 0x41, 0x54, 0x55, 0x43, 0x63, 0x2f, 0x37, 0x54, 0x41, 0x53, 0x33, 0x2b, 0x4b, + 0x77, 0x51, 0x6a, 0x76, 0x2f, 0x37, 0x30, 0x2f, 0x76, 0x53, 0x2f, 0x41, 0x61, 0x4a, 0x53, 0x41, 0x41, 0x41, + 0x42, 0x0a, + 0x09, 0x41, 0x4d, 0x45, 0x41, 0x6a, 0x51, 0x4b, 0x57, 0x42, 0x43, 0x4d, 0x41, 0x42, 0x67, 0x42, 0x4a, 0x51, + 0x43, 0x59, 0x46, 0x36, 0x41, 0x59, 0x46, 0x41, 0x67, 0x4d, 0x43, 0x42, 0x4f, 0x67, 0x44, 0x41, 0x77, 0x49, + 0x47, 0x36, 0x41, 0x41, 0x42, 0x41, 0x41, 0x58, 0x6f, 0x42, 0x41, 0x55, 0x42, 0x41, 0x51, 0x42, 0x43, 0x42, + 0x51, 0x50, 0x6e, 0x41, 0x4b, 0x59, 0x48, 0x42, 0x51, 0x46, 0x76, 0x41, 0x77, 0x42, 0x77, 0x42, 0x78, 0x44, + 0x38, 0x0a, + 0x09, 0x50, 0x4f, 0x77, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x39, 0x4f, 0x77, 0x35, 0x4d, 0x45, 0x74, 0x54, 0x57, + 0x41, 0x63, 0x51, 0x43, 0x4f, 0x30, 0x48, 0x45, 0x41, 0x54, 0x74, 0x42, 0x78, 0x41, 0x45, 0x37, 0x51, 0x63, + 0x51, 0x43, 0x4f, 0x31, 0x5a, 0x49, 0x68, 0x4d, 0x42, 0x46, 0x51, 0x45, 0x31, 0x41, 0x51, 0x48, 0x42, 0x41, + 0x64, 0x58, 0x2b, 0x4b, 0x77, 0x45, 0x74, 0x2f, 0x74, 0x4d, 0x45, 0x49, 0x2f, 0x35, 0x65, 0x55, 0x76, 0x35, + 0x65, 0x0a, + 0x09, 0x76, 0x77, 0x45, 0x4d, 0x41, 0x51, 0x77, 0x41, 0x41, 0x41, 0x49, 0x41, 0x4c, 0x77, 0x41, 0x41, 0x42, + 0x45, 0x6f, 0x47, 0x46, 0x41, 0x41, 0x56, 0x41, 0x42, 0x6b, 0x41, 0x6d, 0x30, 0x41, 0x6f, 0x43, 0x78, 0x51, + 0x59, 0x42, 0x77, 0x4f, 0x70, 0x41, 0x42, 0x43, 0x48, 0x44, 0x68, 0x69, 0x2b, 0x46, 0x72, 0x45, 0x4f, 0x6c, + 0x77, 0x6b, 0x41, 0x76, 0x41, 0x55, 0x42, 0x45, 0x51, 0x34, 0x50, 0x42, 0x42, 0x59, 0x43, 0x43, 0x41, 0x41, + 0x50, 0x0a, + 0x09, 0x46, 0x41, 0x51, 0x49, 0x43, 0x42, 0x63, 0x41, 0x43, 0x67, 0x5a, 0x4d, 0x47, 0x68, 0x44, 0x38, 0x50, + 0x4d, 0x51, 0x79, 0x78, 0x50, 0x77, 0x38, 0x78, 0x42, 0x44, 0x75, 0x4d, 0x68, 0x45, 0x53, 0x4f, 0x54, 0x6b, + 0x78, 0x41, 0x43, 0x38, 0x38, 0x35, 0x6a, 0x4c, 0x75, 0x2f, 0x75, 0x34, 0x51, 0x37, 0x68, 0x44, 0x75, 0x4d, + 0x68, 0x49, 0x35, 0x4f, 0x54, 0x41, 0x42, 0x53, 0x37, 0x41, 0x4b, 0x56, 0x46, 0x69, 0x39, 0x41, 0x42, 0x72, + 0x2f, 0x0a, + 0x09, 0x77, 0x41, 0x41, 0x42, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x67, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, + 0x46, 0x6b, 0x42, 0x53, 0x37, 0x41, 0x4f, 0x56, 0x46, 0x69, 0x39, 0x41, 0x42, 0x6f, 0x41, 0x51, 0x41, 0x41, + 0x42, 0x41, 0x42, 0x6f, 0x41, 0x47, 0x76, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x47, + 0x68, 0x41, 0x57, 0x45, 0x42, 0x63, 0x51, 0x47, 0x42, 0x41, 0x5a, 0x42, 0x44, 0x41, 0x62, 0x55, 0x42, 0x75, + 0x41, 0x0a, + 0x09, 0x44, 0x34, 0x41, 0x51, 0x67, 0x42, 0x75, 0x67, 0x47, 0x39, 0x41, 0x62, 0x37, 0x78, 0x73, 0x49, 0x58, + 0x51, 0x42, 0x64, 0x41, 0x52, 0x45, 0x6a, 0x45, 0x53, 0x45, 0x52, 0x49, 0x78, 0x45, 0x6a, 0x4e, 0x54, 0x4d, + 0x31, 0x4e, 0x44, 0x59, 0x37, 0x41, 0x52, 0x55, 0x6a, 0x49, 0x67, 0x59, 0x64, 0x41, 0x51, 0x45, 0x7a, 0x46, + 0x53, 0x4d, 0x45, 0x53, 0x72, 0x6e, 0x2b, 0x42, 0x37, 0x6d, 0x77, 0x73, 0x4b, 0x32, 0x7a, 0x75, 0x62, 0x42, + 0x6a, 0x0a, + 0x09, 0x54, 0x51, 0x48, 0x35, 0x75, 0x62, 0x6b, 0x45, 0x59, 0x50, 0x75, 0x67, 0x41, 0x39, 0x48, 0x38, 0x4c, + 0x77, 0x50, 0x52, 0x6a, 0x30, 0x36, 0x33, 0x72, 0x35, 0x6c, 0x51, 0x61, 0x47, 0x4d, 0x42, 0x73, 0x75, 0x6b, + 0x41, 0x41, 0x51, 0x41, 0x76, 0x41, 0x41, 0x41, 0x45, 0x53, 0x67, 0x59, 0x55, 0x41, 0x42, 0x55, 0x41, 0x68, + 0x45, 0x41, 0x68, 0x43, 0x42, 0x4d, 0x45, 0x44, 0x77, 0x75, 0x70, 0x43, 0x51, 0x53, 0x48, 0x41, 0x4a, 0x63, + 0x52, 0x0a, + 0x09, 0x43, 0x62, 0x77, 0x4e, 0x41, 0x67, 0x55, 0x41, 0x43, 0x67, 0x67, 0x44, 0x43, 0x41, 0x45, 0x4b, 0x44, + 0x41, 0x67, 0x49, 0x45, 0x41, 0x45, 0x53, 0x44, 0x6b, 0x77, 0x57, 0x45, 0x50, 0x77, 0x38, 0x78, 0x4d, 0x54, + 0x38, 0x50, 0x4d, 0x51, 0x51, 0x37, 0x68, 0x45, 0x53, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x43, 0x38, 0x38, 0x35, + 0x6a, 0x4c, 0x2b, 0x37, 0x68, 0x44, 0x75, 0x4d, 0x68, 0x49, 0x35, 0x4f, 0x54, 0x41, 0x42, 0x53, 0x37, 0x41, + 0x4b, 0x0a, + 0x09, 0x56, 0x46, 0x69, 0x39, 0x41, 0x42, 0x62, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x42, 0x59, 0x41, 0x46, + 0x67, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x53, 0x37, 0x41, 0x4f, 0x56, 0x46, 0x69, + 0x39, 0x41, 0x42, 0x59, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x42, 0x59, 0x41, 0x46, 0x76, 0x2f, 0x41, 0x4f, + 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x45, 0x54, 0x41, 0x58, 0x55, 0x42, 0x65, 0x41, 0x43, 0x6f, 0x41, + 0x4c, 0x0a, + 0x09, 0x67, 0x42, 0x65, 0x67, 0x46, 0x39, 0x41, 0x58, 0x37, 0x78, 0x63, 0x49, 0x58, 0x51, 0x45, 0x68, 0x45, + 0x53, 0x4d, 0x52, 0x49, 0x53, 0x49, 0x47, 0x48, 0x51, 0x45, 0x68, 0x46, 0x53, 0x45, 0x52, 0x49, 0x78, 0x45, + 0x6a, 0x4e, 0x54, 0x4d, 0x31, 0x4e, 0x44, 0x59, 0x43, 0x53, 0x67, 0x49, 0x41, 0x75, 0x66, 0x36, 0x33, 0x59, + 0x30, 0x30, 0x42, 0x4c, 0x2f, 0x37, 0x52, 0x75, 0x62, 0x43, 0x77, 0x72, 0x67, 0x59, 0x55, 0x2b, 0x65, 0x77, + 0x46, 0x0a, + 0x09, 0x65, 0x31, 0x42, 0x6f, 0x59, 0x34, 0x2f, 0x38, 0x4c, 0x77, 0x50, 0x52, 0x6a, 0x30, 0x36, 0x37, 0x71, + 0x77, 0x41, 0x41, 0x41, 0x51, 0x41, 0x35, 0x2f, 0x7a, 0x73, 0x44, 0x78, 0x77, 0x58, 0x56, 0x41, 0x42, 0x4d, + 0x41, 0x50, 0x6b, 0x41, 0x67, 0x45, 0x67, 0x61, 0x35, 0x41, 0x42, 0x41, 0x49, 0x75, 0x51, 0x6f, 0x45, 0x41, + 0x41, 0x49, 0x4f, 0x43, 0x67, 0x79, 0x42, 0x41, 0x73, 0x49, 0x55, 0x44, 0x77, 0x42, 0x5a, 0x45, 0x51, 0x30, + 0x42, 0x0a, + 0x09, 0x56, 0x77, 0x6b, 0x46, 0x57, 0x51, 0x73, 0x48, 0x41, 0x78, 0x51, 0x51, 0x31, 0x44, 0x77, 0x38, 0x37, + 0x44, 0x4c, 0x38, 0x50, 0x44, 0x7a, 0x73, 0x4d, 0x6a, 0x45, 0x41, 0x45, 0x4f, 0x54, 0x30, 0x78, 0x44, 0x49, + 0x51, 0x78, 0x44, 0x49, 0x51, 0x37, 0x6a, 0x49, 0x51, 0x37, 0x6a, 0x49, 0x77, 0x4a, 0x53, 0x45, 0x52, 0x49, + 0x78, 0x45, 0x68, 0x4e, 0x53, 0x45, 0x52, 0x49, 0x54, 0x55, 0x68, 0x45, 0x54, 0x4d, 0x52, 0x49, 0x52, 0x55, + 0x68, 0x0a, + 0x09, 0x45, 0x53, 0x45, 0x44, 0x78, 0x2f, 0x36, 0x52, 0x73, 0x50, 0x36, 0x52, 0x41, 0x57, 0x2f, 0x2b, 0x6b, + 0x51, 0x46, 0x76, 0x73, 0x41, 0x46, 0x76, 0x2f, 0x70, 0x45, 0x42, 0x62, 0x39, 0x2f, 0x2b, 0x58, 0x41, 0x47, + 0x6b, 0x6d, 0x67, 0x49, 0x66, 0x6d, 0x51, 0x47, 0x6b, 0x2f, 0x6c, 0x79, 0x5a, 0x2f, 0x65, 0x45, 0x41, 0x41, + 0x51, 0x44, 0x62, 0x41, 0x6b, 0x67, 0x42, 0x72, 0x67, 0x4e, 0x47, 0x41, 0x41, 0x4d, 0x41, 0x45, 0x72, 0x63, + 0x43, 0x0a, + 0x09, 0x67, 0x77, 0x41, 0x45, 0x41, 0x52, 0x6b, 0x41, 0x42, 0x42, 0x44, 0x55, 0x37, 0x44, 0x45, 0x41, 0x45, + 0x4e, 0x54, 0x73, 0x4d, 0x42, 0x4d, 0x7a, 0x46, 0x53, 0x50, 0x62, 0x30, 0x39, 0x4d, 0x44, 0x52, 0x76, 0x34, + 0x41, 0x41, 0x51, 0x43, 0x75, 0x2f, 0x78, 0x49, 0x42, 0x30, 0x77, 0x44, 0x2b, 0x41, 0x41, 0x55, 0x41, 0x47, + 0x45, 0x41, 0x4c, 0x41, 0x35, 0x34, 0x41, 0x67, 0x77, 0x59, 0x44, 0x42, 0x41, 0x45, 0x5a, 0x41, 0x41, 0x59, + 0x51, 0x0a, + 0x09, 0x31, 0x4f, 0x7a, 0x55, 0x7a, 0x44, 0x45, 0x41, 0x45, 0x50, 0x7a, 0x73, 0x4d, 0x43, 0x55, 0x7a, 0x46, + 0x51, 0x4d, 0x6a, 0x45, 0x77, 0x45, 0x41, 0x30, 0x36, 0x53, 0x42, 0x55, 0x76, 0x36, 0x73, 0x2f, 0x73, 0x41, + 0x42, 0x51, 0x41, 0x41, 0x43, 0x41, 0x4b, 0x37, 0x2f, 0x45, 0x67, 0x4e, 0x74, 0x41, 0x50, 0x34, 0x41, 0x42, + 0x51, 0x41, 0x4c, 0x41, 0x43, 0x64, 0x41, 0x45, 0x77, 0x6b, 0x44, 0x6e, 0x67, 0x59, 0x41, 0x67, 0x77, 0x77, + 0x44, 0x0a, + 0x09, 0x42, 0x41, 0x45, 0x5a, 0x41, 0x41, 0x63, 0x4a, 0x43, 0x67, 0x63, 0x5a, 0x42, 0x67, 0x77, 0x51, 0x33, + 0x4f, 0x7a, 0x55, 0x7a, 0x42, 0x44, 0x63, 0x37, 0x74, 0x54, 0x4f, 0x4d, 0x51, 0x41, 0x51, 0x2f, 0x44, 0x7a, + 0x73, 0x4d, 0x6a, 0x41, 0x6c, 0x4d, 0x78, 0x55, 0x44, 0x49, 0x78, 0x4d, 0x6c, 0x4d, 0x78, 0x55, 0x44, 0x49, + 0x78, 0x4d, 0x43, 0x6d, 0x74, 0x4f, 0x6b, 0x67, 0x56, 0x4c, 0x2b, 0x5a, 0x74, 0x4f, 0x6b, 0x67, 0x56, 0x4c, + 0x2b, 0x0a, + 0x09, 0x72, 0x50, 0x37, 0x41, 0x41, 0x55, 0x43, 0x73, 0x72, 0x50, 0x37, 0x41, 0x41, 0x55, 0x41, 0x41, 0x41, + 0x41, 0x63, 0x41, 0x63, 0x66, 0x2f, 0x6a, 0x43, 0x6b, 0x77, 0x46, 0x38, 0x41, 0x41, 0x4c, 0x41, 0x42, 0x63, + 0x41, 0x49, 0x77, 0x41, 0x6e, 0x41, 0x44, 0x4d, 0x41, 0x50, 0x77, 0x42, 0x4c, 0x41, 0x4b, 0x35, 0x41, 0x52, + 0x43, 0x51, 0x50, 0x4a, 0x53, 0x59, 0x6c, 0x4a, 0x67, 0x38, 0x6e, 0x4a, 0x43, 0x64, 0x43, 0x51, 0x41, 0x43, + 0x53, 0x0a, + 0x09, 0x44, 0x43, 0x36, 0x53, 0x48, 0x6f, 0x30, 0x6f, 0x6b, 0x68, 0x68, 0x47, 0x42, 0x70, 0x49, 0x30, 0x44, + 0x49, 0x30, 0x36, 0x4a, 0x68, 0x4b, 0x4d, 0x4a, 0x42, 0x69, 0x52, 0x54, 0x43, 0x56, 0x4a, 0x51, 0x79, 0x63, + 0x78, 0x4b, 0x30, 0x4d, 0x4e, 0x50, 0x51, 0x6b, 0x4e, 0x44, 0x77, 0x34, 0x44, 0x44, 0x52, 0x55, 0x78, 0x44, + 0x52, 0x73, 0x39, 0x44, 0x6b, 0x6b, 0x4e, 0x46, 0x54, 0x63, 0x72, 0x44, 0x52, 0x73, 0x4f, 0x49, 0x51, 0x74, + 0x4d, 0x0a, + 0x09, 0x45, 0x50, 0x7a, 0x6b, 0x37, 0x4e, 0x54, 0x45, 0x37, 0x4f, 0x51, 0x51, 0x37, 0x68, 0x44, 0x75, 0x39, + 0x75, 0x34, 0x51, 0x37, 0x68, 0x45, 0x53, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x4f, 0x51, + 0x79, 0x39, 0x44, 0x77, 0x38, 0x35, 0x44, 0x4c, 0x73, 0x4d, 0x68, 0x44, 0x75, 0x39, 0x75, 0x34, 0x51, 0x37, + 0x6a, 0x49, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x31, + 0x5a, 0x0a, + 0x09, 0x49, 0x67, 0x46, 0x4c, 0x73, 0x42, 0x52, 0x55, 0x53, 0x37, 0x41, 0x4a, 0x56, 0x46, 0x74, 0x4c, 0x73, + 0x41, 0x74, 0x55, 0x57, 0x30, 0x75, 0x77, 0x44, 0x46, 0x52, 0x62, 0x53, 0x37, 0x41, 0x4e, 0x56, 0x46, 0x74, + 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x45, 0x77, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, + 0x45, 0x77, 0x41, 0x54, 0x50, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x49, 0x67, 0x59, + 0x56, 0x0a, + 0x09, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x6e, 0x4d, 0x68, 0x59, 0x56, 0x46, + 0x41, 0x59, 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x42, 0x4d, 0x68, 0x59, 0x56, 0x46, 0x41, 0x59, + 0x6a, 0x49, 0x69, 0x59, 0x31, 0x4e, 0x44, 0x59, 0x68, 0x4d, 0x77, 0x45, 0x6a, 0x45, 0x79, 0x49, 0x47, 0x46, + 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x41, 0x54, 0x49, 0x57, 0x46, 0x52, 0x51, + 0x47, 0x0a, + 0x09, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x54, 0x51, 0x32, 0x46, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, + 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x43, 0x50, 0x52, 0x58, 0x5a, 0x47, 0x52, 0x58, 0x56, 0x57, 0x4e, + 0x6a, 0x56, 0x5a, 0x36, 0x36, 0x75, 0x35, 0x32, 0x67, 0x75, 0x72, 0x76, 0x35, 0x64, 0x4a, 0x36, 0x38, 0x75, + 0x35, 0x2b, 0x66, 0x75, 0x62, 0x6f, 0x45, 0x4a, 0x61, 0x44, 0x38, 0x57, 0x71, 0x41, 0x66, 0x56, 0x6d, 0x4e, + 0x69, 0x0a, + 0x09, 0x56, 0x31, 0x64, 0x6a, 0x5a, 0x41, 0x4f, 0x79, 0x6e, 0x72, 0x71, 0x37, 0x6e, 0x61, 0x43, 0x36, 0x75, + 0x35, 0x39, 0x58, 0x59, 0x32, 0x4e, 0x58, 0x56, 0x57, 0x4e, 0x6a, 0x41, 0x70, 0x47, 0x55, 0x68, 0x49, 0x4b, + 0x56, 0x6c, 0x59, 0x4b, 0x44, 0x6c, 0x58, 0x2f, 0x63, 0x75, 0x37, 0x76, 0x62, 0x32, 0x37, 0x75, 0x38, 0x32, + 0x77, 0x4c, 0x67, 0x32, 0x37, 0x75, 0x39, 0x32, 0x74, 0x75, 0x38, 0x75, 0x74, 0x7a, 0x35, 0x38, 0x77, 0x57, + 0x4f, 0x0a, + 0x09, 0x6c, 0x59, 0x4b, 0x45, 0x6c, 0x4a, 0x53, 0x45, 0x67, 0x5a, 0x62, 0x39, 0x6e, 0x39, 0x79, 0x37, 0x75, + 0x39, 0x76, 0x62, 0x75, 0x37, 0x7a, 0x62, 0x66, 0x35, 0x53, 0x45, 0x67, 0x70, 0x57, 0x56, 0x67, 0x6f, 0x4f, + 0x56, 0x41, 0x50, 0x2f, 0x2f, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x56, 0x6f, 0x42, 0x32, 0x30, 0x43, 0x4a, + 0x77, 0x41, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x51, 0x63, 0x41, 0x76, 0x41, 0x46, + 0x31, 0x0a, + 0x09, 0x2f, 0x2f, 0x38, 0x41, 0x79, 0x51, 0x41, 0x41, 0x42, 0x49, 0x73, 0x48, 0x62, 0x51, 0x49, 0x6e, 0x41, + 0x43, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x42, 0x77, 0x43, 0x65, 0x41, 0x58, 0x58, + 0x2f, 0x2f, 0x77, 0x41, 0x51, 0x41, 0x41, 0x41, 0x46, 0x61, 0x41, 0x64, 0x72, 0x41, 0x69, 0x63, 0x41, 0x4a, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x45, 0x45, 0x41, 0x4c, 0x77, 0x42, 0x64, 0x66, 0x2f, + 0x2f, 0x0a, + 0x09, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x53, 0x4c, 0x42, 0x30, 0x34, 0x43, 0x4a, 0x77, 0x41, 0x6f, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x51, 0x4d, 0x41, 0x6e, 0x67, 0x46, 0x31, 0x2f, 0x2f, 0x38, + 0x41, 0x79, 0x51, 0x41, 0x41, 0x42, 0x49, 0x73, 0x48, 0x61, 0x77, 0x49, 0x6e, 0x41, 0x43, 0x67, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x42, 0x67, 0x43, 0x65, 0x41, 0x58, 0x58, 0x2f, 0x2f, 0x77, 0x43, + 0x69, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x43, 0x48, 0x77, 0x64, 0x72, 0x41, 0x69, 0x63, 0x41, 0x4c, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x42, 0x77, 0x45, 0x45, 0x2f, 0x79, 0x38, 0x42, 0x64, 0x66, 0x2f, 0x2f, 0x2f, 0x2f, 0x34, + 0x41, 0x41, 0x41, 0x4a, 0x67, 0x42, 0x32, 0x30, 0x43, 0x4a, 0x77, 0x41, 0x73, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x48, 0x41, 0x51, 0x66, 0x2f, 0x4c, 0x77, 0x46, 0x31, 0x2f, 0x2f, 0x38, 0x41, 0x42, 0x67, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x6c, 0x67, 0x48, 0x54, 0x67, 0x49, 0x6e, 0x41, 0x43, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x63, 0x42, 0x41, 0x2f, 0x38, 0x76, 0x41, 0x58, 0x58, 0x2f, 0x2f, 0x77, 0x41, 0x37, 0x41, 0x41, 0x41, + 0x42, 0x75, 0x67, 0x64, 0x72, 0x41, 0x69, 0x63, 0x41, 0x4c, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, + 0x77, 0x45, 0x47, 0x2f, 0x79, 0x38, 0x42, 0x64, 0x66, 0x2f, 0x2f, 0x41, 0x48, 0x50, 0x2f, 0x34, 0x77, 0x58, + 0x5a, 0x0a, + 0x09, 0x42, 0x32, 0x73, 0x43, 0x4a, 0x77, 0x41, 0x79, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, + 0x51, 0x51, 0x42, 0x4a, 0x77, 0x46, 0x31, 0x2f, 0x2f, 0x38, 0x41, 0x63, 0x2f, 0x2f, 0x6a, 0x42, 0x64, 0x6b, + 0x48, 0x62, 0x51, 0x49, 0x6e, 0x41, 0x44, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x42, + 0x77, 0x45, 0x6e, 0x41, 0x58, 0x58, 0x2f, 0x2f, 0x77, 0x42, 0x7a, 0x2f, 0x2b, 0x4d, 0x46, 0x32, 0x51, 0x64, + 0x72, 0x0a, + 0x09, 0x41, 0x69, 0x63, 0x41, 0x4d, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x45, 0x47, 0x41, + 0x53, 0x63, 0x42, 0x64, 0x66, 0x2f, 0x2f, 0x41, 0x4c, 0x4c, 0x2f, 0x34, 0x77, 0x55, 0x70, 0x42, 0x32, 0x73, + 0x43, 0x4a, 0x77, 0x41, 0x34, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x51, 0x51, 0x41, 0x37, + 0x67, 0x46, 0x31, 0x2f, 0x2f, 0x38, 0x41, 0x73, 0x76, 0x2f, 0x6a, 0x42, 0x53, 0x6b, 0x48, 0x62, 0x51, 0x49, + 0x6e, 0x0a, + 0x09, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x42, 0x77, 0x44, 0x75, 0x41, + 0x58, 0x58, 0x2f, 0x2f, 0x77, 0x43, 0x79, 0x2f, 0x2b, 0x4d, 0x46, 0x4b, 0x51, 0x64, 0x72, 0x41, 0x69, 0x63, + 0x41, 0x4f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x45, 0x47, 0x41, 0x4f, 0x34, 0x42, 0x64, + 0x51, 0x41, 0x42, 0x41, 0x4d, 0x45, 0x41, 0x41, 0x41, 0x46, 0x35, 0x42, 0x47, 0x41, 0x41, 0x41, 0x77, 0x41, + 0x67, 0x0a, + 0x09, 0x74, 0x77, 0x43, 0x2f, 0x41, 0x67, 0x45, 0x49, 0x41, 0x45, 0x59, 0x45, 0x45, 0x50, 0x7a, 0x73, 0x4d, + 0x51, 0x41, 0x76, 0x37, 0x44, 0x42, 0x41, 0x43, 0x78, 0x41, 0x46, 0x51, 0x41, 0x56, 0x51, 0x42, 0x57, 0x41, + 0x46, 0x63, 0x41, 0x55, 0x46, 0x41, 0x56, 0x30, 0x54, 0x4d, 0x78, 0x45, 0x6a, 0x77, 0x62, 0x69, 0x34, 0x42, + 0x47, 0x44, 0x37, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x51, 0x44, 0x42, 0x42, 0x4f, 0x34, 0x44, 0x50, 0x77, 0x5a, + 0x6d, 0x0a, + 0x09, 0x41, 0x41, 0x59, 0x41, 0x4e, 0x30, 0x41, 0x4d, 0x42, 0x41, 0x55, 0x43, 0x74, 0x41, 0x43, 0x7a, 0x42, + 0x77, 0x51, 0x43, 0x64, 0x51, 0x59, 0x48, 0x45, 0x4e, 0x7a, 0x73, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x50, 0x54, + 0x73, 0x4d, 0x6a, 0x6b, 0x77, 0x41, 0x45, 0x75, 0x77, 0x43, 0x56, 0x52, 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, + 0x31, 0x69, 0x39, 0x41, 0x41, 0x66, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x41, 0x63, 0x41, 0x42, 0x77, 0x42, + 0x41, 0x0a, + 0x09, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x4d, 0x78, 0x4d, 0x6a, 0x4a, 0x77, 0x63, 0x6a, 0x41, + 0x62, 0x61, 0x55, 0x39, 0x59, 0x75, 0x30, 0x74, 0x49, 0x73, 0x47, 0x5a, 0x76, 0x36, 0x49, 0x39, 0x66, 0x55, + 0x41, 0x41, 0x51, 0x43, 0x32, 0x42, 0x52, 0x30, 0x44, 0x53, 0x67, 0x59, 0x33, 0x41, 0x42, 0x73, 0x41, 0x59, + 0x30, 0x41, 0x6b, 0x41, 0x42, 0x49, 0x48, 0x44, 0x67, 0x73, 0x45, 0x41, 0x52, 0x49, 0x48, 0x44, 0x77, 0x73, + 0x45, 0x0a, + 0x09, 0x45, 0x73, 0x4d, 0x5a, 0x42, 0x77, 0x54, 0x44, 0x46, 0x51, 0x76, 0x74, 0x48, 0x41, 0x38, 0x42, 0x44, + 0x67, 0x41, 0x48, 0x46, 0x56, 0x59, 0x57, 0x64, 0x77, 0x64, 0x57, 0x43, 0x48, 0x59, 0x63, 0x45, 0x50, 0x54, + 0x73, 0x2f, 0x4f, 0x77, 0x52, 0x4f, 0x54, 0x6b, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x50, 0x77, 0x38, 0x2f, + 0x4e, 0x51, 0x38, 0x37, 0x42, 0x45, 0x53, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x52, 0x45, + 0x53, 0x0a, + 0x09, 0x4f, 0x54, 0x41, 0x41, 0x53, 0x37, 0x41, 0x4a, 0x56, 0x45, 0x75, 0x77, 0x44, 0x46, 0x52, 0x62, 0x57, + 0x4c, 0x30, 0x41, 0x48, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x48, 0x41, 0x41, 0x63, 0x41, 0x45, 0x41, + 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x45, 0x6e, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, 0x48, 0x49, + 0x7a, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x57, 0x48, 0x77, 0x45, 0x65, 0x41, 0x54, 0x4d, 0x79, 0x4e, 0x6a, 0x63, + 0x7a, 0x0a, + 0x09, 0x44, 0x67, 0x45, 0x6a, 0x49, 0x69, 0x59, 0x42, 0x2f, 0x44, 0x6b, 0x57, 0x49, 0x51, 0x30, 0x6d, 0x4a, + 0x41, 0x4a, 0x39, 0x41, 0x6d, 0x5a, 0x62, 0x4a, 0x6b, 0x41, 0x6c, 0x4f, 0x52, 0x59, 0x68, 0x44, 0x53, 0x59, + 0x6b, 0x41, 0x6e, 0x30, 0x43, 0x5a, 0x6c, 0x73, 0x6d, 0x51, 0x41, 0x56, 0x61, 0x4e, 0x78, 0x51, 0x54, 0x53, + 0x56, 0x4b, 0x48, 0x6b, 0x78, 0x77, 0x68, 0x4e, 0x78, 0x51, 0x54, 0x53, 0x56, 0x4b, 0x48, 0x6b, 0x78, 0x77, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x31, 0x51, 0x56, 0x69, 0x41, 0x79, 0x73, 0x46, 0x39, 0x67, 0x41, 0x44, 0x41, + 0x43, 0x2b, 0x33, 0x41, 0x75, 0x38, 0x41, 0x37, 0x67, 0x51, 0x42, 0x41, 0x41, 0x51, 0x51, 0x31, 0x4d, 0x77, + 0x78, 0x41, 0x42, 0x44, 0x38, 0x37, 0x44, 0x41, 0x41, 0x53, 0x37, 0x41, 0x4a, 0x56, 0x45, 0x75, 0x77, 0x44, + 0x6c, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x42, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x42, 0x41, 0x41, + 0x45, 0x0a, + 0x09, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x52, 0x4d, 0x68, 0x46, 0x53, 0x48, 0x56, 0x41, + 0x6c, 0x62, 0x39, 0x71, 0x67, 0x58, 0x32, 0x6c, 0x41, 0x41, 0x41, 0x41, 0x51, 0x44, 0x48, 0x42, 0x53, 0x6b, + 0x44, 0x4f, 0x51, 0x5a, 0x49, 0x41, 0x41, 0x30, 0x41, 0x56, 0x30, 0x41, 0x4f, 0x43, 0x2f, 0x41, 0x45, 0x42, + 0x77, 0x43, 0x7a, 0x44, 0x67, 0x64, 0x57, 0x43, 0x41, 0x46, 0x57, 0x41, 0x41, 0x34, 0x51, 0x33, 0x4f, 0x7a, + 0x55, 0x0a, + 0x09, 0x37, 0x44, 0x45, 0x41, 0x45, 0x50, 0x51, 0x38, 0x31, 0x4f, 0x77, 0x77, 0x41, 0x45, 0x75, 0x77, 0x43, + 0x56, 0x52, 0x59, 0x76, 0x51, 0x41, 0x4f, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4f, 0x41, 0x41, 0x34, + 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x45, 0x75, 0x77, 0x44, 0x31, 0x52, 0x4c, 0x73, + 0x42, 0x42, 0x55, 0x57, 0x30, 0x75, 0x77, 0x45, 0x56, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x44, 0x67, 0x42, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x44, 0x67, 0x41, 0x4f, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, + 0x52, 0x4d, 0x7a, 0x48, 0x67, 0x45, 0x7a, 0x4d, 0x6a, 0x59, 0x33, 0x4d, 0x77, 0x34, 0x42, 0x49, 0x79, 0x49, + 0x6d, 0x78, 0x33, 0x59, 0x4c, 0x59, 0x56, 0x64, 0x57, 0x59, 0x41, 0x31, 0x32, 0x43, 0x70, 0x36, 0x52, 0x6b, + 0x5a, 0x34, 0x47, 0x53, 0x45, 0x74, 0x4c, 0x53, 0x6b, 0x79, 0x50, 0x6b, 0x4a, 0x41, 0x41, 0x41, 0x51, 0x47, + 0x61, 0x0a, + 0x09, 0x42, 0x55, 0x51, 0x43, 0x5a, 0x67, 0x59, 0x51, 0x41, 0x41, 0x4d, 0x41, 0x4c, 0x45, 0x41, 0x4a, 0x41, + 0x73, 0x34, 0x41, 0x7a, 0x51, 0x51, 0x42, 0x5a, 0x41, 0x41, 0x45, 0x45, 0x4e, 0x54, 0x73, 0x4d, 0x51, 0x41, + 0x51, 0x2f, 0x4f, 0x77, 0x77, 0x41, 0x45, 0x75, 0x77, 0x43, 0x56, 0x52, 0x59, 0x76, 0x51, 0x41, 0x45, 0x2f, + 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x45, 0x41, 0x41, 0x51, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, + 0x5a, 0x0a, + 0x09, 0x41, 0x54, 0x4d, 0x56, 0x49, 0x77, 0x47, 0x61, 0x7a, 0x4d, 0x77, 0x47, 0x45, 0x4d, 0x77, 0x41, 0x41, + 0x41, 0x49, 0x41, 0x37, 0x67, 0x54, 0x68, 0x41, 0x78, 0x49, 0x48, 0x42, 0x67, 0x41, 0x4c, 0x41, 0x42, 0x63, + 0x41, 0x58, 0x30, 0x41, 0x52, 0x41, 0x38, 0x45, 0x56, 0x38, 0x67, 0x6e, 0x42, 0x44, 0x2f, 0x45, 0x59, 0x41, + 0x46, 0x59, 0x4d, 0x65, 0x41, 0x5a, 0x57, 0x45, 0x68, 0x67, 0x51, 0x31, 0x4f, 0x7a, 0x30, 0x37, 0x44, 0x45, + 0x41, 0x0a, + 0x09, 0x45, 0x50, 0x54, 0x73, 0x39, 0x4f, 0x77, 0x77, 0x41, 0x45, 0x75, 0x77, 0x43, 0x56, 0x52, 0x4c, 0x73, + 0x41, 0x78, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x42, 0x6a, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x42, 0x67, + 0x41, 0x47, 0x41, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x53, 0x37, 0x41, 0x4b, 0x56, + 0x45, 0x75, 0x77, 0x43, 0x31, 0x52, 0x62, 0x53, 0x37, 0x41, 0x4d, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, + 0x59, 0x0a, + 0x09, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x59, 0x41, 0x42, 0x67, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, + 0x7a, 0x68, 0x5a, 0x41, 0x54, 0x51, 0x6d, 0x49, 0x79, 0x49, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, + 0x32, 0x4e, 0x78, 0x51, 0x47, 0x49, 0x79, 0x49, 0x6d, 0x4e, 0x54, 0x51, 0x32, 0x4d, 0x7a, 0x49, 0x57, 0x41, + 0x70, 0x68, 0x59, 0x51, 0x45, 0x46, 0x58, 0x56, 0x30, 0x46, 0x41, 0x57, 0x48, 0x71, 0x66, 0x63, 0x33, 0x4f, + 0x66, 0x0a, + 0x09, 0x6e, 0x33, 0x4e, 0x7a, 0x6e, 0x77, 0x58, 0x30, 0x50, 0x31, 0x68, 0x58, 0x51, 0x45, 0x46, 0x58, 0x57, + 0x45, 0x42, 0x7a, 0x6f, 0x4b, 0x42, 0x7a, 0x63, 0x35, 0x2b, 0x66, 0x41, 0x41, 0x41, 0x42, 0x41, 0x53, 0x50, + 0x2b, 0x64, 0x51, 0x4c, 0x42, 0x41, 0x41, 0x41, 0x41, 0x45, 0x77, 0x41, 0x66, 0x51, 0x41, 0x34, 0x4a, 0x42, + 0x67, 0x6f, 0x4e, 0x38, 0x77, 0x59, 0x41, 0x45, 0x77, 0x41, 0x51, 0x4a, 0x77, 0x4d, 0x4a, 0x46, 0x42, 0x44, + 0x63, 0x0a, + 0x09, 0x31, 0x4f, 0x7a, 0x55, 0x7a, 0x44, 0x45, 0x41, 0x4c, 0x39, 0x54, 0x38, 0x78, 0x42, 0x49, 0x35, 0x4d, + 0x43, 0x45, 0x57, 0x46, 0x68, 0x55, 0x55, 0x42, 0x69, 0x4d, 0x69, 0x4a, 0x69, 0x63, 0x31, 0x46, 0x68, 0x59, + 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x6e, 0x41, 0x6c, 0x51, 0x33, 0x4e, 0x6e, 0x68, 0x32, 0x4c, + 0x6c, 0x63, 0x72, 0x49, 0x6b, 0x6f, 0x76, 0x4f, 0x7a, 0x77, 0x72, 0x4c, 0x54, 0x35, 0x70, 0x4d, 0x46, 0x6c, + 0x62, 0x0a, + 0x09, 0x44, 0x41, 0x79, 0x44, 0x45, 0x51, 0x38, 0x77, 0x4c, 0x68, 0x35, 0x58, 0x50, 0x51, 0x41, 0x43, 0x41, + 0x50, 0x41, 0x45, 0x37, 0x67, 0x4f, 0x75, 0x42, 0x6d, 0x59, 0x41, 0x41, 0x77, 0x41, 0x48, 0x41, 0x45, 0x4a, + 0x41, 0x45, 0x51, 0x59, 0x43, 0x74, 0x41, 0x51, 0x41, 0x73, 0x77, 0x67, 0x45, 0x42, 0x77, 0x4d, 0x41, 0x42, + 0x51, 0x45, 0x44, 0x42, 0x51, 0x63, 0x49, 0x45, 0x4e, 0x54, 0x63, 0x31, 0x4d, 0x77, 0x52, 0x4f, 0x52, 0x45, + 0x53, 0x0a, + 0x09, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x50, 0x51, 0x38, 0x37, 0x44, 0x49, 0x77, 0x41, 0x45, 0x75, 0x77, 0x43, + 0x56, 0x52, 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x41, 0x6a, 0x2f, 0x77, 0x41, 0x41, + 0x42, 0x41, 0x41, 0x67, 0x41, 0x43, 0x41, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x4d, + 0x77, 0x4d, 0x6a, 0x41, 0x7a, 0x4d, 0x44, 0x49, 0x77, 0x4c, 0x38, 0x73, 0x76, 0x69, 0x48, 0x67, 0x61, 0x72, + 0x66, 0x0a, + 0x09, 0x69, 0x51, 0x5a, 0x6d, 0x2f, 0x6f, 0x67, 0x42, 0x65, 0x50, 0x36, 0x49, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x55, 0x7a, 0x2b, 0x64, 0x51, 0x4c, 0x42, 0x41, 0x41, 0x41, 0x41, 0x45, 0x77, 0x41, 0x67, 0x51, 0x41, 0x38, + 0x4c, 0x44, 0x67, 0x6f, 0x48, 0x38, 0x77, 0x37, 0x30, 0x41, 0x41, 0x45, 0x41, 0x43, 0x67, 0x51, 0x6e, 0x45, + 0x52, 0x51, 0x51, 0x31, 0x4f, 0x7a, 0x45, 0x31, 0x4d, 0x77, 0x78, 0x41, 0x43, 0x2f, 0x38, 0x2f, 0x4d, 0x51, + 0x53, 0x0a, + 0x09, 0x4f, 0x54, 0x41, 0x68, 0x4d, 0x77, 0x59, 0x47, 0x46, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x4e, + 0x78, 0x55, 0x47, 0x42, 0x69, 0x4d, 0x69, 0x4a, 0x6a, 0x55, 0x30, 0x4e, 0x67, 0x47, 0x34, 0x64, 0x79, 0x30, + 0x72, 0x4e, 0x7a, 0x59, 0x67, 0x50, 0x68, 0x38, 0x6d, 0x52, 0x42, 0x35, 0x36, 0x63, 0x7a, 0x55, 0x39, 0x57, + 0x42, 0x38, 0x75, 0x4c, 0x67, 0x38, 0x50, 0x68, 0x51, 0x6f, 0x4b, 0x56, 0x31, 0x30, 0x77, 0x61, 0x51, 0x41, + 0x42, 0x0a, + 0x09, 0x41, 0x4d, 0x45, 0x45, 0x37, 0x67, 0x4d, 0x2f, 0x42, 0x6d, 0x59, 0x41, 0x42, 0x67, 0x41, 0x33, 0x51, + 0x41, 0x77, 0x44, 0x41, 0x4c, 0x51, 0x45, 0x41, 0x62, 0x4d, 0x48, 0x41, 0x77, 0x56, 0x31, 0x41, 0x51, 0x63, + 0x51, 0x33, 0x4f, 0x77, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x39, 0x44, 0x7a, 0x73, 0x4f, 0x54, 0x41, 0x41, 0x53, + 0x37, 0x41, 0x4a, 0x56, 0x45, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x62, 0x57, 0x4c, 0x30, 0x41, 0x42, 0x2f, 0x2f, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x42, 0x77, 0x41, 0x48, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, + 0x51, 0x45, 0x44, 0x4d, 0x78, 0x63, 0x33, 0x4d, 0x77, 0x4d, 0x42, 0x74, 0x76, 0x57, 0x4c, 0x74, 0x4c, 0x53, + 0x4c, 0x39, 0x51, 0x54, 0x75, 0x41, 0x58, 0x6a, 0x31, 0x39, 0x66, 0x36, 0x49, 0x41, 0x41, 0x48, 0x2f, 0x38, + 0x67, 0x41, 0x41, 0x42, 0x48, 0x55, 0x46, 0x31, 0x51, 0x41, 0x4e, 0x41, 0x44, 0x39, 0x41, 0x48, 0x67, 0x77, + 0x4c, 0x0a, + 0x09, 0x43, 0x67, 0x51, 0x44, 0x41, 0x67, 0x59, 0x41, 0x42, 0x70, 0x55, 0x41, 0x67, 0x51, 0x67, 0x44, 0x42, + 0x41, 0x45, 0x4c, 0x44, 0x67, 0x41, 0x45, 0x42, 0x51, 0x45, 0x63, 0x44, 0x41, 0x63, 0x36, 0x43, 0x51, 0x42, + 0x35, 0x44, 0x68, 0x44, 0x30, 0x50, 0x4f, 0x7a, 0x45, 0x2f, 0x44, 0x7a, 0x45, 0x45, 0x52, 0x49, 0x35, 0x45, + 0x52, 0x49, 0x35, 0x4d, 0x51, 0x41, 0x76, 0x35, 0x4f, 0x77, 0x52, 0x46, 0x7a, 0x6b, 0x77, 0x74, 0x44, 0x41, + 0x50, 0x0a, + 0x09, 0x55, 0x41, 0x38, 0x43, 0x41, 0x56, 0x30, 0x54, 0x4d, 0x78, 0x45, 0x6c, 0x46, 0x77, 0x45, 0x52, 0x49, + 0x52, 0x55, 0x68, 0x45, 0x51, 0x63, 0x6e, 0x4e, 0x39, 0x50, 0x4c, 0x41, 0x54, 0x6c, 0x51, 0x2f, 0x6e, 0x63, + 0x43, 0x31, 0x2f, 0x78, 0x65, 0x6c, 0x45, 0x33, 0x68, 0x42, 0x64, 0x58, 0x39, 0x6d, 0x4e, 0x74, 0x76, 0x2f, + 0x75, 0x37, 0x39, 0x34, 0x36, 0x6f, 0x43, 0x4f, 0x32, 0x70, 0x75, 0x6e, 0x67, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x43, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x43, 0x53, 0x41, 0x59, 0x55, 0x41, 0x41, 0x73, 0x41, 0x58, 0x6b, 0x41, 0x61, 0x43, + 0x67, 0x6b, 0x49, 0x42, 0x41, 0x4d, 0x43, 0x42, 0x67, 0x43, 0x58, 0x42, 0x67, 0x4d, 0x45, 0x41, 0x51, 0x6b, + 0x4b, 0x41, 0x41, 0x52, 0x36, 0x42, 0x51, 0x45, 0x49, 0x43, 0x6e, 0x6f, 0x48, 0x41, 0x41, 0x77, 0x51, 0x31, + 0x44, 0x7a, 0x6b, 0x2f, 0x44, 0x7a, 0x6b, 0x45, 0x52, 0x49, 0x35, 0x45, 0x52, 0x49, 0x35, 0x4d, 0x51, 0x41, + 0x76, 0x0a, + 0x09, 0x37, 0x42, 0x63, 0x35, 0x4d, 0x41, 0x46, 0x4c, 0x73, 0x42, 0x42, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x44, + 0x41, 0x42, 0x41, 0x41, 0x41, 0x45, 0x41, 0x44, 0x41, 0x41, 0x4d, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, + 0x34, 0x57, 0x55, 0x41, 0x54, 0x45, 0x41, 0x31, 0x41, 0x44, 0x56, 0x41, 0x4e, 0x59, 0x41, 0x31, 0x7a, 0x42, + 0x48, 0x6f, 0x4b, 0x63, 0x41, 0x33, 0x67, 0x44, 0x66, 0x41, 0x4e, 0x43, 0x56, 0x30, 0x54, 0x4d, 0x78, 0x45, + 0x33, 0x0a, + 0x09, 0x46, 0x77, 0x63, 0x52, 0x49, 0x78, 0x45, 0x48, 0x4a, 0x7a, 0x66, 0x48, 0x75, 0x48, 0x31, 0x4d, 0x79, + 0x62, 0x68, 0x37, 0x53, 0x73, 0x55, 0x47, 0x46, 0x50, 0x32, 0x6d, 0x57, 0x6d, 0x71, 0x4e, 0x2f, 0x4f, 0x4d, + 0x43, 0x6d, 0x6c, 0x68, 0x71, 0x6a, 0x51, 0x44, 0x2f, 0x2f, 0x77, 0x43, 0x48, 0x2f, 0x2b, 0x4d, 0x45, 0x6f, + 0x67, 0x64, 0x74, 0x41, 0x69, 0x63, 0x41, 0x4e, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x45, + 0x49, 0x0a, + 0x09, 0x41, 0x49, 0x73, 0x42, 0x64, 0x66, 0x2f, 0x2f, 0x41, 0x47, 0x2f, 0x2f, 0x34, 0x77, 0x50, 0x48, 0x42, + 0x6d, 0x59, 0x43, 0x4a, 0x77, 0x42, 0x57, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x4f, 0x41, + 0x41, 0x46, 0x77, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x58, 0x41, 0x41, 0x41, 0x42, 0x52, 0x38, 0x48, 0x62, + 0x51, 0x49, 0x6e, 0x41, 0x44, 0x30, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x43, 0x41, 0x43, + 0x2b, 0x0a, + 0x09, 0x41, 0x58, 0x58, 0x2f, 0x2f, 0x77, 0x42, 0x59, 0x41, 0x41, 0x41, 0x44, 0x32, 0x77, 0x5a, 0x6d, 0x41, + 0x69, 0x63, 0x41, 0x58, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x44, 0x67, 0x41, 0x42, 0x73, + 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x51, 0x54, 0x2b, 0x6f, 0x67, 0x47, 0x75, 0x42, 0x5a, 0x67, 0x41, 0x41, + 0x77, 0x41, 0x48, 0x41, 0x42, 0x78, 0x41, 0x44, 0x51, 0x48, 0x31, 0x41, 0x41, 0x54, 0x31, 0x42, 0x51, 0x67, + 0x45, 0x0a, + 0x09, 0x41, 0x41, 0x55, 0x47, 0x41, 0x67, 0x67, 0x51, 0x33, 0x44, 0x7a, 0x73, 0x4d, 0x6a, 0x45, 0x41, 0x45, + 0x4e, 0x54, 0x73, 0x31, 0x4f, 0x77, 0x77, 0x41, 0x52, 0x45, 0x6a, 0x45, 0x52, 0x4d, 0x52, 0x49, 0x78, 0x45, + 0x42, 0x72, 0x71, 0x71, 0x71, 0x71, 0x67, 0x47, 0x59, 0x2f, 0x51, 0x6f, 0x43, 0x39, 0x67, 0x51, 0x41, 0x2f, + 0x51, 0x6f, 0x43, 0x39, 0x67, 0x41, 0x41, 0x41, 0x67, 0x41, 0x4b, 0x41, 0x41, 0x41, 0x46, 0x75, 0x67, 0x58, + 0x56, 0x0a, + 0x09, 0x41, 0x41, 0x77, 0x41, 0x47, 0x51, 0x42, 0x6e, 0x51, 0x43, 0x41, 0x51, 0x43, 0x61, 0x6b, 0x4c, 0x44, + 0x5a, 0x55, 0x41, 0x67, 0x52, 0x4b, 0x56, 0x44, 0x67, 0x73, 0x48, 0x42, 0x77, 0x45, 0x5a, 0x45, 0x77, 0x51, + 0x50, 0x44, 0x52, 0x59, 0x5a, 0x42, 0x44, 0x49, 0x4b, 0x45, 0x51, 0x30, 0x63, 0x43, 0x41, 0x42, 0x35, 0x47, + 0x68, 0x44, 0x30, 0x50, 0x4f, 0x77, 0x79, 0x78, 0x50, 0x54, 0x73, 0x45, 0x4d, 0x51, 0x58, 0x4f, 0x54, 0x45, + 0x41, 0x0a, + 0x09, 0x4c, 0x38, 0x59, 0x79, 0x37, 0x76, 0x62, 0x75, 0x45, 0x4f, 0x34, 0x79, 0x4d, 0x45, 0x41, 0x6f, 0x49, + 0x42, 0x74, 0x2f, 0x47, 0x37, 0x41, 0x62, 0x41, 0x35, 0x38, 0x4a, 0x6e, 0x77, 0x71, 0x66, 0x43, 0x35, 0x38, + 0x4d, 0x6e, 0x77, 0x36, 0x66, 0x44, 0x35, 0x38, 0x51, 0x6e, 0x78, 0x47, 0x2f, 0x43, 0x62, 0x38, 0x4b, 0x76, + 0x77, 0x75, 0x2f, 0x44, 0x4c, 0x38, 0x4f, 0x76, 0x77, 0x2b, 0x2f, 0x45, 0x4c, 0x38, 0x52, 0x45, 0x46, 0x30, + 0x42, 0x0a, + 0x09, 0x58, 0x52, 0x4d, 0x68, 0x49, 0x41, 0x41, 0x52, 0x45, 0x41, 0x41, 0x70, 0x41, 0x52, 0x45, 0x6a, 0x4e, + 0x54, 0x4d, 0x54, 0x45, 0x53, 0x45, 0x56, 0x49, 0x52, 0x45, 0x7a, 0x49, 0x41, 0x41, 0x52, 0x45, 0x41, 0x41, + 0x68, 0x30, 0x77, 0x47, 0x67, 0x41, 0x62, 0x45, 0x42, 0x6c, 0x76, 0x35, 0x70, 0x2f, 0x6c, 0x44, 0x2b, 0x59, + 0x4d, 0x6e, 0x4a, 0x79, 0x77, 0x46, 0x51, 0x2f, 0x72, 0x44, 0x7a, 0x41, 0x54, 0x55, 0x42, 0x48, 0x2f, 0x37, + 0x68, 0x0a, + 0x09, 0x2f, 0x73, 0x73, 0x46, 0x31, 0x66, 0x36, 0x58, 0x2f, 0x6f, 0x44, 0x2b, 0x66, 0x76, 0x36, 0x57, 0x41, + 0x72, 0x79, 0x51, 0x41, 0x65, 0x50, 0x2b, 0x48, 0x5a, 0x44, 0x39, 0x36, 0x67, 0x45, 0x59, 0x41, 0x53, 0x34, + 0x42, 0x4c, 0x41, 0x45, 0x58, 0x41, 0x41, 0x49, 0x41, 0x63, 0x66, 0x2f, 0x6a, 0x42, 0x48, 0x55, 0x47, 0x46, + 0x41, 0x41, 0x4f, 0x41, 0x43, 0x67, 0x42, 0x4a, 0x30, 0x42, 0x65, 0x4a, 0x58, 0x73, 0x6d, 0x4a, 0x52, 0x34, + 0x6a, 0x0a, + 0x09, 0x48, 0x69, 0x52, 0x37, 0x49, 0x79, 0x4d, 0x65, 0x44, 0x33, 0x73, 0x6a, 0x48, 0x69, 0x68, 0x37, 0x4a, + 0x79, 0x67, 0x65, 0x49, 0x78, 0x34, 0x6d, 0x4a, 0x79, 0x67, 0x6e, 0x4a, 0x53, 0x51, 0x6c, 0x4b, 0x43, 0x67, + 0x6e, 0x49, 0x69, 0x4d, 0x69, 0x48, 0x79, 0x41, 0x66, 0x49, 0x53, 0x41, 0x67, 0x48, 0x30, 0x49, 0x6f, 0x4a, + 0x79, 0x59, 0x6c, 0x49, 0x69, 0x45, 0x67, 0x48, 0x77, 0x67, 0x6a, 0x48, 0x67, 0x4d, 0x50, 0x49, 0x77, 0x4f, + 0x35, 0x0a, + 0x09, 0x47, 0x77, 0x6d, 0x35, 0x46, 0x59, 0x77, 0x62, 0x49, 0x37, 0x45, 0x70, 0x4a, 0x69, 0x63, 0x53, 0x44, + 0x43, 0x45, 0x67, 0x47, 0x43, 0x67, 0x6c, 0x49, 0x79, 0x49, 0x66, 0x42, 0x52, 0x34, 0x50, 0x42, 0x67, 0x77, + 0x53, 0x45, 0x6c, 0x45, 0x47, 0x45, 0x68, 0x68, 0x46, 0x4b, 0x52, 0x44, 0x38, 0x37, 0x50, 0x54, 0x73, 0x45, + 0x54, 0x6b, 0x35, 0x46, 0x7a, 0x6b, 0x53, 0x4f, 0x54, 0x6b, 0x52, 0x45, 0x6a, 0x6b, 0x35, 0x4d, 0x51, 0x41, + 0x51, 0x0a, + 0x09, 0x37, 0x4d, 0x54, 0x30, 0x37, 0x42, 0x44, 0x75, 0x45, 0x6a, 0x6b, 0x53, 0x4f, 0x52, 0x49, 0x58, 0x4f, + 0x54, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, 0x41, 0x37, 0x4a, 0x42, 0x78, 0x41, 0x49, 0x79, 0x51, 0x63, + 0x51, 0x43, 0x4d, 0x6b, 0x48, 0x45, 0x41, 0x37, 0x4a, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x4f, 0x37, + 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, 0x41, 0x6a, 0x74, 0x57, 0x53, 0x4b, 0x79, 0x50, 0x79, 0x6f, + 0x42, 0x0a, + 0x09, 0x41, 0x56, 0x31, 0x41, 0x64, 0x68, 0x59, 0x6c, 0x4b, 0x78, 0x38, 0x6f, 0x49, 0x69, 0x38, 0x6a, 0x4c, + 0x79, 0x51, 0x70, 0x4a, 0x53, 0x30, 0x6d, 0x4c, 0x53, 0x63, 0x71, 0x4b, 0x44, 0x59, 0x6c, 0x52, 0x69, 0x56, + 0x59, 0x49, 0x46, 0x67, 0x68, 0x59, 0x43, 0x42, 0x67, 0x49, 0x57, 0x59, 0x69, 0x64, 0x53, 0x42, 0x31, 0x49, + 0x58, 0x55, 0x69, 0x45, 0x79, 0x55, 0x6a, 0x4a, 0x53, 0x51, 0x6d, 0x4a, 0x69, 0x59, 0x6e, 0x4a, 0x79, 0x67, + 0x32, 0x0a, + 0x09, 0x4a, 0x44, 0x59, 0x6c, 0x52, 0x69, 0x52, 0x46, 0x4a, 0x56, 0x6f, 0x67, 0x57, 0x69, 0x46, 0x69, 0x49, + 0x47, 0x49, 0x68, 0x66, 0x77, 0x42, 0x2f, 0x41, 0x58, 0x38, 0x43, 0x65, 0x67, 0x4e, 0x37, 0x43, 0x58, 0x38, + 0x4b, 0x66, 0x77, 0x74, 0x2f, 0x44, 0x48, 0x38, 0x4e, 0x66, 0x77, 0x35, 0x2f, 0x44, 0x33, 0x38, 0x51, 0x66, + 0x78, 0x46, 0x2f, 0x45, 0x6e, 0x38, 0x54, 0x66, 0x78, 0x52, 0x37, 0x46, 0x58, 0x6f, 0x62, 0x65, 0x68, 0x78, + 0x2f, 0x0a, + 0x09, 0x48, 0x58, 0x38, 0x65, 0x64, 0x69, 0x42, 0x32, 0x49, 0x58, 0x67, 0x69, 0x6f, 0x43, 0x72, 0x77, 0x4b, + 0x69, 0x64, 0x64, 0x41, 0x46, 0x30, 0x42, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, 0x42, 0x59, + 0x7a, 0x4d, 0x6a, 0x59, 0x31, 0x4e, 0x43, 0x59, 0x54, 0x46, 0x68, 0x49, 0x56, 0x46, 0x41, 0x41, 0x6a, 0x49, + 0x67, 0x41, 0x31, 0x4e, 0x41, 0x41, 0x7a, 0x4d, 0x68, 0x59, 0x58, 0x4a, 0x77, 0x55, 0x6e, 0x4a, 0x53, 0x63, + 0x7a, 0x0a, + 0x09, 0x46, 0x79, 0x55, 0x58, 0x42, 0x51, 0x4e, 0x47, 0x4d, 0x6c, 0x67, 0x70, 0x70, 0x37, 0x6d, 0x75, 0x6b, + 0x70, 0x47, 0x75, 0x4e, 0x67, 0x6c, 0x2b, 0x63, 0x76, 0x37, 0x6b, 0x35, 0x75, 0x66, 0x2b, 0x35, 0x51, 0x45, + 0x55, 0x33, 0x52, 0x49, 0x30, 0x4b, 0x70, 0x2f, 0x2b, 0x77, 0x53, 0x45, 0x42, 0x47, 0x62, 0x58, 0x6b, 0x66, + 0x77, 0x46, 0x4e, 0x49, 0x66, 0x37, 0x5a, 0x41, 0x35, 0x4d, 0x52, 0x45, 0x4e, 0x6a, 0x44, 0x76, 0x4e, 0x37, + 0x65, 0x0a, + 0x09, 0x76, 0x48, 0x71, 0x38, 0x41, 0x53, 0x61, 0x50, 0x2f, 0x75, 0x43, 0x74, 0x2f, 0x2f, 0x37, 0x4a, 0x41, + 0x54, 0x66, 0x2f, 0x2b, 0x67, 0x45, 0x33, 0x42, 0x51, 0x57, 0x30, 0x61, 0x32, 0x4e, 0x63, 0x7a, 0x4a, 0x46, + 0x76, 0x59, 0x57, 0x49, 0x41, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x41, 0x41, 0x41, 0x42, 0x4f, 0x63, 0x48, 0x61, + 0x77, 0x49, 0x6e, 0x41, 0x44, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x42, 0x41, 0x42, + 0x7a, 0x0a, + 0x09, 0x41, 0x58, 0x58, 0x2f, 0x2f, 0x77, 0x41, 0x39, 0x2f, 0x6c, 0x59, 0x45, 0x66, 0x77, 0x5a, 0x6d, 0x41, + 0x69, 0x63, 0x41, 0x58, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x43, 0x4e, 0x41, 0x46, 0x34, + 0x41, 0x41, 0x41, 0x41, 0x43, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x53, 0x4e, 0x42, 0x64, 0x55, 0x41, 0x44, + 0x41, 0x41, 0x56, 0x41, 0x44, 0x31, 0x41, 0x47, 0x77, 0x36, 0x56, 0x43, 0x51, 0x32, 0x56, 0x41, 0x76, 0x59, + 0x41, 0x0a, + 0x09, 0x67, 0x51, 0x73, 0x56, 0x44, 0x77, 0x6b, 0x44, 0x42, 0x41, 0x45, 0x53, 0x47, 0x51, 0x59, 0x2f, 0x44, + 0x51, 0x6f, 0x42, 0x48, 0x41, 0x41, 0x45, 0x46, 0x68, 0x44, 0x38, 0x37, 0x44, 0x49, 0x79, 0x2f, 0x4f, 0x77, + 0x52, 0x46, 0x7a, 0x6b, 0x78, 0x41, 0x43, 0x2f, 0x30, 0x2f, 0x4f, 0x7a, 0x55, 0x37, 0x44, 0x42, 0x41, 0x43, + 0x51, 0x38, 0x58, 0x48, 0x78, 0x63, 0x2f, 0x46, 0x31, 0x38, 0x58, 0x42, 0x41, 0x46, 0x64, 0x45, 0x7a, 0x4d, + 0x52, 0x0a, + 0x09, 0x4d, 0x7a, 0x49, 0x45, 0x46, 0x52, 0x51, 0x45, 0x4b, 0x77, 0x45, 0x52, 0x49, 0x78, 0x4d, 0x52, 0x4d, + 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x49, 0x38, 0x6e, 0x4b, 0x2f, 0x76, 0x73, 0x42, 0x41, 0x66, 0x37, + 0x2f, 0x2b, 0x2f, 0x37, 0x4b, 0x79, 0x76, 0x36, 0x4e, 0x6d, 0x70, 0x6d, 0x4f, 0x42, 0x64, 0x58, 0x2b, 0x2b, + 0x4f, 0x48, 0x63, 0x33, 0x4f, 0x4c, 0x2b, 0x72, 0x67, 0x51, 0x6e, 0x2f, 0x64, 0x47, 0x53, 0x68, 0x6f, 0x61, + 0x52, 0x0a, + 0x09, 0x41, 0x41, 0x49, 0x41, 0x75, 0x76, 0x35, 0x57, 0x42, 0x4b, 0x51, 0x47, 0x46, 0x41, 0x41, 0x51, 0x41, + 0x42, 0x77, 0x41, 0x50, 0x6b, 0x41, 0x62, 0x46, 0x4c, 0x6b, 0x46, 0x43, 0x42, 0x71, 0x35, 0x41, 0x41, 0x36, + 0x4d, 0x43, 0x4c, 0x67, 0x42, 0x76, 0x51, 0x4f, 0x58, 0x48, 0x52, 0x45, 0x53, 0x43, 0x30, 0x63, 0x58, 0x42, + 0x41, 0x41, 0x49, 0x41, 0x6b, 0x59, 0x64, 0x45, 0x50, 0x7a, 0x73, 0x4d, 0x6a, 0x4c, 0x30, 0x37, 0x44, 0x45, + 0x41, 0x0a, + 0x09, 0x45, 0x4f, 0x7a, 0x6b, 0x35, 0x50, 0x54, 0x45, 0x37, 0x42, 0x44, 0x47, 0x37, 0x6a, 0x42, 0x41, 0x43, + 0x57, 0x41, 0x65, 0x67, 0x42, 0x36, 0x67, 0x48, 0x75, 0x41, 0x65, 0x42, 0x41, 0x46, 0x64, 0x4a, 0x52, 0x45, + 0x6a, 0x45, 0x54, 0x4d, 0x52, 0x50, 0x67, 0x45, 0x7a, 0x4d, 0x68, 0x49, 0x52, 0x45, 0x41, 0x49, 0x6a, 0x49, + 0x69, 0x59, 0x42, 0x4e, 0x43, 0x59, 0x6a, 0x49, 0x67, 0x59, 0x56, 0x46, 0x42, 0x59, 0x7a, 0x4d, 0x6a, 0x59, + 0x42, 0x0a, + 0x09, 0x63, 0x37, 0x6d, 0x35, 0x4f, 0x72, 0x46, 0x37, 0x7a, 0x50, 0x2f, 0x2f, 0x7a, 0x48, 0x75, 0x78, 0x41, + 0x6a, 0x69, 0x6e, 0x6b, 0x70, 0x4b, 0x6e, 0x70, 0x35, 0x4b, 0x53, 0x70, 0x36, 0x6a, 0x39, 0x72, 0x67, 0x65, + 0x2b, 0x2f, 0x61, 0x4a, 0x6b, 0x59, 0x66, 0x36, 0x38, 0x2f, 0x76, 0x6a, 0x2b, 0x2b, 0x50, 0x36, 0x38, 0x59, + 0x51, 0x48, 0x72, 0x79, 0x2b, 0x66, 0x6e, 0x79, 0x38, 0x76, 0x6e, 0x35, 0x77, 0x41, 0x41, 0x41, 0x51, 0x44, + 0x5a, 0x0a, + 0x09, 0x41, 0x69, 0x30, 0x46, 0x32, 0x77, 0x4c, 0x58, 0x41, 0x41, 0x4d, 0x41, 0x45, 0x62, 0x59, 0x41, 0x6e, + 0x41, 0x49, 0x45, 0x41, 0x51, 0x41, 0x45, 0x45, 0x4e, 0x54, 0x45, 0x4d, 0x51, 0x41, 0x51, 0x31, 0x4f, 0x77, + 0x77, 0x45, 0x79, 0x45, 0x56, 0x49, 0x64, 0x6b, 0x46, 0x41, 0x76, 0x72, 0x2b, 0x41, 0x74, 0x65, 0x71, 0x41, + 0x41, 0x41, 0x42, 0x41, 0x52, 0x6b, 0x41, 0x50, 0x77, 0x57, 0x63, 0x42, 0x4d, 0x55, 0x41, 0x43, 0x77, 0x43, + 0x46, 0x0a, + 0x09, 0x51, 0x45, 0x30, 0x4b, 0x6e, 0x41, 0x73, 0x4b, 0x42, 0x77, 0x67, 0x48, 0x43, 0x5a, 0x77, 0x49, 0x43, + 0x41, 0x63, 0x45, 0x6e, 0x41, 0x4d, 0x45, 0x42, 0x77, 0x63, 0x47, 0x42, 0x5a, 0x77, 0x47, 0x42, 0x77, 0x59, + 0x45, 0x6e, 0x41, 0x55, 0x45, 0x41, 0x51, 0x49, 0x42, 0x41, 0x35, 0x77, 0x43, 0x41, 0x67, 0x45, 0x4c, 0x6e, + 0x41, 0x41, 0x42, 0x41, 0x41, 0x71, 0x63, 0x43, 0x51, 0x6f, 0x42, 0x41, 0x51, 0x42, 0x43, 0x43, 0x67, 0x67, + 0x48, 0x0a, + 0x09, 0x42, 0x67, 0x51, 0x43, 0x41, 0x51, 0x41, 0x49, 0x42, 0x51, 0x4d, 0x4c, 0x43, 0x51, 0x77, 0x4c, 0x43, + 0x67, 0x6b, 0x48, 0x42, 0x51, 0x51, 0x44, 0x41, 0x51, 0x67, 0x43, 0x41, 0x41, 0x67, 0x47, 0x44, 0x42, 0x44, + 0x55, 0x50, 0x4d, 0x77, 0x79, 0x46, 0x7a, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x55, 0x50, 0x4d, 0x77, 0x79, 0x46, + 0x7a, 0x6b, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, + 0x48, 0x0a, + 0x09, 0x45, 0x41, 0x58, 0x74, 0x42, 0x78, 0x41, 0x49, 0x37, 0x51, 0x63, 0x51, 0x42, 0x65, 0x30, 0x48, 0x45, + 0x41, 0x6a, 0x74, 0x42, 0x78, 0x41, 0x46, 0x37, 0x51, 0x63, 0x51, 0x43, 0x4f, 0x31, 0x5a, 0x49, 0x67, 0x6b, + 0x43, 0x42, 0x77, 0x45, 0x42, 0x4a, 0x77, 0x45, 0x42, 0x4e, 0x77, 0x45, 0x42, 0x42, 0x5a, 0x7a, 0x2b, 0x4e, + 0x77, 0x48, 0x4a, 0x64, 0x2f, 0x34, 0x31, 0x2f, 0x6a, 0x56, 0x32, 0x41, 0x63, 0x6a, 0x2b, 0x4f, 0x48, 0x59, + 0x42, 0x0a, + 0x09, 0x79, 0x77, 0x48, 0x4c, 0x42, 0x45, 0x7a, 0x2b, 0x4e, 0x66, 0x34, 0x33, 0x65, 0x51, 0x48, 0x4c, 0x2f, + 0x6a, 0x56, 0x35, 0x41, 0x63, 0x6b, 0x42, 0x79, 0x33, 0x6e, 0x2b, 0x4e, 0x51, 0x48, 0x4c, 0x41, 0x41, 0x45, + 0x41, 0x69, 0x51, 0x4b, 0x63, 0x41, 0x73, 0x55, 0x46, 0x33, 0x77, 0x41, 0x4b, 0x41, 0x43, 0x78, 0x41, 0x47, + 0x41, 0x63, 0x41, 0x33, 0x51, 0x6b, 0x44, 0x33, 0x51, 0x51, 0x43, 0x33, 0x51, 0x6e, 0x33, 0x42, 0x5a, 0x45, + 0x4c, 0x0a, + 0x09, 0x43, 0x48, 0x77, 0x47, 0x58, 0x51, 0x4e, 0x38, 0x41, 0x58, 0x77, 0x41, 0x43, 0x78, 0x44, 0x63, 0x39, + 0x4f, 0x54, 0x38, 0x35, 0x44, 0x45, 0x41, 0x45, 0x50, 0x54, 0x73, 0x37, 0x4e, 0x54, 0x73, 0x45, 0x4f, 0x34, + 0x79, 0x4d, 0x42, 0x4d, 0x7a, 0x45, 0x51, 0x63, 0x31, 0x4e, 0x7a, 0x4d, 0x52, 0x4d, 0x78, 0x55, 0x68, 0x6e, + 0x4d, 0x7a, 0x66, 0x35, 0x6f, 0x6e, 0x4e, 0x2f, 0x64, 0x63, 0x44, 0x43, 0x67, 0x4a, 0x6a, 0x4b, 0x58, 0x51, + 0x6e, 0x0a, + 0x09, 0x2f, 0x53, 0x74, 0x75, 0x41, 0x41, 0x41, 0x42, 0x41, 0x46, 0x34, 0x43, 0x6e, 0x41, 0x4b, 0x30, 0x42, + 0x66, 0x41, 0x41, 0x47, 0x41, 0x42, 0x4b, 0x51, 0x43, 0x51, 0x41, 0x66, 0x51, 0x59, 0x45, 0x41, 0x42, 0x64, + 0x39, 0x42, 0x67, 0x59, 0x45, 0x51, 0x67, 0x51, 0x43, 0x41, 0x41, 0x37, 0x64, 0x44, 0x77, 0x44, 0x64, 0x41, + 0x76, 0x63, 0x4c, 0x33, 0x51, 0x38, 0x53, 0x6b, 0x52, 0x6b, 0x41, 0x44, 0x67, 0x68, 0x2b, 0x41, 0x52, 0x55, + 0x4f, 0x0a, + 0x09, 0x41, 0x78, 0x6b, 0x51, 0x33, 0x4d, 0x54, 0x55, 0x78, 0x4f, 0x77, 0x52, 0x4f, 0x54, 0x45, 0x41, 0x45, + 0x50, 0x54, 0x45, 0x37, 0x50, 0x7a, 0x73, 0x45, 0x4f, 0x34, 0x52, 0x45, 0x6a, 0x6b, 0x77, 0x53, 0x31, 0x4e, + 0x59, 0x42, 0x78, 0x41, 0x46, 0x37, 0x52, 0x63, 0x79, 0x42, 0x77, 0x58, 0x74, 0x57, 0x53, 0x49, 0x42, 0x49, + 0x52, 0x55, 0x68, 0x4e, 0x54, 0x59, 0x33, 0x41, 0x44, 0x55, 0x30, 0x4a, 0x69, 0x4d, 0x69, 0x42, 0x67, 0x63, + 0x31, 0x0a, + 0x09, 0x4e, 0x6a, 0x59, 0x7a, 0x4d, 0x68, 0x59, 0x56, 0x46, 0x41, 0x45, 0x47, 0x41, 0x51, 0x77, 0x42, 0x71, + 0x50, 0x32, 0x71, 0x49, 0x6a, 0x38, 0x42, 0x57, 0x47, 0x68, 0x56, 0x4e, 0x48, 0x70, 0x49, 0x54, 0x59, 0x55, + 0x35, 0x6b, 0x61, 0x37, 0x2b, 0x74, 0x54, 0x67, 0x44, 0x44, 0x6e, 0x4a, 0x75, 0x48, 0x7a, 0x67, 0x42, 0x4d, + 0x56, 0x35, 0x43, 0x55, 0x53, 0x4d, 0x6a, 0x65, 0x78, 0x77, 0x63, 0x68, 0x47, 0x79, 0x4c, 0x2f, 0x75, 0x51, + 0x77, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x59, 0x67, 0x4b, 0x4e, 0x41, 0x73, 0x30, 0x46, 0x38, 0x41, 0x41, 0x6f, 0x41, + 0x45, 0x68, 0x41, 0x4a, 0x77, 0x41, 0x56, 0x45, 0x77, 0x72, 0x64, 0x43, 0x52, 0x2f, 0x64, 0x49, 0x42, 0x50, + 0x64, 0x46, 0x51, 0x33, 0x64, 0x43, 0x66, 0x67, 0x47, 0x39, 0x78, 0x7a, 0x64, 0x49, 0x50, 0x67, 0x6a, 0x6b, + 0x53, 0x6b, 0x57, 0x45, 0x77, 0x41, 0x55, 0x47, 0x58, 0x34, 0x6d, 0x45, 0x48, 0x34, 0x44, 0x46, 0x42, 0x38, + 0x4a, 0x0a, + 0x09, 0x4b, 0x52, 0x44, 0x63, 0x78, 0x4d, 0x54, 0x55, 0x37, 0x4e, 0x54, 0x73, 0x45, 0x54, 0x6b, 0x35, 0x4f, + 0x54, 0x45, 0x41, 0x45, 0x50, 0x54, 0x6b, 0x37, 0x50, 0x7a, 0x6b, 0x37, 0x4e, 0x54, 0x73, 0x45, 0x4f, 0x34, + 0x51, 0x37, 0x68, 0x45, 0x53, 0x4f, 0x54, 0x41, 0x42, 0x46, 0x68, 0x59, 0x56, 0x46, 0x41, 0x59, 0x6a, 0x49, + 0x69, 0x59, 0x6e, 0x4e, 0x52, 0x59, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x49, 0x79, 0x4d, + 0x31, 0x0a, + 0x09, 0x4d, 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, 0x6d, 0x49, 0x79, 0x49, 0x47, 0x42, 0x7a, 0x55, 0x32, 0x4e, + 0x6a, 0x4d, 0x79, 0x46, 0x68, 0x55, 0x55, 0x42, 0x67, 0x49, 0x4d, 0x58, 0x47, 0x57, 0x2b, 0x73, 0x54, 0x6c, + 0x39, 0x52, 0x6a, 0x52, 0x33, 0x51, 0x32, 0x31, 0x34, 0x62, 0x32, 0x78, 0x57, 0x58, 0x6c, 0x35, 0x68, 0x5a, + 0x46, 0x38, 0x6f, 0x5a, 0x6c, 0x46, 0x4a, 0x67, 0x44, 0x65, 0x51, 0x71, 0x56, 0x6f, 0x45, 0x59, 0x42, 0x4a, + 0x74, 0x0a, + 0x09, 0x55, 0x6e, 0x79, 0x47, 0x46, 0x52, 0x52, 0x35, 0x47, 0x78, 0x70, 0x50, 0x52, 0x6b, 0x70, 0x4d, 0x62, + 0x44, 0x38, 0x38, 0x4f, 0x6a, 0x30, 0x53, 0x46, 0x33, 0x4d, 0x52, 0x45, 0x6e, 0x5a, 0x6a, 0x52, 0x57, 0x44, + 0x2f, 0x2f, 0x77, 0x43, 0x4a, 0x2f, 0x2b, 0x4d, 0x48, 0x66, 0x77, 0x58, 0x77, 0x41, 0x43, 0x63, 0x41, 0x38, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x4a, 0x77, 0x43, 0x38, 0x41, 0x7a, 0x55, 0x41, 0x41, 0x41, 0x41, + 0x48, 0x0a, + 0x09, 0x41, 0x51, 0x6b, 0x45, 0x69, 0x2f, 0x31, 0x6b, 0x2f, 0x2f, 0x38, 0x41, 0x69, 0x66, 0x2f, 0x6a, 0x42, + 0x7a, 0x38, 0x46, 0x38, 0x41, 0x41, 0x6e, 0x41, 0x50, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x63, + 0x41, 0x76, 0x41, 0x4d, 0x31, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x44, 0x78, 0x42, 0x49, 0x76, 0x39, 0x5a, + 0x50, 0x2f, 0x2f, 0x41, 0x47, 0x4c, 0x2f, 0x34, 0x77, 0x64, 0x2f, 0x42, 0x66, 0x41, 0x41, 0x4a, 0x77, 0x44, + 0x79, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x6e, 0x41, 0x4c, 0x77, 0x44, 0x4e, 0x51, 0x41, 0x41, 0x41, + 0x41, 0x63, 0x42, 0x43, 0x51, 0x53, 0x4c, 0x2f, 0x57, 0x54, 0x2f, 0x2f, 0x77, 0x42, 0x7a, 0x2f, 0x2b, 0x4d, + 0x46, 0x69, 0x77, 0x64, 0x74, 0x41, 0x69, 0x63, 0x41, 0x4b, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, + 0x77, 0x45, 0x4b, 0x41, 0x52, 0x73, 0x42, 0x64, 0x66, 0x2f, 0x2f, 0x41, 0x48, 0x48, 0x2b, 0x56, 0x67, 0x52, + 0x61, 0x0a, + 0x09, 0x42, 0x6b, 0x67, 0x43, 0x4a, 0x77, 0x42, 0x4b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, + 0x4e, 0x6f, 0x41, 0x69, 0x77, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x79, 0x51, 0x41, 0x41, 0x41, 0x5a, 0x55, + 0x48, 0x55, 0x41, 0x49, 0x6e, 0x41, 0x43, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x43, + 0x2f, 0x38, 0x76, 0x41, 0x58, 0x58, 0x2f, 0x2f, 0x77, 0x43, 0x48, 0x2f, 0x6e, 0x55, 0x45, 0x6f, 0x67, 0x58, + 0x77, 0x0a, + 0x09, 0x41, 0x69, 0x63, 0x41, 0x4e, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x44, 0x64, 0x41, + 0x49, 0x73, 0x41, 0x41, 0x50, 0x2f, 0x2f, 0x41, 0x47, 0x2f, 0x2b, 0x64, 0x51, 0x50, 0x48, 0x42, 0x48, 0x73, + 0x43, 0x4a, 0x77, 0x42, 0x57, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x4e, 0x30, 0x41, 0x46, + 0x77, 0x41, 0x41, 0x2f, 0x2f, 0x38, 0x41, 0x63, 0x2f, 0x2f, 0x6a, 0x42, 0x53, 0x63, 0x48, 0x61, 0x77, 0x49, + 0x6e, 0x0a, + 0x09, 0x41, 0x43, 0x59, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x42, 0x42, 0x41, 0x45, 0x74, 0x41, + 0x58, 0x58, 0x2f, 0x2f, 0x77, 0x42, 0x78, 0x2f, 0x2b, 0x4d, 0x44, 0x35, 0x77, 0x5a, 0x6d, 0x41, 0x69, 0x63, + 0x41, 0x52, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x42, 0x77, 0x43, 0x4e, 0x41, 0x49, 0x6b, 0x41, 0x41, + 0x50, 0x2f, 0x2f, 0x41, 0x48, 0x50, 0x2f, 0x34, 0x77, 0x55, 0x6e, 0x42, 0x32, 0x30, 0x43, 0x4a, 0x77, 0x41, + 0x6d, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x48, 0x41, 0x51, 0x67, 0x42, 0x4c, 0x51, 0x46, 0x31, 0x2f, + 0x2f, 0x38, 0x41, 0x63, 0x66, 0x2f, 0x6a, 0x41, 0x2b, 0x63, 0x47, 0x5a, 0x67, 0x49, 0x6e, 0x41, 0x45, 0x59, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x63, 0x41, 0x34, 0x41, 0x43, 0x4a, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x67, 0x42, 0x78, 0x2f, 0x2b, 0x4d, 0x45, 0x39, 0x41, 0x59, 0x55, 0x41, 0x42, 0x67, 0x41, 0x4a, 0x41, 0x42, + 0x4b, 0x0a, + 0x09, 0x51, 0x43, 0x51, 0x48, 0x41, 0x39, 0x4d, 0x4a, 0x41, 0x66, 0x6b, 0x69, 0x75, 0x51, 0x41, 0x57, 0x48, + 0x4c, 0x6b, 0x4e, 0x45, 0x49, 0x77, 0x57, 0x75, 0x41, 0x57, 0x58, 0x43, 0x77, 0x49, 0x66, 0x44, 0x41, 0x51, + 0x44, 0x41, 0x41, 0x67, 0x49, 0x43, 0x67, 0x5a, 0x48, 0x47, 0x52, 0x49, 0x54, 0x52, 0x53, 0x55, 0x51, 0x2f, + 0x4f, 0x7a, 0x30, 0x50, 0x4d, 0x54, 0x38, 0x46, 0x7a, 0x7a, 0x45, 0x4d, 0x51, 0x41, 0x76, 0x37, 0x4f, 0x54, + 0x30, 0x0a, + 0x09, 0x78, 0x4f, 0x77, 0x51, 0x78, 0x4f, 0x37, 0x39, 0x50, 0x4f, 0x34, 0x79, 0x4d, 0x4c, 0x5a, 0x67, 0x4a, + 0x6f, 0x41, 0x6d, 0x6f, 0x43, 0x59, 0x44, 0x41, 0x56, 0x30, 0x42, 0x45, 0x53, 0x45, 0x31, 0x49, 0x54, 0x55, + 0x7a, 0x46, 0x54, 0x4d, 0x56, 0x49, 0x78, 0x45, 0x6a, 0x4e, 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x43, 0x45, + 0x52, 0x41, 0x53, 0x4d, 0x7a, 0x49, 0x57, 0x41, 0x52, 0x51, 0x57, 0x4d, 0x7a, 0x49, 0x32, 0x4e, 0x54, 0x51, + 0x6d, 0x0a, + 0x09, 0x49, 0x79, 0x49, 0x47, 0x41, 0x36, 0x4c, 0x2b, 0x75, 0x67, 0x46, 0x47, 0x75, 0x4a, 0x71, 0x61, 0x75, + 0x44, 0x71, 0x78, 0x66, 0x4d, 0x76, 0x2f, 0x2f, 0x38, 0x74, 0x38, 0x73, 0x66, 0x33, 0x48, 0x70, 0x35, 0x4b, + 0x53, 0x71, 0x4b, 0x69, 0x53, 0x6b, 0x71, 0x63, 0x44, 0x74, 0x67, 0x46, 0x4f, 0x66, 0x5a, 0x4f, 0x54, 0x66, + 0x66, 0x72, 0x38, 0x71, 0x47, 0x52, 0x68, 0x41, 0x55, 0x51, 0x42, 0x43, 0x41, 0x45, 0x49, 0x41, 0x55, 0x52, + 0x68, 0x0a, + 0x09, 0x2f, 0x68, 0x58, 0x4c, 0x35, 0x2b, 0x66, 0x4c, 0x79, 0x2b, 0x66, 0x6e, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x47, 0x51, 0x42, 0x33, 0x77, 0x4a, 0x2f, 0x41, 0x6f, 0x4d, 0x41, 0x41, 0x77, 0x41, 0x52, 0x74, 0x67, 0x43, + 0x63, 0x41, 0x67, 0x51, 0x42, 0x41, 0x41, 0x51, 0x51, 0x33, 0x4d, 0x77, 0x78, 0x41, 0x42, 0x44, 0x55, 0x37, + 0x44, 0x41, 0x54, 0x49, 0x52, 0x55, 0x68, 0x5a, 0x41, 0x49, 0x62, 0x2f, 0x65, 0x55, 0x43, 0x67, 0x36, 0x51, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x32, 0x77, 0x4a, 0x49, 0x41, 0x61, 0x34, 0x44, 0x52, 0x67, 0x41, 0x44, 0x41, + 0x42, 0x4b, 0x33, 0x41, 0x6f, 0x4d, 0x41, 0x42, 0x41, 0x45, 0x5a, 0x41, 0x41, 0x51, 0x51, 0x31, 0x4f, 0x77, + 0x78, 0x41, 0x42, 0x44, 0x55, 0x37, 0x44, 0x41, 0x54, 0x4d, 0x78, 0x55, 0x6a, 0x32, 0x39, 0x50, 0x54, 0x41, + 0x30, 0x62, 0x2b, 0x41, 0x41, 0x45, 0x41, 0x41, 0x50, 0x2f, 0x6a, 0x42, 0x49, 0x38, 0x46, 0x38, 0x41, 0x41, + 0x78, 0x0a, + 0x09, 0x41, 0x52, 0x78, 0x41, 0x4f, 0x69, 0x41, 0x53, 0x30, 0x79, 0x49, 0x51, 0x4b, 0x77, 0x66, 0x54, 0x43, + 0x52, 0x6d, 0x68, 0x47, 0x71, 0x34, 0x57, 0x6c, 0x52, 0x30, 0x42, 0x6f, 0x51, 0x43, 0x75, 0x42, 0x4a, 0x55, + 0x76, 0x6b, 0x52, 0x32, 0x4d, 0x4b, 0x51, 0x6b, 0x79, 0x4b, 0x79, 0x49, 0x68, 0x4b, 0x53, 0x4d, 0x6d, 0x45, + 0x68, 0x41, 0x4b, 0x41, 0x77, 0x30, 0x4a, 0x45, 0x51, 0x67, 0x73, 0x49, 0x43, 0x59, 0x54, 0x42, 0x78, 0x45, + 0x49, 0x0a, + 0x09, 0x45, 0x51, 0x30, 0x63, 0x47, 0x51, 0x41, 0x6d, 0x4b, 0x69, 0x45, 0x76, 0x50, 0x4e, 0x54, 0x45, 0x4d, + 0x76, 0x7a, 0x45, 0x78, 0x42, 0x49, 0x35, 0x4f, 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x53, 0x4f, 0x52, 0x45, + 0x58, 0x4f, 0x52, 0x49, 0x35, 0x4f, 0x52, 0x45, 0x35, 0x4f, 0x54, 0x45, 0x41, 0x45, 0x4d, 0x51, 0x79, 0x35, + 0x50, 0x54, 0x73, 0x39, 0x4f, 0x77, 0x51, 0x37, 0x76, 0x62, 0x75, 0x45, 0x4f, 0x34, 0x79, 0x33, 0x54, 0x7a, + 0x75, 0x0a, + 0x09, 0x4d, 0x6a, 0x41, 0x42, 0x53, 0x37, 0x41, 0x4a, 0x56, 0x45, 0x75, 0x77, 0x44, 0x46, 0x52, 0x62, 0x53, + 0x37, 0x41, 0x4e, 0x56, 0x46, 0x74, 0x4c, 0x73, 0x41, 0x39, 0x55, 0x57, 0x30, 0x75, 0x77, 0x46, 0x31, 0x52, + 0x62, 0x53, 0x37, 0x41, 0x59, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x79, 0x2f, 0x38, 0x41, 0x41, 0x41, + 0x51, 0x41, 0x79, 0x41, 0x44, 0x49, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x51, 0x48, 0x6f, + 0x4f, 0x0a, + 0x09, 0x41, 0x41, 0x34, 0x42, 0x43, 0x77, 0x49, 0x4c, 0x4d, 0x56, 0x51, 0x55, 0x61, 0x51, 0x78, 0x73, 0x44, + 0x6d, 0x34, 0x50, 0x62, 0x78, 0x42, 0x76, 0x45, 0x57, 0x38, 0x53, 0x62, 0x78, 0x4e, 0x70, 0x46, 0x47, 0x73, + 0x66, 0x62, 0x79, 0x42, 0x76, 0x49, 0x57, 0x38, 0x69, 0x62, 0x79, 0x4e, 0x75, 0x4a, 0x47, 0x77, 0x6c, 0x61, + 0x53, 0x64, 0x70, 0x4c, 0x5a, 0x38, 0x48, 0x6e, 0x77, 0x69, 0x66, 0x43, 0x5a, 0x38, 0x4b, 0x6e, 0x77, 0x75, + 0x66, 0x0a, + 0x09, 0x44, 0x4a, 0x38, 0x4e, 0x6e, 0x77, 0x36, 0x66, 0x44, 0x35, 0x38, 0x51, 0x6e, 0x78, 0x47, 0x66, 0x45, + 0x70, 0x38, 0x54, 0x6c, 0x68, 0x2b, 0x66, 0x49, 0x4a, 0x38, 0x68, 0x6e, 0x79, 0x4b, 0x66, 0x49, 0x35, 0x38, + 0x6b, 0x6e, 0x79, 0x57, 0x66, 0x4a, 0x70, 0x38, 0x6e, 0x6e, 0x79, 0x69, 0x66, 0x4b, 0x5a, 0x38, 0x71, 0x6e, + 0x79, 0x75, 0x66, 0x4c, 0x4a, 0x30, 0x74, 0x4d, 0x67, 0x41, 0x49, 0x41, 0x41, 0x6b, 0x51, 0x43, 0x42, 0x41, + 0x4a, 0x0a, + 0x09, 0x49, 0x41, 0x67, 0x67, 0x43, 0x56, 0x55, 0x56, 0x55, 0x78, 0x35, 0x71, 0x46, 0x57, 0x63, 0x66, 0x43, + 0x6c, 0x30, 0x41, 0x58, 0x51, 0x45, 0x56, 0x4c, 0x67, 0x45, 0x6a, 0x49, 0x67, 0x59, 0x48, 0x49, 0x51, 0x63, + 0x68, 0x44, 0x67, 0x45, 0x56, 0x46, 0x42, 0x59, 0x58, 0x49, 0x51, 0x63, 0x68, 0x48, 0x67, 0x45, 0x7a, 0x4d, + 0x6a, 0x59, 0x33, 0x46, 0x51, 0x34, 0x42, 0x49, 0x79, 0x49, 0x41, 0x41, 0x79, 0x4d, 0x33, 0x4d, 0x7a, 0x51, + 0x6d, 0x0a, + 0x09, 0x4e, 0x54, 0x51, 0x32, 0x4e, 0x53, 0x4d, 0x33, 0x4d, 0x78, 0x49, 0x41, 0x4d, 0x7a, 0x49, 0x57, 0x42, + 0x49, 0x39, 0x62, 0x71, 0x57, 0x61, 0x64, 0x79, 0x69, 0x41, 0x43, 0x51, 0x54, 0x66, 0x39, 0x35, 0x67, 0x49, + 0x42, 0x41, 0x51, 0x49, 0x42, 0x76, 0x6a, 0x6a, 0x2b, 0x69, 0x69, 0x44, 0x4b, 0x6e, 0x57, 0x61, 0x70, 0x57, + 0x31, 0x6d, 0x35, 0x59, 0x4f, 0x33, 0x2b, 0x79, 0x79, 0x6a, 0x54, 0x4e, 0x34, 0x73, 0x42, 0x41, 0x63, 0x49, + 0x33, 0x0a, + 0x09, 0x6e, 0x43, 0x67, 0x42, 0x4e, 0x75, 0x78, 0x69, 0x75, 0x51, 0x56, 0x69, 0x31, 0x57, 0x6c, 0x61, 0x79, + 0x4c, 0x74, 0x37, 0x47, 0x43, 0x34, 0x6a, 0x49, 0x43, 0x34, 0x59, 0x65, 0x37, 0x76, 0x4b, 0x57, 0x6d, 0x6e, + 0x54, 0x53, 0x45, 0x67, 0x42, 0x49, 0x67, 0x45, 0x44, 0x65, 0x78, 0x63, 0x76, 0x49, 0x43, 0x4d, 0x76, 0x46, + 0x33, 0x73, 0x42, 0x41, 0x51, 0x45, 0x69, 0x52, 0x77, 0x41, 0x43, 0x41, 0x4e, 0x63, 0x46, 0x44, 0x67, 0x4d, + 0x70, 0x0a, + 0x09, 0x42, 0x64, 0x6b, 0x41, 0x41, 0x77, 0x41, 0x48, 0x41, 0x4b, 0x56, 0x41, 0x44, 0x51, 0x51, 0x41, 0x7a, + 0x67, 0x59, 0x43, 0x43, 0x41, 0x46, 0x6b, 0x41, 0x41, 0x56, 0x6b, 0x42, 0x41, 0x67, 0x51, 0x31, 0x50, 0x7a, + 0x63, 0x37, 0x44, 0x45, 0x41, 0x45, 0x4e, 0x51, 0x38, 0x37, 0x44, 0x49, 0x77, 0x41, 0x45, 0x75, 0x77, 0x44, + 0x6c, 0x52, 0x4c, 0x73, 0x42, 0x46, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x41, 0x67, 0x41, 0x51, 0x41, 0x41, + 0x42, 0x0a, + 0x09, 0x41, 0x41, 0x67, 0x41, 0x43, 0x50, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x53, + 0x37, 0x41, 0x4f, 0x56, 0x45, 0x75, 0x77, 0x44, 0x56, 0x52, 0x62, 0x53, 0x37, 0x41, 0x58, 0x56, 0x46, 0x74, + 0x59, 0x76, 0x51, 0x41, 0x49, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x49, 0x41, 0x41, 0x67, 0x41, 0x51, + 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x55, 0x75, 0x77, 0x45, 0x56, 0x52, 0x4c, 0x73, 0x42, 0x6c, + 0x55, 0x0a, + 0x09, 0x57, 0x31, 0x69, 0x39, 0x41, 0x41, 0x67, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x41, 0x67, 0x41, 0x43, + 0x50, 0x2f, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x41, 0x53, 0x37, 0x41, 0x59, 0x56, 0x46, 0x69, + 0x39, 0x41, 0x41, 0x6a, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x41, 0x67, 0x41, 0x43, 0x41, 0x42, 0x41, 0x4f, + 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x45, 0x57, 0x41, 0x42, 0x59, 0x41, 0x4a, 0x67, 0x42, 0x57, 0x41, + 0x47, 0x0a, + 0x09, 0x63, 0x41, 0x46, 0x77, 0x41, 0x6e, 0x41, 0x46, 0x63, 0x41, 0x59, 0x49, 0x41, 0x56, 0x30, 0x42, 0x4d, + 0x78, 0x55, 0x6a, 0x4a, 0x54, 0x4d, 0x56, 0x49, 0x77, 0x4a, 0x65, 0x79, 0x38, 0x76, 0x2b, 0x65, 0x63, 0x76, + 0x4c, 0x42, 0x64, 0x6e, 0x4c, 0x79, 0x38, 0x73, 0x41, 0x41, 0x51, 0x46, 0x7a, 0x42, 0x4f, 0x34, 0x43, 0x38, + 0x41, 0x58, 0x32, 0x41, 0x41, 0x4d, 0x41, 0x66, 0x30, 0x41, 0x52, 0x41, 0x67, 0x4d, 0x41, 0x41, 0x77, 0x45, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x4e, 0x43, 0x41, 0x41, 0x4c, 0x36, 0x42, 0x41, 0x45, 0x44, 0x41, 0x77, 0x51, 0x51, 0x78, + 0x42, 0x44, 0x41, 0x4d, 0x51, 0x41, 0x51, 0x39, 0x4d, 0x77, 0x77, 0x53, 0x31, 0x4e, 0x59, 0x42, 0x78, 0x41, + 0x46, 0x79, 0x51, 0x63, 0x51, 0x42, 0x63, 0x6c, 0x5a, 0x49, 0x67, 0x42, 0x4c, 0x73, 0x41, 0x78, 0x55, 0x57, + 0x4c, 0x30, 0x41, 0x42, 0x50, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x42, 0x41, 0x41, 0x45, 0x41, 0x45, 0x41, + 0x34, 0x0a, + 0x09, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x42, 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x42, + 0x41, 0x42, 0x41, 0x41, 0x41, 0x45, 0x41, 0x42, 0x41, 0x41, 0x45, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, + 0x34, 0x57, 0x55, 0x41, 0x67, 0x42, 0x67, 0x49, 0x56, 0x41, 0x69, 0x55, 0x42, 0x4a, 0x51, 0x49, 0x32, 0x41, + 0x6b, 0x59, 0x43, 0x56, 0x67, 0x4a, 0x71, 0x41, 0x57, 0x63, 0x43, 0x43, 0x51, 0x38, 0x41, 0x44, 0x77, 0x45, + 0x66, 0x0a, + 0x09, 0x41, 0x42, 0x38, 0x42, 0x4c, 0x77, 0x41, 0x76, 0x41, 0x51, 0x5a, 0x64, 0x41, 0x56, 0x30, 0x42, 0x4d, + 0x77, 0x4d, 0x6a, 0x41, 0x6a, 0x65, 0x35, 0x35, 0x4a, 0x6b, 0x46, 0x39, 0x76, 0x37, 0x34, 0x41, 0x41, 0x45, + 0x41, 0x74, 0x67, 0x55, 0x4f, 0x41, 0x30, 0x6f, 0x46, 0x36, 0x51, 0x41, 0x64, 0x41, 0x48, 0x56, 0x41, 0x49, + 0x52, 0x59, 0x51, 0x44, 0x77, 0x4d, 0x54, 0x44, 0x41, 0x63, 0x42, 0x41, 0x41, 0x4d, 0x49, 0x46, 0x77, 0x7a, + 0x44, 0x0a, + 0x09, 0x42, 0x42, 0x50, 0x44, 0x47, 0x77, 0x6a, 0x36, 0x48, 0x68, 0x41, 0x42, 0x44, 0x77, 0x41, 0x48, 0x46, + 0x6c, 0x59, 0x59, 0x42, 0x31, 0x59, 0x4a, 0x48, 0x68, 0x44, 0x55, 0x37, 0x4e, 0x54, 0x73, 0x45, 0x54, 0x6b, + 0x35, 0x4f, 0x54, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x30, 0x50, 0x4f, 0x7a, 0x55, 0x37, 0x44, 0x49, 0x53, 0x46, + 0x7a, 0x6b, 0x52, 0x45, 0x68, 0x63, 0x35, 0x4d, 0x41, 0x42, 0x4c, 0x73, 0x41, 0x78, 0x55, 0x57, 0x4c, 0x30, + 0x41, 0x0a, + 0x09, 0x48, 0x76, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x48, 0x67, 0x41, 0x65, 0x41, 0x45, 0x41, 0x34, 0x45, + 0x54, 0x63, 0x34, 0x57, 0x51, 0x42, 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x48, 0x67, 0x42, + 0x41, 0x41, 0x41, 0x45, 0x41, 0x48, 0x67, 0x41, 0x65, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, + 0x62, 0x51, 0x51, 0x43, 0x78, 0x38, 0x61, 0x41, 0x6c, 0x30, 0x42, 0x4a, 0x79, 0x34, 0x42, 0x49, 0x79, 0x49, + 0x47, 0x0a, + 0x09, 0x48, 0x51, 0x45, 0x6a, 0x4e, 0x44, 0x59, 0x7a, 0x4d, 0x68, 0x59, 0x66, 0x41, 0x52, 0x34, 0x42, 0x4d, + 0x7a, 0x49, 0x32, 0x50, 0x51, 0x45, 0x7a, 0x44, 0x67, 0x45, 0x6a, 0x49, 0x69, 0x59, 0x42, 0x2f, 0x44, 0x6b, + 0x5a, 0x48, 0x77, 0x77, 0x6b, 0x4b, 0x48, 0x31, 0x6e, 0x56, 0x69, 0x51, 0x39, 0x4d, 0x44, 0x6b, 0x58, 0x49, + 0x67, 0x38, 0x67, 0x4b, 0x48, 0x30, 0x43, 0x5a, 0x31, 0x51, 0x69, 0x4f, 0x77, 0x55, 0x35, 0x49, 0x51, 0x34, + 0x4c, 0x0a, + 0x09, 0x4d, 0x69, 0x30, 0x47, 0x5a, 0x58, 0x59, 0x51, 0x47, 0x78, 0x34, 0x4e, 0x44, 0x44, 0x4d, 0x70, 0x42, + 0x6d, 0x52, 0x33, 0x45, 0x41, 0x41, 0x42, 0x41, 0x51, 0x77, 0x45, 0x37, 0x67, 0x4b, 0x4c, 0x42, 0x66, 0x59, + 0x41, 0x41, 0x77, 0x43, 0x4a, 0x51, 0x42, 0x45, 0x42, 0x41, 0x67, 0x4d, 0x43, 0x41, 0x41, 0x4d, 0x44, 0x41, + 0x6b, 0x49, 0x41, 0x41, 0x66, 0x6f, 0x45, 0x41, 0x51, 0x4d, 0x44, 0x42, 0x42, 0x44, 0x45, 0x45, 0x4d, 0x41, + 0x78, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x30, 0x7a, 0x44, 0x42, 0x4c, 0x55, 0x31, 0x67, 0x48, 0x45, 0x41, 0x58, 0x4a, 0x42, + 0x78, 0x41, 0x46, 0x79, 0x56, 0x6b, 0x69, 0x41, 0x45, 0x75, 0x77, 0x44, 0x46, 0x52, 0x59, 0x76, 0x51, 0x41, + 0x45, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x45, 0x41, 0x41, 0x51, 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, + 0x7a, 0x68, 0x5a, 0x41, 0x45, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x59, 0x76, 0x51, 0x41, 0x45, 0x41, 0x45, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x51, 0x41, 0x45, 0x41, 0x41, 0x54, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x51, + 0x43, 0x6f, 0x47, 0x41, 0x41, 0x59, 0x42, 0x46, 0x67, 0x41, 0x53, 0x41, 0x53, 0x51, 0x41, 0x4a, 0x41, 0x45, + 0x31, 0x41, 0x55, 0x4d, 0x42, 0x56, 0x51, 0x42, 0x56, 0x41, 0x5a, 0x38, 0x41, 0x6e, 0x77, 0x47, 0x76, 0x41, + 0x4b, 0x38, 0x42, 0x44, 0x67, 0x38, 0x41, 0x44, 0x77, 0x4d, 0x66, 0x41, 0x42, 0x38, 0x44, 0x4c, 0x77, 0x41, + 0x76, 0x0a, + 0x09, 0x41, 0x77, 0x5a, 0x64, 0x41, 0x56, 0x30, 0x42, 0x45, 0x79, 0x4d, 0x44, 0x41, 0x63, 0x66, 0x45, 0x6d, + 0x65, 0x59, 0x46, 0x39, 0x76, 0x37, 0x34, 0x41, 0x51, 0x67, 0x41, 0x41, 0x51, 0x44, 0x50, 0x42, 0x4f, 0x34, + 0x44, 0x4d, 0x51, 0x58, 0x34, 0x41, 0x41, 0x59, 0x41, 0x64, 0x30, 0x41, 0x4b, 0x42, 0x41, 0x41, 0x46, 0x41, + 0x76, 0x6f, 0x48, 0x42, 0x41, 0x49, 0x47, 0x42, 0x78, 0x44, 0x55, 0x78, 0x44, 0x6b, 0x78, 0x41, 0x42, 0x44, + 0x30, 0x0a, + 0x09, 0x50, 0x4d, 0x51, 0x35, 0x4d, 0x41, 0x42, 0x4c, 0x73, 0x41, 0x78, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x42, + 0x2f, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x42, 0x77, 0x41, 0x48, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, + 0x34, 0x57, 0x51, 0x42, 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x42, 0x77, 0x42, 0x41, 0x41, + 0x41, 0x45, 0x41, 0x42, 0x77, 0x41, 0x48, 0x2f, 0x38, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x51, 0x46, + 0x4c, 0x0a, + 0x09, 0x73, 0x41, 0x35, 0x55, 0x57, 0x4c, 0x30, 0x41, 0x42, 0x2f, 0x2f, 0x41, 0x41, 0x41, 0x45, 0x41, 0x42, + 0x77, 0x41, 0x48, 0x41, 0x45, 0x41, 0x34, 0x45, 0x54, 0x63, 0x34, 0x57, 0x55, 0x41, 0x54, 0x44, 0x77, 0x41, + 0x50, 0x41, 0x51, 0x77, 0x45, 0x48, 0x77, 0x41, 0x66, 0x41, 0x52, 0x30, 0x45, 0x4c, 0x77, 0x41, 0x76, 0x41, + 0x53, 0x30, 0x45, 0x43, 0x51, 0x42, 0x64, 0x41, 0x54, 0x4d, 0x54, 0x49, 0x79, 0x63, 0x48, 0x49, 0x77, 0x47, + 0x69, 0x0a, + 0x09, 0x76, 0x4e, 0x4f, 0x4c, 0x70, 0x71, 0x61, 0x4c, 0x42, 0x66, 0x6a, 0x2b, 0x39, 0x72, 0x4b, 0x79, 0x41, + 0x41, 0x45, 0x41, 0x7a, 0x77, 0x54, 0x75, 0x41, 0x7a, 0x45, 0x46, 0x2b, 0x41, 0x41, 0x47, 0x41, 0x49, 0x5a, + 0x41, 0x43, 0x67, 0x4d, 0x45, 0x41, 0x51, 0x44, 0x36, 0x42, 0x77, 0x4d, 0x46, 0x41, 0x51, 0x63, 0x51, 0x31, + 0x4d, 0x51, 0x35, 0x4d, 0x51, 0x41, 0x51, 0x39, 0x4d, 0x51, 0x79, 0x4f, 0x54, 0x41, 0x41, 0x53, 0x37, 0x41, + 0x4d, 0x0a, + 0x09, 0x56, 0x45, 0x75, 0x77, 0x43, 0x56, 0x52, 0x62, 0x53, 0x37, 0x41, 0x4b, 0x56, 0x46, 0x74, 0x4c, 0x73, + 0x41, 0x74, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x41, 0x66, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x41, 0x63, + 0x41, 0x42, 0x77, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x41, 0x53, 0x37, 0x41, 0x4f, 0x56, + 0x46, 0x69, 0x39, 0x41, 0x41, 0x63, 0x41, 0x51, 0x41, 0x41, 0x42, 0x41, 0x41, 0x63, 0x41, 0x42, 0x2f, 0x2f, + 0x41, 0x0a, + 0x09, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x42, 0x53, 0x37, 0x41, 0x4f, 0x56, 0x46, 0x69, 0x39, 0x41, + 0x41, 0x66, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x41, 0x63, 0x41, 0x42, 0x77, 0x42, 0x41, 0x4f, 0x42, 0x45, + 0x33, 0x4f, 0x46, 0x6c, 0x41, 0x45, 0x77, 0x41, 0x41, 0x41, 0x77, 0x4d, 0x41, 0x42, 0x68, 0x41, 0x41, 0x45, + 0x67, 0x4d, 0x51, 0x42, 0x69, 0x41, 0x41, 0x49, 0x67, 0x4d, 0x67, 0x42, 0x67, 0x6b, 0x41, 0x58, 0x51, 0x45, + 0x44, 0x0a, + 0x09, 0x4d, 0x78, 0x63, 0x33, 0x4d, 0x77, 0x4d, 0x42, 0x6f, 0x74, 0x4f, 0x4c, 0x70, 0x71, 0x61, 0x4c, 0x30, + 0x77, 0x54, 0x75, 0x41, 0x51, 0x71, 0x79, 0x73, 0x76, 0x37, 0x32, 0x41, 0x41, 0x41, 0x43, 0x41, 0x44, 0x38, + 0x43, 0x6e, 0x41, 0x4c, 0x30, 0x42, 0x64, 0x38, 0x41, 0x41, 0x67, 0x41, 0x4e, 0x41, 0x4e, 0x52, 0x41, 0x46, + 0x67, 0x41, 0x44, 0x43, 0x77, 0x66, 0x64, 0x42, 0x51, 0x45, 0x4a, 0x39, 0x77, 0x4f, 0x52, 0x44, 0x67, 0x45, + 0x4d, 0x0a, + 0x09, 0x43, 0x67, 0x42, 0x64, 0x42, 0x67, 0x67, 0x45, 0x44, 0x41, 0x34, 0x51, 0x33, 0x4e, 0x51, 0x38, 0x78, + 0x4f, 0x77, 0x79, 0x45, 0x54, 0x6b, 0x78, 0x41, 0x42, 0x44, 0x30, 0x2f, 0x4e, 0x51, 0x38, 0x37, 0x44, 0x49, + 0x53, 0x4f, 0x54, 0x41, 0x42, 0x53, 0x37, 0x41, 0x4f, 0x56, 0x45, 0x75, 0x77, 0x44, 0x31, 0x52, 0x62, 0x53, + 0x37, 0x41, 0x51, 0x56, 0x46, 0x74, 0x4c, 0x73, 0x42, 0x46, 0x55, 0x57, 0x30, 0x75, 0x77, 0x43, 0x31, 0x52, + 0x62, 0x0a, + 0x09, 0x53, 0x37, 0x41, 0x4b, 0x56, 0x46, 0x74, 0x59, 0x76, 0x51, 0x41, 0x4f, 0x41, 0x45, 0x41, 0x41, 0x41, + 0x51, 0x41, 0x4f, 0x41, 0x41, 0x37, 0x2f, 0x77, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x45, 0x75, + 0x77, 0x45, 0x56, 0x52, 0x4c, 0x73, 0x41, 0x35, 0x55, 0x57, 0x31, 0x69, 0x39, 0x41, 0x41, 0x37, 0x2f, 0x77, + 0x41, 0x41, 0x42, 0x41, 0x41, 0x34, 0x41, 0x44, 0x67, 0x42, 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6c, + 0x41, 0x0a, + 0x09, 0x56, 0x41, 0x73, 0x42, 0x48, 0x51, 0x45, 0x76, 0x41, 0x54, 0x6b, 0x42, 0x53, 0x51, 0x46, 0x47, 0x41, + 0x31, 0x6b, 0x44, 0x61, 0x51, 0x4f, 0x4c, 0x41, 0x36, 0x73, 0x44, 0x75, 0x77, 0x4d, 0x4c, 0x41, 0x51, 0x41, + 0x50, 0x41, 0x51, 0x38, 0x43, 0x44, 0x77, 0x55, 0x50, 0x42, 0x67, 0x38, 0x48, 0x44, 0x77, 0x67, 0x50, 0x43, + 0x77, 0x38, 0x4d, 0x44, 0x77, 0x30, 0x54, 0x41, 0x42, 0x38, 0x42, 0x48, 0x77, 0x49, 0x66, 0x42, 0x52, 0x38, + 0x47, 0x0a, + 0x09, 0x48, 0x77, 0x63, 0x66, 0x43, 0x42, 0x38, 0x4c, 0x48, 0x77, 0x77, 0x66, 0x44, 0x53, 0x49, 0x41, 0x4e, + 0x51, 0x42, 0x48, 0x41, 0x45, 0x73, 0x4e, 0x55, 0x77, 0x42, 0x62, 0x44, 0x57, 0x55, 0x41, 0x68, 0x41, 0x43, + 0x6c, 0x41, 0x4c, 0x55, 0x41, 0x48, 0x6c, 0x30, 0x42, 0x58, 0x51, 0x6b, 0x42, 0x49, 0x51, 0x4d, 0x7a, 0x45, + 0x54, 0x4d, 0x56, 0x49, 0x78, 0x55, 0x6a, 0x4e, 0x53, 0x45, 0x31, 0x41, 0x64, 0x33, 0x2b, 0x79, 0x77, 0x45, + 0x31, 0x0a, + 0x09, 0x46, 0x71, 0x61, 0x48, 0x68, 0x35, 0x44, 0x2b, 0x59, 0x67, 0x56, 0x6d, 0x2f, 0x6c, 0x30, 0x43, 0x48, + 0x50, 0x33, 0x6b, 0x62, 0x62, 0x71, 0x36, 0x65, 0x51, 0x41, 0x41, 0x41, 0x51, 0x44, 0x48, 0x42, 0x51, 0x59, + 0x44, 0x4f, 0x51, 0x58, 0x34, 0x41, 0x41, 0x30, 0x41, 0x61, 0x6b, 0x41, 0x4f, 0x42, 0x77, 0x41, 0x45, 0x77, + 0x77, 0x76, 0x36, 0x44, 0x67, 0x64, 0x57, 0x43, 0x41, 0x46, 0x57, 0x41, 0x41, 0x34, 0x51, 0x31, 0x4f, 0x7a, + 0x55, 0x0a, + 0x09, 0x37, 0x44, 0x45, 0x41, 0x45, 0x50, 0x54, 0x38, 0x78, 0x44, 0x49, 0x77, 0x41, 0x45, 0x75, 0x77, 0x44, + 0x46, 0x52, 0x59, 0x76, 0x51, 0x41, 0x4f, 0x2f, 0x38, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4f, 0x41, 0x41, 0x34, + 0x41, 0x51, 0x44, 0x67, 0x52, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x45, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x59, 0x76, + 0x51, 0x41, 0x4f, 0x41, 0x45, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4f, 0x41, 0x41, 0x37, 0x2f, 0x77, 0x44, 0x67, + 0x52, 0x0a, + 0x09, 0x4e, 0x7a, 0x68, 0x5a, 0x41, 0x55, 0x75, 0x77, 0x44, 0x6c, 0x52, 0x4c, 0x73, 0x41, 0x39, 0x55, 0x57, + 0x31, 0x69, 0x39, 0x41, 0x41, 0x37, 0x2f, 0x77, 0x41, 0x41, 0x42, 0x41, 0x41, 0x34, 0x41, 0x44, 0x67, 0x42, + 0x41, 0x4f, 0x42, 0x45, 0x33, 0x4f, 0x46, 0x6b, 0x54, 0x4d, 0x78, 0x34, 0x42, 0x4d, 0x7a, 0x49, 0x32, 0x4e, + 0x7a, 0x4d, 0x4f, 0x41, 0x53, 0x4d, 0x69, 0x4a, 0x73, 0x64, 0x32, 0x44, 0x57, 0x4e, 0x54, 0x55, 0x6d, 0x45, + 0x51, 0x0a, + 0x09, 0x64, 0x67, 0x71, 0x67, 0x6a, 0x35, 0x43, 0x66, 0x42, 0x66, 0x67, 0x32, 0x4f, 0x54, 0x63, 0x34, 0x64, + 0x33, 0x74, 0x36, 0x41, 0x41, 0x41, 0x42, 0x41, 0x5a, 0x6f, 0x46, 0x44, 0x67, 0x4a, 0x6d, 0x42, 0x64, 0x73, + 0x41, 0x41, 0x77, 0x41, 0x52, 0x74, 0x67, 0x41, 0x43, 0x2b, 0x67, 0x51, 0x42, 0x41, 0x41, 0x51, 0x51, 0x31, + 0x4d, 0x77, 0x78, 0x41, 0x42, 0x44, 0x30, 0x7a, 0x44, 0x41, 0x42, 0x4d, 0x78, 0x55, 0x6a, 0x41, 0x5a, 0x72, + 0x4d, 0x0a, + 0x09, 0x7a, 0x41, 0x58, 0x62, 0x7a, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, 0x41, 0x42, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x55, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x52, 0x6f, + 0x41, 0x41, 0x41, 0x45, 0x47, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x45, 0x44, 0x41, 0x41, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x4d, 0x45, 0x42, + 0x51, 0x59, 0x48, 0x43, 0x41, 0x6b, 0x4b, 0x43, 0x77, 0x77, 0x4e, 0x44, 0x67, 0x38, 0x51, 0x45, 0x52, 0x49, + 0x54, 0x46, 0x42, 0x55, 0x57, 0x46, 0x78, 0x67, 0x5a, 0x47, 0x68, 0x73, 0x63, 0x48, 0x52, 0x34, 0x66, 0x49, + 0x43, 0x45, 0x69, 0x49, 0x79, 0x51, 0x6c, 0x4a, 0x69, 0x63, 0x6f, 0x4b, 0x53, 0x6f, 0x72, 0x4c, 0x43, 0x30, + 0x75, 0x0a, + 0x09, 0x4c, 0x7a, 0x41, 0x78, 0x4d, 0x6a, 0x4d, 0x30, 0x4e, 0x54, 0x59, 0x33, 0x4f, 0x44, 0x6b, 0x36, 0x4f, + 0x7a, 0x77, 0x39, 0x50, 0x6a, 0x39, 0x41, 0x51, 0x55, 0x4a, 0x44, 0x52, 0x45, 0x56, 0x47, 0x52, 0x30, 0x68, + 0x4a, 0x53, 0x6b, 0x74, 0x4d, 0x54, 0x55, 0x35, 0x50, 0x55, 0x46, 0x46, 0x53, 0x55, 0x31, 0x52, 0x56, 0x56, + 0x6c, 0x64, 0x59, 0x57, 0x56, 0x70, 0x62, 0x58, 0x46, 0x31, 0x65, 0x58, 0x32, 0x42, 0x68, 0x41, 0x47, 0x4a, + 0x6a, 0x0a, + 0x09, 0x5a, 0x47, 0x56, 0x6d, 0x5a, 0x32, 0x68, 0x70, 0x61, 0x6d, 0x74, 0x73, 0x62, 0x57, 0x35, 0x76, 0x63, + 0x48, 0x46, 0x79, 0x63, 0x33, 0x52, 0x31, 0x64, 0x6e, 0x64, 0x34, 0x65, 0x58, 0x70, 0x37, 0x66, 0x48, 0x31, + 0x2b, 0x66, 0x34, 0x43, 0x42, 0x67, 0x6f, 0x4f, 0x45, 0x68, 0x59, 0x61, 0x48, 0x69, 0x49, 0x6d, 0x4b, 0x69, + 0x34, 0x79, 0x4e, 0x6a, 0x6f, 0x2b, 0x51, 0x6b, 0x5a, 0x4b, 0x54, 0x6c, 0x4a, 0x57, 0x57, 0x6c, 0x35, 0x69, + 0x5a, 0x0a, + 0x09, 0x6d, 0x70, 0x75, 0x63, 0x6e, 0x5a, 0x36, 0x66, 0x6f, 0x4b, 0x47, 0x69, 0x6f, 0x36, 0x53, 0x6c, 0x70, + 0x71, 0x65, 0x6f, 0x71, 0x61, 0x71, 0x72, 0x72, 0x4b, 0x32, 0x75, 0x72, 0x37, 0x43, 0x78, 0x73, 0x72, 0x4f, + 0x30, 0x74, 0x62, 0x61, 0x33, 0x75, 0x4c, 0x6d, 0x36, 0x75, 0x37, 0x79, 0x39, 0x76, 0x72, 0x2f, 0x41, 0x77, + 0x63, 0x4c, 0x44, 0x78, 0x4d, 0x58, 0x47, 0x78, 0x38, 0x6a, 0x4a, 0x79, 0x73, 0x76, 0x4d, 0x7a, 0x63, 0x37, + 0x50, 0x0a, + 0x09, 0x30, 0x4e, 0x45, 0x41, 0x30, 0x74, 0x50, 0x55, 0x31, 0x64, 0x62, 0x58, 0x32, 0x4e, 0x6e, 0x61, 0x32, + 0x39, 0x7a, 0x64, 0x33, 0x74, 0x2f, 0x67, 0x41, 0x41, 0x51, 0x43, 0x50, 0x67, 0x41, 0x41, 0x41, 0x44, 0x6f, + 0x41, 0x49, 0x41, 0x41, 0x45, 0x41, 0x42, 0x6f, 0x41, 0x66, 0x67, 0x44, 0x2f, 0x41, 0x51, 0x63, 0x42, 0x45, + 0x51, 0x45, 0x66, 0x41, 0x54, 0x45, 0x42, 0x51, 0x67, 0x46, 0x54, 0x41, 0x57, 0x45, 0x42, 0x65, 0x41, 0x46, + 0x2b, 0x0a, + 0x09, 0x41, 0x5a, 0x49, 0x43, 0x78, 0x77, 0x4c, 0x64, 0x41, 0x36, 0x6b, 0x44, 0x77, 0x43, 0x41, 0x6d, 0x49, + 0x44, 0x41, 0x67, 0x4f, 0x69, 0x43, 0x73, 0x49, 0x53, 0x49, 0x69, 0x42, 0x69, 0x49, 0x65, 0x49, 0x69, 0x73, + 0x69, 0x53, 0x43, 0x4a, 0x6c, 0x4a, 0x63, 0x72, 0x37, 0x41, 0x76, 0x2f, 0x2f, 0x41, 0x41, 0x41, 0x41, 0x49, + 0x41, 0x43, 0x67, 0x41, 0x51, 0x59, 0x42, 0x44, 0x41, 0x45, 0x65, 0x41, 0x54, 0x41, 0x42, 0x51, 0x51, 0x46, + 0x53, 0x0a, + 0x09, 0x41, 0x56, 0x34, 0x42, 0x65, 0x41, 0x46, 0x39, 0x41, 0x5a, 0x49, 0x43, 0x78, 0x67, 0x4c, 0x59, 0x41, + 0x36, 0x6b, 0x44, 0x77, 0x43, 0x41, 0x54, 0x49, 0x44, 0x41, 0x67, 0x4f, 0x53, 0x43, 0x73, 0x49, 0x53, 0x49, + 0x69, 0x41, 0x69, 0x49, 0x50, 0x49, 0x69, 0x73, 0x69, 0x53, 0x43, 0x4a, 0x67, 0x4a, 0x63, 0x72, 0x37, 0x41, + 0x66, 0x2f, 0x2f, 0x2f, 0x2b, 0x4d, 0x41, 0x41, 0x50, 0x2f, 0x31, 0x41, 0x41, 0x44, 0x2f, 0x32, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x2f, 0x36, 0x44, 0x2f, 0x58, 0x67, 0x41, 0x41, 0x2f, 0x30, 0x50, 0x2f, 0x61, 0x50, 0x38, 0x55, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x50, 0x7a, 0x32, 0x2f, 0x4e, 0x73, 0x41, 0x41, 0x4f, 0x43, 0x57, 0x34, 0x49, 0x58, + 0x67, 0x56, 0x74, 0x39, 0x71, 0x41, 0x41, 0x41, 0x41, 0x41, 0x4e, 0x35, 0x78, 0x33, 0x6c, 0x38, 0x41, 0x41, + 0x4e, 0x72, 0x76, 0x42, 0x62, 0x38, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x44, + 0x30, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x2f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x2b, 0x67, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x44, 0x36, 0x41, 0x50, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x49, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x67, 0x41, 0x53, 0x67, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x55, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x72, 0x41, 0x43, + 0x6a, 0x0a, + 0x09, 0x41, 0x49, 0x51, 0x41, 0x68, 0x51, 0x43, 0x39, 0x41, 0x4a, 0x59, 0x41, 0x35, 0x77, 0x43, 0x47, 0x41, + 0x49, 0x34, 0x41, 0x69, 0x77, 0x43, 0x64, 0x41, 0x4b, 0x6b, 0x41, 0x70, 0x41, 0x45, 0x41, 0x41, 0x49, 0x6f, + 0x41, 0x32, 0x51, 0x43, 0x44, 0x41, 0x4a, 0x4d, 0x41, 0x38, 0x51, 0x44, 0x79, 0x41, 0x49, 0x30, 0x41, 0x6c, + 0x77, 0x43, 0x49, 0x41, 0x4d, 0x4d, 0x41, 0x33, 0x51, 0x44, 0x77, 0x41, 0x4a, 0x34, 0x41, 0x71, 0x67, 0x44, + 0x7a, 0x0a, + 0x09, 0x41, 0x50, 0x51, 0x41, 0x39, 0x51, 0x43, 0x69, 0x41, 0x4b, 0x30, 0x41, 0x79, 0x51, 0x44, 0x48, 0x41, + 0x4b, 0x34, 0x41, 0x59, 0x67, 0x42, 0x6a, 0x41, 0x4a, 0x41, 0x41, 0x5a, 0x41, 0x44, 0x4c, 0x41, 0x47, 0x55, + 0x41, 0x79, 0x41, 0x44, 0x4b, 0x41, 0x4d, 0x38, 0x41, 0x7a, 0x41, 0x44, 0x4e, 0x41, 0x4d, 0x34, 0x41, 0x36, + 0x41, 0x42, 0x6d, 0x41, 0x4e, 0x49, 0x41, 0x30, 0x41, 0x44, 0x52, 0x41, 0x4b, 0x38, 0x41, 0x5a, 0x77, 0x44, + 0x76, 0x0a, + 0x09, 0x41, 0x4a, 0x45, 0x41, 0x31, 0x51, 0x44, 0x54, 0x41, 0x4e, 0x51, 0x41, 0x61, 0x41, 0x44, 0x71, 0x41, + 0x4f, 0x77, 0x41, 0x69, 0x51, 0x42, 0x71, 0x41, 0x47, 0x6b, 0x41, 0x61, 0x77, 0x42, 0x74, 0x41, 0x47, 0x77, + 0x41, 0x62, 0x67, 0x43, 0x67, 0x41, 0x47, 0x38, 0x41, 0x63, 0x51, 0x42, 0x77, 0x41, 0x48, 0x49, 0x41, 0x63, + 0x77, 0x42, 0x31, 0x41, 0x48, 0x51, 0x41, 0x64, 0x67, 0x42, 0x33, 0x41, 0x4f, 0x6b, 0x41, 0x65, 0x41, 0x42, + 0x36, 0x0a, + 0x09, 0x41, 0x48, 0x6b, 0x41, 0x65, 0x77, 0x42, 0x39, 0x41, 0x48, 0x77, 0x41, 0x75, 0x41, 0x43, 0x68, 0x41, + 0x48, 0x38, 0x41, 0x66, 0x67, 0x43, 0x41, 0x41, 0x49, 0x45, 0x41, 0x36, 0x77, 0x44, 0x74, 0x41, 0x4c, 0x6f, + 0x41, 0x2f, 0x51, 0x44, 0x2b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x50, 0x38, 0x41, 0x2b, + 0x41, 0x44, 0x57, 0x41, 0x50, 0x6b, 0x41, 0x2b, 0x67, 0x44, 0x6a, 0x41, 0x4f, 0x51, 0x41, 0x31, 0x77, 0x44, + 0x67, 0x0a, + 0x09, 0x41, 0x4e, 0x6f, 0x41, 0x32, 0x77, 0x44, 0x63, 0x41, 0x4e, 0x38, 0x41, 0x32, 0x41, 0x44, 0x65, 0x41, + 0x4c, 0x49, 0x41, 0x73, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x32, 0x41, 0x4c, 0x63, + 0x41, 0x78, 0x41, 0x41, 0x41, 0x41, 0x4c, 0x51, 0x41, 0x74, 0x51, 0x44, 0x46, 0x41, 0x41, 0x41, 0x41, 0x67, + 0x67, 0x44, 0x43, 0x41, 0x49, 0x63, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x71, 0x77, 0x43, + 0x59, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x4b, 0x67, 0x41, 0x6d, 0x67, 0x41, 0x41, 0x41, + 0x4a, 0x6b, 0x41, 0x37, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x76, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x45, 0x42, 0x41, 0x4b, 0x55, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x6b, + 0x67, 0x43, 0x50, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x4a, 0x51, 0x41, 0x6c, 0x51, 0x54, + 0x4e, 0x0a, + 0x09, 0x41, 0x47, 0x59, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x6f, 0x73, 0x41, 0x41, 0x41, 0x4b, 0x4c, 0x41, + 0x41, 0x41, 0x44, 0x4e, 0x51, 0x45, 0x31, 0x41, 0x36, 0x34, 0x41, 0x78, 0x51, 0x61, 0x30, 0x41, 0x4a, 0x34, + 0x46, 0x46, 0x77, 0x43, 0x71, 0x42, 0x35, 0x6f, 0x41, 0x63, 0x51, 0x59, 0x39, 0x41, 0x49, 0x45, 0x43, 0x4d, + 0x77, 0x44, 0x46, 0x41, 0x78, 0x38, 0x41, 0x73, 0x41, 0x4d, 0x66, 0x41, 0x4b, 0x51, 0x45, 0x41, 0x41, 0x41, + 0x39, 0x0a, + 0x09, 0x42, 0x72, 0x51, 0x41, 0x32, 0x51, 0x4b, 0x4c, 0x41, 0x4a, 0x34, 0x43, 0x34, 0x77, 0x42, 0x6b, 0x41, + 0x6f, 0x73, 0x41, 0x32, 0x77, 0x4b, 0x79, 0x41, 0x41, 0x41, 0x46, 0x46, 0x77, 0x43, 0x48, 0x42, 0x52, 0x63, + 0x41, 0x34, 0x51, 0x55, 0x58, 0x41, 0x4a, 0x59, 0x46, 0x46, 0x77, 0x43, 0x63, 0x42, 0x52, 0x63, 0x41, 0x5a, + 0x41, 0x55, 0x58, 0x41, 0x4a, 0x34, 0x46, 0x46, 0x77, 0x43, 0x50, 0x42, 0x52, 0x63, 0x41, 0x71, 0x41, 0x55, + 0x58, 0x0a, + 0x09, 0x41, 0x49, 0x73, 0x46, 0x46, 0x77, 0x43, 0x42, 0x41, 0x72, 0x49, 0x41, 0x38, 0x41, 0x4b, 0x79, 0x41, + 0x4a, 0x34, 0x47, 0x74, 0x41, 0x44, 0x5a, 0x42, 0x72, 0x51, 0x41, 0x32, 0x51, 0x61, 0x30, 0x41, 0x4e, 0x6b, + 0x45, 0x50, 0x77, 0x43, 0x54, 0x43, 0x41, 0x41, 0x41, 0x68, 0x77, 0x56, 0x35, 0x41, 0x42, 0x41, 0x46, 0x66, + 0x51, 0x44, 0x4a, 0x42, 0x5a, 0x59, 0x41, 0x63, 0x77, 0x59, 0x70, 0x41, 0x4d, 0x6b, 0x46, 0x44, 0x67, 0x44, + 0x4a, 0x0a, + 0x09, 0x42, 0x4a, 0x6f, 0x41, 0x79, 0x51, 0x59, 0x7a, 0x41, 0x48, 0x4d, 0x47, 0x42, 0x41, 0x44, 0x4a, 0x41, + 0x6c, 0x77, 0x41, 0x79, 0x51, 0x4a, 0x63, 0x2f, 0x35, 0x59, 0x46, 0x50, 0x77, 0x44, 0x4a, 0x42, 0x48, 0x55, + 0x41, 0x79, 0x51, 0x62, 0x6e, 0x41, 0x4d, 0x6b, 0x46, 0x2f, 0x41, 0x44, 0x4a, 0x42, 0x6b, 0x77, 0x41, 0x63, + 0x77, 0x54, 0x54, 0x41, 0x4d, 0x6b, 0x47, 0x54, 0x41, 0x42, 0x7a, 0x42, 0x59, 0x38, 0x41, 0x79, 0x51, 0x55, + 0x55, 0x0a, + 0x09, 0x41, 0x49, 0x63, 0x45, 0x34, 0x2f, 0x2f, 0x36, 0x42, 0x64, 0x73, 0x41, 0x73, 0x67, 0x56, 0x35, 0x41, + 0x42, 0x41, 0x48, 0x36, 0x51, 0x42, 0x45, 0x42, 0x58, 0x73, 0x41, 0x50, 0x51, 0x54, 0x6a, 0x2f, 0x2f, 0x77, + 0x46, 0x65, 0x77, 0x42, 0x63, 0x41, 0x78, 0x38, 0x41, 0x73, 0x41, 0x4b, 0x79, 0x41, 0x41, 0x41, 0x44, 0x48, + 0x77, 0x44, 0x48, 0x42, 0x72, 0x51, 0x41, 0x32, 0x51, 0x51, 0x41, 0x2f, 0x2b, 0x77, 0x45, 0x41, 0x41, 0x43, + 0x71, 0x0a, + 0x09, 0x42, 0x4f, 0x63, 0x41, 0x65, 0x77, 0x55, 0x55, 0x41, 0x4c, 0x6f, 0x45, 0x5a, 0x67, 0x42, 0x78, 0x42, + 0x52, 0x51, 0x41, 0x63, 0x51, 0x54, 0x73, 0x41, 0x48, 0x45, 0x43, 0x30, 0x51, 0x41, 0x76, 0x42, 0x52, 0x51, + 0x41, 0x63, 0x51, 0x55, 0x53, 0x41, 0x4c, 0x6f, 0x43, 0x4f, 0x51, 0x44, 0x42, 0x41, 0x6a, 0x6e, 0x2f, 0x32, + 0x77, 0x53, 0x69, 0x41, 0x4c, 0x6f, 0x43, 0x4f, 0x51, 0x44, 0x42, 0x42, 0x38, 0x73, 0x41, 0x75, 0x67, 0x55, + 0x53, 0x0a, + 0x09, 0x41, 0x4c, 0x6f, 0x45, 0x35, 0x51, 0x42, 0x78, 0x42, 0x52, 0x51, 0x41, 0x75, 0x67, 0x55, 0x55, 0x41, + 0x48, 0x45, 0x44, 0x53, 0x67, 0x43, 0x36, 0x42, 0x43, 0x73, 0x41, 0x62, 0x77, 0x4d, 0x6a, 0x41, 0x44, 0x63, + 0x46, 0x45, 0x67, 0x43, 0x75, 0x42, 0x4c, 0x77, 0x41, 0x50, 0x51, 0x61, 0x4c, 0x41, 0x46, 0x59, 0x45, 0x76, + 0x41, 0x41, 0x37, 0x42, 0x4c, 0x77, 0x41, 0x50, 0x51, 0x51, 0x7a, 0x41, 0x46, 0x67, 0x46, 0x46, 0x77, 0x45, + 0x41, 0x0a, + 0x09, 0x41, 0x72, 0x49, 0x42, 0x42, 0x41, 0x55, 0x58, 0x41, 0x51, 0x41, 0x47, 0x74, 0x41, 0x44, 0x5a, 0x42, + 0x58, 0x6b, 0x41, 0x45, 0x41, 0x56, 0x35, 0x41, 0x42, 0x41, 0x46, 0x6c, 0x67, 0x42, 0x7a, 0x42, 0x51, 0x34, + 0x41, 0x79, 0x51, 0x58, 0x38, 0x41, 0x4d, 0x6b, 0x47, 0x54, 0x41, 0x42, 0x7a, 0x42, 0x64, 0x73, 0x41, 0x73, + 0x67, 0x54, 0x6e, 0x41, 0x48, 0x73, 0x45, 0x35, 0x77, 0x42, 0x37, 0x42, 0x4f, 0x63, 0x41, 0x65, 0x77, 0x54, + 0x6e, 0x0a, + 0x09, 0x41, 0x48, 0x73, 0x45, 0x35, 0x77, 0x42, 0x37, 0x42, 0x4f, 0x63, 0x41, 0x65, 0x77, 0x52, 0x6d, 0x41, + 0x48, 0x45, 0x45, 0x37, 0x41, 0x42, 0x78, 0x42, 0x4f, 0x77, 0x41, 0x63, 0x51, 0x54, 0x73, 0x41, 0x48, 0x45, + 0x45, 0x37, 0x41, 0x42, 0x78, 0x41, 0x6a, 0x6b, 0x41, 0x6b, 0x41, 0x49, 0x35, 0x2f, 0x38, 0x63, 0x43, 0x4f, + 0x66, 0x2f, 0x65, 0x41, 0x6a, 0x6e, 0x2f, 0x39, 0x41, 0x55, 0x53, 0x41, 0x4c, 0x6f, 0x45, 0x35, 0x51, 0x42, + 0x78, 0x0a, + 0x09, 0x42, 0x4f, 0x55, 0x41, 0x63, 0x51, 0x54, 0x6c, 0x41, 0x48, 0x45, 0x45, 0x35, 0x51, 0x42, 0x78, 0x42, + 0x4f, 0x55, 0x41, 0x63, 0x51, 0x55, 0x53, 0x41, 0x4b, 0x34, 0x46, 0x45, 0x67, 0x43, 0x75, 0x42, 0x52, 0x49, + 0x41, 0x72, 0x67, 0x55, 0x53, 0x41, 0x4b, 0x34, 0x45, 0x41, 0x41, 0x41, 0x35, 0x42, 0x41, 0x41, 0x41, 0x77, + 0x77, 0x55, 0x58, 0x41, 0x4b, 0x77, 0x46, 0x46, 0x77, 0x43, 0x42, 0x42, 0x41, 0x41, 0x41, 0x58, 0x41, 0x53, + 0x34, 0x0a, + 0x09, 0x41, 0x54, 0x4d, 0x46, 0x46, 0x77, 0x43, 0x65, 0x42, 0x51, 0x6f, 0x41, 0x75, 0x67, 0x67, 0x41, 0x41, + 0x52, 0x73, 0x49, 0x41, 0x41, 0x45, 0x62, 0x43, 0x41, 0x41, 0x42, 0x4a, 0x77, 0x51, 0x41, 0x41, 0x58, 0x4d, + 0x45, 0x41, 0x41, 0x44, 0x58, 0x42, 0x72, 0x51, 0x41, 0x32, 0x51, 0x66, 0x4c, 0x41, 0x41, 0x67, 0x47, 0x54, + 0x41, 0x42, 0x6d, 0x42, 0x71, 0x6f, 0x41, 0x33, 0x51, 0x61, 0x30, 0x41, 0x4e, 0x6b, 0x47, 0x74, 0x41, 0x44, + 0x5a, 0x0a, + 0x09, 0x42, 0x72, 0x51, 0x41, 0x32, 0x51, 0x55, 0x58, 0x41, 0x46, 0x49, 0x46, 0x46, 0x77, 0x43, 0x75, 0x42, + 0x43, 0x4d, 0x41, 0x61, 0x41, 0x56, 0x6b, 0x41, 0x42, 0x6b, 0x47, 0x44, 0x67, 0x43, 0x63, 0x42, 0x4c, 0x62, + 0x2f, 0x34, 0x51, 0x51, 0x72, 0x41, 0x43, 0x38, 0x44, 0x78, 0x51, 0x42, 0x7a, 0x41, 0x38, 0x55, 0x41, 0x59, + 0x41, 0x59, 0x64, 0x41, 0x45, 0x34, 0x48, 0x32, 0x77, 0x42, 0x37, 0x42, 0x4f, 0x55, 0x41, 0x53, 0x41, 0x51, + 0x2f, 0x0a, + 0x09, 0x41, 0x49, 0x38, 0x44, 0x4e, 0x51, 0x45, 0x31, 0x42, 0x72, 0x51, 0x41, 0x32, 0x51, 0x55, 0x5a, 0x41, + 0x44, 0x30, 0x46, 0x46, 0x77, 0x41, 0x66, 0x42, 0x72, 0x51, 0x41, 0x32, 0x51, 0x56, 0x61, 0x2f, 0x2f, 0x6f, + 0x45, 0x35, 0x51, 0x43, 0x65, 0x42, 0x4f, 0x55, 0x41, 0x77, 0x51, 0x67, 0x41, 0x41, 0x4f, 0x77, 0x46, 0x46, + 0x77, 0x41, 0x41, 0x42, 0x58, 0x6b, 0x41, 0x45, 0x41, 0x56, 0x35, 0x41, 0x42, 0x41, 0x47, 0x54, 0x41, 0x42, + 0x7a, 0x0a, + 0x09, 0x43, 0x49, 0x38, 0x41, 0x63, 0x77, 0x67, 0x76, 0x41, 0x48, 0x45, 0x45, 0x41, 0x41, 0x41, 0x41, 0x43, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x6c, 0x41, 0x4b, 0x34, 0x45, 0x4a, 0x51, 0x43, 0x75, 0x41, 0x6f, 0x73, + 0x41, 0x72, 0x67, 0x4b, 0x4c, 0x41, 0x4c, 0x49, 0x47, 0x74, 0x41, 0x44, 0x5a, 0x41, 0x2f, 0x51, 0x41, 0x42, + 0x67, 0x53, 0x38, 0x41, 0x44, 0x30, 0x45, 0x34, 0x2f, 0x2f, 0x38, 0x41, 0x56, 0x62, 0x2b, 0x69, 0x51, 0x55, + 0x58, 0x0a, + 0x09, 0x41, 0x46, 0x34, 0x44, 0x4d, 0x77, 0x43, 0x65, 0x41, 0x7a, 0x4d, 0x41, 0x77, 0x51, 0x55, 0x4b, 0x41, + 0x43, 0x38, 0x46, 0x43, 0x67, 0x41, 0x76, 0x42, 0x41, 0x41, 0x41, 0x4f, 0x51, 0x4b, 0x4c, 0x41, 0x4e, 0x73, + 0x43, 0x69, 0x77, 0x43, 0x75, 0x42, 0x43, 0x55, 0x41, 0x72, 0x67, 0x71, 0x38, 0x41, 0x48, 0x45, 0x46, 0x65, + 0x51, 0x41, 0x51, 0x42, 0x51, 0x34, 0x41, 0x79, 0x51, 0x56, 0x35, 0x41, 0x42, 0x41, 0x46, 0x44, 0x67, 0x44, + 0x4a, 0x0a, + 0x09, 0x42, 0x51, 0x34, 0x41, 0x79, 0x51, 0x4a, 0x63, 0x41, 0x4b, 0x49, 0x43, 0x58, 0x50, 0x2f, 0x2b, 0x41, + 0x6c, 0x77, 0x41, 0x42, 0x67, 0x4a, 0x63, 0x41, 0x44, 0x73, 0x47, 0x54, 0x41, 0x42, 0x7a, 0x42, 0x6b, 0x77, + 0x41, 0x63, 0x77, 0x5a, 0x4d, 0x41, 0x48, 0x4d, 0x46, 0x32, 0x77, 0x43, 0x79, 0x42, 0x64, 0x73, 0x41, 0x73, + 0x67, 0x58, 0x62, 0x41, 0x4c, 0x49, 0x43, 0x4f, 0x51, 0x44, 0x42, 0x42, 0x41, 0x41, 0x41, 0x77, 0x51, 0x51, + 0x41, 0x0a, + 0x09, 0x41, 0x4c, 0x59, 0x45, 0x41, 0x41, 0x44, 0x56, 0x42, 0x41, 0x41, 0x41, 0x78, 0x77, 0x51, 0x41, 0x41, + 0x5a, 0x6f, 0x45, 0x41, 0x41, 0x44, 0x75, 0x42, 0x41, 0x41, 0x42, 0x49, 0x77, 0x51, 0x41, 0x41, 0x50, 0x41, + 0x45, 0x41, 0x41, 0x46, 0x4d, 0x42, 0x41, 0x41, 0x41, 0x77, 0x51, 0x52, 0x2f, 0x2f, 0x2f, 0x49, 0x43, 0x52, + 0x67, 0x41, 0x43, 0x42, 0x52, 0x51, 0x41, 0x68, 0x77, 0x51, 0x72, 0x41, 0x47, 0x38, 0x46, 0x65, 0x77, 0x42, + 0x63, 0x0a, + 0x09, 0x42, 0x44, 0x4d, 0x41, 0x57, 0x41, 0x4b, 0x79, 0x41, 0x51, 0x51, 0x47, 0x4d, 0x77, 0x41, 0x4b, 0x42, + 0x4f, 0x55, 0x41, 0x63, 0x51, 0x54, 0x6a, 0x2f, 0x2f, 0x77, 0x45, 0x76, 0x41, 0x41, 0x39, 0x42, 0x4e, 0x63, + 0x41, 0x79, 0x51, 0x55, 0x55, 0x41, 0x4c, 0x6f, 0x47, 0x74, 0x41, 0x44, 0x5a, 0x42, 0x72, 0x51, 0x42, 0x47, + 0x51, 0x4d, 0x31, 0x41, 0x49, 0x6b, 0x44, 0x4e, 0x51, 0x42, 0x65, 0x41, 0x7a, 0x55, 0x41, 0x59, 0x67, 0x66, + 0x42, 0x0a, + 0x09, 0x41, 0x49, 0x6b, 0x48, 0x77, 0x51, 0x43, 0x4a, 0x42, 0x38, 0x45, 0x41, 0x59, 0x67, 0x59, 0x7a, 0x41, + 0x48, 0x4d, 0x46, 0x46, 0x41, 0x42, 0x78, 0x41, 0x6c, 0x77, 0x41, 0x79, 0x51, 0x55, 0x55, 0x41, 0x49, 0x63, + 0x45, 0x4b, 0x77, 0x42, 0x76, 0x42, 0x5a, 0x59, 0x41, 0x63, 0x77, 0x52, 0x6d, 0x41, 0x48, 0x45, 0x46, 0x6c, + 0x67, 0x42, 0x7a, 0x42, 0x47, 0x59, 0x41, 0x63, 0x51, 0x55, 0x55, 0x41, 0x48, 0x45, 0x43, 0x34, 0x77, 0x42, + 0x6b, 0x0a, + 0x09, 0x41, 0x6f, 0x73, 0x41, 0x32, 0x77, 0x55, 0x58, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x44, 0x58, 0x42, + 0x41, 0x41, 0x42, 0x63, 0x77, 0x51, 0x41, 0x41, 0x4c, 0x59, 0x45, 0x41, 0x41, 0x45, 0x4d, 0x42, 0x41, 0x41, + 0x41, 0x7a, 0x77, 0x51, 0x41, 0x41, 0x4d, 0x38, 0x44, 0x4e, 0x51, 0x41, 0x2f, 0x42, 0x41, 0x41, 0x41, 0x78, + 0x77, 0x51, 0x41, 0x41, 0x5a, 0x6f, 0x41, 0x41, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x50, 0x38, + 0x72, 0x0a, + 0x09, 0x41, 0x49, 0x38, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x4d, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x51, 0x41, 0x43, 0x41, 0x41, 0x4d, 0x41, 0x42, 0x41, 0x41, 0x46, 0x41, 0x41, 0x59, 0x41, 0x42, + 0x77, 0x41, 0x49, 0x41, 0x41, 0x6b, 0x41, 0x43, 0x67, 0x41, 0x4c, 0x41, 0x41, 0x77, 0x41, 0x44, 0x51, 0x41, + 0x4f, 0x0a, + 0x09, 0x41, 0x41, 0x38, 0x41, 0x45, 0x41, 0x41, 0x52, 0x41, 0x42, 0x49, 0x41, 0x45, 0x77, 0x41, 0x55, 0x41, + 0x42, 0x55, 0x41, 0x46, 0x67, 0x41, 0x58, 0x41, 0x42, 0x67, 0x41, 0x47, 0x51, 0x41, 0x61, 0x41, 0x42, 0x73, + 0x41, 0x48, 0x41, 0x41, 0x64, 0x41, 0x42, 0x34, 0x41, 0x48, 0x77, 0x41, 0x67, 0x41, 0x43, 0x45, 0x41, 0x49, + 0x67, 0x41, 0x6a, 0x41, 0x43, 0x51, 0x41, 0x4a, 0x51, 0x41, 0x6d, 0x41, 0x43, 0x63, 0x41, 0x4b, 0x41, 0x41, + 0x70, 0x0a, + 0x09, 0x41, 0x43, 0x6f, 0x41, 0x4b, 0x77, 0x41, 0x73, 0x41, 0x43, 0x30, 0x41, 0x4c, 0x67, 0x41, 0x76, 0x41, + 0x44, 0x41, 0x41, 0x4d, 0x51, 0x41, 0x79, 0x41, 0x44, 0x4d, 0x41, 0x4e, 0x41, 0x41, 0x31, 0x41, 0x44, 0x59, + 0x41, 0x4e, 0x77, 0x41, 0x34, 0x41, 0x44, 0x6b, 0x41, 0x4f, 0x67, 0x41, 0x37, 0x41, 0x44, 0x77, 0x41, 0x50, + 0x51, 0x41, 0x2b, 0x41, 0x44, 0x38, 0x41, 0x51, 0x41, 0x42, 0x42, 0x41, 0x45, 0x49, 0x41, 0x51, 0x77, 0x42, + 0x45, 0x0a, + 0x09, 0x41, 0x45, 0x55, 0x41, 0x52, 0x67, 0x42, 0x48, 0x41, 0x45, 0x67, 0x41, 0x53, 0x51, 0x42, 0x4b, 0x41, + 0x45, 0x73, 0x41, 0x54, 0x41, 0x42, 0x4e, 0x41, 0x45, 0x34, 0x41, 0x54, 0x77, 0x42, 0x51, 0x41, 0x46, 0x45, + 0x41, 0x55, 0x67, 0x42, 0x54, 0x41, 0x46, 0x51, 0x41, 0x56, 0x51, 0x42, 0x57, 0x41, 0x46, 0x63, 0x41, 0x57, + 0x41, 0x42, 0x5a, 0x41, 0x46, 0x6f, 0x41, 0x57, 0x77, 0x42, 0x63, 0x41, 0x46, 0x30, 0x41, 0x58, 0x67, 0x42, + 0x66, 0x0a, + 0x09, 0x41, 0x47, 0x41, 0x41, 0x59, 0x51, 0x42, 0x69, 0x41, 0x47, 0x4d, 0x41, 0x5a, 0x41, 0x42, 0x6c, 0x41, + 0x47, 0x59, 0x41, 0x5a, 0x77, 0x42, 0x6f, 0x41, 0x47, 0x6b, 0x41, 0x61, 0x67, 0x42, 0x72, 0x41, 0x47, 0x77, + 0x41, 0x62, 0x51, 0x42, 0x75, 0x41, 0x47, 0x38, 0x41, 0x63, 0x41, 0x42, 0x78, 0x41, 0x48, 0x49, 0x41, 0x63, + 0x77, 0x42, 0x30, 0x41, 0x48, 0x55, 0x41, 0x64, 0x67, 0x42, 0x33, 0x41, 0x48, 0x67, 0x41, 0x65, 0x51, 0x42, + 0x36, 0x0a, + 0x09, 0x41, 0x48, 0x73, 0x41, 0x66, 0x41, 0x42, 0x39, 0x41, 0x48, 0x34, 0x41, 0x66, 0x77, 0x43, 0x41, 0x41, + 0x49, 0x45, 0x41, 0x67, 0x67, 0x43, 0x44, 0x41, 0x49, 0x51, 0x41, 0x68, 0x51, 0x43, 0x47, 0x41, 0x49, 0x63, + 0x41, 0x69, 0x41, 0x43, 0x4a, 0x41, 0x49, 0x6f, 0x41, 0x69, 0x77, 0x43, 0x4d, 0x41, 0x49, 0x30, 0x41, 0x6a, + 0x67, 0x43, 0x50, 0x41, 0x4a, 0x41, 0x41, 0x6b, 0x51, 0x43, 0x53, 0x41, 0x4a, 0x4d, 0x41, 0x6c, 0x41, 0x43, + 0x56, 0x0a, + 0x09, 0x41, 0x4a, 0x59, 0x41, 0x6c, 0x77, 0x43, 0x59, 0x41, 0x4a, 0x6b, 0x41, 0x6d, 0x67, 0x43, 0x62, 0x41, + 0x4a, 0x77, 0x41, 0x6e, 0x51, 0x43, 0x65, 0x41, 0x4a, 0x38, 0x41, 0x6f, 0x41, 0x43, 0x68, 0x41, 0x4b, 0x49, + 0x41, 0x6f, 0x77, 0x43, 0x6b, 0x41, 0x4b, 0x55, 0x41, 0x70, 0x67, 0x43, 0x6e, 0x41, 0x4b, 0x67, 0x41, 0x71, + 0x51, 0x43, 0x71, 0x41, 0x4b, 0x73, 0x41, 0x72, 0x41, 0x43, 0x74, 0x41, 0x4b, 0x34, 0x41, 0x72, 0x77, 0x43, + 0x77, 0x0a, + 0x09, 0x41, 0x4c, 0x45, 0x41, 0x73, 0x67, 0x43, 0x7a, 0x41, 0x4c, 0x51, 0x41, 0x74, 0x51, 0x43, 0x32, 0x41, + 0x4c, 0x63, 0x41, 0x75, 0x41, 0x43, 0x35, 0x41, 0x4c, 0x6f, 0x41, 0x75, 0x77, 0x43, 0x38, 0x41, 0x4c, 0x30, + 0x41, 0x76, 0x67, 0x43, 0x2f, 0x41, 0x4d, 0x41, 0x41, 0x77, 0x51, 0x44, 0x43, 0x41, 0x4d, 0x4d, 0x41, 0x78, + 0x41, 0x44, 0x46, 0x41, 0x4d, 0x59, 0x41, 0x78, 0x77, 0x44, 0x49, 0x41, 0x4d, 0x6b, 0x41, 0x79, 0x67, 0x44, + 0x4c, 0x0a, + 0x09, 0x41, 0x4d, 0x77, 0x41, 0x7a, 0x51, 0x44, 0x4f, 0x41, 0x4d, 0x38, 0x41, 0x30, 0x41, 0x44, 0x52, 0x41, + 0x4e, 0x4d, 0x41, 0x31, 0x41, 0x44, 0x56, 0x41, 0x4e, 0x59, 0x41, 0x31, 0x77, 0x44, 0x59, 0x41, 0x4e, 0x6b, + 0x41, 0x32, 0x67, 0x44, 0x62, 0x41, 0x4e, 0x77, 0x41, 0x33, 0x51, 0x44, 0x65, 0x41, 0x4e, 0x38, 0x41, 0x34, + 0x41, 0x44, 0x68, 0x41, 0x4f, 0x49, 0x41, 0x34, 0x77, 0x44, 0x6b, 0x41, 0x4f, 0x55, 0x41, 0x35, 0x67, 0x44, + 0x6e, 0x0a, + 0x09, 0x41, 0x4f, 0x67, 0x41, 0x36, 0x51, 0x44, 0x71, 0x41, 0x4f, 0x73, 0x41, 0x37, 0x41, 0x44, 0x74, 0x41, + 0x4f, 0x34, 0x41, 0x37, 0x77, 0x44, 0x77, 0x41, 0x50, 0x45, 0x41, 0x38, 0x67, 0x44, 0x7a, 0x41, 0x50, 0x55, + 0x41, 0x39, 0x41, 0x44, 0x32, 0x41, 0x50, 0x67, 0x41, 0x2b, 0x51, 0x44, 0x36, 0x41, 0x50, 0x73, 0x41, 0x2f, + 0x41, 0x44, 0x39, 0x41, 0x50, 0x34, 0x41, 0x2f, 0x77, 0x45, 0x41, 0x41, 0x51, 0x45, 0x42, 0x41, 0x67, 0x45, + 0x44, 0x0a, + 0x09, 0x41, 0x51, 0x51, 0x42, 0x42, 0x51, 0x45, 0x47, 0x41, 0x51, 0x63, 0x42, 0x43, 0x41, 0x45, 0x4a, 0x41, + 0x51, 0x6f, 0x42, 0x43, 0x77, 0x45, 0x4d, 0x41, 0x51, 0x30, 0x4a, 0x63, 0x32, 0x5a, 0x30, 0x61, 0x48, 0x6c, + 0x77, 0x61, 0x47, 0x56, 0x75, 0x44, 0x6e, 0x42, 0x6c, 0x63, 0x6d, 0x6c, 0x76, 0x5a, 0x47, 0x4e, 0x6c, 0x62, + 0x6e, 0x52, 0x6c, 0x63, 0x6d, 0x56, 0x6b, 0x42, 0x45, 0x56, 0x31, 0x63, 0x6d, 0x38, 0x46, 0x59, 0x7a, 0x59, + 0x30, 0x0a, + 0x09, 0x4e, 0x54, 0x6b, 0x46, 0x59, 0x7a, 0x59, 0x30, 0x4e, 0x6a, 0x41, 0x46, 0x59, 0x7a, 0x59, 0x30, 0x4e, + 0x6a, 0x45, 0x46, 0x59, 0x7a, 0x59, 0x30, 0x4e, 0x6a, 0x49, 0x46, 0x59, 0x7a, 0x59, 0x30, 0x4e, 0x6a, 0x4d, + 0x46, 0x59, 0x7a, 0x59, 0x30, 0x4e, 0x6a, 0x59, 0x46, 0x59, 0x7a, 0x59, 0x30, 0x4e, 0x6a, 0x63, 0x46, 0x59, + 0x7a, 0x59, 0x30, 0x4e, 0x6a, 0x67, 0x46, 0x59, 0x7a, 0x59, 0x30, 0x4e, 0x6a, 0x6b, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x43, 0x49, 0x41, 0x49, 0x67, 0x41, 0x69, 0x41, 0x43, 0x49, 0x41, 0x57, 0x41, 0x43, 0x54, 0x41, + 0x50, 0x38, 0x42, 0x74, 0x67, 0x4a, 0x50, 0x41, 0x34, 0x4d, 0x44, 0x73, 0x67, 0x50, 0x32, 0x42, 0x43, 0x45, + 0x45, 0x62, 0x67, 0x53, 0x59, 0x42, 0x4c, 0x51, 0x45, 0x79, 0x67, 0x54, 0x65, 0x42, 0x51, 0x4d, 0x46, 0x52, + 0x51, 0x57, 0x43, 0x42, 0x67, 0x55, 0x47, 0x66, 0x67, 0x62, 0x68, 0x42, 0x30, 0x77, 0x48, 0x74, 0x77, 0x66, + 0x38, 0x0a, + 0x09, 0x43, 0x47, 0x55, 0x49, 0x7a, 0x77, 0x6a, 0x75, 0x43, 0x52, 0x59, 0x4a, 0x55, 0x67, 0x6c, 0x7a, 0x43, + 0x61, 0x34, 0x4b, 0x48, 0x77, 0x72, 0x66, 0x43, 0x31, 0x67, 0x4c, 0x73, 0x41, 0x76, 0x37, 0x44, 0x44, 0x6f, + 0x4d, 0x61, 0x51, 0x79, 0x54, 0x44, 0x4f, 0x59, 0x4e, 0x46, 0x41, 0x30, 0x39, 0x44, 0x58, 0x6f, 0x4f, 0x44, + 0x51, 0x34, 0x76, 0x44, 0x71, 0x77, 0x50, 0x41, 0x41, 0x39, 0x46, 0x44, 0x34, 0x55, 0x50, 0x36, 0x78, 0x42, + 0x31, 0x0a, + 0x09, 0x45, 0x50, 0x45, 0x52, 0x4b, 0x52, 0x46, 0x77, 0x45, 0x65, 0x41, 0x53, 0x76, 0x52, 0x4f, 0x4b, 0x45, + 0x2b, 0x73, 0x55, 0x55, 0x42, 0x53, 0x4c, 0x46, 0x4c, 0x45, 0x55, 0x34, 0x52, 0x55, 0x44, 0x46, 0x52, 0x67, + 0x56, 0x51, 0x42, 0x58, 0x57, 0x46, 0x69, 0x49, 0x57, 0x62, 0x52, 0x61, 0x35, 0x46, 0x79, 0x4d, 0x58, 0x65, + 0x78, 0x66, 0x66, 0x47, 0x42, 0x73, 0x59, 0x51, 0x78, 0x69, 0x41, 0x47, 0x50, 0x67, 0x5a, 0x46, 0x68, 0x6c, + 0x33, 0x0a, + 0x09, 0x47, 0x62, 0x4d, 0x61, 0x42, 0x42, 0x70, 0x53, 0x47, 0x71, 0x45, 0x61, 0x32, 0x42, 0x75, 0x48, 0x47, + 0x38, 0x51, 0x63, 0x41, 0x42, 0x79, 0x64, 0x48, 0x62, 0x6f, 0x65, 0x68, 0x78, 0x39, 0x33, 0x48, 0x2b, 0x67, + 0x67, 0x57, 0x79, 0x42, 0x79, 0x49, 0x50, 0x4d, 0x68, 0x4e, 0x53, 0x46, 0x43, 0x49, 0x65, 0x49, 0x68, 0x37, + 0x79, 0x48, 0x38, 0x49, 0x67, 0x6b, 0x69, 0x46, 0x69, 0x49, 0x6a, 0x49, 0x6a, 0x41, 0x69, 0x50, 0x53, 0x4a, + 0x4b, 0x0a, + 0x09, 0x49, 0x6c, 0x63, 0x69, 0x5a, 0x43, 0x4a, 0x78, 0x49, 0x6e, 0x34, 0x69, 0x69, 0x79, 0x4b, 0x59, 0x49, + 0x71, 0x55, 0x69, 0x73, 0x69, 0x4b, 0x2f, 0x49, 0x73, 0x77, 0x69, 0x32, 0x53, 0x4c, 0x6d, 0x49, 0x76, 0x4d, + 0x6a, 0x41, 0x43, 0x4d, 0x4e, 0x49, 0x78, 0x6f, 0x6a, 0x4a, 0x79, 0x4d, 0x30, 0x49, 0x30, 0x45, 0x6a, 0x54, + 0x69, 0x4e, 0x62, 0x49, 0x32, 0x67, 0x6a, 0x6c, 0x43, 0x50, 0x50, 0x4a, 0x44, 0x51, 0x6b, 0x6a, 0x79, 0x55, + 0x7a, 0x0a, + 0x09, 0x4a, 0x56, 0x4d, 0x6c, 0x67, 0x53, 0x59, 0x55, 0x4a, 0x72, 0x6f, 0x6e, 0x53, 0x79, 0x65, 0x51, 0x4a, + 0x37, 0x63, 0x6f, 0x45, 0x79, 0x68, 0x59, 0x4b, 0x4d, 0x4d, 0x70, 0x58, 0x79, 0x6f, 0x6c, 0x4b, 0x6c, 0x77, + 0x71, 0x6f, 0x79, 0x72, 0x70, 0x4b, 0x33, 0x6f, 0x72, 0x30, 0x79, 0x78, 0x45, 0x4c, 0x49, 0x38, 0x73, 0x73, + 0x53, 0x31, 0x51, 0x4c, 0x61, 0x41, 0x75, 0x44, 0x69, 0x35, 0x53, 0x4c, 0x71, 0x6f, 0x76, 0x68, 0x7a, 0x42, + 0x42, 0x0a, + 0x09, 0x4d, 0x4c, 0x30, 0x78, 0x42, 0x54, 0x45, 0x68, 0x4d, 0x56, 0x41, 0x78, 0x7a, 0x7a, 0x4a, 0x49, 0x4d, + 0x6e, 0x6f, 0x79, 0x33, 0x7a, 0x4e, 0x47, 0x4d, 0x33, 0x41, 0x7a, 0x63, 0x44, 0x4e, 0x39, 0x4d, 0x34, 0x6f, + 0x7a, 0x6c, 0x7a, 0x50, 0x6d, 0x4e, 0x48, 0x6f, 0x30, 0x6a, 0x7a, 0x53, 0x6a, 0x4e, 0x4e, 0x45, 0x30, 0x2f, + 0x7a, 0x55, 0x63, 0x4e, 0x54, 0x6b, 0x31, 0x5a, 0x7a, 0x57, 0x52, 0x4e, 0x5a, 0x34, 0x31, 0x71, 0x7a, 0x58, + 0x50, 0x0a, + 0x09, 0x4e, 0x6c, 0x73, 0x32, 0x6b, 0x7a, 0x62, 0x4e, 0x4e, 0x30, 0x4d, 0x33, 0x71, 0x54, 0x66, 0x72, 0x4f, + 0x41, 0x41, 0x34, 0x48, 0x44, 0x68, 0x4b, 0x4f, 0x51, 0x38, 0x35, 0x48, 0x44, 0x6b, 0x70, 0x4f, 0x54, 0x59, + 0x35, 0x51, 0x7a, 0x6c, 0x51, 0x4f, 0x56, 0x30, 0x35, 0x61, 0x6a, 0x6c, 0x33, 0x4f, 0x59, 0x51, 0x35, 0x6b, + 0x54, 0x6d, 0x65, 0x4f, 0x61, 0x73, 0x35, 0x75, 0x44, 0x6e, 0x46, 0x4f, 0x64, 0x49, 0x35, 0x37, 0x7a, 0x6f, + 0x63, 0x0a, + 0x09, 0x4f, 0x6e, 0x73, 0x36, 0x6f, 0x44, 0x72, 0x6c, 0x4f, 0x77, 0x67, 0x37, 0x58, 0x6a, 0x75, 0x4f, 0x4f, + 0x38, 0x51, 0x37, 0x39, 0x44, 0x77, 0x69, 0x50, 0x46, 0x38, 0x38, 0x70, 0x7a, 0x79, 0x30, 0x50, 0x4d, 0x45, + 0x38, 0x7a, 0x6a, 0x7a, 0x62, 0x50, 0x50, 0x34, 0x39, 0x59, 0x7a, 0x34, 0x37, 0x50, 0x6b, 0x67, 0x2b, 0x56, + 0x54, 0x36, 0x59, 0x50, 0x75, 0x63, 0x2b, 0x2f, 0x54, 0x39, 0x68, 0x50, 0x34, 0x30, 0x2f, 0x33, 0x45, 0x41, + 0x36, 0x0a, + 0x09, 0x51, 0x45, 0x74, 0x41, 0x58, 0x45, 0x42, 0x74, 0x51, 0x48, 0x70, 0x41, 0x68, 0x30, 0x43, 0x55, 0x51, + 0x4b, 0x46, 0x41, 0x72, 0x6b, 0x43, 0x37, 0x51, 0x4d, 0x68, 0x41, 0x31, 0x55, 0x44, 0x69, 0x51, 0x55, 0x42, + 0x42, 0x56, 0x6b, 0x46, 0x72, 0x51, 0x6b, 0x56, 0x43, 0x71, 0x6b, 0x4c, 0x33, 0x51, 0x31, 0x39, 0x44, 0x73, + 0x6b, 0x50, 0x2f, 0x52, 0x46, 0x56, 0x45, 0x32, 0x30, 0x55, 0x71, 0x52, 0x54, 0x38, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x45, 0x41, 0x41, 0x43, 0x32, 0x47, 0x41, 0x41, 0x45, 0x48, 0x6c, 0x42, 0x67, 0x41, 0x41, + 0x41, 0x6f, 0x56, 0x65, 0x41, 0x41, 0x51, 0x41, 0x43, 0x54, 0x2f, 0x30, 0x77, 0x41, 0x51, 0x41, 0x43, 0x58, + 0x2f, 0x74, 0x77, 0x41, 0x51, 0x41, 0x43, 0x59, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x43, 0x63, 0x41, 0x41, + 0x41, 0x41, 0x51, 0x41, 0x43, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x43, 0x6f, 0x41, 0x53, 0x77, 0x41, + 0x51, 0x0a, + 0x09, 0x41, 0x43, 0x73, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x43, 0x30, 0x41, 0x63, 0x67, 0x41, 0x51, 0x41, + 0x43, 0x34, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x43, 0x38, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x44, 0x49, + 0x41, 0x4f, 0x51, 0x41, 0x51, 0x41, 0x44, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x44, 0x51, 0x41, 0x53, + 0x77, 0x41, 0x51, 0x41, 0x44, 0x55, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x44, 0x66, 0x2f, 0x52, 0x41, 0x41, + 0x51, 0x0a, + 0x09, 0x41, 0x44, 0x6e, 0x2f, 0x69, 0x41, 0x41, 0x51, 0x41, 0x44, 0x72, 0x2f, 0x72, 0x51, 0x41, 0x51, 0x41, + 0x44, 0x76, 0x2f, 0x6d, 0x67, 0x41, 0x51, 0x41, 0x44, 0x7a, 0x2f, 0x44, 0x51, 0x41, 0x51, 0x41, 0x44, 0x30, + 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x45, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x46, 0x45, 0x41, 0x41, + 0x41, 0x41, 0x51, 0x41, 0x46, 0x49, 0x41, 0x4a, 0x67, 0x41, 0x51, 0x41, 0x46, 0x55, 0x41, 0x41, 0x41, 0x41, + 0x51, 0x0a, + 0x09, 0x41, 0x46, 0x6e, 0x2f, 0x79, 0x51, 0x41, 0x51, 0x41, 0x46, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x46, 0x7a, 0x2f, 0x33, 0x41, 0x41, 0x51, 0x41, 0x47, 0x4c, 0x2f, 0x30, 0x77, 0x41, 0x51, 0x41, 0x47, 0x51, + 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x47, 0x63, 0x41, 0x4f, 0x51, 0x41, 0x51, 0x41, 0x48, 0x67, 0x41, 0x41, + 0x41, 0x41, 0x51, 0x41, 0x48, 0x6b, 0x41, 0x4a, 0x67, 0x41, 0x51, 0x41, 0x48, 0x6f, 0x41, 0x4a, 0x67, 0x41, + 0x51, 0x0a, + 0x09, 0x41, 0x48, 0x73, 0x41, 0x4a, 0x67, 0x41, 0x51, 0x41, 0x48, 0x77, 0x41, 0x4a, 0x67, 0x41, 0x51, 0x41, + 0x48, 0x30, 0x41, 0x4a, 0x67, 0x41, 0x51, 0x41, 0x49, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4a, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4b, 0x33, 0x2f, 0x30, 0x77, 0x41, 0x51, 0x41, 0x4b, 0x37, 0x2f, 0x30, + 0x77, 0x41, 0x51, 0x41, 0x4b, 0x38, 0x41, 0x4f, 0x51, 0x41, 0x51, 0x41, 0x4c, 0x72, 0x2f, 0x33, 0x41, 0x41, + 0x51, 0x0a, + 0x09, 0x41, 0x4c, 0x76, 0x2f, 0x44, 0x51, 0x41, 0x51, 0x41, 0x4d, 0x66, 0x2f, 0x30, 0x77, 0x41, 0x51, 0x41, + 0x4d, 0x6e, 0x2f, 0x30, 0x77, 0x41, 0x51, 0x41, 0x4e, 0x41, 0x41, 0x4f, 0x51, 0x41, 0x51, 0x41, 0x4e, 0x45, + 0x41, 0x4f, 0x51, 0x41, 0x51, 0x41, 0x4e, 0x49, 0x41, 0x4f, 0x51, 0x41, 0x51, 0x41, 0x4f, 0x55, 0x41, 0x41, + 0x41, 0x41, 0x51, 0x41, 0x4f, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x4f, 0x72, 0x2f, 0x44, 0x51, 0x41, + 0x51, 0x0a, + 0x09, 0x41, 0x4f, 0x76, 0x2f, 0x33, 0x41, 0x41, 0x51, 0x41, 0x4f, 0x77, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, + 0x50, 0x59, 0x41, 0x53, 0x77, 0x41, 0x51, 0x41, 0x50, 0x73, 0x41, 0x41, 0x41, 0x41, 0x51, 0x41, 0x50, 0x30, + 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x42, 0x44, 0x2f, 0x30, 0x77, 0x41, 0x6b, 0x41, 0x42, 0x48, 0x2f, 0x33, + 0x41, 0x41, 0x6b, 0x41, 0x42, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x43, 0x51, 0x41, 0x4f, 0x51, 0x41, + 0x6b, 0x0a, + 0x09, 0x41, 0x43, 0x62, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x43, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, + 0x44, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x44, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x44, 0x59, + 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x44, 0x66, 0x2f, 0x59, 0x51, 0x41, 0x6b, 0x41, 0x44, 0x67, 0x41, 0x41, + 0x41, 0x41, 0x6b, 0x41, 0x44, 0x6e, 0x2f, 0x66, 0x51, 0x41, 0x6b, 0x41, 0x44, 0x72, 0x2f, 0x6b, 0x41, 0x41, + 0x6b, 0x0a, + 0x09, 0x41, 0x44, 0x73, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x44, 0x7a, 0x2f, 0x59, 0x51, 0x41, 0x6b, 0x41, + 0x45, 0x62, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x45, 0x66, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x45, 0x6a, + 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x45, 0x6e, 0x2f, 0x74, 0x77, 0x41, 0x6b, 0x41, 0x46, 0x4c, 0x2f, 0x33, + 0x41, 0x41, 0x6b, 0x41, 0x46, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x46, 0x66, 0x2f, 0x33, 0x41, 0x41, + 0x6b, 0x0a, + 0x09, 0x41, 0x46, 0x67, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x46, 0x6e, 0x2f, 0x69, 0x41, 0x41, 0x6b, 0x41, + 0x46, 0x72, 0x2f, 0x72, 0x51, 0x41, 0x6b, 0x41, 0x46, 0x7a, 0x2f, 0x64, 0x51, 0x41, 0x6b, 0x41, 0x47, 0x49, + 0x41, 0x4f, 0x51, 0x41, 0x6b, 0x41, 0x47, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x47, 0x66, 0x2f, 0x33, + 0x41, 0x41, 0x6b, 0x41, 0x47, 0x67, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x47, 0x2f, 0x2f, 0x33, 0x41, 0x41, + 0x6b, 0x0a, + 0x09, 0x41, 0x48, 0x44, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x48, 0x48, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, + 0x48, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x48, 0x50, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x48, 0x6e, + 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x48, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x48, 0x76, 0x2f, 0x33, + 0x41, 0x41, 0x6b, 0x41, 0x48, 0x7a, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x48, 0x33, 0x2f, 0x33, 0x41, 0x41, + 0x6b, 0x0a, + 0x09, 0x41, 0x48, 0x34, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x48, 0x38, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, + 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x49, 0x45, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x4b, 0x6e, + 0x2f, 0x74, 0x77, 0x41, 0x6b, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x4b, 0x30, 0x41, 0x4f, + 0x51, 0x41, 0x6b, 0x41, 0x4b, 0x34, 0x41, 0x4f, 0x51, 0x41, 0x6b, 0x41, 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x41, + 0x6b, 0x0a, + 0x09, 0x41, 0x4c, 0x54, 0x2b, 0x2b, 0x41, 0x41, 0x6b, 0x41, 0x4c, 0x58, 0x2f, 0x41, 0x77, 0x41, 0x6b, 0x41, + 0x4c, 0x72, 0x2f, 0x64, 0x51, 0x41, 0x6b, 0x41, 0x4c, 0x76, 0x2f, 0x59, 0x51, 0x41, 0x6b, 0x41, 0x4d, 0x55, + 0x41, 0x4c, 0x77, 0x41, 0x6b, 0x41, 0x4d, 0x63, 0x41, 0x4f, 0x51, 0x41, 0x6b, 0x41, 0x4d, 0x6b, 0x41, 0x4f, + 0x51, 0x41, 0x6b, 0x41, 0x4e, 0x44, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x4e, 0x48, 0x2f, 0x33, 0x41, 0x41, + 0x6b, 0x0a, + 0x09, 0x41, 0x4e, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x4e, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, + 0x4e, 0x51, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x4e, 0x55, 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x4f, 0x4d, + 0x41, 0x41, 0x41, 0x41, 0x6b, 0x41, 0x4f, 0x72, 0x2f, 0x59, 0x51, 0x41, 0x6b, 0x41, 0x4f, 0x76, 0x2f, 0x64, + 0x51, 0x41, 0x6b, 0x41, 0x50, 0x62, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x50, 0x6b, 0x41, 0x41, 0x41, 0x41, + 0x6b, 0x0a, + 0x09, 0x41, 0x50, 0x76, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x50, 0x7a, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, + 0x50, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x6b, 0x41, 0x50, 0x37, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x42, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x6c, 0x41, 0x43, 0x62, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x43, 0x72, 0x2f, 0x33, + 0x41, 0x41, 0x6c, 0x41, 0x44, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x44, 0x62, 0x2f, 0x33, 0x41, 0x41, + 0x6c, 0x0a, + 0x09, 0x41, 0x44, 0x6e, 0x2f, 0x77, 0x51, 0x41, 0x6c, 0x41, 0x44, 0x72, 0x2f, 0x74, 0x77, 0x41, 0x6c, 0x41, + 0x44, 0x7a, 0x2f, 0x6b, 0x41, 0x41, 0x6c, 0x41, 0x47, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x47, 0x66, + 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x4b, 0x6e, 0x2f, 0x77, 0x51, 0x41, 0x6c, 0x41, 0x4b, 0x72, 0x2f, 0x33, + 0x41, 0x41, 0x6c, 0x41, 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x4c, 0x54, 0x2f, 0x6b, 0x41, 0x41, + 0x6c, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x6b, 0x41, 0x41, 0x6c, 0x41, 0x4c, 0x76, 0x2f, 0x6b, 0x41, 0x41, 0x6c, 0x41, + 0x4d, 0x58, 0x2f, 0x72, 0x51, 0x41, 0x6c, 0x41, 0x4e, 0x44, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x4e, 0x48, + 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x4e, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x4f, 0x50, 0x2f, 0x33, + 0x41, 0x41, 0x6c, 0x41, 0x4f, 0x72, 0x2f, 0x6b, 0x41, 0x41, 0x6c, 0x41, 0x50, 0x62, 0x2f, 0x33, 0x41, 0x41, + 0x6c, 0x0a, + 0x09, 0x41, 0x50, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, 0x50, 0x76, 0x2f, 0x33, 0x41, 0x41, 0x6c, 0x41, + 0x50, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x6d, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x43, 0x51, + 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x44, 0x7a, 0x2f, 0x33, + 0x41, 0x41, 0x6d, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x41, + 0x6d, 0x0a, + 0x09, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x6d, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, + 0x4b, 0x34, 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x4c, 0x55, + 0x41, 0x4a, 0x67, 0x41, 0x6d, 0x41, 0x4c, 0x76, 0x2f, 0x33, 0x41, 0x41, 0x6d, 0x41, 0x4d, 0x55, 0x41, 0x41, + 0x41, 0x41, 0x6d, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x41, + 0x6d, 0x0a, + 0x09, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x6d, 0x41, 0x4f, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x6d, 0x41, + 0x50, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x6e, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x6e, 0x41, 0x43, 0x54, + 0x2f, 0x33, 0x41, 0x41, 0x6e, 0x41, 0x44, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x6e, 0x41, 0x44, 0x6f, 0x41, 0x41, + 0x41, 0x41, 0x6e, 0x41, 0x44, 0x7a, 0x2f, 0x6b, 0x41, 0x41, 0x6e, 0x41, 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x41, + 0x6e, 0x0a, + 0x09, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x6e, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x6e, 0x41, + 0x4b, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x6e, 0x41, 0x4b, 0x37, 0x2f, 0x33, 0x41, 0x41, 0x6e, 0x41, 0x4c, 0x54, + 0x2f, 0x30, 0x77, 0x41, 0x6e, 0x41, 0x4c, 0x58, 0x2f, 0x79, 0x51, 0x41, 0x6e, 0x41, 0x4c, 0x76, 0x2f, 0x6b, + 0x41, 0x41, 0x6e, 0x41, 0x4d, 0x58, 0x2f, 0x52, 0x41, 0x41, 0x6e, 0x41, 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x41, + 0x6e, 0x0a, + 0x09, 0x41, 0x4d, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x6e, 0x41, 0x4f, 0x72, 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, + 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x70, 0x41, 0x42, 0x48, 0x2b, 0x74, 0x77, 0x41, 0x70, 0x41, 0x42, 0x33, + 0x2f, 0x59, 0x51, 0x41, 0x70, 0x41, 0x43, 0x54, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x44, 0x62, 0x2f, 0x33, + 0x41, 0x41, 0x70, 0x41, 0x44, 0x66, 0x2f, 0x33, 0x41, 0x41, 0x70, 0x41, 0x45, 0x54, 0x2f, 0x52, 0x41, 0x41, + 0x70, 0x0a, + 0x09, 0x41, 0x45, 0x6a, 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, 0x45, 0x7a, 0x2f, 0x61, 0x77, 0x41, 0x70, 0x41, + 0x46, 0x4c, 0x2f, 0x74, 0x77, 0x41, 0x70, 0x41, 0x46, 0x58, 0x2f, 0x61, 0x77, 0x41, 0x70, 0x41, 0x46, 0x6a, + 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, 0x46, 0x7a, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x47, 0x4c, 0x2f, 0x52, + 0x41, 0x41, 0x70, 0x41, 0x47, 0x6e, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x47, 0x72, 0x2f, 0x52, 0x41, 0x41, + 0x70, 0x0a, + 0x09, 0x41, 0x47, 0x76, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x47, 0x7a, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, + 0x47, 0x33, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x47, 0x37, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x48, 0x44, + 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, 0x48, 0x48, 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, 0x48, 0x4c, 0x2f, 0x6b, + 0x41, 0x41, 0x70, 0x41, 0x48, 0x50, 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, 0x48, 0x6e, 0x2f, 0x74, 0x77, 0x41, + 0x70, 0x0a, + 0x09, 0x41, 0x48, 0x72, 0x2f, 0x74, 0x77, 0x41, 0x70, 0x41, 0x48, 0x76, 0x2f, 0x74, 0x77, 0x41, 0x70, 0x41, + 0x48, 0x7a, 0x2f, 0x74, 0x77, 0x41, 0x70, 0x41, 0x48, 0x33, 0x2f, 0x74, 0x77, 0x41, 0x70, 0x41, 0x48, 0x37, + 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, 0x48, 0x2f, 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, 0x49, 0x44, 0x2f, 0x6b, + 0x41, 0x41, 0x70, 0x41, 0x49, 0x48, 0x2f, 0x6b, 0x41, 0x41, 0x70, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x41, + 0x70, 0x0a, + 0x09, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x70, 0x41, 0x4b, 0x33, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, + 0x4b, 0x37, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x4c, 0x54, 0x2f, 0x30, 0x77, 0x41, 0x70, 0x41, 0x4c, 0x55, + 0x41, 0x41, 0x41, 0x41, 0x70, 0x41, 0x4c, 0x72, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x4d, 0x58, 0x2b, 0x69, + 0x41, 0x41, 0x70, 0x41, 0x4d, 0x66, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, 0x4d, 0x6e, 0x2f, 0x52, 0x41, 0x41, + 0x70, 0x0a, + 0x09, 0x41, 0x4f, 0x50, 0x2f, 0x33, 0x41, 0x41, 0x70, 0x41, 0x4f, 0x76, 0x2f, 0x52, 0x41, 0x41, 0x70, 0x41, + 0x50, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x71, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x71, 0x41, 0x43, 0x51, + 0x41, 0x41, 0x41, 0x41, 0x71, 0x41, 0x44, 0x66, 0x2f, 0x74, 0x77, 0x41, 0x71, 0x41, 0x44, 0x6f, 0x41, 0x41, + 0x41, 0x41, 0x71, 0x41, 0x44, 0x7a, 0x2f, 0x6d, 0x67, 0x41, 0x71, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x41, + 0x71, 0x0a, + 0x09, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x71, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x71, 0x41, + 0x4b, 0x30, 0x41, 0x41, 0x41, 0x41, 0x71, 0x41, 0x4b, 0x34, 0x41, 0x41, 0x41, 0x41, 0x71, 0x41, 0x4c, 0x54, + 0x2f, 0x30, 0x77, 0x41, 0x71, 0x41, 0x4c, 0x58, 0x2f, 0x30, 0x77, 0x41, 0x71, 0x41, 0x4c, 0x76, 0x2f, 0x6d, + 0x67, 0x41, 0x71, 0x41, 0x4d, 0x58, 0x2f, 0x79, 0x51, 0x41, 0x71, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x41, + 0x71, 0x0a, + 0x09, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x71, 0x41, 0x4f, 0x72, 0x2f, 0x6d, 0x67, 0x41, 0x72, 0x41, + 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, 0x72, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x41, 0x72, 0x41, 0x42, 0x30, + 0x41, 0x41, 0x41, 0x41, 0x72, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x72, 0x41, 0x4b, 0x6f, 0x41, 0x41, + 0x41, 0x41, 0x72, 0x41, 0x4c, 0x54, 0x2f, 0x74, 0x77, 0x41, 0x72, 0x41, 0x4c, 0x58, 0x2f, 0x77, 0x51, 0x41, + 0x72, 0x0a, + 0x09, 0x41, 0x4d, 0x58, 0x2f, 0x74, 0x77, 0x41, 0x74, 0x41, 0x42, 0x44, 0x2f, 0x74, 0x77, 0x41, 0x74, 0x41, + 0x43, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x74, 0x41, 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x74, 0x41, 0x4b, 0x6e, + 0x2f, 0x33, 0x41, 0x41, 0x74, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x74, 0x41, 0x4b, 0x33, 0x2f, 0x33, + 0x41, 0x41, 0x74, 0x41, 0x4b, 0x37, 0x2f, 0x33, 0x41, 0x41, 0x74, 0x41, 0x4c, 0x54, 0x2f, 0x74, 0x77, 0x41, + 0x74, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x77, 0x51, 0x41, 0x74, 0x41, 0x4d, 0x58, 0x2f, 0x6b, 0x41, 0x41, 0x74, 0x41, + 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x41, 0x74, 0x41, 0x4d, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x42, 0x44, + 0x2f, 0x4b, 0x51, 0x41, 0x75, 0x41, 0x43, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x43, 0x62, 0x2f, 0x6b, + 0x41, 0x41, 0x75, 0x41, 0x44, 0x4c, 0x2f, 0x6b, 0x41, 0x41, 0x75, 0x41, 0x44, 0x66, 0x2f, 0x59, 0x51, 0x41, + 0x75, 0x0a, + 0x09, 0x41, 0x44, 0x6a, 0x2f, 0x79, 0x51, 0x41, 0x75, 0x41, 0x44, 0x72, 0x2f, 0x74, 0x77, 0x41, 0x75, 0x41, + 0x44, 0x7a, 0x2f, 0x74, 0x77, 0x41, 0x75, 0x41, 0x45, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x45, 0x6a, + 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x46, 0x4c, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x46, 0x6a, 0x2f, 0x6d, + 0x67, 0x41, 0x75, 0x41, 0x46, 0x7a, 0x2f, 0x61, 0x77, 0x41, 0x75, 0x41, 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x41, + 0x75, 0x0a, + 0x09, 0x41, 0x47, 0x54, 0x2f, 0x6b, 0x41, 0x41, 0x75, 0x41, 0x47, 0x66, 0x2f, 0x6b, 0x41, 0x41, 0x75, 0x41, + 0x47, 0x6a, 0x2f, 0x79, 0x51, 0x41, 0x75, 0x41, 0x47, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x47, 0x72, + 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x47, 0x76, 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x47, 0x7a, 0x2f, 0x33, + 0x41, 0x41, 0x75, 0x41, 0x47, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x47, 0x37, 0x2f, 0x33, 0x41, 0x41, + 0x75, 0x0a, + 0x09, 0x41, 0x48, 0x44, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x48, 0x48, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, + 0x48, 0x4c, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x48, 0x50, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x48, 0x6e, + 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x48, 0x72, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x48, 0x76, 0x2f, 0x6d, + 0x67, 0x41, 0x75, 0x41, 0x48, 0x7a, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x48, 0x33, 0x2f, 0x6d, 0x67, 0x41, + 0x75, 0x0a, + 0x09, 0x41, 0x48, 0x37, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x48, 0x2f, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, + 0x49, 0x44, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x49, 0x48, 0x2f, 0x6d, 0x67, 0x41, 0x75, 0x41, 0x4b, 0x6e, + 0x2f, 0x66, 0x51, 0x41, 0x75, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x75, 0x41, 0x4b, 0x33, 0x2f, 0x33, + 0x41, 0x41, 0x75, 0x41, 0x4b, 0x37, 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x4b, 0x2f, 0x2f, 0x6b, 0x41, 0x41, + 0x75, 0x0a, + 0x09, 0x41, 0x4c, 0x54, 0x2f, 0x77, 0x51, 0x41, 0x75, 0x41, 0x4c, 0x58, 0x2f, 0x77, 0x51, 0x41, 0x75, 0x41, + 0x4c, 0x72, 0x2f, 0x61, 0x77, 0x41, 0x75, 0x41, 0x4c, 0x76, 0x2f, 0x74, 0x77, 0x41, 0x75, 0x41, 0x4d, 0x55, + 0x41, 0x41, 0x41, 0x41, 0x75, 0x41, 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x41, 0x75, 0x41, 0x4d, 0x6e, 0x2f, 0x33, + 0x41, 0x41, 0x75, 0x41, 0x4e, 0x44, 0x2f, 0x6b, 0x41, 0x41, 0x75, 0x41, 0x4e, 0x48, 0x2f, 0x6b, 0x41, 0x41, + 0x75, 0x0a, + 0x09, 0x41, 0x4e, 0x4c, 0x2f, 0x6b, 0x41, 0x41, 0x75, 0x41, 0x4e, 0x50, 0x2f, 0x79, 0x51, 0x41, 0x75, 0x41, + 0x4e, 0x54, 0x2f, 0x79, 0x51, 0x41, 0x75, 0x41, 0x4e, 0x58, 0x2f, 0x79, 0x51, 0x41, 0x75, 0x41, 0x4f, 0x72, + 0x2f, 0x74, 0x77, 0x41, 0x75, 0x41, 0x4f, 0x76, 0x2f, 0x61, 0x77, 0x41, 0x75, 0x41, 0x50, 0x76, 0x2f, 0x6b, + 0x41, 0x41, 0x75, 0x41, 0x50, 0x33, 0x2f, 0x6b, 0x41, 0x41, 0x76, 0x41, 0x42, 0x44, 0x2f, 0x33, 0x41, 0x41, + 0x76, 0x0a, + 0x09, 0x41, 0x43, 0x51, 0x41, 0x4c, 0x77, 0x41, 0x76, 0x41, 0x44, 0x4c, 0x2f, 0x74, 0x77, 0x41, 0x76, 0x41, + 0x44, 0x66, 0x2b, 0x35, 0x67, 0x41, 0x76, 0x41, 0x44, 0x6a, 0x2f, 0x6d, 0x67, 0x41, 0x76, 0x41, 0x44, 0x6e, + 0x2f, 0x48, 0x77, 0x41, 0x76, 0x41, 0x44, 0x72, 0x2f, 0x52, 0x41, 0x41, 0x76, 0x41, 0x44, 0x7a, 0x2b, 0x38, + 0x41, 0x41, 0x76, 0x41, 0x45, 0x51, 0x41, 0x41, 0x41, 0x41, 0x76, 0x41, 0x45, 0x6a, 0x2f, 0x33, 0x41, 0x41, + 0x76, 0x0a, + 0x09, 0x41, 0x46, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x46, 0x6a, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, + 0x46, 0x7a, 0x2f, 0x52, 0x41, 0x41, 0x76, 0x41, 0x47, 0x49, 0x41, 0x4c, 0x77, 0x41, 0x76, 0x41, 0x47, 0x66, + 0x2f, 0x74, 0x77, 0x41, 0x76, 0x41, 0x47, 0x6a, 0x2f, 0x6d, 0x67, 0x41, 0x76, 0x41, 0x47, 0x6b, 0x41, 0x41, + 0x41, 0x41, 0x76, 0x41, 0x47, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x76, 0x41, 0x47, 0x73, 0x41, 0x41, 0x41, 0x41, + 0x76, 0x0a, + 0x09, 0x41, 0x47, 0x77, 0x41, 0x41, 0x41, 0x41, 0x76, 0x41, 0x47, 0x30, 0x41, 0x41, 0x41, 0x41, 0x76, 0x41, + 0x47, 0x34, 0x41, 0x41, 0x41, 0x41, 0x76, 0x41, 0x48, 0x44, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x48, 0x48, + 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x48, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x48, 0x50, 0x2f, 0x33, + 0x41, 0x41, 0x76, 0x41, 0x48, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x48, 0x72, 0x2f, 0x33, 0x41, 0x41, + 0x76, 0x0a, + 0x09, 0x41, 0x48, 0x76, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x48, 0x7a, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, + 0x48, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x48, 0x37, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x48, 0x2f, + 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x49, 0x44, 0x2f, 0x33, 0x41, 0x41, 0x76, 0x41, 0x49, 0x48, 0x2f, 0x33, + 0x41, 0x41, 0x76, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x76, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x41, + 0x76, 0x0a, + 0x09, 0x41, 0x4b, 0x30, 0x41, 0x4c, 0x77, 0x41, 0x76, 0x41, 0x4b, 0x34, 0x41, 0x4c, 0x77, 0x41, 0x76, 0x41, + 0x4b, 0x2f, 0x2f, 0x74, 0x77, 0x41, 0x76, 0x41, 0x4c, 0x54, 0x2b, 0x59, 0x51, 0x41, 0x76, 0x41, 0x4c, 0x58, + 0x39, 0x35, 0x67, 0x41, 0x76, 0x41, 0x4c, 0x72, 0x2f, 0x52, 0x41, 0x41, 0x76, 0x41, 0x4c, 0x76, 0x2b, 0x38, + 0x41, 0x41, 0x76, 0x41, 0x4d, 0x55, 0x41, 0x41, 0x41, 0x41, 0x76, 0x41, 0x4d, 0x63, 0x41, 0x4c, 0x77, 0x41, + 0x76, 0x0a, + 0x09, 0x41, 0x4d, 0x6b, 0x41, 0x4c, 0x77, 0x41, 0x76, 0x41, 0x4e, 0x44, 0x2f, 0x74, 0x77, 0x41, 0x76, 0x41, + 0x4e, 0x48, 0x2f, 0x74, 0x77, 0x41, 0x76, 0x41, 0x4e, 0x4c, 0x2f, 0x74, 0x77, 0x41, 0x76, 0x41, 0x4e, 0x50, + 0x2f, 0x6d, 0x67, 0x41, 0x76, 0x41, 0x4e, 0x54, 0x2f, 0x6d, 0x67, 0x41, 0x76, 0x41, 0x4e, 0x58, 0x2f, 0x6d, + 0x67, 0x41, 0x76, 0x41, 0x4f, 0x72, 0x2b, 0x38, 0x41, 0x41, 0x76, 0x41, 0x4f, 0x76, 0x2f, 0x52, 0x41, 0x41, + 0x79, 0x0a, + 0x09, 0x41, 0x42, 0x41, 0x41, 0x4f, 0x51, 0x41, 0x79, 0x41, 0x42, 0x48, 0x2f, 0x72, 0x51, 0x41, 0x79, 0x41, + 0x42, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x79, 0x41, 0x43, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x79, 0x41, 0x44, 0x6e, + 0x2f, 0x33, 0x41, 0x41, 0x79, 0x41, 0x44, 0x76, 0x2f, 0x66, 0x51, 0x41, 0x79, 0x41, 0x44, 0x7a, 0x2f, 0x6b, + 0x41, 0x41, 0x79, 0x41, 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x79, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x41, + 0x79, 0x0a, + 0x09, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x79, 0x41, 0x4b, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x79, 0x41, + 0x4b, 0x37, 0x2f, 0x33, 0x41, 0x41, 0x79, 0x41, 0x4c, 0x54, 0x2f, 0x30, 0x77, 0x41, 0x79, 0x41, 0x4c, 0x58, + 0x2f, 0x33, 0x41, 0x41, 0x79, 0x41, 0x4c, 0x76, 0x2f, 0x6b, 0x41, 0x41, 0x79, 0x41, 0x4d, 0x58, 0x2f, 0x52, + 0x41, 0x41, 0x79, 0x41, 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x41, 0x79, 0x41, 0x4d, 0x6e, 0x2f, 0x33, 0x41, 0x41, + 0x79, 0x0a, + 0x09, 0x41, 0x4f, 0x72, 0x2f, 0x6b, 0x41, 0x41, 0x7a, 0x41, 0x42, 0x44, 0x2f, 0x30, 0x77, 0x41, 0x7a, 0x41, + 0x42, 0x48, 0x2b, 0x77, 0x51, 0x41, 0x7a, 0x41, 0x42, 0x30, 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, 0x43, 0x54, + 0x2f, 0x66, 0x51, 0x41, 0x7a, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, 0x44, 0x6f, 0x41, 0x41, + 0x41, 0x41, 0x7a, 0x41, 0x44, 0x7a, 0x2f, 0x30, 0x77, 0x41, 0x7a, 0x41, 0x45, 0x54, 0x2f, 0x70, 0x41, 0x41, + 0x7a, 0x0a, + 0x09, 0x41, 0x45, 0x6a, 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x45, 0x7a, 0x2f, 0x30, 0x77, 0x41, 0x7a, 0x41, + 0x46, 0x48, 0x2f, 0x33, 0x41, 0x41, 0x7a, 0x41, 0x46, 0x4c, 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x46, 0x58, + 0x2f, 0x33, 0x41, 0x41, 0x7a, 0x41, 0x46, 0x62, 0x2f, 0x33, 0x41, 0x41, 0x7a, 0x41, 0x46, 0x6a, 0x2f, 0x33, + 0x41, 0x41, 0x7a, 0x41, 0x46, 0x77, 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, 0x47, 0x4c, 0x2f, 0x66, 0x51, 0x41, + 0x7a, 0x0a, + 0x09, 0x41, 0x47, 0x67, 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, 0x47, 0x6e, 0x2f, 0x70, 0x41, 0x41, 0x7a, 0x41, + 0x47, 0x72, 0x2f, 0x70, 0x41, 0x41, 0x7a, 0x41, 0x47, 0x76, 0x2f, 0x70, 0x41, 0x41, 0x7a, 0x41, 0x47, 0x7a, + 0x2f, 0x70, 0x41, 0x41, 0x7a, 0x41, 0x47, 0x33, 0x2f, 0x70, 0x41, 0x41, 0x7a, 0x41, 0x47, 0x37, 0x2f, 0x70, + 0x41, 0x41, 0x7a, 0x41, 0x48, 0x44, 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x48, 0x48, 0x2f, 0x74, 0x77, 0x41, + 0x7a, 0x0a, + 0x09, 0x41, 0x48, 0x4c, 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x48, 0x50, 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, + 0x48, 0x6a, 0x2f, 0x33, 0x41, 0x41, 0x7a, 0x41, 0x48, 0x6e, 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x48, 0x72, + 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x48, 0x76, 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x48, 0x7a, 0x2f, 0x74, + 0x77, 0x41, 0x7a, 0x41, 0x48, 0x33, 0x2f, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x48, 0x37, 0x2f, 0x33, 0x41, 0x41, + 0x7a, 0x0a, + 0x09, 0x41, 0x48, 0x2f, 0x2f, 0x33, 0x41, 0x41, 0x7a, 0x41, 0x49, 0x44, 0x2f, 0x33, 0x41, 0x41, 0x7a, 0x41, + 0x49, 0x48, 0x2f, 0x33, 0x41, 0x41, 0x7a, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x41, 0x7a, 0x41, 0x4b, 0x6f, + 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, 0x4b, 0x33, 0x2f, 0x66, 0x51, 0x41, 0x7a, 0x41, 0x4b, 0x37, 0x2f, 0x66, + 0x51, 0x41, 0x7a, 0x41, 0x4c, 0x51, 0x41, 0x4a, 0x67, 0x41, 0x7a, 0x41, 0x4c, 0x55, 0x41, 0x4a, 0x67, 0x41, + 0x7a, 0x0a, + 0x09, 0x41, 0x4c, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, 0x4c, 0x76, 0x2f, 0x30, 0x77, 0x41, 0x7a, 0x41, + 0x4d, 0x58, 0x2b, 0x74, 0x77, 0x41, 0x7a, 0x41, 0x4d, 0x66, 0x2f, 0x66, 0x51, 0x41, 0x7a, 0x41, 0x4d, 0x6e, + 0x2f, 0x66, 0x51, 0x41, 0x7a, 0x41, 0x4e, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, 0x4e, 0x51, 0x41, 0x41, + 0x41, 0x41, 0x7a, 0x41, 0x4e, 0x55, 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, 0x4f, 0x54, 0x2f, 0x33, 0x41, 0x41, + 0x7a, 0x0a, + 0x09, 0x41, 0x4f, 0x72, 0x2f, 0x30, 0x77, 0x41, 0x7a, 0x41, 0x4f, 0x73, 0x41, 0x41, 0x41, 0x41, 0x7a, 0x41, + 0x50, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x30, 0x41, 0x42, 0x41, 0x41, 0x4f, 0x51, 0x41, 0x30, 0x41, 0x4b, 0x6b, + 0x41, 0x41, 0x41, 0x41, 0x30, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x30, 0x41, 0x4c, 0x54, 0x2f, 0x30, + 0x77, 0x41, 0x30, 0x41, 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x41, 0x30, 0x41, 0x4d, 0x58, 0x2f, 0x66, 0x51, 0x41, + 0x31, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x2f, 0x72, 0x51, 0x41, 0x31, 0x41, 0x42, 0x48, 0x2f, 0x74, 0x77, 0x41, 0x31, 0x41, + 0x42, 0x33, 0x2f, 0x77, 0x51, 0x41, 0x31, 0x41, 0x43, 0x54, 0x2f, 0x72, 0x51, 0x41, 0x31, 0x41, 0x43, 0x62, + 0x2f, 0x6d, 0x67, 0x41, 0x31, 0x41, 0x44, 0x66, 0x2f, 0x61, 0x77, 0x41, 0x31, 0x41, 0x44, 0x6e, 0x2f, 0x6b, + 0x41, 0x41, 0x31, 0x41, 0x44, 0x72, 0x2f, 0x72, 0x51, 0x41, 0x31, 0x41, 0x44, 0x7a, 0x2f, 0x66, 0x51, 0x41, + 0x31, 0x0a, + 0x09, 0x41, 0x45, 0x54, 0x2f, 0x30, 0x77, 0x41, 0x31, 0x41, 0x45, 0x6a, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, + 0x46, 0x4c, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x46, 0x6a, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x46, 0x7a, + 0x2f, 0x6b, 0x41, 0x41, 0x31, 0x41, 0x47, 0x4c, 0x2f, 0x72, 0x51, 0x41, 0x31, 0x41, 0x47, 0x54, 0x2f, 0x6d, + 0x67, 0x41, 0x31, 0x41, 0x47, 0x6e, 0x2f, 0x30, 0x77, 0x41, 0x31, 0x41, 0x47, 0x72, 0x2f, 0x30, 0x77, 0x41, + 0x31, 0x0a, + 0x09, 0x41, 0x47, 0x76, 0x2f, 0x30, 0x77, 0x41, 0x31, 0x41, 0x47, 0x7a, 0x2f, 0x30, 0x77, 0x41, 0x31, 0x41, + 0x47, 0x33, 0x2f, 0x30, 0x77, 0x41, 0x31, 0x41, 0x47, 0x37, 0x2f, 0x30, 0x77, 0x41, 0x31, 0x41, 0x48, 0x44, + 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x48, 0x48, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x48, 0x4c, 0x2f, 0x70, + 0x41, 0x41, 0x31, 0x41, 0x48, 0x50, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x48, 0x6e, 0x2f, 0x70, 0x41, 0x41, + 0x31, 0x0a, + 0x09, 0x41, 0x48, 0x72, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x48, 0x76, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, + 0x48, 0x7a, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x48, 0x33, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x48, 0x37, + 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x48, 0x2f, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x49, 0x44, 0x2f, 0x70, + 0x41, 0x41, 0x31, 0x41, 0x49, 0x48, 0x2f, 0x70, 0x41, 0x41, 0x31, 0x41, 0x4b, 0x6e, 0x2f, 0x6b, 0x41, 0x41, + 0x31, 0x0a, + 0x09, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x41, 0x31, 0x41, 0x4b, 0x33, 0x2f, 0x72, 0x51, 0x41, 0x31, 0x41, + 0x4b, 0x37, 0x2f, 0x72, 0x51, 0x41, 0x31, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x41, 0x31, 0x41, 0x4c, 0x58, + 0x2f, 0x66, 0x51, 0x41, 0x31, 0x41, 0x4c, 0x72, 0x2f, 0x6b, 0x41, 0x41, 0x31, 0x41, 0x4c, 0x76, 0x2f, 0x66, + 0x51, 0x41, 0x31, 0x41, 0x4d, 0x58, 0x2f, 0x33, 0x41, 0x41, 0x31, 0x41, 0x4d, 0x66, 0x2f, 0x72, 0x51, 0x41, + 0x31, 0x0a, + 0x09, 0x41, 0x4d, 0x6e, 0x2f, 0x72, 0x51, 0x41, 0x31, 0x41, 0x4f, 0x72, 0x2f, 0x66, 0x51, 0x41, 0x31, 0x41, + 0x4f, 0x76, 0x2f, 0x6b, 0x41, 0x41, 0x31, 0x41, 0x50, 0x76, 0x2f, 0x6d, 0x67, 0x41, 0x31, 0x41, 0x50, 0x33, + 0x2f, 0x6d, 0x67, 0x41, 0x32, 0x41, 0x43, 0x51, 0x41, 0x4a, 0x67, 0x41, 0x32, 0x41, 0x43, 0x59, 0x41, 0x41, + 0x41, 0x41, 0x32, 0x41, 0x43, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x44, 0x49, 0x41, 0x41, 0x41, 0x41, + 0x32, 0x0a, + 0x09, 0x41, 0x44, 0x51, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, + 0x47, 0x49, 0x41, 0x4a, 0x67, 0x41, 0x32, 0x41, 0x47, 0x51, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x47, 0x63, + 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x4b, 0x30, 0x41, 0x4a, 0x67, 0x41, 0x32, 0x41, 0x4b, 0x34, 0x41, 0x4a, + 0x67, 0x41, 0x32, 0x41, 0x4b, 0x38, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x4d, 0x63, 0x41, 0x4a, 0x67, 0x41, + 0x32, 0x0a, + 0x09, 0x41, 0x4d, 0x6b, 0x41, 0x4a, 0x67, 0x41, 0x32, 0x41, 0x4e, 0x41, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, + 0x4e, 0x45, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x4e, 0x49, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x4f, 0x4d, + 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x50, 0x59, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x50, 0x6b, 0x41, 0x41, + 0x41, 0x41, 0x32, 0x41, 0x50, 0x73, 0x41, 0x41, 0x41, 0x41, 0x32, 0x41, 0x50, 0x30, 0x41, 0x41, 0x41, 0x41, + 0x33, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x2f, 0x52, 0x41, 0x41, 0x33, 0x41, 0x42, 0x48, 0x2f, 0x44, 0x51, 0x41, 0x33, 0x41, + 0x42, 0x33, 0x2f, 0x48, 0x77, 0x41, 0x33, 0x41, 0x43, 0x54, 0x2f, 0x59, 0x51, 0x41, 0x33, 0x41, 0x43, 0x62, + 0x2f, 0x69, 0x41, 0x41, 0x33, 0x41, 0x44, 0x66, 0x2f, 0x33, 0x41, 0x41, 0x33, 0x41, 0x45, 0x54, 0x2b, 0x72, + 0x51, 0x41, 0x33, 0x41, 0x45, 0x62, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, 0x45, 0x6a, 0x2b, 0x70, 0x41, 0x41, + 0x33, 0x0a, + 0x09, 0x41, 0x45, 0x7a, 0x2f, 0x77, 0x51, 0x41, 0x33, 0x41, 0x46, 0x4c, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, + 0x46, 0x58, 0x2b, 0x30, 0x77, 0x41, 0x33, 0x41, 0x46, 0x62, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x46, 0x6a, + 0x2b, 0x79, 0x51, 0x41, 0x33, 0x41, 0x46, 0x72, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x46, 0x7a, 0x2b, 0x77, + 0x51, 0x41, 0x33, 0x41, 0x47, 0x4c, 0x2f, 0x59, 0x51, 0x41, 0x33, 0x41, 0x47, 0x54, 0x2f, 0x69, 0x41, 0x41, + 0x33, 0x0a, + 0x09, 0x41, 0x47, 0x6e, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x47, 0x72, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, + 0x47, 0x76, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x47, 0x7a, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x47, 0x33, + 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x47, 0x37, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x47, 0x2f, 0x2b, 0x70, + 0x41, 0x41, 0x33, 0x41, 0x48, 0x44, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, 0x48, 0x48, 0x2b, 0x70, 0x41, 0x41, + 0x33, 0x0a, + 0x09, 0x41, 0x48, 0x4c, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, 0x48, 0x50, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, + 0x48, 0x6e, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, 0x48, 0x72, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, 0x48, 0x76, + 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, 0x48, 0x7a, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, 0x48, 0x33, 0x2b, 0x70, + 0x41, 0x41, 0x33, 0x41, 0x48, 0x37, 0x2b, 0x79, 0x51, 0x41, 0x33, 0x41, 0x48, 0x2f, 0x2b, 0x79, 0x51, 0x41, + 0x33, 0x0a, + 0x09, 0x41, 0x49, 0x44, 0x2b, 0x79, 0x51, 0x41, 0x33, 0x41, 0x49, 0x48, 0x2b, 0x79, 0x51, 0x41, 0x33, 0x41, + 0x4b, 0x6e, 0x2f, 0x52, 0x41, 0x41, 0x33, 0x41, 0x4b, 0x72, 0x2f, 0x6b, 0x41, 0x41, 0x33, 0x41, 0x4b, 0x33, + 0x2f, 0x59, 0x51, 0x41, 0x33, 0x41, 0x4b, 0x37, 0x2f, 0x59, 0x51, 0x41, 0x33, 0x41, 0x4c, 0x51, 0x41, 0x41, + 0x41, 0x41, 0x33, 0x41, 0x4c, 0x58, 0x2f, 0x30, 0x77, 0x41, 0x33, 0x41, 0x4c, 0x72, 0x2b, 0x77, 0x51, 0x41, + 0x33, 0x0a, + 0x09, 0x41, 0x4d, 0x58, 0x2b, 0x2b, 0x41, 0x41, 0x33, 0x41, 0x4d, 0x66, 0x2f, 0x59, 0x51, 0x41, 0x33, 0x41, + 0x4d, 0x6e, 0x2f, 0x59, 0x51, 0x41, 0x33, 0x41, 0x4f, 0x54, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x4f, 0x76, + 0x2b, 0x77, 0x51, 0x41, 0x33, 0x41, 0x50, 0x72, 0x2b, 0x72, 0x51, 0x41, 0x33, 0x41, 0x50, 0x76, 0x2f, 0x69, + 0x41, 0x41, 0x33, 0x41, 0x50, 0x7a, 0x2b, 0x70, 0x41, 0x41, 0x33, 0x41, 0x50, 0x33, 0x2f, 0x69, 0x41, 0x41, + 0x33, 0x0a, + 0x09, 0x41, 0x50, 0x37, 0x2b, 0x70, 0x41, 0x41, 0x34, 0x41, 0x43, 0x51, 0x41, 0x41, 0x41, 0x41, 0x34, 0x41, + 0x43, 0x30, 0x41, 0x41, 0x41, 0x41, 0x34, 0x41, 0x44, 0x33, 0x2f, 0x33, 0x41, 0x41, 0x34, 0x41, 0x47, 0x49, + 0x41, 0x41, 0x41, 0x41, 0x34, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x41, 0x41, 0x34, 0x41, 0x4b, 0x34, 0x41, 0x41, + 0x41, 0x41, 0x34, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x41, 0x34, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x41, + 0x34, 0x0a, + 0x09, 0x41, 0x4f, 0x58, 0x2f, 0x33, 0x41, 0x41, 0x35, 0x41, 0x42, 0x44, 0x2f, 0x69, 0x41, 0x41, 0x35, 0x41, + 0x42, 0x48, 0x2b, 0x2b, 0x41, 0x41, 0x35, 0x41, 0x42, 0x33, 0x2f, 0x57, 0x51, 0x41, 0x35, 0x41, 0x43, 0x54, + 0x2f, 0x66, 0x51, 0x41, 0x35, 0x41, 0x44, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x35, 0x41, 0x45, 0x54, 0x2f, 0x59, + 0x51, 0x41, 0x35, 0x41, 0x45, 0x6a, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x45, 0x7a, 0x2f, 0x30, 0x77, 0x41, + 0x35, 0x0a, + 0x09, 0x41, 0x46, 0x4c, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x46, 0x6a, 0x2f, 0x64, 0x51, 0x41, 0x35, 0x41, + 0x46, 0x7a, 0x2f, 0x79, 0x51, 0x41, 0x35, 0x41, 0x47, 0x4c, 0x2f, 0x66, 0x51, 0x41, 0x35, 0x41, 0x47, 0x66, + 0x2f, 0x33, 0x41, 0x41, 0x35, 0x41, 0x47, 0x6e, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x47, 0x72, 0x2f, 0x59, + 0x51, 0x41, 0x35, 0x41, 0x47, 0x76, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x47, 0x7a, 0x2f, 0x59, 0x51, 0x41, + 0x35, 0x0a, + 0x09, 0x41, 0x47, 0x33, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x47, 0x37, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, + 0x48, 0x44, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x48, 0x48, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x48, 0x4c, + 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x48, 0x50, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x48, 0x6e, 0x2f, 0x59, + 0x51, 0x41, 0x35, 0x41, 0x48, 0x72, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x48, 0x76, 0x2f, 0x59, 0x51, 0x41, + 0x35, 0x0a, + 0x09, 0x41, 0x48, 0x7a, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, 0x48, 0x33, 0x2f, 0x59, 0x51, 0x41, 0x35, 0x41, + 0x48, 0x37, 0x2f, 0x64, 0x51, 0x41, 0x35, 0x41, 0x48, 0x2f, 0x2f, 0x64, 0x51, 0x41, 0x35, 0x41, 0x49, 0x44, + 0x2f, 0x64, 0x51, 0x41, 0x35, 0x41, 0x49, 0x48, 0x2f, 0x64, 0x51, 0x41, 0x35, 0x41, 0x4b, 0x6e, 0x2f, 0x54, + 0x67, 0x41, 0x35, 0x41, 0x4b, 0x72, 0x2f, 0x6b, 0x41, 0x41, 0x35, 0x41, 0x4b, 0x33, 0x2f, 0x66, 0x51, 0x41, + 0x35, 0x0a, + 0x09, 0x41, 0x4b, 0x37, 0x2f, 0x66, 0x51, 0x41, 0x35, 0x41, 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x41, 0x35, 0x41, + 0x4c, 0x51, 0x41, 0x41, 0x41, 0x41, 0x35, 0x41, 0x4c, 0x55, 0x41, 0x41, 0x41, 0x41, 0x35, 0x41, 0x4c, 0x72, + 0x2f, 0x79, 0x51, 0x41, 0x35, 0x41, 0x4d, 0x58, 0x2b, 0x35, 0x67, 0x41, 0x35, 0x41, 0x4d, 0x66, 0x2f, 0x66, + 0x51, 0x41, 0x35, 0x41, 0x4d, 0x6e, 0x2f, 0x66, 0x51, 0x41, 0x35, 0x41, 0x4e, 0x44, 0x2f, 0x33, 0x41, 0x41, + 0x35, 0x0a, + 0x09, 0x41, 0x4e, 0x48, 0x2f, 0x33, 0x41, 0x41, 0x35, 0x41, 0x4e, 0x4c, 0x2f, 0x33, 0x41, 0x41, 0x35, 0x41, + 0x4f, 0x76, 0x2f, 0x79, 0x51, 0x41, 0x36, 0x41, 0x42, 0x44, 0x2f, 0x72, 0x51, 0x41, 0x36, 0x41, 0x42, 0x48, + 0x2f, 0x46, 0x51, 0x41, 0x36, 0x41, 0x42, 0x33, 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, 0x43, 0x54, 0x2f, 0x6b, + 0x41, 0x41, 0x36, 0x41, 0x45, 0x54, 0x2f, 0x66, 0x51, 0x41, 0x36, 0x41, 0x45, 0x6a, 0x2f, 0x69, 0x41, 0x41, + 0x36, 0x0a, + 0x09, 0x41, 0x45, 0x7a, 0x2f, 0x30, 0x77, 0x41, 0x36, 0x41, 0x46, 0x4c, 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, + 0x46, 0x58, 0x2f, 0x70, 0x41, 0x41, 0x36, 0x41, 0x46, 0x6a, 0x2f, 0x74, 0x77, 0x41, 0x36, 0x41, 0x46, 0x7a, + 0x2f, 0x33, 0x41, 0x41, 0x36, 0x41, 0x47, 0x4c, 0x2f, 0x6b, 0x41, 0x41, 0x36, 0x41, 0x47, 0x6e, 0x2f, 0x66, + 0x51, 0x41, 0x36, 0x41, 0x47, 0x72, 0x2f, 0x66, 0x51, 0x41, 0x36, 0x41, 0x47, 0x76, 0x2f, 0x66, 0x51, 0x41, + 0x36, 0x0a, + 0x09, 0x41, 0x47, 0x7a, 0x2f, 0x66, 0x51, 0x41, 0x36, 0x41, 0x47, 0x33, 0x2f, 0x66, 0x51, 0x41, 0x36, 0x41, + 0x47, 0x37, 0x2f, 0x66, 0x51, 0x41, 0x36, 0x41, 0x48, 0x44, 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, 0x48, 0x48, + 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, 0x48, 0x4c, 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, 0x48, 0x50, 0x2f, 0x69, + 0x41, 0x41, 0x36, 0x41, 0x48, 0x6e, 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, 0x48, 0x72, 0x2f, 0x69, 0x41, 0x41, + 0x36, 0x0a, + 0x09, 0x41, 0x48, 0x76, 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, 0x48, 0x7a, 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, + 0x48, 0x33, 0x2f, 0x69, 0x41, 0x41, 0x36, 0x41, 0x48, 0x37, 0x2f, 0x74, 0x77, 0x41, 0x36, 0x41, 0x48, 0x2f, + 0x2f, 0x74, 0x77, 0x41, 0x36, 0x41, 0x49, 0x44, 0x2f, 0x74, 0x77, 0x41, 0x36, 0x41, 0x49, 0x48, 0x2f, 0x74, + 0x77, 0x41, 0x36, 0x41, 0x4b, 0x6e, 0x2f, 0x6b, 0x41, 0x41, 0x36, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x41, + 0x36, 0x0a, + 0x09, 0x41, 0x4b, 0x33, 0x2f, 0x6b, 0x41, 0x41, 0x36, 0x41, 0x4b, 0x37, 0x2f, 0x6b, 0x41, 0x41, 0x36, 0x41, + 0x4c, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x36, 0x41, 0x4c, 0x55, 0x41, 0x41, 0x41, 0x41, 0x36, 0x41, 0x4c, 0x72, + 0x2f, 0x33, 0x41, 0x41, 0x36, 0x41, 0x4d, 0x58, 0x2b, 0x2b, 0x41, 0x41, 0x36, 0x41, 0x4d, 0x66, 0x2f, 0x6b, + 0x41, 0x41, 0x36, 0x41, 0x4d, 0x6e, 0x2f, 0x6b, 0x41, 0x41, 0x36, 0x41, 0x4f, 0x76, 0x2f, 0x33, 0x41, 0x41, + 0x37, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x2f, 0x6d, 0x67, 0x41, 0x37, 0x41, 0x43, 0x51, 0x41, 0x41, 0x41, 0x41, 0x37, 0x41, + 0x43, 0x62, 0x2f, 0x61, 0x77, 0x41, 0x37, 0x41, 0x44, 0x4c, 0x2f, 0x66, 0x51, 0x41, 0x37, 0x41, 0x44, 0x66, + 0x2f, 0x33, 0x41, 0x41, 0x37, 0x41, 0x45, 0x6a, 0x2f, 0x70, 0x41, 0x41, 0x37, 0x41, 0x47, 0x49, 0x41, 0x41, + 0x41, 0x41, 0x37, 0x41, 0x47, 0x54, 0x2f, 0x61, 0x77, 0x41, 0x37, 0x41, 0x47, 0x66, 0x2f, 0x66, 0x51, 0x41, + 0x37, 0x0a, + 0x09, 0x41, 0x48, 0x44, 0x2f, 0x70, 0x41, 0x41, 0x37, 0x41, 0x48, 0x48, 0x2f, 0x70, 0x41, 0x41, 0x37, 0x41, + 0x48, 0x4c, 0x2f, 0x70, 0x41, 0x41, 0x37, 0x41, 0x48, 0x50, 0x2f, 0x70, 0x41, 0x41, 0x37, 0x41, 0x4b, 0x6e, + 0x2f, 0x6b, 0x41, 0x41, 0x37, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x41, 0x37, 0x41, 0x4b, 0x30, 0x41, 0x41, + 0x41, 0x41, 0x37, 0x41, 0x4b, 0x34, 0x41, 0x41, 0x41, 0x41, 0x37, 0x41, 0x4b, 0x2f, 0x2f, 0x66, 0x51, 0x41, + 0x37, 0x0a, + 0x09, 0x41, 0x4c, 0x54, 0x2f, 0x59, 0x51, 0x41, 0x37, 0x41, 0x4c, 0x58, 0x2f, 0x72, 0x51, 0x41, 0x37, 0x41, + 0x4d, 0x58, 0x2f, 0x30, 0x77, 0x41, 0x37, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x41, 0x37, 0x41, 0x4d, 0x6b, + 0x41, 0x41, 0x41, 0x41, 0x37, 0x41, 0x4e, 0x44, 0x2f, 0x66, 0x51, 0x41, 0x37, 0x41, 0x4e, 0x48, 0x2f, 0x66, + 0x51, 0x41, 0x37, 0x41, 0x4e, 0x4c, 0x2f, 0x66, 0x51, 0x41, 0x37, 0x41, 0x50, 0x76, 0x2f, 0x61, 0x77, 0x41, + 0x37, 0x0a, + 0x09, 0x41, 0x50, 0x33, 0x2f, 0x61, 0x77, 0x41, 0x38, 0x41, 0x42, 0x44, 0x2f, 0x44, 0x51, 0x41, 0x38, 0x41, + 0x42, 0x48, 0x2b, 0x59, 0x51, 0x41, 0x38, 0x41, 0x42, 0x33, 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, 0x43, 0x54, + 0x2f, 0x59, 0x51, 0x41, 0x38, 0x41, 0x43, 0x62, 0x2f, 0x6b, 0x41, 0x41, 0x38, 0x41, 0x44, 0x4c, 0x2f, 0x6b, + 0x41, 0x41, 0x38, 0x41, 0x45, 0x54, 0x2b, 0x35, 0x67, 0x41, 0x38, 0x41, 0x45, 0x6a, 0x2b, 0x38, 0x41, 0x41, + 0x38, 0x0a, + 0x09, 0x41, 0x45, 0x7a, 0x2f, 0x74, 0x77, 0x41, 0x38, 0x41, 0x46, 0x4c, 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, + 0x46, 0x6a, 0x2f, 0x46, 0x51, 0x41, 0x38, 0x41, 0x47, 0x4c, 0x2f, 0x59, 0x51, 0x41, 0x38, 0x41, 0x47, 0x54, + 0x2f, 0x6b, 0x41, 0x41, 0x38, 0x41, 0x47, 0x66, 0x2f, 0x6b, 0x41, 0x41, 0x38, 0x41, 0x47, 0x6e, 0x2b, 0x35, + 0x67, 0x41, 0x38, 0x41, 0x47, 0x72, 0x2b, 0x35, 0x67, 0x41, 0x38, 0x41, 0x47, 0x76, 0x2b, 0x35, 0x67, 0x41, + 0x38, 0x0a, + 0x09, 0x41, 0x47, 0x7a, 0x2b, 0x35, 0x67, 0x41, 0x38, 0x41, 0x47, 0x33, 0x2b, 0x35, 0x67, 0x41, 0x38, 0x41, + 0x47, 0x37, 0x2b, 0x35, 0x67, 0x41, 0x38, 0x41, 0x48, 0x44, 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, 0x48, 0x48, + 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, 0x48, 0x4c, 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, 0x48, 0x50, 0x2b, 0x38, + 0x41, 0x41, 0x38, 0x41, 0x48, 0x6e, 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, 0x48, 0x72, 0x2b, 0x38, 0x41, 0x41, + 0x38, 0x0a, + 0x09, 0x41, 0x48, 0x76, 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, 0x48, 0x7a, 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, + 0x48, 0x33, 0x2b, 0x38, 0x41, 0x41, 0x38, 0x41, 0x48, 0x37, 0x2f, 0x46, 0x51, 0x41, 0x38, 0x41, 0x48, 0x2f, + 0x2f, 0x46, 0x51, 0x41, 0x38, 0x41, 0x49, 0x44, 0x2f, 0x46, 0x51, 0x41, 0x38, 0x41, 0x49, 0x48, 0x2f, 0x46, + 0x51, 0x41, 0x38, 0x41, 0x4b, 0x6e, 0x2f, 0x48, 0x77, 0x41, 0x38, 0x41, 0x4b, 0x72, 0x2f, 0x61, 0x77, 0x41, + 0x38, 0x0a, + 0x09, 0x41, 0x4b, 0x33, 0x2f, 0x59, 0x51, 0x41, 0x38, 0x41, 0x4b, 0x37, 0x2f, 0x59, 0x51, 0x41, 0x38, 0x41, + 0x4b, 0x2f, 0x2f, 0x6b, 0x41, 0x41, 0x38, 0x41, 0x4c, 0x54, 0x2f, 0x6b, 0x41, 0x41, 0x38, 0x41, 0x4c, 0x58, + 0x2f, 0x33, 0x41, 0x41, 0x38, 0x41, 0x4d, 0x58, 0x2b, 0x2b, 0x41, 0x41, 0x38, 0x41, 0x4d, 0x66, 0x2f, 0x59, + 0x51, 0x41, 0x38, 0x41, 0x4d, 0x6e, 0x2f, 0x59, 0x51, 0x41, 0x38, 0x41, 0x4e, 0x44, 0x2f, 0x6b, 0x41, 0x41, + 0x38, 0x0a, + 0x09, 0x41, 0x4e, 0x48, 0x2f, 0x6b, 0x41, 0x41, 0x38, 0x41, 0x4e, 0x4c, 0x2f, 0x6b, 0x41, 0x41, 0x38, 0x41, + 0x50, 0x76, 0x2f, 0x6b, 0x41, 0x41, 0x38, 0x41, 0x50, 0x33, 0x2f, 0x6b, 0x41, 0x41, 0x39, 0x41, 0x42, 0x44, + 0x2f, 0x33, 0x41, 0x41, 0x39, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x39, 0x41, 0x4b, 0x6f, 0x41, 0x41, + 0x41, 0x41, 0x39, 0x41, 0x4c, 0x54, 0x2f, 0x33, 0x41, 0x41, 0x39, 0x41, 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x41, + 0x39, 0x0a, + 0x09, 0x41, 0x4d, 0x58, 0x2f, 0x33, 0x41, 0x42, 0x49, 0x41, 0x46, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x4a, 0x41, + 0x42, 0x44, 0x2f, 0x6b, 0x41, 0x42, 0x4a, 0x41, 0x42, 0x48, 0x2f, 0x61, 0x77, 0x42, 0x4a, 0x41, 0x42, 0x33, + 0x2f, 0x74, 0x77, 0x42, 0x4a, 0x41, 0x46, 0x66, 0x2f, 0x33, 0x41, 0x42, 0x4a, 0x41, 0x46, 0x72, 0x2f, 0x33, + 0x41, 0x42, 0x4a, 0x41, 0x46, 0x7a, 0x2f, 0x33, 0x41, 0x42, 0x4a, 0x41, 0x4b, 0x6e, 0x2f, 0x74, 0x77, 0x42, + 0x4a, 0x0a, + 0x09, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x42, 0x4a, 0x41, 0x4c, 0x51, 0x41, 0x51, 0x51, 0x42, 0x4a, 0x41, + 0x4c, 0x55, 0x41, 0x41, 0x41, 0x42, 0x4a, 0x41, 0x4c, 0x72, 0x2f, 0x33, 0x41, 0x42, 0x4a, 0x41, 0x4d, 0x58, + 0x2f, 0x46, 0x51, 0x42, 0x4a, 0x41, 0x4f, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x4f, 0x41, 0x45, 0x54, 0x2f, 0x33, + 0x41, 0x42, 0x4f, 0x41, 0x45, 0x6a, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, 0x46, 0x4c, 0x2f, 0x74, 0x77, 0x42, + 0x4f, 0x0a, + 0x09, 0x41, 0x46, 0x6a, 0x2f, 0x77, 0x51, 0x42, 0x4f, 0x41, 0x46, 0x7a, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, + 0x47, 0x6e, 0x2f, 0x33, 0x41, 0x42, 0x4f, 0x41, 0x47, 0x72, 0x2f, 0x33, 0x41, 0x42, 0x4f, 0x41, 0x47, 0x76, + 0x2f, 0x33, 0x41, 0x42, 0x4f, 0x41, 0x47, 0x7a, 0x2f, 0x33, 0x41, 0x42, 0x4f, 0x41, 0x47, 0x33, 0x2f, 0x33, + 0x41, 0x42, 0x4f, 0x41, 0x47, 0x37, 0x2f, 0x33, 0x41, 0x42, 0x4f, 0x41, 0x48, 0x44, 0x2f, 0x74, 0x77, 0x42, + 0x4f, 0x0a, + 0x09, 0x41, 0x48, 0x48, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, 0x48, 0x4c, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, + 0x48, 0x50, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, 0x48, 0x6e, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, 0x48, 0x72, + 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, 0x48, 0x76, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, 0x48, 0x7a, 0x2f, 0x74, + 0x77, 0x42, 0x4f, 0x41, 0x48, 0x33, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, 0x48, 0x37, 0x2f, 0x77, 0x51, 0x42, + 0x4f, 0x0a, + 0x09, 0x41, 0x48, 0x2f, 0x2f, 0x77, 0x51, 0x42, 0x4f, 0x41, 0x49, 0x44, 0x2f, 0x77, 0x51, 0x42, 0x4f, 0x41, + 0x49, 0x48, 0x2f, 0x77, 0x51, 0x42, 0x4f, 0x41, 0x4c, 0x72, 0x2f, 0x74, 0x77, 0x42, 0x4f, 0x41, 0x4f, 0x76, + 0x2f, 0x74, 0x77, 0x42, 0x52, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x42, 0x52, 0x41, 0x42, 0x45, 0x41, 0x41, + 0x41, 0x42, 0x52, 0x41, 0x42, 0x30, 0x41, 0x41, 0x41, 0x42, 0x52, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x42, + 0x52, 0x0a, + 0x09, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x52, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x42, 0x52, 0x41, + 0x4c, 0x58, 0x2f, 0x6b, 0x41, 0x42, 0x52, 0x41, 0x4d, 0x58, 0x2f, 0x70, 0x41, 0x42, 0x53, 0x41, 0x42, 0x41, + 0x41, 0x4a, 0x67, 0x42, 0x53, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x53, 0x41, 0x42, 0x30, 0x41, 0x41, + 0x41, 0x42, 0x53, 0x41, 0x46, 0x76, 0x2f, 0x77, 0x51, 0x42, 0x53, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x42, + 0x53, 0x0a, + 0x09, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x53, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x42, 0x53, 0x41, + 0x4c, 0x58, 0x2f, 0x74, 0x77, 0x42, 0x53, 0x41, 0x4d, 0x58, 0x2f, 0x66, 0x51, 0x42, 0x56, 0x41, 0x42, 0x44, + 0x2f, 0x66, 0x51, 0x42, 0x56, 0x41, 0x42, 0x48, 0x2f, 0x52, 0x41, 0x42, 0x56, 0x41, 0x42, 0x33, 0x2f, 0x33, + 0x41, 0x42, 0x56, 0x41, 0x45, 0x62, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x45, 0x66, 0x2f, 0x33, 0x41, 0x42, + 0x56, 0x0a, + 0x09, 0x41, 0x45, 0x6a, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x45, 0x6b, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, + 0x45, 0x72, 0x2f, 0x33, 0x41, 0x42, 0x56, 0x41, 0x45, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x56, 0x41, 0x46, 0x44, + 0x2f, 0x33, 0x41, 0x42, 0x56, 0x41, 0x46, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x56, 0x41, 0x46, 0x4c, 0x2f, 0x30, + 0x77, 0x42, 0x56, 0x41, 0x46, 0x54, 0x2f, 0x33, 0x41, 0x42, 0x56, 0x41, 0x46, 0x58, 0x2f, 0x33, 0x41, 0x42, + 0x56, 0x0a, + 0x09, 0x41, 0x46, 0x67, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x46, 0x6b, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, + 0x46, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x46, 0x76, 0x2f, 0x79, 0x51, 0x42, 0x56, 0x41, 0x46, 0x77, + 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x46, 0x30, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x47, 0x2f, 0x2f, 0x30, + 0x77, 0x42, 0x56, 0x41, 0x48, 0x44, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x48, 0x48, 0x2f, 0x30, 0x77, 0x42, + 0x56, 0x0a, + 0x09, 0x41, 0x48, 0x4c, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x48, 0x50, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, + 0x48, 0x6a, 0x2f, 0x33, 0x41, 0x42, 0x56, 0x41, 0x48, 0x6e, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x48, 0x72, + 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x48, 0x76, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x48, 0x7a, 0x2f, 0x30, + 0x77, 0x42, 0x56, 0x41, 0x48, 0x33, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x48, 0x34, 0x41, 0x41, 0x41, 0x42, + 0x56, 0x0a, + 0x09, 0x41, 0x48, 0x38, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, + 0x49, 0x45, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x4b, 0x6e, 0x2f, 0x74, 0x77, 0x42, 0x56, 0x41, 0x4b, 0x6f, + 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x4c, 0x55, 0x41, 0x56, + 0x67, 0x42, 0x56, 0x41, 0x4c, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x4d, 0x58, 0x2b, 0x79, 0x51, 0x42, + 0x56, 0x0a, + 0x09, 0x41, 0x4f, 0x59, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, 0x4f, 0x73, 0x41, 0x41, 0x41, 0x42, 0x56, 0x41, + 0x50, 0x66, 0x2f, 0x33, 0x41, 0x42, 0x56, 0x41, 0x50, 0x7a, 0x2f, 0x30, 0x77, 0x42, 0x56, 0x41, 0x50, 0x37, + 0x2f, 0x30, 0x77, 0x42, 0x5a, 0x41, 0x42, 0x44, 0x2f, 0x79, 0x51, 0x42, 0x5a, 0x41, 0x42, 0x48, 0x2f, 0x59, + 0x51, 0x42, 0x5a, 0x41, 0x42, 0x33, 0x2f, 0x6b, 0x41, 0x42, 0x5a, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x42, + 0x5a, 0x0a, + 0x09, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x42, 0x5a, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x42, 0x5a, 0x41, + 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x42, 0x5a, 0x41, 0x4d, 0x58, 0x2b, 0x38, 0x41, 0x42, 0x61, 0x41, 0x42, 0x41, + 0x41, 0x41, 0x41, 0x42, 0x61, 0x41, 0x42, 0x48, 0x2f, 0x52, 0x41, 0x42, 0x61, 0x41, 0x42, 0x33, 0x2f, 0x6b, + 0x41, 0x42, 0x61, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x42, 0x61, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x42, + 0x61, 0x0a, + 0x09, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x42, 0x61, 0x41, 0x4c, 0x55, 0x41, 0x41, 0x41, 0x42, 0x61, 0x41, + 0x4d, 0x58, 0x2f, 0x4b, 0x51, 0x42, 0x62, 0x41, 0x45, 0x62, 0x2f, 0x33, 0x41, 0x42, 0x62, 0x41, 0x45, 0x6a, + 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, 0x46, 0x4c, 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, 0x47, 0x2f, 0x2f, 0x33, + 0x41, 0x42, 0x62, 0x41, 0x48, 0x44, 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, 0x48, 0x48, 0x2f, 0x77, 0x51, 0x42, + 0x62, 0x0a, + 0x09, 0x41, 0x48, 0x4c, 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, 0x48, 0x50, 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, + 0x48, 0x6e, 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, 0x48, 0x72, 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, 0x48, 0x76, + 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, 0x48, 0x7a, 0x2f, 0x77, 0x51, 0x42, 0x62, 0x41, 0x48, 0x33, 0x2f, 0x77, + 0x51, 0x42, 0x62, 0x41, 0x50, 0x7a, 0x2f, 0x33, 0x41, 0x42, 0x62, 0x41, 0x50, 0x37, 0x2f, 0x33, 0x41, 0x42, + 0x63, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x2f, 0x33, 0x41, 0x42, 0x63, 0x41, 0x42, 0x48, 0x2b, 0x33, 0x41, 0x42, 0x63, 0x41, + 0x42, 0x33, 0x2f, 0x61, 0x77, 0x42, 0x63, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x42, 0x63, 0x41, 0x4b, 0x72, + 0x2f, 0x33, 0x41, 0x42, 0x63, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x42, 0x63, 0x41, 0x4c, 0x55, 0x41, 0x41, + 0x41, 0x42, 0x63, 0x41, 0x4d, 0x58, 0x2b, 0x30, 0x77, 0x42, 0x69, 0x41, 0x42, 0x44, 0x2f, 0x30, 0x77, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x42, 0x33, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, + 0x43, 0x51, 0x41, 0x4f, 0x51, 0x42, 0x69, 0x41, 0x43, 0x62, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x43, 0x72, + 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x44, 0x4c, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x44, 0x54, 0x2f, 0x33, + 0x41, 0x42, 0x69, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x44, 0x66, 0x2f, 0x59, 0x51, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x44, 0x6e, 0x2f, 0x66, 0x51, 0x42, 0x69, 0x41, + 0x44, 0x72, 0x2f, 0x6b, 0x41, 0x42, 0x69, 0x41, 0x44, 0x73, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x44, 0x7a, + 0x2f, 0x59, 0x51, 0x42, 0x69, 0x41, 0x45, 0x62, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x45, 0x66, 0x2f, 0x33, + 0x41, 0x42, 0x69, 0x41, 0x45, 0x6a, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x45, 0x6e, 0x2f, 0x74, 0x77, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x46, 0x4c, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x46, 0x54, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, + 0x46, 0x66, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x46, 0x67, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x46, 0x6e, + 0x2f, 0x69, 0x41, 0x42, 0x69, 0x41, 0x46, 0x72, 0x2f, 0x72, 0x51, 0x42, 0x69, 0x41, 0x46, 0x7a, 0x2f, 0x64, + 0x51, 0x42, 0x69, 0x41, 0x47, 0x49, 0x41, 0x4f, 0x51, 0x42, 0x69, 0x41, 0x47, 0x54, 0x2f, 0x33, 0x41, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x47, 0x66, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x47, 0x67, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, + 0x47, 0x2f, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x48, 0x44, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x48, 0x48, + 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x48, 0x4c, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x48, 0x50, 0x2f, 0x33, + 0x41, 0x42, 0x69, 0x41, 0x48, 0x6e, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x48, 0x72, 0x2f, 0x33, 0x41, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x48, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x48, 0x7a, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, + 0x48, 0x33, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x48, 0x34, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x48, 0x38, + 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x49, 0x45, 0x41, 0x41, + 0x41, 0x42, 0x69, 0x41, 0x4b, 0x6e, 0x2f, 0x74, 0x77, 0x42, 0x69, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x4b, 0x30, 0x41, 0x4f, 0x51, 0x42, 0x69, 0x41, 0x4b, 0x34, 0x41, 0x4f, 0x51, 0x42, 0x69, 0x41, + 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x4c, 0x54, 0x2b, 0x2b, 0x41, 0x42, 0x69, 0x41, 0x4c, 0x58, + 0x2f, 0x41, 0x77, 0x42, 0x69, 0x41, 0x4c, 0x72, 0x2f, 0x64, 0x51, 0x42, 0x69, 0x41, 0x4c, 0x76, 0x2f, 0x59, + 0x51, 0x42, 0x69, 0x41, 0x4d, 0x55, 0x41, 0x4c, 0x77, 0x42, 0x69, 0x41, 0x4d, 0x63, 0x41, 0x4f, 0x51, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x4d, 0x6b, 0x41, 0x4f, 0x51, 0x42, 0x69, 0x41, 0x4e, 0x44, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, + 0x4e, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x4e, 0x4c, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x4e, 0x4d, + 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x4e, 0x51, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x4e, 0x55, 0x41, 0x41, + 0x41, 0x42, 0x69, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x4f, 0x72, 0x2f, 0x59, 0x51, 0x42, + 0x69, 0x0a, + 0x09, 0x41, 0x4f, 0x76, 0x2f, 0x64, 0x51, 0x42, 0x69, 0x41, 0x50, 0x62, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, + 0x50, 0x6b, 0x41, 0x41, 0x41, 0x42, 0x69, 0x41, 0x50, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x50, 0x7a, + 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x50, 0x33, 0x2f, 0x33, 0x41, 0x42, 0x69, 0x41, 0x50, 0x37, 0x2f, 0x33, + 0x41, 0x42, 0x6b, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, 0x43, 0x51, 0x41, 0x41, 0x41, 0x42, + 0x6b, 0x0a, + 0x09, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, 0x44, 0x7a, 0x2f, 0x33, 0x41, 0x42, 0x6b, 0x41, + 0x47, 0x49, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x42, 0x6b, 0x41, 0x4b, 0x72, + 0x2f, 0x33, 0x41, 0x42, 0x6b, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, 0x4b, 0x34, 0x41, 0x41, + 0x41, 0x42, 0x6b, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, 0x4c, 0x55, 0x41, 0x4a, 0x67, 0x42, + 0x6b, 0x0a, + 0x09, 0x41, 0x4c, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x6b, 0x41, 0x4d, 0x55, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, + 0x4d, 0x63, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, 0x4f, 0x4d, + 0x41, 0x41, 0x41, 0x42, 0x6b, 0x41, 0x4f, 0x72, 0x2f, 0x33, 0x41, 0x42, 0x6b, 0x41, 0x50, 0x6b, 0x41, 0x41, + 0x41, 0x42, 0x6e, 0x41, 0x42, 0x41, 0x41, 0x4f, 0x51, 0x42, 0x6e, 0x41, 0x42, 0x48, 0x2f, 0x72, 0x51, 0x42, + 0x6e, 0x0a, + 0x09, 0x41, 0x42, 0x33, 0x2f, 0x33, 0x41, 0x42, 0x6e, 0x41, 0x43, 0x54, 0x2f, 0x33, 0x41, 0x42, 0x6e, 0x41, + 0x44, 0x6e, 0x2f, 0x33, 0x41, 0x42, 0x6e, 0x41, 0x44, 0x76, 0x2f, 0x66, 0x51, 0x42, 0x6e, 0x41, 0x44, 0x7a, + 0x2f, 0x6b, 0x41, 0x42, 0x6e, 0x41, 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x42, 0x6e, 0x41, 0x4b, 0x6e, 0x2f, 0x33, + 0x41, 0x42, 0x6e, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x6e, 0x41, 0x4b, 0x33, 0x2f, 0x33, 0x41, 0x42, + 0x6e, 0x0a, + 0x09, 0x41, 0x4b, 0x37, 0x2f, 0x33, 0x41, 0x42, 0x6e, 0x41, 0x4c, 0x54, 0x2f, 0x30, 0x77, 0x42, 0x6e, 0x41, + 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x42, 0x6e, 0x41, 0x4c, 0x76, 0x2f, 0x6b, 0x41, 0x42, 0x6e, 0x41, 0x4d, 0x58, + 0x2f, 0x52, 0x41, 0x42, 0x6e, 0x41, 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x42, 0x6e, 0x41, 0x4d, 0x6e, 0x2f, 0x33, + 0x41, 0x42, 0x6e, 0x41, 0x4f, 0x72, 0x2f, 0x6b, 0x41, 0x42, 0x6f, 0x41, 0x43, 0x51, 0x41, 0x41, 0x41, 0x42, + 0x6f, 0x0a, + 0x09, 0x41, 0x43, 0x30, 0x41, 0x41, 0x41, 0x42, 0x6f, 0x41, 0x44, 0x33, 0x2f, 0x33, 0x41, 0x42, 0x6f, 0x41, + 0x47, 0x49, 0x41, 0x41, 0x41, 0x42, 0x6f, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x41, 0x42, 0x6f, 0x41, 0x4b, 0x34, + 0x41, 0x41, 0x41, 0x42, 0x6f, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x42, 0x6f, 0x41, 0x4d, 0x6b, 0x41, 0x41, + 0x41, 0x42, 0x6f, 0x41, 0x4f, 0x58, 0x2f, 0x33, 0x41, 0x42, 0x77, 0x41, 0x46, 0x76, 0x2f, 0x33, 0x41, 0x42, + 0x78, 0x0a, + 0x09, 0x41, 0x46, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x79, 0x41, 0x46, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x7a, 0x41, + 0x46, 0x76, 0x2f, 0x33, 0x41, 0x42, 0x34, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x42, 0x34, 0x41, 0x42, 0x45, + 0x41, 0x41, 0x41, 0x42, 0x34, 0x41, 0x42, 0x30, 0x41, 0x41, 0x41, 0x42, 0x34, 0x41, 0x4b, 0x6b, 0x41, 0x41, + 0x41, 0x42, 0x34, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x34, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x42, + 0x34, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x6b, 0x41, 0x42, 0x34, 0x41, 0x4d, 0x58, 0x2f, 0x70, 0x41, 0x42, 0x35, 0x41, + 0x42, 0x41, 0x41, 0x4a, 0x67, 0x42, 0x35, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x35, 0x41, 0x42, 0x30, + 0x41, 0x41, 0x41, 0x42, 0x35, 0x41, 0x46, 0x76, 0x2f, 0x77, 0x51, 0x42, 0x35, 0x41, 0x4b, 0x6b, 0x41, 0x41, + 0x41, 0x42, 0x35, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x35, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x42, + 0x35, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x74, 0x77, 0x42, 0x35, 0x41, 0x4d, 0x58, 0x2f, 0x66, 0x51, 0x42, 0x36, 0x41, + 0x42, 0x41, 0x41, 0x4a, 0x67, 0x42, 0x36, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x36, 0x41, 0x42, 0x30, + 0x41, 0x41, 0x41, 0x42, 0x36, 0x41, 0x46, 0x76, 0x2f, 0x77, 0x51, 0x42, 0x36, 0x41, 0x4b, 0x6b, 0x41, 0x41, + 0x41, 0x42, 0x36, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x36, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x42, + 0x36, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x74, 0x77, 0x42, 0x36, 0x41, 0x4d, 0x58, 0x2f, 0x66, 0x51, 0x42, 0x37, 0x41, + 0x42, 0x41, 0x41, 0x4a, 0x67, 0x42, 0x37, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x37, 0x41, 0x42, 0x30, + 0x41, 0x41, 0x41, 0x42, 0x37, 0x41, 0x46, 0x76, 0x2f, 0x77, 0x51, 0x42, 0x37, 0x41, 0x4b, 0x6b, 0x41, 0x41, + 0x41, 0x42, 0x37, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x37, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x42, + 0x37, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x74, 0x77, 0x42, 0x37, 0x41, 0x4d, 0x58, 0x2f, 0x66, 0x51, 0x42, 0x38, 0x41, + 0x42, 0x41, 0x41, 0x4a, 0x67, 0x42, 0x38, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x38, 0x41, 0x42, 0x30, + 0x41, 0x41, 0x41, 0x42, 0x38, 0x41, 0x46, 0x76, 0x2f, 0x77, 0x51, 0x42, 0x38, 0x41, 0x4b, 0x6b, 0x41, 0x41, + 0x41, 0x42, 0x38, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x38, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x42, + 0x38, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x74, 0x77, 0x42, 0x38, 0x41, 0x4d, 0x58, 0x2f, 0x66, 0x51, 0x42, 0x39, 0x41, + 0x42, 0x41, 0x41, 0x4a, 0x67, 0x42, 0x39, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x42, 0x39, 0x41, 0x42, 0x30, + 0x41, 0x41, 0x41, 0x42, 0x39, 0x41, 0x46, 0x76, 0x2f, 0x77, 0x51, 0x42, 0x39, 0x41, 0x4b, 0x6b, 0x41, 0x41, + 0x41, 0x42, 0x39, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x42, 0x39, 0x41, 0x4c, 0x54, 0x2f, 0x61, 0x77, 0x42, + 0x39, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x74, 0x77, 0x42, 0x39, 0x41, 0x4d, 0x58, 0x2f, 0x66, 0x51, 0x43, 0x4a, 0x41, + 0x42, 0x41, 0x41, 0x4a, 0x67, 0x43, 0x4a, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x4a, 0x41, 0x4b, 0x6f, + 0x41, 0x41, 0x41, 0x43, 0x4a, 0x41, 0x4c, 0x54, 0x2f, 0x6b, 0x41, 0x43, 0x4a, 0x41, 0x4c, 0x58, 0x2f, 0x6b, + 0x41, 0x43, 0x4a, 0x41, 0x4d, 0x58, 0x2f, 0x72, 0x51, 0x43, 0x51, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x43, + 0x51, 0x0a, + 0x09, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x51, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x43, 0x51, 0x41, + 0x4c, 0x54, 0x2f, 0x72, 0x51, 0x43, 0x51, 0x41, 0x4c, 0x58, 0x2f, 0x70, 0x41, 0x43, 0x51, 0x41, 0x4d, 0x58, + 0x2f, 0x6b, 0x41, 0x43, 0x70, 0x41, 0x43, 0x51, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x43, 0x58, 0x2f, 0x33, + 0x41, 0x43, 0x70, 0x41, 0x43, 0x62, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x43, 0x66, 0x2f, 0x33, 0x41, 0x43, + 0x70, 0x0a, + 0x09, 0x41, 0x43, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x43, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, + 0x43, 0x73, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x43, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x43, 0x34, + 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x43, 0x38, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x44, 0x49, 0x41, 0x41, + 0x41, 0x43, 0x70, 0x41, 0x44, 0x4d, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x44, 0x51, 0x41, 0x41, 0x41, 0x43, + 0x70, 0x0a, + 0x09, 0x41, 0x44, 0x55, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x44, 0x66, 0x2f, 0x6b, 0x41, 0x43, 0x70, 0x41, + 0x44, 0x6e, 0x2f, 0x6b, 0x41, 0x43, 0x70, 0x41, 0x44, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x44, 0x73, + 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x44, 0x7a, 0x2f, 0x61, 0x77, 0x43, 0x70, 0x41, 0x44, 0x30, 0x41, 0x41, + 0x41, 0x43, 0x70, 0x41, 0x45, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x46, 0x45, 0x41, 0x41, 0x41, 0x43, + 0x70, 0x0a, + 0x09, 0x41, 0x46, 0x49, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x46, 0x55, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, + 0x46, 0x6e, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x46, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x46, 0x7a, + 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x47, 0x54, 0x2f, 0x33, + 0x41, 0x43, 0x70, 0x41, 0x47, 0x63, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x48, 0x67, 0x41, 0x41, 0x41, 0x43, + 0x70, 0x0a, + 0x09, 0x41, 0x48, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x48, 0x6f, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, + 0x48, 0x73, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x48, 0x77, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x48, 0x30, + 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x49, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x4a, 0x41, 0x41, 0x6c, + 0x77, 0x43, 0x70, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x4b, 0x34, 0x41, 0x41, 0x41, 0x43, + 0x70, 0x0a, + 0x09, 0x41, 0x4b, 0x38, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x4c, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, + 0x4c, 0x76, 0x2f, 0x61, 0x77, 0x43, 0x70, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x4d, 0x6b, + 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x4e, 0x41, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x4e, 0x45, 0x41, 0x41, + 0x41, 0x43, 0x70, 0x41, 0x4e, 0x49, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x4f, 0x55, 0x41, 0x41, 0x41, 0x43, + 0x70, 0x0a, + 0x09, 0x41, 0x4f, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x4f, 0x72, 0x2f, 0x61, 0x77, 0x43, 0x70, 0x41, + 0x4f, 0x76, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x4f, 0x77, 0x41, 0x41, 0x41, 0x43, 0x70, 0x41, 0x50, 0x62, + 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x50, 0x76, 0x2f, 0x33, 0x41, 0x43, 0x70, 0x41, 0x50, 0x33, 0x2f, 0x33, + 0x41, 0x43, 0x71, 0x41, 0x43, 0x54, 0x2f, 0x74, 0x77, 0x43, 0x71, 0x41, 0x43, 0x58, 0x2f, 0x74, 0x77, 0x43, + 0x71, 0x0a, + 0x09, 0x41, 0x43, 0x62, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x43, 0x66, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, + 0x43, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x43, 0x6f, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x43, 0x73, + 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x43, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x43, 0x34, 0x41, 0x41, + 0x41, 0x43, 0x71, 0x41, 0x43, 0x38, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x44, 0x4c, 0x2f, 0x33, 0x41, 0x43, + 0x71, 0x0a, + 0x09, 0x41, 0x44, 0x4d, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x44, 0x51, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, + 0x44, 0x55, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x44, 0x66, 0x2f, 0x52, 0x41, 0x43, 0x71, 0x41, 0x44, 0x6e, + 0x2f, 0x54, 0x67, 0x43, 0x71, 0x41, 0x44, 0x72, 0x2f, 0x6b, 0x41, 0x43, 0x71, 0x41, 0x44, 0x76, 0x2f, 0x6b, + 0x41, 0x43, 0x71, 0x41, 0x44, 0x7a, 0x2f, 0x48, 0x77, 0x43, 0x71, 0x41, 0x44, 0x30, 0x41, 0x41, 0x41, 0x43, + 0x71, 0x0a, + 0x09, 0x41, 0x45, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x46, 0x45, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, + 0x46, 0x49, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x46, 0x55, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x46, 0x6e, + 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x46, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x46, 0x7a, 0x2f, 0x33, + 0x41, 0x43, 0x71, 0x41, 0x47, 0x4c, 0x2f, 0x74, 0x77, 0x43, 0x71, 0x41, 0x47, 0x54, 0x2f, 0x33, 0x41, 0x43, + 0x71, 0x0a, + 0x09, 0x41, 0x47, 0x66, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x48, 0x67, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, + 0x48, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x48, 0x6f, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x48, 0x73, + 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x48, 0x77, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x48, 0x30, 0x41, 0x41, + 0x41, 0x43, 0x71, 0x41, 0x49, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x4a, 0x41, 0x41, 0x41, 0x41, 0x43, + 0x71, 0x0a, + 0x09, 0x41, 0x4b, 0x33, 0x2f, 0x74, 0x77, 0x43, 0x71, 0x41, 0x4b, 0x37, 0x2f, 0x74, 0x77, 0x43, 0x71, 0x41, + 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x4c, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x4c, 0x76, + 0x2f, 0x48, 0x77, 0x43, 0x71, 0x41, 0x4d, 0x66, 0x2f, 0x74, 0x77, 0x43, 0x71, 0x41, 0x4d, 0x6e, 0x2f, 0x74, + 0x77, 0x43, 0x71, 0x41, 0x4e, 0x44, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x4e, 0x48, 0x2f, 0x33, 0x41, 0x43, + 0x71, 0x0a, + 0x09, 0x41, 0x4e, 0x4c, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x4f, 0x55, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, + 0x4f, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x4f, 0x72, 0x2f, 0x48, 0x77, 0x43, 0x71, 0x41, 0x4f, 0x76, + 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x4f, 0x77, 0x41, 0x41, 0x41, 0x43, 0x71, 0x41, 0x50, 0x59, 0x41, 0x41, + 0x41, 0x43, 0x71, 0x41, 0x50, 0x76, 0x2f, 0x33, 0x41, 0x43, 0x71, 0x41, 0x50, 0x33, 0x2f, 0x33, 0x41, 0x43, + 0x74, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x2f, 0x30, 0x77, 0x43, 0x74, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, + 0x42, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x43, 0x51, 0x41, 0x4f, 0x51, 0x43, 0x74, 0x41, 0x43, 0x62, + 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x43, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x44, 0x4c, 0x2f, 0x33, + 0x41, 0x43, 0x74, 0x41, 0x44, 0x54, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x43, + 0x74, 0x0a, + 0x09, 0x41, 0x44, 0x66, 0x2f, 0x59, 0x51, 0x43, 0x74, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, + 0x44, 0x6e, 0x2f, 0x66, 0x51, 0x43, 0x74, 0x41, 0x44, 0x72, 0x2f, 0x6b, 0x41, 0x43, 0x74, 0x41, 0x44, 0x73, + 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x44, 0x7a, 0x2f, 0x59, 0x51, 0x43, 0x74, 0x41, 0x45, 0x62, 0x2f, 0x33, + 0x41, 0x43, 0x74, 0x41, 0x45, 0x66, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x45, 0x6a, 0x2f, 0x33, 0x41, 0x43, + 0x74, 0x0a, + 0x09, 0x41, 0x45, 0x6e, 0x2f, 0x74, 0x77, 0x43, 0x74, 0x41, 0x46, 0x4c, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, + 0x46, 0x54, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x46, 0x66, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x46, 0x67, + 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x46, 0x6e, 0x2f, 0x69, 0x41, 0x43, 0x74, 0x41, 0x46, 0x72, 0x2f, 0x72, + 0x51, 0x43, 0x74, 0x41, 0x46, 0x7a, 0x2f, 0x64, 0x51, 0x43, 0x74, 0x41, 0x47, 0x49, 0x41, 0x4f, 0x51, 0x43, + 0x74, 0x0a, + 0x09, 0x41, 0x47, 0x54, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x47, 0x66, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, + 0x47, 0x67, 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x47, 0x2f, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x48, 0x44, + 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x48, 0x48, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x48, 0x4c, 0x2f, 0x33, + 0x41, 0x43, 0x74, 0x41, 0x48, 0x50, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x48, 0x6e, 0x2f, 0x33, 0x41, 0x43, + 0x74, 0x0a, + 0x09, 0x41, 0x48, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x48, 0x76, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, + 0x48, 0x7a, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x48, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x48, 0x34, + 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x48, 0x38, 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x49, 0x41, 0x41, 0x41, + 0x41, 0x43, 0x74, 0x41, 0x49, 0x45, 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x4b, 0x6e, 0x2f, 0x74, 0x77, 0x43, + 0x74, 0x0a, + 0x09, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x4b, 0x30, 0x41, 0x4f, 0x51, 0x43, 0x74, 0x41, + 0x4b, 0x34, 0x41, 0x4f, 0x51, 0x43, 0x74, 0x41, 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x4c, 0x54, + 0x2b, 0x2b, 0x41, 0x43, 0x74, 0x41, 0x4c, 0x58, 0x2f, 0x41, 0x77, 0x43, 0x74, 0x41, 0x4c, 0x72, 0x2f, 0x64, + 0x51, 0x43, 0x74, 0x41, 0x4c, 0x76, 0x2f, 0x59, 0x51, 0x43, 0x74, 0x41, 0x4d, 0x55, 0x41, 0x4c, 0x77, 0x43, + 0x74, 0x0a, + 0x09, 0x41, 0x4d, 0x63, 0x41, 0x4f, 0x51, 0x43, 0x74, 0x41, 0x4d, 0x6b, 0x41, 0x4f, 0x51, 0x43, 0x74, 0x41, + 0x4e, 0x44, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x4e, 0x48, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x4e, 0x4c, + 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x4e, 0x4d, 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x4e, 0x51, 0x41, 0x41, + 0x41, 0x43, 0x74, 0x41, 0x4e, 0x55, 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x43, + 0x74, 0x0a, + 0x09, 0x41, 0x4f, 0x72, 0x2f, 0x59, 0x51, 0x43, 0x74, 0x41, 0x4f, 0x76, 0x2f, 0x64, 0x51, 0x43, 0x74, 0x41, + 0x50, 0x62, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x50, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x74, 0x41, 0x50, 0x76, + 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x50, 0x7a, 0x2f, 0x33, 0x41, 0x43, 0x74, 0x41, 0x50, 0x33, 0x2f, 0x33, + 0x41, 0x43, 0x74, 0x41, 0x50, 0x37, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x42, 0x44, 0x2f, 0x30, 0x77, 0x43, + 0x75, 0x0a, + 0x09, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x42, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, + 0x43, 0x51, 0x41, 0x4f, 0x51, 0x43, 0x75, 0x41, 0x43, 0x62, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x43, 0x72, + 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x44, 0x4c, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x44, 0x54, 0x2f, 0x33, + 0x41, 0x43, 0x75, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x44, 0x66, 0x2f, 0x59, 0x51, 0x43, + 0x75, 0x0a, + 0x09, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x44, 0x6e, 0x2f, 0x66, 0x51, 0x43, 0x75, 0x41, + 0x44, 0x72, 0x2f, 0x6b, 0x41, 0x43, 0x75, 0x41, 0x44, 0x73, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x44, 0x7a, + 0x2f, 0x59, 0x51, 0x43, 0x75, 0x41, 0x45, 0x62, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x45, 0x66, 0x2f, 0x33, + 0x41, 0x43, 0x75, 0x41, 0x45, 0x6a, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x45, 0x6e, 0x2f, 0x74, 0x77, 0x43, + 0x75, 0x0a, + 0x09, 0x41, 0x46, 0x4c, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x46, 0x54, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, + 0x46, 0x66, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x46, 0x67, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x46, 0x6e, + 0x2f, 0x69, 0x41, 0x43, 0x75, 0x41, 0x46, 0x72, 0x2f, 0x72, 0x51, 0x43, 0x75, 0x41, 0x46, 0x7a, 0x2f, 0x64, + 0x51, 0x43, 0x75, 0x41, 0x47, 0x49, 0x41, 0x4f, 0x51, 0x43, 0x75, 0x41, 0x47, 0x54, 0x2f, 0x33, 0x41, 0x43, + 0x75, 0x0a, + 0x09, 0x41, 0x47, 0x66, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x47, 0x67, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, + 0x47, 0x2f, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x48, 0x44, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x48, 0x48, + 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x48, 0x4c, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x48, 0x50, 0x2f, 0x33, + 0x41, 0x43, 0x75, 0x41, 0x48, 0x6e, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x48, 0x72, 0x2f, 0x33, 0x41, 0x43, + 0x75, 0x0a, + 0x09, 0x41, 0x48, 0x76, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x48, 0x7a, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, + 0x48, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x48, 0x34, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x48, 0x38, + 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x49, 0x45, 0x41, 0x41, + 0x41, 0x43, 0x75, 0x41, 0x4b, 0x6e, 0x2f, 0x74, 0x77, 0x43, 0x75, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x43, + 0x75, 0x0a, + 0x09, 0x41, 0x4b, 0x30, 0x41, 0x4f, 0x51, 0x43, 0x75, 0x41, 0x4b, 0x34, 0x41, 0x4f, 0x51, 0x43, 0x75, 0x41, + 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x4c, 0x54, 0x2b, 0x2b, 0x41, 0x43, 0x75, 0x41, 0x4c, 0x58, + 0x2f, 0x41, 0x77, 0x43, 0x75, 0x41, 0x4c, 0x72, 0x2f, 0x64, 0x51, 0x43, 0x75, 0x41, 0x4c, 0x76, 0x2f, 0x59, + 0x51, 0x43, 0x75, 0x41, 0x4d, 0x55, 0x41, 0x4c, 0x77, 0x43, 0x75, 0x41, 0x4d, 0x63, 0x41, 0x4f, 0x51, 0x43, + 0x75, 0x0a, + 0x09, 0x41, 0x4d, 0x6b, 0x41, 0x4f, 0x51, 0x43, 0x75, 0x41, 0x4e, 0x44, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, + 0x4e, 0x48, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x4e, 0x4c, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x4e, 0x4d, + 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x4e, 0x51, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x4e, 0x55, 0x41, 0x41, + 0x41, 0x43, 0x75, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x4f, 0x72, 0x2f, 0x59, 0x51, 0x43, + 0x75, 0x0a, + 0x09, 0x41, 0x4f, 0x76, 0x2f, 0x64, 0x51, 0x43, 0x75, 0x41, 0x50, 0x62, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, + 0x50, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x75, 0x41, 0x50, 0x76, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x50, 0x7a, + 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x50, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x75, 0x41, 0x50, 0x37, 0x2f, 0x33, + 0x41, 0x43, 0x76, 0x41, 0x42, 0x41, 0x41, 0x4f, 0x51, 0x43, 0x76, 0x41, 0x42, 0x48, 0x2f, 0x72, 0x51, 0x43, + 0x76, 0x0a, + 0x09, 0x41, 0x42, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x76, 0x41, 0x43, 0x54, 0x2f, 0x33, 0x41, 0x43, 0x76, 0x41, + 0x44, 0x6e, 0x2f, 0x33, 0x41, 0x43, 0x76, 0x41, 0x44, 0x76, 0x2f, 0x66, 0x51, 0x43, 0x76, 0x41, 0x44, 0x7a, + 0x2f, 0x6b, 0x41, 0x43, 0x76, 0x41, 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x43, 0x76, 0x41, 0x4b, 0x6e, 0x2f, 0x33, + 0x41, 0x43, 0x76, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x43, 0x76, 0x41, 0x4b, 0x33, 0x2f, 0x33, 0x41, 0x43, + 0x76, 0x0a, + 0x09, 0x41, 0x4b, 0x37, 0x2f, 0x33, 0x41, 0x43, 0x76, 0x41, 0x4c, 0x54, 0x2f, 0x30, 0x77, 0x43, 0x76, 0x41, + 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x43, 0x76, 0x41, 0x4c, 0x76, 0x2f, 0x6b, 0x41, 0x43, 0x76, 0x41, 0x4d, 0x58, + 0x2f, 0x52, 0x41, 0x43, 0x76, 0x41, 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x43, 0x76, 0x41, 0x4d, 0x6e, 0x2f, 0x33, + 0x41, 0x43, 0x76, 0x41, 0x4f, 0x72, 0x2f, 0x6b, 0x41, 0x43, 0x30, 0x41, 0x43, 0x54, 0x2b, 0x2b, 0x41, 0x43, + 0x30, 0x0a, + 0x09, 0x41, 0x43, 0x58, 0x2f, 0x77, 0x51, 0x43, 0x30, 0x41, 0x43, 0x62, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, + 0x43, 0x66, 0x2f, 0x77, 0x51, 0x43, 0x30, 0x41, 0x43, 0x6e, 0x2f, 0x77, 0x51, 0x43, 0x30, 0x41, 0x43, 0x72, + 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x43, 0x76, 0x2f, 0x77, 0x51, 0x43, 0x30, 0x41, 0x43, 0x33, 0x2f, 0x77, + 0x51, 0x43, 0x30, 0x41, 0x43, 0x37, 0x2f, 0x77, 0x51, 0x43, 0x30, 0x41, 0x43, 0x2f, 0x2f, 0x77, 0x51, 0x43, + 0x30, 0x0a, + 0x09, 0x41, 0x44, 0x4c, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x44, 0x50, 0x2f, 0x77, 0x51, 0x43, 0x30, 0x41, + 0x44, 0x54, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x44, 0x58, 0x2f, 0x77, 0x51, 0x43, 0x30, 0x41, 0x44, 0x63, + 0x41, 0x41, 0x41, 0x43, 0x30, 0x41, 0x44, 0x6b, 0x41, 0x41, 0x41, 0x43, 0x30, 0x41, 0x44, 0x6f, 0x41, 0x41, + 0x41, 0x43, 0x30, 0x41, 0x44, 0x76, 0x2f, 0x69, 0x41, 0x43, 0x30, 0x41, 0x44, 0x77, 0x41, 0x41, 0x41, 0x43, + 0x30, 0x0a, + 0x09, 0x41, 0x44, 0x33, 0x2f, 0x33, 0x41, 0x43, 0x30, 0x41, 0x45, 0x6e, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, + 0x46, 0x48, 0x2f, 0x6b, 0x41, 0x43, 0x30, 0x41, 0x46, 0x4c, 0x2f, 0x61, 0x77, 0x43, 0x30, 0x41, 0x46, 0x58, + 0x2f, 0x6b, 0x41, 0x43, 0x30, 0x41, 0x46, 0x6e, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x46, 0x72, 0x2f, 0x74, + 0x77, 0x43, 0x30, 0x41, 0x46, 0x7a, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x47, 0x4c, 0x2b, 0x2b, 0x41, 0x43, + 0x30, 0x0a, + 0x09, 0x41, 0x47, 0x54, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x47, 0x66, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, + 0x48, 0x6a, 0x2f, 0x6b, 0x41, 0x43, 0x30, 0x41, 0x48, 0x6e, 0x2f, 0x61, 0x77, 0x43, 0x30, 0x41, 0x48, 0x72, + 0x2f, 0x61, 0x77, 0x43, 0x30, 0x41, 0x48, 0x76, 0x2f, 0x61, 0x77, 0x43, 0x30, 0x41, 0x48, 0x7a, 0x2f, 0x61, + 0x77, 0x43, 0x30, 0x41, 0x48, 0x33, 0x2f, 0x61, 0x77, 0x43, 0x30, 0x41, 0x49, 0x6e, 0x2f, 0x77, 0x51, 0x43, + 0x30, 0x0a, + 0x09, 0x41, 0x4a, 0x44, 0x2b, 0x66, 0x51, 0x43, 0x30, 0x41, 0x4b, 0x33, 0x2b, 0x2b, 0x41, 0x43, 0x30, 0x41, + 0x4b, 0x37, 0x2b, 0x2b, 0x41, 0x43, 0x30, 0x41, 0x4b, 0x2f, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x4c, 0x72, + 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x4c, 0x73, 0x41, 0x41, 0x41, 0x43, 0x30, 0x41, 0x4d, 0x66, 0x2b, 0x2b, + 0x41, 0x43, 0x30, 0x41, 0x4d, 0x6e, 0x2b, 0x2b, 0x41, 0x43, 0x30, 0x41, 0x4e, 0x44, 0x2f, 0x74, 0x77, 0x43, + 0x30, 0x0a, + 0x09, 0x41, 0x4e, 0x48, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x4e, 0x4c, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, + 0x4f, 0x58, 0x2f, 0x33, 0x41, 0x43, 0x30, 0x41, 0x4f, 0x6e, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x4f, 0x6f, + 0x41, 0x41, 0x41, 0x43, 0x30, 0x41, 0x4f, 0x76, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x4f, 0x7a, 0x2f, 0x77, + 0x51, 0x43, 0x30, 0x41, 0x50, 0x62, 0x2f, 0x74, 0x77, 0x43, 0x30, 0x41, 0x50, 0x76, 0x2f, 0x74, 0x77, 0x43, + 0x30, 0x0a, + 0x09, 0x41, 0x50, 0x33, 0x2f, 0x74, 0x77, 0x43, 0x36, 0x41, 0x42, 0x44, 0x2f, 0x33, 0x41, 0x43, 0x36, 0x41, + 0x42, 0x48, 0x2b, 0x33, 0x41, 0x43, 0x36, 0x41, 0x42, 0x33, 0x2f, 0x61, 0x77, 0x43, 0x36, 0x41, 0x4b, 0x6e, + 0x2f, 0x33, 0x41, 0x43, 0x36, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x43, 0x36, 0x41, 0x4c, 0x51, 0x41, 0x41, + 0x41, 0x43, 0x36, 0x41, 0x4c, 0x55, 0x41, 0x41, 0x41, 0x43, 0x36, 0x41, 0x4d, 0x58, 0x2b, 0x30, 0x77, 0x43, + 0x37, 0x0a, + 0x09, 0x41, 0x42, 0x44, 0x2f, 0x44, 0x51, 0x43, 0x37, 0x41, 0x42, 0x48, 0x2b, 0x59, 0x51, 0x43, 0x37, 0x41, + 0x42, 0x33, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x43, 0x54, 0x2f, 0x59, 0x51, 0x43, 0x37, 0x41, 0x43, 0x62, + 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, 0x44, 0x4c, 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, 0x45, 0x54, 0x2b, 0x35, + 0x67, 0x43, 0x37, 0x41, 0x45, 0x6a, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x45, 0x7a, 0x2f, 0x74, 0x77, 0x43, + 0x37, 0x0a, + 0x09, 0x41, 0x46, 0x4c, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x46, 0x6a, 0x2f, 0x46, 0x51, 0x43, 0x37, 0x41, + 0x47, 0x4c, 0x2f, 0x59, 0x51, 0x43, 0x37, 0x41, 0x47, 0x54, 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, 0x47, 0x66, + 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, 0x47, 0x6e, 0x2b, 0x35, 0x67, 0x43, 0x37, 0x41, 0x47, 0x72, 0x2b, 0x35, + 0x67, 0x43, 0x37, 0x41, 0x47, 0x76, 0x2b, 0x35, 0x67, 0x43, 0x37, 0x41, 0x47, 0x7a, 0x2b, 0x35, 0x67, 0x43, + 0x37, 0x0a, + 0x09, 0x41, 0x47, 0x33, 0x2b, 0x35, 0x67, 0x43, 0x37, 0x41, 0x47, 0x37, 0x2b, 0x35, 0x67, 0x43, 0x37, 0x41, + 0x48, 0x44, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x48, 0x48, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x48, 0x4c, + 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x48, 0x50, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x48, 0x6e, 0x2b, 0x38, + 0x41, 0x43, 0x37, 0x41, 0x48, 0x72, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x48, 0x76, 0x2b, 0x38, 0x41, 0x43, + 0x37, 0x0a, + 0x09, 0x41, 0x48, 0x7a, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, 0x48, 0x33, 0x2b, 0x38, 0x41, 0x43, 0x37, 0x41, + 0x48, 0x37, 0x2f, 0x46, 0x51, 0x43, 0x37, 0x41, 0x48, 0x2f, 0x2f, 0x46, 0x51, 0x43, 0x37, 0x41, 0x49, 0x44, + 0x2f, 0x46, 0x51, 0x43, 0x37, 0x41, 0x49, 0x48, 0x2f, 0x46, 0x51, 0x43, 0x37, 0x41, 0x4b, 0x6e, 0x2f, 0x48, + 0x77, 0x43, 0x37, 0x41, 0x4b, 0x72, 0x2f, 0x61, 0x77, 0x43, 0x37, 0x41, 0x4b, 0x33, 0x2f, 0x59, 0x51, 0x43, + 0x37, 0x0a, + 0x09, 0x41, 0x4b, 0x37, 0x2f, 0x59, 0x51, 0x43, 0x37, 0x41, 0x4b, 0x2f, 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, + 0x4c, 0x54, 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x43, 0x37, 0x41, 0x4d, 0x58, + 0x2b, 0x2b, 0x41, 0x43, 0x37, 0x41, 0x4d, 0x66, 0x2f, 0x59, 0x51, 0x43, 0x37, 0x41, 0x4d, 0x6e, 0x2f, 0x59, + 0x51, 0x43, 0x37, 0x41, 0x4e, 0x44, 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, 0x4e, 0x48, 0x2f, 0x6b, 0x41, 0x43, + 0x37, 0x0a, + 0x09, 0x41, 0x4e, 0x4c, 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, 0x50, 0x76, 0x2f, 0x6b, 0x41, 0x43, 0x37, 0x41, + 0x50, 0x33, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x43, 0x51, 0x41, 0x4a, 0x67, 0x44, 0x46, 0x41, 0x43, 0x58, + 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x43, 0x62, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x43, 0x66, 0x2f, 0x74, + 0x77, 0x44, 0x46, 0x41, 0x43, 0x6e, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x43, 0x72, 0x2f, 0x74, 0x77, 0x44, + 0x46, 0x0a, + 0x09, 0x41, 0x43, 0x76, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x43, 0x30, 0x41, 0x4c, 0x77, 0x44, 0x46, 0x41, + 0x43, 0x37, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x43, 0x2f, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x44, 0x4c, + 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x44, 0x50, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x44, 0x54, 0x2f, 0x6b, + 0x41, 0x44, 0x46, 0x41, 0x44, 0x58, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x44, 0x66, 0x2b, 0x35, 0x67, 0x44, + 0x46, 0x0a, + 0x09, 0x41, 0x44, 0x6e, 0x2b, 0x69, 0x41, 0x44, 0x46, 0x41, 0x44, 0x72, 0x2f, 0x41, 0x77, 0x44, 0x46, 0x41, + 0x44, 0x76, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x44, 0x7a, 0x2b, 0x69, 0x41, 0x44, 0x46, 0x41, 0x44, 0x30, + 0x41, 0x41, 0x41, 0x44, 0x46, 0x41, 0x45, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x46, 0x41, 0x46, 0x48, 0x2f, 0x74, + 0x77, 0x44, 0x46, 0x41, 0x46, 0x4c, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x46, 0x58, 0x2f, 0x74, 0x77, 0x44, + 0x46, 0x0a, + 0x09, 0x41, 0x46, 0x6e, 0x2f, 0x46, 0x51, 0x44, 0x46, 0x41, 0x46, 0x72, 0x2f, 0x50, 0x41, 0x44, 0x46, 0x41, + 0x46, 0x7a, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x47, 0x49, 0x41, 0x4a, 0x67, 0x44, 0x46, 0x41, 0x47, 0x54, + 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x47, 0x66, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x48, 0x6a, 0x2f, 0x74, + 0x77, 0x44, 0x46, 0x41, 0x48, 0x6e, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x48, 0x72, 0x2f, 0x74, 0x77, 0x44, + 0x46, 0x0a, + 0x09, 0x41, 0x48, 0x76, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x48, 0x7a, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, + 0x48, 0x33, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x49, 0x6e, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x4a, 0x41, + 0x41, 0x4a, 0x67, 0x44, 0x46, 0x41, 0x4b, 0x30, 0x41, 0x4a, 0x67, 0x44, 0x46, 0x41, 0x4b, 0x34, 0x41, 0x4a, + 0x67, 0x44, 0x46, 0x41, 0x4b, 0x2f, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x4c, 0x72, 0x2f, 0x6b, 0x41, 0x44, + 0x46, 0x0a, + 0x09, 0x41, 0x4c, 0x76, 0x2b, 0x69, 0x41, 0x44, 0x46, 0x41, 0x4d, 0x63, 0x41, 0x4a, 0x67, 0x44, 0x46, 0x41, + 0x4d, 0x6b, 0x41, 0x4a, 0x67, 0x44, 0x46, 0x41, 0x4e, 0x44, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x4e, 0x48, + 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x4e, 0x4c, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x4f, 0x55, 0x41, 0x41, + 0x41, 0x44, 0x46, 0x41, 0x4f, 0x6e, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x4f, 0x72, 0x2b, 0x69, 0x41, 0x44, + 0x46, 0x0a, + 0x09, 0x41, 0x4f, 0x76, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x4f, 0x7a, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, + 0x50, 0x62, 0x2f, 0x74, 0x77, 0x44, 0x46, 0x41, 0x50, 0x76, 0x2f, 0x6b, 0x41, 0x44, 0x46, 0x41, 0x50, 0x33, + 0x2f, 0x6b, 0x41, 0x44, 0x48, 0x41, 0x42, 0x44, 0x2f, 0x30, 0x77, 0x44, 0x48, 0x41, 0x42, 0x48, 0x2f, 0x33, + 0x41, 0x44, 0x48, 0x41, 0x42, 0x33, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x43, 0x51, 0x41, 0x4f, 0x51, 0x44, + 0x48, 0x0a, + 0x09, 0x41, 0x43, 0x62, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x43, 0x72, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, + 0x44, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x44, 0x54, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x44, 0x59, + 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x44, 0x66, 0x2f, 0x59, 0x51, 0x44, 0x48, 0x41, 0x44, 0x67, 0x41, 0x41, + 0x41, 0x44, 0x48, 0x41, 0x44, 0x6e, 0x2f, 0x66, 0x51, 0x44, 0x48, 0x41, 0x44, 0x72, 0x2f, 0x6b, 0x41, 0x44, + 0x48, 0x0a, + 0x09, 0x41, 0x44, 0x73, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x44, 0x7a, 0x2f, 0x59, 0x51, 0x44, 0x48, 0x41, + 0x45, 0x62, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x45, 0x66, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x45, 0x6a, + 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x45, 0x6e, 0x2f, 0x74, 0x77, 0x44, 0x48, 0x41, 0x46, 0x4c, 0x2f, 0x33, + 0x41, 0x44, 0x48, 0x41, 0x46, 0x54, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x46, 0x66, 0x2f, 0x33, 0x41, 0x44, + 0x48, 0x0a, + 0x09, 0x41, 0x46, 0x67, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x46, 0x6e, 0x2f, 0x69, 0x41, 0x44, 0x48, 0x41, + 0x46, 0x72, 0x2f, 0x72, 0x51, 0x44, 0x48, 0x41, 0x46, 0x7a, 0x2f, 0x64, 0x51, 0x44, 0x48, 0x41, 0x47, 0x49, + 0x41, 0x4f, 0x51, 0x44, 0x48, 0x41, 0x47, 0x54, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x47, 0x66, 0x2f, 0x33, + 0x41, 0x44, 0x48, 0x41, 0x47, 0x67, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x47, 0x2f, 0x2f, 0x33, 0x41, 0x44, + 0x48, 0x0a, + 0x09, 0x41, 0x48, 0x44, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x48, 0x48, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, + 0x48, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x48, 0x50, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x48, 0x6e, + 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x48, 0x72, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x48, 0x76, 0x2f, 0x33, + 0x41, 0x44, 0x48, 0x41, 0x48, 0x7a, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x48, 0x33, 0x2f, 0x33, 0x41, 0x44, + 0x48, 0x0a, + 0x09, 0x41, 0x48, 0x34, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x48, 0x38, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, + 0x49, 0x41, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x49, 0x45, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x4b, 0x6e, + 0x2f, 0x74, 0x77, 0x44, 0x48, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x4b, 0x30, 0x41, 0x4f, + 0x51, 0x44, 0x48, 0x41, 0x4b, 0x34, 0x41, 0x4f, 0x51, 0x44, 0x48, 0x41, 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x44, + 0x48, 0x0a, + 0x09, 0x41, 0x4c, 0x54, 0x2b, 0x2b, 0x41, 0x44, 0x48, 0x41, 0x4c, 0x58, 0x2f, 0x41, 0x77, 0x44, 0x48, 0x41, + 0x4c, 0x72, 0x2f, 0x64, 0x51, 0x44, 0x48, 0x41, 0x4c, 0x76, 0x2f, 0x59, 0x51, 0x44, 0x48, 0x41, 0x4d, 0x55, + 0x41, 0x4c, 0x77, 0x44, 0x48, 0x41, 0x4d, 0x63, 0x41, 0x4f, 0x51, 0x44, 0x48, 0x41, 0x4d, 0x6b, 0x41, 0x4f, + 0x51, 0x44, 0x48, 0x41, 0x4e, 0x44, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x4e, 0x48, 0x2f, 0x33, 0x41, 0x44, + 0x48, 0x0a, + 0x09, 0x41, 0x4e, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x4e, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, + 0x4e, 0x51, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x4e, 0x55, 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x4f, 0x4d, + 0x41, 0x41, 0x41, 0x44, 0x48, 0x41, 0x4f, 0x72, 0x2f, 0x59, 0x51, 0x44, 0x48, 0x41, 0x4f, 0x76, 0x2f, 0x64, + 0x51, 0x44, 0x48, 0x41, 0x50, 0x62, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x50, 0x6b, 0x41, 0x41, 0x41, 0x44, + 0x48, 0x0a, + 0x09, 0x41, 0x50, 0x76, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x50, 0x7a, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, + 0x50, 0x33, 0x2f, 0x33, 0x41, 0x44, 0x48, 0x41, 0x50, 0x37, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x42, 0x44, + 0x2f, 0x30, 0x77, 0x44, 0x4a, 0x41, 0x42, 0x48, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x42, 0x33, 0x2f, 0x33, + 0x41, 0x44, 0x4a, 0x41, 0x43, 0x51, 0x41, 0x4f, 0x51, 0x44, 0x4a, 0x41, 0x43, 0x62, 0x2f, 0x33, 0x41, 0x44, + 0x4a, 0x0a, + 0x09, 0x41, 0x43, 0x72, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x44, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, + 0x44, 0x54, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x44, 0x66, + 0x2f, 0x59, 0x51, 0x44, 0x4a, 0x41, 0x44, 0x67, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x44, 0x6e, 0x2f, 0x66, + 0x51, 0x44, 0x4a, 0x41, 0x44, 0x72, 0x2f, 0x6b, 0x41, 0x44, 0x4a, 0x41, 0x44, 0x73, 0x41, 0x41, 0x41, 0x44, + 0x4a, 0x0a, + 0x09, 0x41, 0x44, 0x7a, 0x2f, 0x59, 0x51, 0x44, 0x4a, 0x41, 0x45, 0x62, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, + 0x45, 0x66, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x45, 0x6a, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x45, 0x6e, + 0x2f, 0x74, 0x77, 0x44, 0x4a, 0x41, 0x46, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x46, 0x54, 0x2f, 0x33, + 0x41, 0x44, 0x4a, 0x41, 0x46, 0x66, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x46, 0x67, 0x41, 0x41, 0x41, 0x44, + 0x4a, 0x0a, + 0x09, 0x41, 0x46, 0x6e, 0x2f, 0x69, 0x41, 0x44, 0x4a, 0x41, 0x46, 0x72, 0x2f, 0x72, 0x51, 0x44, 0x4a, 0x41, + 0x46, 0x7a, 0x2f, 0x64, 0x51, 0x44, 0x4a, 0x41, 0x47, 0x49, 0x41, 0x4f, 0x51, 0x44, 0x4a, 0x41, 0x47, 0x54, + 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x47, 0x66, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x47, 0x67, 0x41, 0x41, + 0x41, 0x44, 0x4a, 0x41, 0x47, 0x2f, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x48, 0x44, 0x2f, 0x33, 0x41, 0x44, + 0x4a, 0x0a, + 0x09, 0x41, 0x48, 0x48, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x48, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, + 0x48, 0x50, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x48, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x48, 0x72, + 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x48, 0x76, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x48, 0x7a, 0x2f, 0x33, + 0x41, 0x44, 0x4a, 0x41, 0x48, 0x33, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x48, 0x34, 0x41, 0x41, 0x41, 0x44, + 0x4a, 0x0a, + 0x09, 0x41, 0x48, 0x38, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x49, 0x41, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, + 0x49, 0x45, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x4b, 0x6e, 0x2f, 0x74, 0x77, 0x44, 0x4a, 0x41, 0x4b, 0x6f, + 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x4b, 0x30, 0x41, 0x4f, 0x51, 0x44, 0x4a, 0x41, 0x4b, 0x34, 0x41, 0x4f, + 0x51, 0x44, 0x4a, 0x41, 0x4b, 0x2f, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x4c, 0x54, 0x2b, 0x2b, 0x41, 0x44, + 0x4a, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x41, 0x77, 0x44, 0x4a, 0x41, 0x4c, 0x72, 0x2f, 0x64, 0x51, 0x44, 0x4a, 0x41, + 0x4c, 0x76, 0x2f, 0x59, 0x51, 0x44, 0x4a, 0x41, 0x4d, 0x55, 0x41, 0x4c, 0x77, 0x44, 0x4a, 0x41, 0x4d, 0x63, + 0x41, 0x4f, 0x51, 0x44, 0x4a, 0x41, 0x4d, 0x6b, 0x41, 0x4f, 0x51, 0x44, 0x4a, 0x41, 0x4e, 0x44, 0x2f, 0x33, + 0x41, 0x44, 0x4a, 0x41, 0x4e, 0x48, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x4e, 0x4c, 0x2f, 0x33, 0x41, 0x44, + 0x4a, 0x0a, + 0x09, 0x41, 0x4e, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x4e, 0x51, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, + 0x4e, 0x55, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x4f, 0x72, + 0x2f, 0x59, 0x51, 0x44, 0x4a, 0x41, 0x4f, 0x76, 0x2f, 0x64, 0x51, 0x44, 0x4a, 0x41, 0x50, 0x62, 0x2f, 0x33, + 0x41, 0x44, 0x4a, 0x41, 0x50, 0x6b, 0x41, 0x41, 0x41, 0x44, 0x4a, 0x41, 0x50, 0x76, 0x2f, 0x33, 0x41, 0x44, + 0x4a, 0x0a, + 0x09, 0x41, 0x50, 0x7a, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, 0x50, 0x33, 0x2f, 0x33, 0x41, 0x44, 0x4a, 0x41, + 0x50, 0x37, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, 0x42, 0x41, 0x41, 0x4f, 0x51, 0x44, 0x51, 0x41, 0x42, 0x48, + 0x2f, 0x72, 0x51, 0x44, 0x51, 0x41, 0x42, 0x33, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, 0x43, 0x54, 0x2f, 0x33, + 0x41, 0x44, 0x51, 0x41, 0x44, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, 0x44, 0x76, 0x2f, 0x66, 0x51, 0x44, + 0x51, 0x0a, + 0x09, 0x41, 0x44, 0x7a, 0x2f, 0x6b, 0x41, 0x44, 0x51, 0x41, 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, + 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x44, 0x51, 0x41, 0x4b, 0x33, + 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, 0x4b, 0x37, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, 0x4c, 0x54, 0x2f, 0x30, + 0x77, 0x44, 0x51, 0x41, 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, 0x4c, 0x76, 0x2f, 0x6b, 0x41, 0x44, + 0x51, 0x0a, + 0x09, 0x41, 0x4d, 0x58, 0x2f, 0x52, 0x41, 0x44, 0x51, 0x41, 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, + 0x4d, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x51, 0x41, 0x4f, 0x72, 0x2f, 0x6b, 0x41, 0x44, 0x52, 0x41, 0x42, 0x41, + 0x41, 0x4f, 0x51, 0x44, 0x52, 0x41, 0x42, 0x48, 0x2f, 0x72, 0x51, 0x44, 0x52, 0x41, 0x42, 0x33, 0x2f, 0x33, + 0x41, 0x44, 0x52, 0x41, 0x43, 0x54, 0x2f, 0x33, 0x41, 0x44, 0x52, 0x41, 0x44, 0x6e, 0x2f, 0x33, 0x41, 0x44, + 0x52, 0x0a, + 0x09, 0x41, 0x44, 0x76, 0x2f, 0x66, 0x51, 0x44, 0x52, 0x41, 0x44, 0x7a, 0x2f, 0x6b, 0x41, 0x44, 0x52, 0x41, + 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x52, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x52, 0x41, 0x4b, 0x6f, + 0x41, 0x41, 0x41, 0x44, 0x52, 0x41, 0x4b, 0x33, 0x2f, 0x33, 0x41, 0x44, 0x52, 0x41, 0x4b, 0x37, 0x2f, 0x33, + 0x41, 0x44, 0x52, 0x41, 0x4c, 0x54, 0x2f, 0x30, 0x77, 0x44, 0x52, 0x41, 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x44, + 0x52, 0x0a, + 0x09, 0x41, 0x4c, 0x76, 0x2f, 0x6b, 0x41, 0x44, 0x52, 0x41, 0x4d, 0x58, 0x2f, 0x52, 0x41, 0x44, 0x52, 0x41, + 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x44, 0x52, 0x41, 0x4d, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x52, 0x41, 0x4f, 0x72, + 0x2f, 0x6b, 0x41, 0x44, 0x53, 0x41, 0x42, 0x41, 0x41, 0x4f, 0x51, 0x44, 0x53, 0x41, 0x42, 0x48, 0x2f, 0x72, + 0x51, 0x44, 0x53, 0x41, 0x42, 0x33, 0x2f, 0x33, 0x41, 0x44, 0x53, 0x41, 0x43, 0x54, 0x2f, 0x33, 0x41, 0x44, + 0x53, 0x0a, + 0x09, 0x41, 0x44, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x53, 0x41, 0x44, 0x76, 0x2f, 0x66, 0x51, 0x44, 0x53, 0x41, + 0x44, 0x7a, 0x2f, 0x6b, 0x41, 0x44, 0x53, 0x41, 0x47, 0x4c, 0x2f, 0x33, 0x41, 0x44, 0x53, 0x41, 0x4b, 0x6e, + 0x2f, 0x33, 0x41, 0x44, 0x53, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x44, 0x53, 0x41, 0x4b, 0x33, 0x2f, 0x33, + 0x41, 0x44, 0x53, 0x41, 0x4b, 0x37, 0x2f, 0x33, 0x41, 0x44, 0x53, 0x41, 0x4c, 0x54, 0x2f, 0x30, 0x77, 0x44, + 0x53, 0x0a, + 0x09, 0x41, 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x44, 0x53, 0x41, 0x4c, 0x76, 0x2f, 0x6b, 0x41, 0x44, 0x53, 0x41, + 0x4d, 0x58, 0x2f, 0x52, 0x41, 0x44, 0x53, 0x41, 0x4d, 0x66, 0x2f, 0x33, 0x41, 0x44, 0x53, 0x41, 0x4d, 0x6e, + 0x2f, 0x33, 0x41, 0x44, 0x53, 0x41, 0x4f, 0x72, 0x2f, 0x6b, 0x41, 0x44, 0x54, 0x41, 0x43, 0x51, 0x41, 0x41, + 0x41, 0x44, 0x54, 0x41, 0x43, 0x30, 0x41, 0x41, 0x41, 0x44, 0x54, 0x41, 0x44, 0x33, 0x2f, 0x33, 0x41, 0x44, + 0x54, 0x0a, + 0x09, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x44, 0x54, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x41, 0x44, 0x54, 0x41, + 0x4b, 0x34, 0x41, 0x41, 0x41, 0x44, 0x54, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x44, 0x54, 0x41, 0x4d, 0x6b, + 0x41, 0x41, 0x41, 0x44, 0x54, 0x41, 0x4f, 0x58, 0x2f, 0x33, 0x41, 0x44, 0x55, 0x41, 0x43, 0x51, 0x41, 0x41, + 0x41, 0x44, 0x55, 0x41, 0x43, 0x30, 0x41, 0x41, 0x41, 0x44, 0x55, 0x41, 0x44, 0x33, 0x2f, 0x33, 0x41, 0x44, + 0x55, 0x0a, + 0x09, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x44, 0x55, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x41, 0x44, 0x55, 0x41, + 0x4b, 0x34, 0x41, 0x41, 0x41, 0x44, 0x55, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x44, 0x55, 0x41, 0x4d, 0x6b, + 0x41, 0x41, 0x41, 0x44, 0x55, 0x41, 0x4f, 0x58, 0x2f, 0x33, 0x41, 0x44, 0x56, 0x41, 0x43, 0x51, 0x41, 0x41, + 0x41, 0x44, 0x56, 0x41, 0x43, 0x30, 0x41, 0x41, 0x41, 0x44, 0x56, 0x41, 0x44, 0x33, 0x2f, 0x33, 0x41, 0x44, + 0x56, 0x0a, + 0x09, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x44, 0x56, 0x41, 0x4b, 0x30, 0x41, 0x41, 0x41, 0x44, 0x56, 0x41, + 0x4b, 0x34, 0x41, 0x41, 0x41, 0x44, 0x56, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x44, 0x56, 0x41, 0x4d, 0x6b, + 0x41, 0x41, 0x41, 0x44, 0x56, 0x41, 0x4f, 0x58, 0x2f, 0x33, 0x41, 0x44, 0x6a, 0x41, 0x43, 0x51, 0x41, 0x4a, + 0x67, 0x44, 0x6a, 0x41, 0x43, 0x59, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x43, 0x6f, 0x41, 0x41, 0x41, 0x44, + 0x6a, 0x0a, + 0x09, 0x41, 0x44, 0x49, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x44, 0x51, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, + 0x44, 0x59, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x47, 0x49, 0x41, 0x4a, 0x67, 0x44, 0x6a, 0x41, 0x47, 0x51, + 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x47, 0x63, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x4b, 0x30, 0x41, 0x4a, + 0x67, 0x44, 0x6a, 0x41, 0x4b, 0x34, 0x41, 0x4a, 0x67, 0x44, 0x6a, 0x41, 0x4b, 0x38, 0x41, 0x41, 0x41, 0x44, + 0x6a, 0x0a, + 0x09, 0x41, 0x4d, 0x63, 0x41, 0x4a, 0x67, 0x44, 0x6a, 0x41, 0x4d, 0x6b, 0x41, 0x4a, 0x67, 0x44, 0x6a, 0x41, + 0x4e, 0x41, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x4e, 0x45, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x4e, 0x49, + 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x50, 0x59, 0x41, 0x41, + 0x41, 0x44, 0x6a, 0x41, 0x50, 0x6b, 0x41, 0x41, 0x41, 0x44, 0x6a, 0x41, 0x50, 0x73, 0x41, 0x41, 0x41, 0x44, + 0x6a, 0x0a, + 0x09, 0x41, 0x50, 0x30, 0x41, 0x41, 0x41, 0x44, 0x6c, 0x41, 0x42, 0x44, 0x2f, 0x33, 0x41, 0x44, 0x6c, 0x41, + 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x44, 0x6c, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x44, 0x6c, 0x41, 0x4c, 0x54, + 0x2f, 0x33, 0x41, 0x44, 0x6c, 0x41, 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x44, 0x6c, 0x41, 0x4d, 0x58, 0x2f, 0x33, + 0x41, 0x44, 0x70, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x44, 0x70, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x44, + 0x70, 0x0a, + 0x09, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x44, 0x70, 0x41, 0x4c, 0x54, 0x2f, 0x70, 0x41, 0x44, 0x70, 0x41, + 0x4c, 0x58, 0x2f, 0x6b, 0x41, 0x44, 0x70, 0x41, 0x4d, 0x58, 0x2f, 0x74, 0x77, 0x44, 0x71, 0x41, 0x42, 0x44, + 0x2f, 0x44, 0x51, 0x44, 0x71, 0x41, 0x42, 0x48, 0x2b, 0x59, 0x51, 0x44, 0x71, 0x41, 0x42, 0x33, 0x2b, 0x38, + 0x41, 0x44, 0x71, 0x41, 0x43, 0x54, 0x2f, 0x59, 0x51, 0x44, 0x71, 0x41, 0x43, 0x62, 0x2f, 0x6b, 0x41, 0x44, + 0x71, 0x0a, + 0x09, 0x41, 0x44, 0x4c, 0x2f, 0x6b, 0x41, 0x44, 0x71, 0x41, 0x45, 0x54, 0x2b, 0x35, 0x67, 0x44, 0x71, 0x41, + 0x45, 0x6a, 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, 0x45, 0x7a, 0x2f, 0x74, 0x77, 0x44, 0x71, 0x41, 0x46, 0x4c, + 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, 0x46, 0x6a, 0x2f, 0x46, 0x51, 0x44, 0x71, 0x41, 0x47, 0x4c, 0x2f, 0x59, + 0x51, 0x44, 0x71, 0x41, 0x47, 0x54, 0x2f, 0x6b, 0x41, 0x44, 0x71, 0x41, 0x47, 0x66, 0x2f, 0x6b, 0x41, 0x44, + 0x71, 0x0a, + 0x09, 0x41, 0x47, 0x6e, 0x2b, 0x35, 0x67, 0x44, 0x71, 0x41, 0x47, 0x72, 0x2b, 0x35, 0x67, 0x44, 0x71, 0x41, + 0x47, 0x76, 0x2b, 0x35, 0x67, 0x44, 0x71, 0x41, 0x47, 0x7a, 0x2b, 0x35, 0x67, 0x44, 0x71, 0x41, 0x47, 0x33, + 0x2b, 0x35, 0x67, 0x44, 0x71, 0x41, 0x47, 0x37, 0x2b, 0x35, 0x67, 0x44, 0x71, 0x41, 0x48, 0x44, 0x2b, 0x38, + 0x41, 0x44, 0x71, 0x41, 0x48, 0x48, 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, 0x48, 0x4c, 0x2b, 0x38, 0x41, 0x44, + 0x71, 0x0a, + 0x09, 0x41, 0x48, 0x50, 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, 0x48, 0x6e, 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, + 0x48, 0x72, 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, 0x48, 0x76, 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, 0x48, 0x7a, + 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, 0x48, 0x33, 0x2b, 0x38, 0x41, 0x44, 0x71, 0x41, 0x48, 0x37, 0x2f, 0x46, + 0x51, 0x44, 0x71, 0x41, 0x48, 0x2f, 0x2f, 0x46, 0x51, 0x44, 0x71, 0x41, 0x49, 0x44, 0x2f, 0x46, 0x51, 0x44, + 0x71, 0x0a, + 0x09, 0x41, 0x49, 0x48, 0x2f, 0x46, 0x51, 0x44, 0x71, 0x41, 0x4b, 0x6e, 0x2f, 0x48, 0x77, 0x44, 0x71, 0x41, + 0x4b, 0x72, 0x2f, 0x61, 0x77, 0x44, 0x71, 0x41, 0x4b, 0x33, 0x2f, 0x59, 0x51, 0x44, 0x71, 0x41, 0x4b, 0x37, + 0x2f, 0x59, 0x51, 0x44, 0x71, 0x41, 0x4b, 0x2f, 0x2f, 0x6b, 0x41, 0x44, 0x71, 0x41, 0x4c, 0x54, 0x2f, 0x6b, + 0x41, 0x44, 0x71, 0x41, 0x4c, 0x58, 0x2f, 0x33, 0x41, 0x44, 0x71, 0x41, 0x4d, 0x58, 0x2b, 0x2b, 0x41, 0x44, + 0x71, 0x0a, + 0x09, 0x41, 0x4d, 0x66, 0x2f, 0x59, 0x51, 0x44, 0x71, 0x41, 0x4d, 0x6e, 0x2f, 0x59, 0x51, 0x44, 0x71, 0x41, + 0x4e, 0x44, 0x2f, 0x6b, 0x41, 0x44, 0x71, 0x41, 0x4e, 0x48, 0x2f, 0x6b, 0x41, 0x44, 0x71, 0x41, 0x4e, 0x4c, + 0x2f, 0x6b, 0x41, 0x44, 0x71, 0x41, 0x50, 0x76, 0x2f, 0x6b, 0x41, 0x44, 0x71, 0x41, 0x50, 0x33, 0x2f, 0x6b, + 0x41, 0x44, 0x72, 0x41, 0x42, 0x44, 0x2f, 0x33, 0x41, 0x44, 0x72, 0x41, 0x42, 0x48, 0x2b, 0x33, 0x41, 0x44, + 0x72, 0x0a, + 0x09, 0x41, 0x42, 0x33, 0x2f, 0x61, 0x77, 0x44, 0x72, 0x41, 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x72, 0x41, + 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x44, 0x72, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x44, 0x72, 0x41, 0x4c, 0x55, + 0x41, 0x41, 0x41, 0x44, 0x72, 0x41, 0x4d, 0x58, 0x2b, 0x30, 0x77, 0x44, 0x73, 0x41, 0x42, 0x41, 0x41, 0x41, + 0x41, 0x44, 0x73, 0x41, 0x42, 0x48, 0x2f, 0x61, 0x77, 0x44, 0x73, 0x41, 0x42, 0x33, 0x2f, 0x74, 0x77, 0x44, + 0x73, 0x0a, + 0x09, 0x41, 0x4b, 0x6b, 0x41, 0x41, 0x41, 0x44, 0x73, 0x41, 0x4b, 0x6f, 0x41, 0x41, 0x41, 0x44, 0x73, 0x41, + 0x4c, 0x54, 0x2f, 0x33, 0x41, 0x44, 0x73, 0x41, 0x4c, 0x55, 0x41, 0x41, 0x41, 0x44, 0x73, 0x41, 0x4d, 0x58, + 0x2f, 0x52, 0x41, 0x44, 0x32, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x44, 0x32, 0x41, 0x43, 0x51, 0x41, 0x41, + 0x41, 0x44, 0x32, 0x41, 0x44, 0x66, 0x2f, 0x74, 0x77, 0x44, 0x32, 0x41, 0x44, 0x6f, 0x41, 0x41, 0x41, 0x44, + 0x32, 0x0a, + 0x09, 0x41, 0x44, 0x7a, 0x2f, 0x6d, 0x67, 0x44, 0x32, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x44, 0x32, 0x41, + 0x4b, 0x6e, 0x2f, 0x33, 0x41, 0x44, 0x32, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x44, 0x32, 0x41, 0x4b, 0x30, + 0x41, 0x41, 0x41, 0x44, 0x32, 0x41, 0x4b, 0x34, 0x41, 0x41, 0x41, 0x44, 0x32, 0x41, 0x4c, 0x54, 0x2f, 0x30, + 0x77, 0x44, 0x32, 0x41, 0x4c, 0x58, 0x2f, 0x30, 0x77, 0x44, 0x32, 0x41, 0x4c, 0x76, 0x2f, 0x6d, 0x67, 0x44, + 0x32, 0x0a, + 0x09, 0x41, 0x4d, 0x58, 0x2f, 0x79, 0x51, 0x44, 0x32, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x44, 0x32, 0x41, + 0x4d, 0x6b, 0x41, 0x41, 0x41, 0x44, 0x32, 0x41, 0x4f, 0x72, 0x2f, 0x6d, 0x67, 0x44, 0x35, 0x41, 0x43, 0x51, + 0x41, 0x4a, 0x67, 0x44, 0x35, 0x41, 0x43, 0x59, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x43, 0x6f, 0x41, 0x41, + 0x41, 0x44, 0x35, 0x41, 0x44, 0x49, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x44, 0x51, 0x41, 0x41, 0x41, 0x44, + 0x35, 0x0a, + 0x09, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x47, 0x49, 0x41, 0x4a, 0x67, 0x44, 0x35, 0x41, + 0x47, 0x51, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x47, 0x63, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x4b, 0x30, + 0x41, 0x4a, 0x67, 0x44, 0x35, 0x41, 0x4b, 0x34, 0x41, 0x4a, 0x67, 0x44, 0x35, 0x41, 0x4b, 0x38, 0x41, 0x41, + 0x41, 0x44, 0x35, 0x41, 0x4d, 0x63, 0x41, 0x4a, 0x67, 0x44, 0x35, 0x41, 0x4d, 0x6b, 0x41, 0x4a, 0x67, 0x44, + 0x35, 0x0a, + 0x09, 0x41, 0x4e, 0x41, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x4e, 0x45, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, + 0x4e, 0x49, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x50, 0x59, + 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x50, 0x6b, 0x41, 0x41, 0x41, 0x44, 0x35, 0x41, 0x50, 0x73, 0x41, 0x41, + 0x41, 0x44, 0x35, 0x41, 0x50, 0x30, 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x44, + 0x37, 0x0a, + 0x09, 0x41, 0x43, 0x51, 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, + 0x44, 0x7a, 0x2f, 0x33, 0x41, 0x44, 0x37, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, 0x4b, 0x6e, + 0x2f, 0x33, 0x41, 0x44, 0x37, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x44, 0x37, 0x41, 0x4b, 0x30, 0x41, 0x41, + 0x41, 0x44, 0x37, 0x41, 0x4b, 0x34, 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x44, + 0x37, 0x0a, + 0x09, 0x41, 0x4c, 0x55, 0x41, 0x4a, 0x67, 0x44, 0x37, 0x41, 0x4c, 0x76, 0x2f, 0x33, 0x41, 0x44, 0x37, 0x41, + 0x4d, 0x55, 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, 0x4d, 0x6b, + 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x37, 0x41, 0x4f, 0x72, 0x2f, 0x33, + 0x41, 0x44, 0x37, 0x41, 0x50, 0x6b, 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x44, + 0x39, 0x0a, + 0x09, 0x41, 0x43, 0x51, 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, 0x44, 0x59, 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, + 0x44, 0x7a, 0x2f, 0x33, 0x41, 0x44, 0x39, 0x41, 0x47, 0x49, 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, 0x4b, 0x6e, + 0x2f, 0x33, 0x41, 0x44, 0x39, 0x41, 0x4b, 0x72, 0x2f, 0x33, 0x41, 0x44, 0x39, 0x41, 0x4b, 0x30, 0x41, 0x41, + 0x41, 0x44, 0x39, 0x41, 0x4b, 0x34, 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, 0x4c, 0x51, 0x41, 0x41, 0x41, 0x44, + 0x39, 0x0a, + 0x09, 0x41, 0x4c, 0x55, 0x41, 0x4a, 0x67, 0x44, 0x39, 0x41, 0x4c, 0x76, 0x2f, 0x33, 0x41, 0x44, 0x39, 0x41, + 0x4d, 0x55, 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, 0x4d, 0x63, 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, 0x4d, 0x6b, + 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, 0x4f, 0x4d, 0x41, 0x41, 0x41, 0x44, 0x39, 0x41, 0x4f, 0x72, 0x2f, 0x33, + 0x41, 0x44, 0x39, 0x41, 0x50, 0x6b, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x41, 0x45, + 0x4d, 0x0a, + 0x09, 0x41, 0x45, 0x30, 0x41, 0x42, 0x77, 0x42, 0x43, 0x41, 0x41, 0x51, 0x41, 0x41, 0x67, 0x41, 0x51, 0x41, + 0x45, 0x41, 0x41, 0x42, 0x77, 0x41, 0x41, 0x42, 0x42, 0x55, 0x46, 0x61, 0x41, 0x41, 0x44, 0x41, 0x41, 0x45, + 0x41, 0x41, 0x51, 0x41, 0x41, 0x42, 0x32, 0x33, 0x2b, 0x48, 0x51, 0x41, 0x41, 0x43, 0x72, 0x7a, 0x2b, 0x69, + 0x66, 0x36, 0x4a, 0x43, 0x6b, 0x77, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, 0x77, 0x41, 0x41, 0x51, 0x51, 0x4f, 0x41, + 0x5a, 0x41, 0x41, 0x42, 0x51, 0x41, 0x45, 0x42, 0x55, 0x63, 0x45, 0x7a, 0x41, 0x41, 0x41, 0x2f, 0x6b, 0x49, + 0x46, 0x52, 0x77, 0x54, 0x4d, 0x41, 0x41, 0x41, 0x43, 0x55, 0x77, 0x43, 0x50, 0x41, 0x6d, 0x59, 0x49, 0x41, + 0x67, 0x49, 0x4c, 0x42, 0x67, 0x4d, 0x44, 0x43, 0x41, 0x51, 0x43, 0x41, 0x67, 0x53, 0x41, 0x41, 0x41, 0x43, + 0x76, 0x0a, + 0x09, 0x45, 0x41, 0x41, 0x67, 0x53, 0x67, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x51, + 0x6d, 0x6c, 0x30, 0x63, 0x77, 0x42, 0x41, 0x41, 0x43, 0x44, 0x37, 0x41, 0x67, 0x59, 0x55, 0x2f, 0x68, 0x51, + 0x42, 0x6d, 0x67, 0x64, 0x74, 0x41, 0x65, 0x4d, 0x41, 0x41, 0x41, 0x41, 0x42, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x45, 0x41, 0x41, 0x45, 0x49, 0x41, 0x48, 0x62, 0x45, 0x43, 0x69, 0x77, 0x52, + 0x67, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x6a, 0x59, 0x77, 0x58, 0x56, 0x41, 0x41, 0x42, 0x57, 0x5a, 0x58, 0x4a, 0x68, 0x55, + 0x32, 0x46, 0x75, 0x63, 0x77, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x2f, 0x2f, 0x2f, + 0x2f, 0x2f, 0x7a, 0x62, 0x2f, 0x2f, 0x2f, 0x34, 0x32, 0x4d, 0x6a, 0x68, 0x53, 0x4d, 0x44, 0x41, 0x41, 0x41, + 0x45, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x55, 0x41, 0x41, 0x41, 0x42, 0x45, 0x41, 0x6b, + 0x4d, 0x0a, + 0x09, 0x42, 0x51, 0x41, 0x44, 0x41, 0x77, 0x4d, 0x45, 0x43, 0x41, 0x59, 0x4a, 0x43, 0x41, 0x49, 0x45, 0x42, + 0x41, 0x55, 0x49, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, + 0x47, 0x42, 0x67, 0x59, 0x44, 0x41, 0x77, 0x67, 0x49, 0x43, 0x41, 0x55, 0x4b, 0x42, 0x67, 0x63, 0x48, 0x42, + 0x77, 0x59, 0x47, 0x42, 0x77, 0x63, 0x44, 0x41, 0x77, 0x59, 0x46, 0x43, 0x41, 0x63, 0x48, 0x42, 0x67, 0x63, + 0x47, 0x0a, + 0x09, 0x42, 0x77, 0x55, 0x48, 0x42, 0x67, 0x63, 0x47, 0x42, 0x51, 0x55, 0x45, 0x41, 0x77, 0x51, 0x49, 0x42, + 0x51, 0x55, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x4d, 0x47, 0x42, 0x67, 0x4d, 0x44, 0x42, 0x51, 0x4d, + 0x4a, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x51, 0x46, 0x42, 0x41, 0x59, 0x46, 0x42, 0x77, 0x55, 0x46, 0x42, + 0x67, 0x55, 0x44, 0x42, 0x51, 0x67, 0x47, 0x42, 0x67, 0x63, 0x47, 0x42, 0x77, 0x63, 0x48, 0x42, 0x67, 0x59, + 0x47, 0x0a, + 0x09, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x42, + 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x55, 0x46, 0x42, 0x67, 0x59, + 0x46, 0x42, 0x51, 0x59, 0x47, 0x43, 0x51, 0x6b, 0x4a, 0x42, 0x51, 0x55, 0x49, 0x43, 0x51, 0x63, 0x49, 0x43, + 0x41, 0x67, 0x49, 0x42, 0x67, 0x59, 0x46, 0x42, 0x67, 0x63, 0x46, 0x42, 0x51, 0x51, 0x45, 0x42, 0x77, 0x6b, + 0x47, 0x0a, + 0x09, 0x42, 0x51, 0x4d, 0x49, 0x42, 0x67, 0x59, 0x49, 0x42, 0x67, 0x59, 0x47, 0x43, 0x51, 0x59, 0x47, 0x42, + 0x67, 0x63, 0x4b, 0x43, 0x51, 0x55, 0x4a, 0x42, 0x51, 0x55, 0x44, 0x41, 0x77, 0x67, 0x45, 0x42, 0x51, 0x55, + 0x43, 0x42, 0x67, 0x51, 0x45, 0x42, 0x67, 0x59, 0x46, 0x41, 0x77, 0x4d, 0x46, 0x44, 0x41, 0x59, 0x47, 0x42, + 0x67, 0x59, 0x47, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, 0x77, 0x4d, + 0x46, 0x0a, + 0x09, 0x42, 0x51, 0x55, 0x46, 0x42, 0x51, 0x55, 0x46, 0x42, 0x51, 0x55, 0x46, 0x42, 0x51, 0x4d, 0x48, 0x42, + 0x51, 0x55, 0x47, 0x41, 0x77, 0x63, 0x47, 0x42, 0x51, 0x55, 0x47, 0x42, 0x67, 0x67, 0x49, 0x42, 0x41, 0x51, + 0x45, 0x43, 0x51, 0x6b, 0x4a, 0x42, 0x77, 0x59, 0x44, 0x42, 0x77, 0x55, 0x48, 0x42, 0x67, 0x63, 0x47, 0x42, + 0x67, 0x4d, 0x44, 0x42, 0x67, 0x55, 0x46, 0x42, 0x51, 0x55, 0x46, 0x42, 0x51, 0x51, 0x46, 0x42, 0x51, 0x41, + 0x41, 0x0a, + 0x09, 0x43, 0x67, 0x30, 0x47, 0x41, 0x41, 0x4d, 0x44, 0x42, 0x41, 0x55, 0x49, 0x42, 0x67, 0x6f, 0x4a, 0x41, + 0x77, 0x51, 0x45, 0x42, 0x51, 0x67, 0x44, 0x42, 0x41, 0x4d, 0x44, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, + 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x4d, 0x44, 0x43, 0x41, 0x67, 0x49, 0x42, 0x51, 0x73, 0x48, 0x42, + 0x77, 0x67, 0x49, 0x42, 0x77, 0x59, 0x49, 0x43, 0x41, 0x4d, 0x44, 0x42, 0x77, 0x59, 0x4a, 0x43, 0x41, 0x67, + 0x48, 0x0a, + 0x09, 0x43, 0x41, 0x63, 0x48, 0x42, 0x51, 0x67, 0x48, 0x43, 0x51, 0x59, 0x48, 0x42, 0x67, 0x51, 0x44, 0x42, + 0x41, 0x67, 0x46, 0x42, 0x51, 0x59, 0x47, 0x42, 0x51, 0x59, 0x47, 0x42, 0x41, 0x59, 0x47, 0x41, 0x67, 0x49, + 0x46, 0x41, 0x67, 0x6f, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x41, 0x55, 0x45, 0x42, 0x67, 0x59, 0x49, 0x42, + 0x67, 0x59, 0x46, 0x42, 0x67, 0x4d, 0x47, 0x43, 0x41, 0x63, 0x48, 0x43, 0x41, 0x63, 0x49, 0x43, 0x41, 0x67, + 0x47, 0x0a, + 0x09, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x46, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x49, 0x43, 0x41, + 0x67, 0x49, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x51, 0x55, + 0x47, 0x42, 0x67, 0x55, 0x47, 0x42, 0x67, 0x59, 0x4b, 0x43, 0x67, 0x6f, 0x46, 0x42, 0x51, 0x67, 0x4b, 0x43, + 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x47, 0x42, 0x77, 0x55, 0x48, 0x43, 0x41, 0x59, 0x46, 0x42, 0x51, 0x55, + 0x49, 0x0a, + 0x09, 0x43, 0x67, 0x59, 0x46, 0x42, 0x41, 0x67, 0x47, 0x42, 0x67, 0x67, 0x48, 0x42, 0x67, 0x59, 0x4b, 0x42, + 0x67, 0x63, 0x48, 0x43, 0x41, 0x73, 0x4b, 0x42, 0x51, 0x6f, 0x46, 0x42, 0x51, 0x4d, 0x44, 0x43, 0x41, 0x55, + 0x47, 0x42, 0x77, 0x49, 0x47, 0x42, 0x41, 0x51, 0x47, 0x42, 0x67, 0x55, 0x44, 0x41, 0x77, 0x55, 0x4e, 0x42, + 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, + 0x49, 0x0a, + 0x09, 0x41, 0x67, 0x55, 0x46, 0x42, 0x51, 0x55, 0x46, 0x42, 0x51, 0x55, 0x46, 0x42, 0x51, 0x55, 0x47, 0x41, + 0x67, 0x63, 0x46, 0x42, 0x67, 0x55, 0x44, 0x43, 0x41, 0x59, 0x48, 0x42, 0x67, 0x63, 0x47, 0x43, 0x41, 0x67, + 0x45, 0x42, 0x41, 0x51, 0x4b, 0x43, 0x67, 0x6f, 0x49, 0x42, 0x67, 0x4d, 0x48, 0x42, 0x51, 0x67, 0x46, 0x43, + 0x41, 0x55, 0x47, 0x42, 0x41, 0x4d, 0x47, 0x42, 0x51, 0x55, 0x46, 0x42, 0x51, 0x55, 0x46, 0x42, 0x41, 0x55, + 0x46, 0x0a, + 0x09, 0x41, 0x41, 0x41, 0x4c, 0x44, 0x77, 0x63, 0x41, 0x41, 0x77, 0x4d, 0x44, 0x42, 0x51, 0x6b, 0x48, 0x43, + 0x67, 0x6f, 0x44, 0x42, 0x41, 0x51, 0x47, 0x43, 0x51, 0x51, 0x45, 0x42, 0x41, 0x51, 0x48, 0x42, 0x77, 0x63, + 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, 0x41, 0x51, 0x4a, 0x43, 0x51, 0x6b, 0x47, 0x44, + 0x41, 0x63, 0x49, 0x43, 0x41, 0x67, 0x48, 0x42, 0x67, 0x6b, 0x49, 0x41, 0x77, 0x4d, 0x48, 0x42, 0x67, 0x6b, + 0x49, 0x0a, + 0x09, 0x43, 0x51, 0x63, 0x4a, 0x42, 0x77, 0x67, 0x48, 0x43, 0x41, 0x63, 0x4a, 0x42, 0x77, 0x63, 0x4a, 0x42, + 0x41, 0x51, 0x45, 0x43, 0x51, 0x59, 0x47, 0x42, 0x77, 0x63, 0x47, 0x42, 0x77, 0x63, 0x45, 0x42, 0x77, 0x63, + 0x44, 0x41, 0x77, 0x59, 0x44, 0x43, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x46, 0x42, 0x77, 0x51, 0x48, 0x42, + 0x67, 0x6b, 0x47, 0x42, 0x67, 0x55, 0x48, 0x42, 0x41, 0x63, 0x4a, 0x42, 0x77, 0x63, 0x49, 0x42, 0x77, 0x67, + 0x4a, 0x0a, + 0x09, 0x43, 0x41, 0x63, 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, 0x77, 0x59, 0x48, 0x42, 0x77, 0x63, 0x48, 0x41, + 0x77, 0x4d, 0x44, 0x41, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, + 0x47, 0x42, 0x67, 0x63, 0x48, 0x42, 0x67, 0x59, 0x48, 0x42, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x59, 0x47, 0x43, + 0x51, 0x73, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x63, 0x48, 0x42, 0x67, 0x63, 0x49, 0x42, 0x67, 0x59, + 0x46, 0x0a, + 0x09, 0x42, 0x51, 0x67, 0x4c, 0x42, 0x77, 0x59, 0x44, 0x43, 0x51, 0x63, 0x48, 0x43, 0x51, 0x63, 0x48, 0x42, + 0x77, 0x73, 0x48, 0x42, 0x77, 0x63, 0x4a, 0x44, 0x41, 0x73, 0x47, 0x43, 0x77, 0x59, 0x47, 0x42, 0x41, 0x51, + 0x4a, 0x42, 0x51, 0x59, 0x48, 0x41, 0x67, 0x63, 0x45, 0x42, 0x41, 0x63, 0x48, 0x42, 0x67, 0x51, 0x45, 0x42, + 0x67, 0x38, 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x4a, 0x43, 0x51, 0x6b, + 0x49, 0x0a, + 0x09, 0x43, 0x41, 0x67, 0x44, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, + 0x67, 0x59, 0x44, 0x43, 0x41, 0x63, 0x4a, 0x42, 0x51, 0x51, 0x49, 0x42, 0x77, 0x63, 0x47, 0x42, 0x77, 0x63, + 0x4a, 0x43, 0x51, 0x51, 0x45, 0x42, 0x41, 0x73, 0x4c, 0x43, 0x77, 0x6b, 0x48, 0x41, 0x77, 0x67, 0x48, 0x43, + 0x41, 0x59, 0x49, 0x42, 0x67, 0x63, 0x45, 0x42, 0x41, 0x63, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, + 0x45, 0x0a, + 0x09, 0x42, 0x67, 0x59, 0x41, 0x41, 0x41, 0x77, 0x51, 0x42, 0x77, 0x41, 0x45, 0x42, 0x41, 0x55, 0x46, 0x43, + 0x67, 0x67, 0x4c, 0x43, 0x67, 0x4d, 0x46, 0x42, 0x51, 0x59, 0x4b, 0x42, 0x41, 0x51, 0x45, 0x42, 0x41, 0x67, + 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x45, 0x42, 0x41, 0x6f, 0x4b, 0x43, + 0x67, 0x59, 0x4e, 0x43, 0x41, 0x67, 0x49, 0x43, 0x51, 0x67, 0x48, 0x43, 0x51, 0x6b, 0x44, 0x41, 0x77, 0x63, + 0x47, 0x0a, + 0x09, 0x43, 0x67, 0x6b, 0x4a, 0x43, 0x41, 0x6b, 0x49, 0x43, 0x41, 0x63, 0x4a, 0x43, 0x41, 0x73, 0x4a, 0x42, + 0x77, 0x6b, 0x46, 0x42, 0x41, 0x55, 0x4b, 0x42, 0x67, 0x59, 0x49, 0x43, 0x41, 0x63, 0x49, 0x43, 0x41, 0x51, + 0x49, 0x43, 0x41, 0x4d, 0x44, 0x42, 0x77, 0x4d, 0x4c, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x55, 0x48, 0x42, + 0x51, 0x67, 0x47, 0x43, 0x51, 0x59, 0x47, 0x42, 0x51, 0x67, 0x45, 0x43, 0x41, 0x6f, 0x49, 0x43, 0x41, 0x67, + 0x49, 0x0a, + 0x09, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x42, 0x77, 0x67, 0x49, 0x43, + 0x41, 0x67, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, + 0x49, 0x43, 0x41, 0x59, 0x47, 0x43, 0x41, 0x67, 0x47, 0x42, 0x77, 0x67, 0x49, 0x44, 0x41, 0x77, 0x4d, 0x42, + 0x67, 0x59, 0x4b, 0x44, 0x41, 0x6b, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x41, 0x67, 0x47, 0x43, 0x41, 0x6b, + 0x48, 0x0a, + 0x09, 0x42, 0x67, 0x59, 0x47, 0x43, 0x51, 0x77, 0x49, 0x42, 0x67, 0x55, 0x4b, 0x43, 0x41, 0x67, 0x4b, 0x43, + 0x41, 0x63, 0x48, 0x44, 0x41, 0x67, 0x49, 0x43, 0x41, 0x6b, 0x4e, 0x44, 0x51, 0x59, 0x4d, 0x42, 0x67, 0x59, + 0x45, 0x42, 0x41, 0x6f, 0x47, 0x42, 0x67, 0x63, 0x43, 0x43, 0x41, 0x55, 0x46, 0x42, 0x77, 0x63, 0x47, 0x42, + 0x41, 0x51, 0x47, 0x45, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x6b, + 0x4a, 0x0a, + 0x09, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x4d, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x59, 0x47, 0x42, + 0x67, 0x59, 0x47, 0x42, 0x67, 0x4d, 0x49, 0x42, 0x77, 0x6b, 0x46, 0x42, 0x41, 0x6b, 0x49, 0x42, 0x77, 0x59, + 0x49, 0x43, 0x41, 0x6f, 0x4b, 0x42, 0x51, 0x55, 0x46, 0x44, 0x41, 0x77, 0x4d, 0x43, 0x51, 0x67, 0x44, 0x43, + 0x41, 0x63, 0x49, 0x42, 0x77, 0x67, 0x48, 0x43, 0x41, 0x51, 0x45, 0x43, 0x41, 0x59, 0x47, 0x42, 0x67, 0x59, + 0x47, 0x0a, + 0x09, 0x42, 0x67, 0x55, 0x47, 0x42, 0x67, 0x41, 0x41, 0x44, 0x52, 0x45, 0x49, 0x41, 0x41, 0x51, 0x45, 0x42, + 0x51, 0x55, 0x4c, 0x43, 0x41, 0x77, 0x4c, 0x41, 0x77, 0x55, 0x46, 0x42, 0x77, 0x73, 0x45, 0x42, 0x51, 0x51, + 0x45, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x51, 0x45, 0x43, + 0x77, 0x73, 0x4c, 0x42, 0x77, 0x30, 0x4a, 0x43, 0x51, 0x6b, 0x4b, 0x43, 0x41, 0x63, 0x4b, 0x43, 0x67, 0x4d, + 0x44, 0x0a, + 0x09, 0x43, 0x41, 0x63, 0x4c, 0x43, 0x67, 0x6f, 0x49, 0x43, 0x67, 0x67, 0x4a, 0x42, 0x77, 0x6f, 0x4a, 0x43, + 0x77, 0x6f, 0x48, 0x43, 0x67, 0x55, 0x45, 0x42, 0x51, 0x73, 0x48, 0x42, 0x77, 0x67, 0x49, 0x42, 0x77, 0x67, + 0x49, 0x42, 0x41, 0x67, 0x49, 0x41, 0x77, 0x4d, 0x48, 0x41, 0x77, 0x30, 0x49, 0x43, 0x41, 0x67, 0x49, 0x42, + 0x51, 0x63, 0x46, 0x43, 0x41, 0x63, 0x4a, 0x42, 0x77, 0x63, 0x48, 0x43, 0x41, 0x51, 0x49, 0x43, 0x77, 0x6b, + 0x4a, 0x0a, + 0x09, 0x43, 0x51, 0x67, 0x4b, 0x43, 0x67, 0x6f, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x48, 0x43, + 0x41, 0x67, 0x49, 0x43, 0x41, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, + 0x49, 0x43, 0x41, 0x67, 0x49, 0x42, 0x77, 0x63, 0x49, 0x43, 0x41, 0x63, 0x49, 0x43, 0x41, 0x67, 0x4e, 0x44, + 0x51, 0x30, 0x48, 0x42, 0x77, 0x73, 0x4e, 0x43, 0x67, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x49, 0x43, 0x41, 0x63, + 0x4a, 0x0a, + 0x09, 0x43, 0x67, 0x67, 0x48, 0x42, 0x67, 0x59, 0x4b, 0x44, 0x51, 0x67, 0x48, 0x42, 0x51, 0x73, 0x49, 0x43, + 0x41, 0x73, 0x4a, 0x43, 0x41, 0x67, 0x4e, 0x43, 0x41, 0x6b, 0x4a, 0x43, 0x67, 0x34, 0x4e, 0x42, 0x77, 0x30, + 0x48, 0x42, 0x77, 0x51, 0x45, 0x43, 0x77, 0x59, 0x48, 0x42, 0x77, 0x49, 0x49, 0x42, 0x51, 0x55, 0x49, 0x43, + 0x41, 0x63, 0x45, 0x42, 0x41, 0x63, 0x52, 0x43, 0x51, 0x67, 0x4a, 0x43, 0x41, 0x67, 0x44, 0x41, 0x77, 0x4d, + 0x44, 0x0a, + 0x09, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x41, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, + 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x48, 0x41, 0x77, 0x6b, 0x48, 0x43, 0x67, 0x63, 0x45, 0x43, 0x67, 0x67, + 0x48, 0x42, 0x77, 0x67, 0x49, 0x43, 0x77, 0x73, 0x46, 0x42, 0x51, 0x55, 0x4e, 0x44, 0x51, 0x30, 0x4b, 0x43, + 0x41, 0x4d, 0x4a, 0x42, 0x77, 0x6b, 0x48, 0x43, 0x51, 0x63, 0x49, 0x42, 0x51, 0x51, 0x49, 0x42, 0x77, 0x63, + 0x48, 0x0a, + 0x09, 0x42, 0x77, 0x63, 0x48, 0x42, 0x51, 0x63, 0x48, 0x41, 0x41, 0x41, 0x4f, 0x45, 0x77, 0x67, 0x41, 0x42, + 0x41, 0x51, 0x46, 0x42, 0x51, 0x77, 0x4a, 0x44, 0x51, 0x77, 0x44, 0x42, 0x51, 0x55, 0x48, 0x44, 0x41, 0x51, + 0x46, 0x42, 0x41, 0x55, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x42, + 0x51, 0x55, 0x4d, 0x44, 0x41, 0x77, 0x48, 0x44, 0x67, 0x6b, 0x4b, 0x43, 0x67, 0x73, 0x4a, 0x43, 0x41, 0x73, + 0x4b, 0x0a, + 0x09, 0x41, 0x77, 0x4d, 0x4a, 0x42, 0x77, 0x77, 0x4b, 0x43, 0x77, 0x6b, 0x4c, 0x43, 0x67, 0x6b, 0x4a, 0x43, + 0x67, 0x6b, 0x4e, 0x43, 0x77, 0x6b, 0x4b, 0x42, 0x51, 0x55, 0x46, 0x44, 0x41, 0x63, 0x48, 0x43, 0x41, 0x6b, + 0x49, 0x43, 0x51, 0x6b, 0x45, 0x43, 0x51, 0x6b, 0x44, 0x41, 0x77, 0x67, 0x44, 0x44, 0x51, 0x6b, 0x4a, 0x43, + 0x51, 0x6b, 0x46, 0x43, 0x41, 0x55, 0x4a, 0x42, 0x77, 0x73, 0x48, 0x42, 0x77, 0x67, 0x4a, 0x42, 0x51, 0x6b, + 0x4d, 0x0a, + 0x09, 0x43, 0x51, 0x6b, 0x4b, 0x43, 0x51, 0x6f, 0x4c, 0x43, 0x67, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, + 0x41, 0x67, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x6b, 0x4a, 0x43, 0x51, 0x6b, + 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x48, 0x42, 0x77, 0x6b, 0x4a, 0x42, 0x77, 0x67, 0x4a, 0x43, + 0x51, 0x34, 0x4f, 0x44, 0x67, 0x63, 0x48, 0x44, 0x41, 0x34, 0x4c, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x6b, + 0x4a, 0x0a, + 0x09, 0x42, 0x77, 0x6b, 0x4c, 0x43, 0x41, 0x63, 0x48, 0x42, 0x77, 0x73, 0x4f, 0x43, 0x51, 0x63, 0x46, 0x44, + 0x41, 0x6b, 0x4a, 0x44, 0x41, 0x6b, 0x4a, 0x43, 0x51, 0x34, 0x4a, 0x43, 0x51, 0x6b, 0x4c, 0x44, 0x77, 0x38, + 0x48, 0x44, 0x67, 0x63, 0x48, 0x42, 0x41, 0x51, 0x4d, 0x42, 0x77, 0x63, 0x4a, 0x41, 0x67, 0x6b, 0x47, 0x42, + 0x67, 0x67, 0x49, 0x42, 0x77, 0x51, 0x45, 0x42, 0x78, 0x4d, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x4d, + 0x44, 0x0a, + 0x09, 0x41, 0x77, 0x4d, 0x4c, 0x43, 0x77, 0x73, 0x4b, 0x43, 0x67, 0x6f, 0x44, 0x42, 0x77, 0x63, 0x48, 0x42, + 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x44, 0x43, 0x51, 0x67, 0x4b, 0x43, 0x41, 0x55, + 0x4c, 0x43, 0x51, 0x6b, 0x48, 0x43, 0x51, 0x6b, 0x4d, 0x44, 0x41, 0x59, 0x47, 0x42, 0x67, 0x34, 0x4f, 0x44, + 0x67, 0x73, 0x4a, 0x41, 0x77, 0x6b, 0x49, 0x43, 0x67, 0x67, 0x4b, 0x43, 0x41, 0x6b, 0x46, 0x42, 0x41, 0x6b, + 0x48, 0x0a, + 0x09, 0x42, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x47, 0x42, 0x77, 0x63, 0x41, 0x41, 0x41, 0x38, 0x55, 0x43, + 0x51, 0x41, 0x46, 0x42, 0x51, 0x59, 0x47, 0x44, 0x51, 0x6f, 0x4f, 0x43, 0x77, 0x4d, 0x47, 0x42, 0x67, 0x67, + 0x4e, 0x42, 0x51, 0x55, 0x46, 0x42, 0x51, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, + 0x67, 0x6f, 0x46, 0x42, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x67, 0x50, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x77, 0x6b, + 0x4a, 0x0a, + 0x09, 0x44, 0x41, 0x73, 0x44, 0x41, 0x77, 0x6f, 0x49, 0x44, 0x51, 0x73, 0x4d, 0x43, 0x51, 0x77, 0x4b, 0x43, + 0x67, 0x6b, 0x4c, 0x43, 0x67, 0x38, 0x4b, 0x43, 0x51, 0x73, 0x47, 0x42, 0x51, 0x59, 0x4e, 0x43, 0x41, 0x67, + 0x4a, 0x43, 0x51, 0x67, 0x4a, 0x43, 0x51, 0x55, 0x4a, 0x43, 0x51, 0x4d, 0x44, 0x43, 0x41, 0x4d, 0x50, 0x43, + 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x59, 0x49, 0x42, 0x67, 0x6b, 0x49, 0x44, 0x51, 0x6f, 0x49, 0x43, 0x41, 0x6f, + 0x46, 0x0a, + 0x09, 0x43, 0x67, 0x30, 0x4b, 0x43, 0x67, 0x6f, 0x4a, 0x43, 0x77, 0x77, 0x4c, 0x43, 0x51, 0x6b, 0x4a, 0x43, + 0x51, 0x6b, 0x4a, 0x43, 0x41, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x43, 0x51, 0x6b, + 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x67, 0x49, 0x43, 0x67, 0x6f, 0x49, 0x43, + 0x51, 0x6f, 0x4a, 0x44, 0x77, 0x38, 0x50, 0x43, 0x41, 0x67, 0x4e, 0x44, 0x77, 0x77, 0x4e, 0x44, 0x51, 0x30, + 0x4e, 0x0a, + 0x09, 0x43, 0x67, 0x6b, 0x49, 0x43, 0x67, 0x73, 0x4a, 0x43, 0x41, 0x63, 0x48, 0x43, 0x77, 0x38, 0x4a, 0x43, + 0x41, 0x59, 0x4e, 0x43, 0x67, 0x6f, 0x4e, 0x43, 0x67, 0x6b, 0x4a, 0x44, 0x77, 0x6f, 0x4b, 0x43, 0x67, 0x77, + 0x51, 0x44, 0x77, 0x67, 0x50, 0x43, 0x41, 0x67, 0x46, 0x42, 0x51, 0x30, 0x48, 0x43, 0x41, 0x6b, 0x44, 0x43, + 0x67, 0x59, 0x47, 0x43, 0x51, 0x6b, 0x49, 0x42, 0x51, 0x55, 0x49, 0x46, 0x41, 0x6f, 0x4a, 0x43, 0x67, 0x6b, + 0x4a, 0x0a, + 0x09, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x77, 0x4d, 0x44, 0x41, 0x73, 0x4c, 0x43, 0x77, 0x4d, 0x49, 0x43, + 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x4d, 0x4b, 0x43, 0x41, 0x73, + 0x49, 0x42, 0x51, 0x77, 0x4a, 0x43, 0x51, 0x67, 0x4a, 0x43, 0x51, 0x30, 0x4e, 0x42, 0x67, 0x59, 0x47, 0x44, + 0x77, 0x38, 0x50, 0x44, 0x41, 0x6b, 0x44, 0x43, 0x67, 0x67, 0x4b, 0x43, 0x41, 0x6f, 0x49, 0x43, 0x51, 0x55, + 0x46, 0x0a, + 0x09, 0x43, 0x67, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x59, 0x49, 0x43, 0x41, 0x41, 0x41, 0x45, + 0x42, 0x55, 0x4b, 0x41, 0x41, 0x55, 0x46, 0x42, 0x67, 0x59, 0x4e, 0x43, 0x67, 0x38, 0x4d, 0x41, 0x77, 0x59, + 0x47, 0x43, 0x41, 0x30, 0x46, 0x42, 0x67, 0x55, 0x46, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, + 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x55, 0x46, 0x44, 0x51, 0x30, 0x4e, 0x43, 0x52, 0x41, 0x4c, 0x43, 0x77, 0x73, + 0x4d, 0x0a, + 0x09, 0x43, 0x67, 0x6b, 0x4d, 0x44, 0x41, 0x55, 0x46, 0x43, 0x67, 0x6b, 0x4e, 0x44, 0x41, 0x30, 0x4b, 0x44, + 0x51, 0x73, 0x4b, 0x43, 0x51, 0x77, 0x4c, 0x45, 0x51, 0x73, 0x4a, 0x44, 0x41, 0x59, 0x46, 0x42, 0x67, 0x30, + 0x49, 0x43, 0x41, 0x6b, 0x4b, 0x43, 0x51, 0x6f, 0x4a, 0x42, 0x67, 0x6f, 0x4b, 0x41, 0x77, 0x4d, 0x4a, 0x41, + 0x77, 0x38, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x42, 0x77, 0x6b, 0x47, 0x43, 0x67, 0x6b, 0x4e, 0x43, 0x67, 0x6b, + 0x4a, 0x0a, + 0x09, 0x43, 0x67, 0x55, 0x4b, 0x44, 0x51, 0x73, 0x4c, 0x43, 0x77, 0x6f, 0x4d, 0x44, 0x51, 0x77, 0x4a, 0x43, + 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x4d, 0x44, 0x41, 0x77, 0x4d, + 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x41, 0x67, 0x4b, 0x43, + 0x67, 0x67, 0x4a, 0x43, 0x67, 0x6f, 0x51, 0x45, 0x42, 0x41, 0x49, 0x43, 0x41, 0x30, 0x51, 0x44, 0x51, 0x30, + 0x4e, 0x0a, + 0x09, 0x44, 0x51, 0x30, 0x4b, 0x43, 0x67, 0x67, 0x4c, 0x44, 0x41, 0x6b, 0x49, 0x43, 0x41, 0x67, 0x4d, 0x45, + 0x41, 0x6f, 0x4a, 0x42, 0x67, 0x30, 0x4b, 0x43, 0x67, 0x30, 0x4c, 0x43, 0x67, 0x6f, 0x51, 0x43, 0x67, 0x73, + 0x4c, 0x44, 0x52, 0x45, 0x50, 0x43, 0x42, 0x41, 0x49, 0x43, 0x41, 0x55, 0x46, 0x44, 0x51, 0x67, 0x4a, 0x43, + 0x51, 0x4d, 0x4b, 0x42, 0x67, 0x59, 0x4b, 0x43, 0x67, 0x67, 0x46, 0x42, 0x51, 0x67, 0x56, 0x43, 0x77, 0x6f, + 0x4c, 0x0a, + 0x09, 0x43, 0x67, 0x6f, 0x46, 0x42, 0x51, 0x55, 0x46, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x41, 0x77, 0x4d, 0x41, + 0x77, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x4a, 0x42, 0x41, 0x6f, + 0x4a, 0x44, 0x41, 0x6b, 0x46, 0x44, 0x51, 0x6f, 0x4a, 0x43, 0x51, 0x6f, 0x4b, 0x44, 0x51, 0x30, 0x47, 0x42, + 0x67, 0x59, 0x51, 0x45, 0x42, 0x41, 0x4d, 0x43, 0x67, 0x55, 0x4b, 0x43, 0x51, 0x73, 0x4a, 0x43, 0x77, 0x6b, + 0x4b, 0x0a, + 0x09, 0x42, 0x67, 0x55, 0x4b, 0x43, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, 0x49, 0x42, 0x67, 0x67, 0x49, 0x41, + 0x41, 0x41, 0x52, 0x46, 0x77, 0x6f, 0x41, 0x42, 0x51, 0x55, 0x48, 0x43, 0x41, 0x34, 0x4c, 0x45, 0x41, 0x30, + 0x46, 0x42, 0x77, 0x63, 0x4a, 0x44, 0x67, 0x55, 0x47, 0x42, 0x51, 0x59, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, + 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x42, 0x67, 0x59, 0x4f, 0x44, 0x67, 0x34, 0x4a, 0x45, 0x51, 0x73, + 0x4d, 0x0a, + 0x09, 0x44, 0x41, 0x30, 0x4c, 0x43, 0x67, 0x30, 0x4e, 0x42, 0x67, 0x59, 0x4d, 0x43, 0x51, 0x38, 0x4e, 0x44, + 0x51, 0x6f, 0x4e, 0x44, 0x41, 0x73, 0x4b, 0x44, 0x51, 0x73, 0x53, 0x44, 0x51, 0x6f, 0x4d, 0x42, 0x77, 0x59, + 0x48, 0x44, 0x67, 0x6b, 0x4a, 0x43, 0x67, 0x6f, 0x49, 0x43, 0x67, 0x6f, 0x47, 0x43, 0x67, 0x73, 0x46, 0x42, + 0x51, 0x6f, 0x46, 0x45, 0x51, 0x73, 0x4b, 0x43, 0x67, 0x6f, 0x48, 0x43, 0x41, 0x63, 0x4c, 0x43, 0x67, 0x38, + 0x4b, 0x0a, + 0x09, 0x43, 0x67, 0x67, 0x4c, 0x42, 0x67, 0x73, 0x4f, 0x43, 0x77, 0x73, 0x4d, 0x43, 0x77, 0x30, 0x4e, 0x44, + 0x51, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x67, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x42, 0x51, 0x55, + 0x46, 0x42, 0x51, 0x73, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4a, 0x43, + 0x51, 0x73, 0x4c, 0x43, 0x51, 0x6f, 0x4c, 0x43, 0x78, 0x45, 0x52, 0x45, 0x51, 0x6b, 0x4a, 0x44, 0x68, 0x41, + 0x4e, 0x0a, + 0x09, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x73, 0x4c, 0x43, 0x51, 0x73, 0x4e, 0x43, 0x67, 0x6b, 0x49, 0x43, + 0x41, 0x30, 0x51, 0x43, 0x67, 0x6b, 0x48, 0x44, 0x67, 0x73, 0x4c, 0x44, 0x67, 0x73, 0x4b, 0x43, 0x68, 0x45, + 0x4c, 0x43, 0x77, 0x73, 0x4e, 0x45, 0x68, 0x45, 0x4a, 0x45, 0x51, 0x6b, 0x4a, 0x42, 0x51, 0x55, 0x4f, 0x43, + 0x41, 0x6f, 0x4b, 0x41, 0x77, 0x73, 0x48, 0x42, 0x77, 0x6f, 0x4b, 0x43, 0x51, 0x55, 0x46, 0x43, 0x52, 0x63, + 0x4c, 0x0a, + 0x09, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x59, 0x47, 0x42, 0x67, 0x59, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, + 0x51, 0x30, 0x46, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6f, + 0x46, 0x43, 0x77, 0x67, 0x4d, 0x43, 0x41, 0x59, 0x4e, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4f, 0x44, + 0x67, 0x63, 0x48, 0x42, 0x78, 0x41, 0x51, 0x45, 0x41, 0x30, 0x4b, 0x42, 0x67, 0x73, 0x49, 0x44, 0x41, 0x67, + 0x4d, 0x0a, + 0x09, 0x43, 0x41, 0x6f, 0x47, 0x42, 0x51, 0x73, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x48, 0x43, + 0x51, 0x6b, 0x41, 0x41, 0x42, 0x49, 0x59, 0x43, 0x77, 0x41, 0x47, 0x42, 0x67, 0x63, 0x49, 0x44, 0x77, 0x73, + 0x52, 0x44, 0x51, 0x51, 0x48, 0x42, 0x77, 0x6b, 0x50, 0x42, 0x67, 0x63, 0x47, 0x42, 0x67, 0x73, 0x4c, 0x43, + 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x47, 0x42, 0x67, 0x38, 0x50, 0x44, 0x77, 0x6f, + 0x53, 0x0a, + 0x09, 0x44, 0x41, 0x77, 0x4e, 0x44, 0x67, 0x73, 0x4b, 0x44, 0x67, 0x34, 0x47, 0x42, 0x67, 0x77, 0x4b, 0x45, + 0x41, 0x34, 0x4f, 0x43, 0x77, 0x34, 0x4e, 0x43, 0x77, 0x77, 0x4f, 0x44, 0x42, 0x4d, 0x4e, 0x44, 0x41, 0x30, + 0x48, 0x42, 0x67, 0x63, 0x50, 0x43, 0x51, 0x6b, 0x4b, 0x43, 0x77, 0x6b, 0x4c, 0x43, 0x77, 0x59, 0x4c, 0x43, + 0x77, 0x55, 0x46, 0x43, 0x67, 0x55, 0x52, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x67, 0x49, 0x42, 0x77, 0x73, + 0x4c, 0x0a, + 0x09, 0x45, 0x41, 0x73, 0x4c, 0x43, 0x51, 0x73, 0x47, 0x43, 0x77, 0x38, 0x4d, 0x44, 0x41, 0x30, 0x4c, 0x44, + 0x67, 0x34, 0x4f, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x51, 0x73, 0x4c, 0x43, 0x77, 0x73, + 0x46, 0x42, 0x51, 0x55, 0x46, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, + 0x77, 0x6b, 0x4a, 0x43, 0x77, 0x73, 0x4a, 0x43, 0x77, 0x73, 0x4c, 0x45, 0x68, 0x49, 0x53, 0x43, 0x51, 0x6b, + 0x50, 0x0a, + 0x09, 0x45, 0x51, 0x34, 0x50, 0x44, 0x77, 0x38, 0x50, 0x43, 0x77, 0x73, 0x4a, 0x44, 0x41, 0x34, 0x4c, 0x43, + 0x51, 0x67, 0x49, 0x44, 0x68, 0x45, 0x4c, 0x43, 0x67, 0x63, 0x50, 0x43, 0x77, 0x73, 0x50, 0x44, 0x41, 0x73, + 0x4c, 0x45, 0x67, 0x73, 0x4d, 0x44, 0x41, 0x34, 0x54, 0x45, 0x77, 0x6b, 0x53, 0x43, 0x51, 0x6b, 0x47, 0x42, + 0x67, 0x38, 0x4a, 0x43, 0x77, 0x77, 0x44, 0x43, 0x77, 0x63, 0x48, 0x43, 0x77, 0x73, 0x4a, 0x42, 0x67, 0x59, + 0x4a, 0x0a, + 0x09, 0x47, 0x41, 0x77, 0x4c, 0x44, 0x41, 0x73, 0x4c, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x34, 0x4f, 0x44, + 0x67, 0x34, 0x4f, 0x44, 0x67, 0x55, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, 0x51, 0x6b, + 0x4a, 0x43, 0x67, 0x55, 0x4c, 0x43, 0x41, 0x30, 0x4a, 0x42, 0x67, 0x34, 0x4c, 0x44, 0x41, 0x73, 0x4c, 0x43, + 0x77, 0x38, 0x50, 0x42, 0x77, 0x63, 0x48, 0x45, 0x52, 0x45, 0x52, 0x44, 0x67, 0x73, 0x47, 0x43, 0x77, 0x67, + 0x4e, 0x0a, + 0x09, 0x43, 0x51, 0x30, 0x4a, 0x43, 0x77, 0x63, 0x47, 0x43, 0x77, 0x6b, 0x4a, 0x43, 0x51, 0x6b, 0x4a, 0x43, + 0x51, 0x63, 0x4a, 0x43, 0x51, 0x41, 0x41, 0x45, 0x78, 0x6f, 0x4c, 0x41, 0x41, 0x59, 0x47, 0x43, 0x41, 0x67, + 0x51, 0x44, 0x42, 0x49, 0x4f, 0x42, 0x41, 0x63, 0x48, 0x43, 0x68, 0x41, 0x47, 0x42, 0x77, 0x59, 0x47, 0x44, + 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x59, 0x47, 0x45, 0x42, 0x41, + 0x51, 0x0a, + 0x09, 0x43, 0x68, 0x4d, 0x4e, 0x44, 0x51, 0x30, 0x50, 0x44, 0x41, 0x73, 0x50, 0x44, 0x67, 0x59, 0x47, 0x44, + 0x41, 0x73, 0x51, 0x44, 0x67, 0x38, 0x4d, 0x44, 0x77, 0x30, 0x4d, 0x44, 0x41, 0x34, 0x4e, 0x46, 0x41, 0x34, + 0x4d, 0x44, 0x51, 0x63, 0x47, 0x42, 0x78, 0x41, 0x4b, 0x43, 0x67, 0x73, 0x4c, 0x43, 0x51, 0x73, 0x4c, 0x42, + 0x67, 0x73, 0x4d, 0x42, 0x51, 0x55, 0x4c, 0x42, 0x52, 0x45, 0x4d, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x41, 0x6b, + 0x49, 0x0a, + 0x09, 0x44, 0x41, 0x73, 0x52, 0x43, 0x77, 0x73, 0x4c, 0x44, 0x41, 0x59, 0x4d, 0x45, 0x41, 0x30, 0x4e, 0x44, + 0x51, 0x77, 0x4f, 0x44, 0x77, 0x34, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4a, 0x43, 0x77, 0x73, + 0x4c, 0x43, 0x77, 0x55, 0x46, 0x42, 0x51, 0x55, 0x4d, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4d, 0x44, + 0x41, 0x77, 0x4d, 0x43, 0x67, 0x6f, 0x4d, 0x44, 0x41, 0x6f, 0x4c, 0x44, 0x41, 0x77, 0x54, 0x45, 0x78, 0x4d, + 0x4b, 0x0a, + 0x09, 0x43, 0x68, 0x41, 0x53, 0x44, 0x78, 0x41, 0x51, 0x45, 0x42, 0x41, 0x4d, 0x44, 0x41, 0x6f, 0x4e, 0x44, + 0x67, 0x73, 0x4b, 0x43, 0x51, 0x6b, 0x50, 0x45, 0x67, 0x73, 0x4b, 0x43, 0x42, 0x41, 0x4d, 0x44, 0x42, 0x41, + 0x4e, 0x44, 0x41, 0x77, 0x54, 0x44, 0x41, 0x30, 0x4e, 0x44, 0x78, 0x51, 0x54, 0x43, 0x68, 0x4d, 0x4b, 0x43, + 0x67, 0x59, 0x47, 0x45, 0x41, 0x6b, 0x4c, 0x44, 0x41, 0x4d, 0x4d, 0x43, 0x41, 0x67, 0x4c, 0x43, 0x77, 0x6f, + 0x47, 0x0a, + 0x09, 0x42, 0x67, 0x6f, 0x61, 0x44, 0x51, 0x77, 0x4e, 0x44, 0x41, 0x77, 0x47, 0x42, 0x67, 0x59, 0x47, 0x44, + 0x77, 0x38, 0x50, 0x44, 0x67, 0x34, 0x4f, 0x42, 0x51, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, + 0x4b, 0x43, 0x67, 0x6f, 0x4c, 0x42, 0x51, 0x77, 0x4a, 0x44, 0x51, 0x73, 0x47, 0x44, 0x77, 0x73, 0x4d, 0x43, + 0x77, 0x77, 0x4c, 0x45, 0x42, 0x41, 0x49, 0x43, 0x41, 0x67, 0x53, 0x45, 0x68, 0x49, 0x50, 0x43, 0x77, 0x59, + 0x4d, 0x0a, + 0x09, 0x43, 0x51, 0x30, 0x4a, 0x44, 0x51, 0x6b, 0x4c, 0x42, 0x77, 0x59, 0x4d, 0x43, 0x67, 0x6f, 0x4b, 0x43, + 0x67, 0x6f, 0x4b, 0x43, 0x41, 0x6f, 0x4b, 0x41, 0x41, 0x41, 0x55, 0x47, 0x77, 0x77, 0x41, 0x42, 0x67, 0x59, + 0x49, 0x43, 0x68, 0x45, 0x4e, 0x45, 0x77, 0x38, 0x47, 0x43, 0x41, 0x67, 0x4b, 0x45, 0x51, 0x59, 0x48, 0x42, + 0x67, 0x63, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x42, 0x77, 0x63, + 0x52, 0x0a, + 0x09, 0x45, 0x52, 0x45, 0x4c, 0x46, 0x41, 0x34, 0x4f, 0x44, 0x67, 0x38, 0x4e, 0x44, 0x42, 0x41, 0x50, 0x42, + 0x67, 0x59, 0x4e, 0x43, 0x78, 0x45, 0x50, 0x45, 0x41, 0x77, 0x51, 0x44, 0x67, 0x30, 0x4d, 0x44, 0x77, 0x34, + 0x55, 0x44, 0x67, 0x77, 0x4f, 0x43, 0x41, 0x63, 0x49, 0x45, 0x51, 0x6f, 0x4b, 0x44, 0x41, 0x30, 0x4c, 0x44, + 0x51, 0x77, 0x48, 0x44, 0x51, 0x30, 0x47, 0x42, 0x67, 0x77, 0x47, 0x46, 0x41, 0x30, 0x4d, 0x44, 0x51, 0x30, + 0x49, 0x0a, + 0x09, 0x43, 0x67, 0x67, 0x4e, 0x43, 0x78, 0x45, 0x4c, 0x43, 0x77, 0x73, 0x4e, 0x42, 0x77, 0x30, 0x52, 0x44, + 0x67, 0x34, 0x4f, 0x44, 0x51, 0x38, 0x51, 0x44, 0x77, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x73, + 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x42, 0x67, 0x59, 0x47, 0x42, 0x67, 0x30, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, + 0x41, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4b, 0x43, 0x67, 0x30, 0x4e, 0x43, 0x67, 0x77, 0x4e, 0x44, 0x52, 0x51, + 0x55, 0x0a, + 0x09, 0x46, 0x41, 0x6f, 0x4b, 0x45, 0x52, 0x51, 0x51, 0x45, 0x52, 0x45, 0x52, 0x45, 0x51, 0x30, 0x4e, 0x43, + 0x67, 0x30, 0x50, 0x44, 0x41, 0x6f, 0x4a, 0x43, 0x51, 0x38, 0x54, 0x44, 0x41, 0x73, 0x49, 0x45, 0x51, 0x30, + 0x4e, 0x45, 0x51, 0x30, 0x4d, 0x44, 0x42, 0x51, 0x4e, 0x44, 0x67, 0x34, 0x51, 0x46, 0x52, 0x51, 0x4b, 0x46, + 0x41, 0x6f, 0x4b, 0x42, 0x67, 0x59, 0x52, 0x43, 0x67, 0x73, 0x4d, 0x41, 0x77, 0x30, 0x49, 0x43, 0x41, 0x30, + 0x4e, 0x0a, + 0x09, 0x43, 0x67, 0x59, 0x47, 0x43, 0x68, 0x73, 0x4f, 0x44, 0x51, 0x34, 0x4e, 0x44, 0x51, 0x59, 0x47, 0x42, + 0x67, 0x59, 0x51, 0x45, 0x42, 0x41, 0x50, 0x44, 0x77, 0x38, 0x47, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, + 0x4b, 0x43, 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x73, 0x47, 0x44, 0x51, 0x6f, 0x4f, 0x43, 0x77, 0x63, 0x50, 0x44, + 0x41, 0x77, 0x4c, 0x44, 0x41, 0x30, 0x52, 0x45, 0x51, 0x67, 0x49, 0x43, 0x42, 0x4d, 0x54, 0x45, 0x78, 0x41, + 0x4e, 0x0a, + 0x09, 0x42, 0x67, 0x30, 0x4b, 0x44, 0x67, 0x73, 0x4f, 0x43, 0x77, 0x30, 0x48, 0x42, 0x67, 0x30, 0x4b, 0x43, + 0x67, 0x6f, 0x4b, 0x43, 0x67, 0x6f, 0x49, 0x43, 0x67, 0x6f, 0x41, 0x41, 0x42, 0x55, 0x63, 0x44, 0x51, 0x41, + 0x48, 0x42, 0x77, 0x67, 0x4b, 0x45, 0x67, 0x30, 0x55, 0x45, 0x41, 0x59, 0x49, 0x43, 0x41, 0x73, 0x53, 0x42, + 0x77, 0x67, 0x48, 0x42, 0x77, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, + 0x48, 0x0a, + 0x09, 0x42, 0x78, 0x49, 0x53, 0x45, 0x67, 0x73, 0x56, 0x44, 0x67, 0x34, 0x50, 0x45, 0x41, 0x30, 0x4d, 0x45, + 0x42, 0x41, 0x47, 0x42, 0x67, 0x34, 0x4d, 0x45, 0x68, 0x41, 0x52, 0x44, 0x52, 0x45, 0x50, 0x44, 0x51, 0x30, + 0x50, 0x44, 0x68, 0x55, 0x4f, 0x44, 0x51, 0x34, 0x49, 0x42, 0x77, 0x67, 0x53, 0x43, 0x77, 0x73, 0x4e, 0x44, + 0x51, 0x77, 0x4e, 0x44, 0x51, 0x63, 0x4e, 0x44, 0x51, 0x59, 0x47, 0x44, 0x41, 0x59, 0x55, 0x44, 0x67, 0x30, + 0x4e, 0x0a, + 0x09, 0x44, 0x51, 0x6b, 0x4c, 0x43, 0x41, 0x34, 0x4c, 0x45, 0x51, 0x30, 0x4e, 0x43, 0x77, 0x30, 0x48, 0x44, + 0x52, 0x49, 0x4f, 0x44, 0x67, 0x38, 0x4e, 0x45, 0x42, 0x45, 0x50, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, + 0x4e, 0x44, 0x41, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x47, 0x42, 0x67, 0x59, 0x47, 0x44, 0x67, 0x30, 0x4e, 0x44, + 0x51, 0x30, 0x4e, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x73, 0x4c, 0x44, 0x51, 0x30, 0x4c, 0x44, 0x41, 0x30, + 0x4e, 0x0a, + 0x09, 0x46, 0x52, 0x55, 0x56, 0x43, 0x77, 0x73, 0x53, 0x46, 0x42, 0x45, 0x53, 0x45, 0x68, 0x49, 0x53, 0x44, + 0x51, 0x34, 0x4c, 0x44, 0x68, 0x41, 0x4d, 0x43, 0x77, 0x6f, 0x4b, 0x45, 0x42, 0x51, 0x4e, 0x43, 0x77, 0x67, + 0x53, 0x44, 0x51, 0x30, 0x53, 0x44, 0x67, 0x30, 0x4e, 0x46, 0x51, 0x30, 0x4f, 0x44, 0x68, 0x45, 0x57, 0x46, + 0x67, 0x73, 0x56, 0x43, 0x77, 0x73, 0x48, 0x42, 0x78, 0x49, 0x4b, 0x44, 0x51, 0x30, 0x45, 0x44, 0x51, 0x67, + 0x49, 0x0a, + 0x09, 0x44, 0x51, 0x30, 0x4c, 0x42, 0x77, 0x63, 0x4c, 0x48, 0x41, 0x34, 0x4e, 0x44, 0x67, 0x30, 0x4e, 0x42, + 0x67, 0x59, 0x47, 0x42, 0x68, 0x45, 0x52, 0x45, 0x51, 0x38, 0x50, 0x44, 0x77, 0x59, 0x4c, 0x43, 0x77, 0x73, + 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x44, 0x41, 0x59, 0x4e, 0x43, 0x77, 0x34, 0x4c, 0x42, + 0x78, 0x41, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x52, 0x49, 0x53, 0x43, 0x41, 0x67, 0x49, 0x46, 0x42, 0x51, + 0x55, 0x0a, + 0x09, 0x45, 0x41, 0x30, 0x47, 0x44, 0x51, 0x73, 0x50, 0x44, 0x41, 0x38, 0x4d, 0x44, 0x51, 0x67, 0x48, 0x44, + 0x51, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x67, 0x4c, 0x43, 0x77, 0x41, 0x41, 0x46, 0x68, 0x34, + 0x4e, 0x41, 0x41, 0x63, 0x48, 0x43, 0x51, 0x6f, 0x53, 0x44, 0x68, 0x55, 0x52, 0x42, 0x67, 0x6b, 0x4a, 0x43, + 0x78, 0x49, 0x48, 0x43, 0x41, 0x63, 0x48, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x34, + 0x4f, 0x0a, + 0x09, 0x44, 0x67, 0x63, 0x48, 0x45, 0x68, 0x49, 0x53, 0x44, 0x42, 0x59, 0x50, 0x44, 0x77, 0x38, 0x52, 0x44, + 0x67, 0x30, 0x52, 0x45, 0x51, 0x59, 0x47, 0x44, 0x67, 0x77, 0x54, 0x45, 0x42, 0x45, 0x4e, 0x45, 0x51, 0x38, + 0x4f, 0x44, 0x52, 0x41, 0x50, 0x46, 0x67, 0x38, 0x4e, 0x44, 0x77, 0x6b, 0x48, 0x43, 0x52, 0x49, 0x4c, 0x43, + 0x77, 0x30, 0x4f, 0x44, 0x41, 0x34, 0x4e, 0x43, 0x41, 0x34, 0x4f, 0x42, 0x67, 0x59, 0x4e, 0x42, 0x68, 0x59, + 0x4f, 0x0a, + 0x09, 0x44, 0x51, 0x34, 0x4f, 0x43, 0x51, 0x73, 0x4a, 0x44, 0x67, 0x34, 0x53, 0x44, 0x67, 0x34, 0x4d, 0x44, + 0x67, 0x63, 0x4f, 0x45, 0x67, 0x38, 0x50, 0x44, 0x77, 0x34, 0x51, 0x45, 0x52, 0x41, 0x4e, 0x44, 0x51, 0x30, + 0x4e, 0x44, 0x51, 0x30, 0x4d, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x59, 0x47, 0x42, 0x67, 0x59, 0x4f, 0x44, + 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x43, 0x77, 0x73, 0x4f, 0x44, 0x67, 0x73, + 0x4e, 0x0a, + 0x09, 0x44, 0x67, 0x34, 0x57, 0x46, 0x68, 0x59, 0x4c, 0x43, 0x78, 0x49, 0x56, 0x45, 0x52, 0x49, 0x53, 0x45, + 0x68, 0x49, 0x4f, 0x44, 0x67, 0x73, 0x50, 0x45, 0x51, 0x30, 0x4c, 0x43, 0x67, 0x6f, 0x52, 0x46, 0x51, 0x30, + 0x4d, 0x43, 0x52, 0x49, 0x4f, 0x44, 0x68, 0x49, 0x50, 0x44, 0x51, 0x30, 0x57, 0x44, 0x67, 0x38, 0x50, 0x45, + 0x52, 0x67, 0x57, 0x43, 0x78, 0x59, 0x4c, 0x43, 0x77, 0x63, 0x48, 0x45, 0x67, 0x73, 0x4f, 0x44, 0x51, 0x51, + 0x4f, 0x0a, + 0x09, 0x43, 0x51, 0x6b, 0x4e, 0x44, 0x51, 0x73, 0x48, 0x42, 0x77, 0x73, 0x65, 0x44, 0x77, 0x34, 0x50, 0x44, + 0x67, 0x34, 0x47, 0x42, 0x67, 0x59, 0x47, 0x45, 0x52, 0x45, 0x52, 0x45, 0x42, 0x41, 0x51, 0x42, 0x67, 0x73, + 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4d, 0x42, 0x67, 0x34, 0x4c, 0x44, + 0x77, 0x77, 0x48, 0x45, 0x51, 0x30, 0x4e, 0x44, 0x67, 0x30, 0x4f, 0x45, 0x68, 0x49, 0x4a, 0x43, 0x51, 0x6b, + 0x56, 0x0a, + 0x09, 0x46, 0x52, 0x55, 0x52, 0x44, 0x67, 0x59, 0x4f, 0x43, 0x77, 0x38, 0x4d, 0x44, 0x77, 0x77, 0x4f, 0x43, + 0x41, 0x63, 0x4f, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x77, 0x73, 0x4c, 0x43, 0x51, 0x73, 0x4c, 0x41, 0x41, 0x41, + 0x58, 0x48, 0x77, 0x34, 0x41, 0x42, 0x77, 0x63, 0x4a, 0x43, 0x78, 0x4d, 0x50, 0x46, 0x68, 0x49, 0x47, 0x43, + 0x51, 0x6b, 0x4d, 0x45, 0x77, 0x63, 0x49, 0x42, 0x77, 0x67, 0x50, 0x44, 0x77, 0x38, 0x50, 0x44, 0x77, 0x38, + 0x50, 0x0a, + 0x09, 0x44, 0x77, 0x38, 0x50, 0x43, 0x41, 0x67, 0x54, 0x45, 0x78, 0x4d, 0x4d, 0x46, 0x78, 0x41, 0x51, 0x45, + 0x42, 0x49, 0x50, 0x44, 0x52, 0x49, 0x52, 0x42, 0x77, 0x63, 0x50, 0x44, 0x52, 0x51, 0x52, 0x45, 0x67, 0x34, + 0x53, 0x45, 0x41, 0x38, 0x4f, 0x45, 0x52, 0x41, 0x58, 0x45, 0x41, 0x34, 0x51, 0x43, 0x51, 0x67, 0x4a, 0x45, + 0x77, 0x77, 0x4d, 0x44, 0x67, 0x38, 0x4e, 0x44, 0x77, 0x34, 0x49, 0x44, 0x77, 0x38, 0x47, 0x42, 0x67, 0x30, + 0x47, 0x0a, + 0x09, 0x46, 0x67, 0x38, 0x4f, 0x44, 0x67, 0x34, 0x4a, 0x44, 0x41, 0x6b, 0x50, 0x44, 0x68, 0x4d, 0x4f, 0x44, + 0x67, 0x77, 0x50, 0x43, 0x41, 0x38, 0x54, 0x45, 0x42, 0x41, 0x51, 0x44, 0x78, 0x45, 0x53, 0x45, 0x51, 0x34, + 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x30, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x42, 0x67, 0x59, 0x47, 0x42, + 0x67, 0x38, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x38, 0x50, 0x44, 0x77, 0x38, 0x4d, 0x44, 0x41, 0x38, + 0x50, 0x0a, + 0x09, 0x44, 0x41, 0x34, 0x50, 0x44, 0x68, 0x63, 0x58, 0x46, 0x77, 0x77, 0x4d, 0x45, 0x78, 0x59, 0x53, 0x45, + 0x78, 0x4d, 0x54, 0x45, 0x77, 0x38, 0x50, 0x44, 0x42, 0x41, 0x52, 0x44, 0x67, 0x77, 0x4c, 0x43, 0x78, 0x49, + 0x56, 0x44, 0x67, 0x77, 0x4a, 0x45, 0x77, 0x38, 0x50, 0x45, 0x77, 0x38, 0x4f, 0x44, 0x68, 0x63, 0x50, 0x45, + 0x42, 0x41, 0x53, 0x47, 0x52, 0x67, 0x4d, 0x46, 0x77, 0x77, 0x4d, 0x42, 0x77, 0x63, 0x54, 0x43, 0x77, 0x34, + 0x4f, 0x0a, + 0x09, 0x42, 0x41, 0x38, 0x4a, 0x43, 0x51, 0x38, 0x50, 0x44, 0x41, 0x63, 0x48, 0x44, 0x42, 0x38, 0x51, 0x44, + 0x78, 0x41, 0x50, 0x44, 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x53, 0x45, 0x68, 0x49, 0x52, 0x45, 0x52, 0x45, + 0x47, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x30, 0x47, 0x44, + 0x77, 0x77, 0x51, 0x44, 0x41, 0x67, 0x53, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x54, 0x45, 0x77, 0x6b, + 0x4a, 0x0a, + 0x09, 0x43, 0x52, 0x59, 0x57, 0x46, 0x68, 0x49, 0x50, 0x42, 0x77, 0x38, 0x4d, 0x45, 0x41, 0x30, 0x51, 0x44, + 0x51, 0x38, 0x49, 0x42, 0x77, 0x38, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4a, 0x44, 0x41, 0x77, + 0x41, 0x41, 0x42, 0x67, 0x67, 0x44, 0x67, 0x41, 0x49, 0x43, 0x41, 0x6f, 0x4c, 0x46, 0x41, 0x38, 0x58, 0x45, + 0x77, 0x63, 0x4a, 0x43, 0x51, 0x77, 0x55, 0x43, 0x41, 0x6b, 0x49, 0x43, 0x41, 0x38, 0x50, 0x44, 0x77, 0x38, + 0x50, 0x0a, + 0x09, 0x44, 0x77, 0x38, 0x50, 0x44, 0x77, 0x38, 0x49, 0x43, 0x42, 0x51, 0x55, 0x46, 0x41, 0x30, 0x59, 0x45, + 0x42, 0x41, 0x52, 0x45, 0x67, 0x38, 0x4f, 0x45, 0x78, 0x49, 0x48, 0x42, 0x78, 0x41, 0x4e, 0x46, 0x52, 0x49, + 0x54, 0x44, 0x68, 0x4d, 0x52, 0x44, 0x77, 0x38, 0x53, 0x45, 0x42, 0x67, 0x51, 0x44, 0x78, 0x41, 0x4a, 0x43, + 0x41, 0x6b, 0x55, 0x44, 0x41, 0x77, 0x4f, 0x44, 0x77, 0x30, 0x50, 0x44, 0x67, 0x67, 0x50, 0x44, 0x77, 0x63, + 0x48, 0x0a, + 0x09, 0x44, 0x67, 0x59, 0x59, 0x44, 0x77, 0x34, 0x50, 0x44, 0x77, 0x6f, 0x4d, 0x43, 0x51, 0x38, 0x50, 0x46, + 0x41, 0x38, 0x50, 0x44, 0x51, 0x38, 0x49, 0x44, 0x78, 0x51, 0x51, 0x45, 0x42, 0x45, 0x50, 0x45, 0x68, 0x4d, + 0x53, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x51, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x48, 0x42, + 0x77, 0x63, 0x48, 0x44, 0x77, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x77, 0x38, 0x50, 0x44, 0x77, 0x77, + 0x4d, 0x0a, + 0x09, 0x44, 0x77, 0x38, 0x4d, 0x44, 0x67, 0x38, 0x50, 0x47, 0x42, 0x67, 0x59, 0x44, 0x41, 0x77, 0x55, 0x46, + 0x78, 0x4d, 0x55, 0x46, 0x42, 0x51, 0x55, 0x44, 0x77, 0x38, 0x4d, 0x45, 0x42, 0x49, 0x4f, 0x44, 0x51, 0x73, + 0x4c, 0x45, 0x68, 0x63, 0x4f, 0x44, 0x51, 0x6f, 0x55, 0x44, 0x77, 0x38, 0x55, 0x45, 0x41, 0x38, 0x50, 0x47, + 0x41, 0x38, 0x51, 0x45, 0x42, 0x4d, 0x61, 0x47, 0x41, 0x77, 0x59, 0x44, 0x41, 0x77, 0x49, 0x43, 0x42, 0x51, + 0x4d, 0x0a, + 0x09, 0x44, 0x77, 0x38, 0x45, 0x44, 0x77, 0x6f, 0x4b, 0x44, 0x77, 0x38, 0x4d, 0x43, 0x41, 0x67, 0x4d, 0x49, + 0x42, 0x41, 0x50, 0x45, 0x41, 0x38, 0x50, 0x42, 0x77, 0x63, 0x48, 0x42, 0x78, 0x4d, 0x54, 0x45, 0x78, 0x49, + 0x53, 0x45, 0x67, 0x63, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, + 0x51, 0x59, 0x50, 0x44, 0x42, 0x41, 0x4e, 0x43, 0x42, 0x4d, 0x4f, 0x44, 0x77, 0x38, 0x50, 0x44, 0x78, 0x51, + 0x55, 0x0a, + 0x09, 0x43, 0x67, 0x6f, 0x4b, 0x46, 0x78, 0x63, 0x58, 0x45, 0x77, 0x38, 0x48, 0x44, 0x77, 0x77, 0x52, 0x44, + 0x52, 0x45, 0x4e, 0x44, 0x77, 0x6b, 0x49, 0x44, 0x77, 0x77, 0x4d, 0x44, 0x41, 0x77, 0x4d, 0x44, 0x41, 0x6f, + 0x4d, 0x44, 0x41, 0x41, 0x41, 0x47, 0x53, 0x49, 0x50, 0x41, 0x41, 0x67, 0x49, 0x43, 0x67, 0x77, 0x56, 0x45, + 0x42, 0x67, 0x55, 0x42, 0x77, 0x6f, 0x4b, 0x44, 0x52, 0x55, 0x49, 0x43, 0x51, 0x67, 0x49, 0x45, 0x42, 0x41, + 0x51, 0x0a, + 0x09, 0x45, 0x42, 0x41, 0x51, 0x45, 0x42, 0x41, 0x51, 0x45, 0x41, 0x67, 0x49, 0x46, 0x52, 0x55, 0x56, 0x44, + 0x52, 0x6b, 0x52, 0x45, 0x52, 0x45, 0x54, 0x45, 0x41, 0x34, 0x54, 0x45, 0x77, 0x63, 0x48, 0x45, 0x41, 0x34, + 0x57, 0x45, 0x78, 0x51, 0x50, 0x46, 0x42, 0x45, 0x51, 0x44, 0x78, 0x49, 0x52, 0x47, 0x52, 0x45, 0x50, 0x45, + 0x51, 0x6f, 0x49, 0x43, 0x68, 0x55, 0x4e, 0x44, 0x51, 0x38, 0x51, 0x44, 0x68, 0x41, 0x50, 0x43, 0x52, 0x41, + 0x51, 0x0a, + 0x09, 0x42, 0x77, 0x63, 0x4f, 0x42, 0x78, 0x67, 0x51, 0x44, 0x78, 0x41, 0x51, 0x43, 0x67, 0x30, 0x4b, 0x45, + 0x41, 0x38, 0x55, 0x44, 0x77, 0x38, 0x4e, 0x45, 0x41, 0x67, 0x51, 0x46, 0x52, 0x45, 0x52, 0x45, 0x52, 0x41, + 0x54, 0x46, 0x42, 0x49, 0x50, 0x44, 0x77, 0x38, 0x50, 0x44, 0x77, 0x38, 0x4f, 0x44, 0x77, 0x38, 0x50, 0x44, + 0x77, 0x63, 0x48, 0x42, 0x77, 0x63, 0x51, 0x44, 0x77, 0x38, 0x50, 0x44, 0x77, 0x38, 0x51, 0x45, 0x42, 0x41, + 0x51, 0x0a, + 0x09, 0x44, 0x51, 0x30, 0x51, 0x45, 0x41, 0x30, 0x50, 0x45, 0x42, 0x41, 0x5a, 0x47, 0x52, 0x6b, 0x4e, 0x44, + 0x52, 0x55, 0x59, 0x46, 0x42, 0x55, 0x56, 0x46, 0x52, 0x55, 0x51, 0x45, 0x41, 0x30, 0x52, 0x45, 0x77, 0x38, + 0x4e, 0x44, 0x41, 0x77, 0x54, 0x47, 0x51, 0x38, 0x4e, 0x43, 0x68, 0x55, 0x51, 0x45, 0x42, 0x55, 0x52, 0x44, + 0x77, 0x38, 0x5a, 0x45, 0x42, 0x45, 0x52, 0x46, 0x42, 0x73, 0x61, 0x44, 0x52, 0x6b, 0x4e, 0x44, 0x51, 0x67, + 0x49, 0x0a, + 0x09, 0x46, 0x51, 0x77, 0x50, 0x44, 0x77, 0x51, 0x51, 0x43, 0x67, 0x6f, 0x51, 0x45, 0x41, 0x30, 0x49, 0x43, + 0x41, 0x30, 0x69, 0x45, 0x52, 0x41, 0x52, 0x45, 0x42, 0x41, 0x48, 0x42, 0x77, 0x63, 0x48, 0x46, 0x42, 0x51, + 0x55, 0x45, 0x68, 0x49, 0x53, 0x42, 0x77, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, + 0x51, 0x30, 0x4f, 0x42, 0x78, 0x41, 0x4e, 0x45, 0x51, 0x30, 0x49, 0x45, 0x77, 0x38, 0x50, 0x44, 0x77, 0x38, + 0x51, 0x0a, + 0x09, 0x46, 0x52, 0x55, 0x4b, 0x43, 0x67, 0x6f, 0x59, 0x47, 0x42, 0x67, 0x54, 0x45, 0x41, 0x63, 0x51, 0x44, + 0x52, 0x45, 0x4f, 0x45, 0x51, 0x34, 0x51, 0x43, 0x51, 0x67, 0x51, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, + 0x4e, 0x43, 0x67, 0x30, 0x4e, 0x41, 0x41, 0x41, 0x61, 0x49, 0x78, 0x41, 0x41, 0x43, 0x41, 0x67, 0x4b, 0x44, + 0x42, 0x59, 0x52, 0x47, 0x52, 0x51, 0x48, 0x43, 0x67, 0x6f, 0x4e, 0x46, 0x67, 0x67, 0x4a, 0x43, 0x41, 0x6b, + 0x52, 0x0a, + 0x09, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x43, 0x51, 0x6b, 0x57, 0x46, + 0x68, 0x59, 0x4f, 0x47, 0x68, 0x49, 0x53, 0x45, 0x68, 0x51, 0x51, 0x44, 0x78, 0x51, 0x55, 0x43, 0x41, 0x67, + 0x52, 0x44, 0x68, 0x59, 0x54, 0x46, 0x42, 0x41, 0x55, 0x45, 0x68, 0x45, 0x51, 0x45, 0x78, 0x49, 0x61, 0x45, + 0x68, 0x41, 0x53, 0x43, 0x67, 0x6b, 0x4b, 0x46, 0x67, 0x30, 0x4e, 0x45, 0x42, 0x45, 0x4f, 0x45, 0x52, 0x41, + 0x4a, 0x0a, + 0x09, 0x45, 0x52, 0x41, 0x48, 0x42, 0x77, 0x38, 0x48, 0x47, 0x52, 0x41, 0x51, 0x45, 0x52, 0x45, 0x4c, 0x44, + 0x67, 0x6f, 0x51, 0x44, 0x78, 0x55, 0x50, 0x44, 0x77, 0x34, 0x52, 0x43, 0x52, 0x45, 0x57, 0x45, 0x68, 0x49, + 0x53, 0x45, 0x42, 0x4d, 0x55, 0x45, 0x78, 0x41, 0x51, 0x45, 0x42, 0x41, 0x51, 0x45, 0x41, 0x34, 0x51, 0x45, + 0x42, 0x41, 0x51, 0x42, 0x77, 0x63, 0x48, 0x42, 0x78, 0x41, 0x51, 0x45, 0x42, 0x41, 0x51, 0x45, 0x42, 0x41, + 0x51, 0x0a, + 0x09, 0x45, 0x42, 0x41, 0x4e, 0x44, 0x52, 0x45, 0x52, 0x44, 0x51, 0x38, 0x52, 0x45, 0x42, 0x6f, 0x61, 0x47, + 0x67, 0x30, 0x4e, 0x46, 0x68, 0x6b, 0x55, 0x46, 0x68, 0x59, 0x57, 0x46, 0x68, 0x45, 0x52, 0x44, 0x52, 0x49, + 0x55, 0x44, 0x77, 0x34, 0x4d, 0x44, 0x42, 0x51, 0x61, 0x45, 0x41, 0x34, 0x4b, 0x46, 0x68, 0x45, 0x52, 0x46, + 0x68, 0x45, 0x51, 0x45, 0x42, 0x6f, 0x52, 0x45, 0x68, 0x49, 0x55, 0x48, 0x42, 0x73, 0x4e, 0x47, 0x67, 0x30, + 0x4e, 0x0a, + 0x09, 0x43, 0x41, 0x67, 0x57, 0x44, 0x51, 0x38, 0x51, 0x42, 0x42, 0x45, 0x4b, 0x43, 0x68, 0x41, 0x51, 0x44, + 0x51, 0x67, 0x49, 0x44, 0x53, 0x4d, 0x53, 0x45, 0x42, 0x49, 0x51, 0x45, 0x41, 0x67, 0x49, 0x43, 0x41, 0x67, + 0x55, 0x46, 0x42, 0x51, 0x54, 0x45, 0x78, 0x4d, 0x48, 0x44, 0x51, 0x30, 0x4e, 0x44, 0x51, 0x30, 0x4e, 0x44, + 0x51, 0x30, 0x4e, 0x44, 0x51, 0x38, 0x48, 0x45, 0x51, 0x34, 0x53, 0x44, 0x67, 0x6b, 0x55, 0x45, 0x42, 0x41, + 0x50, 0x0a, + 0x09, 0x45, 0x42, 0x45, 0x57, 0x46, 0x67, 0x6f, 0x4b, 0x43, 0x68, 0x6b, 0x5a, 0x47, 0x52, 0x51, 0x52, 0x43, + 0x42, 0x45, 0x4f, 0x45, 0x67, 0x34, 0x53, 0x44, 0x68, 0x45, 0x4a, 0x43, 0x42, 0x45, 0x4e, 0x44, 0x51, 0x30, + 0x4e, 0x44, 0x51, 0x30, 0x4b, 0x44, 0x51, 0x30, 0x41, 0x41, 0x42, 0x73, 0x6b, 0x45, 0x41, 0x41, 0x4a, 0x43, + 0x51, 0x73, 0x4d, 0x46, 0x78, 0x45, 0x61, 0x46, 0x51, 0x63, 0x4c, 0x43, 0x77, 0x34, 0x58, 0x43, 0x51, 0x6f, + 0x4a, 0x0a, + 0x09, 0x43, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x4a, 0x43, + 0x52, 0x63, 0x58, 0x46, 0x77, 0x34, 0x62, 0x45, 0x68, 0x4d, 0x54, 0x46, 0x52, 0x45, 0x51, 0x46, 0x52, 0x51, + 0x49, 0x43, 0x42, 0x49, 0x50, 0x46, 0x78, 0x51, 0x56, 0x45, 0x42, 0x55, 0x54, 0x45, 0x52, 0x45, 0x55, 0x45, + 0x68, 0x73, 0x54, 0x45, 0x52, 0x4d, 0x4c, 0x43, 0x51, 0x73, 0x58, 0x44, 0x67, 0x34, 0x52, 0x45, 0x51, 0x38, + 0x52, 0x0a, + 0x09, 0x45, 0x51, 0x6f, 0x52, 0x45, 0x51, 0x67, 0x49, 0x45, 0x41, 0x67, 0x61, 0x45, 0x52, 0x45, 0x52, 0x45, + 0x51, 0x73, 0x4f, 0x43, 0x78, 0x45, 0x51, 0x46, 0x68, 0x41, 0x51, 0x44, 0x68, 0x45, 0x4a, 0x45, 0x52, 0x63, + 0x53, 0x45, 0x68, 0x4d, 0x52, 0x46, 0x42, 0x55, 0x55, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x44, + 0x78, 0x45, 0x52, 0x45, 0x52, 0x45, 0x49, 0x43, 0x41, 0x67, 0x49, 0x45, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, + 0x52, 0x0a, + 0x09, 0x45, 0x52, 0x45, 0x52, 0x45, 0x51, 0x34, 0x4f, 0x45, 0x52, 0x45, 0x4f, 0x45, 0x42, 0x45, 0x52, 0x47, + 0x78, 0x73, 0x62, 0x44, 0x67, 0x34, 0x58, 0x47, 0x68, 0x55, 0x57, 0x46, 0x78, 0x63, 0x58, 0x45, 0x52, 0x45, + 0x4f, 0x45, 0x68, 0x51, 0x51, 0x44, 0x67, 0x30, 0x4e, 0x46, 0x52, 0x73, 0x52, 0x44, 0x67, 0x73, 0x58, 0x45, + 0x52, 0x45, 0x58, 0x45, 0x68, 0x45, 0x52, 0x47, 0x78, 0x45, 0x53, 0x45, 0x68, 0x55, 0x64, 0x48, 0x41, 0x34, + 0x62, 0x0a, + 0x09, 0x44, 0x67, 0x34, 0x4a, 0x43, 0x52, 0x63, 0x4e, 0x45, 0x42, 0x45, 0x46, 0x45, 0x51, 0x73, 0x4c, 0x45, + 0x52, 0x45, 0x4f, 0x43, 0x51, 0x6b, 0x4f, 0x4a, 0x42, 0x49, 0x52, 0x45, 0x68, 0x45, 0x52, 0x43, 0x41, 0x67, + 0x49, 0x43, 0x42, 0x55, 0x56, 0x46, 0x52, 0x51, 0x55, 0x46, 0x41, 0x67, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, + 0x67, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x77, 0x67, 0x52, 0x44, 0x68, 0x4d, 0x4f, 0x43, 0x52, 0x55, + 0x52, 0x0a, + 0x09, 0x45, 0x52, 0x41, 0x51, 0x45, 0x52, 0x63, 0x58, 0x43, 0x77, 0x73, 0x4c, 0x47, 0x68, 0x6f, 0x61, 0x46, + 0x52, 0x45, 0x49, 0x45, 0x51, 0x34, 0x54, 0x44, 0x78, 0x4d, 0x50, 0x45, 0x51, 0x6f, 0x4a, 0x45, 0x51, 0x34, + 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x73, 0x4f, 0x44, 0x67, 0x41, 0x41, 0x48, 0x43, 0x59, 0x52, 0x41, + 0x41, 0x6b, 0x4a, 0x43, 0x77, 0x30, 0x58, 0x45, 0x68, 0x73, 0x57, 0x43, 0x41, 0x73, 0x4c, 0x44, 0x68, 0x63, + 0x4a, 0x0a, + 0x09, 0x43, 0x67, 0x6b, 0x4a, 0x45, 0x68, 0x49, 0x53, 0x45, 0x68, 0x49, 0x53, 0x45, 0x68, 0x49, 0x53, 0x45, + 0x67, 0x6b, 0x4a, 0x46, 0x78, 0x63, 0x58, 0x44, 0x78, 0x77, 0x54, 0x45, 0x78, 0x51, 0x57, 0x45, 0x68, 0x41, + 0x57, 0x46, 0x51, 0x67, 0x49, 0x45, 0x68, 0x41, 0x59, 0x46, 0x52, 0x59, 0x52, 0x46, 0x68, 0x4d, 0x53, 0x45, + 0x52, 0x55, 0x54, 0x48, 0x42, 0x4d, 0x52, 0x45, 0x77, 0x73, 0x4a, 0x43, 0x78, 0x63, 0x4f, 0x44, 0x68, 0x45, + 0x53, 0x0a, + 0x09, 0x44, 0x78, 0x49, 0x52, 0x43, 0x68, 0x49, 0x53, 0x43, 0x41, 0x67, 0x51, 0x43, 0x42, 0x73, 0x53, 0x45, + 0x52, 0x49, 0x53, 0x44, 0x41, 0x38, 0x4c, 0x45, 0x68, 0x45, 0x58, 0x45, 0x52, 0x45, 0x50, 0x45, 0x67, 0x6b, + 0x53, 0x46, 0x78, 0x4d, 0x54, 0x46, 0x42, 0x49, 0x56, 0x46, 0x68, 0x55, 0x52, 0x45, 0x52, 0x45, 0x52, 0x45, + 0x52, 0x45, 0x50, 0x45, 0x52, 0x45, 0x52, 0x45, 0x51, 0x67, 0x49, 0x43, 0x41, 0x67, 0x53, 0x45, 0x52, 0x45, + 0x52, 0x0a, + 0x09, 0x45, 0x52, 0x45, 0x53, 0x45, 0x68, 0x49, 0x53, 0x44, 0x67, 0x34, 0x53, 0x45, 0x67, 0x34, 0x52, 0x45, + 0x68, 0x49, 0x63, 0x48, 0x42, 0x77, 0x4f, 0x44, 0x68, 0x63, 0x62, 0x46, 0x68, 0x63, 0x58, 0x46, 0x78, 0x63, + 0x53, 0x45, 0x67, 0x34, 0x54, 0x46, 0x52, 0x41, 0x50, 0x44, 0x51, 0x30, 0x56, 0x48, 0x42, 0x45, 0x50, 0x43, + 0x78, 0x63, 0x53, 0x45, 0x68, 0x63, 0x54, 0x45, 0x52, 0x45, 0x63, 0x45, 0x68, 0x4d, 0x54, 0x46, 0x68, 0x34, + 0x64, 0x0a, + 0x09, 0x44, 0x68, 0x77, 0x50, 0x44, 0x77, 0x6b, 0x4a, 0x46, 0x77, 0x34, 0x52, 0x45, 0x51, 0x55, 0x53, 0x43, + 0x77, 0x73, 0x53, 0x45, 0x67, 0x34, 0x4a, 0x43, 0x51, 0x38, 0x6d, 0x45, 0x78, 0x49, 0x54, 0x45, 0x68, 0x49, + 0x49, 0x43, 0x41, 0x67, 0x49, 0x46, 0x68, 0x59, 0x57, 0x46, 0x52, 0x55, 0x56, 0x43, 0x41, 0x34, 0x4f, 0x44, + 0x67, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x51, 0x43, 0x42, 0x49, 0x50, 0x45, 0x77, 0x38, + 0x4a, 0x0a, + 0x09, 0x46, 0x68, 0x45, 0x52, 0x45, 0x52, 0x45, 0x53, 0x46, 0x78, 0x63, 0x4c, 0x43, 0x77, 0x73, 0x62, 0x47, + 0x78, 0x73, 0x57, 0x45, 0x67, 0x67, 0x53, 0x44, 0x78, 0x51, 0x50, 0x46, 0x41, 0x38, 0x53, 0x43, 0x67, 0x6b, + 0x53, 0x44, 0x67, 0x34, 0x4f, 0x44, 0x67, 0x34, 0x4f, 0x43, 0x77, 0x34, 0x4f, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x43, 0x41, 0x41, 0x67, 0x41, 0x41, 0x76, 0x2f, 0x2f, 0x41, 0x41, 0x4d, 0x41, 0x41, 0x51, 0x41, + 0x41, 0x0a, + 0x09, 0x41, 0x41, 0x49, 0x41, 0x41, 0x41, 0x78, 0x51, 0x43, 0x75, 0x78, 0x66, 0x44, 0x7a, 0x7a, 0x31, 0x41, + 0x42, 0x38, 0x49, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x43, 0x36, 0x75, 0x66, 0x43, 0x34, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x4c, 0x72, 0x43, 0x5a, 0x35, 0x48, 0x2b, 0x69, 0x66, 0x34, 0x64, 0x43, 0x6b, 0x77, 0x48, 0x62, + 0x51, 0x41, 0x41, 0x41, 0x41, 0x67, 0x41, 0x41, 0x51, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x3d, + 0x3d, 0x0a, + 0x09, 0x5d, 0x5d, 0x2c, 0x20, 0x22, 0x56, 0x65, 0x72, 0x61, 0x2e, 0x74, 0x74, 0x66, 0x22, 0x2c, 0x20, 0x22, + 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x22, 0x29, 0x0a, + 0x09, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x46, + 0x6f, 0x6e, 0x74, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, + 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x6f, + 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x6f, 0x6e, 0x74, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x61, 0x5f, 0x74, 0x74, 0x66, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x28, + 0x66, 0x6f, 0x6e, 0x74, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x32, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, + 0x4e, 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, + 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x6e, 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, + 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, + 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x66, 0x6f, 0x6e, 0x74, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x67, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, 0x46, + 0x6f, 0x6e, 0x74, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, 0x74, + 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x67, 0x65, + 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x31, + 0x32, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x67, 0x65, 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x29, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, + 0x72, 0x65, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x20, 0x3d, 0x20, 0x6c, + 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x66, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x67, 0x65, + 0x74, 0x46, 0x6f, 0x6e, 0x74, 0x28, 0x29, 0x20, 0x2d, 0x2d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x73, 0x75, + 0x72, 0x65, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x66, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x66, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x2d, 0x2d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x53, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, 0x22, 0x23, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x32, 0x30, 0x22, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x20, 0x3d, 0x20, + 0x22, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x30, 0x30, 0x22, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x66, 0x6c, 0x6f, + 0x61, 0x74, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x72, 0x32, 0x44, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x69, + 0x66, 0x6f, 0x72, 0x6d, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x32, 0x44, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x5f, 0x43, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x65, 0x73, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x44, 0x61, 0x74, 0x61, 0x5d, 0x5d, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x20, 0x3d, 0x20, 0x47, + 0x4c, 0x53, 0x4c, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x55, 0x4e, 0x49, 0x46, 0x4f, 0x52, 0x4d, 0x53, 0x20, 0x3d, 0x20, 0x5b, + 0x5b, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x4d, + 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, + 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x6c, + 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x20, 0x67, 0x6c, 0x5f, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x0a, + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, + 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x3b, 0x5d, 0x5d, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x55, 0x4e, 0x49, 0x46, 0x4f, 0x52, 0x4d, 0x53, 0x20, 0x3d, + 0x20, 0x5b, 0x5b, 0x0a, + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x0a, + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x50, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x0a, + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x3b, 0x0a, + 0x2f, 0x2f, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x3b, 0x0a, + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x76, 0x65, + 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0a, + 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, + 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x3b, 0x5d, 0x5d, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x54, 0x65, 0x78, 0x43, + 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x78, 0x43, 0x6f, + 0x6f, 0x72, 0x64, 0x30, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, + 0x72, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, + 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x67, 0x6c, 0x5f, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, + 0x30, 0x5d, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, + 0x6f, 0x72, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5d, 0x5d, + 0x2c, 0x0a, + 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, + 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x56, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, + 0x09, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2c, 0x20, 0x56, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0a, + 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, + 0x09, 0x7d, 0x0a, + 0x09, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, + 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, + 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, + 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, + 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x5d, 0x5d, 0x2c, 0x0a, + 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, + 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x56, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, + 0x09, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, + 0x76, 0x65, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0a, + 0x09, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2c, 0x20, 0x56, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x3b, 0x0a, + 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, + 0x09, 0x7d, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x78, + 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x67, 0x6c, 0x5f, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, + 0x30, 0x5d, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, + 0x6f, 0x72, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x5d, 0x5d, 0x2c, 0x0a, + 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, + 0x09, 0x2f, 0x2f, 0x20, 0x66, 0x69, 0x78, 0x20, 0x63, 0x72, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x4f, 0x53, 0x58, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x5f, + 0x74, 0x65, 0x78, 0x30, 0x5f, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x69, 0x6e, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x76, 0x65, 0x63, + 0x32, 0x28, 0x2e, 0x35, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, + 0x09, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x28, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, + 0x20, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x54, 0x65, + 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x73, 0x74, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, + 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, + 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, + 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x41, 0x4e, + 0x56, 0x41, 0x53, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x20, 0x7b, 0x0a, + 0x09, 0x2f, 0x2f, 0x20, 0x66, 0x69, 0x78, 0x20, 0x63, 0x72, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x4f, 0x53, 0x58, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x5f, + 0x74, 0x65, 0x78, 0x30, 0x5f, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x69, 0x6e, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x28, 0x29, 0x0a, + 0x09, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x76, 0x65, 0x63, + 0x32, 0x28, 0x2e, 0x35, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, + 0x09, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x28, 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x5f, 0x74, 0x65, 0x78, 0x30, 0x5f, 0x2c, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, + 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x73, 0x74, 0x2c, 0x20, 0x67, 0x6c, 0x5f, + 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, + 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, + 0x09, 0x7d, 0x0a, + 0x09, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x0a, + 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x70, 0x20, + 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, + 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x56, 0x61, 0x72, 0x79, 0x69, + 0x6e, 0x67, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, + 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x77, 0x70, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, + 0x56, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x5d, 0x5d, 0x2c, 0x0a, + 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x20, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x50, 0x49, + 0x58, 0x45, 0x4c, 0x2e, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x2c, 0x0a, + 0x09, 0x09, 0x46, 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x41, 0x4e, + 0x56, 0x41, 0x53, 0x20, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x2e, 0x46, + 0x4f, 0x4f, 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x41, 0x4e, 0x56, 0x41, 0x53, + 0x2c, 0x0a, + 0x09, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x76, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x2c, 0x20, 0x6c, 0x61, + 0x6e, 0x67, 0x2e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x2e, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x2c, 0x20, + 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x55, 0x4e, 0x49, 0x46, 0x4f, 0x52, 0x4d, 0x53, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x22, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x30, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x2e, 0x46, 0x4f, 0x4f, + 0x54, 0x45, 0x52, 0x2c, 0x0a, + 0x09, 0x09, 0x7d, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2c, 0x20, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x53, 0x59, 0x4e, 0x54, 0x41, 0x58, 0x2c, 0x20, 0x6c, 0x61, + 0x6e, 0x67, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x2e, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x2c, 0x20, 0x6c, + 0x61, 0x6e, 0x67, 0x2e, 0x55, 0x4e, 0x49, 0x46, 0x4f, 0x52, 0x4d, 0x53, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x22, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x30, 0x22, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x2e, 0x46, 0x4f, 0x4f, + 0x54, 0x45, 0x52, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x41, 0x4e, 0x56, 0x41, 0x53, 0x20, 0x6f, + 0x72, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x2e, 0x46, 0x4f, 0x4f, 0x54, 0x45, + 0x52, 0x2c, 0x0a, + 0x09, 0x09, 0x7d, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x5c, + 0x6e, 0x22, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, + 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x22, 0x76, 0x65, 0x63, 0x34, 0x25, 0x73, 0x2a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x25, 0x28, 0x22, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, + 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x76, + 0x65, 0x63, 0x34, 0x25, 0x73, 0x2a, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x25, 0x28, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x22, 0x76, 0x6f, 0x69, 0x64, 0x25, 0x73, 0x2a, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x25, + 0x28, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x76, 0x61, + 0x73, 0x65, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x74, 0x61, 0x6e, 0x69, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, + 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x54, + 0x6f, 0x47, 0x4c, 0x53, 0x4c, 0x28, 0x61, 0x72, 0x67, 0x31, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x32, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, + 0x6e, 0x76, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x2d, 0x2d, 0x20, 0x77, 0x68, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x68, + 0x61, 0x73, 0x20, 0x22, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x22, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x22, 0x65, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x22, 0x0a, + 0x09, 0x09, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x47, 0x4c, 0x53, + 0x4c, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, + 0x73, 0x2e, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x28, + 0x29, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x47, 0x4c, 0x20, 0x45, 0x53, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x72, 0x67, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x31, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x5c, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x22, + 0x29, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x28, 0x25, 0x77, + 0x2b, 0x29, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x25, 0x28, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x31, 0x28, 0x22, 0x29, + 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x20, + 0x28, 0x29, 0x22, 0x20, 0x74, 0x6f, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x28, 0x29, 0x22, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, + 0x28, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, + 0x72, 0x67, 0x31, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, + 0x69, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x73, + 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x72, + 0x67, 0x31, 0x20, 0x2d, 0x2d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, + 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x20, 0x3d, 0x20, 0x69, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x61, 0x72, 0x67, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x32, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x5c, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x20, 0x22, + 0x29, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x0a, + 0x09, 0x09, 0x09, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x28, 0x25, 0x77, + 0x2b, 0x29, 0x28, 0x25, 0x73, 0x2b, 0x29, 0x25, 0x28, 0x22, 0x2c, 0x20, 0x22, 0x25, 0x31, 0x28, 0x22, 0x29, + 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x20, + 0x28, 0x29, 0x22, 0x20, 0x74, 0x6f, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, 0x28, 0x29, 0x22, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, + 0x28, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, + 0x72, 0x67, 0x32, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, + 0x69, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x73, + 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x69, 0x73, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x72, + 0x67, 0x32, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x61, 0x72, 0x67, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, + 0x20, 0x3d, 0x20, 0x69, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x76, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x69, 0x78, 0x65, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x63, 0x61, 0x6e, 0x76, 0x61, 0x73, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x64, + 0x65, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x47, 0x4c, + 0x53, 0x4c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x28, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, + 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x25, 0x61, + 0x2b, 0x29, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x22, + 0x43, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x22, 0x2e, 0x2e, + 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x2e, 0x22, 0x20, 0x73, 0x68, 0x61, 0x64, + 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x22, 0x7d, 0x0a, + 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2b, 0x22, 0x29, 0x20, + 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x6e, 0x76, 0x69, 0x64, 0x69, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x0a, + 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x30, 0x28, 0x3c, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x3e, 0x29, 0x20, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x5b, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5d, 0x3a, 0x20, 0x3c, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x0a, + 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x2c, 0x20, 0x77, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, + 0x20, 0x6c, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x30, 0x25, 0x28, 0x28, 0x25, 0x64, 0x2b, + 0x29, 0x25, 0x29, 0x25, 0x73, 0x2a, 0x3a, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x5b, 0x5e, 0x3a, + 0x5d, 0x2b, 0x3a, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2b, 0x29, 0x24, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x61, 0x74, 0x69, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x30, 0x3a, 0x3c, 0x6c, 0x69, + 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3a, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2f, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x28, 0x23, 0x5b, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5d, 0x29, 0x20, + 0x5b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x4e, 0x41, 0x4d, 0x45, 0x5d, 0x3a, 0x20, 0x3c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x68, + 0x61, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x3a, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x77, 0x2b, 0x3a, 0x20, 0x30, 0x3a, 0x28, 0x25, 0x64, 0x2b, 0x29, + 0x3a, 0x25, 0x73, 0x2a, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x25, 0x28, 0x5b, 0x5e, 0x25, 0x29, 0x5d, 0x2b, 0x25, + 0x29, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2b, 0x29, 0x24, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x4f, 0x53, 0x58, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x28, 0x3f, 0x29, 0x3a, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x3a, 0x20, 0x30, 0x3a, 0x3c, + 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3e, 0x3a, 0x20, 0x3c, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x77, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x3a, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x25, 0x77, 0x2b, 0x29, 0x3a, 0x20, 0x25, 0x64, 0x2b, 0x3a, + 0x28, 0x25, 0x64, 0x2b, 0x29, 0x3a, 0x20, 0x28, 0x2e, 0x2b, 0x29, 0x24, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2b, 0x31, + 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x25, 0x64, 0x3a, 0x20, 0x25, 0x73, 0x3a, + 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x2d, 0x2d, 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x61, 0x74, 0x34, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x2c, 0x20, 0x76, + 0x65, 0x63, 0x34, 0x20, 0x76, 0x65, 0x72, 0x74, 0x70, 0x6f, 0x73, 0x29, 0x20, 0x7b, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x70, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x72, 0x74, 0x70, 0x6f, 0x73, 0x3b, 0x09, 0x0a, + 0x7d, 0x5d, 0x5d, 0x2c, 0x0a, + 0x09, 0x09, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x0a, + 0x76, 0x65, 0x63, 0x34, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x28, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, + 0x72, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, + 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x7b, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x54, 0x65, 0x78, 0x65, 0x6c, 0x28, 0x74, 0x65, 0x78, 0x74, + 0x75, 0x72, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x2a, 0x20, 0x76, + 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x09, 0x0a, + 0x7d, 0x5d, 0x5d, 0x0a, + 0x09, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x7d, 0x0a, + 0x09, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, 0x22, 0x6f, 0x70, 0x65, 0x6e, 0x67, 0x6c, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, + 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x2c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x29, 0x2c, 0x0a, + 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, + 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, + 0x09, 0x7d, 0x0a, + 0x09, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x5b, 0x22, 0x6f, 0x70, 0x65, 0x6e, 0x67, 0x6c, 0x65, + 0x73, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x64, 0x65, + 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x2c, 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x29, 0x2c, 0x0a, + 0x09, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x28, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, + 0x20, 0x47, 0x4c, 0x53, 0x4c, 0x45, 0x53, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, + 0x09, 0x7d, 0x0a, + 0x09, 0x6c, 0x6f, 0x76, 0x65, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x2e, 0x5f, 0x73, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, + 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x29, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, +}; // [graphics.lua] +} // love \ No newline at end of file